mirror of
https://github.com/webmasterskaya/joomla-oauth-server.git
synced 2024-11-23 18:24:50 +03:00
Добавил поле "copy"
This commit is contained in:
parent
366ddf3534
commit
6ed72e5eb6
3
.gitignore
vendored
3
.gitignore
vendored
@ -5,11 +5,14 @@
|
|||||||
.vscode
|
.vscode
|
||||||
/tmp
|
/tmp
|
||||||
/.php-cs-fixer.cache
|
/.php-cs-fixer.cache
|
||||||
|
/com_oauthserver/media
|
||||||
|
|
||||||
composer.phar
|
composer.phar
|
||||||
com_oauthserver/administrator/vendor
|
com_oauthserver/administrator/vendor
|
||||||
!com_oauthserver/administrator/vendor/.gitkeep
|
!com_oauthserver/administrator/vendor/.gitkeep
|
||||||
|
|
||||||
|
node_modules/
|
||||||
|
|
||||||
._*
|
._*
|
||||||
.Spotlight-V100
|
.Spotlight-V100
|
||||||
.Trashes
|
.Trashes
|
||||||
|
18
babel.config.es2017.json
Normal file
18
babel.config.es2017.json
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"presets": [
|
||||||
|
[
|
||||||
|
"@babel/preset-env",
|
||||||
|
{
|
||||||
|
"targets": {
|
||||||
|
"browsers": [
|
||||||
|
"> 1%",
|
||||||
|
"not ie 11",
|
||||||
|
"not op_mini all"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"bugfixes": true,
|
||||||
|
"loose": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
17
babel.config.es5.json
Normal file
17
babel.config.es5.json
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"presets": [
|
||||||
|
[
|
||||||
|
"@babel/preset-env",
|
||||||
|
{
|
||||||
|
"corejs": "3.8",
|
||||||
|
"useBuiltIns": "entry",
|
||||||
|
"targets": {
|
||||||
|
"ie": "11"
|
||||||
|
},
|
||||||
|
"loose": true,
|
||||||
|
"bugfixes": false,
|
||||||
|
"modules": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
32
build/src/com_oauthserver/joomla.asset.json
Normal file
32
build/src/com_oauthserver/joomla.asset.json
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://developer.joomla.org/schemas/json-schema/web_assets.json",
|
||||||
|
"name": "com_oauthserver",
|
||||||
|
"version": "version",
|
||||||
|
"description": "Joomla CMS",
|
||||||
|
"license": "MIT",
|
||||||
|
"assets": [
|
||||||
|
{
|
||||||
|
"name": "com_oauthserver.field.copy.es5",
|
||||||
|
"type": "script",
|
||||||
|
"uri": "com_oauthserver/field-copy-es5.min.js",
|
||||||
|
"dependencies": [
|
||||||
|
"core"
|
||||||
|
],
|
||||||
|
"attributes": {
|
||||||
|
"nomodule": true,
|
||||||
|
"defer": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "com_oauthserver.field.copy",
|
||||||
|
"type": "script",
|
||||||
|
"uri": "com_oauthserver/field-copy.min.js",
|
||||||
|
"dependencies": [
|
||||||
|
"com_oauthserver.field.copy.es5"
|
||||||
|
],
|
||||||
|
"attributes": {
|
||||||
|
"type": "module"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
56
build/src/com_oauthserver/js/field/copy.es6.js
Normal file
56
build/src/com_oauthserver/js/field/copy.es6.js
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
/**
|
||||||
|
* @copyright (c) 2024. Webmasterskaya. <https://webmasterskaya.xyz>
|
||||||
|
* @license MIT; see LICENSE.txt
|
||||||
|
*/
|
||||||
|
|
||||||
|
((document, Joomla) => {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const copyToClipboardFallback = (input) => {
|
||||||
|
input.focus();
|
||||||
|
input.select();
|
||||||
|
|
||||||
|
try {
|
||||||
|
const copy = document.execCommand('copy');
|
||||||
|
if (copy) {
|
||||||
|
Joomla.renderMessages({message: [Joomla.Text._('COM_OAUTHSERVER_FIELD_COPY_SUCCESS')]});
|
||||||
|
} else {
|
||||||
|
Joomla.renderMessages({error: [Joomla.Text._('COM_OAUTHSERVER_FIELD_COPY_FAIL')]});
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
Joomla.renderMessages({error: [err]});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const copyToClipboard = () => {
|
||||||
|
const buttons = document.querySelectorAll('[data-field-copy]');
|
||||||
|
|
||||||
|
[].forEach.call(buttons, (button) => {
|
||||||
|
button.addEventListener('click', ({currentTarget}) => {
|
||||||
|
const selector = currentTarget.getAttribute('data-field-copy')
|
||||||
|
const input = selector ? document.querySelector(selector) : currentTarget.previousElementSibling;
|
||||||
|
|
||||||
|
if (!navigator.clipboard) {
|
||||||
|
copyToClipboardFallback(input);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
navigator.clipboard.writeText(input.value).then(() => {
|
||||||
|
Joomla.renderMessages({message: [Joomla.Text._('COM_OAUTHSERVER_FIELD_COPY_SUCCESS')]});
|
||||||
|
}, () => {
|
||||||
|
Joomla.renderMessages({error: [Joomla.Text._('COM_OAUTHSERVER_FIELD_COPY_FAIL')]});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
const onBoot = () => {
|
||||||
|
copyToClipboard();
|
||||||
|
|
||||||
|
document.removeEventListener('DOMContentLoaded', onBoot);
|
||||||
|
};
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', onBoot);
|
||||||
|
})(document, Joomla);
|
41
com_oauthserver/layouts/field/copy/text.php
Normal file
41
com_oauthserver/layouts/field/copy/text.php
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
defined('_JEXEC') or die;
|
||||||
|
|
||||||
|
use Joomla\CMS\Factory;
|
||||||
|
use Joomla\CMS\Language\Text;
|
||||||
|
|
||||||
|
extract($displayData);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Layout variables
|
||||||
|
* -----------------
|
||||||
|
* @var string $id DOM id of the field.
|
||||||
|
* @var string $label Label of the field.
|
||||||
|
* @var string $name Name of the input field.
|
||||||
|
* @var string $value Value attribute of the field.
|
||||||
|
*/
|
||||||
|
|
||||||
|
Text::script('ERROR');
|
||||||
|
Text::script('MESSAGE');
|
||||||
|
Text::script('COM_OAUTHSERVER_FIELD_COPY_SUCCESS');
|
||||||
|
Text::script('COM_OAUTHSERVER_FIELD_COPY_FAIL');
|
||||||
|
|
||||||
|
Factory::getApplication()->getDocument()->getWebAssetManager()
|
||||||
|
->useScript('com_oauthserver.field.copy');
|
||||||
|
|
||||||
|
?>
|
||||||
|
<div class="input-group">
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
class="form-control"
|
||||||
|
name="<?php echo $name; ?>"
|
||||||
|
id="<?php echo $id; ?>"
|
||||||
|
readonly
|
||||||
|
value="<?php echo htmlspecialchars($value, ENT_COMPAT, 'UTF-8'); ?>">
|
||||||
|
<button
|
||||||
|
class="btn btn-primary"
|
||||||
|
type="button"
|
||||||
|
data-field-copy="#<?php echo $id; ?>"
|
||||||
|
title="<?php echo Text::_('COM_OAUTHSERVER_FIELD_COPY_DESC'); ?>"><?php echo Text::_('COM_OAUTHSERVER_FIELD_COPY'); ?></button>
|
||||||
|
</div>
|
@ -1,68 +1,75 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<extension type="component" method="upgrade">
|
<extension type="component" method="upgrade">
|
||||||
<name>COM_OAUTHSERVER</name>
|
<name>COM_OAUTHSERVER</name>
|
||||||
<description>COM_OAUTHSERVER_DESCRIPTION</description>
|
<description>COM_OAUTHSERVER_DESCRIPTION</description>
|
||||||
<author>Artem Vasilev</author>
|
<author>Artem Vasilev</author>
|
||||||
<authorEmail>kern.usr@gmial.com</authorEmail>
|
<authorEmail>kern.usr@gmial.com</authorEmail>
|
||||||
<authorUrl>https://webmasterskaya.xyz</authorUrl>
|
<authorUrl>https://webmasterskaya.xyz</authorUrl>
|
||||||
<creationDate>March 2024</creationDate>
|
<creationDate>March 2024</creationDate>
|
||||||
<copyright>Copyright (C) 2024 Webmasterskaya. All rights reserved.</copyright>
|
<copyright>Copyright (C) 2024 Webmasterskaya. All rights reserved.</copyright>
|
||||||
<license>MIT; see LICENSE.txt</license>
|
<license>MIT; see LICENSE.txt</license>
|
||||||
<version>RELEASE_VERSION</version>
|
<version>VERSION</version>
|
||||||
<namespace path="src">Webmasterskaya\Component\OauthServer</namespace>
|
<namespace path="src">Webmasterskaya\Component\OauthServer</namespace>
|
||||||
<install>
|
<install>
|
||||||
<sql>
|
<sql>
|
||||||
<file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
|
<file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
|
||||||
</sql>
|
</sql>
|
||||||
</install>
|
</install>
|
||||||
<uninstall>
|
<uninstall>
|
||||||
<sql>
|
<sql>
|
||||||
<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
|
<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
|
||||||
</sql>
|
</sql>
|
||||||
</uninstall>
|
</uninstall>
|
||||||
<update>
|
<update>
|
||||||
<schemas>
|
<schemas>
|
||||||
<schemapath type="mysql">sql/updates/mysql</schemapath>
|
<schemapath type="mysql">sql/updates/mysql</schemapath>
|
||||||
</schemas>
|
</schemas>
|
||||||
</update>
|
</update>
|
||||||
<files folder="site">
|
<files folder="site">
|
||||||
<folder>forms</folder>
|
<folder>forms</folder>
|
||||||
<folder>src</folder>
|
<folder>src</folder>
|
||||||
<folder>tmpl</folder>
|
<folder>tmpl</folder>
|
||||||
</files>
|
</files>
|
||||||
<languages folder="site">
|
<languages folder="site">
|
||||||
<language tag="en-GB">language/en-GB/en-GB.com_oauthserver.ini</language>
|
<language tag="en-GB">language/en-GB/en-GB.com_oauthserver.ini</language>
|
||||||
<language tag="en-GB">language/en-GB/en-GB.com_oauthserver.sys.ini</language>
|
<language tag="en-GB">language/en-GB/en-GB.com_oauthserver.sys.ini</language>
|
||||||
<language tag="ru-RU">language/ru-RU/ru-RU.com_oauthserver.ini</language>
|
<language tag="ru-RU">language/ru-RU/ru-RU.com_oauthserver.ini</language>
|
||||||
<language tag="ru-RU">language/ru-RU/ru-RU.com_oauthserver.sys.ini</language>
|
<language tag="ru-RU">language/ru-RU/ru-RU.com_oauthserver.sys.ini</language>
|
||||||
</languages>
|
</languages>
|
||||||
<administration>
|
<administration>
|
||||||
<menu>COM_OAUTHSERVER</menu>
|
<menu>COM_OAUTHSERVER</menu>
|
||||||
<submenu>
|
<submenu>
|
||||||
<menu
|
<menu
|
||||||
link="option=com_oauthserver"
|
link="option=com_oauthserver"
|
||||||
view="clients"
|
view="clients"
|
||||||
img="class:clients"
|
img="class:clients"
|
||||||
alt="Oauth Server/Clients"
|
alt="Oauth Server/Clients"
|
||||||
>
|
>
|
||||||
com_oauthserver_clients
|
com_oauthserver_clients
|
||||||
</menu>
|
</menu>
|
||||||
</submenu>
|
</submenu>
|
||||||
<files folder="administrator">
|
<files folder="administrator">
|
||||||
<folder>forms</folder>
|
<folder>forms</folder>
|
||||||
<folder>services</folder>
|
<folder>services</folder>
|
||||||
<folder>sql</folder>
|
<folder>sql</folder>
|
||||||
<folder>src</folder>
|
<folder>src</folder>
|
||||||
<folder>tmpl</folder>
|
<folder>tmpl</folder>
|
||||||
<folder>vendor</folder>
|
<folder>vendor</folder>
|
||||||
<filename>access.xml</filename>
|
<filename>access.xml</filename>
|
||||||
<filename>config.xml</filename>
|
<filename>config.xml</filename>
|
||||||
</files>
|
</files>
|
||||||
<languages folder="admin">
|
<languages folder="admin">
|
||||||
<language tag="en-GB">language/en-GB/en-GB.com_oauthserver.ini</language>
|
<language tag="en-GB">language/en-GB/en-GB.com_oauthserver.ini</language>
|
||||||
<language tag="en-GB">language/en-GB/en-GB.com_oauthserver.sys.ini</language>
|
<language tag="en-GB">language/en-GB/en-GB.com_oauthserver.sys.ini</language>
|
||||||
<language tag="ru-RU">language/ru-RU/ru-RU.com_oauthserver.ini</language>
|
<language tag="ru-RU">language/ru-RU/ru-RU.com_oauthserver.ini</language>
|
||||||
<language tag="ru-RU">language/ru-RU/ru-RU.com_oauthserver.sys.ini</language>
|
<language tag="ru-RU">language/ru-RU/ru-RU.com_oauthserver.sys.ini</language>
|
||||||
</languages>
|
</languages>
|
||||||
</administration>
|
</administration>
|
||||||
</extension>
|
<media destination="com_oauthserver" folder="media">
|
||||||
|
<folder>js</folder>
|
||||||
|
<filename>joomla.asset.json</filename>
|
||||||
|
</media>
|
||||||
|
<layouts destination="components/oauthserver" folder="layouts">
|
||||||
|
<folder>field</folder>
|
||||||
|
</layouts>
|
||||||
|
</extension>
|
||||||
|
4610
package-lock.json
generated
Normal file
4610
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
35
package.json
Normal file
35
package.json
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
"name": "joomla-oauth-server",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "OAuth Server for Joomla",
|
||||||
|
"scripts": {
|
||||||
|
"clean": "rimraf com_oauthserver/media",
|
||||||
|
"copy:asset": "cpy 'build/src/*/joomla.asset.json' . --rename=media/{{basename}}",
|
||||||
|
"build:uncompressed:es5": "cross-env BABEL_CONFIG=babel.config.es5.json webpack",
|
||||||
|
"build:compressed:es5": "cross-env BABEL_CONFIG=babel.config.es5.json NODE_ENV=production webpack",
|
||||||
|
"build:es5": "npm run build:uncompressed:es5 && npm run build:compressed:es5",
|
||||||
|
"build:uncompressed:es2017": "cross-env BABEL_CONFIG=babel.config.es2017.json webpack",
|
||||||
|
"build:compressed:es2017": "cross-env BABEL_CONFIG=babel.config.es2017.json NODE_ENV=production webpack",
|
||||||
|
"build:es2017": "npm run build:uncompressed:es2017 && npm run build:compressed:es2017",
|
||||||
|
"build": "npm run clean && npm run build:es5 && npm run build:es2017 && npm run copy:asset",
|
||||||
|
"install": "npm run build",
|
||||||
|
"update": "npm run build"
|
||||||
|
},
|
||||||
|
"author": {
|
||||||
|
"name": "Artem Vasilev",
|
||||||
|
"email": "dev@webmasterskaya.xyz",
|
||||||
|
"url": "https://webmasterskaya.xyz/"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"devDependencies": {
|
||||||
|
"@babel/core": "^7.24.0",
|
||||||
|
"@babel/preset-env": "^7.24.0",
|
||||||
|
"babel-loader": "^9.1.3",
|
||||||
|
"cpy-cli": "^5.0.0",
|
||||||
|
"cross-env": "^7.0.3",
|
||||||
|
"rimraf": "^5.0.5",
|
||||||
|
"terser-webpack-plugin": "^5.3.10",
|
||||||
|
"webpack": "^5.90.3",
|
||||||
|
"webpack-cli": "^5.1.4"
|
||||||
|
}
|
||||||
|
}
|
0
pkg_oauthsever.xml
Normal file
0
pkg_oauthsever.xml
Normal file
64
webpack.config.js
Normal file
64
webpack.config.js
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
const path = require('path');
|
||||||
|
const babelConfig = require(`./${process.env.BABEL_CONFIG}`);
|
||||||
|
|
||||||
|
const production = process.env.NODE_ENV === 'production';
|
||||||
|
const ES5 = process.env.BABEL_CONFIG.includes('es5');
|
||||||
|
|
||||||
|
const TerserPlugin = require('terser-webpack-plugin');
|
||||||
|
|
||||||
|
const publicPath = path.join(__dirname, '/com_oauthserver/media');
|
||||||
|
const sourcePath = path.join(__dirname, '/build/src');
|
||||||
|
|
||||||
|
const entry = {
|
||||||
|
"field/copy": {
|
||||||
|
import: path.join(sourcePath, '/com_oauthserver/js/field/copy.es6'),
|
||||||
|
filename: `js/field-copy${ES5 ? '-es5' : ''}${production ? '.min' : ''}.js`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const webpackConfig = {
|
||||||
|
mode: production ? 'production' : 'development',
|
||||||
|
output: {
|
||||||
|
path: publicPath,
|
||||||
|
},
|
||||||
|
entry: entry,
|
||||||
|
devtool: false,
|
||||||
|
module: {
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
test: /\.(es6|js)$/,
|
||||||
|
use: {
|
||||||
|
loader: 'babel-loader',
|
||||||
|
options: babelConfig
|
||||||
|
},
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
plugins: [],
|
||||||
|
optimization: {
|
||||||
|
minimize: production,
|
||||||
|
minimizer: production ? [
|
||||||
|
new TerserPlugin({
|
||||||
|
test: /\.js(\?.*)?$/i,
|
||||||
|
parallel: true,
|
||||||
|
terserOptions: {
|
||||||
|
compress: {
|
||||||
|
pure_getters: true,
|
||||||
|
unsafe_comps: true,
|
||||||
|
unsafe: true,
|
||||||
|
passes: 2,
|
||||||
|
keep_fargs: false,
|
||||||
|
drop_console: true
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
beautify: false,
|
||||||
|
comments: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
extractComments: false,
|
||||||
|
}),
|
||||||
|
] : []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = webpackConfig;
|
Loading…
Reference in New Issue
Block a user