commit d3c60c5b8af28dd789f3df1e578cb85cf5fa8a26 Author: vdpAdmin Date: Sat Dec 25 19:36:55 2021 +0800 Vue 3版本初次提交,继续测试中。 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..53f7466 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..73f69e0 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..639900d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..523654a --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..b6e860c --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..3dc5b08 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["johnsoncodehk.volar"] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..c0793a8 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# Vue 3 + Vite + +This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 ` + + diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..7d63aa6 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,10 @@ +{ + "######": "本文件用于解决IDEA无法识别Vue项目@符号的问题", + "compilerOptions": { + "baseUrl": "./", + "paths": { + "@/*": ["src/*"] + } + }, + "exclude": ["node_modules", "dist"] +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..afc2452 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3154 @@ +{ + "name": "variant-form3", + "version": "3.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "@babel/compat-data": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", + "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", + "dev": true + }, + "@babel/core": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.5.tgz", + "integrity": "sha512-wUcenlLzuWMZ9Zt8S0KmFwGlH6QKRh3vsm/dhDA3CHkiTA45YuG1XkHRcNRl73EFPXDp/d5kVOU0/y7x2w6OaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helpers": "^7.16.5", + "@babel/parser": "^7.16.5", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", + "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", + "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", + "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.5.tgz", + "integrity": "sha512-NEohnYA7mkB8L5JhU7BLwcBdU3j83IziR9aseMueWGeAjblbul3zzb8UvJ3a1zuBiqCMObzCJHFqKIQE6hTVmg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-member-expression-to-functions": "^7.16.5", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.5", + "@babel/helper-split-export-declaration": "^7.16.0" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.5.tgz", + "integrity": "sha512-ODQyc5AnxmZWm/R2W7fzhamOk1ey8gSguo5SGvF0zcB3uUzRpTRmM/jmLSm9bDMyPlvbyJ+PwPEK0BWIoZ9wjg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", + "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.5.tgz", + "integrity": "sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", + "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.5.tgz", + "integrity": "sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-member-expression-to-functions": "^7.16.5", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true + }, + "@babel/helpers": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.5.tgz", + "integrity": "sha512-TLgi6Lh71vvMZGEkFuIxzaPsyeYCHQ5jJOOX1f0xXn0uciFuE8cEk0wyBquMcCxBXZ5BJhE2aUB7pnWTD150Tw==", + "dev": true, + "requires": { + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + } + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.6.tgz", + "integrity": "sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==" + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.5.tgz", + "integrity": "sha512-42OGssv9NPk4QHKVgIHlzeLgPOW5rGgfV5jzG90AhcXXIv6hu/eqj63w4VgvRxdvZY3AlYeDgPiSJ3BqAd1Y6Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.5.tgz", + "integrity": "sha512-/d4//lZ1Vqb4mZ5xTep3dDK888j7BGM/iKqBmndBaoYAFPlPKrGU608VVBz5JeyAb6YQDjRu1UKqj86UhwWVgw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.1.tgz", + "integrity": "sha512-NO4XoryBng06jjw/qWEU2LhcLJr1tWkhpMam/H4eas/CDKMX/b2/Ylb6EI256Y7+FVPCawwSM1rrJNOpDiz+Lg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-typescript": "^7.16.0" + } + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/traverse": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz", + "integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.5", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + }, + "@element-plus/icons-vue": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-0.2.4.tgz", + "integrity": "sha512-RsJNyL58rwxtsjeMy34o8txkL6UlME1stWsUlRpTac6UE9Bx9gdJvnDXbIKhOJqBLX17fBjmposdrn6VTqim2w==" + }, + "@intlify/core-base": { + "version": "9.2.0-beta.23", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.0-beta.23.tgz", + "integrity": "sha512-sNet9/RpU/qydW1bOwVICYzGIC/SWyV+1gakcSP12XD1tGEiaoI1Ln+6nHh4dICfegR/5XyaoJ7NC4/ukH7/Ew==", + "requires": { + "@intlify/devtools-if": "9.2.0-beta.23", + "@intlify/message-compiler": "9.2.0-beta.23", + "@intlify/shared": "9.2.0-beta.23", + "@intlify/vue-devtools": "9.2.0-beta.23" + } + }, + "@intlify/devtools-if": { + "version": "9.2.0-beta.23", + "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.0-beta.23.tgz", + "integrity": "sha512-f2iY2LFRHTwPnBpT0R/kG8CwZbUWiSccMzfXYLwhjJC1irCcFCXmVtL9Mkz5gc0Elqvl+zOWxk5g9rwhah5bBQ==", + "requires": { + "@intlify/shared": "9.2.0-beta.23" + } + }, + "@intlify/message-compiler": { + "version": "9.2.0-beta.23", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.0-beta.23.tgz", + "integrity": "sha512-qmGN8k5yGGdZ5St8yg8U4Tg2K9Sc6h3BhWCdJKAqQVs5jnfZG+nMtsLVgnJUWkDvhjzyg7/rEOhHm2uJcu4vjw==", + "requires": { + "@intlify/shared": "9.2.0-beta.23", + "source-map": "0.6.1" + } + }, + "@intlify/shared": { + "version": "9.2.0-beta.23", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.0-beta.23.tgz", + "integrity": "sha512-3aELL2KTp1MWKGm2gIUKSagthgKzcK5hpQEFzOwkJ1SAthpTXR7BHeWGEaD+Lj+Pbiz3U8cspvp8s2lFWVbYxg==" + }, + "@intlify/vue-devtools": { + "version": "9.2.0-beta.23", + "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.0-beta.23.tgz", + "integrity": "sha512-5uGvrtUQhiyEqrMpDYh1FAU5uZviLaiEy1HAs+ypX46EdaDvyEYYpWvhezTWZ7hsDBsbsKJ9ICjgTvZxm6PDcw==", + "requires": { + "@intlify/core-base": "9.2.0-beta.23", + "@intlify/shared": "9.2.0-beta.23" + } + }, + "@popperjs/core": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.0.tgz", + "integrity": "sha512-zrsUxjLOKAzdewIDRWy9nsV1GQsKBCWaGwsZQlCgr6/q+vjyZhFgqedLfFBuI9anTPEUT4APq9Mu0SZBTzIcGQ==" + }, + "@rollup/pluginutils": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.2.tgz", + "integrity": "sha512-ROn4qvkxP9SyPeHaf7uQC/GPFY6L/OWy9+bd9AwcjOAWQwxRscoEyAUD8qCY5o5iL4jqQwoLk2kaTKJPb/HwzQ==", + "dev": true, + "requires": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + } + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true + }, + "@types/node": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", + "integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==", + "dev": true + }, + "@types/svgo": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@types/svgo/-/svgo-2.6.0.tgz", + "integrity": "sha512-VSdhb3KTOglle1SLQD4+TB6ezj/MS3rN98gOUkXzbTUhG8VjFKHXN3OVgEFlTnW5fYBxt+lzZlD3PFqkwMj36Q==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@vitejs/plugin-vue": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.0.1.tgz", + "integrity": "sha512-wtdMnGVvys9K8tg+DxowU1ytTrdVveXr3LzdhaKakysgGXyrsfaeds2cDywtvujEASjWOwWL/OgWM+qoeM8Plg==", + "dev": true + }, + "@vitejs/plugin-vue-jsx": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-1.3.3.tgz", + "integrity": "sha512-VSBXVqMcxbgX85rgJC1eMWuZ9hzOJhWPvGYlKxyymPokE/i3Gykh5ljkCoNdxnKgIyFqv4WutYoYY93fgjbTxA==", + "dev": true, + "requires": { + "@babel/core": "^7.16.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.16.1", + "@rollup/pluginutils": "^4.1.2", + "@vue/babel-plugin-jsx": "^1.1.1", + "hash-sum": "^2.0.0" + } + }, + "@vue/babel-helper-vue-transform-on": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz", + "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==", + "dev": true + }, + "@vue/babel-plugin-jsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz", + "integrity": "sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "@vue/babel-helper-vue-transform-on": "^1.0.2", + "camelcase": "^6.0.0", + "html-tags": "^3.1.0", + "svg-tags": "^1.0.0" + } + }, + "@vue/compiler-core": { + "version": "3.2.26", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.26.tgz", + "integrity": "sha512-N5XNBobZbaASdzY9Lga2D9Lul5vdCIOXvUMd6ThcN8zgqQhPKfCV+wfAJNNJKQkSHudnYRO2gEB+lp0iN3g2Tw==", + "requires": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.26", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-dom": { + "version": "3.2.26", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.26.tgz", + "integrity": "sha512-smBfaOW6mQDxcT3p9TKT6mE22vjxjJL50GFVJiI0chXYGU/xzC05QRGrW3HHVuJrmLTLx5zBhsZ2dIATERbarg==", + "requires": { + "@vue/compiler-core": "3.2.26", + "@vue/shared": "3.2.26" + } + }, + "@vue/compiler-sfc": { + "version": "3.2.26", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.26.tgz", + "integrity": "sha512-ePpnfktV90UcLdsDQUh2JdiTuhV0Skv2iYXxfNMOK/F3Q+2BO0AulcVcfoksOpTJGmhhfosWfMyEaEf0UaWpIw==", + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.26", + "@vue/compiler-dom": "3.2.26", + "@vue/compiler-ssr": "3.2.26", + "@vue/reactivity-transform": "3.2.26", + "@vue/shared": "3.2.26", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-ssr": { + "version": "3.2.26", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.26.tgz", + "integrity": "sha512-2mywLX0ODc4Zn8qBoA2PDCsLEZfpUGZcyoFRLSOjyGGK6wDy2/5kyDOWtf0S0UvtoyVq95OTSGIALjZ4k2q/ag==", + "requires": { + "@vue/compiler-dom": "3.2.26", + "@vue/shared": "3.2.26" + } + }, + "@vue/devtools-api": { + "version": "6.0.0-beta.20.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.0.0-beta.20.1.tgz", + "integrity": "sha512-R2rfiRY+kZugzWh9ZyITaovx+jpU4vgivAEAiz80kvh3yviiTU3CBuGuyWpSwGz9/C7TkSWVM/FtQRGlZ16n8Q==" + }, + "@vue/reactivity": { + "version": "3.2.26", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.26.tgz", + "integrity": "sha512-h38bxCZLW6oFJVDlCcAiUKFnXI8xP8d+eO0pcDxx+7dQfSPje2AO6M9S9QO6MrxQB7fGP0DH0dYQ8ksf6hrXKQ==", + "requires": { + "@vue/shared": "3.2.26" + } + }, + "@vue/reactivity-transform": { + "version": "3.2.26", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.26.tgz", + "integrity": "sha512-XKMyuCmzNA7nvFlYhdKwD78rcnmPb7q46uoR00zkX6yZrUmcCQ5OikiwUEVbvNhL5hBJuvbSO95jB5zkUon+eQ==", + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.26", + "@vue/shared": "3.2.26", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "@vue/runtime-core": { + "version": "3.2.26", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.26.tgz", + "integrity": "sha512-BcYi7qZ9Nn+CJDJrHQ6Zsmxei2hDW0L6AB4vPvUQGBm2fZyC0GXd/4nVbyA2ubmuhctD5RbYY8L+5GUJszv9mQ==", + "requires": { + "@vue/reactivity": "3.2.26", + "@vue/shared": "3.2.26" + } + }, + "@vue/runtime-dom": { + "version": "3.2.26", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.26.tgz", + "integrity": "sha512-dY56UIiZI+gjc4e8JQBwAifljyexfVCkIAu/WX8snh8vSOt/gMSEGwPRcl2UpYpBYeyExV8WCbgvwWRNt9cHhQ==", + "requires": { + "@vue/runtime-core": "3.2.26", + "@vue/shared": "3.2.26", + "csstype": "^2.6.8" + } + }, + "@vue/server-renderer": { + "version": "3.2.26", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.26.tgz", + "integrity": "sha512-Jp5SggDUvvUYSBIvYEhy76t4nr1vapY/FIFloWmQzn7UxqaHrrBpbxrqPcTrSgGrcaglj0VBp22BKJNre4aA1w==", + "requires": { + "@vue/compiler-ssr": "3.2.26", + "@vue/shared": "3.2.26" + } + }, + "@vue/shared": { + "version": "3.2.26", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.26.tgz", + "integrity": "sha512-vPV6Cq+NIWbH5pZu+V+2QHE9y1qfuTq49uNWw4f7FDEeZaDU2H2cx5jcUZOAKW7qTrUS4k6qZPbMy1x4N96nbA==" + }, + "@vueuse/core": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-7.3.0.tgz", + "integrity": "sha512-gPJyMMAquva9Qwqz63qGQT122m5hWI8Kuy8kfPV/JLQU7m01CXooyv8FIrX9TV8OxVcHBTPXPJHY0oyUiFoNgw==", + "requires": { + "@vueuse/shared": "7.3.0", + "vue-demi": "*" + } + }, + "@vueuse/shared": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-7.3.0.tgz", + "integrity": "sha512-vOAeI84tIXKVkzm8s/Mxbrzhj0QN6NyVc/sC6LrW0AjVNdvpD8sB1dZiDn9yh8T77WJmloCEt4zZVIppeq7I+w==", + "requires": { + "vue-demi": "*" + } + }, + "ace-builds": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.4.13.tgz", + "integrity": "sha512-SOLzdaQkY6ecPKYRDDg+MY1WoGgXA34cIvYJNNoBMGGUswHmlauU2Hy0UL96vW0Fs/LgFbMUjD+6vqzWTldIYQ==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async-validator": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.0.7.tgz", + "integrity": "sha512-Pj2IR7u8hmUEDOwB++su6baaRi+QvsgajuFB9j95foM1N2gy5HM4z60hfusIO0fBPG5uLAEl6yCJr1jNSVugEQ==" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "axios": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", + "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", + "requires": { + "follow-redirects": "^1.14.4" + } + }, + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + } + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", + "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001292", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001292.tgz", + "integrity": "sha512-jnT4Tq0Q4ma+6nncYQVe7d73kmDmE9C3OGTx3MvW7lBM/eY1S1DZTMBON7dqV481RhNiS5OxD7k9JQvmDOTirw==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clipboard": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz", + "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==", + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.0.tgz", + "integrity": "sha512-KjbKU7UEfg4YPpskMtMXPhUKn7m/1OdTHTVjy09ScR2LVaoUXe8Jh0UdvN2EKUR6iKTJph52SJP95mAB0MnVLQ==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "css-select": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.0.tgz", + "integrity": "sha512-6YVG6hsH9yIb/si3Th/is8Pex7qnVHO6t7q7U6TIUnkQASGbS8tnUDBftnPynLNnuUl/r2+PTd0ekiiq7R0zJw==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.1.0", + "domhandler": "^4.3.0", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "dependencies": { + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "domhandler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "dev": true + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + } + }, + "csstype": { + "version": "2.6.19", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz", + "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==" + }, + "dayjs": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", + "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==" + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "electron-to-chromium": { + "version": "1.4.27", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.27.tgz", + "integrity": "sha512-uZ95szi3zUbzRDx1zx/xnsCG+2xgZyy57pDOeaeO4r8zx5Dqe8Jv1ti8cunvBwJHVI5LzPuw8umKwZb3WKYxSQ==", + "dev": true + }, + "element-plus": { + "version": "1.2.0-beta.6", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-1.2.0-beta.6.tgz", + "integrity": "sha512-8EdSIR/5/FHcSB8w1diAh+gJMHgxIvxuZoayY99k6taAR1QyEFHuPTgFccZLopJ1+iP4UEsZFz49l57qS08Utw==", + "requires": { + "@element-plus/icons-vue": "^0.2.2", + "@popperjs/core": "^2.10.2", + "@vueuse/core": "^7.0.0", + "async-validator": "^4.0.7", + "dayjs": "^1.10.7", + "lodash": "^4.17.21", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.1.1" + } + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "esbuild": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.15.tgz", + "integrity": "sha512-raCxt02HBKv8RJxE8vkTSCXGIyKHdEdGfUmiYb8wnabnaEmHzyW7DCHb5tEN0xU8ryqg5xw54mcwnYkC4x3AIw==", + "dev": true, + "requires": { + "esbuild-android-arm64": "0.13.15", + "esbuild-darwin-64": "0.13.15", + "esbuild-darwin-arm64": "0.13.15", + "esbuild-freebsd-64": "0.13.15", + "esbuild-freebsd-arm64": "0.13.15", + "esbuild-linux-32": "0.13.15", + "esbuild-linux-64": "0.13.15", + "esbuild-linux-arm": "0.13.15", + "esbuild-linux-arm64": "0.13.15", + "esbuild-linux-mips64le": "0.13.15", + "esbuild-linux-ppc64le": "0.13.15", + "esbuild-netbsd-64": "0.13.15", + "esbuild-openbsd-64": "0.13.15", + "esbuild-sunos-64": "0.13.15", + "esbuild-windows-32": "0.13.15", + "esbuild-windows-64": "0.13.15", + "esbuild-windows-arm64": "0.13.15" + } + }, + "esbuild-android-arm64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.15.tgz", + "integrity": "sha512-m602nft/XXeO8YQPUDVoHfjyRVPdPgjyyXOxZ44MK/agewFFkPa8tUo6lAzSWh5Ui5PB4KR9UIFTSBKh/RrCmg==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.15.tgz", + "integrity": "sha512-ihOQRGs2yyp7t5bArCwnvn2Atr6X4axqPpEdCFPVp7iUj4cVSdisgvEKdNR7yH3JDjW6aQDw40iQFoTqejqxvQ==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.15.tgz", + "integrity": "sha512-i1FZssTVxUqNlJ6cBTj5YQj4imWy3m49RZRnHhLpefFIh0To05ow9DTrXROTE1urGTQCloFUXTX8QfGJy1P8dQ==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.15.tgz", + "integrity": "sha512-G3dLBXUI6lC6Z09/x+WtXBXbOYQZ0E8TDBqvn7aMaOCzryJs8LyVXKY4CPnHFXZAbSwkCbqiPuSQ1+HhrNk7EA==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.15.tgz", + "integrity": "sha512-KJx0fzEDf1uhNOZQStV4ujg30WlnwqUASaGSFPhznLM/bbheu9HhqZ6mJJZM32lkyfGJikw0jg7v3S0oAvtvQQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.15.tgz", + "integrity": "sha512-ZvTBPk0YWCLMCXiFmD5EUtB30zIPvC5Itxz0mdTu/xZBbbHJftQgLWY49wEPSn2T/TxahYCRDWun5smRa0Tu+g==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.15.tgz", + "integrity": "sha512-eCKzkNSLywNeQTRBxJRQ0jxRCl2YWdMB3+PkWFo2BBQYC5mISLIVIjThNtn6HUNqua1pnvgP5xX0nHbZbPj5oA==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.15.tgz", + "integrity": "sha512-wUHttDi/ol0tD8ZgUMDH8Ef7IbDX+/UsWJOXaAyTdkT7Yy9ZBqPg8bgB/Dn3CZ9SBpNieozrPRHm0BGww7W/jA==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.15.tgz", + "integrity": "sha512-bYpuUlN6qYU9slzr/ltyLTR9YTBS7qUDymO8SV7kjeNext61OdmqFAzuVZom+OLW1HPHseBfJ/JfdSlx8oTUoA==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.15.tgz", + "integrity": "sha512-KlVjIG828uFPyJkO/8gKwy9RbXhCEUeFsCGOJBepUlpa7G8/SeZgncUEz/tOOUJTcWMTmFMtdd3GElGyAtbSWg==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.15.tgz", + "integrity": "sha512-h6gYF+OsaqEuBjeesTBtUPw0bmiDu7eAeuc2OEH9S6mV9/jPhPdhOWzdeshb0BskRZxPhxPOjqZ+/OqLcxQwEQ==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.15.tgz", + "integrity": "sha512-3+yE9emwoevLMyvu+iR3rsa+Xwhie7ZEHMGDQ6dkqP/ndFzRHkobHUKTe+NCApSqG5ce2z4rFu+NX/UHnxlh3w==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.15.tgz", + "integrity": "sha512-wTfvtwYJYAFL1fSs8yHIdf5GEE4NkbtbXtjLWjM3Cw8mmQKqsg8kTiqJ9NJQe5NX/5Qlo7Xd9r1yKMMkHllp5g==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.15.tgz", + "integrity": "sha512-lbivT9Bx3t1iWWrSnGyBP9ODriEvWDRiweAs69vI+miJoeKwHWOComSRukttbuzjZ8r1q0mQJ8Z7yUsDJ3hKdw==", + "dev": true, + "optional": true + }, + "esbuild-windows-32": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.15.tgz", + "integrity": "sha512-fDMEf2g3SsJ599MBr50cY5ve5lP1wyVwTe6aLJsM01KtxyKkB4UT+fc5MXQFn3RLrAIAZOG+tHC+yXObpSn7Nw==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.15.tgz", + "integrity": "sha512-9aMsPRGDWCd3bGjUIKG/ZOJPKsiztlxl/Q3C1XDswO6eNX/Jtwu4M+jb6YDH9hRSUflQWX0XKAfWzgy5Wk54JQ==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.15.tgz", + "integrity": "sha512-zzvyCVVpbwQQATaf3IG8mu1IwGEiDxKkYUdA4FpoCHi1KtPa13jeScYDjlW0Qh+ebWzpKfR2ZwvqAQkSWNcKjA==", + "dev": true, + "optional": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", + "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo=" + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" + }, + "file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "follow-redirects": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz", + "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "requires": { + "delegate": "^3.1.2" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "dev": true + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "dev": true + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true + }, + "immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, + "merge-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz", + "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==", + "dev": true, + "requires": { + "is-plain-obj": "^1.1" + } + }, + "micromatch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.0.tgz", + "integrity": "sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.2.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "extglob": "^2.0.2", + "fragment-cache": "^0.2.1", + "kind-of": "^5.0.2", + "nanomatch": "^1.2.1", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mitt": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", + "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==" + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "mvdir": { + "version": "1.0.21", + "resolved": "https://registry.npmjs.org/mvdir/-/mvdir-1.0.21.tgz", + "integrity": "sha512-au1XRgt8EOlAzDxDSAkH7T+lpHsguZZi6mNYMZzwy5PO1xT6jw2Lu2ZUe4GN0PFb5xVoyAEnTcDu1eV4wbxC+Q==", + "dev": true + }, + "nanoid": { + "version": "3.1.30", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", + "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-wheel-es": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.1.1.tgz", + "integrity": "sha512-157VNH4CngrcsvF8xOVOe22cwniIR3nxSltdctvQeHZj8JttEeOXffK28jucWfWBXs0QNetAumjc1GiInnwX4w==" + }, + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "parchment": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", + "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", + "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", + "requires": { + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" + } + }, + "postcss-prefix-selector": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.14.0.tgz", + "integrity": "sha512-8d5fiBQZWMtGWH/7ewEeo6RnBNyT2kLD5wTIfV2oHYqH4hjiofg/rP5X3SUwnqOINzE4mM/K/UOAiNrIaKzd4w==", + "dev": true + }, + "posthtml": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.9.2.tgz", + "integrity": "sha1-9MBtufZ7Yf0XxOJW5+PZUVv3Jv0=", + "dev": true, + "requires": { + "posthtml-parser": "^0.2.0", + "posthtml-render": "^1.0.5" + } + }, + "posthtml-parser": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.2.1.tgz", + "integrity": "sha1-NdUw3jhnQMK6JP8usvrznM3ycd0=", + "dev": true, + "requires": { + "htmlparser2": "^3.8.3", + "isobject": "^2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "posthtml-rename-id": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz", + "integrity": "sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "posthtml-render": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.4.0.tgz", + "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==", + "dev": true + }, + "posthtml-svg-mode": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz", + "integrity": "sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==", + "dev": true, + "requires": { + "merge-options": "1.0.1", + "posthtml": "^0.9.2", + "posthtml-parser": "^0.2.1", + "posthtml-render": "^1.0.6" + } + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "quill": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz", + "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", + "requires": { + "clone": "^2.1.1", + "deep-equal": "^1.0.1", + "eventemitter3": "^2.0.3", + "extend": "^3.0.2", + "parchment": "^1.1.4", + "quill-delta": "^3.6.2" + } + }, + "quill-delta": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", + "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", + "requires": { + "deep-equal": "^1.0.1", + "extend": "^3.0.2", + "fast-diff": "1.1.2" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rollup": { + "version": "2.61.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.61.1.tgz", + "integrity": "sha512-BbTXlEvB8d+XFbK/7E5doIcRtxWPRiqr0eb5vQ0+2paMM04Ye4PZY5nHOQef2ix24l/L0SpLd5hwcH15QHPdvA==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "sass": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.45.0.tgz", + "integrity": "sha512-ONy5bjppoohtNkFJRqdz1gscXamMzN3wQy1YH9qO2FiNpgjLhpz/IPRGg0PpCjyz/pWfCOaNEaiEGCcjOFAjqw==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sortablejs": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz", + "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "svg-baker": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/svg-baker/-/svg-baker-1.7.0.tgz", + "integrity": "sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "clone": "^2.1.1", + "he": "^1.1.1", + "image-size": "^0.5.1", + "loader-utils": "^1.1.0", + "merge-options": "1.0.1", + "micromatch": "3.1.0", + "postcss": "^5.2.17", + "postcss-prefix-selector": "^1.6.0", + "posthtml-rename-id": "^1.0", + "posthtml-svg-mode": "^1.0.3", + "query-string": "^4.3.2", + "traverse": "^0.6.6" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + } + }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "traverse": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vite": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.7.3.tgz", + "integrity": "sha512-GAY1P+9fLJOju1SRm8+hykVnEXog+E+KXuqqyMBQDriKCUIKzWnPn142yNNhSdf/ixYGYdUa5ce3A8WaEajzGw==", + "dev": true, + "requires": { + "esbuild": "^0.13.12", + "fsevents": "~2.3.2", + "postcss": "^8.3.11", + "resolve": "^1.20.0", + "rollup": "^2.59.0" + } + }, + "vite-plugin-svg-icons": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/vite-plugin-svg-icons/-/vite-plugin-svg-icons-1.0.5.tgz", + "integrity": "sha512-dzPwIwaxhVzVTQ/NlQgQ/vcZ8jtHFx8xhpVt4iXqM/2G+8HUz6lpew4V8yOprCy2OUAq7gToYhIxT042gKXLMw==", + "dev": true, + "requires": { + "@types/svgo": "^2.4.2", + "cors": "^2.8.5", + "debug": "^4.3.2", + "etag": "^1.8.1", + "fs-extra": "^10.0.0", + "svg-baker": "1.7.0", + "svgo": "^2.7.0" + } + }, + "vue": { + "version": "3.2.26", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.26.tgz", + "integrity": "sha512-KD4lULmskL5cCsEkfhERVRIOEDrfEL9CwAsLYpzptOGjaGFNWo3BQ9g8MAb7RaIO71rmVOziZ/uEN/rHwcUIhg==", + "requires": { + "@vue/compiler-dom": "3.2.26", + "@vue/compiler-sfc": "3.2.26", + "@vue/runtime-dom": "3.2.26", + "@vue/server-renderer": "3.2.26", + "@vue/shared": "3.2.26" + } + }, + "vue-demi": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.12.1.tgz", + "integrity": "sha512-QL3ny+wX8c6Xm1/EZylbgzdoDolye+VpCXRhI2hug9dJTP3OUJ3lmiKN3CsVV3mOJKwFi0nsstbgob0vG7aoIw==" + }, + "vue-i18n": { + "version": "9.2.0-beta.23", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.2.0-beta.23.tgz", + "integrity": "sha512-9zpylFVjhMDiNnSpa8pFf/lXiALKzxDKEo9QrSV906cN0m6jtyjvjCWw6dRx/7Q4ZJuwXYg0wi/UtUkgu0wkQw==", + "requires": { + "@intlify/core-base": "9.2.0-beta.23", + "@intlify/shared": "9.2.0-beta.23", + "@intlify/vue-devtools": "9.2.0-beta.23", + "@vue/devtools-api": "^6.0.0-beta.13" + } + }, + "vue3-quill": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/vue3-quill/-/vue3-quill-0.2.6.tgz", + "integrity": "sha512-hvi61Zn7BFsQW0H0jGT8N3eXqxvZNupjS+dvQrdJYtBR5I48Ya92rfmrl7NCQGBAtzc5j9KtVs9ESG7L27j4bw==", + "requires": { + "core-js": "^3.6.5", + "quill": "^1.3.7", + "vue": "^3.0.11" + } + }, + "vuedraggable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-4.1.0.tgz", + "integrity": "sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==", + "requires": { + "sortablejs": "1.14.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..dd6c391 --- /dev/null +++ b/package.json @@ -0,0 +1,38 @@ +{ + "name": "variant-form3", + "version": "3.0.0", + "private": false, + "scripts": { + "serve": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "axios": "^0.24.0", + "clipboard": "^2.0.8", + "core-js": "^3.6.5", + "element-plus": "^1.2.0-beta.5", + "file-saver": "^2.0.5", + "mitt": "^3.0.0", + "vue": "^3.0.0", + "vue-i18n": "^9.2.0-beta.23", + "vue3-quill": "^0.2.6", + "vuedraggable": "^4.1.0" + }, + "devDependencies": { + "@types/node": "^17.0.0", + "@vitejs/plugin-vue": "^2.0.0", + "@vitejs/plugin-vue-jsx": "^1.3.3", + "ace-builds": "^1.4.12", + "babel-eslint": "^10.1.0", + "mvdir": "^1.0.21", + "sass": "^1.45.0", + "vite": "^2.7.2", + "vite-plugin-svg-icons": "^1.0.5" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not dead" + ] +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..84ed3f9 Binary files /dev/null and b/public/favicon.ico differ diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..76372c2 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/src/assets/ft-images/t1.png b/src/assets/ft-images/t1.png new file mode 100644 index 0000000..620f536 Binary files /dev/null and b/src/assets/ft-images/t1.png differ diff --git a/src/assets/ft-images/t2.png b/src/assets/ft-images/t2.png new file mode 100644 index 0000000..a968ef7 Binary files /dev/null and b/src/assets/ft-images/t2.png differ diff --git a/src/assets/ft-images/t3.png b/src/assets/ft-images/t3.png new file mode 100644 index 0000000..0239058 Binary files /dev/null and b/src/assets/ft-images/t3.png differ diff --git a/src/assets/ft-images/t4.png b/src/assets/ft-images/t4.png new file mode 100644 index 0000000..7996852 Binary files /dev/null and b/src/assets/ft-images/t4.png differ diff --git a/src/assets/ft-images/t5.png b/src/assets/ft-images/t5.png new file mode 100644 index 0000000..35e03d2 Binary files /dev/null and b/src/assets/ft-images/t5.png differ diff --git a/src/assets/ft-images/t6.png b/src/assets/ft-images/t6.png new file mode 100644 index 0000000..22aeb50 Binary files /dev/null and b/src/assets/ft-images/t6.png differ diff --git a/src/assets/ft-images/t7.png b/src/assets/ft-images/t7.png new file mode 100644 index 0000000..7128e37 Binary files /dev/null and b/src/assets/ft-images/t7.png differ diff --git a/src/assets/ft-images/t8.png b/src/assets/ft-images/t8.png new file mode 100644 index 0000000..37baf96 Binary files /dev/null and b/src/assets/ft-images/t8.png differ diff --git a/src/assets/vform-logo.png b/src/assets/vform-logo.png new file mode 100644 index 0000000..f8cc5df Binary files /dev/null and b/src/assets/vform-logo.png differ diff --git a/src/components/code-editor/index.vue b/src/components/code-editor/index.vue new file mode 100644 index 0000000..b8f99cf --- /dev/null +++ b/src/components/code-editor/index.vue @@ -0,0 +1,135 @@ + + + + + diff --git a/src/components/form-designer/designer.js b/src/components/form-designer/designer.js new file mode 100644 index 0000000..3e2ffc4 --- /dev/null +++ b/src/components/form-designer/designer.js @@ -0,0 +1,929 @@ +/** + * author: vformAdmin + * email: vdpadmin@163.com + * website: https://www.vform666.com + * date: 2021.08.18 + * remark: 如果要分发VForm源码,需在本文件顶部保留此文件头信息!! + */ + +import {deepClone, generateId, overwriteObj} from "@/utils/util" +import {containers, advancedFields, basicFields, customFields} from "@/components/form-designer/widget-panel/widgetsConfig.js" +import {VARIANT_FORM_VERSION} from "@/utils/config" +import eventBus from "@/utils/event-bus" + +export function createDesigner(vueInstance) { + let defaultFormConfig = { + modelName: 'formData', + refName: 'vForm', + rulesName: 'rules', + labelWidth: 80, + labelPosition: 'left', + size: '', + labelAlign: 'label-left-align', + cssCode: '', + customClass: '', + functions: '', + layoutType: 'PC', + + onFormCreated: '', + onFormMounted: '', + onFormDataChange: '', + } + + return { + widgetList: [], + formConfig: {cssCode: ''}, + + selectedId: null, + selectedWidget: null, + selectedWidgetName: null, //选中组件名称(唯一) + vueInstance: vueInstance, + + formWidget: null, //表单设计容器 + + cssClassList: [], //自定义样式列表 + + historyData: { + index: -1, //index: 0, + maxStep: 20, + steps: [], + }, + + initDesigner() { + this.widgetList = [] + this.formConfig = deepClone(defaultFormConfig) + + //输出版本信息和语雀链接 + console.info(`%cVariantForm %cVer${VARIANT_FORM_VERSION} %chttps://www.yuque.com/variantdev/vform`, + "color:#409EFF;font-size: 22px;font-weight:bolder", + "color:#999;font-size: 12px", + "color:#333" + ) + + this.initHistoryData() + }, + + clearDesigner(skipHistoryChange) { + let emptyWidgetListFlag = (this.widgetList.length === 0) + this.widgetList = [] + this.selectedId = null + this.selectedWidgetName = null + this.selectedWidget = {} //this.selectedWidget = null + overwriteObj(this.formConfig, defaultFormConfig) // + + if (!!skipHistoryChange) { + //什么也不做!! + } else if (!emptyWidgetListFlag) { + this.emitHistoryChange() + } else { + this.saveCurrentHistoryStep() + } + }, + + loadPresetCssCode(preCssCode) { + if ((this.formConfig.cssCode === '') && !!preCssCode) { + this.formConfig.cssCode = preCssCode + } + }, + + getLayoutType() { + return this.formConfig.layoutType || 'PC' + }, + + changeLayoutType(newType) { + this.formConfig.layoutType = newType + }, + + getImportTemplate() { + return { + widgetList: [], + formConfig: deepClone(this.formConfig) + } + }, + + loadFormJson(formJson) { + let modifiedFlag = false + + if (!!formJson && !!formJson.widgetList) { + this.widgetList = formJson.widgetList + modifiedFlag = true + } + if (!!formJson && !!formJson.formConfig) { + //this.formConfig = importObj.formConfig + overwriteObj(this.formConfig, formJson.formConfig) /* 用=赋值,会导致inject依赖注入的formConfig属性变成非响应式 */ + modifiedFlag = true + } + + return modifiedFlag + }, + + setSelected(selected) { + if (!selected) { + this.clearSelected() + return + } + + this.selectedWidget = selected + if (!!selected.id) { + this.selectedId = selected.id + this.selectedWidgetName = selected.options.name + } + }, + + updateSelectedWidgetNameAndRef(selectedWidget, newName, newLabel) { + this.selectedWidgetName = newName + //selectedWidget.options.name = newName //此行多余 + if (!!newLabel && (Object.keys(selectedWidget.options).indexOf('label') > -1)) { + selectedWidget.options.label = newLabel + } + }, + + clearSelected() { + this.selectedId = null + this.selectedWidgetName = null + this.selectedWidget = {} //this.selectedWidget = null + }, + + checkWidgetMove(evt) { /* Only field widget can be dragged into sub-form */ + if (!!evt.draggedContext && !!evt.draggedContext.element) { + let wgCategory = evt.draggedContext.element.category + if (!!evt.to) { + if ((evt.to.className === 'sub-form-table') && (wgCategory === 'container')) { + //this.$message.info(this.vueInstance.i18nt('designer.hint.onlyFieldWidgetAcceptable')) + return false + } + } + } + + return true + }, + + /** + * 追加表格新行 + * @param widget + */ + appendTableRow(widget) { + let rowIdx = widget.rows.length//确定插入行位置 + let newRow = deepClone(widget.rows[widget.rows.length - 1]) + newRow.id = 'table-row-' + generateId() + newRow.merged = false + newRow.cols.forEach(col => { + col.id = 'table-cell-' + generateId() + col.options.name = col.id + col.merged = false + col.options.colspan = 1 + col.options.rowspan = 1 + col.widgetList.length = 0 + }) + widget.rows.splice(rowIdx, 0, newRow) + + this.emitHistoryChange() + }, + + /** + * 追加表格新列 + * @param widget + */ + appendTableCol(widget) { + let colIdx = widget.rows[0].cols.length //确定插入列位置 + widget.rows.forEach(row => { + let newCol = deepClone(this.getContainerByType('table-cell')) + newCol.id = 'table-cell-' + generateId() + newCol.options.name = newCol.id + newCol.merged = false + newCol.options.colspan = 1 + newCol.options.rowspan = 1 + newCol.widgetList.length = 0 + row.cols.splice(colIdx, 0, newCol) + }) + + this.emitHistoryChange() + }, + + insertTableRow(widget, insertPos, cloneRowIdx, curCol, aboveFlag) { + let newRowIdx = !!aboveFlag ? insertPos : (insertPos + 1) //初步确定插入行位置 + if (!aboveFlag) { //继续向下寻找同列第一个未被合并的单元格 + let tmpRowIdx = newRowIdx + let rowFoundFlag = false + while (tmpRowIdx < widget.rows.length) { + if (!widget.rows[tmpRowIdx].cols[curCol].merged) { + newRowIdx = tmpRowIdx + rowFoundFlag = true + break + } else { + tmpRowIdx++ + } + } + + if (!rowFoundFlag) { + newRowIdx = widget.rows.length + } + } + + let newRow = deepClone( widget.rows[cloneRowIdx] ) + newRow.id = 'table-row-' + generateId() + newRow.merged = false + newRow.cols.forEach(col => { + col.id = 'table-cell-' + generateId() + col.options.name = col.id + col.merged = false + col.options.colspan = 1 + col.options.rowspan = 1 + col.widgetList.length = 0 + }) + widget.rows.splice(newRowIdx, 0, newRow) + + let colNo = 0 + while ((newRowIdx < widget.rows.length - 1) && (colNo < widget.rows[0].cols.length)) { //越界判断 + const cellOfNextRow = widget.rows[newRowIdx + 1].cols[colNo] + const rowMerged = cellOfNextRow.merged //确定插入位置下一行的单元格是否为合并单元格 + if (!!rowMerged) { + let rowArray = widget.rows + let unMergedCell = {} + let startRowIndex = null + for (let i = newRowIdx; i >= 0; i--) { //查找该行已合并的主单元格 + if (!rowArray[i].cols[colNo].merged && (rowArray[i].cols[colNo].options.rowspan > 1)) { + startRowIndex = i + unMergedCell = rowArray[i].cols[colNo] + break + } + } + + if (!!unMergedCell.options) { //如果有符合条件的unMergedCell + let newRowspan = unMergedCell.options.rowspan + 1 + this.setPropsOfMergedRows(widget.rows, startRowIndex, colNo, unMergedCell.options.colspan, newRowspan) + colNo += unMergedCell.options.colspan + } else { + colNo += 1 + } + } else { + //colNo += 1 + colNo += cellOfNextRow.options.colspan || 1 + } + } + + this.emitHistoryChange() + }, + + insertTableCol(widget, insertPos, curRow, leftFlag) { + let newColIdx = !!leftFlag ? insertPos : (insertPos + 1) //初步确定插入列位置 + if (!leftFlag) { //继续向右寻找同行第一个未被合并的单元格 + let tmpColIdx = newColIdx + let colFoundFlag = false + while (tmpColIdx < widget.rows[curRow].cols.length) { + if (!widget.rows[curRow].cols[tmpColIdx].merged) { + newColIdx = tmpColIdx + colFoundFlag = true + break + } else { + tmpColIdx++ + } + + if (!colFoundFlag) { + newColIdx = widget.rows[curRow].cols.length + } + } + } + + widget.rows.forEach(row => { + let newCol = deepClone(this.getContainerByType('table-cell')) + newCol.id = 'table-cell-' + generateId() + newCol.options.name = newCol.id + newCol.merged = false + newCol.options.colspan = 1 + newCol.options.rowspan = 1 + newCol.widgetList.length = 0 + row.cols.splice(newColIdx, 0, newCol) + }) + + let rowNo = 0 + while((newColIdx < widget.rows[0].cols.length - 1) && (rowNo < widget.rows.length)) { //越界判断 + const cellOfNextCol = widget.rows[rowNo].cols[newColIdx + 1] + const colMerged = cellOfNextCol.merged //确定插入位置右侧列的单元格是否为合并单元格 + if (!!colMerged) { + let colArray = widget.rows[rowNo].cols + let unMergedCell = {} + let startColIndex = null + for (let i = newColIdx; i >= 0; i--) { //查找该行已合并的主单元格 + if (!colArray[i].merged && (colArray[i].options.colspan > 1)) { + startColIndex = i + unMergedCell = colArray[i] + break + } + } + + if (!!unMergedCell.options) { //如果有符合条件的unMergedCell + let newColspan = unMergedCell.options.colspan + 1 + this.setPropsOfMergedCols(widget.rows, rowNo, startColIndex, newColspan, unMergedCell.options.rowspan) + rowNo += unMergedCell.options.rowspan + } else { + rowNo += 1 + } + } else { + //rowNo += 1 + rowNo += cellOfNextCol.options.rowspan || 1 + } + } + + this.emitHistoryChange() + }, + + setPropsOfMergedCols(rowArray, startRowIndex, startColIndex, newColspan, rowspan) { + for (let i = startRowIndex; i < startRowIndex + rowspan; i++) { + for (let j = startColIndex; j < startColIndex + newColspan; j++) { + if ((i === startRowIndex) && (j === startColIndex)) { + rowArray[i].cols[j].options.colspan = newColspan //合并后的主单元格 + continue + } + + rowArray[i].cols[j].merged = true + rowArray[i].cols[j].options.colspan = newColspan + rowArray[i].cols[j].widgetList = [] + } + } + }, + + setPropsOfMergedRows(rowArray, startRowIndex, startColIndex, colspan, newRowspan) { + for (let i = startRowIndex; i < startRowIndex + newRowspan; i++) { + for (let j = startColIndex; j < startColIndex + colspan; j++) { + if ((i === startRowIndex) && (j === startColIndex)) { + rowArray[i].cols[j].options.rowspan = newRowspan + continue + } + + rowArray[i].cols[j].merged = true + rowArray[i].cols[j].options.rowspan = newRowspan + rowArray[i].cols[j].widgetList = [] + } + } + }, + + setPropsOfSplitCol(rowArray, startRowIndex, startColIndex, colspan, rowspan) { + for (let i = startRowIndex; i < startRowIndex + rowspan; i++) { + for (let j = startColIndex; j < startColIndex + colspan; j++) { + rowArray[i].cols[j].merged = false; + rowArray[i].cols[j].options.rowspan = 1 + rowArray[i].cols[j].options.colspan = 1 + } + } + }, + + setPropsOfSplitRow(rowArray, startRowIndex, startColIndex, colspan, rowspan) { + for (let i = startRowIndex; i < startRowIndex + rowspan; i++) { + for (let j = startColIndex; j < startColIndex + colspan; j++) { + rowArray[i].cols[j].merged = false; + rowArray[i].cols[j].options.rowspan = 1 + rowArray[i].cols[j].options.colspan = 1 + } + } + }, + + mergeTableCol(rowArray, colArray, curRow, curCol, leftFlag, cellWidget) { + let mergedColIdx = !!leftFlag ? curCol : curCol + colArray[curCol].options.colspan + + // let remainedColIdx = !!leftFlag ? curCol - colArray[curCol - 1].options.colspan : curCol + let remainedColIdx = !!leftFlag ? curCol - 1 : curCol + if (!!leftFlag) { //继续向左寻找同行未被合并的第一个单元格 + let tmpColIdx = remainedColIdx + while (tmpColIdx >= 0) { + if (!rowArray[curRow].cols[tmpColIdx].merged) { + remainedColIdx = tmpColIdx + break; + } else { + tmpColIdx-- + } + } + } + + if (!!colArray[mergedColIdx].widgetList && (colArray[mergedColIdx].widgetList.length > 0)) { //保留widgetList + if (!colArray[remainedColIdx].widgetList || (colArray[remainedColIdx].widgetList.length === 0)) { + colArray[remainedColIdx].widgetList = deepClone(colArray[mergedColIdx].widgetList) + } + } + + let newColspan = colArray[mergedColIdx].options.colspan * 1 + colArray[remainedColIdx].options.colspan * 1 + this.setPropsOfMergedCols(rowArray, curRow, remainedColIdx, newColspan, cellWidget.options.rowspan) + + this.emitHistoryChange() + }, + + mergeTableWholeRow(rowArray, colArray, rowIndex, colIndex) { //需要考虑操作的行存在已合并的单元格!! + //整行所有单元格行高不一致不可合并!! + let startRowspan = rowArray[rowIndex].cols[0].options.rowspan + let unmatchedFlag = false + for (let i = 1; i < rowArray[rowIndex].cols.length; i++) { + if (rowArray[rowIndex].cols[i].options.rowspan !== startRowspan) { + unmatchedFlag = true + break; + } + } + if (unmatchedFlag) { + this.vueInstance.$message.info(this.vueInstance.i18nt('designer.hint.rowspanNotConsistentForMergeEntireRow')) + return + } + + let widgetListCols = colArray.filter((colItem) => { + return !colItem.merged && !!colItem.widgetList && (colItem.widgetList.length > 0) + }) + if (!!widgetListCols && (widgetListCols.length > 0)) { //保留widgetList + if ((widgetListCols[0].id !== colArray[0].id) && (!colArray[0].widgetList || + colArray[0].widgetList.length <= 0)) { + colArray[0].widgetList = deepClone( widgetListCols[0].widgetList ) + } + } + + this.setPropsOfMergedCols(rowArray, rowIndex, 0, colArray.length, colArray[colIndex].options.rowspan) + + this.emitHistoryChange() + }, + + mergeTableRow(rowArray, curRow, curCol, aboveFlag, cellWidget) { + let mergedRowIdx = !!aboveFlag ? curRow : curRow + cellWidget.options.rowspan + + //let remainedRowIdx = !!aboveFlag ? curRow - cellWidget.options.rowspan : curRow + let remainedRowIdx = !!aboveFlag ? curRow - 1 : curRow + if (!!aboveFlag) { //继续向上寻找同列未被合并的第一个单元格 + let tmpRowIdx = remainedRowIdx + while (tmpRowIdx >= 0) { + if (!rowArray[tmpRowIdx].cols[curCol].merged) { + remainedRowIdx = tmpRowIdx + break; + } else { + tmpRowIdx-- + } + } + } + + if (!!rowArray[mergedRowIdx].cols[curCol].widgetList && (rowArray[mergedRowIdx].cols[curCol].widgetList.length > 0)) { //保留widgetList + if (!rowArray[remainedRowIdx].cols[curCol].widgetList || (rowArray[remainedRowIdx].cols[curCol].widgetList.length === 0)) { + rowArray[remainedRowIdx].cols[curCol].widgetList = deepClone(rowArray[mergedRowIdx].cols[curCol].widgetList) + } + } + + let newRowspan = rowArray[mergedRowIdx].cols[curCol].options.rowspan * 1 + rowArray[remainedRowIdx].cols[curCol].options.rowspan * 1 + this.setPropsOfMergedRows(rowArray, remainedRowIdx, curCol, cellWidget.options.colspan, newRowspan) + + this.emitHistoryChange() + }, + + mergeTableWholeCol(rowArray, colArray, rowIndex, colIndex) { //需要考虑操作的列存在已合并的单元格!! + //整列所有单元格列宽不一致不可合并!! + let startColspan = rowArray[0].cols[colIndex].options.colspan + let unmatchedFlag = false + for (let i = 1; i < rowArray.length; i++) { + if (rowArray[i].cols[colIndex].options.colspan !== startColspan) { + unmatchedFlag = true + break; + } + } + if (unmatchedFlag) { + this.vueInstance.$message.info(this.vueInstance.i18nt('designer.hint.colspanNotConsistentForMergeEntireColumn')) + return + } + + let widgetListCols = [] + rowArray.forEach(rowItem => { + let tempCell = rowItem.cols[colIndex] + if (!tempCell.merged && !!tempCell.widgetList && (tempCell.widgetList.length > 0)) { + widgetListCols.push(tempCell) + } + }) + + let firstCellOfCol = rowArray[0].cols[colIndex] + if (!!widgetListCols && (widgetListCols.length > 0)) { //保留widgetList + if ((widgetListCols[0].id !== firstCellOfCol.id) && (!firstCellOfCol.widgetList || + firstCellOfCol.widgetList.length <= 0)) { + firstCellOfCol.widgetList = deepClone( widgetListCols[0].widgetList ) + } + } + + this.setPropsOfMergedRows(rowArray, 0, colIndex, firstCellOfCol.options.colspan, rowArray.length) + + this.emitHistoryChange() + }, + + undoMergeTableCol(rowArray, rowIndex, colIndex, colspan, rowspan) { + this.setPropsOfSplitCol(rowArray, rowIndex, colIndex, colspan, rowspan) + + this.emitHistoryChange() + }, + + undoMergeTableRow(rowArray, rowIndex, colIndex, colspan, rowspan) { + this.setPropsOfSplitRow(rowArray, rowIndex, colIndex, colspan, rowspan) + + this.emitHistoryChange() + }, + + deleteTableWholeCol(rowArray, colIndex) { //需考虑删除的是合并列!! + let onlyOneColFlag = true + rowArray.forEach(ri => { + if (ri.cols[0].options.colspan !== rowArray[0].cols.length) { + onlyOneColFlag = false + } + }) + //仅剩一列则不可删除!! + if (onlyOneColFlag) { + this.vueInstance.$message.info(this.vueInstance.i18nt('designer.hint.lastColCannotBeDeleted')) + return + } + + //整列所有单元格列宽不一致不可删除!! + let startColspan = rowArray[0].cols[colIndex].options.colspan + let unmatchedFlag = false + for (let i = 1; i < rowArray.length; i++) { + if (rowArray[i].cols[colIndex].options.colspan !== startColspan) { + unmatchedFlag = true + break; + } + } + if (unmatchedFlag) { + this.vueInstance.$message.info(this.vueInstance.i18nt('designer.hint.colspanNotConsistentForDeleteEntireColumn')) + return + } + + rowArray.forEach((rItem) => { + rItem.cols.splice(colIndex, startColspan) + }) + + this.emitHistoryChange() + }, + + deleteTableWholeRow(rowArray, rowIndex) { //需考虑删除的是合并行!! + let onlyOneRowFlag = true + rowArray[0].cols.forEach(ci => { + if (ci.options.rowspan !== rowArray.length) { + onlyOneRowFlag = false + } + }) + //仅剩一行则不可删除!! + if (onlyOneRowFlag) { + this.vueInstance.$message.info(this.vueInstance.i18nt('designer.hint.lastRowCannotBeDeleted')) + return + } + + //整行所有单元格行高不一致不可删除!! + let startRowspan = rowArray[rowIndex].cols[0].options.rowspan + let unmatchedFlag = false + for (let i = 1; i < rowArray[rowIndex].cols.length; i++) { + if (rowArray[rowIndex].cols[i].options.rowspan !== startRowspan) { + unmatchedFlag = true + break; + } + } + if (unmatchedFlag) { + this.vueInstance.$message.info(this.vueInstance.i18nt('designer.hint.rowspanNotConsistentForDeleteEntireRow')) + return + } + + rowArray.splice(rowIndex, startRowspan) + + this.emitHistoryChange() + }, + + getContainerByType(typeName) { + let allWidgets = [...containers, ...basicFields, ...advancedFields, ...customFields] + let foundCon = null + allWidgets.forEach(con => { + if (!!con.category && !!con.type && (con.type === typeName)) { + foundCon = con + } + }) + + return foundCon + }, + + getFieldWidgetByType(typeName) { + let allWidgets = [...containers, ...basicFields, ...advancedFields, ...customFields] + let foundWidget = null + allWidgets.forEach(widget => { + if (!!!widget.category && !!widget.type && (widget.type === typeName)) { + foundWidget = widget + } + }) + + return foundWidget + }, + + hasConfig(widget, configName) { + let originalWidget = null + if (!!widget.category) { + originalWidget = this.getContainerByType(widget.type) + } else { + originalWidget = this.getFieldWidgetByType(widget.type) + } + + if (!originalWidget || !originalWidget.options) { + return false + } + + return Object.keys(originalWidget.options).indexOf(configName) > -1 + }, + + cloneGridCol(widget, parentWidget) { + let newGridCol = deepClone(this.getContainerByType('grid-col')) + newGridCol.options.span = widget.options.span + let tmpId = generateId() + newGridCol.id = 'grid-col-' + tmpId + newGridCol.options.name = 'gridCol' + tmpId + + parentWidget.cols.push(newGridCol) + }, + + cloneContainer(containWidget) { + if (containWidget.type === 'grid') { + let newGrid = deepClone(this.getContainerByType('grid')) + newGrid.id = newGrid.type + generateId() + newGrid.options.name = newGrid.id + containWidget.cols.forEach(gridCol => { + let newGridCol = deepClone(this.getContainerByType('grid-col')) + let tmpId = generateId() + newGridCol.id = 'grid-col-' + tmpId + newGridCol.options.name = 'gridCol' + tmpId + newGridCol.options.span = gridCol.options.span + newGrid.cols.push(newGridCol) + }) + + return newGrid + } else if (containWidget.type === 'table') { + let newTable = deepClone(this.getContainerByType('table')) + newTable.id = newTable.type + generateId() + newTable.options.name = newTable.id + containWidget.rows.forEach(tRow => { + let newRow = deepClone(tRow) + newRow.id = 'table-row-' + generateId() + newRow.cols.forEach(col => { + col.id = 'table-cell-' + generateId() + col.options.name = col.id + col.widgetList = [] //清空组件列表 + }) + newTable.rows.push(newRow) + }) + + return newTable + } else { //其他容器组件不支持clone操作 + return null + } + }, + + moveUpWidget(parentList, indexOfParentList) { + if (!!parentList) { + if (indexOfParentList === 0) { + this.vueInstance.$message(this.vueInstance.i18nt('designer.hint.moveUpFirstChildHint')) + return + } + + let tempWidget = parentList[indexOfParentList] + parentList.splice(indexOfParentList, 1) + parentList.splice(indexOfParentList - 1, 0, tempWidget) + } + }, + + moveDownWidget(parentList, indexOfParentList) { + if (!!parentList) { + if (indexOfParentList === parentList.length - 1) { + this.vueInstance.$message(this.vueInstance.i18nt('designer.hint.moveDownLastChildHint')) + return + } + + let tempWidget = parentList[indexOfParentList] + parentList.splice(indexOfParentList, 1) + parentList.splice(indexOfParentList + 1, 0, tempWidget) + } + }, + + copyNewFieldWidget(origin) { + let newWidget = deepClone(origin) + let tempId = generateId() + newWidget.id = newWidget.type.replace(/-/g, '') + tempId + newWidget.options.name = newWidget.id + newWidget.options.label = newWidget.type.toLowerCase() + + delete newWidget.displayName + return newWidget + }, + + copyNewContainerWidget(origin) { + let newCon = deepClone(origin) + newCon.id = newCon.type.replace(/-/g, '') + generateId() + newCon.options.name = newCon.id + if (newCon.type === 'grid') { + let newCol = deepClone( this.getContainerByType('grid-col') ) + let tmpId = generateId() + newCol.id = 'grid-col-' + tmpId + newCol.options.name = 'gridCol' + tmpId + newCon.cols.push(newCol) + // + newCol = deepClone(newCol) + tmpId = generateId() + newCol.id = 'grid-col-' + tmpId + newCol.options.name = 'gridCol' + tmpId + newCon.cols.push(newCol) + } else if (newCon.type === 'table') { + let newRow = {cols: []} + newRow.id = 'table-row-' + generateId() + newRow.merged = false + let newCell = deepClone( this.getContainerByType('table-cell') ) + newCell.id = 'table-cell-' + generateId() + newCell.options.name = newCell.id + newCell.merged = false + newCell.options.colspan = 1 + newCell.options.rowspan = 1 + newRow.cols.push(newCell) + newCon.rows.push(newRow) + } else if (newCon.type === 'tab') { + let newTabPane = deepClone( this.getContainerByType('tab-pane') ) + newTabPane.id = 'tab-pane-' + generateId() + newTabPane.options.name = 'tab1' + newTabPane.options.label = 'tab 1' + newCon.tabs.push(newTabPane) + } + //newCon.options.customClass = [] + + delete newCon.displayName + return newCon + }, + + addContainerByDbClick(container) { + let newCon = this.copyNewContainerWidget(container) + this.widgetList.push(newCon) + this.setSelected(newCon) + }, + + addFieldByDbClick(widget) { + let newWidget = this.copyNewFieldWidget(widget) + if (!!this.selectedWidget && this.selectedWidget.type === 'tab') { + //获取当前激活的tabPane + let activeTab = this.selectedWidget.tabs[0] + this.selectedWidget.tabs.forEach(tabPane => { + if (!!tabPane.options.active) { + activeTab = tabPane + } + }) + + !!activeTab && activeTab.widgetList.push(newWidget) + } else if (!!this.selectedWidget && !!this.selectedWidget.widgetList) { + this.selectedWidget.widgetList.push(newWidget) + } else { + this.widgetList.push(newWidget) + } + + this.setSelected(newWidget) + this.emitHistoryChange() + }, + + deleteColOfGrid(gridWidget, colIdx) { + if (!!gridWidget && !!gridWidget.cols) { + gridWidget.cols.splice(colIdx, 1) + } + }, + + addNewColOfGrid(gridWidget) { + const cols = gridWidget.cols + let newGridCol = deepClone(this.getContainerByType('grid-col')) + let tmpId = generateId() + newGridCol.id = 'grid-col-' + tmpId + newGridCol.options.name = 'gridCol' + tmpId + if ((!!cols) && (cols.length > 0)) { + let spanSum = 0 + cols.forEach((col) => { + spanSum += col.options.span + }) + + if (spanSum >= 24) { + //this.$message.info('列栅格之和超出24') + console.log('列栅格之和超出24') + gridWidget.cols.push(newGridCol) + } else { + newGridCol.options.span = (24 - spanSum) > 12 ? 12 : (24 - spanSum) + gridWidget.cols.push(newGridCol) + } + } else { + gridWidget.cols = [newGridCol] + } + }, + + addTabPaneOfTabs(tabsWidget) { + const tabPanes = tabsWidget.tabs + let newTabPane = deepClone( this.getContainerByType('tab-pane') ) + newTabPane.id = 'tab-pane-' + generateId() + newTabPane.options.name = newTabPane.id + newTabPane.options.label = 'tab ' + (tabPanes.length + 1) + tabPanes.push(newTabPane) + }, + + deleteTabPaneOfTabs(tabsWidget, tpIdx) { + tabsWidget.tabs.splice(tpIdx, 1) + }, + + emitEvent(evtName, evtData) { //用于兄弟组件发射事件 + //this.vueInstance.$emit(evtName, evtData) + eventBus.$emit(evtName, evtData) + }, + + handleEvent(evtName, callback) { //用于兄弟组件接收事件 + //this.vueInstance.$on(evtName, (data) => callback(data)) + eventBus.$on(evtName, (data) => callback(data)) + }, + + setCssClassList(cssClassList) { + this.cssClassList = cssClassList + }, + + getCssClassList() { + return this.cssClassList + }, + + registerFormWidget(formWidget) { + this.formWidget = formWidget + }, + + initHistoryData() { + this.loadFormContentFromStorage() + this.historyData.index++ + this.historyData.steps[this.historyData.index] = ({ + widgetList: deepClone(this.widgetList), + formConfig: deepClone(this.formConfig) + }) + }, + + emitHistoryChange() { + //console.log('------------', 'Form history changed!') + + if (this.historyData.index === this.historyData.maxStep - 1) { + this.historyData.steps.shift() + } else { + this.historyData.index++ + } + + this.historyData.steps[this.historyData.index] = ({ + widgetList: deepClone(this.widgetList), + formConfig: deepClone(this.formConfig) + }) + + this.saveFormContentToStorage() + + if (this.historyData.index < this.historyData.steps.length - 1) { + this.historyData.steps = this.historyData.steps.slice(0, this.historyData.index + 1) + } + + console.log('history', this.historyData.index) + }, + + saveCurrentHistoryStep() { + this.historyData.steps[this.historyData.index] = deepClone({ + widgetList: this.widgetList, + formConfig: this.formConfig + }) + + this.saveFormContentToStorage() + }, + + undoHistoryStep() { + if (this.historyData.index !== 0) { + this.historyData.index-- + } + console.log('undo', this.historyData.index) + + this.widgetList = deepClone(this.historyData.steps[this.historyData.index].widgetList) + this.formConfig = deepClone(this.historyData.steps[this.historyData.index].formConfig) + }, + + redoHistoryStep() { + if (this.historyData.index !== (this.historyData.steps.length - 1)) { + this.historyData.index++ + } + console.log('redo', this.historyData.index) + + this.widgetList = deepClone(this.historyData.steps[this.historyData.index].widgetList) + this.formConfig = deepClone(this.historyData.steps[this.historyData.index].formConfig) + }, + + undoEnabled() { + return (this.historyData.index > 0) && (this.historyData.steps.length > 0) + }, + + redoEnabled() { + return this.historyData.index < (this.historyData.steps.length - 1) + }, + + saveFormContentToStorage() { + window.localStorage.setItem('widget__list__backup', JSON.stringify(this.widgetList)) + window.localStorage.setItem('form__config__backup', JSON.stringify(this.formConfig)) + }, + + loadFormContentFromStorage() { + let widgetListBackup = window.localStorage.getItem('widget__list__backup') + if (!!widgetListBackup) { + this.widgetList = JSON.parse(widgetListBackup) + } + + let formConfigBackup = window.localStorage.getItem('form__config__backup') + if (!!formConfigBackup) { + //this.formConfig = JSON.parse(formConfigBackup) + overwriteObj(this.formConfig, JSON.parse(formConfigBackup)) /* 用=赋值,会导致inject依赖注入的formConfig属性变成非响应式 */ + } + }, + + + } +} diff --git a/src/components/form-designer/form-widget/container-widget/container-wrapper.vue b/src/components/form-designer/form-widget/container-widget/container-wrapper.vue new file mode 100644 index 0000000..eff2a83 --- /dev/null +++ b/src/components/form-designer/form-widget/container-widget/container-wrapper.vue @@ -0,0 +1,108 @@ + + + + + + + diff --git a/src/components/form-designer/form-widget/container-widget/containerMixin.js b/src/components/form-designer/form-widget/container-widget/containerMixin.js new file mode 100644 index 0000000..72c8f79 --- /dev/null +++ b/src/components/form-designer/form-widget/container-widget/containerMixin.js @@ -0,0 +1,85 @@ +export default { + methods: { + appendTableRow(widget) { + this.designer.appendTableRow(widget) + }, + + appendTableCol(widget) { + this.designer.appendTableCol(widget) + }, + + onContainerDragAdd(evt, subList) { + const newIndex = evt.newIndex + if (!!subList[newIndex]) { + this.designer.setSelected( subList[newIndex] ) + } + + this.designer.emitHistoryChange() + }, + + onContainerDragUpdate() { + this.designer.emitHistoryChange() + }, + + checkContainerMove(evt) { + return this.designer.checkWidgetMove(evt) + }, + + selectWidget(widget) { + this.designer.setSelected(widget) + }, + + selectParentWidget() { + if (this.parentWidget) { + this.designer.setSelected(this.parentWidget) + } else { + this.designer.clearSelected() + } + }, + + moveUpWidget() { + this.designer.moveUpWidget(this.parentList, this.indexOfParentList) + this.designer.emitHistoryChange() + }, + + moveDownWidget() { + this.designer.moveDownWidget(this.parentList, this.indexOfParentList) + this.designer.emitHistoryChange() + }, + + cloneContainer(widget) { + if (!!this.parentList) { + let newCon = this.designer.cloneContainer(widget) + this.parentList.splice(this.indexOfParentList + 1, 0, newCon) + this.designer.setSelected(newCon) + + this.designer.emitHistoryChange() + } + }, + + removeWidget() { + if (!!this.parentList) { + let nextSelected = null + if (this.parentList.length === 1) { + if (!!this.parentWidget) { + nextSelected = this.parentWidget + } + } else if (this.parentList.length === (1 + this.indexOfParentList)) { + nextSelected = this.parentList[this.indexOfParentList - 1] + } else { + nextSelected = this.parentList[this.indexOfParentList + 1] + } + + this.$nextTick(() => { + this.parentList.splice(this.indexOfParentList, 1) + //if (!!nextSelected) { + this.designer.setSelected(nextSelected) + //} + + this.designer.emitHistoryChange() + }) + } + }, + + } +} diff --git a/src/components/form-designer/form-widget/container-widget/grid-col-widget.vue b/src/components/form-designer/form-widget/container-widget/grid-col-widget.vue new file mode 100644 index 0000000..71c7d4d --- /dev/null +++ b/src/components/form-designer/form-widget/container-widget/grid-col-widget.vue @@ -0,0 +1,311 @@ + + + + + diff --git a/src/components/form-designer/form-widget/container-widget/grid-widget.vue b/src/components/form-designer/form-widget/container-widget/grid-widget.vue new file mode 100644 index 0000000..d440ed4 --- /dev/null +++ b/src/components/form-designer/form-widget/container-widget/grid-widget.vue @@ -0,0 +1,89 @@ + + + + + + + diff --git a/src/components/form-designer/form-widget/container-widget/index.js b/src/components/form-designer/form-widget/container-widget/index.js new file mode 100644 index 0000000..73cddcb --- /dev/null +++ b/src/components/form-designer/form-widget/container-widget/index.js @@ -0,0 +1,10 @@ +const modules = import.meta.globEager('./*.vue') + +export default { + install(app) { + for (const path in modules) { + let cname = modules[path].default.name + app.component(cname, modules[path].default) + } + } +} diff --git a/src/components/form-designer/form-widget/container-widget/tab-widget.vue b/src/components/form-designer/form-widget/container-widget/tab-widget.vue new file mode 100644 index 0000000..b37515f --- /dev/null +++ b/src/components/form-designer/form-widget/container-widget/tab-widget.vue @@ -0,0 +1,119 @@ + + + + + + + diff --git a/src/components/form-designer/form-widget/container-widget/table-cell-widget.vue b/src/components/form-designer/form-widget/container-widget/table-cell-widget.vue new file mode 100644 index 0000000..bf72d46 --- /dev/null +++ b/src/components/form-designer/form-widget/container-widget/table-cell-widget.vue @@ -0,0 +1,344 @@ + + + + + diff --git a/src/components/form-designer/form-widget/container-widget/table-widget.vue b/src/components/form-designer/form-widget/container-widget/table-widget.vue new file mode 100644 index 0000000..cac311d --- /dev/null +++ b/src/components/form-designer/form-widget/container-widget/table-widget.vue @@ -0,0 +1,111 @@ + + + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/button-widget.vue b/src/components/form-designer/form-widget/field-widget/button-widget.vue new file mode 100644 index 0000000..edbfdcb --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/button-widget.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/cascader-widget.vue b/src/components/form-designer/form-widget/field-widget/cascader-widget.vue new file mode 100644 index 0000000..35653c9 --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/cascader-widget.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/checkbox-widget.vue b/src/components/form-designer/form-widget/field-widget/checkbox-widget.vue new file mode 100644 index 0000000..e8b1a50 --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/checkbox-widget.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/color-widget.vue b/src/components/form-designer/form-widget/field-widget/color-widget.vue new file mode 100644 index 0000000..d0b30e8 --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/color-widget.vue @@ -0,0 +1,99 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/date-range-widget.vue b/src/components/form-designer/form-widget/field-widget/date-range-widget.vue new file mode 100644 index 0000000..80872c4 --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/date-range-widget.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/date-widget.vue b/src/components/form-designer/form-widget/field-widget/date-widget.vue new file mode 100644 index 0000000..dfd8c0a --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/date-widget.vue @@ -0,0 +1,103 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/divider-widget.vue b/src/components/form-designer/form-widget/field-widget/divider-widget.vue new file mode 100644 index 0000000..2822a7e --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/divider-widget.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/fieldMixin.js b/src/components/form-designer/form-widget/field-widget/fieldMixin.js new file mode 100644 index 0000000..33c1f22 --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/fieldMixin.js @@ -0,0 +1,546 @@ +import {deepClone} from "@/utils/util" +import FormValidators from '@/utils/validators' +import eventBus from "@/utils/event-bus" + +export default { + inject: ['refList', 'formConfig', 'globalOptionData', 'globalModel', 'getOptionData'], + + computed: { + subFormName() { + return !!this.parentWidget ? this.parentWidget.options.name : '' + }, + + subFormItemFlag() { + return !!this.parentWidget ? this.parentWidget.type === 'sub-form' : false + }, + + formModel: { + cache: false, + get() { + return this.globalModel.formModel + } + }, + + }, + + methods: { + + //--------------------- 组件内部方法 begin ------------------// + + initFieldModel() { + if (!this.field.formItemFlag) { + return + } + + if (!!this.subFormItemFlag && !this.designState) { //SubForm子表单组件需要特殊处理!! + let subFormData = this.formModel[this.subFormName] + if (((subFormData === undefined) || (subFormData[this.subFormRowIndex] === undefined) || + (subFormData[this.subFormRowIndex][this.field.options.name] === undefined)) && + (this.field.options.defaultValue !== undefined)) { + this.fieldModel = this.field.options.defaultValue + subFormData[this.subFormRowIndex][this.field.options.name] = this.field.options.defaultValue + } else if (subFormData[this.subFormRowIndex][this.field.options.name] === undefined) { + this.fieldModel = null + subFormData[this.subFormRowIndex][this.field.options.name] = null + } else { + this.fieldModel = subFormData[this.subFormRowIndex][this.field.options.name] + } + + /* 主动触发子表单内field-widget的onChange事件!! */ + setTimeout(() => { //延时触发onChange事件, 便于更新计算字段!! + this.handleOnChangeForSubForm(this.fieldModel, this.oldFieldValue, subFormData, this.subFormRowId) + }, 800) + this.oldFieldValue = deepClone(this.fieldModel) + + this.initFileList() //处理图片上传、文件上传字段 + + return + } + + if ((this.formModel[this.field.options.name] === undefined) && + (this.field.options.defaultValue !== undefined)) { + this.fieldModel = this.field.options.defaultValue + } else if (this.formModel[this.field.options.name] === undefined) { //如果formModel为空对象,则初始化字段值为null!! + this.formModel[this.field.options.name] = null + } else { + this.fieldModel = this.formModel[this.field.options.name] + } + this.oldFieldValue = deepClone(this.fieldModel) + this.initFileList() //处理图片上传、文件上传字段 + }, + + initFileList() { //初始化上传组件的已上传文件列表 + if ( ((this.field.type !== 'picture-upload') && (this.field.type !== 'file-upload')) || (this.designState === true) ) { + return + } + + if (!!this.fieldModel) { + if (Array.isArray(this.fieldModel)) { + this.fileList = deepClone(this.fieldModel) + } else { + this.fileList.splice(0, 0, deepClone(this.fieldModel)) + } + } + }, + + initEventHandler() { + eventBus.$on('setFormData', function (newFormData) { + console.log('formModel of globalModel----------', this.globalModel.formModel) + if (!this.subFormItemFlag) { + this.setValue(newFormData[this.field.options.name]) + } + }) + + eventBus.$on('field-value-changed', function (values) { + if (!!this.subFormItemFlag) { + let subFormData = this.formModel[this.subFormName] + this.handleOnChangeForSubForm(values[0], values[1], subFormData, this.subFormRowId) + } else { + this.handleOnChange(values[0], values[1]) + } + }) + + /* 监听重新加载选项事件 */ + eventBus.$on('reloadOptionItems', function (widgetNames) { + if ((widgetNames.length === 0) || (widgetNames.indexOf(this.field.options.name) > -1)) { + this.initOptionItems(true) + } + }) + }, + + handleOnCreated() { + if (!!this.field.options.onCreated) { + let customFunc = new Function(this.field.options.onCreated) + customFunc.call(this) + } + }, + + handleOnMounted() { + if (!!this.field.options.onMounted) { + let mountFunc = new Function(this.field.options.onMounted) + mountFunc.call(this) + } + }, + + registerToRefList(oldRefName) { + if ((this.refList !== null) && !!this.field.options.name) { + if (this.subFormItemFlag && !this.designState) { //处理子表单元素(且非设计状态) + if (!!oldRefName) { + delete this.refList[oldRefName + '@row' + this.subFormRowId] + } + this.refList[this.field.options.name + '@row' + this.subFormRowId] = this + } else { + if (!!oldRefName) { + delete this.refList[oldRefName] + } + this.refList[this.field.options.name] = this + } + } + }, + + unregisterFromRefList() { //销毁组件时注销组件ref + if ((this.refList !== null) && !!this.field.options.name) { + let oldRefName = this.field.options.name + if (this.subFormItemFlag && !this.designState) { //处理子表单元素(且非设计状态) + delete this.refList[oldRefName + '@row' + this.subFormRowId] + } else { + delete this.refList[oldRefName] + } + } + }, + + initOptionItems(keepSelected) { + if (this.designState) { + return + } + + if ((this.field.type === 'radio') || (this.field.type === 'checkbox') + || (this.field.type === 'select') || (this.field.type === 'cascader')) { + if (!!this.globalOptionData && this.globalOptionData.hasOwnProperty(this.field.options.name)) { + if (!!keepSelected) { + //this.reloadOptions(this.globalOptionData[this.field.options.name]) /* 异步更新option-data之后不能获取到最新值, + // 以下改用provide的getOptionData()方法 */ + const newOptionItems = this.getOptionData() + this.reloadOptions(newOptionItems[this.field.options.name]) + } else { + this.loadOptions( this.globalOptionData[this.field.options.name] ) + } + } + } + }, + + refreshDefaultValue() { + if ((this.designState === true) && (this.field.options.defaultValue !== undefined)) { + this.fieldModel = this.field.options.defaultValue + } + }, + + clearFieldRules() { + if (!this.field.formItemFlag) { + return + } + + this.rules.splice(0, this.rules.length) //清空已有 + }, + + buildFieldRules() { + if (!this.field.formItemFlag) { + return + } + + this.rules.splice(0, this.rules.length) //清空已有 + if (!!this.field.options.required) { + this.rules.push({ + required: true, + //trigger: ['blur', 'change'], + trigger: ['blur'], /* 去掉change事件触发校验,change事件触发时formModel数据尚未更新,导致radio/checkbox必填校验出错!! */ + message: this.i18nt('render.hint.fieldRequired'), + }) + } + + if (!!this.field.options.validation) { + let vldName = this.field.options.validation + if (!!FormValidators[vldName]) { + this.rules.push({ + validator: FormValidators[vldName], + trigger: ['blur', 'change'], + label: this.field.options.label, + errorMsg: this.field.options.validationHint + }) + } else { + this.rules.push({ + validator: FormValidators['regExp'], + trigger: ['blur', 'change'], + regExp: vldName, + label: this.field.options.label, + errorMsg: this.field.options.validationHint + }) + } + } + + if (!!this.field.options.onValidate) { + let customFn = new Function('rule', 'value', 'callback', this.field.options.onValidate) + this.rules.push({ + validator: customFn, + trigger: ['blur', 'change'], + label: this.field.options.label + }) + } + }, + + /** + * 禁用字段值变动触发表单校验 + */ + disableChangeValidate() { + if (!this.rules) { + return + } + + this.rules.forEach(rule => { + if (!!rule.trigger) { + rule.trigger.splice(0, rule.trigger.length) + } + }) + }, + + /** + * 启用字段值变动触发表单校验 + */ + enableChangeValidate() { + if (!this.rules) { + return + } + + this.rules.forEach(rule => { + if (!!rule.trigger) { + rule.trigger.push('blur') + rule.trigger.push('change') + } + }) + }, + + disableOptionOfList(optionList, optionValue) { + if (!!optionList && (optionList.length > 0)) { + optionList.forEach(opt => { + if (opt.value === optionValue) { + opt.disabled = true + } + }) + } + }, + + enableOptionOfList(optionList, optionValue) { + if (!!optionList && (optionList.length > 0)) { + optionList.forEach(opt => { + if (opt.value === optionValue) { + opt.disabled = false + } + }) + } + }, + + //--------------------- 组件内部方法 end ------------------// + + //--------------------- 事件处理 begin ------------------// + + emitFieldDataChange(newValue, oldValue) { + this.$emit('field-value-changed', [newValue, oldValue]) + + /* 必须用dispatch向指定父组件派发消息!! */ + this.dispatch('VFormRender', 'fieldChange', + [this.field.options.name, newValue, oldValue, this.subFormName, this.subFormRowIndex]) + }, + + syncUpdateFormModel(value) { + if (!!this.designState) { + return + } + + if (!!this.subFormItemFlag) { + let subFormData = this.formModel[this.subFormName] || [{}] + let subFormDataRow = subFormData[this.subFormRowIndex] + subFormDataRow[this.field.options.name] = value + } else { + this.formModel[this.field.options.name] = value + } + }, + + handleChangeEvent(value) { + this.syncUpdateFormModel(value) + this.emitFieldDataChange(value, this.oldFieldValue) + + //number组件一般不会触发focus事件,故此处需要手工赋值oldFieldValue!! + this.oldFieldValue = deepClone(value) /* oldFieldValue需要在initFieldModel()方法中赋初值!! */ + + /* 主动触发表单的单个字段校验,用于清除字段可能存在的校验错误提示 */ + this.dispatch('VFormRender', 'fieldValidation', [this.field.options.name]) + }, + + handleFocusCustomEvent(event) { + this.oldFieldValue = deepClone(this.fieldModel) //保存修改change之前的值 + + if (!!this.field.options.onFocus) { + let customFn = new Function('event', this.field.options.onFocus) + customFn.call(this, event) + } + }, + + handleBlurCustomEvent(event) { + if (!!this.field.options.onBlur) { + let customFn = new Function('event', this.field.options.onBlur) + customFn.call(this, event) + } + }, + + handleInputCustomEvent(value) { + this.syncUpdateFormModel(value) + + if (!!this.field.options.onInput) { + let customFn = new Function('value', this.field.options.onInput) + customFn.call(this, value) + } + }, + + emitAppendButtonClick() { + /* 必须调用mixins中的dispatch方法逐级向父组件发送消息!! */ + this.dispatch('VFormRender', 'appendButtonClick', [this]); + }, + + handleOnChange(val, oldVal) { //自定义onChange事件 + if (!!this.field.options.onChange) { + let changeFn = new Function('value', 'oldValue', this.field.options.onChange) + changeFn.call(this, val, oldVal) + } + }, + + handleOnChangeForSubForm(val, oldVal, subFormData, rowId) { //子表单自定义onChange事件 + if (!!this.field.options.onChange) { + let changeFn = new Function('value', 'oldValue', 'subFormData', 'rowId', this.field.options.onChange) + changeFn.call(this, val, oldVal, subFormData, rowId) + } + }, + + handleButtonWidgetClick() { + if (!!this.designState) { //设计状态不触发点击事件 + return + } + + if (!!this.field.options.onClick) { + let changeFn = new Function(this.field.options.onClick) + changeFn.call(this) + } else { + this.dispatch('VFormRender', 'buttonClick', [this]); + } + }, + + remoteQuery(keyword) { + if (!!this.field.options.onRemoteQuery) { + let remoteFn = new Function('keyword', this.field.options.onRemoteQuery) + remoteFn.call(this, keyword) + } + }, + + //--------------------- 事件处理 end ------------------// + + //--------------------- 以下为组件支持外部调用的API方法 begin ------------------// + /* 提示:用户可自行扩充这些方法!!! */ + + getFormRef() { /* 获取VFrom引用,必须在VForm组件created之后方可调用 */ + return this.refList['v_form_ref'] + }, + + getWidgetRef(widgetName, showError) { + let foundRef = this.refList[widgetName] + if (!foundRef && !!showError) { + this.$message.error(this.i18nt('render.hint.refNotFound') + widgetName) + } + return foundRef + }, + + getFieldEditor() { //获取内置的el表单组件 + return this.$refs['fieldEditor'] + }, + + /* + 注意:VFormRender的setFormData方法不会触发子表单内field-widget的setValue方法, + 因为setFormData方法调用后,子表单内所有field-widget组件已被清空,接收不到setFormData事件!! + * */ + setValue(newValue) { + /* if ((this.field.type === 'picture-upload') || (this.field.type === 'file-upload')) { + this.fileList = newValue + } else */ if (!!this.field.formItemFlag) { + let oldValue = deepClone(this.fieldModel) + this.fieldModel = newValue + this.initFileList() + + this.syncUpdateFormModel(newValue) + this.emitFieldDataChange(newValue, oldValue) + } + }, + + getValue() { + /* if ((this.field.type === 'picture-upload') || (this.field.type === 'file-upload')) { + return this.fileList + } else */ { + return this.fieldModel + } + }, + + resetField() { + let defaultValue = this.field.options.defaultValue + this.setValue(defaultValue) + this.$nextTick(() => { + // + }) + + //清空上传组件文件列表 + if ((this.field.type === 'picture-upload') || (this.field.type === 'file-upload')) { + this.$refs['fieldEditor'].clearFiles() + this.fileList.splice(0, this.fileList.length) + } + }, + + setWidgetOption(optionName, optionValue) { //通用组件选项修改API + if (this.field.options.hasOwnProperty(optionName)) { + this.field.options[optionName] = optionValue + //TODO: 是否重新构建组件??有些属性修改后必须重新构建组件才能生效,比如字段校验规则。 + } + }, + + setReadonly(flag) { + this.field.options.readonly = flag + }, + + setDisabled(flag) { + this.field.options.disabled = flag + }, + + setAppendButtonVisible(flag) { + this.field.options.appendButton = flag + }, + + setAppendButtonDisabled(flag) { + this.field.options.appendButtonDisabled = flag + }, + + setHidden(flag) { + this.field.options.hidden = flag + + if (!!flag) { //清除组件校验规则 + this.clearFieldRules() + } else { //重建组件校验规则 + this.buildFieldRules() + } + }, + + setRequired(flag) { + this.field.options.required = flag + this.buildFieldRules() + }, + + setLabel(newLabel) { + this.field.options.label = newLabel + }, + + focus() { + if (!!this.getFieldEditor() && !!this.getFieldEditor().focus) { + this.getFieldEditor().focus() + } + }, + + clearSelectedOptions() { //清空已选选项 + if ((this.field.type !== 'checkbox') && (this.field.type !== 'radio') && (this.field.type !== 'select')) { + return + } + + if ((this.field.type === 'checkbox') || + ((this.field.type === 'select') && this.field.options.multiple)) { + this.fieldModel = [] + } else { + this.fieldModel = '' + } + }, + + /** + * 加载选项,并清空字段值 + * @param options + */ + loadOptions(options) { + this.field.options.optionItems = deepClone(options) + //this.clearSelectedOptions() //清空已选选项 + }, + + /** + * 重新加载选项,不清空字段值 + * @param options + */ + reloadOptions(options) { + this.field.options.optionItems = deepClone(options) + }, + + disableOption(optionValue) { + this.disableOptionOfList(this.field.options.optionItems, optionValue) + }, + + enableOption(optionValue) { + this.enableOptionOfList(this.field.options.optionItems, optionValue) + }, + + setUploadHeader(name, value) { + //this.$set(this.uploadHeaders, name, value) + this.uploadHeaders[name] = value + }, + + setUploadData(name, value) { + //this.$set(this.uploadData, name, value) + this.uploadData[name] = value + }, + + setToolbar(customToolbar) { + this.customToolbar = customToolbar + }, + + //--------------------- 以上为组件支持外部调用的API方法 end ------------------// + + } +} diff --git a/src/components/form-designer/form-widget/field-widget/file-upload-widget.vue b/src/components/form-designer/form-widget/field-widget/file-upload-widget.vue new file mode 100644 index 0000000..b89cc73 --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/file-upload-widget.vue @@ -0,0 +1,278 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/form-item-wrapper.vue b/src/components/form-designer/form-widget/field-widget/form-item-wrapper.vue new file mode 100644 index 0000000..f4656ef --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/form-item-wrapper.vue @@ -0,0 +1,333 @@ + + + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/html-text-widget.vue b/src/components/form-designer/form-widget/field-widget/html-text-widget.vue new file mode 100644 index 0000000..f4c8f42 --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/html-text-widget.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/index.js b/src/components/form-designer/form-widget/field-widget/index.js new file mode 100644 index 0000000..edcc4a0 --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/index.js @@ -0,0 +1,9 @@ +let comps = {} + +const modules = import.meta.globEager('./*.vue') +for (const path in modules) { + let cname = modules[path].default.name + comps[cname] = modules[path].default +} + +export default comps diff --git a/src/components/form-designer/form-widget/field-widget/input-widget.vue b/src/components/form-designer/form-widget/field-widget/input-widget.vue new file mode 100644 index 0000000..c6658d3 --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/input-widget.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/number-widget.vue b/src/components/form-designer/form-widget/field-widget/number-widget.vue new file mode 100644 index 0000000..5abba17 --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/number-widget.vue @@ -0,0 +1,103 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/picture-upload-widget.vue b/src/components/form-designer/form-widget/field-widget/picture-upload-widget.vue new file mode 100644 index 0000000..11d8baa --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/picture-upload-widget.vue @@ -0,0 +1,225 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/radio-widget.vue b/src/components/form-designer/form-widget/field-widget/radio-widget.vue new file mode 100644 index 0000000..9b95acf --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/radio-widget.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/rate-widget.vue b/src/components/form-designer/form-widget/field-widget/rate-widget.vue new file mode 100644 index 0000000..d3fadc1 --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/rate-widget.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/rich-editor-widget.vue b/src/components/form-designer/form-widget/field-widget/rich-editor-widget.vue new file mode 100644 index 0000000..edc2b64 --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/rich-editor-widget.vue @@ -0,0 +1,124 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/select-widget.vue b/src/components/form-designer/form-widget/field-widget/select-widget.vue new file mode 100644 index 0000000..16cbf9c --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/select-widget.vue @@ -0,0 +1,115 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/slider-widget.vue b/src/components/form-designer/form-widget/field-widget/slider-widget.vue new file mode 100644 index 0000000..0b65ca2 --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/slider-widget.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/slot-widget.vue b/src/components/form-designer/form-widget/field-widget/slot-widget.vue new file mode 100644 index 0000000..9b59829 --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/slot-widget.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/static-content-wrapper.vue b/src/components/form-designer/form-widget/field-widget/static-content-wrapper.vue new file mode 100644 index 0000000..1fa3299 --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/static-content-wrapper.vue @@ -0,0 +1,189 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/static-text-widget.vue b/src/components/form-designer/form-widget/field-widget/static-text-widget.vue new file mode 100644 index 0000000..02a8bca --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/static-text-widget.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/switch-widget.vue b/src/components/form-designer/form-widget/field-widget/switch-widget.vue new file mode 100644 index 0000000..44d5588 --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/switch-widget.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/textarea-widget.vue b/src/components/form-designer/form-widget/field-widget/textarea-widget.vue new file mode 100644 index 0000000..be4d5f3 --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/textarea-widget.vue @@ -0,0 +1,99 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/time-range-widget.vue b/src/components/form-designer/form-widget/field-widget/time-range-widget.vue new file mode 100644 index 0000000..295e20c --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/time-range-widget.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/src/components/form-designer/form-widget/field-widget/time-widget.vue b/src/components/form-designer/form-widget/field-widget/time-widget.vue new file mode 100644 index 0000000..1f18c0f --- /dev/null +++ b/src/components/form-designer/form-widget/field-widget/time-widget.vue @@ -0,0 +1,103 @@ + + + + + diff --git a/src/components/form-designer/form-widget/index.vue b/src/components/form-designer/form-widget/index.vue new file mode 100644 index 0000000..510ca25 --- /dev/null +++ b/src/components/form-designer/form-widget/index.vue @@ -0,0 +1,266 @@ + + + + + diff --git a/src/components/form-designer/index.vue b/src/components/form-designer/index.vue new file mode 100644 index 0000000..a09eeb3 --- /dev/null +++ b/src/components/form-designer/index.vue @@ -0,0 +1,426 @@ + + + + + + + diff --git a/src/components/form-designer/setting-panel/form-setting.vue b/src/components/form-designer/setting-panel/form-setting.vue new file mode 100644 index 0000000..635d6d1 --- /dev/null +++ b/src/components/form-designer/setting-panel/form-setting.vue @@ -0,0 +1,330 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/index.vue b/src/components/form-designer/setting-panel/index.vue new file mode 100644 index 0000000..b0843da --- /dev/null +++ b/src/components/form-designer/setting-panel/index.vue @@ -0,0 +1,331 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/option-items-setting.vue b/src/components/form-designer/setting-panel/option-items-setting.vue new file mode 100644 index 0000000..e1b834e --- /dev/null +++ b/src/components/form-designer/setting-panel/option-items-setting.vue @@ -0,0 +1,242 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor-factory.jsx b/src/components/form-designer/setting-panel/property-editor-factory.jsx new file mode 100644 index 0000000..632494c --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor-factory.jsx @@ -0,0 +1,173 @@ +import {translate} from "@/utils/i18n" +import emitter from '@/utils/emitter' + +export const createInputTextEditor = function (propName, propLabelKey) { + return { + props: { + optionModel: Object, + }, + render(h) { + return ( + + + + ) + } + } +} + +export const createInputNumberEditor = function (propName, propLabelKey) { + return { + props: { + optionModel: Object, + }, + methods: { + updateValue(newValue) { + if ((newValue === undefined) || (newValue === null) || isNaN(newValue)) { + this.optionModel[propName] = null + } else { + this.optionModel[propName] = Number(newValue) + } + }, + }, + render(h) { + return ( + + + + ) + } + } +} + +export const createBooleanEditor = function (propName, propLabelKey) { + return { + props: { + optionModel: Object, + }, + render(h) { + return ( + + + + ) + } + } +} + +export const createCheckboxGroupEditor = function (propName, propLabelKey, configs) { + return { + props: { + optionModel: Object, + }, + render(h) { + return ( + + + { + configs.optionItems.map(item => { + return {item.label} + }) + } + + + ) + } + } +} + + +export const createRadioGroupEditor = function (propName, propLabelKey, configs) { + return { + props: { + optionModel: Object, + }, + render(h) { + return ( + + + { + configs.optionItems.map(item => { + return {item.label} + }) + } + + + ) + } + } +} + +export const createRadioButtonGroupEditor = function (propName, propLabelKey, configs) { + return { + props: { + optionModel: Object, + }, + render(h) { + return ( + + + { + configs.optionItems.map(item => { + return {item.label} + }) + } + + + ) + } + } +} + +export const createSelectEditor = function (propName, propLabelKey, configs) { + return { + props: { + optionModel: Object, + }, + render(h) { + return ( + + + { + configs.optionItems.map(item => { + return + }) + } + + + ) + } + } +} + +export const createEventHandlerEditor = function (eventPropName, eventParams) { + return { + props: { + optionModel: Object, + }, + mixins: [emitter], + methods: { + editEventHandler() { + this.dispatch('SettingPanel', 'editEventHandler', [eventPropName, [...eventParams]]) + }, + }, + render(h) { + return ( + + + {translate('designer.setting.addEventHandler')} + + ) + } + } +} + +export const createEmptyEditor = function () { + return { + render() { + return
+ } + } +} + diff --git a/src/components/form-designer/setting-panel/property-editor/allowCreate-editor.vue b/src/components/form-designer/setting-panel/property-editor/allowCreate-editor.vue new file mode 100644 index 0000000..add2090 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/allowCreate-editor.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/appendButton-editor.vue b/src/components/form-designer/setting-panel/property-editor/appendButton-editor.vue new file mode 100644 index 0000000..d844945 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/appendButton-editor.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/appendButtonDisabled-editor.vue b/src/components/form-designer/setting-panel/property-editor/appendButtonDisabled-editor.vue new file mode 100644 index 0000000..b76e318 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/appendButtonDisabled-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/automaticDropdown-editor.vue b/src/components/form-designer/setting-panel/property-editor/automaticDropdown-editor.vue new file mode 100644 index 0000000..cb8d7c6 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/automaticDropdown-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/border-editor.vue b/src/components/form-designer/setting-panel/property-editor/border-editor.vue new file mode 100644 index 0000000..4f77bec --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/border-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/buttonIcon-editor.vue b/src/components/form-designer/setting-panel/property-editor/buttonIcon-editor.vue new file mode 100644 index 0000000..93848a4 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/buttonIcon-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/buttonStyle-editor.vue b/src/components/form-designer/setting-panel/property-editor/buttonStyle-editor.vue new file mode 100644 index 0000000..cc635df --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/buttonStyle-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/clearable-editor.vue b/src/components/form-designer/setting-panel/property-editor/clearable-editor.vue new file mode 100644 index 0000000..4f79ff0 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/clearable-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/columnWidth-editor.vue b/src/components/form-designer/setting-panel/property-editor/columnWidth-editor.vue new file mode 100644 index 0000000..785e8c6 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/columnWidth-editor.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/container-grid-col/grid-col-offset-editor.vue b/src/components/form-designer/setting-panel/property-editor/container-grid-col/grid-col-offset-editor.vue new file mode 100644 index 0000000..046818c --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/container-grid-col/grid-col-offset-editor.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/container-grid-col/grid-col-pull-editor.vue b/src/components/form-designer/setting-panel/property-editor/container-grid-col/grid-col-pull-editor.vue new file mode 100644 index 0000000..3cfb0c4 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/container-grid-col/grid-col-pull-editor.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/container-grid-col/grid-col-push-editor.vue b/src/components/form-designer/setting-panel/property-editor/container-grid-col/grid-col-push-editor.vue new file mode 100644 index 0000000..23d0815 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/container-grid-col/grid-col-push-editor.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/container-grid-col/grid-col-responsive-editor.vue b/src/components/form-designer/setting-panel/property-editor/container-grid-col/grid-col-responsive-editor.vue new file mode 100644 index 0000000..ad9076e --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/container-grid-col/grid-col-responsive-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/container-grid-col/grid-col-span-editor.vue b/src/components/form-designer/setting-panel/property-editor/container-grid-col/grid-col-span-editor.vue new file mode 100644 index 0000000..a7f0eef --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/container-grid-col/grid-col-span-editor.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/container-grid/colHeight-editor.vue b/src/components/form-designer/setting-panel/property-editor/container-grid/colHeight-editor.vue new file mode 100644 index 0000000..86064f5 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/container-grid/colHeight-editor.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/container-grid/gutter-editor.vue b/src/components/form-designer/setting-panel/property-editor/container-grid/gutter-editor.vue new file mode 100644 index 0000000..0be4106 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/container-grid/gutter-editor.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/container-sub-form/showBlankRow-editor.vue b/src/components/form-designer/setting-panel/property-editor/container-sub-form/showBlankRow-editor.vue new file mode 100644 index 0000000..32dabd0 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/container-sub-form/showBlankRow-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/container-sub-form/showRowNumber-editor.vue b/src/components/form-designer/setting-panel/property-editor/container-sub-form/showRowNumber-editor.vue new file mode 100644 index 0000000..c69b365 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/container-sub-form/showRowNumber-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/container-sub-form/sub-form-labelAlign-editor.vue b/src/components/form-designer/setting-panel/property-editor/container-sub-form/sub-form-labelAlign-editor.vue new file mode 100644 index 0000000..4157e4c --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/container-sub-form/sub-form-labelAlign-editor.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/container-tab/tab-customClass-editor.vue b/src/components/form-designer/setting-panel/property-editor/container-tab/tab-customClass-editor.vue new file mode 100644 index 0000000..e971bca --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/container-tab/tab-customClass-editor.vue @@ -0,0 +1,121 @@ + + + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/container-table-cell/cellHeight-editor.vue b/src/components/form-designer/setting-panel/property-editor/container-table-cell/cellHeight-editor.vue new file mode 100644 index 0000000..0fab2bf --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/container-table-cell/cellHeight-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/container-table-cell/cellWidth-editor.vue b/src/components/form-designer/setting-panel/property-editor/container-table-cell/cellWidth-editor.vue new file mode 100644 index 0000000..f2fad36 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/container-table-cell/cellWidth-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/customClass-editor.vue b/src/components/form-designer/setting-panel/property-editor/customClass-editor.vue new file mode 100644 index 0000000..d0042a7 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/customClass-editor.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/defaultValue-editor.vue b/src/components/form-designer/setting-panel/property-editor/defaultValue-editor.vue new file mode 100644 index 0000000..2ccda17 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/defaultValue-editor.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/disabled-editor.vue b/src/components/form-designer/setting-panel/property-editor/disabled-editor.vue new file mode 100644 index 0000000..a25eaca --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/disabled-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/displayStyle-editor.vue b/src/components/form-designer/setting-panel/property-editor/displayStyle-editor.vue new file mode 100644 index 0000000..fef5866 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/displayStyle-editor.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/editable-editor.vue b/src/components/form-designer/setting-panel/property-editor/editable-editor.vue new file mode 100644 index 0000000..3f734c5 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/editable-editor.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/endPlaceholder-editor.vue b/src/components/form-designer/setting-panel/property-editor/endPlaceholder-editor.vue new file mode 100644 index 0000000..bfb6a50 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/endPlaceholder-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/event-handler/eventMixin.js b/src/components/form-designer/setting-panel/property-editor/event-handler/eventMixin.js new file mode 100644 index 0000000..8792dd1 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/event-handler/eventMixin.js @@ -0,0 +1,12 @@ +import emitter from '@/utils/emitter' + +export default { + mixins: [emitter], + created() {}, + methods: { + editEventHandler(eventName, eventParams) { + this.dispatch('SettingPanel', 'editEventHandler', [eventName, [...eventParams]]) + }, + + } +} diff --git a/src/components/form-designer/setting-panel/property-editor/event-handler/onBeforeUpload-editor.vue b/src/components/form-designer/setting-panel/property-editor/event-handler/onBeforeUpload-editor.vue new file mode 100644 index 0000000..e4355dd --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/event-handler/onBeforeUpload-editor.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/event-handler/onBlur-editor.vue b/src/components/form-designer/setting-panel/property-editor/event-handler/onBlur-editor.vue new file mode 100644 index 0000000..393f7e6 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/event-handler/onBlur-editor.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/event-handler/onChange-editor.vue b/src/components/form-designer/setting-panel/property-editor/event-handler/onChange-editor.vue new file mode 100644 index 0000000..8010610 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/event-handler/onChange-editor.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/event-handler/onClick-editor.vue b/src/components/form-designer/setting-panel/property-editor/event-handler/onClick-editor.vue new file mode 100644 index 0000000..c154bcf --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/event-handler/onClick-editor.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/event-handler/onCreated-editor.vue b/src/components/form-designer/setting-panel/property-editor/event-handler/onCreated-editor.vue new file mode 100644 index 0000000..afc1e8c --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/event-handler/onCreated-editor.vue @@ -0,0 +1,31 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/event-handler/onFocus-editor.vue b/src/components/form-designer/setting-panel/property-editor/event-handler/onFocus-editor.vue new file mode 100644 index 0000000..1c24dad --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/event-handler/onFocus-editor.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/event-handler/onInput-editor.vue b/src/components/form-designer/setting-panel/property-editor/event-handler/onInput-editor.vue new file mode 100644 index 0000000..35d4982 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/event-handler/onInput-editor.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/event-handler/onMounted-editor.vue b/src/components/form-designer/setting-panel/property-editor/event-handler/onMounted-editor.vue new file mode 100644 index 0000000..bbb8bc6 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/event-handler/onMounted-editor.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/event-handler/onRemoteQuery-editor.vue b/src/components/form-designer/setting-panel/property-editor/event-handler/onRemoteQuery-editor.vue new file mode 100644 index 0000000..5275c61 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/event-handler/onRemoteQuery-editor.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/event-handler/onSubFormRowAdd-editor.vue b/src/components/form-designer/setting-panel/property-editor/event-handler/onSubFormRowAdd-editor.vue new file mode 100644 index 0000000..26abcfe --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/event-handler/onSubFormRowAdd-editor.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/event-handler/onSubFormRowChange-editor.vue b/src/components/form-designer/setting-panel/property-editor/event-handler/onSubFormRowChange-editor.vue new file mode 100644 index 0000000..254638a --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/event-handler/onSubFormRowChange-editor.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/event-handler/onSubFormRowDelete-editor.vue b/src/components/form-designer/setting-panel/property-editor/event-handler/onSubFormRowDelete-editor.vue new file mode 100644 index 0000000..8666b9e --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/event-handler/onSubFormRowDelete-editor.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/event-handler/onSubFormRowInsert-editor.vue b/src/components/form-designer/setting-panel/property-editor/event-handler/onSubFormRowInsert-editor.vue new file mode 100644 index 0000000..ed71c3d --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/event-handler/onSubFormRowInsert-editor.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/event-handler/onUploadError-editor.vue b/src/components/form-designer/setting-panel/property-editor/event-handler/onUploadError-editor.vue new file mode 100644 index 0000000..7562f96 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/event-handler/onUploadError-editor.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/event-handler/onUploadSuccess-editor.vue b/src/components/form-designer/setting-panel/property-editor/event-handler/onUploadSuccess-editor.vue new file mode 100644 index 0000000..925f791 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/event-handler/onUploadSuccess-editor.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/event-handler/onValidate-editor.vue b/src/components/form-designer/setting-panel/property-editor/event-handler/onValidate-editor.vue new file mode 100644 index 0000000..44cc2a1 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/event-handler/onValidate-editor.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-button/button-type-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-button/button-type-editor.vue new file mode 100644 index 0000000..4bb13de --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-button/button-type-editor.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-button/circle-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-button/circle-editor.vue new file mode 100644 index 0000000..88522d5 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-button/circle-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-button/icon-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-button/icon-editor.vue new file mode 100644 index 0000000..177ce68 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-button/icon-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-button/plain-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-button/plain-editor.vue new file mode 100644 index 0000000..ed25895 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-button/plain-editor.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-button/round-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-button/round-editor.vue new file mode 100644 index 0000000..8bde2a1 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-button/round-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-color/color-defaultValue-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-color/color-defaultValue-editor.vue new file mode 100644 index 0000000..186e558 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-color/color-defaultValue-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-date-range/date-range-defaultValue-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-date-range/date-range-defaultValue-editor.vue new file mode 100644 index 0000000..0bb78d8 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-date-range/date-range-defaultValue-editor.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-date-range/date-range-format-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-date-range/date-range-format-editor.vue new file mode 100644 index 0000000..35a0353 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-date-range/date-range-format-editor.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-date-range/date-range-type-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-date-range/date-range-type-editor.vue new file mode 100644 index 0000000..e31e968 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-date-range/date-range-type-editor.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-date-range/date-range-valueFormat-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-date-range/date-range-valueFormat-editor.vue new file mode 100644 index 0000000..bdca28c --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-date-range/date-range-valueFormat-editor.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-date/date-defaultValue-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-date/date-defaultValue-editor.vue new file mode 100644 index 0000000..30d7de3 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-date/date-defaultValue-editor.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-date/date-format-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-date/date-format-editor.vue new file mode 100644 index 0000000..0a28e69 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-date/date-format-editor.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-date/date-type-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-date/date-type-editor.vue new file mode 100644 index 0000000..2dcb301 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-date/date-type-editor.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-date/date-valueFormat-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-date/date-valueFormat-editor.vue new file mode 100644 index 0000000..ae5c6f6 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-date/date-valueFormat-editor.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-divider/contentPosition-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-divider/contentPosition-editor.vue new file mode 100644 index 0000000..ca21786 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-divider/contentPosition-editor.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-file-upload/file-upload-fileTypes-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-file-upload/file-upload-fileTypes-editor.vue new file mode 100644 index 0000000..6dee2ac --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-file-upload/file-upload-fileTypes-editor.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-html-text/htmlContent-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-html-text/htmlContent-editor.vue new file mode 100644 index 0000000..6f9a893 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-html-text/htmlContent-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-number/controlsPosition-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-number/controlsPosition-editor.vue new file mode 100644 index 0000000..6cc39e5 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-number/controlsPosition-editor.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-picture-upload/picture-upload-fileTypes-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-picture-upload/picture-upload-fileTypes-editor.vue new file mode 100644 index 0000000..8900dda --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-picture-upload/picture-upload-fileTypes-editor.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-rate/allowHalf-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-rate/allowHalf-editor.vue new file mode 100644 index 0000000..fd80e44 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-rate/allowHalf-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-rate/highThreshold-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-rate/highThreshold-editor.vue new file mode 100644 index 0000000..c5fe412 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-rate/highThreshold-editor.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-rate/lowThreshold-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-rate/lowThreshold-editor.vue new file mode 100644 index 0000000..00464b2 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-rate/lowThreshold-editor.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-rate/rate-defaultValue-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-rate/rate-defaultValue-editor.vue new file mode 100644 index 0000000..d4dd66b --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-rate/rate-defaultValue-editor.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-rate/rate-max-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-rate/rate-max-editor.vue new file mode 100644 index 0000000..a43c192 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-rate/rate-max-editor.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-rate/showScore-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-rate/showScore-editor.vue new file mode 100644 index 0000000..6be1b18 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-rate/showScore-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-rate/showText-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-rate/showText-editor.vue new file mode 100644 index 0000000..76fa1a8 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-rate/showText-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-slider/range-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-slider/range-editor.vue new file mode 100644 index 0000000..3a431b5 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-slider/range-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-slider/showStops-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-slider/showStops-editor.vue new file mode 100644 index 0000000..e6a4edd --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-slider/showStops-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-slider/vertical-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-slider/vertical-editor.vue new file mode 100644 index 0000000..e5f0a19 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-slider/vertical-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-static-text/textContent-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-static-text/textContent-editor.vue new file mode 100644 index 0000000..1056131 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-static-text/textContent-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-switch/activeColor-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-switch/activeColor-editor.vue new file mode 100644 index 0000000..641bc94 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-switch/activeColor-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-switch/activeText-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-switch/activeText-editor.vue new file mode 100644 index 0000000..5c77879 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-switch/activeText-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-switch/inactiveColor-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-switch/inactiveColor-editor.vue new file mode 100644 index 0000000..dd4cb5c --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-switch/inactiveColor-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-switch/inactiveText-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-switch/inactiveText-editor.vue new file mode 100644 index 0000000..c37698a --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-switch/inactiveText-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-switch/switch-defaultValue-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-switch/switch-defaultValue-editor.vue new file mode 100644 index 0000000..08012b6 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-switch/switch-defaultValue-editor.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-switch/switchWidth-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-switch/switchWidth-editor.vue new file mode 100644 index 0000000..969f1c9 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-switch/switchWidth-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-time-range/time-range-defaultValue-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-time-range/time-range-defaultValue-editor.vue new file mode 100644 index 0000000..fbb04a4 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-time-range/time-range-defaultValue-editor.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-time-range/time-range-format-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-time-range/time-range-format-editor.vue new file mode 100644 index 0000000..d461dcc --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-time-range/time-range-format-editor.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-time/time-defaultValue-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-time/time-defaultValue-editor.vue new file mode 100644 index 0000000..d619b88 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-time/time-defaultValue-editor.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/field-time/time-format-editor.vue b/src/components/form-designer/setting-panel/property-editor/field-time/time-format-editor.vue new file mode 100644 index 0000000..6ffe0bc --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/field-time/time-format-editor.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/fileMaxSize-editor.vue b/src/components/form-designer/setting-panel/property-editor/fileMaxSize-editor.vue new file mode 100644 index 0000000..52df908 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/fileMaxSize-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/filterable-editor.vue b/src/components/form-designer/setting-panel/property-editor/filterable-editor.vue new file mode 100644 index 0000000..b0f9b58 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/filterable-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/hidden-editor.vue b/src/components/form-designer/setting-panel/property-editor/hidden-editor.vue new file mode 100644 index 0000000..53eb456 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/hidden-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/index.js b/src/components/form-designer/setting-panel/property-editor/index.js new file mode 100644 index 0000000..9ff684a --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/index.js @@ -0,0 +1,9 @@ +let comps = {} + +const modules = import.meta.globEager('./**/*.vue') +for (const path in modules) { + let cname = modules[path].default.name + comps[cname] = modules[path].default +} + +export default comps diff --git a/src/components/form-designer/setting-panel/property-editor/label-editor.vue b/src/components/form-designer/setting-panel/property-editor/label-editor.vue new file mode 100644 index 0000000..cfa112e --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/label-editor.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/labelAlign-editor.vue b/src/components/form-designer/setting-panel/property-editor/labelAlign-editor.vue new file mode 100644 index 0000000..136f26f --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/labelAlign-editor.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/labelHidden-editor.vue b/src/components/form-designer/setting-panel/property-editor/labelHidden-editor.vue new file mode 100644 index 0000000..5225a1b --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/labelHidden-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/labelIconClass-editor.vue b/src/components/form-designer/setting-panel/property-editor/labelIconClass-editor.vue new file mode 100644 index 0000000..5e32f65 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/labelIconClass-editor.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/labelIconPosition-editor.vue b/src/components/form-designer/setting-panel/property-editor/labelIconPosition-editor.vue new file mode 100644 index 0000000..805c793 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/labelIconPosition-editor.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/labelTooltip-editor.vue b/src/components/form-designer/setting-panel/property-editor/labelTooltip-editor.vue new file mode 100644 index 0000000..3ee1308 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/labelTooltip-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/labelWidth-editor.vue b/src/components/form-designer/setting-panel/property-editor/labelWidth-editor.vue new file mode 100644 index 0000000..a7c41bc --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/labelWidth-editor.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/limit-editor.vue b/src/components/form-designer/setting-panel/property-editor/limit-editor.vue new file mode 100644 index 0000000..b9a64f2 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/limit-editor.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/max-editor.vue b/src/components/form-designer/setting-panel/property-editor/max-editor.vue new file mode 100644 index 0000000..ab5f320 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/max-editor.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/maxLength-editor.vue b/src/components/form-designer/setting-panel/property-editor/maxLength-editor.vue new file mode 100644 index 0000000..4c8e258 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/maxLength-editor.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/min-editor.vue b/src/components/form-designer/setting-panel/property-editor/min-editor.vue new file mode 100644 index 0000000..513fd24 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/min-editor.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/minLength-editor.vue b/src/components/form-designer/setting-panel/property-editor/minLength-editor.vue new file mode 100644 index 0000000..719a60d --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/minLength-editor.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/multiple-editor.vue b/src/components/form-designer/setting-panel/property-editor/multiple-editor.vue new file mode 100644 index 0000000..48fde31 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/multiple-editor.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/multipleLimit-editor.vue b/src/components/form-designer/setting-panel/property-editor/multipleLimit-editor.vue new file mode 100644 index 0000000..3fae0c7 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/multipleLimit-editor.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/multipleSelect-editor.vue b/src/components/form-designer/setting-panel/property-editor/multipleSelect-editor.vue new file mode 100644 index 0000000..0d2b7fc --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/multipleSelect-editor.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/name-editor.vue b/src/components/form-designer/setting-panel/property-editor/name-editor.vue new file mode 100644 index 0000000..c0a8706 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/name-editor.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/optionItems-editor.vue b/src/components/form-designer/setting-panel/property-editor/optionItems-editor.vue new file mode 100644 index 0000000..d911453 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/optionItems-editor.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/placeholder-editor.vue b/src/components/form-designer/setting-panel/property-editor/placeholder-editor.vue new file mode 100644 index 0000000..e44ff8e --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/placeholder-editor.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/precision-editor.vue b/src/components/form-designer/setting-panel/property-editor/precision-editor.vue new file mode 100644 index 0000000..4e64878 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/precision-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/prefixIcon-editor.vue b/src/components/form-designer/setting-panel/property-editor/prefixIcon-editor.vue new file mode 100644 index 0000000..361ff3a --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/prefixIcon-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/propertyMixin.js b/src/components/form-designer/setting-panel/property-editor/propertyMixin.js new file mode 100644 index 0000000..2ef6a42 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/propertyMixin.js @@ -0,0 +1,47 @@ +export default { + methods: { + hasConfig(configName) { + if (!this.designer || !this.designer.selectedWidget) { + return false + } + + return this.designer.hasConfig(this.selectedWidget, configName) + }, + + emitDefaultValueChange() { + if (!!this.designer) { + if (!!this.designer.formWidget) { + let fieldWidget = this.designer.formWidget.getWidgetRef(this.designer.selectedWidget.options.name) + if (!!fieldWidget && !!fieldWidget.refreshDefaultValue) { + fieldWidget.refreshDefaultValue() + } + } + } + }, + + inputNumberHandler({target}) { + target.value = target.value.replace(/[^0-9]/gi, '') + }, + + onRemoteChange(val) { + if (!!val) { + this.optionModel.filterable = true + this.optionModel.allowCreate = false + } + }, + + onMultipleSelected(val) { + if (val) { + this.optionModel.defaultValue = [] //清空原默认值!! + } else { + if (!!this.optionModel.defaultValue && (this.optionModel.defaultValue.length > 0)) { + this.optionModel.defaultValue = this.optionModel.defaultValue[0] + } else { + this.optionModel.defaultValue = '' + } + } + }, + + + } +} diff --git a/src/components/form-designer/setting-panel/property-editor/readonly-editor.vue b/src/components/form-designer/setting-panel/property-editor/readonly-editor.vue new file mode 100644 index 0000000..7ff8bfd --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/readonly-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/remote-editor.vue b/src/components/form-designer/setting-panel/property-editor/remote-editor.vue new file mode 100644 index 0000000..2cf2582 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/remote-editor.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/required-editor.vue b/src/components/form-designer/setting-panel/property-editor/required-editor.vue new file mode 100644 index 0000000..6684f39 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/required-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/rows-editor.vue b/src/components/form-designer/setting-panel/property-editor/rows-editor.vue new file mode 100644 index 0000000..dafd688 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/rows-editor.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/showFileList-editor.vue b/src/components/form-designer/setting-panel/property-editor/showFileList-editor.vue new file mode 100644 index 0000000..597e1da --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/showFileList-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/showPassword-editor.vue b/src/components/form-designer/setting-panel/property-editor/showPassword-editor.vue new file mode 100644 index 0000000..38c722f --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/showPassword-editor.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/showWordLimit-editor.vue b/src/components/form-designer/setting-panel/property-editor/showWordLimit-editor.vue new file mode 100644 index 0000000..478f349 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/showWordLimit-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/size-editor.vue b/src/components/form-designer/setting-panel/property-editor/size-editor.vue new file mode 100644 index 0000000..671ceb5 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/size-editor.vue @@ -0,0 +1,38 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/startPlaceholder-editor.vue b/src/components/form-designer/setting-panel/property-editor/startPlaceholder-editor.vue new file mode 100644 index 0000000..c1832a8 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/startPlaceholder-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/step-editor.vue b/src/components/form-designer/setting-panel/property-editor/step-editor.vue new file mode 100644 index 0000000..ac64aff --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/step-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/suffixIcon-editor.vue b/src/components/form-designer/setting-panel/property-editor/suffixIcon-editor.vue new file mode 100644 index 0000000..6f45b71 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/suffixIcon-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/type-editor.vue b/src/components/form-designer/setting-panel/property-editor/type-editor.vue new file mode 100644 index 0000000..7f4ee50 --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/type-editor.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/uploadTip-editor.vue b/src/components/form-designer/setting-panel/property-editor/uploadTip-editor.vue new file mode 100644 index 0000000..f58b6fd --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/uploadTip-editor.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/uploadURL-editor.vue b/src/components/form-designer/setting-panel/property-editor/uploadURL-editor.vue new file mode 100644 index 0000000..6b651ae --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/uploadURL-editor.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/validation-editor.vue b/src/components/form-designer/setting-panel/property-editor/validation-editor.vue new file mode 100644 index 0000000..4f61d0a --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/validation-editor.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/validationHint-editor.vue b/src/components/form-designer/setting-panel/property-editor/validationHint-editor.vue new file mode 100644 index 0000000..006696e --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/validationHint-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/property-editor/withCredentials-editor.vue b/src/components/form-designer/setting-panel/property-editor/withCredentials-editor.vue new file mode 100644 index 0000000..39b35eb --- /dev/null +++ b/src/components/form-designer/setting-panel/property-editor/withCredentials-editor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/form-designer/setting-panel/propertyRegister.js b/src/components/form-designer/setting-panel/propertyRegister.js new file mode 100644 index 0000000..c22438e --- /dev/null +++ b/src/components/form-designer/setting-panel/propertyRegister.js @@ -0,0 +1,201 @@ +//import { vfApp } from '@/utils/create-app' + +/** + * 格式说明:属性名称==对应属性编辑器的组件名称 + */ +const COMMON_PROPERTIES = { + //字段 + 'name' : 'name-editor', + 'label' : 'label-editor', + 'labelAlign' : 'labelAlign-editor', + 'type' : 'type-editor', + 'defaultValue' : 'defaultValue-editor', + 'placeholder' : 'placeholder-editor', + 'startPlaceholder' : 'startPlaceholder-editor', + 'endPlaceholder' : 'endPlaceholder-editor', + 'columnWidth' : 'columnWidth-editor', + 'size' : 'size-editor', + 'showStops' : 'showStops-editor', + 'displayStyle' : 'displayStyle-editor', + 'buttonStyle' : 'buttonStyle-editor', + 'border' : 'border-editor', + 'labelWidth' : 'labelWidth-editor', + 'labelHidden' : 'labelHidden-editor', + 'rows' : 'rows-editor', + 'required' : 'required-editor', + 'validation' : 'validation-editor', + 'validationHint' : 'validationHint-editor', + 'readonly' : 'readonly-editor', + 'disabled' : 'disabled-editor', + 'hidden' : 'hidden-editor', + 'clearable' : 'clearable-editor', + 'editable' : 'editable-editor', + 'showPassword' : 'showPassword-editor', + 'textContent' : 'textContent-editor', + 'htmlContent' : 'htmlContent-editor', + 'format' : 'format-editor', + 'valueFormat' : 'valueFormat-editor', + 'filterable' : 'filterable-editor', + 'allowCreate' : 'allowCreate-editor', + 'remote' : 'remote-editor', + 'automaticDropdown' : 'automaticDropdown-editor', + 'multiple' : 'multiple-editor', + 'multipleLimit' : 'multipleLimit-editor', + 'contentPosition' : 'contentPosition-editor', + 'optionItems' : 'optionItems-editor', + 'uploadURL' : 'uploadURL-editor', + 'uploadTip' : 'uploadTip-editor', + 'withCredentials' : 'withCredentials-editor', + 'multipleSelect' : 'multipleSelect-editor', + 'limit' : 'limit-editor', + 'fileMaxSize' : 'fileMaxSize-editor', + 'fileTypes' : 'fileTypes-editor', + 'customClass' : 'customClass-editor', + + //容器 + 'showBlankRow' : 'showBlankRow-editor', + 'showRowNumber' : 'showRowNumber-editor', + 'cellWidth' : 'cellWidth-editor', + 'cellHeight' : 'cellHeight-editor', + 'colHeight' : 'colHeight-editor', + 'gutter' : 'gutter-editor', + 'responsive' : 'responsive-editor', + 'span' : 'span-editor', + 'offset' : 'offset-editor', + 'push' : 'push-editor', + 'pull' : 'pull-editor', + +} + +const ADVANCED_PROPERTIES = { + 'min' : 'min-editor', + 'max' : 'max-editor', + 'precision' : 'precision-editor', + 'step' : 'step-editor', + 'controlsPosition' : 'controlsPosition-editor', + 'minLength' : 'minLength-editor', + 'maxLength' : 'maxLength-editor', + 'showWordLimit' : 'showWordLimit-editor', + 'prefixIcon' : 'prefixIcon-editor', + 'suffixIcon' : 'suffixIcon-editor', + 'switchWidth' : 'switchWidth-editor', + 'activeText' : 'activeText-editor', + 'inactiveText' : 'inactiveText-editor', + 'activeColor' : 'activeColor-editor', + 'inactiveColor' : 'inactiveColor-editor', + 'lowThreshold' : 'lowThreshold-editor', + 'highThreshold' : 'highThreshold-editor', + 'allowHalf' : 'allowHalf-editor', + 'showText' : 'showText-editor', + 'showScore' : 'showScore-editor', + 'range' : 'range-editor', + 'vertical' : 'vertical-editor', + 'plain' : 'plain-editor', + 'round' : 'round-editor', + 'circle' : 'circle-editor', + 'icon' : 'icon-editor', + 'labelIconClass' : 'labelIconClass-editor', + 'labelIconPosition' : 'labelIconPosition-editor', + 'labelTooltip' : 'labelTooltip-editor', + 'appendButton' : 'appendButton-editor', + 'appendButtonDisabled': 'appendButtonDisabled-editor', + 'buttonIcon' : 'buttonIcon-editor', + +} + +const EVENT_PROPERTIES = { + //字段 + 'onCreated' : 'onCreated-editor', + 'onMounted' : 'onMounted-editor', + 'onClick' : 'onClick-editor', + 'onInput' : 'onInput-editor', + 'onChange' : 'onChange-editor', + 'onFocus' : 'onFocus-editor', + 'onBlur' : 'onBlur-editor', + 'onRemoteQuery' : 'onRemoteQuery-editor', + 'onBeforeUpload' : 'onBeforeUpload-editor', + 'onUploadSuccess' : 'onUploadSuccess-editor', + 'onUploadError' : 'onUploadError-editor', + 'onValidate' : 'onValidate-editor', + + //容器 + 'onSubFormRowAdd' : 'onSubFormRowAdd-editor', + 'onSubFormRowInsert': 'onSubFormRowInsert-editor', + 'onSubFormRowDelete': 'onSubFormRowDelete-editor', + 'onSubFormRowChange': 'onSubFormRowChange-editor', + +} + +/** + * 注册组件常见属性 + * 如属性编辑器的组件名称propEditorName设置为null,则不显示该属性编辑器!! + * @param uniquePropName 属性名称(保证名称唯一,不跟其他组件属性冲突) + * @param propEditorName 对应属性编辑器的组件名称 + */ +export function registerCommonProperty(uniquePropName, propEditorName) { + COMMON_PROPERTIES[uniquePropName] = propEditorName +} + +/** + * 注册组件高级属性 + * 如属性编辑器的组件名称propEditorName设置为null,则不显示该属性编辑器!! + * @param uniquePropName 属性名称(保证名称唯一,不跟其他组件属性冲突) + * @param propEditorName 对应属性编辑器的组件名称 + */ +export function registerAdvancedProperty(uniquePropName, propEditorName) { + ADVANCED_PROPERTIES[uniquePropName] = propEditorName +} + +/** + * 注册组件事件属性 + * 如属性编辑器的组件名称propEditorName设置为null,则不显示该属性编辑器!! + * @param uniquePropName 属性名称(保证名称唯一,不跟其他组件属性冲突) + * @param propEditorName 对应属性编辑器的组件名称 + */ +export function registerEventProperty(uniquePropName, propEditorName) { + EVENT_PROPERTIES[uniquePropName] = propEditorName +} + +/** + * 注册常见属性对应的属性编辑器 + * @param app + * @param uniquePropName + * @param propEditorName + * @param editorComponent + */ +export function registerCPEditor(app, uniquePropName, propEditorName, editorComponent) { + app.component(propEditorName, editorComponent) + registerCommonProperty(uniquePropName, propEditorName) +} + +/** + * 注册高级属性对应的属性编辑器 + * @param app + * @param uniquePropName + * @param propEditorName + * @param editorComponent + */ +export function registerAPEditor(app, uniquePropName, propEditorName, editorComponent) { + app.component(propEditorName, editorComponent) + registerAdvancedProperty(uniquePropName, propEditorName) +} + +/** + * 注册事件属性对应的属性编辑器 + * @param app + * @param uniquePropName + * @param propEditorName + * @param editorComponent + */ +export function registerEPEditor(app, uniquePropName, propEditorName, editorComponent) { + app.component(propEditorName, editorComponent) + registerEventProperty(uniquePropName, propEditorName) +} + +export default { + COMMON_PROPERTIES, + ADVANCED_PROPERTIES, + EVENT_PROPERTIES +} + + diff --git a/src/components/form-designer/toolbar-panel/index.vue b/src/components/form-designer/toolbar-panel/index.vue new file mode 100644 index 0000000..d13961a --- /dev/null +++ b/src/components/form-designer/toolbar-panel/index.vue @@ -0,0 +1,793 @@ + + + + + diff --git a/src/components/form-designer/widget-panel/index.vue b/src/components/form-designer/widget-panel/index.vue new file mode 100644 index 0000000..5848158 --- /dev/null +++ b/src/components/form-designer/widget-panel/index.vue @@ -0,0 +1,396 @@ + + + + + diff --git a/src/components/form-designer/widget-panel/templatesConfig.js b/src/components/form-designer/widget-panel/templatesConfig.js new file mode 100644 index 0000000..32a1b11 --- /dev/null +++ b/src/components/form-designer/widget-panel/templatesConfig.js @@ -0,0 +1,58 @@ +export const formTemplates = [ + { + title: '单列表单', + //imgUrl: 'https://ks3-cn-beijing.ksyuncs.com/vform-static/form-samples/t1.png', + jsonUrl: 'https://ks3-cn-beijing.ksyuncs.com/vform-static/form-samples/json1.txt', + description: '表单模板详细说明...' + }, + + { + title: '多列表单', + //imgUrl: 'https://ks3-cn-beijing.ksyuncs.com/vform-static/form-samples/t2.png', + jsonUrl: 'https://ks3-cn-beijing.ksyuncs.com/vform-static/form-samples/json2.txt', + description: '表单模板详细说明...' + }, + + { + title: '分组表单', + //imgUrl: 'https://ks3-cn-beijing.ksyuncs.com/vform-static/form-samples/t3.png', + jsonUrl: 'https://ks3-cn-beijing.ksyuncs.com/vform-static/form-samples/json3.txt', + description: '表单模板详细说明...' + }, + + { + title: '标签页表单', + //imgUrl: 'https://ks3-cn-beijing.ksyuncs.com/vform-static/form-samples/t4.png', + jsonUrl: 'https://ks3-cn-beijing.ksyuncs.com/vform-static/form-samples/json4.txt', + description: '表单模板详细说明...' + }, + + { + title: '主从表单', + //imgUrl: 'https://ks3-cn-beijing.ksyuncs.com/vform-static/form-samples/t5.png', + jsonUrl: 'https://ks3-cn-beijing.ksyuncs.com/vform-static/form-samples/json5.txt', + description: '表单模板详细说明...' + }, + + { + title: '响应式表单', + //imgUrl: 'https://ks3-cn-beijing.ksyuncs.com/vform-static/form-samples/t6.png', + jsonUrl: 'https://ks3-cn-beijing.ksyuncs.com/vform-static/form-samples/json6.txt', + description: '表单模板详细说明...' + }, + + { + title: '问卷调查表', + //imgUrl: 'https://ks3-cn-beijing.ksyuncs.com/vform-static/form-samples/t7.png', + jsonUrl: 'https://ks3-cn-beijing.ksyuncs.com/vform-static/form-samples/json7.txt', + description: '表单模板详细说明...' + }, + + { + title: '固定表格表单', + //imgUrl: 'https://ks3-cn-beijing.ksyuncs.com/vform-static/form-samples/t8.png', + jsonUrl: 'https://ks3-cn-beijing.ksyuncs.com/vform-static/form-samples/json8.txt', + description: '表单模板详细说明...' + }, + +] diff --git a/src/components/form-designer/widget-panel/widgetsConfig.js b/src/components/form-designer/widget-panel/widgetsConfig.js new file mode 100644 index 0000000..a5a0820 --- /dev/null +++ b/src/components/form-designer/widget-panel/widgetsConfig.js @@ -0,0 +1,927 @@ + +export const containers = [ + { + type: 'grid', + category: 'container', + icon: 'grid', + cols: [], + options: { + name: '', + hidden: false, + gutter: 12, + colHeight: null, //栅格列统一高度属性,用于解决栅格列设置响应式布局浮动后被挂住的问题!! + customClass: '', //自定义css类名 + } + }, + + { + type: 'table', + category: 'container', + icon: 'table', + rows: [], + options: { + name: '', + hidden: false, + customClass: '', //自定义css类名 + } + }, + + { + type: 'tab', + category: 'container', + icon: 'tab', + displayType: 'border-card', + tabs: [], + options: { + name: '', + hidden: false, + customClass: '', //自定义css类名 + } + }, + + /* + { + type: 'section', + category: 'container', + icon: 'section', + widgetList: [], + options: { + name: '', + hidden: false, + customClass: '', //自定义css类名 + } + }, + */ + + { + type: 'grid-col', + category: 'container', + icon: 'grid-col', + internal: true, + widgetList: [], + options: { + name: '', + hidden: false, + span: 12, + offset: 0, + push: 0, + pull: 0, + responsive: false, //是否开启响应式布局 + md: 12, + sm: 12, + xs: 12, + customClass: '', //自定义css类名 + } + }, + + { + type: 'table-cell', + category: 'container', + icon: 'table-cell', + internal: true, + widgetList: [], + merged: false, + options: { + name: '', + cellWidth: '', + cellHeight: '', + colspan: 1, + rowspan: 1, + customClass: '', //自定义css类名 + } + }, + + { + type: 'tab-pane', + category: 'container', + icon: 'tab-pane', + internal: true, + widgetList: [], + options: { + name: '', + label: '', + hidden: false, + active: false, + disabled: false, + customClass: '', //自定义css类名 + } + }, + + +] + +export const basicFields = [ + { + type: 'input', + icon: 'text-field', + formItemFlag: true, + options: { + name: '', + label: '', + labelAlign: '', + type: 'text', + defaultValue: '', + placeholder: '', + columnWidth: '200px', + size: '', + labelWidth: null, + labelHidden: false, + readonly: false, + disabled: false, + hidden: false, + clearable: true, + showPassword: false, + required: false, + validation: '', + validationHint: '', + //------------------- + customClass: '', //自定义css类名 + labelIconClass: null, + labelIconPosition: 'rear', + labelTooltip: null, + minLength: null, + maxLength: null, + showWordLimit: false, + prefixIcon: '', + suffixIcon: '', + appendButton: false, + appendButtonDisabled: false, + buttonIcon: 'el-icon-search', + //------------------- + onCreated: '', + onMounted: '', + onInput: '', + onChange: '', + onFocus: '', + onBlur: '', + onValidate: '', + }, + }, + + { + type: 'textarea', + icon: 'textarea-field', + formItemFlag: true, + options: { + name: '', + label: '', + labelAlign: '', + rows: 3, + defaultValue: '', + placeholder: '', + columnWidth: '200px', + size: '', + labelWidth: null, + labelHidden: false, + readonly: false, + disabled: false, + hidden: false, + required: false, + validation: '', + validationHint: '', + //------------------- + customClass: '', //自定义css类名 + labelIconClass: null, + labelIconPosition: 'rear', + labelTooltip: null, + minLength: null, + maxLength: null, + showWordLimit: false, + //------------------- + onCreated: '', + onMounted: '', + onInput: '', + onChange: '', + onFocus: '', + onBlur: '', + onValidate: '', + }, + }, + + { + type: 'number', + icon: 'number-field', + formItemFlag: true, + options: { + name: '', + label: '', + labelAlign: '', + defaultValue: 0, + placeholder: '', + columnWidth: '200px', + size: '', + labelWidth: null, + labelHidden: false, + disabled: false, + hidden: false, + required: false, + validation: '', + validationHint: '', + //------------------- + customClass: '', //自定义css类名 + labelIconClass: null, + labelIconPosition: 'rear', + labelTooltip: null, + min: -100000000000, + max: 100000000000, + precision: 0, + step: 1, + controlsPosition: 'right', + //------------------- + onCreated: '', + onMounted: '', + onChange: '', + onFocus: '', + onBlur: '', + onValidate: '', + }, + }, + + { + type: 'radio', + icon: 'radio-field', + formItemFlag: true, + options: { + name: '', + label: '', + labelAlign: '', + defaultValue: null, + columnWidth: '200px', + size: '', + displayStyle: 'inline', + buttonStyle: false, + border: false, + labelWidth: null, + labelHidden: false, + disabled: false, + hidden: false, + optionItems: [ + {label: 'radio 1', value: 1}, + {label: 'radio 2', value: 2}, + {label: 'radio 3', value: 3}, + ], + required: false, + validation: '', + validationHint: '', + //------------------- + customClass: '', //自定义css类名 + labelIconClass: null, + labelIconPosition: 'rear', + labelTooltip: null, + //------------------- + onCreated: '', + onMounted: '', + onChange: '', + onValidate: '', + }, + }, + + { + type: 'checkbox', + icon: 'checkbox-field', + formItemFlag: true, + options: { + name: '', + label: '', + labelAlign: '', + defaultValue: [], + columnWidth: '200px', + size: '', + displayStyle: 'inline', + buttonStyle: false, + border: false, + labelWidth: null, + labelHidden: false, + disabled: false, + hidden: false, + optionItems: [ + {label: 'check 1', value: 1}, + {label: 'check 2', value: 2}, + {label: 'check 3', value: 3}, + ], + required: false, + validation: '', + validationHint: '', + //------------------- + customClass: '', //自定义css类名 + labelIconClass: null, + labelIconPosition: 'rear', + labelTooltip: null, + //------------------- + onCreated: '', + onMounted: '', + onChange: '', + onValidate: '', + }, + }, + + { + type: 'select', + icon: 'select-field', + formItemFlag: true, + options: { + name: '', + label: '', + labelAlign: '', + defaultValue: '', + placeholder: '', + columnWidth: '200px', + size: '', + labelWidth: null, + labelHidden: false, + disabled: false, + hidden: false, + clearable: true, + filterable: false, + allowCreate: false, + remote: false, + automaticDropdown: false, //自动下拉 + multiple: false, + multipleLimit: 0, + optionItems: [ + {label: 'select 1', value: 1}, + {label: 'select 2', value: 2}, + {label: 'select 3', value: 3}, + ], + required: false, + validation: '', + validationHint: '', + //------------------- + customClass: '', //自定义css类名 + labelIconClass: null, + labelIconPosition: 'rear', + labelTooltip: null, + //------------------- + onCreated: '', + onMounted: '', + onRemoteQuery: '', + onChange: '', + onFocus: '', + onBlur: '', + onValidate: '', + }, + }, + + { + type: 'time', + icon: 'time-field', + formItemFlag: true, + options: { + name: '', + label: '', + labelAlign: '', + defaultValue: null, + placeholder: '', + columnWidth: '200px', + size: '', + labelWidth: null, + labelHidden: false, + readonly: false, + disabled: false, + hidden: false, + clearable: true, + editable: false, + format: 'HH:mm:ss', //时间格式 + required: false, + validation: '', + validationHint: '', + //------------------- + customClass: '', //自定义css类名 + labelIconClass: null, + labelIconPosition: 'rear', + labelTooltip: null, + //------------------- + onCreated: '', + onMounted: '', + onChange: '', + onFocus: '', + onBlur: '', + onValidate: '', + }, + }, + + { + type: 'time-range', + icon: 'time-range-field', + formItemFlag: true, + options: { + name: '', + label: '', + labelAlign: '', + defaultValue: null, + startPlaceholder: '', + endPlaceholder: '', + columnWidth: '200px', + size: '', + labelWidth: null, + labelHidden: false, + readonly: false, + disabled: false, + hidden: false, + clearable: true, + editable: false, + format: 'HH:mm:ss', //时间格式 + required: false, + validation: '', + validationHint: '', + //------------------- + customClass: '', //自定义css类名 + labelIconClass: null, + labelIconPosition: 'rear', + labelTooltip: null, + //------------------- + onCreated: '', + onMounted: '', + onChange: '', + onFocus: '', + onBlur: '', + onValidate: '', + }, + }, + + { + type: 'date', + icon: 'date-field', + formItemFlag: true, + options: { + name: '', + label: '', + labelAlign: '', + type: 'date', + defaultValue: null, + placeholder: '', + columnWidth: '200px', + size: '', + labelWidth: null, + labelHidden: false, + readonly: false, + disabled: false, + hidden: false, + clearable: true, + editable: false, + format: 'yyyy-MM-dd', //日期显示格式 + valueFormat: 'yyyy-MM-dd', //日期对象格式 + required: false, + validation: '', + validationHint: '', + //------------------- + customClass: '', //自定义css类名 + labelIconClass: null, + labelIconPosition: 'rear', + labelTooltip: null, + //------------------- + onCreated: '', + onMounted: '', + onChange: '', + onFocus: '', + onBlur: '', + onValidate: '', + }, + }, + + { + type: 'date-range', + icon: 'date-range-field', + formItemFlag: true, + options: { + name: '', + label: '', + labelAlign: '', + type: 'daterange', + defaultValue: null, + startPlaceholder: '', + endPlaceholder: '', + columnWidth: '200px', + size: '', + labelWidth: null, + labelHidden: false, + readonly: false, + disabled: false, + hidden: false, + clearable: true, + editable: false, + format: 'yyyy-MM-dd', //日期显示格式 + valueFormat: 'yyyy-MM-dd', //日期对象格式 + required: false, + validation: '', + validationHint: '', + //------------------- + customClass: '', //自定义css类名 + labelIconClass: null, + labelIconPosition: 'rear', + labelTooltip: null, + //------------------- + onCreated: '', + onMounted: '', + onChange: '', + onFocus: '', + onBlur: '', + onValidate: '', + }, + }, + + { + type: 'switch', + icon: 'switch-field', + formItemFlag: true, + options: { + name: '', + label: '', + labelAlign: '', + defaultValue: null, + columnWidth: '200px', + labelWidth: null, + labelHidden: false, + disabled: false, + hidden: false, + //------------------- + customClass: '', //自定义css类名 + labelIconClass: null, + labelIconPosition: 'rear', + labelTooltip: null, + switchWidth: 40, + activeText: '', + inactiveText: '', + activeColor: null, + inactiveColor: null, + //------------------- + onCreated: '', + onMounted: '', + onChange: '', + onValidate: '', + }, + }, + + { + type: 'rate', + icon: 'rate-field', + formItemFlag: true, + options: { + name: '', + label: '', + labelAlign: '', + defaultValue: null, + columnWidth: '200px', + labelWidth: null, + labelHidden: false, + disabled: false, + hidden: false, + required: false, + validation: '', + validationHint: '', + //------------------- + customClass: '', //自定义css类名 + labelIconClass: null, + labelIconPosition: 'rear', + labelTooltip: null, + max: 5, + lowThreshold: 2, + highThreshold: 4, + allowHalf: false, + showText: false, + showScore: false, + //------------------- + onCreated: '', + onMounted: '', + onChange: '', + onValidate: '', + }, + }, + + { + type: 'color', + icon: 'color-field', + formItemFlag: true, + options: { + name: '', + label: '', + labelAlign: '', + defaultValue: null, + columnWidth: '200px', + size: '', + labelWidth: null, + labelHidden: false, + disabled: false, + hidden: false, + required: false, + validation: '', + validationHint: '', + //------------------- + customClass: '', //自定义css类名 + labelIconClass: null, + labelIconPosition: 'rear', + labelTooltip: null, + //------------------- + onCreated: '', + onMounted: '', + onChange: '', + onValidate: '', + }, + }, + + { + type: 'slider', + icon: 'slider-field', + formItemFlag: true, + options: { + name: '', + label: '', + labelAlign: '', + columnWidth: '200px', + showStops: true, + size: '', + labelWidth: null, + labelHidden: false, + disabled: false, + hidden: false, + required: false, + validation: '', + validationHint: '', + //------------------- + customClass: '', //自定义css类名 + labelIconClass: null, + labelIconPosition: 'rear', + labelTooltip: null, + min: 0, + max: 100, + step: 10, + range: false, + //vertical: false, + height: null, + //------------------- + onCreated: '', + onMounted: '', + onChange: '', + onValidate: '', + }, + }, + + { + type: 'static-text', + icon: 'static-text', + formItemFlag: false, + options: { + name: '', + columnWidth: '200px', + hidden: false, + textContent: 'static text', + //------------------- + customClass: '', //自定义css类名 + //------------------- + onCreated: '', + onMounted: '', + }, + }, + + { + type: 'html-text', + icon: 'html-text', + formItemFlag: false, + options: { + name: '', + columnWidth: '200px', + hidden: false, + htmlContent: 'html text', + //------------------- + customClass: '', //自定义css类名 + //------------------- + onCreated: '', + onMounted: '', + }, + }, + + { + type: 'button', + icon: 'button', + formItemFlag: false, + options: { + name: '', + label: '', + columnWidth: '200px', + size: '', + disabled: false, + hidden: false, + type: '', + plain: false, + round: false, + circle: false, + icon: null, + //------------------- + customClass: '', //自定义css类名 + //------------------- + onCreated: '', + onMounted: '', + onClick: '', + }, + }, + + { + type: 'divider', + icon: 'divider', + formItemFlag: false, + options: { + name: '', + label: '', + columnWidth: '200px', + direction: 'horizontal', + contentPosition: 'center', + hidden: false, + //------------------- + customClass: '', //自定义css类名 + //------------------- + onCreated: '', + onMounted: '', + }, + }, + + // + +] + +export const advancedFields = [ + { + type: 'picture-upload', + icon: 'picture-upload-field', + formItemFlag: true, + options: { + name: '', + label: '', + labelWidth: null, + labelHidden: false, + disabled: false, + hidden: false, + required: false, + requiredHint: '', + customRule: '', + customRuleHint: '', + //------------------- + uploadURL: '', + uploadTip: '', + withCredentials: false, + multipleSelect: false, + showFileList: true, + limit: 3, + fileMaxSize: 5, //MB + fileTypes: ['jpeg', 'png'], + //headers: [], + //------------------- + customClass: '', //自定义css类名 + labelIconClass: null, + labelIconPosition: 'rear', + labelTooltip: null, + //------------------- + onCreated: '', + onMounted: '', + onBeforeUpload: '', + onUploadSuccess: '', + onUploadError: '', + onValidate: '', + //onFileChange: '', + }, + + }, + + { + type: 'file-upload', + icon: 'file-upload-field', + formItemFlag: true, + options: { + name: '', + label: '', + labelWidth: null, + labelHidden: false, + disabled: false, + hidden: false, + required: false, + requiredHint: '', + customRule: '', + customRuleHint: '', + //------------------- + uploadURL: '', + uploadTip: '', + withCredentials: false, + multipleSelect: false, + showFileList: true, + limit: 3, + fileMaxSize: 5, //MB + fileTypes: ['doc', 'docx', 'xls', 'xlsx'], + //headers: [], + //------------------- + customClass: '', //自定义css类名 + labelIconClass: null, + labelIconPosition: 'rear', + labelTooltip: null, + //------------------- + onCreated: '', + onMounted: '', + onBeforeUpload: '', + onUploadSuccess: '', + onUploadError: '', + onValidate: '', + //onFileChange: '', + }, + }, + + { + type: 'rich-editor', + icon: 'rich-editor-field', + formItemFlag: true, + options: { + name: '', + label: '', + placeholder: '', + labelWidth: null, + labelHidden: false, + disabled: false, + hidden: false, + required: false, + requiredHint: '', + customRule: '', + customRuleHint: '', + //------------------- + customClass: '', //自定义css类名 + labelIconClass: null, + labelIconPosition: 'rear', + labelTooltip: null, + minLength: null, + maxLength: null, + showWordLimit: false, + //------------------- + onCreated: '', + onMounted: '', + onValidate: '', + }, + }, + + { + type: 'cascader', + icon: 'cascader-field', + formItemFlag: true, + options: { + name: '', + label: '', + defaultValue: '', + placeholder: '', + size: '', + labelWidth: null, + labelHidden: false, + disabled: false, + hidden: false, + clearable: true, + filterable: false, + optionItems: [ + {label: 'select 1', value: 1, children: [{label: 'child 1', value: 11}]}, + {label: 'select 2', value: 2}, + {label: 'select 3', value: 3}, + ], + required: false, + requiredHint: '', + customRule: '', + customRuleHint: '', + //------------------- + customClass: '', //自定义css类名 + labelIconClass: null, + labelIconPosition: 'rear', + labelTooltip: null, + //------------------- + onCreated: '', + onMounted: '', + onChange: '', + onFocus: '', + onBlur: '', + onValidate: '', + }, + }, + + // { + // type: 'slot', + // icon: 'slot-field', + // formItemFlag: false, + // options: { + // name: '', + // label: '', + // customClass: '', //自定义css类名 + // } + // }, + +] + +export const customFields = [ + +] + +export function addContainerWidgetSchema(containerSchema) { + containers.push(containerSchema) +} + +export function addBasicFieldSchema(fieldSchema) { + basicFields.push(fieldSchema) +} + +export function addAdvancedFieldSchema(fieldSchema) { + advancedFields.push(fieldSchema) +} + +export function addCustomWidgetSchema(widgetSchema) { + customFields.push(widgetSchema) +} diff --git a/src/components/form-render/container-item/container-item-wrapper.vue b/src/components/form-render/container-item/container-item-wrapper.vue new file mode 100644 index 0000000..f5a9399 --- /dev/null +++ b/src/components/form-render/container-item/container-item-wrapper.vue @@ -0,0 +1,34 @@ + + + + + + + diff --git a/src/components/form-render/container-item/containerItemMixin.js b/src/components/form-render/container-item/containerItemMixin.js new file mode 100644 index 0000000..6b26579 --- /dev/null +++ b/src/components/form-render/container-item/containerItemMixin.js @@ -0,0 +1,141 @@ +import {generateId} from "@/utils/util"; + +export default { + computed: { + customClass() { + return this.widget.options.customClass || '' + }, + + formModel: { + cache: false, + get() { + return this.globalModel.formModel + } + }, + + }, + + methods: { + unregisterFromRefList() { //销毁容器组件时注销组件ref + if ((this.refList !== null) && !!this.widget.options.name) { + let oldRefName = this.widget.options.name + delete this.refList[oldRefName] + } + }, + + //--------------------- 以下为组件支持外部调用的API方法 begin ------------------// + /* 提示:用户可自行扩充这些方法!!! */ + + setHidden(flag) { + this.widget.options.hidden = flag + }, + + activeTab(tabIndex) { //tabIndex从0计数 + if ((tabIndex >= 0) && (tabIndex < this.widget.tabs.length)) { + this.widget.tabs.forEach((tp, idx) => { + tp.options.active = idx === tabIndex + if (idx === tabIndex) { + this.activeTabName = tp.options.name + } + }) + } + }, + + disableTab(tabIndex) { + if ((tabIndex >= 0) && (tabIndex < this.widget.tabs.length)) { + this.widget.tabs[tabIndex].options.disabled = true + } + }, + + enableTab(tabIndex) { + if ((tabIndex >= 0) && (tabIndex < this.widget.tabs.length)) { + this.widget.tabs[tabIndex].options.disabled = false + } + }, + + hideTab(tabIndex) { + if ((tabIndex >= 0) && (tabIndex < this.widget.tabs.length)) { + this.widget.tabs[tabIndex].options.hidden = true + } + }, + + showTab(tabIndex) { + if ((tabIndex >= 0) && (tabIndex < this.widget.tabs.length)) { + this.widget.tabs[tabIndex].options.hidden = false + } + }, + + disableSubFormRow(rowIndex) { + this.widget.widgetList.forEach(subWidget => { + let swRefName = subWidget.options.name + '@row' + this.rowIdData[rowIndex] + let foundSW = this.getWidgetRef(swRefName) + if (!!foundSW) { + foundSW.setDisabled(true) + } + }) + }, + + enableSubFormRow(rowIndex) { + this.widget.widgetList.forEach(subWidget => { + let swRefName = subWidget.options.name + '@row' + this.rowIdData[rowIndex] + let foundSW = this.getWidgetRef(swRefName) + if (!!foundSW) { + foundSW.setDisabled(false) + } + }) + }, + + disableSubForm() { + if (this.rowIdData.length > 0) { + this.rowIdData.forEach((dataRow, rIdx) => { + this.disableSubFormRow(rIdx) + }) + } + + //禁用3个操作按钮 + this.actionDisabled = true + }, + + enableSubForm() { + if (this.rowIdData.length > 0) { + this.rowIdData.forEach((dataRow, rIdx) => { + this.enableSubFormRow(rIdx) + }) + } + + //启用3个操作按钮 + this.actionDisabled = false + }, + + resetSubForm() { //重置subForm数据为空 + if (this.widget.type === 'sub-form') { + let subFormModel = this.formModel[this.widget.options.name] + if (!!subFormModel) { + subFormModel.splice(0, subFormModel.length) + this.rowIdData.splice(0, this.rowIdData.length) + } + } + }, + + getSubFormValues(needValidation = true) { + if (this.widget.type === 'sub-form') { + //TODO: 逐行校验子表单!! + return this.formModel[this.widget.options.name] + } else { + this.$message.error(this.i18nt('render.hint.nonSubFormType')) + } + }, + + // validateField(fieldName) { //逐行校验子表单字段 + // //TODO: + // }, + // + // validateSubForm() { //逐行校验子表单全部字段 + // //TODO: + // }, + + //--------------------- 以上为组件支持外部调用的API方法 end ------------------// + + }, + +} diff --git a/src/components/form-render/container-item/grid-col-item.vue b/src/components/form-render/container-item/grid-col-item.vue new file mode 100644 index 0000000..0ce63ad --- /dev/null +++ b/src/components/form-render/container-item/grid-col-item.vue @@ -0,0 +1,125 @@ + + + + + diff --git a/src/components/form-render/container-item/grid-item.vue b/src/components/form-render/container-item/grid-item.vue new file mode 100644 index 0000000..8968cab --- /dev/null +++ b/src/components/form-render/container-item/grid-item.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/src/components/form-render/container-item/index.js b/src/components/form-render/container-item/index.js new file mode 100644 index 0000000..9609bf5 --- /dev/null +++ b/src/components/form-render/container-item/index.js @@ -0,0 +1,11 @@ + +const modules = import.meta.globEager('./*.vue') + +export default { + install(app) { + for (const path in modules) { + let cname = modules[path].default.name + app.component(cname, modules[path].default) + } + } +} diff --git a/src/components/form-render/container-item/sub-form-item.vue b/src/components/form-render/container-item/sub-form-item.vue new file mode 100644 index 0000000..837d76e --- /dev/null +++ b/src/components/form-render/container-item/sub-form-item.vue @@ -0,0 +1,408 @@ + + + + + diff --git a/src/components/form-render/container-item/tab-item.vue b/src/components/form-render/container-item/tab-item.vue new file mode 100644 index 0000000..207034b --- /dev/null +++ b/src/components/form-render/container-item/tab-item.vue @@ -0,0 +1,99 @@ + + + + + diff --git a/src/components/form-render/container-item/table-cell-item.vue b/src/components/form-render/container-item/table-cell-item.vue new file mode 100644 index 0000000..ec76568 --- /dev/null +++ b/src/components/form-render/container-item/table-cell-item.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/src/components/form-render/container-item/table-item.vue b/src/components/form-render/container-item/table-item.vue new file mode 100644 index 0000000..0f45831 --- /dev/null +++ b/src/components/form-render/container-item/table-item.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/src/components/form-render/index.vue b/src/components/form-render/index.vue new file mode 100644 index 0000000..be6615b --- /dev/null +++ b/src/components/form-render/index.vue @@ -0,0 +1,571 @@ + + + + + + + diff --git a/src/components/form-render/refMixin.js b/src/components/form-render/refMixin.js new file mode 100644 index 0000000..cddfbcf --- /dev/null +++ b/src/components/form-render/refMixin.js @@ -0,0 +1,22 @@ +export default { + methods: { + initRefList() { + if ((this.refList !== null) && !!this.widget.options.name) { + this.refList[this.widget.options.name] = this + } + }, + + getWidgetRef(widgetName, showError) { + let foundRef = this.refList[widgetName] + if (!foundRef && !!showError) { + this.$message.error(this.i18nt('render.hint.refNotFound') + widgetName) + } + return foundRef + }, + + getFormRef() { /* 获取VFrom引用,必须在VForm组件created之后方可调用 */ + return this.refList['v_form_ref'] + }, + + } +} diff --git a/src/components/svg-icon/index.vue b/src/components/svg-icon/index.vue new file mode 100644 index 0000000..8fc1294 --- /dev/null +++ b/src/components/svg-icon/index.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/src/components/v-table/index.vue b/src/components/v-table/index.vue new file mode 100644 index 0000000..a7fe8c8 --- /dev/null +++ b/src/components/v-table/index.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/src/extension/extension-helper.js b/src/extension/extension-helper.js new file mode 100644 index 0000000..6f6c1f4 --- /dev/null +++ b/src/extension/extension-helper.js @@ -0,0 +1,23 @@ +import { + addContainerWidgetSchema, + addBasicFieldSchema, + addAdvancedFieldSchema, + addCustomWidgetSchema +} from '@/components/form-designer/widget-panel/widgetsConfig' +import { + registerCommonProperty, + registerAdvancedProperty, + registerEventProperty +} from '@/components/form-designer/setting-panel/propertyRegister' + + +export default { + addContainerWidgetSchema, + addBasicFieldSchema, + addAdvancedFieldSchema, + addCustomWidgetSchema, + + registerCommonProperty, + registerAdvancedProperty, + registerEventProperty, +} diff --git a/src/extension/extension-loader.js b/src/extension/extension-loader.js new file mode 100644 index 0000000..54055ab --- /dev/null +++ b/src/extension/extension-loader.js @@ -0,0 +1,112 @@ +//import { vfApp } from '@/utils/create-app' + +import { + addContainerWidgetSchema, + addCustomWidgetSchema +} from '@/components/form-designer/widget-panel/widgetsConfig' +import * as PERegister from '@/components/form-designer/setting-panel/propertyRegister' +import * as PEFactory from '@/components/form-designer/setting-panel/property-editor-factory.jsx' + +import {cardSchema} from "@/extension/samples/extension-schema" +import CardWidget from '@/extension/samples/card/card-widget' +import CardItem from '@/extension/samples/card/card-item' +import {registerCWGenerator} from '@/utils/sfc-generator' +import {cardTemplateGenerator} from '@/extension/samples/extension-sfc-generator' + +import {alertSchema} from "@/extension/samples/extension-schema" +import AlertWidget from '@/extension/samples/alert/alert-widget' +import {registerFWGenerator} from '@/utils/sfc-generator' +import {alertTemplateGenerator} from '@/extension/samples/extension-sfc-generator' + +export const loadExtension = function (app) { + + /** + * 加载容器组件步骤: + * 1. 加载组件Json Schema; + * 2. 全局注册容器组件,容器组件有两种状态——设计期和运行期,故需要注册两个组件; + * 3. 全局注册属性编辑器组件(基本属性、高级属性、事件属性); + * 4. 注册容器组件的代码生成器; + * 5. 加载完毕。 + */ + addContainerWidgetSchema(cardSchema) //加载组件Json Schema + /* -------------------------------------------------- */ + app.component(CardWidget.name, CardWidget) //注册设计期的容器组件 + app.component(CardItem.name, CardItem) //注册运行期的容器组件 + /* -------------------------------------------------- */ + PERegister.registerCPEditor(app, 'card-folded', 'card-folded-editor', + PEFactory.createBooleanEditor('folded', 'extension.setting.cardFolded')) + + PERegister.registerCPEditor(app, 'card-showFold', 'card-showFold-editor', + PEFactory.createBooleanEditor('showFold', 'extension.setting.cardShowFold')) + + PERegister.registerCPEditor(app, 'card-cardWidth', 'card-cardWidth-editor', + PEFactory.createInputTextEditor('cardWidth', 'extension.setting.cardWidth')) + + let shadowOptions = [ + {label: 'never', value: 'never'}, + {label: 'hover', value: 'hover'}, + {label: 'always', value: 'always'}, + ] + PERegister.registerCPEditor(app, 'card-shadow', 'card-shadow-editor', + PEFactory.createSelectEditor('shadow', 'extension.setting.cardShadow', + {optionItems: shadowOptions})) + /* -------------------------------------------------- */ + registerCWGenerator('card', cardTemplateGenerator) //注册容器组件的代码生成器 + /* -------------------------------------------------- */ + /* 容器组件加载完毕 end */ + + /** + * 加载字段组件步骤: + * 1. 加载组件Json Schema; + * 2. 全局注册字段组件,字段组件设计期和运行期共用,故仅需注册一个组件; + * 3. 全局注册属性编辑器组件(基本属性、高级属性、事件属性); + * 4. 注册字段组件的代码生成器; + * 5. 加载完毕。 + */ + addCustomWidgetSchema(alertSchema) //加载组件Json Schema + /* -------------------------------------------------- */ + app.component(AlertWidget.name, AlertWidget) //注册组件 + /* -------------------------------------------------- */ + PERegister.registerCPEditor(app, 'alert-title', 'alert-title-editor', + PEFactory.createInputTextEditor('title', 'extension.setting.alertTitle')) + + let typeOptions = [ + {label: 'success', value: 'success'}, + {label: 'warning', value: 'warning'}, + {label: 'info', value: 'info'}, + {label: 'error', value: 'error'}, + ] + PERegister.registerCPEditor(app, 'alert-type', 'alert-type-editor', + PEFactory.createSelectEditor('type', 'extension.setting.alertType', + {optionItems: typeOptions})) + + PERegister.registerCPEditor(app, 'alert-description', 'alert-description-editor', + PEFactory.createInputTextEditor('description', 'extension.setting.description')) + + PERegister.registerCPEditor(app, 'alert-closable', 'alert-closable-editor', + PEFactory.createBooleanEditor('closable', 'extension.setting.closable')) + + PERegister.registerCPEditor(app, 'alert-closeText', 'alert-closeText-editor', + PEFactory.createInputTextEditor('closeText', 'extension.setting.closeText')) + + PERegister.registerCPEditor(app, 'alert-center', 'alert-center-editor', + PEFactory.createBooleanEditor('center', 'extension.setting.center')) + + PERegister.registerCPEditor(app, 'alert-showIcon', 'alert-showIcon-editor', + PEFactory.createBooleanEditor('showIcon', 'extension.setting.showIcon')) + + let effectOptions = [ + {label: 'light', value: 'light'}, + {label: 'dark', value: 'dark'}, + ] + PERegister.registerCPEditor(app, 'alert-effect', 'alert-effect-editor', + PEFactory.createRadioButtonGroupEditor('effect', 'extension.setting.effect', + {optionItems: effectOptions})) + + PERegister.registerEPEditor(app, 'alert-onClose', 'alert-onClose-editor', + PEFactory.createEventHandlerEditor('onClose', [])) + /* -------------------------------------------------- */ + registerFWGenerator('alert', alertTemplateGenerator) //注册字段组件的代码生成器 + /* -------------------------------------------------- */ + /* 字段组件加载完毕 end */ +} diff --git a/src/extension/samples/alert/alert-widget.vue b/src/extension/samples/alert/alert-widget.vue new file mode 100644 index 0000000..7a4c503 --- /dev/null +++ b/src/extension/samples/alert/alert-widget.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/extension/samples/card/card-item.vue b/src/extension/samples/card/card-item.vue new file mode 100644 index 0000000..c4eedc4 --- /dev/null +++ b/src/extension/samples/card/card-item.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/src/extension/samples/card/card-widget.vue b/src/extension/samples/card/card-widget.vue new file mode 100644 index 0000000..805a886 --- /dev/null +++ b/src/extension/samples/card/card-widget.vue @@ -0,0 +1,121 @@ + + + + + diff --git a/src/extension/samples/extension-schema.js b/src/extension/samples/extension-schema.js new file mode 100644 index 0000000..abdae48 --- /dev/null +++ b/src/extension/samples/extension-schema.js @@ -0,0 +1,36 @@ +export const cardSchema = { + type: 'card', + category: 'container', + icon: 'card', + widgetList: [], + options: { + name: '', + label: 'card', + hidden: false, + folded: false, + showFold: true, + cardWidth: '100%', + shadow: 'never', + customClass: '', + } +} + +export const alertSchema = { + type: 'alert', + icon: 'alert', + formItemFlag: false, + options: { + name: '', + title: 'Good things are coming...', + type: 'info', + description: '', + closable: true, + closeText: '', + center: true, + showIcon: false, + effect: 'light', + hidden: false, + onClose: '', + customClass: '', + } +} diff --git a/src/extension/samples/extension-sfc-generator.js b/src/extension/samples/extension-sfc-generator.js new file mode 100644 index 0000000..a03b408 --- /dev/null +++ b/src/extension/samples/extension-sfc-generator.js @@ -0,0 +1,52 @@ +import {buildClassAttr, buildContainerWidget, buildFieldWidget} from '@/utils/sfc-generator' + +export const cardTemplateGenerator = function (cw, formConfig) { + const wop = cw.options + //const headerAttr = `header="${wop.label}"` + const classAttr = buildClassAttr(cw) + const styleAttr = !!wop.cardWidth ? `style="{width: ${wop.cardWidth} !important}"` : '' + const shadowAttr = `shadow="${wop.shadow}"` + const vShowAttr = !!wop.hidden ? `v-show="false"` : '' + + const cardTemplate = +`
+ + + ${ + cw.widgetList.map(wItem => { + if (wItem.category === 'container') { + return buildContainerWidget(wItem, formConfig) + } else { + return buildFieldWidget(wItem, formConfig) + } + }).join('') + } + +
` + + return cardTemplate +} + +export const alertTemplateGenerator = function(fw, formConfig) { + const wop = fw.options + const titleAttr = `title="${wop.title}"` + const typeAttr = `type=${wop.type}` + const descriptionAttr = !!wop.description ? `description="${wop.description}"` : '' + const closableAttr = `:closable="${wop.closable}"` + const closeTextAttr = !!wop.closeText ? `close-text="${wop.closeText}"` : '' + const centerAttr = `:center="${wop.center}"` + const showIconAttr = `:show-icon="${wop.showIcon}"` + const effectAttr = `effect="${wop.effect}"` + + const alertTemplate = +` +` + + return alertTemplate +} diff --git a/src/iconfont/iconfont.css b/src/iconfont/iconfont.css new file mode 100644 index 0000000..32f87eb --- /dev/null +++ b/src/iconfont/iconfont.css @@ -0,0 +1,29 @@ +@font-face { + font-family: "iconfont"; /* Project id */ + src: url('iconfont.ttf?t=1620643511304') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-insertcolumn:before { + content: "\e753"; +} + +.icon-insertrow:before { + content: "\e754"; +} + +.icon-hide:before { + content: "\e76b"; +} + +.icon-drag:before { + content: "\e61d"; +} + diff --git a/src/iconfont/iconfont.eot b/src/iconfont/iconfont.eot new file mode 100644 index 0000000..fc442ca Binary files /dev/null and b/src/iconfont/iconfont.eot differ diff --git a/src/iconfont/iconfont.js b/src/iconfont/iconfont.js new file mode 100644 index 0000000..577219f --- /dev/null +++ b/src/iconfont/iconfont.js @@ -0,0 +1 @@ +!function(e){var t,n,o,l,c,i,a='',d=(d=document.getElementsByTagName("script"))[d.length-1].getAttribute("data-injectcss");if(d&&!e.__iconfont__svg__cssinject__){e.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(e){console&&console.log(e)}}function s(){c||(c=!0,o())}t=function(){var e,t,n,o;(o=document.createElement("div")).innerHTML=a,a=null,(n=o.getElementsByTagName("svg")[0])&&(n.setAttribute("aria-hidden","true"),n.style.position="absolute",n.style.width=0,n.style.height=0,n.style.overflow="hidden",e=n,(t=document.body).firstChild?(o=e,(n=t.firstChild).parentNode.insertBefore(o,n)):t.appendChild(e))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(t,0):(n=function(){document.removeEventListener("DOMContentLoaded",n,!1),t()},document.addEventListener("DOMContentLoaded",n,!1)):document.attachEvent&&(o=t,l=e.document,c=!1,(i=function(){try{l.documentElement.doScroll("left")}catch(e){return void setTimeout(i,50)}s()})(),l.onreadystatechange=function(){"complete"==l.readyState&&(l.onreadystatechange=null,s())})}(window); \ No newline at end of file diff --git a/src/iconfont/iconfont.json b/src/iconfont/iconfont.json new file mode 100644 index 0000000..92af6b1 --- /dev/null +++ b/src/iconfont/iconfont.json @@ -0,0 +1,37 @@ +{ + "id": "", + "name": "", + "font_family": "iconfont", + "css_prefix_text": "icon-", + "description": "", + "glyphs": [ + { + "icon_id": "586931", + "name": "insert-column", + "font_class": "insertcolumn", + "unicode": "e753", + "unicode_decimal": 59219 + }, + { + "icon_id": "586932", + "name": "insert-row", + "font_class": "insertrow", + "unicode": "e754", + "unicode_decimal": 59220 + }, + { + "icon_id": "1030072", + "name": "hide", + "font_class": "hide", + "unicode": "e76b", + "unicode_decimal": 59243 + }, + { + "icon_id": "14772710", + "name": "drag", + "font_class": "drag", + "unicode": "e61d", + "unicode_decimal": 58909 + } + ] +} diff --git a/src/iconfont/iconfont.svg b/src/iconfont/iconfont.svg new file mode 100644 index 0000000..207c0c9 --- /dev/null +++ b/src/iconfont/iconfont.svg @@ -0,0 +1,35 @@ + + + + + +Created by iconfont + + + + + + + + + + + + + + + + + + + + diff --git a/src/iconfont/iconfont.ttf b/src/iconfont/iconfont.ttf new file mode 100644 index 0000000..d7a08f5 Binary files /dev/null and b/src/iconfont/iconfont.ttf differ diff --git a/src/iconfont/iconfont.woff b/src/iconfont/iconfont.woff new file mode 100644 index 0000000..330d984 Binary files /dev/null and b/src/iconfont/iconfont.woff differ diff --git a/src/iconfont/iconfont.woff2 b/src/iconfont/iconfont.woff2 new file mode 100644 index 0000000..aea096e Binary files /dev/null and b/src/iconfont/iconfont.woff2 differ diff --git a/src/icons/index.js b/src/icons/index.js new file mode 100644 index 0000000..cc5a89c --- /dev/null +++ b/src/icons/index.js @@ -0,0 +1,12 @@ +//import { vfApp } from '@/utils/create-app' +import SvgIcon from '@/components/svg-icon'// svg组件 + +// register globally +//vfApp.component('svg-icon', SvgIcon) + +// const requireAll = requireContext => requireContext.keys().map(requireContext) +// const req = require.context('./svg', false, /\.svg$/) +// requireAll(req) + + +//const modules = import.meta.globEager('./**/*.svg') diff --git a/src/icons/svg/alert.svg b/src/icons/svg/alert.svg new file mode 100644 index 0000000..f1182f0 --- /dev/null +++ b/src/icons/svg/alert.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/button.svg b/src/icons/svg/button.svg new file mode 100644 index 0000000..344f1b8 --- /dev/null +++ b/src/icons/svg/button.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/card.svg b/src/icons/svg/card.svg new file mode 100644 index 0000000..515441d --- /dev/null +++ b/src/icons/svg/card.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/cascader-field.svg b/src/icons/svg/cascader-field.svg new file mode 100644 index 0000000..7c18237 --- /dev/null +++ b/src/icons/svg/cascader-field.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/checkbox-field.svg b/src/icons/svg/checkbox-field.svg new file mode 100644 index 0000000..0f14ae4 --- /dev/null +++ b/src/icons/svg/checkbox-field.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/color-field.svg b/src/icons/svg/color-field.svg new file mode 100644 index 0000000..8dca8c5 --- /dev/null +++ b/src/icons/svg/color-field.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/custom-component.svg b/src/icons/svg/custom-component.svg new file mode 100644 index 0000000..2633507 --- /dev/null +++ b/src/icons/svg/custom-component.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/data-table.svg b/src/icons/svg/data-table.svg new file mode 100644 index 0000000..d4e7caf --- /dev/null +++ b/src/icons/svg/data-table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/date-field.svg b/src/icons/svg/date-field.svg new file mode 100644 index 0000000..54c51f1 --- /dev/null +++ b/src/icons/svg/date-field.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/date-range-field.svg b/src/icons/svg/date-range-field.svg new file mode 100644 index 0000000..66526ba --- /dev/null +++ b/src/icons/svg/date-range-field.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/divider.svg b/src/icons/svg/divider.svg new file mode 100644 index 0000000..286c16b --- /dev/null +++ b/src/icons/svg/divider.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/document.svg b/src/icons/svg/document.svg new file mode 100644 index 0000000..93668d5 --- /dev/null +++ b/src/icons/svg/document.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/drag.svg b/src/icons/svg/drag.svg new file mode 100644 index 0000000..990dce4 --- /dev/null +++ b/src/icons/svg/drag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/el/back.svg b/src/icons/svg/el/back.svg new file mode 100644 index 0000000..632c914 --- /dev/null +++ b/src/icons/svg/el/back.svg @@ -0,0 +1 @@ + diff --git a/src/icons/svg/el/delete.svg b/src/icons/svg/el/delete.svg new file mode 100644 index 0000000..c841fc2 --- /dev/null +++ b/src/icons/svg/el/delete.svg @@ -0,0 +1 @@ + diff --git a/src/icons/svg/el/view.svg b/src/icons/svg/el/view.svg new file mode 100644 index 0000000..af2d3a2 --- /dev/null +++ b/src/icons/svg/el/view.svg @@ -0,0 +1 @@ + diff --git a/src/icons/svg/file-upload-field.svg b/src/icons/svg/file-upload-field.svg new file mode 100644 index 0000000..614405e --- /dev/null +++ b/src/icons/svg/file-upload-field.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/github.svg b/src/icons/svg/github.svg new file mode 100644 index 0000000..42f596d --- /dev/null +++ b/src/icons/svg/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/grid.svg b/src/icons/svg/grid.svg new file mode 100644 index 0000000..f1b9f1d --- /dev/null +++ b/src/icons/svg/grid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/html-text.svg b/src/icons/svg/html-text.svg new file mode 100644 index 0000000..d4e5cf5 --- /dev/null +++ b/src/icons/svg/html-text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/node-tree.svg b/src/icons/svg/node-tree.svg new file mode 100644 index 0000000..37f45fc --- /dev/null +++ b/src/icons/svg/node-tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/number-field.svg b/src/icons/svg/number-field.svg new file mode 100644 index 0000000..19a53a6 --- /dev/null +++ b/src/icons/svg/number-field.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/picture-upload-field.svg b/src/icons/svg/picture-upload-field.svg new file mode 100644 index 0000000..dde3bb4 --- /dev/null +++ b/src/icons/svg/picture-upload-field.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/radio-field.svg b/src/icons/svg/radio-field.svg new file mode 100644 index 0000000..274cb17 --- /dev/null +++ b/src/icons/svg/radio-field.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/rate-field.svg b/src/icons/svg/rate-field.svg new file mode 100644 index 0000000..5852671 --- /dev/null +++ b/src/icons/svg/rate-field.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/redo.svg b/src/icons/svg/redo.svg new file mode 100644 index 0000000..e5ea4a7 --- /dev/null +++ b/src/icons/svg/redo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/rich-editor-field.svg b/src/icons/svg/rich-editor-field.svg new file mode 100644 index 0000000..bb540f7 --- /dev/null +++ b/src/icons/svg/rich-editor-field.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/section.svg b/src/icons/svg/section.svg new file mode 100644 index 0000000..9249c99 --- /dev/null +++ b/src/icons/svg/section.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/select-field.svg b/src/icons/svg/select-field.svg new file mode 100644 index 0000000..59f83f1 --- /dev/null +++ b/src/icons/svg/select-field.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/slider-field.svg b/src/icons/svg/slider-field.svg new file mode 100644 index 0000000..f8f47dc --- /dev/null +++ b/src/icons/svg/slider-field.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/slot-component.svg b/src/icons/svg/slot-component.svg new file mode 100644 index 0000000..c7db9c3 --- /dev/null +++ b/src/icons/svg/slot-component.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/slot-field.svg b/src/icons/svg/slot-field.svg new file mode 100644 index 0000000..16e953a --- /dev/null +++ b/src/icons/svg/slot-field.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/static-text.svg b/src/icons/svg/static-text.svg new file mode 100644 index 0000000..fccdc45 --- /dev/null +++ b/src/icons/svg/static-text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/sub-form.svg b/src/icons/svg/sub-form.svg new file mode 100644 index 0000000..13475d0 --- /dev/null +++ b/src/icons/svg/sub-form.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/switch-field.svg b/src/icons/svg/switch-field.svg new file mode 100644 index 0000000..a5ccb46 --- /dev/null +++ b/src/icons/svg/switch-field.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/tab.svg b/src/icons/svg/tab.svg new file mode 100644 index 0000000..89b675b --- /dev/null +++ b/src/icons/svg/tab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/table.svg b/src/icons/svg/table.svg new file mode 100644 index 0000000..8876696 --- /dev/null +++ b/src/icons/svg/table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/text-field.svg b/src/icons/svg/text-field.svg new file mode 100644 index 0000000..7a411c0 --- /dev/null +++ b/src/icons/svg/text-field.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/textarea-field.svg b/src/icons/svg/textarea-field.svg new file mode 100644 index 0000000..967a753 --- /dev/null +++ b/src/icons/svg/textarea-field.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/time-field.svg b/src/icons/svg/time-field.svg new file mode 100644 index 0000000..83c47fc --- /dev/null +++ b/src/icons/svg/time-field.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/time-range-field.svg b/src/icons/svg/time-range-field.svg new file mode 100644 index 0000000..c5d9413 --- /dev/null +++ b/src/icons/svg/time-range-field.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/undo.svg b/src/icons/svg/undo.svg new file mode 100644 index 0000000..032c7ee --- /dev/null +++ b/src/icons/svg/undo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/vue-sfc.svg b/src/icons/svg/vue-sfc.svg new file mode 100644 index 0000000..bef2499 --- /dev/null +++ b/src/icons/svg/vue-sfc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/lang/en-US.js b/src/lang/en-US.js new file mode 100644 index 0000000..2485eb8 --- /dev/null +++ b/src/lang/en-US.js @@ -0,0 +1,321 @@ +export default { + application: { + 'zh-CN': '简体中文', + 'en-US': 'English', + productTitle: 'Online Form Designer', + github: 'GitHub', + document: 'Docs', + qqGroup: 'WeChat Group', + deployment: 'Deployment', + subscription: 'Subscription', + }, + + designer: { + componentLib: 'Components', + formLib: 'Templates', + containerTitle: 'Container', + dragHandlerHint: 'drag container or field to layout center', + dragAction: 'drag', + basicFieldTitle: 'Basic Field', + advancedFieldTitle: 'Advanced Field', + customFieldTitle: 'Customized Field', + + noWidgetHint: 'Please select a widget from the left list, drag and drop to this container.', + + widgetLabel: { + grid: 'Grid', + table: 'Table', + tab: 'Tab', + section: 'Section', + 'sub-form': 'SubForm', + 'grid-col': 'GridCol', + 'table-cell': 'TableCell', + 'tab-pane': 'TabPane', + 'data-table': 'DataTable', + + input: 'Input', + textarea: 'Textarea', + number: 'InputNumber', + radio: 'Radio', + checkbox: 'Checkbox', + select: 'Select', + time: 'Time', + 'time-range': 'Time range', + date: 'Date', + 'date-range': 'Date range', + switch: 'Switch', + rate: 'Rate', + color: 'ColorPicker', + slider: 'Slider', + 'static-text': 'Text', + 'html-text': 'HTML', + button: 'Button', + divider: 'Divider', + + 'picture-upload': 'Picture', + 'file-upload': 'File', + 'rich-editor': 'Rich Editor', + cascader: 'Cascader', + slot: 'Slot', + + custom: 'Custom Component', + }, + + hint: { + selectParentWidget: 'Select parent of this widget', + moveUpWidget: 'Move up this widget', + moveDownWidget: 'Move down this widget', + cloneWidget: 'Clone this widget', + insertRow: 'Insert new row', + insertColumn: 'Insert new column', + remove: 'Remove this widget', + cellSetting: 'Cell setting', + dragHandler: 'Drag handler', + copyField: 'Copy field widget', + onlyFieldWidgetAcceptable: 'Only field widget can be dragged into sub-form', + moveUpFirstChildHint: 'First child can not be move up', + moveDownLastChildHint: 'Last child can not be move down', + + closePreview: 'Close', + copyJson: 'Copy', + saveFormJson: 'Save As File', + copyVueCode: 'Copy Vue Code', + copyHtmlCode: 'Copy HTML Code', + copyJsonSuccess: 'Copy succeed', + importJsonSuccess: 'Import succeed', + copyJsonFail: 'Copy failed', + copyVueCodeSuccess: 'Copy succeed', + copyVueCodeFail: 'Copy failed', + copyHtmlCodeSuccess: 'Copy succeed', + copyHtmlCodeFail: 'Copy failed', + saveVueCode: 'Save Vue File', + saveHtmlCode: 'Save Html File', + getFormData: 'Get Data', + resetForm: 'Reset', + disableForm: 'Disable', + enableForm: 'Enable', + exportFormData: 'Form Data', + copyFormData: 'Copy', + saveFormData: 'Save As File', + copyVue2SFC: 'Copy Vue2', + copyVue3SFC: 'Copy Vue3', + copySFCFail: 'Copy failed', + copySFCSuccess: 'Copy succeed', + saveVue2SFC: 'Save As Vue2', + saveVue3SFC: 'Save As Vue3', + fileNameForSave: 'File name:', + saveFileTitle: 'Save as File', + fileNameInputPlaceholder: 'Enter the file name', + sampleLoadedSuccess: 'Example loaded successfully', + sampleLoadedFail: 'Sample load failed', + loadFormTemplate: 'Load This', + loadFormTemplateHint: 'Are you sure to load this template?', + loadFormTemplateSuccess: 'Load form template success!', + loadFormTemplateFailed: 'Load form template failed.', + currentNodeCannotBeSelected: 'The current node cannot be selected.', + + widgetSetting: 'Widget Config', + formSetting: 'Form Config', + + prompt: 'Prompt', + confirm: 'OK', + cancel: 'Cancel', + import: 'Import', + importJsonHint: 'The code to be imported should have the following JSON format.', + invalidOptionsData: 'Invalid data of options:', + lastPaneCannotBeDeleted: 'The last pane cannot be deleted.', + duplicateName: 'Duplicate name: ', + nameRequired: 'Name required.', + + numberValidator: 'Number', + letterValidator: 'Letter', + letterAndNumberValidator: 'LetterAndNumber', + mobilePhoneValidator: 'MobilePhone', + emailValidator: 'Email', + urlValidator: 'URL', + noChineseValidator: 'Non-Chinese', + chineseValidator: 'Chinese', + + rowspanNotConsistentForMergeEntireRow: 'Cells in this row don\'t have the same rowspan, operation failed.', + colspanNotConsistentForMergeEntireColumn: 'Cells in this column don\'t have the same colspan, operation failed.', + rowspanNotConsistentForDeleteEntireRow: 'Cells in this row don\'t have the same rowspan, operation failed.', + colspanNotConsistentForDeleteEntireColumn: 'Cells in this column don\'t have the same colspan, operation failed.', + lastColCannotBeDeleted: 'The last col cannot be deleted.', + lastRowCannotBeDeleted: 'The last row cannot be deleted.', + }, + + toolbar: { + undoHint: 'Undo', + redoHint: 'Redo', + pcLayout: 'PC', + padLayout: 'Pad', + mobileLayout: 'H5', + nodeTreeHint: 'Tree View Of Component Hierarchy', + nodeTreeTitle: 'Tree View Of Component Hierarchy', + clear: 'Clear', + preview: 'Preview', + importJson: 'Import JSON', + exportJson: 'Export JSON', + exportCode: 'Export Code', + generateCode: 'Generate Code', + generateSFC: 'Generate SFC', + }, + + setting: { + basicSetting: 'Basic Setting', + attributeSetting: 'Attribute Setting', + commonSetting: 'Common Setting', + advancedSetting: 'Advanced Setting', + eventSetting: 'Event Setting', + uniqueName: 'Unique Name', + editNameHelp: 'Press enter to confirm the modification', + label: 'Label', + displayType: 'Type', + defaultValue: 'Default Value', + placeholder: 'Placeholder', + startPlaceholder: 'Start Placeholder', + endPlaceholder: 'End Placeholder', + widgetColumnWidth: 'Width', + widgetSize: 'Size', + showStops: 'Show Stops', + displayStyle: 'Display Style', + inlineLayout: 'inline', + blockLayout: 'block', + buttonStyle: 'Show As Button', + border: 'Show Border', + labelWidth: 'Width Of Label', + rows: 'Rows', + labelHidden: 'Hide Label', + required: 'Required', + validation: 'Validation', + validationHelp: 'Regular expressions supported', + validationHint: 'Validation Hint', + readonly: 'Readonly', + disabled: 'Disabled', + hidden: 'Hidden', + textContent: 'Text', + htmlContent: 'HTML', + clearable: 'Clearable', + editable: 'Editable', + format: 'Format', + valueFormat: 'Value Format', + showPassword: 'Show Reveal', + filterable: 'Filterable', + allowCreate: 'Allow Create', + remote: 'Remote Query', + automaticDropdown: 'Automatic Dropdown', + multiple: 'Multiple', + multipleLimit: 'Multiple Limit', + contentPosition: 'Content Position', + plain: 'Plain', + round: 'Round', + circle: 'Circle', + icon: 'Icon', + optionsSetting: 'Options Setting', + addOption: 'Add Option', + importOptions: 'Import Options', + resetDefault: 'Reset Default', + uploadSetting: 'Upload Setting', + uploadURL: 'Upload URL', + uploadTip: 'Tip Content', + withCredentials: 'Send Cookie', + multipleSelect: 'File Multi-select', + showFileList: 'Show File List', + limit: 'Max Upload Number', + fileMaxSize: 'Max Size(MB)', + fileTypes: 'Upload File Types', + fileTypesHelp: 'Allows to add more file types', + headers: 'Request Headers', + + cellWidth: 'Width', + cellHeight: 'Height', + gridColHeight: 'Height Of Col(px)', + gutter: 'Gutter(px)', + columnSetting: 'Cols Setting', + colsOfGrid: 'Cols Of Grid:', + colSpanTitle: 'Spans Of Col', + colOffsetTitle: 'Offset Of Col', + colPushTitle: 'Push Of Col', + colPullTitle: 'Pull Of Col', + addColumn: 'Add Column', + responsive: 'Responsive', + + tabPaneSetting: 'Tab Panes', + addTabPane: 'Add Tab Pane', + paneActive: 'Active', + + customLabelIcon: 'Custom Label', + labelIconClass: 'Label Icon Class', + labelIconPosition: 'Label Icon Position', + labelTooltip: 'Label Tooltip', + minValue: 'Min Value', + maxValue: 'Max Value', + precision: 'Precision', + step: 'Step', + controlsPosition: 'Controls Position', + minLength: 'Min Length', + maxLength: 'Max Length', + showWordLimit: 'Show Word Limit', + prefixIcon: 'Prefix Icon', + suffixIcon: 'Suffix Icon', + inputButton: 'Input Button Setting', + appendButton: 'Append Button', + appendButtonDisabled: 'Button Disabled', + appendButtonIcon: 'Append Button Icon', + buttonIcon: 'Button Icon', + switchWidth: 'Width of Switch(px)', + activeText: 'Active Text', + inactiveText: 'Inactive Text', + activeColor: 'Active Color', + inactiveColor: 'Inactive Color', + maxStars: 'Stars Max Number', + lowThreshold: 'Low Threshold', + highThreshold: 'High Threshold', + allowHalf: 'Allow Half', + showText: 'Show Text', + showScore: 'Show Score', + range: 'Range', + vertical: 'Vertical', + showBlankRow: 'Show Blank Row', + showRowNumber: 'Show Row Number', + + insertColumnToLeft: 'insert column to left', + insertColumnToRight: 'insert column to right', + insertRowAbove: 'insert row above', + insertRowBelow: 'insert row below', + mergeLeftColumn: 'merge left cell', + mergeRightColumn: 'merge right cell', + mergeEntireRow: 'merge entire row', + mergeRowAbove: 'merge cell above', + mergeRowBelow: 'merge cell below', + mergeEntireColumn: 'merge entire column', + undoMergeCol: 'undo merge column', + undoMergeRow: 'undo merge row', + deleteEntireCol: 'delete entire column', + deleteEntireRow: 'delete entire row', + + widgetName: 'Unique Name', + formSize: 'Size', + labelPosition: 'Position Of Label', + topPosition: 'Top', + leftPosition: 'Left', + labelAlign: 'Label Align', + leftAlign: 'Left', + centerAlign: 'Center', + rightAlign: 'Right', + formCss: 'Form CSS', + addCss: 'Edit', + customClass: 'Custom Class', + globalFunctions: 'Global Functions', + addEventHandler: 'Edit', + editWidgetEventHandler: 'Edit Widget Event Handler', + editFormEventHandler: 'Edit Form Event Handler', + formSFCSetting: 'SFC Setting', + formModelName: 'Model Name', + formRefName: 'Ref Name', + formRulesName: 'Rules Name', + + } + + } +} diff --git a/src/lang/en-US_extension.js b/src/lang/en-US_extension.js new file mode 100644 index 0000000..2149320 --- /dev/null +++ b/src/lang/en-US_extension.js @@ -0,0 +1,26 @@ +export default { + extension: { + widgetLabel: { + card: 'Card', + alert: 'Alert', + }, + + setting: { + cardFolded: 'Folded', + cardShowFold: 'Show Fold', + cardWidth: 'Width Of Card', + cardShadow: 'Shadow', + + alertTitle: 'Title', + alertType: 'Type', + description: 'Description', + closable: 'Closable', + closeText: 'Text On Close Btn', + center: 'Center', + showIcon: 'Show Icon', + effect: 'Effect', + + }, + + } +} diff --git a/src/lang/en-US_render.js b/src/lang/en-US_render.js new file mode 100644 index 0000000..8582386 --- /dev/null +++ b/src/lang/en-US_render.js @@ -0,0 +1,38 @@ +export default { + render: { + + hint: { + prompt: 'Prompt', + confirm: 'OK', + cancel: 'Cancel', + + selectPlaceholder: 'Pick some item', + timePlaceholder: 'Select time', + startTimePlaceholder: 'Start time', + endTimePlaceholder: 'End time', + datePlaceholder: 'Select date', + startDatePlaceholder: 'Start date', + endDatePlaceholder: 'End date', + blankCellContent: '--', + + uploadError: 'Upload error: ', + uploadExceed: 'The maximum number(${uploadLimit}) of file uploads has been exceeded.', + unsupportedFileType: 'Unsupported format: ', + fileSizeExceed: 'File size out of limit: ', + refNotFound: 'Ref not found: ', + fieldRequired: 'Input value should be not null.', + invalidNumber: 'Invalid number format', + selectFile: ' File...', + downloadFile: 'Download', + removeFile: 'Remove', + validationFailed: 'Form validation failed', + + subFormAction: 'Action', + subFormAddAction: 'Add', + subFormAddActionHint: 'add new row', + insertSubFormRow: 'insert new row', + deleteSubFormRow: 'delete this row', + nonSubFormType: 'The type of widget don\'t match sub-form', + } + } +} diff --git a/src/lang/zh-CN.js b/src/lang/zh-CN.js new file mode 100644 index 0000000..470b4c8 --- /dev/null +++ b/src/lang/zh-CN.js @@ -0,0 +1,321 @@ +export default { + application: { + 'zh-CN': '简体中文', + 'en-US': 'English', + productTitle: '表单设计器', + github: 'GitHub', + document: '文档', + qqGroup: '技术WX群', + deployment: '私有部署', + subscription: '订阅Pro', + }, + + designer: { + componentLib: '组件库', + formLib: '表单模板', + containerTitle: '容器', + dragHandlerHint: '鼠标拖拽容器组件或字段组件并放置于表单中', + dragAction: '拖动', + basicFieldTitle: '基础字段', + advancedFieldTitle: '高级字段', + customFieldTitle: '自定义扩展字段', + + noWidgetHint: '请从左侧列表中选择一个组件, 然后用鼠标拖动组件放置于此处.', + + widgetLabel: { + grid: '栅格', + table: '表格', + tab: '标签页', + section: '区块', + 'sub-form': '子表单', + 'grid-col': '栅格列', + 'table-cell': '单元格', + 'tab-pane': '选项卡页', + 'data-table': '数据表格', + + input: '单行输入', + textarea: '多行输入', + number: '计数器', + radio: '单选项', + checkbox: '多选项', + select: '下拉选项', + time: '时间', + 'time-range': '时间范围', + date: '日期', + 'date-range': '日期范围', + switch: '开关', + rate: '评分', + color: '颜色选择器', + slider: '滑块', + 'static-text': '静态文字', + 'html-text': 'HTML', + button: '按钮', + divider: '分隔线', + + 'picture-upload': '图片', + 'file-upload': '文件', + 'rich-editor': '富文本', + cascader: '级联选择', + slot: '插槽', + + custom: 'Custom Component', + }, + + hint: { + selectParentWidget: '选中父组件', + moveUpWidget: '上移组件', + moveDownWidget: '下移组件', + cloneWidget: '复制组件', + insertRow: '插入新行', + insertColumn: '插入新列', + remove: '移除组件', + cellSetting: '单元格操作', + dragHandler: '拖拽手柄', + copyField: '复制字段组件', + onlyFieldWidgetAcceptable: '子表单只能接收字段组件', + moveUpFirstChildHint: '已经移动到最上面', + moveDownLastChildHint: '已经移动到最下面', + + closePreview: '关闭', + copyJson: '复制JSON', + saveFormJson: '保存为文件', + copyVueCode: '复制Vue代码', + copyHtmlCode: '复制HTML代码', + copyJsonSuccess: '复制JSON成功', + importJsonSuccess: '导入JSON成功', + copyJsonFail: '复制JSON失败', + copyVueCodeSuccess: '复制Vue代码成功', + copyVueCodeFail: '复制Vue代码失败', + copyHtmlCodeSuccess: '复制HTML代码成功', + copyHtmlCodeFail: '复制HTML代码失败', + saveVueCode: '保存Vue文件', + saveHtmlCode: '保存Html文件', + getFormData: '获取数据', + resetForm: '重置表单', + disableForm: '禁用编辑', + enableForm: '恢复编辑', + exportFormData: '表单数据', + copyFormData: '复制JSON', + saveFormData: '保存为文件', + copyVue2SFC: '复制Vue2代码', + copyVue3SFC: '复制Vue3代码', + copySFCFail: '复制SFC代码失败', + copySFCSuccess: '复制SFC代码成功', + saveVue2SFC: '保存为Vue2组件', + saveVue3SFC: '保存为Vue3组件', + fileNameForSave: '文件名:', + saveFileTitle: '保存为文件', + fileNameInputPlaceholder: '请输入文件名', + sampleLoadedSuccess: '表单示例加载成功', + sampleLoadedFail: '表单示例加载失败', + loadFormTemplate: '加载此模板', + loadFormTemplateHint: '是否加载这个模板?加载后会覆盖设计器当前表单,你可以使用“撤销”功能恢复。', + loadFormTemplateSuccess: '表单模板加载成功', + loadFormTemplateFailed: '表单模板加载失败', + currentNodeCannotBeSelected: '当前组件节点不可选择', + + widgetSetting: '组件设置', + formSetting: '表单设置', + + prompt: '提示', + confirm: '确定', + cancel: '取消', + import: '导入', + importJsonHint: '导入的JSON内容须符合下述格式,以保证顺利导入.', + invalidOptionsData: '无效的选项数据:', + lastPaneCannotBeDeleted: '仅剩一个选项卡页不可删除.', + duplicateName: '组件名称已存在: ', + nameRequired: '组件名称不可为空', + + numberValidator: '数字', + letterValidator: '字母', + letterAndNumberValidator: '数字字母', + mobilePhoneValidator: '手机号码', + emailValidator: '邮箱', + urlValidator: '网址', + noChineseValidator: '非中文字符', + chineseValidator: '仅中文字符', + + rowspanNotConsistentForMergeEntireRow: '存在行高不一致的单元格, 无法合并整行.', + colspanNotConsistentForMergeEntireColumn: '存在列宽不一致的单元格, 无法合并整列.', + rowspanNotConsistentForDeleteEntireRow: '存在行高不一致的单元格, 不可删除整行.', + colspanNotConsistentForDeleteEntireColumn: '存在列宽不一致的单元格, 不可删除整列.', + lastColCannotBeDeleted: '最后一列不可删除.', + lastRowCannotBeDeleted: '最后一行不可删除.', + }, + + toolbar: { + undoHint: '撤销', + redoHint: '重做', + pcLayout: 'PC', + padLayout: 'Pad', + mobileLayout: 'H5', + nodeTreeHint: '组件层次结构树', + nodeTreeTitle: '组件层次结构树', + clear: '清空', + preview: '预览', + importJson: '导入JSON', + exportJson: '导出JSON', + exportCode: '导出代码', + generateCode: '生成代码', + generateSFC: '生成SFC', + }, + + setting: { + basicSetting: '基本属性', + attributeSetting: '属性设置', + commonSetting: '常见属性', + advancedSetting: '高级属性', + eventSetting: '事件属性', + uniqueName: '唯一名称', + editNameHelp: '修改名称后需按回车确认', + label: '字段标签', + displayType: '显示类型', + defaultValue: '默认值', + placeholder: '占位内容', + startPlaceholder: '起始占位内容', + endPlaceholder: '截止占位内容', + widgetColumnWidth: '组件列宽', + widgetSize: '组件大小', + showStops: '显示间断点', + displayStyle: '显示样式', + inlineLayout: '行内', + blockLayout: '块', + buttonStyle: '显示为按钮', + border: '带有边框', + labelWidth: '标签宽度', + rows: '行数', + labelHidden: '隐藏字段标签', + required: '必填字段', + validation: '字段校验', + validationHelp: '支持输入正则表达式', + validationHint: '校验失败提示', + readonly: '只读', + disabled: '禁用', + hidden: '隐藏', + textContent: '静态文字', + htmlContent: 'HTML', + clearable: '可清除', + editable: '可输入', + format: '显示格式', + valueFormat: '绑定值格式', + showPassword: '可显示密码', + filterable: '可搜索选项', + allowCreate: '允许创建选项', + remote: '可远程搜索', + automaticDropdown: '自动弹出选项', + multiple: '选项可多选', + multipleLimit: '多选数量限制', + contentPosition: '文字位置', + plain: '朴素按钮', + round: '圆角按钮', + circle: '圆形按钮', + icon: '图标', + optionsSetting: '选项设置', + addOption: '增加选项', + importOptions: '导入选项', + resetDefault: '重设选中项', + uploadSetting: '上传参数设置', + uploadURL: '上传地址', + uploadTip: '上传提示内容', + withCredentials: '发送cookie凭证', + multipleSelect: '文件可多选', + showFileList: '显示文件列表', + limit: '最大上传数量', + fileMaxSize: '文件大小限制(MB)', + fileTypes: '上传文件类型', + fileTypesHelp: '支持添加其他文件类型', + headers: '上传请求头', + + cellWidth: '宽度', + cellHeight: '高度', + gridColHeight: '栅格列统一高度(px)', + gutter: '栅格间隔(px)', + columnSetting: '栅格属性设置', + colsOfGrid: '当前栅格列:', + colSpanTitle: '栅格宽度', + colOffsetTitle: '左侧间隔格数', + colPushTitle: '右移栅格数', + colPullTitle: '左移栅格数', + addColumn: '增加栅格', + responsive: '响应式布局', + + tabPaneSetting: '选项卡设置', + addTabPane: '增加选项卡页', + paneActive: '激活', + + customLabelIcon: '定制字段标签', + labelIconClass: '标签Icon样式', + labelIconPosition: '标签Icon位置', + labelTooltip: '标签文字提示', + minValue: '最小值', + maxValue: '最大值', + precision: '精度', + step: '增减步长', + controlsPosition: '控制按钮位置', + minLength: '最小长度', + maxLength: '最大长度', + showWordLimit: '显示字数统计', + prefixIcon: '头部Icon', + suffixIcon: '尾部Icon', + inputButton: '输入框按钮设置', + appendButton: '添加后置按钮', + appendButtonDisabled: '后置按钮禁用', + appendButtonIcon: '后置按钮Icon', + buttonIcon: '按钮Icon', + switchWidth: '开关宽度(像素)', + activeText: '开启时文字描述', + inactiveText: '关闭时文字描述', + activeColor: '开启时背景色', + inactiveColor: '关闭时背景色', + maxStars: '最大评分值', + lowThreshold: '低分界限值', + highThreshold: '高分界限值', + allowHalf: '允许半选', + showText: '显示辅助文字', + showScore: '显示当前分数', + range: '是否为范围选择', + vertical: '是否竖向显示', + showBlankRow: '默认显示新行', + showRowNumber: '显示行号', + + insertColumnToLeft: '插入左侧列', + insertColumnToRight: '插入右侧列', + insertRowAbove: '插入上方行', + insertRowBelow: '插入下方行', + mergeLeftColumn: '合并左侧单元格', + mergeRightColumn: '合并右侧单元格', + mergeEntireRow: '合并整行', + mergeRowAbove: '合并上方单元格', + mergeRowBelow: '合并下方单元格', + mergeEntireColumn: '合并整列', + undoMergeCol: '撤销列合并', + undoMergeRow: '撤销行合并', + deleteEntireCol: '删除整列', + deleteEntireRow: '删除整行', + + widgetName: '组件唯一名称', + formSize: '全局组件大小', + labelPosition: '字段标签位置', + topPosition: '顶部', + leftPosition: '左边', + labelAlign: '字段标签对齐', + leftAlign: '居左', + centerAlign: '居中', + rightAlign: '居右', + formCss: '表单全局CSS', + addCss: '编写CSS', + customClass: '自定义CSS样式', + globalFunctions: '表单全局函数', + addEventHandler: '编写代码', + editWidgetEventHandler: '组件事件处理', + editFormEventHandler: '表单事件处理', + formSFCSetting: '生成SFC设置', + formModelName: '数据对象名称', + formRefName: '引用名称', + formRulesName: '验证规则名称', + + } + + } +} diff --git a/src/lang/zh-CN_extension.js b/src/lang/zh-CN_extension.js new file mode 100644 index 0000000..907e38e --- /dev/null +++ b/src/lang/zh-CN_extension.js @@ -0,0 +1,26 @@ +export default { + extension: { + widgetLabel: { + card: '卡片', + alert: '提示', + }, + + setting: { + cardFolded: '是否收起', + cardShowFold: '显示折叠按钮', + cardWidth: '卡片宽度', + cardShadow: '显示阴影', + + alertTitle: '标题', + alertType: '类型', + description: '辅助性文字', + closable: '是否可关闭', + closeText: '关闭按钮文字', + center: '文字居中', + showIcon: '显示图标', + effect: '显示效果', + + }, + + } +} diff --git a/src/lang/zh-CN_render.js b/src/lang/zh-CN_render.js new file mode 100644 index 0000000..1dd74c4 --- /dev/null +++ b/src/lang/zh-CN_render.js @@ -0,0 +1,38 @@ +export default { + render: { + + hint: { + prompt: '提示', + confirm: '确定', + cancel: '取消', + + selectPlaceholder: '请选择', + timePlaceholder: '选择时间', + startTimePlaceholder: '起始时间', + endTimePlaceholder: '截止时间', + datePlaceholder: '选择日期', + startDatePlaceholder: '起始日期', + endDatePlaceholder: '截止日期', + blankCellContent: '--', + + uploadError: '上传错误: ', + uploadExceed: '最大上传数量(${uploadLimit})已超出.', + unsupportedFileType: '不支持格式: ', + fileSizeExceed: '文件大小已超出: ', + refNotFound: '组件未找到: ', + fieldRequired: '字段值不可为空', + invalidNumber: '数据格式错误', + selectFile: ' 选择文件', + downloadFile: '下载', + removeFile: '移除', + validationFailed: '表单数据校验失败', + + subFormAction: '操作', + subFormAddAction: '新增', + subFormAddActionHint: '新增行', + insertSubFormRow: '插入行', + deleteSubFormRow: '删除行', + nonSubFormType: '组件类型不是子表单', + } + } +} diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..7fdad3f --- /dev/null +++ b/src/main.js @@ -0,0 +1,33 @@ +import { createApp } from 'vue' +import axios from "axios" +import App from './App.vue' +import ElementPlus from 'element-plus' +import 'element-plus/dist/index.css' +import '@/styles/index.scss' +import SvgIcon from '@/components/svg-icon/index' //svg组件 +import 'virtual:svg-icons-register' + + +import ContainerWidgets from '@/components/form-designer/form-widget/container-widget/index' +import ContainerItems from '@/components/form-render/container-item/index' + +import { addDirective } from '@/utils/directive' +import { installI18n } from '@/utils/i18n' +import { loadExtension } from '@/extension/extension-loader' + +if (typeof window !== 'undefined') { + window.axios = axios +} + +const vfApp = createApp(App) + +vfApp.use(ElementPlus) +vfApp.component('svg-icon', SvgIcon) +addDirective(vfApp) +installI18n(vfApp) + +vfApp.use(ContainerWidgets) +vfApp.use(ContainerItems) +loadExtension(vfApp) + +vfApp.mount('#app') diff --git a/src/styles/global.scss b/src/styles/global.scss new file mode 100644 index 0000000..e140a94 --- /dev/null +++ b/src/styles/global.scss @@ -0,0 +1,103 @@ +/* 全局css变量 */ +$--color-primary: #409EFF; + +.primary-color { + color: $--color-primary; +} + +.background-opacity { + background: rgba(64, 158, 255, 0.6); +} + +.form-widget-list { + + .ghost{ + content: ''; + font-size: 0; + height: 3px; + box-sizing: border-box; + background: $--color-primary; + border: 2px solid $--color-primary; + outline-width: 0; + padding: 0; + overflow: hidden; + } +} + +.el-form-item--medium { + .el-radio { + line-height: 36px !important; + } + + .el-rate{ + margin-top: 8px; + } +} + +.el-form-item--small { + .el-radio { + line-height: 32px !important; + } + + .el-rate{ + margin-top: 6px; + } +} + +.el-form-item--mini { + .el-radio { + line-height: 28px !important; + } + + .el-rate{ + margin-top: 4px; + } +} + +input[type="password"]::-ms-reveal { /* 隐藏IE/Edge原生的密码查看按钮 */ + display: none; +} + +/* 滚动条样式 begin */ +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + width: 8px; + background: rgba(#101F1C, 0.1); + -webkit-border-radius: 2em; + -moz-border-radius: 2em; + border-radius: 2em; +} + +::-webkit-scrollbar-thumb { + background-color: rgba(#101F1C, 0.35); + background-clip: padding-box; + min-height: 28px; + -webkit-border-radius: 2em; + -moz-border-radius: 2em; + border-radius: 2em; +} + +::-webkit-scrollbar-thumb:hover { + background-color: rgba(#101F1C, 0.85); +} + +* {//Firefox浏览器滚动条样式 + scrollbar-color: #e5e5e5 #f7f7f9; //滚动条轨道颜色、滚动条滑块的颜色 + scrollbar-width: thin; //thin模式下滚动条两端的三角按钮会消失 +} + + +/* +body {//IE浏览器滚动条样式 + scrollbar-shadow-color: #e5e5e5; + scrollbar-face-color: #e5e5e5; + scrollbar-base-color: #ffffff; + scrollbar-arrow-color: #444040; +} +*/ + +/* 滚动条样式 end */ diff --git a/src/styles/index.scss b/src/styles/index.scss new file mode 100644 index 0000000..ebb3bc7 --- /dev/null +++ b/src/styles/index.scss @@ -0,0 +1,15 @@ + +html { + height: 100%; + box-sizing: border-box; +} + +body { + height: 100%; + margin: 0; /* */ + background-color: #ffffff; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif; +} diff --git a/src/utils/beautifierLoader.js b/src/utils/beautifierLoader.js new file mode 100644 index 0000000..3736b8f --- /dev/null +++ b/src/utils/beautifierLoader.js @@ -0,0 +1,77 @@ +import {loadRemoteScript} from "@/utils/util"; +import {BEAUTIFIER_PATH} from "@/utils/config"; + +let beautifierObj + +export const beautifierOpts = { + html: { + indent_size: '2', + indent_char: ' ', + max_preserve_newlines: '-1', + preserve_newlines: false, + keep_array_indentation: false, + break_chained_methods: false, + indent_scripts: 'separate', + brace_style: 'end-expand', + space_before_conditional: true, + unescape_strings: false, + jslint_happy: false, + end_with_newline: true, + wrap_line_length: '110', + indent_inner_html: true, + comma_first: false, + e4x: true, + indent_empty_lines: true + }, + js: { + indent_size: '2', + indent_char: ' ', + max_preserve_newlines: '-1', + preserve_newlines: false, + keep_array_indentation: false, + break_chained_methods: false, + indent_scripts: 'normal', + brace_style: 'end-expand', + space_before_conditional: true, + unescape_strings: false, + jslint_happy: true, + end_with_newline: true, + wrap_line_length: '110', + indent_inner_html: true, + comma_first: false, + e4x: true, + indent_empty_lines: true + }, + css: { + indent_size: '2', + indent_char: ' ', + max_preserve_newlines: '-1', + preserve_newlines: false, + keep_array_indentation: false, + break_chained_methods: false, + indent_scripts: 'normal', + brace_style: 'end-expand', + space_before_conditional: true, + unescape_strings: false, + jslint_happy: true, + end_with_newline: true, + wrap_line_length: '110', + indent_inner_html: true, + comma_first: false, + e4x: true, + indent_empty_lines: true + } +} + +export default function loadBeautifier(callback) { + if (beautifierObj) { + callback(beautifierObj) + return + } + + loadRemoteScript(BEAUTIFIER_PATH, () => { + // eslint-disable-next-line no-undef + beautifierObj = beautifier //beautifier为全局对象 + callback(beautifierObj) + }) +} diff --git a/src/utils/code-generator.js b/src/utils/code-generator.js new file mode 100644 index 0000000..47aeed8 --- /dev/null +++ b/src/utils/code-generator.js @@ -0,0 +1,91 @@ +export const generateCode = function(formJson, codeType= 'vue') { + let formJsonStr = JSON.stringify(formJson) + + if (codeType === 'html') { + return ` + + + + + VForm Demo + + + + + + +
+ + + Submit +
+ + + + + + + +` + + } else { + return ` +` + + } +} diff --git a/src/utils/config.js b/src/utils/config.js new file mode 100644 index 0000000..2aeddc3 --- /dev/null +++ b/src/utils/config.js @@ -0,0 +1,19 @@ +export const DESIGNER_OPTIONS = { + showLanguageMenu: true, + showGetSourceURL: true, + showGithubURL: true, + showDocumentURL: true, + showChatGroup: true, + // + +} + +export const VARIANT_FORM_VERSION = '3.0.0' + +//export const MOCK_CASE_URL = 'https://www.fastmock.site/mock/2de212e0dc4b8e0885fea44ab9f2e1d0/vform/' +export const MOCK_CASE_URL = 'https://ks3-cn-beijing.ksyuncs.com/vform-static/vcase/' + +//export const ACE_BASE_PATH = 'public/lib/ace/src-min-noconflict' +export const ACE_BASE_PATH = 'https://ks3-cn-beijing.ksyun.com/vform2021/ace-mini' + +export const BEAUTIFIER_PATH= 'https://ks3-cn-beijing.ksyun.com/vform2021/js-beautify/1.14.0/beautifier.min.js' diff --git a/src/utils/create-app.js b/src/utils/create-app.js new file mode 100644 index 0000000..d9d1947 --- /dev/null +++ b/src/utils/create-app.js @@ -0,0 +1,4 @@ +import { createApp } from 'vue' +import App from '../App.vue' + +export const vfApp = createApp(App) \ No newline at end of file diff --git a/src/utils/debug-console.js b/src/utils/debug-console.js new file mode 100644 index 0000000..f4e6063 --- /dev/null +++ b/src/utils/debug-console.js @@ -0,0 +1,7 @@ +console.log = (function(logFunc) { + return function () { + if (process.env.NODE_ENV === 'development') { + logFunc.call(console, ...arguments); + } + } +})(console.log) diff --git a/src/utils/directive.js b/src/utils/directive.js new file mode 100644 index 0000000..4b66e0a --- /dev/null +++ b/src/utils/directive.js @@ -0,0 +1,151 @@ +//import { vfApp } from '@/utils/create-app' + +export function addDirective(app) { + + + /** + * 拖拽指令使用方式:v-drag="[dragDom, dragHeader]",如 `
` + */ + + app.directive('drag', { + mounted(el, binding) { + if (!binding.value) return false; + + const dragDom = document.querySelector(binding.value[0]) + const dragHeader = document.querySelector(binding.value[1]) + + dragHeader.onmouseover = () => (dragHeader.style.cursor = `move`); + + function down(e, type) { + // 鼠标按下,计算当前元素距离可视区的距离 + const disX = type === 'pc' ? e.clientX - dragHeader.offsetLeft : e.touches[0].clientX - dragHeader.offsetLeft; + const disY = type === 'pc' ? e.clientY - dragHeader.offsetTop : e.touches[0].clientY - dragHeader.offsetTop; + + // body当前宽度 + const screenWidth = document.body.clientWidth; + // 可见区域高度(应为body高度,可某些环境下无法获取) + const screenHeight = document.documentElement.clientHeight; + + // 对话框宽度 + const dragDomWidth = dragDom.offsetWidth; + // 对话框高度 + const dragDomheight = dragDom.offsetHeight; + + const minDragDomLeft = dragDom.offsetLeft; + const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth; + + const minDragDomTop = dragDom.offsetTop; + const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight; + + // 获取到的值带px 正则匹配替换 + let styL = getComputedStyle(dragDom).left; + let styT = getComputedStyle(dragDom).top; + + // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px + if (styL.includes('%')) { + styL = +document.body.clientWidth * (+styL.replace(/%/g, '') / 100); + styT = +document.body.clientHeight * (+styT.replace(/%/g, '') / 100); + } else { + styL = +styL.replace(/\px/g, ''); + styT = +styT.replace(/\px/g, ''); + } + + return { + disX, + disY, + minDragDomLeft, + maxDragDomLeft, + minDragDomTop, + maxDragDomTop, + styL, + styT, + }; + } + + function move(e, type, obj) { + let { disX, disY, minDragDomLeft, maxDragDomLeft, minDragDomTop, maxDragDomTop, styL, styT } = obj; + + // 通过事件委托,计算移动的距离 + let left = type === 'pc' ? e.clientX - disX : e.touches[0].clientX - disX; + let top = type === 'pc' ? e.clientY - disY : e.touches[0].clientY - disY; + + // 边界处理 + if (-left > minDragDomLeft) { + left = -minDragDomLeft; + } else if (left > maxDragDomLeft) { + left = maxDragDomLeft; + } + + if (-top > minDragDomTop) { + top = -minDragDomTop; + } else if (top > maxDragDomTop) { + top = maxDragDomTop; + } + + // 移动当前元素 + dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`; + } + + /** + * pc端 + * onmousedown 鼠标按下触发事件 + * onmousemove 鼠标按下时持续触发事件 + * onmouseup 鼠标抬起触发事件 + */ + dragHeader.onmousedown = (e) => { + const obj = down(e, 'pc'); + document.onmousemove = (e) => { + move(e, 'pc', obj); + }; + document.onmouseup = () => { + document.onmousemove = null; + document.onmouseup = null; + }; + }; + + /** + * 移动端 + * ontouchstart 当按下手指时,触发ontouchstart + * ontouchmove 当移动手指时,触发ontouchmove + * ontouchend 当移走手指时,触发ontouchend + */ + dragHeader.ontouchstart = (e) => { + const obj = down(e, 'app'); + document.ontouchmove = (e) => { + move(e, 'app', obj); + }; + document.ontouchend = () => { + document.ontouchmove = null; + document.ontouchend = null; + }; + }; + }, + }) + + // v-dialogDragWidth: 弹窗宽度拖大 拖小 + app.directive('dialogDragWidth', { + mounted(el, binding) { + const dragDom = binding.value.$el.querySelector('.el-dialog') + + el.onmousedown = (e) => { + // 鼠标按下,计算当前元素距离可视区的距离 + const disX = e.clientX - el.offsetLeft + + document.onmousemove = function(e) { + e.preventDefault() // 移动时禁用默认事件 + + // 通过事件委托,计算移动的距离 + const l = e.clientX - disX + dragDom.style.width = `${l}px` + } + + document.onmouseup = function(e) { + document.onmousemove = null + document.onmouseup = null + } + } + } + }) + +} + diff --git a/src/utils/emitter.js b/src/utils/emitter.js new file mode 100644 index 0000000..b6ccd7d --- /dev/null +++ b/src/utils/emitter.js @@ -0,0 +1,35 @@ + +function _broadcast(componentName, eventName, params) { + this.$children.forEach(function (child) { + var name = child.$options.componentName; + + if (name === componentName) { + child.$emit.apply(child, [eventName].concat(params)); + } else { + _broadcast.apply(child, [componentName, eventName].concat([params])); + } + }); +} + +export default { + methods: { + dispatch: function dispatch(componentName, eventName, params) { + var parent = this.$parent || this.$root; + var name = parent.$options.componentName; + + while (parent && (!name || name !== componentName)) { + parent = parent.$parent; + + if (parent) { + name = parent.$options.componentName; + } + } + if (parent) { + parent.$emit.apply(parent, [eventName].concat(params)); + } + }, + broadcast: function broadcast(componentName, eventName, params) { + _broadcast.call(this, componentName, eventName, params); + } + } +}; \ No newline at end of file diff --git a/src/utils/event-bus.js b/src/utils/event-bus.js new file mode 100644 index 0000000..c727da8 --- /dev/null +++ b/src/utils/event-bus.js @@ -0,0 +1,9 @@ +import mitt from 'mitt' + +const instance = mitt() +const eventBus = {} +eventBus.$on = instance.on +eventBus.$off = instance.off +eventBus.$emit = instance.emit + +export default eventBus diff --git a/src/utils/i18n.js b/src/utils/i18n.js new file mode 100644 index 0000000..1ac435d --- /dev/null +++ b/src/utils/i18n.js @@ -0,0 +1,76 @@ +import { createI18n } from 'vue-i18n' //引入vue-i18n组件 +//import { vfApp } from '@/utils/create-app' + +import enLocaleElement from "element-plus/lib/locale/lang/en"; +import zhLocaleElement from "element-plus/lib/locale/lang/zh-cn"; +//import locale from "element-plus/lib/locale" + +import enLocale from "@/lang/en-US"; +import zhLocale from "@/lang/zh-CN"; +import enLocale_render from "@/lang/en-US_render"; +import zhLocale_render from "@/lang/zh-CN_render"; +import enLocale_extension from "@/lang/en-US_extension"; +import zhLocale_extension from "@/lang/zh-CN_extension"; + +const langResources = { + 'en-US': { + something: { + //... + }, + ...enLocaleElement, + ...enLocale, + ...enLocale_render, + ...enLocale_extension + }, + + 'zh-CN': { + something: { + //... + }, + ...zhLocaleElement, + ...zhLocale, + ...zhLocale_render, + ...zhLocale_extension + } +} + +//locale.i18n((key, value) => i18n.t(key, value)) + +export const changeLocale = function(langName) { + i18n.locale = langName + localStorage.setItem('v_form_locale', langName) +} + +export const translate = function(key) { + return i18n.global.t(key, i18n.locale) + + //return key +} + +const i18n = createI18n({ + locale: localStorage.getItem('v_form_locale') || 'zh-CN', + messages: langResources +}) +//vfApp.use(i18n); + +export const installI18n = (app) => { + app.use(i18n) +} + +export default { + methods: { + i18nt(key) { + return i18n.global.t(key, i18n.locale) + + //return key + }, + + /* 如果key1不存在,则查找key2 */ + i18n2t(key1, key2) { + return i18n.global.te(key1, i18n.locale) ? i18n.global.t(key1, i18n.locale) : i18n.global.t(key2, i18n.locale) + + //return key1 + }, + + } +} diff --git a/src/utils/sfc-generator.js b/src/utils/sfc-generator.js new file mode 100644 index 0000000..adcd2b5 --- /dev/null +++ b/src/utils/sfc-generator.js @@ -0,0 +1,583 @@ +import {isNotNull} from "@/utils/util"; +import {genVue2JS} from "@/utils/vue2js-generator"; +import {beautifierOpts} from "@/utils/beautifierLoader"; +import {genVue3JS} from "@/utils/vue3js-generator"; + +export function buildClassAttr(ctn, defaultClass) { + const cop = ctn.options + let gridClassArray = [] + !!defaultClass && gridClassArray.push(defaultClass) + !!cop.customClass && (cop.customClass.length > 0) && gridClassArray.push(cop.customClass.join(' ')) + return gridClassArray.length > 0 ? `class="${gridClassArray.join(' ')}"` : '' +} + +const containerTemplates = { //容器组件属性 + 'grid': (ctn, formConfig) => { + const gridClassAttr = buildClassAttr(ctn) + const gridTemplate = +` +${ctn.cols.map(col => { + const colOpt = col.options + const spanAttr = !!colOpt.responsive ? '' : `:span="${colOpt.span}"` + const mdAttr = !colOpt.responsive ? '' : `:md="${colOpt.md}"` + const smAttr = !colOpt.responsive ? '' : `:sm="${colOpt.sm}"` + const xsAttr = !colOpt.responsive ? '' : `:xs="${colOpt.xs}"` + const offsetAttr = !!colOpt.offset ? `:offset="${colOpt.offset}"` : '' + const pushAttr = !!colOpt.push ? `:push="${colOpt.push}"` : '' + const pullAttr = !!colOpt.pull ? `:pull="${colOpt.pull}"` : '' + const colClassAttr = buildClassAttr(col, 'grid-cell') + return ` + ${col.widgetList.map(cw => { + if (cw.category === 'container') { + return buildContainerWidget(cw, formConfig) + } else { + return buildFieldWidget(cw, formConfig) + } + }).join('') + } + ` + }).join('') +} +` + + return gridTemplate + }, + + 'table': (ctn, formConfig) => { + const tableClassAttr = buildClassAttr(ctn, 'table-layout') + const tableTemplate = +`
+ + ${ctn.rows.map(tr => { + return `${ + tr.cols.filter(td => !td.merged).map(td => { + const tdOpt = td.options + const tdClassAttr = buildClassAttr(td, 'table-cell') + const colspanAttr = (!isNaN(tdOpt.colspan) && (tdOpt.colspan !== 1)) ? `colspan="${tdOpt.colspan}"` : '' + const rowspanAttr = (!isNaN(tdOpt.rowspan) && (tdOpt.rowspan !== 1)) ? `rowspan="${tdOpt.rowspan}"` : '' + + let tdStyleArray = [] + !!tdOpt.cellWidth && tdStyleArray.push('width: ' + tdOpt.cellWidth + ' !important') + !!tdOpt.cellHeight && tdStyleArray.push('height: ' + tdOpt.cellHeight + ' !important') + let tdStyleAttr = (tdStyleArray.length > 0) ? `style="${tdStyleArray.join(';')}"` : '' + + return `` + }).join('') + }` + }).join('') + } +
${td.widgetList.map(tw => { + if (tw.category === 'container') { + return buildContainerWidget(tw, formConfig) + } else { + return buildFieldWidget(tw, formConfig) + } + }).join('') + } +
+
` + return tableTemplate + }, + + 'tab': (ctn, formConfig) => { + const tabClassAttr = buildClassAttr(ctn) + const vModel = ctn.tabs && (ctn.tabs.length > 0) ? `v-model="${ctn.options.name}ActiveTab"` : '' + const tabTemplate = +`
+ + ${ctn.tabs.map(tab => { + const tabOpt = tab.options + const disabledAttr = (tabOpt.disabled === true) ? `disabled` : '' + return ` + ${tab.widgetList.map(tw => { + if (tw.category === 'container') { + return buildContainerWidget(tw, formConfig) + } else { + return buildFieldWidget(tw, formConfig) + } + }).join('') + }` + }).join('')} + +
` + + return tabTemplate + }, + + 'sub-form': (ctn, formConfig) => { + //TODO: + }, + +} + +export function buildContainerWidget(widget, formConfig) { + return containerTemplates[widget.type] ? containerTemplates[widget.type](widget, formConfig) : null +} + +function getElAttrs(widget, formConfig) { //获取El组件属性 + let wop = widget.options + return { + vModel: `v-model="${formConfig.modelName}.${wop.name}"`, + readonly: wop.readonly ? `readonly="true"` : '', + disabled: wop.disabled ? `:disabled="true"` : '', + size: !!wop.size ? `size="${wop.size}"` : '', + type: !!wop.type ? `type="${wop.type === 'number' ? 'text' : wop.type}"` : '', + showPassword: !!wop.showPassword ? `:show-password="${wop.showPassword}"` : '', + placeholder: !!wop.placeholder ? `placeholder="${wop.placeholder}"` : '', + rows: (isNotNull(wop.rows) && !isNaN(wop.rows)) ? `rows="${wop.rows}"` : '', + clearable: !!wop.clearable ? 'clearable' : '', + minlength: (isNotNull(wop.minLength) && !isNaN(wop.minLength)) ? `:minlength="${wop.minLength}"` : '', + maxlength: (isNotNull(wop.maxLength) && !isNaN(wop.maxLength)) ? `:maxlength="${wop.maxLength}"` : '', + showWordLimit: !!wop.showWordLimit ? `:show-word-limit="true"`: '', + prefixIcon: !!wop.prefixIcon ? `prefix-icon="${wop.prefixIcon}"` : '', + suffixIcon: !!wop.suffixIcon ? `suffix-icon="${wop.suffixIcon}"` : '', + controlsPosition: wop.controlsPosition === 'right' ? `controls-position="right"` : '', + min: (isNotNull(wop.min) && !isNaN(wop.min)) ? `:min="${wop.min}"` : '', + max: (isNotNull(wop.max) && !isNaN(wop.max)) ? `:max="${wop.max}"` : '', + precision: (isNotNull(wop.precision) && !isNaN(wop.precision)) ? `:precision="${wop.precision}"` : '', + step: (isNotNull(wop.step) && !isNaN(wop.step)) ? `:step="${wop.step}"` : '', + filterable: !!wop.filterable ? `filterable` : '', + allowCreate: !!wop.allowCreate ? `allow-create` : '', + defaultFirstOption: (!!wop.filterable && !!wop.allowCreate) ? `default-first-option` : '', + multiple: !!wop.multiple ? `multiple` : '', + multipleLimit: (!isNaN(wop.multipleLimit) && (wop.multipleLimit > 0)) ? `:multiple-limit="${wop.multipleLimit}"` : '', + automaticDropdown: !!wop.automaticDropdown ? `automatic-dropdown` : '', + remote: !!wop.remote ? `remote` : '', + format: !!wop.format ? `format="${wop.format}"` : '', + valueFormat: !!wop.valueFormat ? `value-format="${wop.valueFormat}"` : '', + editable: !!wop.editable ? `:editable="${wop.editable}"` : '', + startPlaceholder: !!wop.startPlaceholder ? `start-placeholder="${wop.startPlaceholder}"` : '', + endPlaceholder: !!wop.endPlaceholder ? `end-placeholder="${wop.endPlaceholder}"` : '', + + activeText: !!wop.activeText ? `active-text="${wop.activeText}"` : '', + inactiveText: !!wop.inactiveText ? `inactive-text="${wop.inactiveText}"` : '', + activeColor: !!wop.activeColor ? `active-color="${wop.activeColor}"` : '', + inactiveColor: !!wop.inactiveColor ? `inactive-color="${wop.inactiveColor}"` : '', + switchWidth: (!isNaN(wop.switchWidth) && (wop.switchWidth !== 40)) ? `:width="${wop.switchWidth}"` : '', + + rateMax: (!isNaN(wop.max) && (wop.max !== 5)) ? `:max="${wop.max}"` : '', + lowThreshold: (!isNaN(wop.lowThreshold) && (wop.lowThreshold !== 2)) ? `:low-threshold="${wop.lowThreshold}"` : '', + highThreshold: (!isNaN(wop.highThreshold) && (wop.highThreshold !== 4)) ? `:high-threshold="${wop.highThreshold}"` : '', + allowHalf: !!wop.allowHalf ? `allow-half` : '', + showText: !!wop.showText ? `show-text` : '', + showScore: !!wop.showScore ? `show-score` : '', + + sliderMin: (!isNaN(wop.min) && (wop.min !== 0)) ? `:min="${wop.min}"` : '', + sliderMax: (!isNaN(wop.max) && (wop.max !== 100)) ? `:max="${wop.max}"` : '', + sliderStep: (!isNaN(wop.step) && (wop.step !== 1)) ? `:step="${wop.step}"` : '', + sliderRange: !!wop.range ? `range` : '', + sliderVertical: !!wop.vertical ? `vertical` : '', + + uploadAction: !!wop.uploadURL ? `action="${wop.uploadURL}"` : '', + withCredentials: !!wop.withCredentials ? `with-credentials` : '', + multipleSelect: !!wop.multipleSelect ? `multiple` : '', + showFileList: !!wop.showFileList ? `show-file-list` : '', + limit: !isNaN(wop.limit) ? `:limit="${wop.limit}"` : '', + uploadTipSlotChild: !!wop.uploadTip ? `` : '', + pictureUploadIconChild: ``, + fileUploadIconChild: ``, + + buttonType: !!wop.type ? `type="${wop.type}` : '', + buttonPlain: !!wop.plain ? `plain` : '', + buttonRound: !!wop.round ? `round` : '', + buttonCircle: !!wop.circle ? `circle` : '', + buttonIcon: !!wop.icon ? `icon="${wop.icon}"` : '', + + contentPosition: (!!wop.contentPosition && (wop.contentPosition !== 'center')) ? `content-position="${wop.contentPosition}"` : '', + + appendButtonChild: !!wop.appendButton ? `` : '', + } +} + +function buildRadioChildren(widget, formConfig) { + let wop = widget.options + const childTag = !!wop.buttonStyle ? 'el-radio-button' : 'el-radio' + const borderAttr = !!wop.border ? `border` : '' + const styleAttr = `style="{display: ${wop.displayStyle}}"` + return `<${childTag} v-for="(item, index) in ${wop.name}Options" :key="index" :label="item.value" + :disabled="item.disabled" ${borderAttr} ${styleAttr}>{{item.label}}` +} + +function buildCheckboxChildren(widget, formConfig) { + let wop = widget.options + const childTag = !!wop.buttonStyle ? 'el-checkbox-button' : 'el-checkbox' + const borderAttr = !!wop.border ? `border` : '' + const styleAttr = `style="{display: ${wop.displayStyle}}"` + return `<${childTag} v-for="(item, index) in ${wop.name}Options" :key="index" :label="item.value" + :disabled="item.disabled" ${borderAttr} ${styleAttr}>{{item.label}}` +} + +function buildSelectChildren(widget, formConfig) { + let wop = widget.options + const childTag = 'el-option' + return `<${childTag} v-for="(item, index) in ${wop.name}Options" :key="index" :label="item.value" + :value="item.value" :disabled="item.disabled">` +} + +const elTemplates = { //字段组件属性 + 'input': (widget, formConfig) => { + const {vModel, readonly, disabled, size, type, showPassword, placeholder, clearable, + minlength, maxlength, showWordLimit, prefixIcon, suffixIcon, appendButtonChild} = getElAttrs(widget, formConfig) + return `${appendButtonChild}` + }, + + 'textarea': (widget, formConfig) => { + const {vModel, readonly, disabled, size, type, showPassword, placeholder, rows, clearable, + minlength, maxlength, showWordLimit} = getElAttrs(widget, formConfig) + return `` + }, + + 'number': (widget, formConfig) => { + const {vModel, disabled, size, type, showPassword, placeholder, controlsPosition, min, max, precision, step + } = getElAttrs(widget, formConfig) + return `` + }, + + 'radio': (widget, formConfig) => { + const {vModel, disabled, size} = getElAttrs(widget, formConfig) + const radioOptions = buildRadioChildren(widget, formConfig) + return `${radioOptions}` + }, + + 'checkbox': (widget, formConfig) => { + const {vModel, disabled, size} = getElAttrs(widget, formConfig) + const checkboxOptions = buildCheckboxChildren(widget, formConfig) + return `${checkboxOptions}` + }, + + 'select': (widget, formConfig) => { + const {vModel, disabled, size, clearable, filterable, allowCreate, defaultFirstOption, automaticDropdown, + multiple, multipleLimit, remote, placeholder} = getElAttrs(widget, formConfig) + const selectOptions = buildSelectChildren(widget, formConfig) + return `${selectOptions}` + }, + + 'time': (widget, formConfig) => { + const {vModel, readonly, disabled, size, placeholder, clearable, format, editable + } = getElAttrs(widget, formConfig) + return `` + }, + + 'time-range': (widget, formConfig) => { + const {vModel, readonly, disabled, size, startPlaceholder, endPlaceholder, clearable, format, editable + } = getElAttrs(widget, formConfig) + return `` + }, + + 'date': (widget, formConfig) => { + const {vModel, readonly, disabled, size, type, placeholder, clearable, format, valueFormat, editable + } = getElAttrs(widget, formConfig) + return `` + }, + + 'date-range': (widget, formConfig) => { + const {vModel, readonly, disabled, size, type, startPlaceholder, endPlaceholder, clearable, format, valueFormat, editable + } = getElAttrs(widget, formConfig) + return `` + }, + + 'switch': (widget, formConfig) => { + const {vModel, disabled, activeText, inactiveText, activeColor, inactiveColor, switchWidth + } = getElAttrs(widget, formConfig) + return `` + }, + + 'rate': (widget, formConfig) => { + const {vModel, disabled, rateMax, lowThreshold, highThreshold, allowHalf, showText, + showScore} = getElAttrs(widget, formConfig) + return `` + }, + + 'color': (widget, formConfig) => { + const {vModel, disabled, size + } = getElAttrs(widget, formConfig) + return `` + }, + + 'slider': (widget, formConfig) => { + const {vModel, disabled, sliderMin, sliderMax, sliderStep, sliderRange, sliderVertical + } = getElAttrs(widget, formConfig) + return `` + }, + + 'picture-upload': (widget, formConfig) => { + const {vModel, disabled, uploadAction, withCredentials, multipleSelect, showFileList, limit, + uploadTipSlotChild, pictureUploadIconChild} = getElAttrs(widget, formConfig) + let wop = widget.options + return `${uploadTipSlotChild} ${pictureUploadIconChild}` + }, + + 'file-upload': (widget, formConfig) => { + const {vModel, disabled, uploadAction, withCredentials, multipleSelect, showFileList, limit, + uploadTipSlotChild, fileUploadIconChild} = getElAttrs(widget, formConfig) + let wop = widget.options + return `${uploadTipSlotChild} ${fileUploadIconChild}` + }, + + 'rich-editor': (widget, formConfig) => { + const {vModel, disabled, placeholder + } = getElAttrs(widget, formConfig) + return `` + }, + + 'cascader': (widget, formConfig) => { + const {vModel, disabled, size, clearable, filterable, placeholder} = getElAttrs(widget, formConfig) + let wop = widget.options + const optionsAttr = `:options="${wop.name}Options"` + return `` + }, + + 'static-text': (widget, formConfig) => { + return `
${widget.options.textContent}
` + }, + + 'html-text': (widget, formConfig) => { + return `
` + }, + + 'button': (widget, formConfig) => { + const {buttonType, buttonPlain, buttonRound, buttonCircle, buttonIcon, disabled} = getElAttrs(widget, formConfig) + return `${widget.options.label}` + }, + + 'divider': (widget, formConfig) => { + const {contentPosition} = getElAttrs(widget, formConfig) + return `` + }, + +} + +export function buildFieldWidget(widget, formConfig) { + let wop = widget.options + const label = wop.labelHidden ? '' : wop.label + const labelWidthAttr = wop.labelHidden ? `label-width="0"` : (!!wop.labelWidth ? `label-width="${wop.labelWidth}px"` : '') + const labelTooltipAttr = wop.labelTooltip ? `title="${wop.labelTooltip}"` : '' + const propAttr = `prop="${wop.name}"` + + let classArray = [] + !!wop.required && classArray.push('required') + !!wop.customClass && (wop.customClass.length > 0) && classArray.push(wop.customClass.join(' ')) + if (!!wop.labelAlign) { + wop.labelAlign !== 'label-left-align' && classArray.push(wop.labelAlign) + } else if (!!widget.formItemFlag) { + //classArray.push(formConfig.labelAlign || 'label-left-align') + formConfig.labelAlign !== 'label-left-align' && classArray.push(formConfig.labelAlign) + } + if (!widget.formItemFlag) { + classArray.push('static-content-item') + } + const classAttr = (classArray.length > 0) ? `class="${classArray.join(' ')}"` : '' + + let customLabelDom = +`` + !wop.labelIconClass && (customLabelDom = '') + + const fwDom = elTemplates[widget.type] ? elTemplates[widget.type](widget, formConfig) : null + const isFormItem = !!widget.formItemFlag + const vShowAttr = !!wop.hidden ? `v-show="false"` : '' + return isFormItem ? +` + ${customLabelDom} + ${fwDom} +` + : +`
${fwDom}
` +} + +function genTemplate(formConfig, widgetList, vue3Flag = false) { + const submitAttr = !!vue3Flag ? `@submit.prevent` : `@submit.native.prevent` + let childrenList = [] + widgetList.forEach(wgt => { + if (wgt.category === 'container') { + childrenList.push( buildContainerWidget(wgt, formConfig) ) + } else { + childrenList.push( buildFieldWidget(wgt, formConfig) ) + } + }) + + const formTemplate = +` + ${!!childrenList ? childrenList.join('\n') : ''} +` + + return formTemplate +} + +const genGlobalCSS = function (formConfig) { + const globalCssTemplate = +` .el-input-number.full-width-input, .el-cascader.full-width-input { + width: 100% !important; + } + + .el-form-item--medium { + .el-radio { + line-height: 36px !important; + } + + .el-rate{ + margin-top: 8px; + } + } + + .el-form-item--small { + .el-radio { + line-height: 32px !important; + } + + .el-rate{ + margin-top: 6px; + } + } + + .el-form-item--mini { + .el-radio { + line-height: 28px !important; + } + + .el-rate{ + margin-top: 4px; + } + } + + .clear-fix:before, .clear-fix:after { + display: table; + content: ""; + } + + .clear-fix:after { + clear: both; + } + + .float-right { + float: right; + } + +${formConfig.cssCode}` + + return globalCssTemplate +} + +const genScopedCSS = function (formConfig, vue3Flag = false) { + //const vDeep = !!vue3Flag ? `::v-deep` : `:deep` + const cssTemplate = +` div.table-container { + table.table-layout { + width: 100%; + table-layout: fixed; + border-collapse: collapse; + + td.table-cell { + display: table-cell; + height: 36px; + border: 1px solid #e1e2e3; + } + } + } + + div.tab-container { + } + + .label-left-align ${!!vue3Flag ? `:deep(.el-form-item__label)` : `::v-deep .el-form-item__label`} { + text-align: left; + } + + .label-center-align ${!!vue3Flag ? `:deep(.el-form-item__label)` : `::v-deep .el-form-item__label`} { + text-align: center; + } + + .label-right-align ${!!vue3Flag ? `:deep(.el-form-item__label)` : `::v-deep .el-form-item__label`} { + text-align: right; + } + + .custom-label { + } + + .static-content-item { + min-height: 20px; + display: flex; + align-items: center; + + ${!!vue3Flag ? `:deep(.el-divider--horizontal)` : `::v-deep .el-divider--horizontal`} { + margin: 0; + } + }` + + return cssTemplate +} + +/** + * 注册容器组件的代码生成器 + * @param containerType 容器类型,必须唯一 + * @param ctGenerator 代码生成器函数,接收两个参数(containerWidget, formConfig),返回生成的容器组件代码 + */ +export const registerCWGenerator = function (containerType, ctGenerator) { + containerTemplates[containerType] = ctGenerator +} + +/** + * 注册字段组件的代码生成器 + * @param fieldType 字段类型,必须唯一 + * @param ftGenerator 代码生成器函数,接收两个参数(fieldWidget, formConfig),返回生成的字段组件代码 + */ +export const registerFWGenerator = function (fieldType, ftGenerator) { + elTemplates[fieldType] = ftGenerator +} + +export const genSFC = function (formConfig, widgetList, beautifier, vue3Flag = false) { + const html = beautifier.html(genTemplate(formConfig, widgetList, vue3Flag), beautifierOpts.html) + const js = beautifier.js(!!vue3Flag ? genVue3JS(formConfig, widgetList): genVue2JS(formConfig, widgetList), beautifierOpts.js) + const globalCss = beautifier.css(genGlobalCSS(formConfig), beautifierOpts.css) + const scopedCss = beautifier.css(genScopedCSS(formConfig, vue3Flag), beautifierOpts.css) + + return ` + + + + + + + +` +} diff --git a/src/utils/util.js b/src/utils/util.js new file mode 100644 index 0000000..71c3c75 --- /dev/null +++ b/src/utils/util.js @@ -0,0 +1,232 @@ +import Clipboard from 'clipboard' + +export function isNull(value) { + return (value === null) || (value === undefined); +} + +export function isNotNull(value) { + return (value !== null) && (value !== undefined); +} + +export function isEmptyStr(str) { + //return (str === undefined) || (!str) || (!/[^\s]/.test(str)); + return (str === undefined) || (!str && (str !== 0) && (str !== '0')) || (!/[^\s]/.test(str)); +} + +export const generateId = function() { + return Math.floor(Math.random() * 100000 + Math.random() * 20000 + Math.random() * 5000); +}; + +export const deepClone = function (origin) { + if (origin === undefined) { + return undefined + } + + return JSON.parse(JSON.stringify(origin)) +} + +export const overwriteObj = function(obj1, obj2) { /* 浅拷贝对象属性,obj2覆盖obj1 */ + // for (let prop in obj2) { + // if (obj2.hasOwnProperty(prop)) { + // obj1[prop] = obj2[prop] + // } + // } + + Object.keys(obj2).forEach(prop => { + obj1[prop] = obj2[prop] + }) +} + +export const addWindowResizeHandler = function (handler) { + let oldHandler = window.onresize + if (typeof window.onresize != 'function') { + window.onresize = handler + } else { + window.onresize = function () { + oldHandler() + handler() + } + } +} + +const createStyleSheet = function() { + let head = document.head || document.getElementsByTagName('head')[0]; + let style = document.createElement('style'); + style.type = 'text/css'; + head.appendChild(style); + return style.sheet; +} + +export const insertCustomCssToHead = function (cssCode) { + let head = document.getElementsByTagName('head')[0] + let oldStyle = document.getElementById('vform-custom-css') + if (!!oldStyle) { + head.removeChild(oldStyle) //应该先清除后插入!! + } + + let newStyle = document.createElement('style') + newStyle.type = 'text/css' + newStyle.rel = 'stylesheet' + newStyle.id = 'vform-custom-css' + try { + newStyle.appendChild(document.createTextNode(cssCode)) + } catch(ex) { + newStyle.styleSheet.cssText = cssCode + } + + head.appendChild(newStyle) +} + +export const insertGlobalFunctionsToHtml = function (functionsCode) { + let bodyEle = document.getElementsByTagName('body')[0] + let oldScriptEle = document.getElementById('v_form_global_functions') + !!oldScriptEle && bodyEle.removeChild(oldScriptEle) + + let newScriptEle = document.createElement('script') + newScriptEle.id = 'v_form_global_functions' + newScriptEle.type = 'text/javascript' + newScriptEle.innerHTML = functionsCode + bodyEle.appendChild(newScriptEle) +} + +export const optionExists = function(optionsObj, optionName) { + if (!optionsObj) { + return false + } + + return Object.keys(optionsObj).indexOf(optionName) > -1 +} + +export const loadRemoteScript = function(srcPath, callback) { /*加载远程js,加载成功后执行回调函数*/ + let sid = encodeURIComponent(srcPath) + let oldScriptEle = document.getElementById(sid) + + if (!oldScriptEle) { + let s = document.createElement('script') + s.src = srcPath + s.id = sid + document.body.appendChild(s) + + s.onload = s.onreadystatechange = function (_, isAbort) { /* 借鉴自ace.js */ + if (isAbort || !s.readyState || s.readyState === "loaded" || s.readyState === "complete") { + s = s.onload = s.onreadystatechange = null + if (!isAbort) { + callback() + } + } + } + } +} + +export function traverseFieldWidgets(widgetList, handler) { + widgetList.map(w => { + if (w.formItemFlag) { + handler(w) + } else if (w.type === 'grid') { + w.cols.map(col => { + traverseFieldWidgets(col.widgetList, handler) + }) + } else if (w.type === 'table') { + w.rows.map(row => { + row.cols.map(cell => { + traverseFieldWidgets(cell.widgetList, handler) + }) + }) + } else if (w.type === 'tab') { + w.tabs.map(tab => { + traverseFieldWidgets(tab.widgetList, handler) + }) + } else if (w.type === 'sub-form') { + traverseFieldWidgets(w.widgetList, handler) + } else if (w.category === 'container') { //自定义容器 + traverseFieldWidgets(w.widgetList, handler) + } + }) +} + +export function traverseContainWidgets(widgetList, handler) { + widgetList.map(w => { + if (w.category === 'container') { + handler(w) + } + + if (w.type === 'grid') { + w.cols.map(col => { + traverseContainWidgets(col.widgetList, handler) + }) + } else if (w.type === 'table') { + w.rows.map(row => { + row.cols.map(cell => { + traverseContainWidgets(cell.widgetList, handler) + }) + }) + } else if (w.type === 'tab') { + w.tabs.map(tab => { + traverseContainWidgets(tab.widgetList, handler) + }) + } else if (w.type === 'sub-form') { + traverseContainWidgets(w.widgetList, handler) + } else if (w.category === 'container') { //自定义容器 + traverseContainWidgets(w.widgetList, handler) + } + }) +} + +export function traverseAllWidgets(widgetList, handler) { + widgetList.map(w => { + handler(w) + + if (w.type === 'grid') { + w.cols.map(col => { + handler(col) + traverseAllWidgets(col.widgetList, handler) + }) + } else if (w.type === 'table') { + w.rows.map(row => { + row.cols.map(cell => { + handler(cell) + traverseAllWidgets(cell.widgetList, handler) + }) + }) + } else if (w.type === 'tab') { + w.tabs.map(tab => { + traverseAllWidgets(tab.widgetList, handler) + }) + } else if (w.type === 'sub-form') { + traverseAllWidgets(w.widgetList, handler) + } else if (w.category === 'container') { //自定义容器 + traverseAllWidgets(w.widgetList, handler) + } + }) +} + +export function copyToClipboard(content, clickEvent, $message, successMsg, errorMsg) { + const clipboard = new Clipboard(clickEvent.target, { + text: () => content + }) + + clipboard.on('success', () => { + $message.success(successMsg) + clipboard.destroy() + }) + + clipboard.on('error', () => { + $message.error(errorMsg) + clipboard.destroy() + }) + + clipboard.onClick(clickEvent) +} + +export function getQueryParam(variable) { + let query = window.location.search.substring(1); + let vars = query.split("&") + for (let i=0; i 0 && resultList.push(`${fop.name}: [${fieldRules.join(',')}],`) + } +} + +export function buildFieldOptionsFn(formConfig, widgetList, resultList) { + return function(fieldWidget) { + const fop = fieldWidget.options + const ft = fieldWidget.type + if ((ft === 'radio') || (ft === 'checkbox') || (ft === 'select') || (ft === 'cascader')) { + resultList.push(`${fop.name}Options: ${JSON.stringify(fop.optionItems)},`) + } + } +} + +export function buildUploadDataFn(formConfig, widgetList, resultList) { + return function(fieldWidget) { + const fop = fieldWidget.options + const ft = fieldWidget.type + if ((ft === 'picture-upload') || (ft === 'file-upload')) { + resultList.push(`${fop.name}FileList: [],`) + resultList.push(`${fop.name}UploadHeaders: {},`) + resultList.push(`${fop.name}UploadData: {},`) + } + } +} + +export function buildActiveTabs(formConfig, widgetList) { + let resultList = [] + const handlerFn = function (cw) { + const cop = cw.options + const ct = cw.type + if (ct === 'tab') { + cw.tabs.length > 0 && resultList.push(`'${cop.name}ActiveTab': '${cw.tabs[0].options.name}',`) + } + } + traverseContainWidgets(widgetList, handlerFn) + + return resultList +} + +export const genVue2JS = function (formConfig, widgetList) { + let defaultValueList = [] + let rulesList = [] + let fieldOptions = [] + let uploadData = [] + traverseFieldWidgets(widgetList, (widget) => { + buildDefaultValueListFn(formConfig, widgetList, defaultValueList)(widget) + buildRulesListFn(formConfig, widgetList, rulesList)(widget) + buildFieldOptionsFn(formConfig, widgetList, fieldOptions)(widget) + buildUploadDataFn(formConfig, widgetList, uploadData)(widget) + }) + + const activeTabs = buildActiveTabs(formConfig, widgetList) + + const v2JSTemplate = +` export default { + components: {}, + props: {}, + data() { + return { + ${formConfig.modelName}: { + ${defaultValueList.join('\n')} + }, + + ${formConfig.rulesName}: { + ${rulesList.join('\n')} + }, + + ${activeTabs.join('\n')} + + ${fieldOptions.join('\n')} + + ${uploadData.join('\n')} + } + }, + computed: {}, + watch: {}, + created() { + }, + mounted() { + }, + methods: { + submitForm() { + this.$refs['vForm'].validate(valid => { + if (!valid) return + + //TODO: 提交表单 + }) + }, + + resetForm() { + this.$refs['vForm'].resetFields() + } + } + }` + + return v2JSTemplate +} diff --git a/src/utils/vue3js-generator.js b/src/utils/vue3js-generator.js new file mode 100644 index 0000000..09a6208 --- /dev/null +++ b/src/utils/vue3js-generator.js @@ -0,0 +1,70 @@ +import { + buildActiveTabs, + buildDefaultValueListFn, + buildFieldOptionsFn, + buildRulesListFn, buildUploadDataFn +} from "@/utils/vue2js-generator"; +import {traverseFieldWidgets} from "@/utils/util"; + +export const genVue3JS = function (formConfig, widgetList) { + let defaultValueList = [] + let rulesList = [] + let fieldOptions = [] + let uploadData = [] + traverseFieldWidgets(widgetList, (widget) => { + buildDefaultValueListFn(formConfig, widgetList, defaultValueList)(widget) + buildRulesListFn(formConfig, widgetList, rulesList)(widget) + buildFieldOptionsFn(formConfig, widgetList, fieldOptions)(widget) + buildUploadDataFn(formConfig, widgetList, uploadData)(widget) + }) + + const activeTabs = buildActiveTabs(formConfig, widgetList) + + const v3JSTemplate = +` import { defineComponent, toRefs, reactive, getCurrentInstance } from 'vue' + + export default defineComponent({ + components: {}, + props: {}, + setup() { + const state = reactive({ + ${formConfig.modelName}: { + ${defaultValueList.join('\n')} + }, + + ${formConfig.rulesName}: { + ${rulesList.join('\n')} + }, + + ${activeTabs.join('\n')} + + ${fieldOptions.join('\n')} + + ${uploadData.join('\n')} + }) + + const instance = getCurrentInstance() + + const submitForm = () => { + instance.ctx.$refs['vForm'].validate(valid => { + if (!valid) return + + //TODO: 提交表单 + }) + } + + const resetForm = () => { + instance.ctx.$refs['vForm'].resetFields() + } + + return { + ...toRefs(state), + submitForm, + resetForm + } + } + })` + + return v3JSTemplate +} + diff --git a/variant-form3-vite.iml b/variant-form3-vite.iml new file mode 100644 index 0000000..8021953 --- /dev/null +++ b/variant-form3-vite.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..401e5cd --- /dev/null +++ b/vite.config.js @@ -0,0 +1,40 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' +import viteSvgIcons from 'vite-plugin-svg-icons' +import { resolve } from 'path' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + + //添加jsx/tsx支持 + vueJsx({}), + + viteSvgIcons({ + // Specify the icon folder to be cached + iconDirs: [resolve(process.cwd(), 'src/icons/svg')], + // Specify symbolId format + symbolId: 'icon-[dir]-[name]', + }), + + ], + + resolve: { + alias: { + "@": resolve(__dirname, 'src'), // 路径别名 + }, + extensions: ['.js', '.vue', '.json', '.ts'] // 使用路径别名时想要省略的后缀名,可以自己 增减 + }, + + css: { + preprocessorOptions: { + scss: { + /* 自动引入全局scss文件 */ + additionalData: '@import "./src/styles/global.scss";' + } + } + } + +})