From d3c60c5b8af28dd789f3df1e578cb85cf5fa8a26 Mon Sep 17 00:00:00 2001 From: vdpAdmin Date: Sat, 25 Dec 2021 19:36:55 +0800 Subject: [PATCH] =?UTF-8?q?Vue=203=E7=89=88=E6=9C=AC=E5=88=9D=E6=AC=A1?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=EF=BC=8C=E7=BB=A7=E7=BB=AD=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E4=B8=AD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 + .idea/.gitignore | 8 + .idea/misc.xml | 6 + .idea/modules.xml | 8 + .idea/vcs.xml | 7 + .vscode/extensions.json | 3 + README.md | 7 + index.html | 13 + jsconfig.json | 10 + package-lock.json | 3154 +++++++++++++++++ package.json | 38 + public/favicon.ico | Bin 0 -> 4286 bytes src/App.vue | 40 + src/assets/ft-images/t1.png | Bin 0 -> 33254 bytes src/assets/ft-images/t2.png | Bin 0 -> 35608 bytes src/assets/ft-images/t3.png | Bin 0 -> 41621 bytes src/assets/ft-images/t4.png | Bin 0 -> 30098 bytes src/assets/ft-images/t5.png | Bin 0 -> 56386 bytes src/assets/ft-images/t6.png | Bin 0 -> 32704 bytes src/assets/ft-images/t7.png | Bin 0 -> 68981 bytes src/assets/ft-images/t8.png | Bin 0 -> 50912 bytes src/assets/vform-logo.png | Bin 0 -> 453 bytes src/components/code-editor/index.vue | 135 + src/components/form-designer/designer.js | 929 +++++ .../container-widget/container-wrapper.vue | 108 + .../container-widget/containerMixin.js | 85 + .../container-widget/grid-col-widget.vue | 311 ++ .../container-widget/grid-widget.vue | 89 + .../form-widget/container-widget/index.js | 10 + .../container-widget/tab-widget.vue | 119 + .../container-widget/table-cell-widget.vue | 344 ++ .../container-widget/table-widget.vue | 111 + .../field-widget/button-widget.vue | 87 + .../field-widget/cascader-widget.vue | 104 + .../field-widget/checkbox-widget.vue | 105 + .../form-widget/field-widget/color-widget.vue | 99 + .../field-widget/date-range-widget.vue | 104 + .../form-widget/field-widget/date-widget.vue | 103 + .../field-widget/divider-widget.vue | 83 + .../form-widget/field-widget/fieldMixin.js | 546 +++ .../field-widget/file-upload-widget.vue | 278 ++ .../field-widget/form-item-wrapper.vue | 333 ++ .../field-widget/html-text-widget.vue | 82 + .../form-widget/field-widget/index.js | 9 + .../form-widget/field-widget/input-widget.vue | 114 + .../field-widget/number-widget.vue | 103 + .../field-widget/picture-upload-widget.vue | 225 ++ .../form-widget/field-widget/radio-widget.vue | 105 + .../form-widget/field-widget/rate-widget.vue | 102 + .../field-widget/rich-editor-widget.vue | 124 + .../field-widget/select-widget.vue | 115 + .../field-widget/slider-widget.vue | 100 + .../form-widget/field-widget/slot-widget.vue | 102 + .../field-widget/static-content-wrapper.vue | 189 + .../field-widget/static-text-widget.vue | 82 + .../field-widget/switch-widget.vue | 101 + .../field-widget/textarea-widget.vue | 99 + .../field-widget/time-range-widget.vue | 104 + .../form-widget/field-widget/time-widget.vue | 103 + .../form-designer/form-widget/index.vue | 266 ++ src/components/form-designer/index.vue | 426 +++ .../setting-panel/form-setting.vue | 330 ++ .../form-designer/setting-panel/index.vue | 331 ++ .../setting-panel/option-items-setting.vue | 242 ++ .../setting-panel/property-editor-factory.jsx | 173 + .../property-editor/allowCreate-editor.vue | 24 + .../property-editor/appendButton-editor.vue | 28 + .../appendButtonDisabled-editor.vue | 23 + .../automaticDropdown-editor.vue | 23 + .../property-editor/border-editor.vue | 23 + .../property-editor/buttonIcon-editor.vue | 23 + .../property-editor/buttonStyle-editor.vue | 23 + .../property-editor/clearable-editor.vue | 23 + .../property-editor/columnWidth-editor.vue | 40 + .../grid-col-offset-editor.vue | 24 + .../grid-col-pull-editor.vue | 24 + .../grid-col-push-editor.vue | 24 + .../grid-col-responsive-editor.vue | 23 + .../grid-col-span-editor.vue | 48 + .../container-grid/colHeight-editor.vue | 28 + .../container-grid/gutter-editor.vue | 81 + .../showBlankRow-editor.vue | 23 + .../showRowNumber-editor.vue | 23 + .../sub-form-labelAlign-editor.vue | 36 + .../container-tab/tab-customClass-editor.vue | 121 + .../cellHeight-editor.vue | 23 + .../container-table-cell/cellWidth-editor.vue | 23 + .../property-editor/customClass-editor.vue | 40 + .../property-editor/defaultValue-editor.vue | 25 + .../property-editor/disabled-editor.vue | 23 + .../property-editor/displayStyle-editor.vue | 26 + .../property-editor/editable-editor.vue | 24 + .../property-editor/endPlaceholder-editor.vue | 23 + .../event-handler/eventMixin.js | 12 + .../event-handler/onBeforeUpload-editor.vue | 30 + .../event-handler/onBlur-editor.vue | 30 + .../event-handler/onChange-editor.vue | 30 + .../event-handler/onClick-editor.vue | 30 + .../event-handler/onCreated-editor.vue | 31 + .../event-handler/onFocus-editor.vue | 30 + .../event-handler/onInput-editor.vue | 30 + .../event-handler/onMounted-editor.vue | 30 + .../event-handler/onRemoteQuery-editor.vue | 30 + .../event-handler/onSubFormRowAdd-editor.vue | 30 + .../onSubFormRowChange-editor.vue | 30 + .../onSubFormRowDelete-editor.vue | 30 + .../onSubFormRowInsert-editor.vue | 30 + .../event-handler/onUploadError-editor.vue | 30 + .../event-handler/onUploadSuccess-editor.vue | 30 + .../event-handler/onValidate-editor.vue | 30 + .../field-button/button-type-editor.vue | 32 + .../field-button/circle-editor.vue | 23 + .../field-button/icon-editor.vue | 23 + .../field-button/plain-editor.vue | 24 + .../field-button/round-editor.vue | 23 + .../field-color/color-defaultValue-editor.vue | 23 + .../date-range-defaultValue-editor.vue | 24 + .../date-range-format-editor.vue | 30 + .../date-range-type-editor.vue | 27 + .../date-range-valueFormat-editor.vue | 26 + .../field-date/date-defaultValue-editor.vue | 24 + .../field-date/date-format-editor.vue | 30 + .../field-date/date-type-editor.vue | 30 + .../field-date/date-valueFormat-editor.vue | 26 + .../field-divider/contentPosition-editor.vue | 27 + .../file-upload-fileTypes-editor.vue | 46 + .../field-html-text/htmlContent-editor.vue | 23 + .../field-number/controlsPosition-editor.vue | 27 + .../picture-upload-fileTypes-editor.vue | 45 + .../field-rate/allowHalf-editor.vue | 23 + .../field-rate/highThreshold-editor.vue | 24 + .../field-rate/lowThreshold-editor.vue | 24 + .../field-rate/rate-defaultValue-editor.vue | 26 + .../field-rate/rate-max-editor.vue | 25 + .../field-rate/showScore-editor.vue | 23 + .../field-rate/showText-editor.vue | 23 + .../field-slider/range-editor.vue | 23 + .../field-slider/showStops-editor.vue | 23 + .../field-slider/vertical-editor.vue | 23 + .../field-static-text/textContent-editor.vue | 23 + .../field-switch/activeColor-editor.vue | 23 + .../field-switch/activeText-editor.vue | 23 + .../field-switch/inactiveColor-editor.vue | 23 + .../field-switch/inactiveText-editor.vue | 23 + .../switch-defaultValue-editor.vue | 25 + .../field-switch/switchWidth-editor.vue | 23 + .../time-range-defaultValue-editor.vue | 24 + .../time-range-format-editor.vue | 27 + .../field-time/time-defaultValue-editor.vue | 24 + .../field-time/time-format-editor.vue | 27 + .../property-editor/fileMaxSize-editor.vue | 23 + .../property-editor/filterable-editor.vue | 23 + .../property-editor/hidden-editor.vue | 23 + .../setting-panel/property-editor/index.js | 9 + .../property-editor/label-editor.vue | 30 + .../property-editor/labelAlign-editor.vue | 42 + .../property-editor/labelHidden-editor.vue | 23 + .../property-editor/labelIconClass-editor.vue | 28 + .../labelIconPosition-editor.vue | 37 + .../property-editor/labelTooltip-editor.vue | 23 + .../property-editor/labelWidth-editor.vue | 25 + .../property-editor/limit-editor.vue | 24 + .../property-editor/max-editor.vue | 39 + .../property-editor/maxLength-editor.vue | 40 + .../property-editor/min-editor.vue | 40 + .../property-editor/minLength-editor.vue | 41 + .../property-editor/multiple-editor.vue | 24 + .../property-editor/multipleLimit-editor.vue | 24 + .../property-editor/multipleSelect-editor.vue | 24 + .../property-editor/name-editor.vue | 88 + .../property-editor/optionItems-editor.vue | 28 + .../property-editor/placeholder-editor.vue | 24 + .../property-editor/precision-editor.vue | 23 + .../property-editor/prefixIcon-editor.vue | 23 + .../property-editor/propertyMixin.js | 47 + .../property-editor/readonly-editor.vue | 23 + .../property-editor/remote-editor.vue | 25 + .../property-editor/required-editor.vue | 23 + .../property-editor/rows-editor.vue | 24 + .../property-editor/showFileList-editor.vue | 23 + .../property-editor/showPassword-editor.vue | 24 + .../property-editor/showWordLimit-editor.vue | 23 + .../property-editor/size-editor.vue | 38 + .../startPlaceholder-editor.vue | 23 + .../property-editor/step-editor.vue | 23 + .../property-editor/suffixIcon-editor.vue | 23 + .../property-editor/type-editor.vue | 33 + .../property-editor/uploadTip-editor.vue | 24 + .../property-editor/uploadURL-editor.vue | 28 + .../property-editor/validation-editor.vue | 50 + .../property-editor/validationHint-editor.vue | 23 + .../withCredentials-editor.vue | 23 + .../setting-panel/propertyRegister.js | 201 ++ .../form-designer/toolbar-panel/index.vue | 793 +++++ .../form-designer/widget-panel/index.vue | 396 +++ .../widget-panel/templatesConfig.js | 58 + .../widget-panel/widgetsConfig.js | 927 +++++ .../container-item/container-item-wrapper.vue | 34 + .../container-item/containerItemMixin.js | 141 + .../container-item/grid-col-item.vue | 125 + .../form-render/container-item/grid-item.vue | 59 + .../form-render/container-item/index.js | 11 + .../container-item/sub-form-item.vue | 408 +++ .../form-render/container-item/tab-item.vue | 99 + .../container-item/table-cell-item.vue | 71 + .../form-render/container-item/table-item.vue | 70 + src/components/form-render/index.vue | 571 +++ src/components/form-render/refMixin.js | 22 + src/components/svg-icon/index.vue | 49 + src/components/v-table/index.vue | 106 + src/extension/extension-helper.js | 23 + src/extension/extension-loader.js | 112 + src/extension/samples/alert/alert-widget.vue | 72 + src/extension/samples/card/card-item.vue | 102 + src/extension/samples/card/card-widget.vue | 121 + src/extension/samples/extension-schema.js | 36 + .../samples/extension-sfc-generator.js | 52 + src/iconfont/iconfont.css | 29 + src/iconfont/iconfont.eot | Bin 0 -> 2388 bytes src/iconfont/iconfont.js | 1 + src/iconfont/iconfont.json | 37 + src/iconfont/iconfont.svg | 35 + src/iconfont/iconfont.ttf | Bin 0 -> 2468 bytes src/iconfont/iconfont.woff | Bin 0 -> 1448 bytes src/iconfont/iconfont.woff2 | Bin 0 -> 1072 bytes src/icons/index.js | 12 + src/icons/svg/alert.svg | 1 + src/icons/svg/button.svg | 1 + src/icons/svg/card.svg | 1 + src/icons/svg/cascader-field.svg | 1 + src/icons/svg/checkbox-field.svg | 1 + src/icons/svg/color-field.svg | 1 + src/icons/svg/custom-component.svg | 1 + src/icons/svg/data-table.svg | 1 + src/icons/svg/date-field.svg | 1 + src/icons/svg/date-range-field.svg | 1 + src/icons/svg/divider.svg | 1 + src/icons/svg/document.svg | 1 + src/icons/svg/drag.svg | 1 + src/icons/svg/el/back.svg | 1 + src/icons/svg/el/delete.svg | 1 + src/icons/svg/el/view.svg | 1 + src/icons/svg/file-upload-field.svg | 1 + src/icons/svg/github.svg | 1 + src/icons/svg/grid.svg | 1 + src/icons/svg/html-text.svg | 1 + src/icons/svg/node-tree.svg | 1 + src/icons/svg/number-field.svg | 1 + src/icons/svg/picture-upload-field.svg | 1 + src/icons/svg/radio-field.svg | 1 + src/icons/svg/rate-field.svg | 1 + src/icons/svg/redo.svg | 1 + src/icons/svg/rich-editor-field.svg | 1 + src/icons/svg/section.svg | 1 + src/icons/svg/select-field.svg | 1 + src/icons/svg/slider-field.svg | 1 + src/icons/svg/slot-component.svg | 1 + src/icons/svg/slot-field.svg | 1 + src/icons/svg/static-text.svg | 1 + src/icons/svg/sub-form.svg | 1 + src/icons/svg/switch-field.svg | 1 + src/icons/svg/tab.svg | 1 + src/icons/svg/table.svg | 1 + src/icons/svg/text-field.svg | 1 + src/icons/svg/textarea-field.svg | 1 + src/icons/svg/time-field.svg | 1 + src/icons/svg/time-range-field.svg | 1 + src/icons/svg/undo.svg | 1 + src/icons/svg/vue-sfc.svg | 1 + src/lang/en-US.js | 321 ++ src/lang/en-US_extension.js | 26 + src/lang/en-US_render.js | 38 + src/lang/zh-CN.js | 321 ++ src/lang/zh-CN_extension.js | 26 + src/lang/zh-CN_render.js | 38 + src/main.js | 33 + src/styles/global.scss | 103 + src/styles/index.scss | 15 + src/utils/beautifierLoader.js | 77 + src/utils/code-generator.js | 91 + src/utils/config.js | 19 + src/utils/create-app.js | 4 + src/utils/debug-console.js | 7 + src/utils/directive.js | 151 + src/utils/emitter.js | 35 + src/utils/event-bus.js | 9 + src/utils/i18n.js | 76 + src/utils/sfc-generator.js | 583 +++ src/utils/util.js | 232 ++ src/utils/validators.js | 127 + src/utils/vue2js-generator.js | 144 + src/utils/vue3js-generator.js | 70 + variant-form3-vite.iml | 9 + vite.config.js | 40 + 294 files changed, 22068 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .vscode/extensions.json create mode 100644 README.md create mode 100644 index.html create mode 100644 jsconfig.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/favicon.ico create mode 100644 src/App.vue create mode 100644 src/assets/ft-images/t1.png create mode 100644 src/assets/ft-images/t2.png create mode 100644 src/assets/ft-images/t3.png create mode 100644 src/assets/ft-images/t4.png create mode 100644 src/assets/ft-images/t5.png create mode 100644 src/assets/ft-images/t6.png create mode 100644 src/assets/ft-images/t7.png create mode 100644 src/assets/ft-images/t8.png create mode 100644 src/assets/vform-logo.png create mode 100644 src/components/code-editor/index.vue create mode 100644 src/components/form-designer/designer.js create mode 100644 src/components/form-designer/form-widget/container-widget/container-wrapper.vue create mode 100644 src/components/form-designer/form-widget/container-widget/containerMixin.js create mode 100644 src/components/form-designer/form-widget/container-widget/grid-col-widget.vue create mode 100644 src/components/form-designer/form-widget/container-widget/grid-widget.vue create mode 100644 src/components/form-designer/form-widget/container-widget/index.js create mode 100644 src/components/form-designer/form-widget/container-widget/tab-widget.vue create mode 100644 src/components/form-designer/form-widget/container-widget/table-cell-widget.vue create mode 100644 src/components/form-designer/form-widget/container-widget/table-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/button-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/cascader-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/checkbox-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/color-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/date-range-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/date-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/divider-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/fieldMixin.js create mode 100644 src/components/form-designer/form-widget/field-widget/file-upload-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/form-item-wrapper.vue create mode 100644 src/components/form-designer/form-widget/field-widget/html-text-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/index.js create mode 100644 src/components/form-designer/form-widget/field-widget/input-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/number-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/picture-upload-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/radio-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/rate-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/rich-editor-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/select-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/slider-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/slot-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/static-content-wrapper.vue create mode 100644 src/components/form-designer/form-widget/field-widget/static-text-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/switch-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/textarea-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/time-range-widget.vue create mode 100644 src/components/form-designer/form-widget/field-widget/time-widget.vue create mode 100644 src/components/form-designer/form-widget/index.vue create mode 100644 src/components/form-designer/index.vue create mode 100644 src/components/form-designer/setting-panel/form-setting.vue create mode 100644 src/components/form-designer/setting-panel/index.vue create mode 100644 src/components/form-designer/setting-panel/option-items-setting.vue create mode 100644 src/components/form-designer/setting-panel/property-editor-factory.jsx create mode 100644 src/components/form-designer/setting-panel/property-editor/allowCreate-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/appendButton-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/appendButtonDisabled-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/automaticDropdown-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/border-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/buttonIcon-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/buttonStyle-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/clearable-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/columnWidth-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/container-grid-col/grid-col-offset-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/container-grid-col/grid-col-pull-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/container-grid-col/grid-col-push-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/container-grid-col/grid-col-responsive-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/container-grid-col/grid-col-span-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/container-grid/colHeight-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/container-grid/gutter-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/container-sub-form/showBlankRow-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/container-sub-form/showRowNumber-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/container-sub-form/sub-form-labelAlign-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/container-tab/tab-customClass-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/container-table-cell/cellHeight-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/container-table-cell/cellWidth-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/customClass-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/defaultValue-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/disabled-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/displayStyle-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/editable-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/endPlaceholder-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/event-handler/eventMixin.js create mode 100644 src/components/form-designer/setting-panel/property-editor/event-handler/onBeforeUpload-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/event-handler/onBlur-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/event-handler/onChange-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/event-handler/onClick-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/event-handler/onCreated-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/event-handler/onFocus-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/event-handler/onInput-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/event-handler/onMounted-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/event-handler/onRemoteQuery-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/event-handler/onSubFormRowAdd-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/event-handler/onSubFormRowChange-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/event-handler/onSubFormRowDelete-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/event-handler/onSubFormRowInsert-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/event-handler/onUploadError-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/event-handler/onUploadSuccess-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/event-handler/onValidate-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-button/button-type-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-button/circle-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-button/icon-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-button/plain-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-button/round-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-color/color-defaultValue-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-date-range/date-range-defaultValue-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-date-range/date-range-format-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-date-range/date-range-type-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-date-range/date-range-valueFormat-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-date/date-defaultValue-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-date/date-format-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-date/date-type-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-date/date-valueFormat-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-divider/contentPosition-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-file-upload/file-upload-fileTypes-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-html-text/htmlContent-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-number/controlsPosition-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-picture-upload/picture-upload-fileTypes-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-rate/allowHalf-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-rate/highThreshold-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-rate/lowThreshold-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-rate/rate-defaultValue-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-rate/rate-max-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-rate/showScore-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-rate/showText-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-slider/range-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-slider/showStops-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-slider/vertical-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-static-text/textContent-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-switch/activeColor-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-switch/activeText-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-switch/inactiveColor-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-switch/inactiveText-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-switch/switch-defaultValue-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-switch/switchWidth-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-time-range/time-range-defaultValue-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-time-range/time-range-format-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-time/time-defaultValue-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/field-time/time-format-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/fileMaxSize-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/filterable-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/hidden-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/index.js create mode 100644 src/components/form-designer/setting-panel/property-editor/label-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/labelAlign-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/labelHidden-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/labelIconClass-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/labelIconPosition-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/labelTooltip-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/labelWidth-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/limit-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/max-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/maxLength-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/min-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/minLength-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/multiple-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/multipleLimit-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/multipleSelect-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/name-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/optionItems-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/placeholder-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/precision-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/prefixIcon-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/propertyMixin.js create mode 100644 src/components/form-designer/setting-panel/property-editor/readonly-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/remote-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/required-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/rows-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/showFileList-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/showPassword-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/showWordLimit-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/size-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/startPlaceholder-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/step-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/suffixIcon-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/type-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/uploadTip-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/uploadURL-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/validation-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/validationHint-editor.vue create mode 100644 src/components/form-designer/setting-panel/property-editor/withCredentials-editor.vue create mode 100644 src/components/form-designer/setting-panel/propertyRegister.js create mode 100644 src/components/form-designer/toolbar-panel/index.vue create mode 100644 src/components/form-designer/widget-panel/index.vue create mode 100644 src/components/form-designer/widget-panel/templatesConfig.js create mode 100644 src/components/form-designer/widget-panel/widgetsConfig.js create mode 100644 src/components/form-render/container-item/container-item-wrapper.vue create mode 100644 src/components/form-render/container-item/containerItemMixin.js create mode 100644 src/components/form-render/container-item/grid-col-item.vue create mode 100644 src/components/form-render/container-item/grid-item.vue create mode 100644 src/components/form-render/container-item/index.js create mode 100644 src/components/form-render/container-item/sub-form-item.vue create mode 100644 src/components/form-render/container-item/tab-item.vue create mode 100644 src/components/form-render/container-item/table-cell-item.vue create mode 100644 src/components/form-render/container-item/table-item.vue create mode 100644 src/components/form-render/index.vue create mode 100644 src/components/form-render/refMixin.js create mode 100644 src/components/svg-icon/index.vue create mode 100644 src/components/v-table/index.vue create mode 100644 src/extension/extension-helper.js create mode 100644 src/extension/extension-loader.js create mode 100644 src/extension/samples/alert/alert-widget.vue create mode 100644 src/extension/samples/card/card-item.vue create mode 100644 src/extension/samples/card/card-widget.vue create mode 100644 src/extension/samples/extension-schema.js create mode 100644 src/extension/samples/extension-sfc-generator.js create mode 100644 src/iconfont/iconfont.css create mode 100644 src/iconfont/iconfont.eot create mode 100644 src/iconfont/iconfont.js create mode 100644 src/iconfont/iconfont.json create mode 100644 src/iconfont/iconfont.svg create mode 100644 src/iconfont/iconfont.ttf create mode 100644 src/iconfont/iconfont.woff create mode 100644 src/iconfont/iconfont.woff2 create mode 100644 src/icons/index.js create mode 100644 src/icons/svg/alert.svg create mode 100644 src/icons/svg/button.svg create mode 100644 src/icons/svg/card.svg create mode 100644 src/icons/svg/cascader-field.svg create mode 100644 src/icons/svg/checkbox-field.svg create mode 100644 src/icons/svg/color-field.svg create mode 100644 src/icons/svg/custom-component.svg create mode 100644 src/icons/svg/data-table.svg create mode 100644 src/icons/svg/date-field.svg create mode 100644 src/icons/svg/date-range-field.svg create mode 100644 src/icons/svg/divider.svg create mode 100644 src/icons/svg/document.svg create mode 100644 src/icons/svg/drag.svg create mode 100644 src/icons/svg/el/back.svg create mode 100644 src/icons/svg/el/delete.svg create mode 100644 src/icons/svg/el/view.svg create mode 100644 src/icons/svg/file-upload-field.svg create mode 100644 src/icons/svg/github.svg create mode 100644 src/icons/svg/grid.svg create mode 100644 src/icons/svg/html-text.svg create mode 100644 src/icons/svg/node-tree.svg create mode 100644 src/icons/svg/number-field.svg create mode 100644 src/icons/svg/picture-upload-field.svg create mode 100644 src/icons/svg/radio-field.svg create mode 100644 src/icons/svg/rate-field.svg create mode 100644 src/icons/svg/redo.svg create mode 100644 src/icons/svg/rich-editor-field.svg create mode 100644 src/icons/svg/section.svg create mode 100644 src/icons/svg/select-field.svg create mode 100644 src/icons/svg/slider-field.svg create mode 100644 src/icons/svg/slot-component.svg create mode 100644 src/icons/svg/slot-field.svg create mode 100644 src/icons/svg/static-text.svg create mode 100644 src/icons/svg/sub-form.svg create mode 100644 src/icons/svg/switch-field.svg create mode 100644 src/icons/svg/tab.svg create mode 100644 src/icons/svg/table.svg create mode 100644 src/icons/svg/text-field.svg create mode 100644 src/icons/svg/textarea-field.svg create mode 100644 src/icons/svg/time-field.svg create mode 100644 src/icons/svg/time-range-field.svg create mode 100644 src/icons/svg/undo.svg create mode 100644 src/icons/svg/vue-sfc.svg create mode 100644 src/lang/en-US.js create mode 100644 src/lang/en-US_extension.js create mode 100644 src/lang/en-US_render.js create mode 100644 src/lang/zh-CN.js create mode 100644 src/lang/zh-CN_extension.js create mode 100644 src/lang/zh-CN_render.js create mode 100644 src/main.js create mode 100644 src/styles/global.scss create mode 100644 src/styles/index.scss create mode 100644 src/utils/beautifierLoader.js create mode 100644 src/utils/code-generator.js create mode 100644 src/utils/config.js create mode 100644 src/utils/create-app.js create mode 100644 src/utils/debug-console.js create mode 100644 src/utils/directive.js create mode 100644 src/utils/emitter.js create mode 100644 src/utils/event-bus.js create mode 100644 src/utils/i18n.js create mode 100644 src/utils/sfc-generator.js create mode 100644 src/utils/util.js create mode 100644 src/utils/validators.js create mode 100644 src/utils/vue2js-generator.js create mode 100644 src/utils/vue3js-generator.js create mode 100644 variant-form3-vite.iml create mode 100644 vite.config.js 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 0000000000000000000000000000000000000000..84ed3f96faee436d4ec08cdc8f63e9f6a45e779f GIT binary patch literal 4286 zcmeHLu};G<5IqDRz{K2$(xFqhX7yZH44bxa|F`FVD2Em0pLycn z;?I+R7lEJm{llCUGyhoqYyAB4VcGV7IJe<9`}c3r`BSw2oVVWykb?1#8*6|`{o$mG z%NWeG76i|FtkPyMS$}PS@30SwZU#1th literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..620f53628248827a72b754e4250997c040b365db GIT binary patch literal 33254 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 literal 0 HcmV?d00001 diff --git a/src/assets/ft-images/t2.png b/src/assets/ft-images/t2.png new file mode 100644 index 0000000000000000000000000000000000000000..a968ef746bb7bf44d67a4ae36e135927e841fb5e GIT binary patch literal 35608 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 literal 0 HcmV?d00001 diff --git a/src/assets/ft-images/t4.png b/src/assets/ft-images/t4.png new file mode 100644 index 0000000000000000000000000000000000000000..7996852efa6e87ced4439047b1c390aa6b9bd2ee GIT binary patch literal 30098 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

~JBv}c`SxU(F=y6UrJaT(Y4 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%0D{ypUMRF;q$dwlrm9%|Z5oTG^2 zLBx*d9ijXW^2R{(sJSpt5_?4|2uCGEUD$GyrG~-J@~j(?+9d@vNzUn-fLrvF<^HBP zp-)rfX6BX+R4?hT^S^$pm#7>3Zg>bZReGg-k4;WX~a$V6m81Gd0-u!Ypu^efD43vRxR zibIr0rt8Lf4m|u_>*>GA8V+066W|+t)iIG$$r;yo`PpT>AuecFU>5EEvmP-{dn-Pq z02CKhRV~#axkfu0o%)rRl5*P7cX=+$!mjkz%?54#xYEYKd0lai*y!%xa>`pZ^=~zp zLV{h_5eBD^dFZ5k1e75Ge~Mg`1_Yk$eDka{DWDup=d+uFxZ!ajV-0ar_3|t97gzUA zJd&e{bF<}k???@*94Ni%(CFUV8%bV49>)tlwSo<;QB-4PpG*($~6fV7l zYzj_vF@B;-0 zZm9Q~5ar}wt&lYHGxsyOigx=JvSmm&rKw~MQn5idr7dcwu}Nn@H5NUmX%J|Q*h4Z( z?i`J)9wG<8VTpa8NasuIqD;;yzOYtD@QG*g%T#SDt?r`cCkOEMOUzG?$YW1736JBv z$sP`qay3fn9bDU^{w5@#UcF=gwf@44>d3(6q^nUfR0>C#p^ZsTW#~-X+s7lD=eOG? zPbP)4+OQ>?QUmu zOV%s`DzZfc_>6Udl9L&a%#Y>QMeKFt*?*fJekn73xkktgi^g{QhichPVr1=fe&-ywN|v0_f_+@ z5c?9Qemd$R=me38E?}?~{-){pKZ(s7Gr`#ZVVYzc@kwpZ$|~V;$N!`={f|DEjBG*W zoA$Uy%2!phO)aJdWp}opUG+gUcz5?5s0@0BPl`$5T_{W{bfXK_poaj>=E9L+G(IaH zPJ<#61?yavNW$h7x52xrZKNN-lC=^u1D39AA#=9^?p^0!cdhq)x&^F6fvh0D>q%Ks z#RS6b@FZfFauZRA6}>In->il{V(6Z=5QY@sb0@&+^mrOrp=$fDpm^8;MSQ8a0L9DW z!9yqfc3H8VwyCq7PIO=d2oO+NN|=A3Nch|cI8n(bagQm$-u{9d z%g~?+IIzFq>~^^fsDcQ=U+{IuYAdV-c+;P`y5vwFv>?jyXV7fpX2DR%6yDWQiL>m zBLt08Ds`<_F*QLRhz(r~BG&22&?D+m8qW20#)vB4+@|567q9!@my6AY)y4SRoqc46 zCr#O3A2Pt;BS(VNLksK2aCyV-&JN;Q-PMJ)H!-Jg%SvxkPVnhKNz>_SyZ|WY=59H9 zO)KvQS*U1e#B6Pg)L=LGd|n#7(4^bw494a^dS;uv9yGD$iv^Tn$EN$NrD;Lh+6+bIIa`zQffpfo@ExPmoVm3pbN>d5Q)IXRzUYVvJA8$7}8 z{sCc}O9$z~_kA`x*Kiwk9qCy(^>Y!V?m(l|zK7kCO;fbpo6hJzjuGW}wn$&%cHS`S zW2Y2Kkp}JkuDh1z72=<-9lynO;l#Z%YNzGsA1{t(h!KHlxL;QcbT^z8<9ZHs`rT zgwNHp@@}}lKiDkGPu?gLYBDwUS@eiibtR1yC4;-DnhQiIPeP3naY;=29&o z(5fjX&UC2>Go_LTr{9{H71HH4^fWRCEgK7K+Pz@DvOk6DJ*hw3ed0|K=810)^6)V@ z>~m>vpiz-1=ZyJ@b5@kXA&rk;62)p&G4w9r7C63SF*}90-G)p==Bjk+-T9S~H_EP= z;SGn>qX<{3I{c1-Gx!mc64N2XRG&_R&4UgYWn7n#wXqXtZM7Ns=4Kww&sj-uOdeYb zd6)S@8aiF?9P{B@3rKC4Io~Ps6XcmDBZj}V4Y*hdJRwytT(-V@m)eJ1wQtzY5^JUi zX4wVliTt6keX+Jn)*T<>k@t-inbQLhCR!t~DZek#C*Rk6lUqm zxkm9GXyWu$PQ2LQ2RJcckE1ufkAwlz!1!j10bQ751JyZAkz4$MoC8;3U_96G1QSXd z^Ec^8w7VQR^A&03)^Mq6+R|47I_d$Fq!2Rr641m5_Gc_-R%W~aq9lnYM;!ci??=b5 zEkuRxF)ACRnrPqRBUq|)0u-vCY`^Gye!zq9^2dgsy@wtx-Y>fPv@KkcYWYZ3+LQ9R zDmIWfkTkrhoZiaL9(fy!o%Lr63?P)ee0El09Occ-Zyo7!G9T`w-`W)(kONHwszk8a z6>)0p_QHFv+tFO6xji zY}YAerF0x-rB?<7u9rGcm4`!l5Sl{hx}nc4^vgp>iw2P8GUV6ccEs0pkYFyH6cVRZ zL&BBbe!?&8^M`6yckRU>Xry`5q9~^Yr@XJdZwq%pRppaJ;)}C8Z3&_14XWS zUVZ?a56x<4@xlm8sFHzWB|D< zSFLxfMHUfvKE@mN{cgN%LqPsppB+T6$~lGMpkuPxpKDBEyoQ&UaxJCTA^Wfnb=xoo z)cuxPXQnq$zM6NBgt@i!yI&ms=+x13ZP`+nMkjdV&ztdvU*tGfo0!x0V$eRy+TQw; z^ss66J74KdjtMEr7mIi!ue2#N8Q?(bMua+ ztT&pxsmXj^5jJB6fNFDVN2^S6CfR<9ZKzO6QLHkFAXTGB8IJ3=NIA_FwXku}R16Qi zPRLBsDXXq{M(F1?v)qGwt5J3bi&4daY*S{_PErV8l(XMP;eHzKX)lW5s7~tHPSkVW zOpjfIE4QXCScxPbNA|>WcJg}f-X5lDBye3P5sEqiVw@sV7S%6`U#)MHqAqX6xN#Ak z6_$F-ay`Se+O6{<0Bzgv=m*gi1$7N6xt%d^{8(Eil#wZ6%%5}Aw?BA*7FD$*;yKb5 zRvC5^@5*TYa>ePnZeep-{t~n;b*>pRi~1S!JVY}g$7(2E;qM`o!HCsZCyxv^9gw|DVjW31AUk-wfTpAKsPnCp3iNO z9q!IN!s~68bwjAXpu0_Ft4x4)ripQY;!`HoB5dn;-DULaMTKEFVJ)N3Gy2LzChMqujz&vk14q?ZO1ztl3U-U1R7 z;pW~iRd0_l5|}uz5NF>^YW7FF?2K`y)pRK2P1Ie{K7GbnO4W?0z{K*d08?kr=UPS_ zlj^tRy_||W+zPclEG}wchUB+~-Q`Y(_|0!wX8535aqNEN63ukSrI^4SL~DwrW9S5g zqf8u6zd`Y@9@;O;i8*264U?gev(OmRkAmAk%C}Jin(c3<&%ibzRf|4Y!qTIFc`+OuGjD_qm{L1{N;ToQD)#502*rJTJfd)y+cdveVb- zy}uk@o^h_1PkOeaDkX0;*UN%W9J-`mOMAdhujo^2zs+}0dEVD&vu-A!F=6=|K37Hq zVrFxflC>-QezAGg_?vaiZqBd2#3R4@*)9w&Q9@xk&`j++rD!P*%M(SePEQI!t4P)H zGmx&*kFu&)-#PkTxS^>xgjh`>IEk^qt2`*;h%>)mniwEfn~Qp2R-J=eZZe2EfX&I# z$0Ml(cXPzvbnbqmS)R>eWEDTOQi_@ef4u+c^9?_=N=Y}jIV09sqK*?SXUj!nvV$~t znA`+8%d?TCx&>UoR*c>Xnpqsx)Y7{6!P4m14FA(;&_calW3N}ART9k)b!hXUT1I>2R`#><}kc! zivEK3oFKOZnVXgeYRXCc{Woz_)tvSfbn8w+>4EpnJMZJ1(|(9(N&p? zruVcLA#KZ7r*yr5d7wJmKh}q!CJ2P%@}$|R$&oCvq*tVQMtX@9B2z)?xDKX+-7;tC z!jUH`AOlMrk1akAM=6lyWQn&W1=9~iJd%1Wi#?Y${H=J&U~aGcTf3_ak;=TOrJaAjuQpms_D4~PjE}o#f?e1Aq`q) zjtL!nVw|UFe$dc?xNTGx0ws6GD)do0ulMcJ%n+&HBLcD^1=@aPn*DJ1YYl5Q^m4Ta z=Iqwpa#MMtJA9+zol2UvCI!VsCU~2SAs4ur$q^q2F#^)SVn?of59S+o_y!K}caQZi z?kNUyP??sv(KncdC2kba1^u`2H=4|eT8tKNv!6k88xgE-bfZgiQLXHkhkk-^hP9Vu zs(VpN;lh%f^6_sxOu2K!EKz9J9?-R7crf+{zmre0+c5`8Q0LTH@-EvADd;kDU|@Lj zo;e`O+ZZiSpQWz;iC0KBB*ipvn~X;#*Fo-GwVrV#*oZ7*YFA8wsduy$MK*OOo?52i zS#88pw&Bj%+AV}x0XQh6w)lZ4>i&(D(Q8U^@_=QtMzfk8TBe13gkU?3_dQk$?Oh}; zX6b>M=j}>J6k-xhn4HgiQOaloQ@?|BvG4QurjfZ)OgV2)Of!_y;Q@yXVqZi3FB-Xu z@4DCw`9cCqlg}NwjHEbzQ8+}MBBP;#FB;VWcwGP3uTs<+G5F&ooByChHH`1iri%||ZD zwBIvF()8V6uWhw7P0dj1>HFt!%r+anw68ZZc}wl1n2_$C*_MZT9M-9=|A>$^E-yDl zX*(N-|3DqwA(oIj5VMbJrpt;tIo}m&1FP#0n=xJ68IUk1@3NLTsK&}IJaB9YRCFPS z!r25taOq9u_?4&89t|c0sm^9vVO+k0^=N2FJt1N7LEn!UFWe*|x7ir>_L22J9TLlL zQndU8tKZ(9joYjN3)mJwmQfw~jBQ5s-Hks=-`c06b4crg!kRbNl7{Lfn0FP#*anV& z$6aY$lji}a)%2=XCVv5?Jclw6FEUL>iSem%7^N_BNOM@_X=JwrS|o|&qfQ?KdYbK6eB1f7o=(ag*K@_ zaU%b(W~-}we2$TW)wa|p``CP#ljG0NsvchXv0dr@mAspCWK3S=uJxyt`+u0QhCc0}m#gz4LoF5`Qzke~OV%~1jsaqW+GYiyH~gJsol??j*@6OsAks$55=6R!fFND80FgvMh!AN)P`71O(MlKE z#FEZ{fHVojK%!+y=p#KOKvW=sKtdCen1m#E1>EPIv&Xsb{qf#C_uMg_Lx&+`tu^QO z&2P@%obxyH+fS|zyLV~sQc+Ra?Re=&4;7Ui!73`-^ZvF2c*pFAH~WD9w!l3ceo(3H z)1C)@*dBV`<-CeYeTLflbyeW!owqMtg{!FSJEHuz#nI#NvWkkL-0{cro_7NmWhtaP z4p)yQQBYM6oM#Si-T6!DldanxY(Kwai$iCJ^`T$C_!0$IVXuDqe%2!Sdjsk}ju+T` zx9vmmmtW7JBSV>vDlrP#bdFiMYiluS`@TK9 z_Z@y=viC>a0Vls3s!+Ne?m(}{Br@|@Oy&AeW3cB^PFK-dmS4o=Xw+O3+QrghL;AB0 zUwjd)oAl|!WYJV2gU43L;0Tn6NTG~b2_G6Kg&_vv7)k=)Z%WcQowR=U9E&MiH(m_< z^wdwNCIZj%v5H429(_)#KNvNB0%>Iawp~B^3s*_CXAgb1-gh2=MuLnWqD<3#W~b1rz+OxlKzm3A{4SoHZTNPq;I!A#jkWSW;-DIAkD#nI*h&@eWvILLv!9ZkInplg zrHM9PDAi6{!RBg+_-$qi0R{O!G{o-i;{}tQriYUsXV@gXtqyFAykJ+muppY?ehzvW)+}jcA%t|Dgt0Og5C|1#w=z2j*vh)4JdSbqUoG{XeZB)-}{g4(p z)h4y2kP_x=>c))!VoDmkxpFR(N9mA_Jw^L?$ixDL+nGuck~zx?N*|u@VsQhBU*s z+o5)LdfY&P+h%$w9E3-@M<)vLA?bkdmPfg9iZAS1jDrmDagsBsl538`)|^tye>>ah zdpdqZ5>ZKn)w^p^H}EYOBvCqZq^em0_bb{MFuXp&F7CbE_7J#6(4lm()&D zuRzw%n(Q?b3r5>kLcaQpT;jjP;x$nT5bsv6iJ zJ>F>;YhAeAZ{tZVUBHtZUma%F4Hz}Ct%FvPC&dGbiR%MaW(OLNqPG71YE#{l^LppP zT)5rSxAaucOM(c0>(JJE-(j-UCPPY@4gxpT;40p(yK6Wm1nFmwd~rCgQgX9QV#swv ziY=?^=mX7PZ9J;4vwW+mJA|irq_;keR5^MtU*5gm{l}Jq>7~s5Y!EfsS=E*fe-(bZB6v!14@CdsHvOeEHiJIW95nQWQx>8sBYrqET;B8t-Kz>|NwwyE z`s?kLji;Oiq4#tQX)xJAUGk+i5f8OQ>7i(AX8smLzHp;z9fyo7=I(8|DWIm_|7!1d z`A*^TGjk@Ud;g|iY7MbBV1`E`rSectuZh@J>XF3M3ujc&-I4Dw%tAABqnaUzm=V9= z-#|%n!`N&@$YeNTKG}JOmp`#L`@JJCZ@;SB(|rS@CwtJl@>ka`juqe!TaX_j`n zB{fI~)n(&y>+4C=gl1b^mBL*w{~97!1%3N|E~8*qhx4%Izz$n``+J#ZetJAKf=2EQ z4#VHeE_PrF-AN2W8vUzMJD;ppIC5ymRRfpdBIKjB&6r>_>H2jh&RFDj>c(1#d=@y9 zc00I-P;w@M7B7Uy(#Z31B#YLSUJ`=BMj(va1bd|q#psFX1s;#25PvTk{3g@VQ)}(J zf?fY`cGPm1Eyv`5*}1E9I4)k|8KOf^4=P7`A?P;Vk!iyr61|Oeu5HfV9vqFhY*%qI zWvn zR)bja+k>lYVVq~eR5}JZj!CK`M=q5)z6z?U`*|VR8Q&K9=GoMu+p-~Op+)Gw@zD3h zC5I32ojqPB2W>MgebsTP%k8J1U3|aEzZ3_5jeac5w_0+SQOk02O&#dTJ^sr_URTU$ zsg{1e7O>m7cYxR2zZ2T@`qvBF4xzomeO?ZR42@JC8gt)LP)2;^f_pz)*t+rgfXHie>sHvEad;E!19+9A8JWt0!bOpY(Krfpy7vEezlD`wEHIh^<4tDbl52RzI=)0tu8nrC7<~#mI9<)qa=#@SzgKAD^VzE>v{BZLfUu ztfXd^g^{ye;cg}W_tu-9!>`mY<2j5(C<|7DXFOe ztj;0-574v2#b0j#=43v6WJ|%WOEbJj33UMp1B4(AOyju%RoaEYfuB)AtknTXu2h&+ za`FHlUpLv7@LCOGs!WY`_tSH1YU^qPz#kMA)+t!Drq!IZngiNNL&O&zb>5v2&?-6MILy})_8+p>=KBpN+ zL_lRNYm%tvEC5^KPo|E$2ALtLxPldwu(s~rL4YV_Q=Kx3THj9E2FDO_}mdDZSm&1?uW|)k*Cp|iNWU5 zh6Yp&Z$Bk{S z*y8iYcBn|+_CB6*!psDe8lqe&ug1IOc)>{A$=SL@r|<lU)x-d~hXW08aW*vO=AKLmur#-wOx;0S@QuNxxoO7dG! zgRBqmD%dtCMZhVsQGtgbmDQ1Bz4Q{MSM0JpGlHf-MLf|uk8G#}SHjmhZb**8e6NnD{XxR%vGk}W{`U+6R8eTzYKSXal(_v`wWOAHSywNbt6jK( zz|QugB@TwqXog?wKHcXAGils+RJsc5ZwzpD!_3qK`E?>X?k_%D55$|t92LYdWTj{D zbk))FSVBrItViI)Xur_@A~G^PfB|t7w+&;#%x0(gcNafuGTr?u%F>(=9X|>XNwozI zP990^M$8XjnP-q!jED`K*~DnQ!{P@b#fP_f)R~B^iQX(@zJf%P$$%`?lf?G$a~m#s z1uW(;1T^oOYm5}1kdp3v{ah>=)gyr`=$Hdt8sz1-GJ=P6fCVJpcEY+_F{2{v8=)T$RYyrwTCq6cuKWVdUUj7k>VR_~}=*PIto zJVs6JJ^m9t{d%qio`QxKR%t1X?K{%fTMA>*;t&<{(;zx&2K2`o+U3iL>Djj4sv%?7YwL8m_@S3CQqgW4Flstwj< zJlt-ju=8RJqK7dTq#^n!5T#OrBTskJzmYgAK z9Yf5nNtPOL1PTjJAxmGYC%s@^fik-x;uEB$BvFEfpC0)912-APZ6f>|NE^QvtHb}Z zlgLQ-P6&vok*s7|NrUpb@~xV!BC6aP+DcAv{R0jK6~u!sW7w66a;TI(ket77A0nRn-cWD)ZgS#3d(gcfhH=%lei{L!mJ}&)SBK!ytlT zfrspFL40L<%;j0yx--@}%~4WicsfI!80*2ic~YrQa#*NVCUFY7C9&xl=`ef3$d!?QFKK0?a5Y|miWc)`V+P&M5Ki?39i0^|;3W0!H!lmA^*GyR(UhEwM0sv% zQF0TtL)O(tbO|&Qhw{iTG^+(bOK_-rSY9N zXQX!YhyCmRjmwtMAY&=LLEVd*!RfRNvB{Xv@F9ISxj+judiTzc(Ojb`GM_~^Md=?H zr2W=qp;>KJyKfBb!KqTJV`|S}ZFejq;7NbvF>MGBLR}_WUVO<0Z^el;gP@(E8iZ4=*{+L~vNswX4)#!$bnraMl*waohxOJ4G}1yO5BQOr%9 zA#o}-DOCv^o9IwyUZ%1zMM!v~#az!Z7Dtx%5D9`RUMO>|b#l`OCR``4&DJe0wa0x( ziI_sl7DS89UJQp>8n>I!@9z(u@}%6tNoF%GiDv1RfG3-X(TbTW0GXrdap<8D_gP`s zP^H(@%?+=Aiu-bVF!XU06ji-XDtY^7`NiHLCJSf9xcDaNdUVrL=EZh*osimA;`HUd z(56olP>q1ms-Th7i$fn1t#!dwi`ro7Y$)gqTmr8m`+^k*1v#3PfKd@JR(9;G;W}v! zvszp&OEZNB$aZB`PAgb9Rd@s;I`FsI0SN8`BYo+=2EcoT6S?4fg__guVz{)yP?}X~ zj&PP3vrVmd@i*%p;5qq8i|oEe@3=~qTh~qYW!=%@z~~;!4I2ynE_1)3uzZoII_%qu z@l8#KUdROt4wtVR1oi$LS^ym_6rME9H!6Xj%>O*SzkfQH5YJE&t9@6hI;OK83sj?&uV16f@fJijv7yd5`2JiFaNg}l|0-Oq9Zlra6o}epxB_o{tk|O8M7AB)kC{d#C|t~jxiv@KD0GcmOl0eRe`c9_Tf)lGu5o-R1>EiqSIsi z2L=*9%xBkI1>edT?)#0na9T{4!RX$j)BZ%I1h1Mxe>}%B==xJ;sT#Zo|83^I(5ziI z{D+^6dqr+Ut>SI}?Hf-@JyibFc9?b8IaUG_bz77s)g6=ZZADyOtCT*ipV4S5ZC>j` zw1pyoRusc_`Bk$q;THS#7kczI`R+)%Y@#uOKB~5H-&3=Pw-jvmr9bJ;(2Khx8caco z3#j2QZdAW=*2@$Fy{!iIeC;edSpkig5ipR4Y`cGM|TBjgi3VUZ0Y4k1A{w)et)vr*gM4ravQtYlZcnvnyLDhMpTG!y8G)}j_=Ct?4Em&nX@vz zPwyRp&WlM%sm<`7^P3%s(`f z%4Wy$FQC{axi1G_vaFP3DGcozZmoS4;*@0(QtrH=UvepshyDF&v1tqZ(z&B?Y+i7u ziRGDlxfw}|#zK&k6jtG}%9B!Jjc7Xj-QbRZ&wbBi`0d%HOvh8K+`1&L-Mg#ZaLN|(xrR8}4Xi=rgyRO={9{VdIwKu^nc|Bsd-w<~vd3{lgLoQ*C>b`GaGWa7^k z09%VR^TlsI^!+oSG9A>en>hC&#ev$nQYmR^xVg=AXR7CytOi7f=kk$zd34aOjxx+l z6k>BZ-dO=H8WE^1=LJwr8U za}TEaw-mG}{FsxdnXy047tGM2Eaf={9a&EtrC$Zbu)7L9w-l^vb3sR4RO2?U2>r!L zHTe7UxfAmZfPrNhi{197;;g|2pB`W9F+o(FoIJRx$L;4%Uj%=zXPvinA7?zLSUHqo zmo(~}#EK$>qE<^*gSs|ur_wj+xYe|L_sfYm5uOUxdcN7NzFT1#_PLpzT)A12Q&IWf z(Zk*p^1oYW{eLdi|E+^teg8n68>sljf(uTfV5)f7gb^1vM`eN4D0*|XaC+maS4sm;T=e1Hu{8S*9POVD zdP_wMUgvDTY|lIbcRqJCB#l7z1R8jSyJj{YLp$m4Meu6CDHy2Y*5!0JOSC(J+H~(R zct^1PEZY6t4Wo@Hr?T902e^#k0;EbjiPAB)AfXICHyf(ePO()=Ite42KYiO~^!?nx$%6+|^zaP#wMStzA z?0(+8bM8i&`e&z;YsYM=`gNmXM0q8`64A;XL0RVQOTnIO%G9 zj{NWEZ+o6&<($s}??7;-yEuLM+nwnLQa&?GmhYTZw!-u4ztD^S^szrGdR-q>`&_;1 z@K0IEj;b#Ibi6{HKrE$Ufy=MuQNNB;Etc2z*&6h zHq$6YGnu65sK4;Qv=ciWy^cG4)-*=sBt!z`(RxK-0eJG@>AfnOYR?4#GVH9HaYf_x zAbE+MsIF_ylj4SNorygTd9(T2eu#m?MC;Af_L&AOw}YBKOS;BUlb`^@&tRHoV}X|A zI5x3TlHc&`TqoUnv-7I5(LuYcbw?R}GAhsbY&yGTXZXNp^;O*d52EO79*O^Y_Z9(k zy&l=EKc4JuZoMS}x;xWTawAsg zh9(Fj!;B8_m9R|&r@agl$<-5=yLJReCn*U)T&2eXnoEm=Sn*BW-{}xmxut7V-NNXVn1vEx#x+6y_@cb_R?z zwMnXW4-B0_^lWJIDi$cr&jeAUE4%-Aou3693w;n7IBlLUJ^&qM-HiJ-)G~tnNM{0o z$ta_Kr#(i$b|3|l2Iq-#-0e~-$(v1a_>2x=nFo<4e z!7c!W1kdyGyGC~ek8J;`g2QEavMmq@r`gUp%1oZ0h~7YRZqF}6s;1^d<+ba9 zf~NB&P>A5XA7nQ2f!RNG-PKWS`fGI8dsjVA+_fLIzPzfHxgU4V9_8SeTkyUeBp=i; zBBb}K`sX?86j8a<^dp}Jb_6%nfsTgY?`@P9Rjyh8i$8W1)Q2E{n#}?Feb<^oF6NF# z>fu_Q?qT(DLBMWs0YKbP*QQp%d)Fy%Itb$5<)rIuNb`O*eOHGPwv+-~1$4B>l)mRr zN6!DU{rK0x9n)uiGC@~tJyM$NP=4lImUSp=tJdBFRo6QIU~M&(Y4E+5kA?TpCWzTV z4onR&x6lf;dCO>EGm8iGyPRG;y?=P`ooDARB#17n8c3d8QiYFfKU_6&rsZ)1Kv$uR zjWS0@3)L3a!T{#fuFsKx&Fx|y1fNge?z4JC;B-D02f*Q&MgO15?7qHr=UA6!%sL(D z(BpQqw6j^f#m$Is#Qp_{4;Ofs3e*~!&S#u?*Wf8PIbT2|T}yAfaKor$(=cx>0SDHC zmvBwgwgkGnG8e53N)Lf3S3z(-+V?sq&@ve@OQI9_3`!--{f3&-?`1+A9 z`R<)!ZB$jpi4>xW$xP0i|@3D-W?WZLTQc3#m{G46dE|WE<4L}UKb%0Se z>%P;by{stDMr~dKuT3#$EK*`yPXzTxy#wTHt8%n*BJmINq?qgFF2{p zrd!+9qx`p|FM@uY>@C+K~%{O`ot)A5%wgOeYk?%CaS7?s|=QaQBal6?c^{t>4w z*}Hx|oW}DhAQhDZr2*u-%H6ALVYM#kogLcnO>cHv6AdT^Jp6v(G=h@O*d28oRjZ&ap2)uju~+w*LP0 zFS~4pbdGWf<-jSq8Fg&u#&x%$0KCgNGZ)RC9MyFTf3X?=-WRaSK1X&H%;nD!_rD2; zbVKa_G?o9~$84Rvy`?}M`RNd;C^BxGckc@_vOdIj^>AeR=7}2X0?hm^;QB33chBmDSXxr;60E=DIZ)&2=aoh#%FASxefHjw;G1Oo26#hyp+zrB?FP@ zj89|8wHqnP&a+PMj=V-=KEsSt?Eh)7$vW4eBtvAEx&Jh)jD1Ovr1bm7p9ylWih=a) zYtPOA;~0w`UjRqB?$6P$BwwhwZy19}{e1J=&j7e39;=_2kG^@TVx~nK#mO+X26%97 z)<;LS2mf0tAf(oWZx%&vPb+iKrTbTPQ8E=~aPRN!RfMgQEqq zPPENG zV%b3C#eDl~*aPEI(v9yk79uvw8Se`gfbj{v4>XN4ZXV~*e}6mJYbb96!ILZGi%;1s-V|0fjut61`Q)TOWHa@#i2I&ki6ip;3`XRgx z+`N>IJ8;P^=_HUQdDy?sO#FwB-Q|k{ADe~CJ z_!q$qPsWVD#hCt@^|0fl|BWsDp@F_o`uFUitw_no2ATgf2Ft!yeQ_}d9nDbXj|}`Q z_0?w+n#o8Xs&CjE9JQ=ZQE-P_rdL^;(cem2f{zXkXm4iK$qP%*x0&Kk0sM7JEMf@{ zbEBWZ`yhV>=b5hp`O0m|@pxx3{vGlrN8=helA||kYbIcu_^y?322UOc?YEfiF+5D$ zZ|Gd-9uB32gcth0OYi?a79XYGD>$EP;w1t^(KI(s*GYL6yT(3q8Ag3xQuinw9%;5u z*4m1J$}`#x85QkM`%1YP>vk5gPVkv`$vyh44YzGG2%J~GAb~gDCN_+mwB2CV{~as3 zufd(-TT_~)EDK89-Fw> z@AtBs_nPrd`C9mMjOO}u7rnHhD4Dpneu&pyMJP`*rFBqpCkLQhG4mwkL+W1KL|W6HVmlwvAQb^7GDdH58d zA9l9+m5*9prN6&(0Agb0w-kq<&c+II@xnnhYA1RftoEYD_c?|`Eq^=l%v56I6as0# z65`Diq|lx0Q^sKQd?Yx=%a0z%^gC?_R}#}$&*$r2?ogi}YzlQ@9-(GIZXkSJ z->Zn-enMIysY;KO9-(BcRu<22!Mu^~yG;x_o6M2g;bZK3OM=+CN?mNSfr7TU4?!j+ zygdPFR5JWpr31=|fq&0I=50)cBrWJr+7j0K9gKzA75iij2Yl2j@$bfrw~u@eBO$q4 z=Wf0>@d%~7BikE7)4NV~Hr{w_#kDTmU7D2dAv-YhJ;P~%f_2?Dm~j^G}7+F+MI7gw4e5cdqUC# z$MLeC#FB6@{CFPg5(~6X6?(rD$g(!LM(Quur??b~blwdWUoS9W%6Ot! zW7KS&cH1>?HL`drzwD%Z_~{KpBUY#^P|SEpEmwVGbpz@y98(3%V(5o3!{@GsS%fTh zCP4PT-nD6C*5&C=3Y{PvDvv(7RA<*oID@BVNDSF4z~l`w@$XVV+l~V(A4+njZ_tXQu zpqixqmVMC1wtWZH1J)OH8qSV86@)R`Mr#9Z#W~Xpxv=hDvG%|(1iieIhF=>SvRrZX zmTN5yP47rUJaZ{LQ1QtPGL~_1Rj4mLO*x?gX5V4>G37b+-}Pog-*{;DQaGZ1^2okv zFt>IAT9%Gl;w~|;2voRz@0)(|ob+TywVP3PMSH6^+j5u;UZ5e$B)7sQ7A%7!Qo9DU z0d`mPNK@mqR_Cn-3BNsg80(DNEt z^wWjMoWg%y1RA_u-SzmoE-SM%R&1_0-J4B{T{KYmUoAyG<|46g{V6)6I>hgm@xPXn zkH_o@^WJ(7Xxh^$ETTCZz3Oo#$t|-!_Y8j4IjuYA0)HbZJq8dGmD4b?M;7EbMbr(H z%)+fLf%PT+lTS*4*wXiI%|%-5SB?A5E{rwAo)>1mZ67LnX;dWPUnV{}c{g2h{j$If z5*nrf2U_hCe&J<+3LEP(4D3O7&}+NQ6@ZOHk#vBDa}x$w??W6>DK8_9NEObuyZ{-uu2D>9%I2uV#gh~kf z(ZIwH5ort0Xr@Q{?<{+v0eR^SA^muN8jF@n@#a~Z5w?~Zg25mYTUg`{<1 ztzh@=RxMT~cnT-TK2Xtw9ETj9BKOT`^=4~gdx$5Wih@9+zYL%QsAY>~?rk-|7KN7- zs(CFHE>wCU&ln&gAi)XDP?OO}Dla8ox1hT*x14aX{W#K8Q*3RQA9!!x7(-iP^azl^`LWkc;$SN#DcDVgbYEr?4~OgIjvDhu?!zc!MbpuV zbn}of6MPqjGkpbL-Rl=LWb|o-Ak>a8ZScjT=07E&x{9o7B{0uW>n|MagCOBPKvk$h z2OiUYaQd{z21BYG3Fn8_((+i$XSAQ8i+Lw?yt!fQkAem>*YQBEW?F&-dS^GDQ6Wjd z@&4l`%q91DQ{vfn-(_DU(h`M{#srK#rDM!!AFCS&S`S6Zb1rh%d#GzO*3K-uypw9p zn`#KviqN?a``jmiaZfsyKd13jO4hmxh35ifUq1upv*%C;u2V^v!lM8#vGXaV`^X*> z%3SnA4Tjg}GPofLpexG2@8uBL`vU^MkWYRd#O6G!FSL3@l%O}1aG?a4J0aZ>jep&o zfcqze4^M|w{>Fm!7dO&V+im&POC;P7gcdWU->f4#gGZWrjn2hA?b70IINAy&HhH5i zUrDMr((@83xoXD$5YCT6MD3FZGJg^&2P$)Q|0Fh@v?0V*^(FP661W+fq0I#sNpo=q zvbdb2*DpCdX`>_(T5rZc_o3!ntJ2HuE(hRW6qyZI;DMDl9Y)t!p>gn%A`*<O_uE>K;=&O{N61@l)%Fr&}h2E9w=kuCz!fcAVh zMic$GJAJS6+}eP3v@^prp0PbhEf&qsCbbNOy@o0dhL?>D1MRy4e2W7}XA5F$0{-%c zRrQb|(ARiwFk<{0PZzqWS+W4%hR0B9}iM@ury$jaW6L%v**>H*i2KOv! z=5XGZPH@}2_DXc3xh_l^VfIT%#5$V=an?zgvlMvno-wN?z!`(S!+K5vT3UiFih#^! zvb+2_v^DR9^@)7pp3Y4q{=oynLA4Ft4>tTVV}P#u=gCWI>BWq)9)*F&Wq82y;VKdATtV=q)Wp)Sw4B$R>- z=Sa_Hpxfs&SHh&yOiy+$IgA00aT8n>ycv=M*>*qvrI`pl5W;$!2mL#XZlNiX$JK2; z4rch7yMkkGXw#=z?d4wVh8w(%l-w;A;3rk)sJ>15!2eEmpM?wl1KxCsZp?873{>r7 zjK6JQX;)z5oUcH~k9shLgw&h()n1L?cA=f!U`ke&Gf7JF5~%Mx8omyTs@Zk;R@7uM zX^rats#HfLEcAU@+fcV!4nZw|WWsD+Hvv2yCNjnwV>+idx~Y}RscIdsEUlZ9ofq=s zvzxbWcXVRMmR4PB9}L78^4RW8 z+vv=q$ZYZ?Ffo>3GYe2DK>lv5!)%r|Yvy0tX@7b}mD*N@>>+Oqh6CBJ5y4qGRu2s6 z@=;-4fwg+@fnpmA_Nim)V(TKC&Y~ayf@m=TGDcj`Ah}Zv@HKcz@%6?aehU(Q$9C#( zc-_S1KPDHL%N33BrPD6!gg&Gz#+NmyEHxhMT`3f8@CXP!r;jzqxWZR~T3Js)Pf5=o zfre%wMmJn_t60Kki=kQYLeLSKAspp>+BhO%fe}iTDSK!sOckJ*6tiXyqC(YocJ$;*o%e?VDImv4CzGh8uS~+1WF%$7 z`RDG|87H7~);3hM(66<0L~s;`v=j(kd&Sn4BXN_c;pd0YTL6WJtPsd`v(CXyx7K_q@$u{DXZ>_S z>JXGQl#b{u?ragl&F$fE*IX|(u(>+FvCFrJE>6rXVXXhwb8mxb49aLHAdP%9rTy!; zX_)Sh!sZ}fnjg2=856t5|EPdF^^qv5vO-&4g+I}0#+k+QeorcXQ`{Qg$Bi?cewWdk z(?6k!O9aD-EN0qSvU1vp2owM#e_n;$5HLewM^Ne3Z;PJ9^ZUuy+iv;BZzBiKyZE$O zf|`2B;WY-0lOW%pE?IIvo==^62k`>7JORwV-gNt$()yFYA++BACduCq9@6efg!gpD z^o6*N-0dybRIH&u#+58sYP&f{48PNpV^B>uEp(`|3#{87iKu8>ZWdiiZ~1 z6F2=&e?d2`#t_B$qqIVHQQ;$*4QUa+uxf6QffZyq( z0n~;>;VL~t73j!<`*6eerzW%px*FFiLVAnJrY4GB42_cGXhmXT>`~Od7Zv*sISEB# zjy5Aa%+C*1mX43qq>WqlbrQwk$YSY=URub|U7-9D;$c0-nu+a;bFIj5N^|NR1ZpYg zK#=O<*g&t#7}R>Du??w~3?thSav94V?dC~9F*O^#Y734S^;)fpR5Dzc|@VWAj%jPGwz2!n@l#Puv^>tj&A_SUtS5pC;OJ0Per0J;ji z%fhfS@$_)FR%T*cyyBPUeV;~7{(ZLBY3eWShF^19Wm;I@;9Jb(jMa}iN+370T5j)os)kxb#VX<;*%Zw|E^ zS`m+rxKocpjN=$V)rJKc{Yy)XJSz|H*^HTzq9X6tmVH=FHgPB;$W}KE9J%Iy`zoAI zm}%XEB;)u%nV@=6n>{lD@7B-HW^=XK!JQLVt@oM7f@vA!81^Wkwa|gfUy_2BUw;tX z?nwm5Fa%|ugG^6mOb$Kmxp}hEb4uPT(qzpL07De=%k>^;j=FQ$ zKY%hM4W+C<6CzPeFv}g}R+WZ7HN4~|4%e!Zcji7-qb$?YF=@r zIWI>?94kd^%)D++H}=>LyyC`KZJA@!Ir#krvq*aCwYn00H>JZp8?t0 z{P4upqAb*3#Wrp5qHJ?!6$FOyf>NzyOjLxFPa8Z}m3w(*ddkN5VgI}&Z9?9wLA>u5YDkIo8 z-Jk6HOJeb%^v;}?0uGOWH%Q0pY!{iXQntf9RADyxR?FqY=c2R!*fW=lPt;l+c+ z&rL9ePVRA8BS!SY5Ef*siN1AE0PU?gk85*@qw#w~O}KaOevzF^F9IMIVO@%C@j8wQ-ac zv1cYfy4-Gi9l`v^sMcDnA4eCDLuMoPmH@(AP-LI#;!f+7)@yf0c_npW;u`}5&S~|Q z#58zew)ofV#0kJlRK=N^XV`lLu4eEOe<$}S>p9@nSyAjdEPbeWQ4|`{6#kseiQOZj z`d?(5p}LfIdL@Vf0!|^RCdp0bQ0erj&*?gKB-v432nnNkj(dp?hF}}v#o4mfj>K+e z2_C0cL}-;v7TZ7om7UtJhlA=0oRD$mdE9mF@al$27Ep4#Et@>WJlM$U?KxP{Rc&F- zEt+iY4AVnvGmLf}W!^l0Knz`hHc{O0uZF8G{@PEz!mQAGYuVeW*`11DjLu7iy=y~7 zGv-0#BVWP!Acn`(O~A>Nz!NdWr{g1vz~a+nb8kt#Zdy12KYAWp+0`YS6NUB>!nJ#4 zO{I0BDod(3n;c24^_so{e}b~ntSr2s-^|2fW&9q04m&VxA>R}c*k)B{5P2uCyzhF` zl7SV~a$JOBy`D(CIh&s}@!2LF_3Cuq5KT@X<4WU(BC6|MUvg0DTU6fL1MY^k!PJ@( z>9yXyW2t{^HsDIzLEGUX!0R{&ZXDC6I81$N%5X}ru{a;&KlL3x62m&oq+7sY8VBiT zCNBZTf8!*b?8PjnKo<7YVM719*#@?3z|c%}D=+CU0N;ZV2huamfEqOi z*_u1I_QJ~pz+{c1rrHgCDXt>EXr&jm~J^@daN!T*xV3kQW^ktuzG&LP71j;n&Bt* zD|)(n+yHZ(k5Td8 zs_c0c%(X=E?0HkO(5nR2)p{9N)(Q$EE}IGt8iKKXx{F(_`odgCiZ5ZY-{axN60t8z z4>tAoreEg@vOq=U)!?*}h)$6I8;cWXr+Xmstee=rbjoLTw==AF>viH{5iqLNafpqz zxGhfqr748dq9xuvPNV@Ut_^(}@nMA;hXg}F#(ufS!no^KyNhjlh`pVUIf`|QySB}< zBIWcw$HbAGV^Y|7i2Kx?gDuqZim+x%*$i#;G{eTCtJtbpd>SDWZ5nHbe5PB&yE&wp z|1`a(VIaNCr!WD=`g0;KH-~@6PJ~GTTr=0^x1I-UilIc{>tgo7SD}{8mc-mx`9&$B zDV30G4hO#et;J4B45D;wGUlC6D;e|akAjOOY4%-?aWbvR_{Kq_zg6&rQJwXr7L$S- z$axpwi&d&rf4vM>`wATX@~dJ7U?@j$?TxHgb1rb5(TpI&=WFnWVOkA7DBLw-8bF5C zm~NFHZ#kn>`j3PP1%PR_jnB#aaP=-o38aH?#OfWn*1rG1JE%58Gi<1r@%qSHuBeb?F4_BNe5Vw`nh9h_h0 zHTrg_7(fNJb;^MSAX&nOz(7U^#94}*$fObSLCYVzE*HdYJAIj}#fi_hz8sgGYvBi9 z-4S+Y(Z4X^0+YPc#;oS*UuO|O!gL5}si}w$vcVtskdCHav_@30ezewOv0MO)u7MY1 zo7a}IyERMu&yExq$75<#%Zc?>rV_K4d#YN^`FKoq9Ge*a9BMVvpv=Z zHbIwh{X6bniOX#UYVlrE{S(#kj8)cQ2vc~(&sG$;*G*LXoXn-(<;2}Ez)wfG28Od& zZN}}43Gi!<)@MrN2Kp!ix{Wy_eYU`t{w4em_TK!j$vgl1Ra>XiI@K;y5Cy4PwWvTr zB8Dw(RZ!MK2s@;TfDi*h1Y}9#IA2R!Hf7&a%bEa5SrQC^MB9-)s9;)AKIS6tH-H}ugxzO%|8=A>$gWP>T=yAiw(fI?XoBT z#?j&hgvf-F_9`C^Of%=77HLjULszb`Vtz zB@N0pOTvCBIRfV6)v-H45aq}0i!2rjLo`0Rh@HjBXmIFuvXe zpEXEHj7yrXBuJ8G6=Sr_8lZ2&XhE2D=pS7ls>88e1%}J9_Fob&7C3Aq00f@GPV$py z)#X`^m5r1(Rx=8GwAdof2Q46+?uvZTSQZa8_3Y9jbcFs#Re&Ozb6?V*b%`3jOT=t2 zaW|7&V+#Q13=%)+t^6#-Ve#1(XD52~jT{|mYj|d&KXH;T;NC16!7t6INdxLUIo__@ zM$`V=EV#?26zX;bLzJ6*4GkR&J}Q;`OiL_6yrn&x{Tz5>Z9+^2tl}-FEf(6qteRrj zF~19bV;nQ7$Tlihy4hA= z*esk?8)BkUh=Ikh;shIgHcqdf=h-(s5Aj=2>FB8 zV8>^}fD--~^tKm(6e?9S8|oX*io)fybyB8%D3(YKoF;;hoz6lDE36Sg!@3mge)q{a zR$n|0WnQT-2#&-UVc+Sy7W0?&%u7^8N4iGJt z1?SoCjcgQVkuN+;g3h=Z;K(Is!#5JI z6sWwulXg#k8)R_;^R~Ss!J-Ajb6T*pQP!n zX5<3mAo@*>qiJ1bpxj&WYcj)9HJo>Y! zHw*LCrHB}Q8y@im(qoajrSm5K3<$%uB+cymO5>i*$;Va4HUS_7F7{@0Na6R98-8P7 z1M4)bRvXDEwGfs@&UT*XofX7pY6?pVTBuoJS^z3h(2%5h`T4`AZf&-{f^yV8dt>|1 zO1)dP0OAXaYdlM_ai;T13!0$orMgaw`|V?$hGxw7c!M9al1o!>O2)d36Ay~HF;`0s z<_6aa)kl4VV|s(L9e%cc&b>`KI7Yy=iPd;kaWdYi!$S*}>eY31C(>Goo%C7m@P@~9 zC#tSK+&ppDd5xQX1~ahq0X)L*Tk+n=+3_8hEcD)mkI7FX3UTtw`m5V>y4}=wcRrf@ z8f$+&Oz+zmPO}FH3|*2M>K)b!oc0A=GSL4`u0Q15dXRm`%w+`D2=zw85u56o&i@%3NKt*j-N@$}26h<(rpH0p=c3&H(|0lR}vIIZac4cMV z(}k1ws8G$69R5hOSv8=bV>q6c-~&*kVF99j>U9L}bwK`i?8Y$~X+B4?fYKELG*<

LOc1azf=<8 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 z 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 Rh0xpfnp>I`{CMpA{{wqRTUY=9 literal 0 HcmV?d00001 diff --git a/src/assets/vform-logo.png b/src/assets/vform-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f8cc5df753af1fd5964b0692553cf9adf55a61f7 GIT binary patch literal 453 zcmV;$0XqJPP)-SoFUhYL zh?*2y>xpT5UEhGV$+2ct3h$WB+O(9(TxUwDK6aw=z#Aj+h}5oxU4gyXbeLuQw^@a* z1<)MtSp%S2uFj8)XtDA8q4i7Hm^2}J9~b+>`StThJ)+kEQQZF97jc;B)hE$%cfK#; zk}la7a{yNefB*=908|^Tss%jv{my%gYYOm`N(xnA3vxdb=Q4ou6cPXd5C8!XfW`ng z>q7ZY(R|;Mp<_Y=C6(U8iFkwyfW_=zDr~{8Z1dY(7}glYDg=sQp<}$v9K`!p=0XE0 zXT|tl<9Libg#I;RaZTJepDUjYUHja>pIXHmrr00000NkvXXu0mjfjU2?S literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fc442ca98639082156d1b0ec2b8504ff07bffd08 GIT binary patch literal 2388 zcmd^BU2GIp6h7z9%uYM~*_JNdicqF4-8E2l%hGNIp58`O-xKoAT~xHOf=ENMdH}7zdJLVLcs^0y_c>>@LWs z!5(;NG8)_e?U57E--JG$$|Z|G_(#8k{ww->^V#$1Z%%xHSe1*&FuPzS=QgJ|WZ?S? zdVB$den+_kd=q`!Le4(d27tLgVQ9-1Qb~S?u4Dc==teGiuE-rog}4j4nNQ}d(W%u7 zMB1NNKUXZ2?Q7v{H;5W$VLu{cS1Pp%y{bYb!YH$Ou&E9Mc06?d#!3Iad(`Cm-u_^I zS~|M2R#8bwKyC0|m%EZmv!qEchc(CmsyVuAH>jHih@U%rbP6-wgm0`{ysX-?a{@P$Nl(eYYkxcz?A)ja{Ot2{ zZ$RI{5sr$`D95(4(%#d~?R^;g6m&<5E5?(C%8eIkIcrITYog-tc}N zA632*D-@<@=pa2$Cvh?(93F`eg?jx!eXXqf0>N$$x?*>1jJtXFD38Q746)9j?m7h= z)DQRG@JOdFZ9zR0>l{l1zTCUwe^)f86(hT*gJFkuHSxE)6AKXTw|l&thY8u z?&`fg+TUOAy?HS*wQZt(XV;+_(b{}`@CClb!`p)$6=T_xvuh45EyrUoZi)ZMOYy~l zjPXRkC~xiY-OA}3bPzeC3%h8Px0vFi%YHHYz8379@VAPYLtT-;O!&3P_F*9ma)T`a#%8$B#Yr!5{s z;U?-pDZ&>*FcYS==3Bh|P~7Ves=IS)9vxH`tgy-&HD~f=t7NAN U*)zF(qpOq(Z>S5IIm?;%58K;XqW}N^ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d7a08f5fed4ad82ecd0113a4de41f4f171ad9f06 GIT binary patch literal 2468 zcmd^B-)~cO6hG(Q-gdp4D`Ta_A#m5S!eF$cbX`YqD*{`F=;k&THGq`1+dBFyw|BUa z5UWNL14i^o35hTI;)^Cm6BCq%_^AJZ8eo*6rY2_^`iU=@HNnmxq`9i1wiZ%n7sK?I>n1p z9I@|0ZYiV|%j~Cl*f&Ggim5_&aBB4ekrVz>pV$+O}VL)^qSzYPNj8{``8saI|>6>LB?Ah)pC3Ery6w=oBQD%`|Q7-FNf1QqtdTPNzV%sg-VXP_04 zJ>aMqdIyQ~(1Ztlz%EnEXY1$#(4>W6wQ6ZHdxSFJiM3f&_J1EOW&@IT8}K4-Zna3f zl;uf_M8}tLss)KIFQ2u@d_yAiak|R8`HG0C*Kk^sIBVM|L}8+?c+~Inu-C&*4+p%i zU?3FX&>%;*v)tC%#%)2&K^bIn={0qWsxZ4RNN!1zWQSY1=RX0TAUB4&r1$wb~vi;EnYPv{j^e(k}K6ZadNfB_#`ZD=2n$!f6LA1bvYv(Ktd6Y z1$Oqu;zJzYCX(&yZ0qFCKFobxAd_?aKkfMQeJfc-hRHfAK|z9*(h7PuK!<3Q zPU3uqcJ{|(p@4@&!GO!@a(ewfJSLA0v2TAg-j7EC?T`9hVGagbd6U=g3Uzs%!NAUb zpDSisLVgI_cz<+|`(jZ0TiNB5KYJ{lQ`u5OE}VKoQ3AVrV+FU{v)OH&K6m1y zBO^iOk1vKN<`+*K8{e?^!Jg4Q9nVbgoBiEBZ&j^X?DSo>snO2!$By&mmyYGsj&`+@ z%sl#nYolu*I?!Ekcequx^6=Qvk*7RTF*&h!yw$U3v}a%U(}(o#ezofLne(l`^vTNT zf)>Ep!rfA@%7<`kG*KJQRS@5PA8xi0bSMyt#iKs2Q@%g=S3cUVL}EOV*tH(xx7O3z zu2N0JjVD%bC&mT_#uBTyFabg~^>Xr`?Wm7vBYjKw!pyM=vxUX&yUE59xoE46W$1U< z*a6&QV+FsIF&jIfAF{DZd(bOu&1PyR9bYXw+}LL~y=-Hq4fKJHC2FPXHkP6P%Ek`h zZ)~iPkM7vmNgG(Uu}ah2ZsTSOaZWv~XH!Ntqn%mOa_LfWrc^Z42AIgsF62{sLu~Nr ztX|2LirT(#Z$mYbEoSw`I+b&?QNx(gX7o})8^(g!e7>ZW_0oJcZG`6xqkJF|5gQ48 zI9)2>+CPl4vy>tObA~iJLra)*l%^6DX~vul_^s7Uz<-t&D34hE9_w1~X?W{YfuC4a zqkXsld+&)FfmhM=T$@jY&SAGGvNVvB2GX%o0chCHFpEs`z#5fJ+dS4u!#hlKW>lFD zPy|n-qK1Fith6AGnE1CKhWNj*-cVR#nH{X)_pv2ctYmc~UCJ*Mif&8LOV2sxa+$0n Jqo-zx{sg~+gTVj* literal 0 HcmV?d00001 diff --git a/src/iconfont/iconfont.woff b/src/iconfont/iconfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..330d9849933264549c56e5fe02e7232eb7937586 GIT binary patch literal 1448 zcmY+E2~bm46ozjS2n0f8vuI@#5O5=58PHHaY5sfm02F|s zTm{tER@K^XdM*Edc+r9=0H9Q%YYU+?tTxT~(}*_E`vL0RkYI8*HIl_)q(F}cH65;{ z@^!8cV-qvjFdv3U0YE2qMBeg>i(y0qfVm3mh!A^ywsw3RG@;iAwLZj5We6jP<8afV z_a15jL{k$!5|df5P6=i}Z4Fc|sN^uxVP7RY)J70vlnzKtVsK)hw*&U|gnc=#`&YA4 zl2f_xybxdqp%z;dUrsM)A<+mj%q(Qd83^~#9F8%JAPgQT#IyX^$4mn7GK@^bizgVf zvrnPHPo@}u@XtF8q+BAAN$&M^b94Fp%SII2KiDMZD1snNB!(?fL-$6|Ht1KVxb?7; zJ}V@eZG#dy&}A!iqrmh!{4eR{Gle1z9tp41H z4}Xy0tD0PJqaLcSDtvm*-kcD&ElykQ4X$m*9@R(_D#~VQnWYcw>w4y1+AV#*yCoPq zq!+9*sh;{$`vu(N*+O#ip8>kLJx&Xsww&uMd)wil`=Xs7s-cv~%$j9h%pB*SN&@~W zhC8Vpv@zf|dSj@2H4@A47||nXbyJp6M^}NmI@46c!AOisaUW)#SQa7@VGywo6TIoU}IUV97+% zEpF=~wkfb;Gqky6+)^R1B5^a1XUd|Gkb+~33jFskLS(0fpug{+6A3Bgex{c47 zwNwYnB@O&X#;ttLbU@>YVe zYU4A#2eMM9O7l7!GLxGuqN)0Ii}iO`GfPB14l{acnf#a6%|&_&hk=5E5QSTv;*R*u zjdRVd(ZuPb!OqRi&-zB(M^k54tSrAvd*kw;+amLVe#ERWb)SA&*1_i!v0}o!CzT$k zZxu2*V|#KT%6e?Z(f&w_&yj(=+5Y}8OYG@{T;lO9MuwPWrMzrO5Q{d~@M$#0} zmsGB5S63k?N0pf<%N4Dfq|p5di;-N#HNQ*Sgr;3}eV7!(d6M4abET<8iWmPh?M=FxGv+oZ(l z?uiRg?}`O=y;J1}!`sbi*_CuE?dSOLSG4K=T@xnj50q5nYMiNOWOV~ma^+1E9|P<4 zgoZihW1+0o=1z3}A!Wf9!WnDIhUinW$w`+W_I$l)mo)0fVDh60Zn$pW*Hi%tJ>L^S zYi;b!aQ5eu>6`W);cicQP*G}E6!nOz-AIXg*1VrGg|d$c$=5m-@kHom8SDKO;KGvb z!_U3;-(d296?U2@C=wQ3C=wK% literal 0 HcmV?d00001 diff --git a/src/iconfont/iconfont.woff2 b/src/iconfont/iconfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..aea096ed481314bb96904c3073681c132894ae96 GIT binary patch literal 1072 zcmV-01kd|-Pew8T0RR9100b}q3jhEB00^uA00ZLy0RR9100000000000000000000 z0000SLIzd3Z3jskfd|MAB|*W!0AQd4WjuU8_U+vF z?pIB_o5V?~(@B~(;n5p)6C`NSLZj2Q5z3#^sc)bV$WBou3NR{!^2;Q;mjdh*5!WD3 z1>Bl$J^#-!(`C~zzs=@SO;y;5qrKs9lt2TD3Y~a^9GKrSyy_r#<2Zq?4eLp6Cub5s zE$QO|@xo-N1?q%RR%C~^&@5P*;v-OKmlJ6>06uuXkAJ{F)D(?MpL*v}k{-nVD)?rR zS#4Go4g$#gvx8kl#UUVx<3i^{vLJLwrYr9!cM8yyLit5}v)EQZpHk1rJmvHM$15t) zr0e<^dsl;tjSK=H4;W#eOlu_>lrWN?I?M=KXB*D;uFNVp^#lGh?9joN5hM+Jb_-* zb#`8H&&Y=1;oVP8%s&yJbQqkpb-4P~NhM=*>h(iQU3awaNDG*E!$@BK6RXF?bb{FH z!1VxItZxTF|66rQP`r0M-qGgjz7ipVkQdnPJB}abo+OQbE>k*Vs5WB!9N^NA{a=dB zyNt#YUIDrj0_vsl$a9LR*Rgc6Tk>3q*+SDhbUXBqRZi~&)J-pr+$;HeEp&T!zegO+wG7-LS06 zo*=$|H{b!R-Y2NnJ(jh;&!B#n{{I#J#<}g!d#ary=i2rOeqJ&ZVbjXmE=^kjEPwHG zU|A|k-IOV*ESZ{~jw!g8^}4#ZFUHhtABF`ulhC$^plDf#s%;aQ*h6UOISoy1*P!b_ z%IcmOL?*I>eOnNOv3pPqeSvDM2btIzXju9KP2-S3*WGa6vS&L?b_od9icpW&HRC3d zV=2=j+WFb}&`?j;qPWuI6hS1IyttpYZ#tR+S%~_WAv75LMUlcO#4&g>It|h^hx3Rt zLsIlMiXtEG<3kla$eZLCVCNPDswIN-aCMsDOh_CS<AQDNAu4h 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";' + } + } + } + +})