@fast-form-designer/vue 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +416 -0
- package/dist/FastFormDesigner.vue.d.ts +27 -0
- package/dist/components/CenterCanvas.vue.d.ts +3 -0
- package/dist/components/FormItem.vue.d.ts +25 -0
- package/dist/components/FormRenderer.vue.d.ts +21 -0
- package/dist/components/FormRendererNode.vue.d.ts +26 -0
- package/dist/components/LeftPanel.vue.d.ts +7 -0
- package/dist/components/RightPanel.vue.d.ts +3 -0
- package/dist/components/SignaturePad.vue.d.ts +29 -0
- package/dist/components/VisibilityRulesDialog.vue.d.ts +22 -0
- package/dist/config/component-list.d.ts +6 -0
- package/dist/hooks/useDesigner.d.ts +15 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.es.js +7435 -0
- package/dist/index.umd.cjs +3 -0
- package/dist/style.css +1 -0
- package/dist/types/index.d.ts +108 -0
- package/dist/utils/index.d.ts +47 -0
- package/dist/utils/pca.d.ts +2 -0
- package/package.json +97 -0
package/dist/style.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--ffd-primary: var(--el-color-primary, #409eff);--ffd-primary-hover: var(--el-color-primary-light-3, #66b1ff);--ffd-primary-light: var(--el-color-primary-light-9, #ecf5ff);--ffd-danger: var(--el-color-danger, #f56c6c);--ffd-danger-light: var(--el-color-danger-light-5, #f78989);--ffd-border: var(--el-border-color, #dcdfe6);--ffd-border-light: var(--el-border-color-lighter, #e4e7ed);--ffd-text: var(--el-text-color-primary, #303133);--ffd-text-secondary: var(--el-text-color-regular, #606266);--ffd-text-tertiary: var(--el-text-color-secondary, #909399);--ffd-bg: var(--el-bg-color, #ffffff);--ffd-panel-bg: var(--el-bg-color, #ffffff);--ffd-canvas-bg: var(--el-fill-color-lighter, #fafafa);--ffd-hover-bg: var(--el-fill-color-light, #f5f7fa);--ffd-muted-bg: var(--el-fill-color-light, #f4f6fc);--ffd-drag-bg: #c8ebfb;--ffd-empty-text: var(--el-text-color-placeholder, #c0c4cc)}.left-panel[data-v-9d6dfcb8]{padding:10px;height:100%;overflow-y:auto}.left-panel .panel-title[data-v-9d6dfcb8]{font-size:14px;font-weight:600;color:var(--ffd-text);margin-bottom:10px}.left-panel .component-group[data-v-9d6dfcb8]{margin-bottom:20px}.left-panel .component-group .group-title[data-v-9d6dfcb8]{font-weight:700;margin-bottom:10px;font-size:14px;color:var(--ffd-text)}.left-panel .component-group .component-list[data-v-9d6dfcb8]{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}.left-panel .component-group .component-item[data-v-9d6dfcb8]{background-color:var(--ffd-muted-bg);border:1px dashed var(--ffd-muted-bg);padding:8px 10px;cursor:move;font-size:12px;color:var(--ffd-text-secondary);border-radius:4px;display:flex;align-items:center;justify-content:center;gap:6px;transition:all .3s}.left-panel .component-group .component-item[data-v-9d6dfcb8]:hover{color:var(--ffd-primary);border-color:var(--ffd-primary);background-color:var(--ffd-primary-light)}.left-panel .component-group .component-item .component-icon[data-v-9d6dfcb8]{font-size:16px}.form-item-wrapper[data-v-7667a53c]{position:relative;padding:10px;border:1px dashed transparent;margin-bottom:10px;cursor:pointer}.form-item-wrapper[data-v-7667a53c]:hover{background-color:var(--ffd-hover-bg);border-color:var(--ffd-border-light)}.form-item-wrapper.active[data-v-7667a53c]{border-color:var(--ffd-primary);background-color:var(--ffd-primary-light);border-width:2px}.form-item-wrapper .item-actions[data-v-7667a53c]{position:absolute;bottom:0;right:0;z-index:10;display:inline-flex;gap:6px}.form-item-wrapper .item-actions .copy-btn[data-v-7667a53c]{background:var(--ffd-primary);color:#fff;padding:5px;cursor:pointer;font-size:16px}.form-item-wrapper .item-actions .copy-btn[data-v-7667a53c]:hover{background:var(--ffd-primary-hover)}.form-item-wrapper .item-actions .delete-btn[data-v-7667a53c]{background:var(--ffd-danger);color:#fff;padding:5px;cursor:pointer;font-size:16px}.form-item-wrapper .item-actions .delete-btn[data-v-7667a53c]:hover{background:var(--ffd-danger-light)}.form-item-wrapper .question-icon[data-v-7667a53c]{display:inline-flex;align-items:center;line-height:1;cursor:help;color:var(--ffd-text-tertiary)}.form-item-wrapper .ff-label-inline[data-v-7667a53c]{display:inline-flex;align-items:center;gap:4px}.form-item-wrapper[data-v-7667a53c] .el-form-item__content{pointer-events:none;-webkit-user-select:none;user-select:none}.form-item-wrapper[data-v-7667a53c] .sub-form-layout-item .el-form-item__content{pointer-events:auto}.form-item-wrapper[data-v-7667a53c] .ff-label-wrap.el-form-item{flex-direction:column;align-items:flex-start}.form-item-wrapper[data-v-7667a53c] .ff-label-wrap .el-form-item__label-wrap{width:auto!important;margin:0 0 6px}.form-item-wrapper[data-v-7667a53c] .ff-label-wrap .el-form-item__label{width:auto!important;text-align:left!important;line-height:1.2}.form-item-wrapper[data-v-7667a53c] .ff-label-wrap .el-form-item__content{margin-left:0!important;width:100%}.form-item-wrapper .grid-layout-item[data-v-7667a53c]{padding:10px;border:1px dashed var(--ffd-border);background:var(--ffd-canvas-bg)}.form-item-wrapper .grid-layout-item .grid-col[data-v-7667a53c]{position:relative}.form-item-wrapper .grid-layout-item .grid-dropzone[data-v-7667a53c]{min-height:60px;padding:6px;border:1px dashed var(--ffd-border-light);background:var(--ffd-panel-bg);border-radius:4px}.form-item-wrapper .group-layout-item[data-v-7667a53c]{padding:10px;border:1px dashed var(--ffd-border);background:var(--ffd-canvas-bg);border-radius:6px}.form-item-wrapper .group-layout-item .group-header[data-v-7667a53c]{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--ffd-text-secondary);font-weight:600;font-size:13px}.form-item-wrapper .group-layout-item .group-dropzone[data-v-7667a53c]{min-height:60px;padding:8px;border:1px dashed var(--ffd-border-light);background:var(--ffd-panel-bg);border-radius:4px}.form-item-wrapper .group-layout-item .group-empty[data-v-7667a53c]{min-height:40px;display:flex;align-items:center;justify-content:center;color:var(--ffd-text-tertiary);font-size:12px;-webkit-user-select:none;user-select:none;pointer-events:none}.form-item-wrapper .sub-form-layout-item[data-v-7667a53c]{padding:10px;border:1px dashed var(--ffd-border);background:var(--ffd-canvas-bg);overflow-x:auto}.form-item-wrapper .sub-form-layout-item .sub-form-table[data-v-7667a53c]{border:1px solid var(--ffd-border-light);border-radius:6px;overflow:auto;background:var(--ffd-panel-bg)}.form-item-wrapper .sub-form-layout-item .sub-form-header-row[data-v-7667a53c],.form-item-wrapper .sub-form-layout-item .sub-form-body-row[data-v-7667a53c]{display:flex;align-items:stretch;background:var(--ffd-panel-bg)}.form-item-wrapper .sub-form-layout-item .sub-form-body-row[data-v-7667a53c]{align-items:stretch}.form-item-wrapper .sub-form-layout-item .sub-form-columns[data-v-7667a53c]{display:flex;flex:0 0 auto;background:var(--ffd-hover-bg);border-bottom:1px solid var(--ffd-border-light)}.form-item-wrapper .sub-form-layout-item .sub-form-cell[data-v-7667a53c]{position:relative;padding:10px 14px;border-right:1px solid var(--ffd-border-light);display:flex;align-items:center;justify-content:flex-start;min-height:44px;width:360px;min-width:360px;box-sizing:border-box;-webkit-user-select:none;user-select:none;flex:0 0 auto}.form-item-wrapper .sub-form-layout-item .sub-form-cell[data-v-7667a53c]:last-child{border-right:none}.form-item-wrapper .sub-form-layout-item .sub-form-columns>.sub-form-cell[data-v-7667a53c]:last-child{border-right:none}.form-item-wrapper .sub-form-layout-item .cell-index[data-v-7667a53c]{min-width:50px;width:50px;flex:0 0 50px;justify-content:center}.form-item-wrapper .sub-form-layout-item .cell-action[data-v-7667a53c]{min-width:80px;width:80px;flex:0 0 80px;color:var(--ffd-text-tertiary);font-size:12px}.form-item-wrapper .sub-form-layout-item .cell-header[data-v-7667a53c]{cursor:pointer;font-weight:600;color:var(--ffd-text-secondary)}.form-item-wrapper .sub-form-layout-item .cell-body[data-v-7667a53c]{cursor:pointer;background:var(--ffd-panel-bg);color:var(--ffd-text-tertiary);font-size:12px;padding:12px 14px;min-height:54px}.form-item-wrapper .sub-form-layout-item .cell-control[data-v-7667a53c]{width:100%;pointer-events:none}.form-item-wrapper .sub-form-layout-item .cell-placeholder[data-v-7667a53c]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.form-item-wrapper .sub-form-layout-item .cell-title[data-v-7667a53c]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%;padding-right:56px;box-sizing:border-box}.form-item-wrapper .sub-form-layout-item .cell-actions[data-v-7667a53c]{position:absolute;right:6px;top:50%;transform:translateY(-50%);display:inline-flex;gap:6px;z-index:2}.form-item-wrapper .sub-form-layout-item .cell-actions .copy-btn[data-v-7667a53c],.form-item-wrapper .sub-form-layout-item .cell-actions .delete-btn[data-v-7667a53c]{padding:3px;border-radius:3px;font-size:14px;cursor:pointer;color:#fff}.form-item-wrapper .sub-form-layout-item .cell-actions .copy-btn[data-v-7667a53c]{background:var(--ffd-primary)}.form-item-wrapper .sub-form-layout-item .cell-actions .copy-btn[data-v-7667a53c]:hover{background:var(--ffd-primary-hover)}.form-item-wrapper .sub-form-layout-item .cell-actions .delete-btn[data-v-7667a53c]{background:var(--ffd-danger)}.form-item-wrapper .sub-form-layout-item .cell-actions .delete-btn[data-v-7667a53c]:hover{background:var(--ffd-danger-light)}.form-item-wrapper .sub-form-layout-item .sub-form-empty[data-v-7667a53c]{flex:0 0 auto;width:360px;min-width:360px;padding:10px 14px;min-height:44px;display:flex;align-items:center;justify-content:center;color:var(--ffd-text-tertiary);font-size:12px;border-right:1px solid var(--ffd-border-light);box-sizing:border-box}.form-item-wrapper .ghost[data-v-7667a53c]{opacity:.5;background:var(--ffd-drag-bg);border:1px dashed var(--ffd-primary)}.form-item-wrapper[data-v-7667a53c]:last-child{margin-bottom:0}.ff-signature-preview[data-v-7667a53c]{border:1px dashed var(--ffd-border);border-radius:4px;background:var(--ffd-canvas-bg);display:flex;align-items:center;justify-content:center;box-sizing:border-box;color:var(--ffd-text-tertiary);font-size:12px}.ff-signature-preview-text[data-v-7667a53c]{pointer-events:none}.ff-pca-preview[data-v-7667a53c]{border:1px dashed var(--ffd-border);border-radius:4px;background:var(--ffd-canvas-bg);height:32px;display:flex;align-items:center;justify-content:center;box-sizing:border-box;color:var(--ffd-text-tertiary);font-size:12px}.ff-pca-preview-text[data-v-7667a53c]{pointer-events:none}.ff-text-preview[data-v-7667a53c]{min-height:32px;display:flex;align-items:center;box-sizing:border-box}.ff-text-preview-content[data-v-7667a53c]{white-space:pre-wrap;word-break:break-word;line-height:1.4}.ff-link-preview[data-v-7667a53c]{min-height:32px;display:flex;align-items:center;box-sizing:border-box}.center-canvas[data-v-f940c6e1]{height:100%;overflow-y:auto;overflow-x:hidden;padding:20px;background-color:var(--ffd-panel-bg);position:relative}.center-canvas .canvas-form[data-v-f940c6e1]{min-height:100%;height:100%}.center-canvas .draggable-area[data-v-f940c6e1]{min-height:100%;padding-bottom:50px}.center-canvas .empty-placeholder[data-v-f940c6e1]{position:absolute;top:40%;left:50%;transform:translate(-50%,-50%);color:var(--ffd-empty-text);font-size:16px;pointer-events:none}.center-canvas .ghost[data-v-f940c6e1]{opacity:.5;background:var(--ffd-drag-bg);border:1px dashed var(--ffd-primary)}.rules-toolbar[data-v-114881ed]{display:flex;gap:10px;margin-bottom:12px}.rule-title[data-v-114881ed]{width:100%;display:flex;align-items:center;justify-content:space-between;padding-right:6px}.rule-section[data-v-114881ed]{margin-bottom:14px}.rule-header-row[data-v-114881ed]{display:flex;align-items:center;margin-bottom:10px}.rule-header-label[data-v-114881ed]{font-size:14px;color:var(--ffd-text-secondary);margin-right:10px}.rule-header-label.required[data-v-114881ed]{color:var(--ffd-danger);margin-right:4px}.rule-table[data-v-114881ed]{width:100%}.right-panel[data-v-70cf260a]{height:100%;min-height:0;overflow:hidden;display:flex;flex-direction:column}.right-panel .config-tabs[data-v-70cf260a]{flex:1;min-height:0;display:flex;flex-direction:column}.right-panel .config-tabs[data-v-70cf260a] .el-tabs__header{margin-bottom:0;padding:0;flex-shrink:0}.right-panel .config-tabs[data-v-70cf260a] .el-tabs__content{flex:1;overflow:hidden;padding:0;min-height:0}.right-panel .config-tabs[data-v-70cf260a] .el-tabs__content .el-tab-pane{height:100%;overflow:hidden;padding:0}.right-panel .config-content[data-v-70cf260a]{height:100%;overflow-y:auto;padding:10px 15px 20px;box-sizing:border-box;overscroll-behavior:contain;-ms-scroll-chaining:contain}.right-panel .empty-selection[data-v-70cf260a]{text-align:center;color:var(--ffd-text-tertiary);margin-top:50px}.right-panel .rule-item[data-v-70cf260a]{background:var(--ffd-hover-bg);padding:10px;border-radius:4px;margin-bottom:10px;border:1px dashed var(--ffd-border)}.right-panel .rule-item .rule-header[data-v-70cf260a]{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;font-weight:700}.right-panel .grid-span-list[data-v-70cf260a]{display:flex;flex-direction:column;gap:10px;width:100%}.right-panel .grid-span-list .grid-span-item[data-v-70cf260a]{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 10px;background:var(--ffd-hover-bg);border-radius:4px;border:1px dashed var(--ffd-border)}.right-panel .grid-span-list .grid-span-label[data-v-70cf260a]{color:var(--ffd-text-secondary);font-size:12px;min-width:60px}.ff-signature-pad[data-v-a1a825f6]{display:block}.ff-signature-canvas-wrap[data-v-a1a825f6]{width:100%;border:1px dashed var(--ffd-border);border-radius:4px;overflow:hidden}.ff-signature-canvas[data-v-a1a825f6]{width:100%;height:100%;display:block;touch-action:none;background:transparent}.ff-signature-canvas.disabled[data-v-a1a825f6]{pointer-events:none}.ff-signature-actions[data-v-a1a825f6]{margin-top:6px;display:flex;justify-content:flex-end}.ff-form-item[data-v-c71174a9]{width:100%}.ff-group[data-v-c71174a9]{width:100%;border:1px solid var(--ffd-border-light);border-radius:8px;margin-bottom:18px;overflow:hidden;background:var(--ffd-panel-bg)}.ff-group-header[data-v-c71174a9]{padding:10px 12px;background:var(--ffd-hover-bg);border-bottom:1px solid var(--ffd-border-light)}.ff-group-title[data-v-c71174a9]{font-weight:600;font-size:14px;color:var(--ffd-text)}.ff-group-body[data-v-c71174a9]{padding:12px 12px 0}.ff-label-inline[data-v-c71174a9]{display:inline-flex;align-items:center;gap:4px}.question-icon[data-v-c71174a9]{display:inline-flex;align-items:center;line-height:1;color:var(--ffd-text-tertiary)}.sub-form-container[data-v-c71174a9]{margin-bottom:18px}.sub-form-container .sub-form-content[data-v-c71174a9]{width:100%;display:flex;flex-direction:column;align-items:flex-start}.sub-form-container .sub-form-content[data-v-c71174a9] .el-table__empty-block{border-bottom:1px solid var(--el-table-border-color)}.sub-form-container .sub-form-table-wrap[data-v-c71174a9]{max-width:100%;overflow-x:auto}.sub-form-container .sub-form-table[data-v-c71174a9]{display:inline-block;width:max-content}.sub-form-container .sub-form-label[data-v-c71174a9]{display:flex;align-items:center;gap:4px;margin-bottom:8px;font-size:14px;color:var(--ffd-text-secondary)}.sub-form-container .sub-form-actions[data-v-c71174a9]{border-top:none;border-radius:0 0 4px 4px;width:100%;box-sizing:border-box}.sub-form-container .no-sub-form[data-v-c71174a9]{display:flex;align-items:center;justify-content:center;width:300px;height:80px;background-color:var(--ffd-hover-bg)}.ff-form-item[data-v-c71174a9] .ff-no-label.el-form-item{margin-bottom:0;width:100%}.ff-form-item[data-v-c71174a9] .ff-no-label .el-form-item__content{margin-left:0!important;width:100%;display:flex}.ff-form-item[data-v-c71174a9] .ff-no-label .el-select{min-width:180px}.ff-form-item[data-v-c71174a9] .ff-no-label .el-select,.ff-form-item[data-v-c71174a9] .ff-no-label .el-input-number{width:100%}.ff-form-item[data-v-c71174a9] .ff-label-wrap.el-form-item{flex-direction:column;align-items:flex-start}[data-v-c71174a9] .ff-label-wrap .el-form-item__label-wrap{width:auto!important;margin:0 0 6px}[data-v-c71174a9] .ff-label-wrap .el-form-item__label{width:auto!important;text-align:left!important;line-height:1.2}[data-v-c71174a9] .ff-label-wrap .el-form-item__content{margin-left:0!important;width:100%}.custom-upload-item[data-v-c71174a9]{width:100%;height:100%;position:relative;display:flex;justify-content:center;align-items:center;overflow:hidden;border-radius:6px;border:1px solid var(--ffd-border);box-sizing:border-box}.ff-signature-field[data-v-c71174a9]{display:block}.ff-signature-box[data-v-c71174a9]{width:100%;border:1px dashed var(--ffd-border);border-radius:4px;overflow:hidden;background:var(--ffd-panel-bg);cursor:pointer;display:flex;align-items:center;justify-content:center;box-sizing:border-box}.ff-signature-box.disabled[data-v-c71174a9]{cursor:not-allowed;background:var(--ffd-hover-bg)}.ff-signature-placeholder[data-v-c71174a9]{color:var(--ffd-text-tertiary);font-size:14px}.ff-signature-image[data-v-c71174a9]{width:100%;height:100%;object-fit:contain;display:block}.ff-signature-actions[data-v-c71174a9]{margin-top:6px;display:flex;justify-content:flex-end}.mode-picture[data-v-c71174a9]{border:1px solid var(--ffd-border-light);padding:8px;justify-content:flex-start;background-color:var(--ffd-panel-bg);transition:all .3s}.mode-picture[data-v-c71174a9]:hover{background-color:var(--ffd-hover-bg)}.mode-picture .thumbnail-area[data-v-c71174a9]{width:60px;height:60px;flex-shrink:0;position:relative;border-radius:4px;overflow:hidden}.mode-picture .file-name-display[data-v-c71174a9]{position:static;margin-left:12px;background:none;color:var(--ffd-text-secondary);text-align:left;font-size:14px;padding:0;width:auto;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mode-picture-card .thumbnail-area[data-v-c71174a9]{width:100%;height:100%;position:relative}.mode-picture-card .file-name-display[data-v-c71174a9]{position:absolute;bottom:0;left:0;width:100%;padding:4px;background:#0009;color:#fff;font-size:12px;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;z-index:5}.file-icon-thumbnail[data-v-c71174a9]{width:100%;height:100%;display:flex;justify-content:center;align-items:center;color:var(--ffd-text-tertiary);background-color:var(--ffd-hover-bg)}.el-upload-list__item-thumbnail[data-v-c71174a9]{width:100%;height:100%;object-fit:cover}.el-upload-list__item-actions[data-v-c71174a9]{position:absolute;width:100%;height:100%;left:0;top:0;cursor:default;text-align:center;color:#fff;opacity:0;font-size:20px;background-color:var(--el-overlay-color-lighter);transition:opacity var(--el-transition-duration);display:flex;justify-content:center;align-items:center;gap:12px;z-index:10}.el-upload-list__item-actions span[data-v-c71174a9]{cursor:pointer}.el-upload-list__item-actions span[data-v-c71174a9]:hover{color:var(--ffd-primary)}.thumbnail-area:hover .el-upload-list__item-actions[data-v-c71174a9]{opacity:1}.picture-mode-close[data-v-c71174a9]{display:none;position:absolute;top:5px;right:5px;cursor:pointer;opacity:.75;color:var(--ffd-text-secondary)}.picture-mode-close[data-v-c71174a9]:hover{opacity:1;color:var(--ffd-primary)}.mode-picture:hover .picture-mode-close[data-v-c71174a9]{display:block}.mode-text[data-v-c71174a9]{justify-content:space-between;padding:4px 8px;background-color:var(--ffd-panel-bg);transition:background-color .3s;border:none;border-radius:4px;margin-top:4px}.mode-text[data-v-c71174a9]:hover{background-color:var(--ffd-hover-bg)}.mode-text:hover .text-mode-close[data-v-c71174a9]{display:block}.mode-text .text-mode-content[data-v-c71174a9]{display:flex;align-items:center;flex:1;overflow:hidden;cursor:pointer;color:var(--ffd-text-secondary)}.mode-text .text-mode-content[data-v-c71174a9]:hover,.mode-text .text-mode-content:hover .file-icon[data-v-c71174a9]{color:var(--ffd-primary)}.mode-text .file-icon[data-v-c71174a9]{margin-right:6px;color:var(--ffd-text-tertiary);display:flex;align-items:center}.mode-text .file-name[data-v-c71174a9]{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mode-text .text-mode-close[data-v-c71174a9]{display:none;cursor:pointer;color:var(--ffd-text-tertiary);margin-left:8px;display:flex;align-items:center}.mode-text .text-mode-close[data-v-c71174a9]:hover{color:var(--ffd-danger)}.sub-form-content .el-table-fixed-column--left:hover .index-number[data-v-c71174a9]{display:none}.sub-form-content .el-table-fixed-column--left:hover .index-actions[data-v-c71174a9]{display:flex}.row-index-wrapper[data-v-c71174a9]{position:relative;min-height:24px;display:flex;align-items:center;justify-content:center}.row-index-wrapper .index-number[data-v-c71174a9]{display:block;font-variant-numeric:tabular-nums}.row-index-wrapper .index-actions[data-v-c71174a9]{display:none;align-items:center;justify-content:center;gap:8px}.row-index-wrapper .action-icon[data-v-c71174a9]{cursor:pointer;font-size:14px;color:var(--ffd-text-secondary)}.row-index-wrapper .action-icon[data-v-c71174a9]:hover{color:var(--ffd-primary)}.row-index-wrapper .action-icon.delete-icon[data-v-c71174a9]:hover{color:var(--ffd-danger)}.ff-text[data-v-c71174a9]{white-space:pre-wrap;word-break:break-word;line-height:1.4;color:var(--ffd-text)}.fast-form-designer[data-v-2da758c0]{min-width:1000px;height:100%;min-height:0;display:flex;flex-direction:column;border:1px solid var(--el-border-color-lighter);border-radius:4px}.fast-form-designer .designer-container[data-v-2da758c0]{flex:1;display:flex;overflow:hidden}.fast-form-designer .designer-container .left-container[data-v-2da758c0]{width:250px;border-right:1px solid var(--ffd-border);background:var(--ffd-panel-bg)}.fast-form-designer .designer-container .center-container[data-v-2da758c0]{flex:1;background:var(--ffd-canvas-bg);min-width:0;overflow:hidden}.fast-form-designer .designer-container .center-container .actions[data-v-2da758c0]{height:var(--el-tabs-header-height, 40px);display:flex;justify-content:right;padding:0 20px}.fast-form-designer .designer-container .right-container[data-v-2da758c0]{width:300px;border-left:1px solid var(--ffd-border);background:var(--ffd-panel-bg);display:flex;flex-direction:column;overflow:hidden}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
export type ComponentType = 'input' | 'textarea' | 'text' | 'link' | 'radio' | 'checkbox' | 'select' | 'pca' | 'date' | 'datetime' | 'time' | 'input-number' | 'rate' | 'switch' | 'cascader' | 'signature' | 'upload' | 'group' | 'grid' | 'grid-col' | 'sub-form';
|
|
2
|
+
export interface ValidationRule {
|
|
3
|
+
type: 'required' | 'email' | 'phone' | 'url' | 'ip' | 'regexp';
|
|
4
|
+
message: string;
|
|
5
|
+
pattern?: string;
|
|
6
|
+
trigger: 'blur' | 'change';
|
|
7
|
+
}
|
|
8
|
+
export type OptionValue = string | number;
|
|
9
|
+
export interface OptionItem {
|
|
10
|
+
label: string;
|
|
11
|
+
value: OptionValue;
|
|
12
|
+
children?: OptionItem[];
|
|
13
|
+
}
|
|
14
|
+
export interface RemoteOptionsConfig {
|
|
15
|
+
url: string;
|
|
16
|
+
method: 'GET' | 'POST';
|
|
17
|
+
paramsJson?: string;
|
|
18
|
+
headersJson?: string;
|
|
19
|
+
dataPath?: string;
|
|
20
|
+
labelKey: string;
|
|
21
|
+
valueKey: string;
|
|
22
|
+
childrenKey?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface ComponentProps {
|
|
25
|
+
label: string;
|
|
26
|
+
field?: string;
|
|
27
|
+
defaultValue?: unknown;
|
|
28
|
+
placeholder?: string;
|
|
29
|
+
description?: string;
|
|
30
|
+
labelWidth?: number;
|
|
31
|
+
labelWrap?: boolean;
|
|
32
|
+
text?: string;
|
|
33
|
+
linkText?: string;
|
|
34
|
+
linkUrl?: string;
|
|
35
|
+
linkTarget?: '_blank' | '_self' | '_parent' | '_top';
|
|
36
|
+
linkUnderline?: boolean;
|
|
37
|
+
multiple?: boolean;
|
|
38
|
+
filterable?: boolean;
|
|
39
|
+
virtualized?: boolean;
|
|
40
|
+
checkStrictly?: boolean;
|
|
41
|
+
pcaType?: 'province' | 'province-city' | 'province-city-area';
|
|
42
|
+
width?: '25%' | '33.33%' | '50%' | '66.66%' | '75%' | '100%';
|
|
43
|
+
rows?: number;
|
|
44
|
+
max?: number;
|
|
45
|
+
allowHalf?: boolean;
|
|
46
|
+
gutter?: number;
|
|
47
|
+
span?: number;
|
|
48
|
+
showIndex?: boolean;
|
|
49
|
+
showAction?: boolean;
|
|
50
|
+
signatureHeight?: number;
|
|
51
|
+
signatureLineWidth?: number;
|
|
52
|
+
signaturePenColor?: string;
|
|
53
|
+
signatureBackgroundColor?: string;
|
|
54
|
+
clearable?: boolean;
|
|
55
|
+
disabled?: boolean;
|
|
56
|
+
optionsSource?: 'static' | 'remote';
|
|
57
|
+
options?: OptionItem[];
|
|
58
|
+
remoteOptions?: RemoteOptionsConfig;
|
|
59
|
+
action?: string;
|
|
60
|
+
name?: string;
|
|
61
|
+
accept?: string;
|
|
62
|
+
limit?: number;
|
|
63
|
+
listType?: 'text' | 'picture' | 'picture-card';
|
|
64
|
+
autoUpload?: boolean;
|
|
65
|
+
showFileList?: boolean;
|
|
66
|
+
withCredentials?: boolean;
|
|
67
|
+
uploadHeadersJson?: string;
|
|
68
|
+
uploadDataJson?: string;
|
|
69
|
+
required?: boolean;
|
|
70
|
+
rules?: ValidationRule[];
|
|
71
|
+
}
|
|
72
|
+
export type FieldVisibilityLogic = 'all' | 'any';
|
|
73
|
+
export type FieldVisibilityOperator = 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'contains' | 'not_contains' | 'in' | 'not_in' | 'is_empty' | 'not_empty';
|
|
74
|
+
export type FieldVisibilityActionType = 'show' | 'hide';
|
|
75
|
+
export type FieldVisibilityValue = string | number | boolean | null | Array<string | number>;
|
|
76
|
+
export interface FieldVisibilityCondition {
|
|
77
|
+
id: string;
|
|
78
|
+
field: string;
|
|
79
|
+
operator: FieldVisibilityOperator;
|
|
80
|
+
value?: FieldVisibilityValue;
|
|
81
|
+
}
|
|
82
|
+
export interface FieldVisibilityAction {
|
|
83
|
+
id: string;
|
|
84
|
+
field: string;
|
|
85
|
+
action: FieldVisibilityActionType;
|
|
86
|
+
}
|
|
87
|
+
export interface FieldVisibilityRule {
|
|
88
|
+
id: string;
|
|
89
|
+
logic: FieldVisibilityLogic;
|
|
90
|
+
conditions: FieldVisibilityCondition[];
|
|
91
|
+
actions: FieldVisibilityAction[];
|
|
92
|
+
}
|
|
93
|
+
export interface FormElement {
|
|
94
|
+
id: string;
|
|
95
|
+
type: ComponentType;
|
|
96
|
+
props: ComponentProps;
|
|
97
|
+
children?: FormElement[];
|
|
98
|
+
}
|
|
99
|
+
export interface FormConfig {
|
|
100
|
+
labelPosition: 'left' | 'right' | 'top';
|
|
101
|
+
labelWidth: number;
|
|
102
|
+
size: 'large' | 'default' | 'small';
|
|
103
|
+
visibilityRules?: FieldVisibilityRule[];
|
|
104
|
+
}
|
|
105
|
+
export interface FormSchema {
|
|
106
|
+
config: FormConfig;
|
|
107
|
+
list: FormElement[];
|
|
108
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { FormElement, OptionItem, RemoteOptionsConfig, ComponentType } from '../types';
|
|
2
|
+
export declare function generateId(type: ComponentType): string;
|
|
3
|
+
export type RemoteParamsContext = {
|
|
4
|
+
formModel?: Record<string, unknown>;
|
|
5
|
+
globalObject?: Record<string, unknown>;
|
|
6
|
+
};
|
|
7
|
+
export declare function cloneComponent(origin: Partial<FormElement>): FormElement;
|
|
8
|
+
export declare function duplicateElement(origin: FormElement): FormElement;
|
|
9
|
+
/**
|
|
10
|
+
* 判断是否为普通对象(Record)。
|
|
11
|
+
*/
|
|
12
|
+
export declare const isRecord: (v: unknown) => v is Record<string, unknown>;
|
|
13
|
+
export declare const getByPath: (obj: unknown, path: string | undefined) => unknown;
|
|
14
|
+
export declare const resolveDynamicValue: (raw: unknown, ctx: RemoteParamsContext, depth?: number) => unknown;
|
|
15
|
+
export declare const extractFormDepsFromTemplateJson: (text: string | undefined) => string[];
|
|
16
|
+
export declare const hasFormTemplate: (text: string | undefined) => boolean;
|
|
17
|
+
/**
|
|
18
|
+
* 根据配置把任意数据映射为 OptionItem[](支持树形 children)。
|
|
19
|
+
*/
|
|
20
|
+
export declare const mapToOptions: (raw: unknown, config: Pick<RemoteOptionsConfig, "labelKey" | "valueKey" | "childrenKey">) => OptionItem[];
|
|
21
|
+
/**
|
|
22
|
+
* 拉取远程选项数据,并按 remoteOptions 的映射规则转换为 OptionItem[]。
|
|
23
|
+
*/
|
|
24
|
+
export declare const fetchRemoteOptions: (remote: RemoteOptionsConfig, signal?: AbortSignal, ctx?: RemoteParamsContext) => Promise<OptionItem[]>;
|
|
25
|
+
export type RemoteOptionsTestRequest = {
|
|
26
|
+
url: string;
|
|
27
|
+
method: RemoteOptionsConfig['method'];
|
|
28
|
+
headers?: Record<string, string>;
|
|
29
|
+
body?: string;
|
|
30
|
+
resolvedParams?: Record<string, unknown>;
|
|
31
|
+
resolvedParamsRaw?: unknown;
|
|
32
|
+
resolvedHeadersRaw?: unknown;
|
|
33
|
+
};
|
|
34
|
+
export type RemoteOptionsTestResponse = {
|
|
35
|
+
ok: boolean;
|
|
36
|
+
status: number;
|
|
37
|
+
statusText: string;
|
|
38
|
+
json?: unknown;
|
|
39
|
+
text?: string;
|
|
40
|
+
};
|
|
41
|
+
export type RemoteOptionsTestResult = {
|
|
42
|
+
request: RemoteOptionsTestRequest;
|
|
43
|
+
response: RemoteOptionsTestResponse;
|
|
44
|
+
extractedData?: unknown;
|
|
45
|
+
mappedOptions: OptionItem[];
|
|
46
|
+
};
|
|
47
|
+
export declare const testRemoteOptionsRequest: (remote: RemoteOptionsConfig, ctx?: RemoteParamsContext, signal?: AbortSignal) => Promise<RemoteOptionsTestResult>;
|
package/package.json
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@fast-form-designer/vue",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"author": {
|
|
5
|
+
"name": "lywuhan",
|
|
6
|
+
"email": "wu_han@aliyun.com"
|
|
7
|
+
},
|
|
8
|
+
"description": "A visual form designer based on Vue 3 and Element Plus.",
|
|
9
|
+
"keywords": [
|
|
10
|
+
"vue",
|
|
11
|
+
"vue3",
|
|
12
|
+
"element-plus",
|
|
13
|
+
"form",
|
|
14
|
+
"form-designer",
|
|
15
|
+
"low-code"
|
|
16
|
+
],
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"homepage": "https://github.com/iamwuhan/fast-form-designer-vue",
|
|
19
|
+
"bugs": {
|
|
20
|
+
"url": "https://github.com/iamwuhan/fast-form-designer-vue/issues"
|
|
21
|
+
},
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "git+https://github.com/iamwuhan/fast-form-designer-vue.git"
|
|
25
|
+
},
|
|
26
|
+
"type": "module",
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": "^20.19.0 || >=22.12.0"
|
|
29
|
+
},
|
|
30
|
+
"publishConfig": {
|
|
31
|
+
"access": "public"
|
|
32
|
+
},
|
|
33
|
+
"main": "./dist/index.umd.cjs",
|
|
34
|
+
"module": "./dist/index.es.js",
|
|
35
|
+
"types": "./dist/index.d.ts",
|
|
36
|
+
"style": "./dist/style.css",
|
|
37
|
+
"sideEffects": [
|
|
38
|
+
"**/*.css"
|
|
39
|
+
],
|
|
40
|
+
"files": [
|
|
41
|
+
"dist",
|
|
42
|
+
"README.md",
|
|
43
|
+
"LICENSE"
|
|
44
|
+
],
|
|
45
|
+
"exports": {
|
|
46
|
+
".": {
|
|
47
|
+
"types": "./dist/index.d.ts",
|
|
48
|
+
"import": "./dist/index.es.js",
|
|
49
|
+
"require": "./dist/index.umd.cjs"
|
|
50
|
+
},
|
|
51
|
+
"./style.css": "./dist/style.css",
|
|
52
|
+
"./package.json": "./package.json",
|
|
53
|
+
"./dist/style.css": "./dist/style.css"
|
|
54
|
+
},
|
|
55
|
+
"scripts": {
|
|
56
|
+
"dev": "vite",
|
|
57
|
+
"build": "run-p build:types build:bundles",
|
|
58
|
+
"preview": "vite preview",
|
|
59
|
+
"build:bundles": "vite build",
|
|
60
|
+
"build:types": "vue-tsc -p tsconfig.lib.json --declaration --emitDeclarationOnly",
|
|
61
|
+
"type-check": "vue-tsc --build",
|
|
62
|
+
"lint": "eslint . --fix --cache",
|
|
63
|
+
"format": "prettier --write --experimental-cli src/",
|
|
64
|
+
"prepublishOnly": "npm run build"
|
|
65
|
+
},
|
|
66
|
+
"dependencies": {
|
|
67
|
+
"vue-draggable-plus": "^0.6.1"
|
|
68
|
+
},
|
|
69
|
+
"peerDependencies": {
|
|
70
|
+
"@element-plus/icons-vue": "^2.3.2",
|
|
71
|
+
"element-plus": "^2.13.1",
|
|
72
|
+
"vue": "^3.5.26"
|
|
73
|
+
},
|
|
74
|
+
"devDependencies": {
|
|
75
|
+
"@tsconfig/node24": "^24.0.3",
|
|
76
|
+
"@types/node": "^24.10.4",
|
|
77
|
+
"@vitejs/plugin-vue": "^6.0.3",
|
|
78
|
+
"@vitejs/plugin-vue-jsx": "^5.1.3",
|
|
79
|
+
"@vue/eslint-config-prettier": "^10.2.0",
|
|
80
|
+
"@vue/eslint-config-typescript": "^14.6.0",
|
|
81
|
+
"@vue/tsconfig": "^0.8.1",
|
|
82
|
+
"eslint": "^9.39.2",
|
|
83
|
+
"eslint-plugin-vue": "~10.6.2",
|
|
84
|
+
"jiti": "^2.6.1",
|
|
85
|
+
"npm-run-all2": "^8.0.4",
|
|
86
|
+
"prettier": "3.7.4",
|
|
87
|
+
"sass": "^1.97.3",
|
|
88
|
+
"typescript": "~5.9.3",
|
|
89
|
+
"vite": "^7.3.0",
|
|
90
|
+
"vite-plugin-vue-devtools": "^8.0.5",
|
|
91
|
+
"vue": "^3.5.26",
|
|
92
|
+
"vue-router": "^4.6.4",
|
|
93
|
+
"@element-plus/icons-vue": "^2.3.2",
|
|
94
|
+
"element-plus": "^2.13.1",
|
|
95
|
+
"vue-tsc": "^3.2.2"
|
|
96
|
+
}
|
|
97
|
+
}
|