@kp-ui/lowcode-pc 1.0.0-alpha.10 → 1.0.0-alpha.11
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/core/src/components/DragBtn.vue2.js +0 -1
- package/core/src/components/DragBtn.vue2.js.map +1 -1
- package/core/src/components/common/RenderWidgetList.vue2.js +0 -1
- package/core/src/components/common/RenderWidgetList.vue2.js.map +1 -1
- package/core/src/components/common/desginer/WidgetWrapper.vue2.js +0 -1
- package/core/src/components/common/desginer/WidgetWrapper.vue2.js.map +1 -1
- package/core/src/components/common/render/LowcodeRenderProvider.vue.js +0 -1
- package/core/src/components/common/render/LowcodeRenderProvider.vue.js.map +1 -1
- package/core/src/components/common/render/RenderForm.vue.js +0 -1
- package/core/src/components/common/render/RenderForm.vue.js.map +1 -1
- package/core/src/components/common/render/useFormContext.js +0 -1
- package/core/src/components/common/render/useFormContext.js.map +1 -1
- package/core/src/components/contextMenu/useWidgetContextMenu.js +0 -1
- package/core/src/components/contextMenu/useWidgetContextMenu.js.map +1 -1
- package/core/src/hooks/useAppRef.js +0 -1
- package/core/src/hooks/useAppRef.js.map +1 -1
- package/core/src/hooks/useDataHttp.js +0 -1
- package/core/src/hooks/useDataHttp.js.map +1 -1
- package/core/src/hooks/useDesigner.js +0 -1
- package/core/src/hooks/useDesigner.js.map +1 -1
- package/core/src/hooks/useField.js +2 -2
- package/core/src/hooks/useField.js.map +1 -1
- package/core/src/lang/zh-CN.js +1 -0
- package/core/src/lang/zh-CN.js.map +1 -1
- package/install.js +1 -0
- package/install.js.map +1 -1
- package/package.json +1 -1
- package/src/components/desginer/form-widget/container-widget/data-table-widget.vue2.js +0 -1
- package/src/components/desginer/form-widget/container-widget/data-table-widget.vue2.js.map +1 -1
- package/src/components/desginer/form-widget/container-widget/grid-col-widget.vue2.js +0 -1
- package/src/components/desginer/form-widget/container-widget/grid-col-widget.vue2.js.map +1 -1
- package/src/components/desginer/form-widget/container-widget/grid-sub-form-widget.vue2.js +0 -1
- package/src/components/desginer/form-widget/container-widget/grid-sub-form-widget.vue2.js.map +1 -1
- package/src/components/desginer/form-widget/container-widget/grid-widget.vue2.js +0 -1
- package/src/components/desginer/form-widget/container-widget/grid-widget.vue2.js.map +1 -1
- package/src/components/desginer/form-widget/container-widget/index.js +0 -1
- package/src/components/desginer/form-widget/container-widget/index.js.map +1 -1
- package/src/components/desginer/form-widget/container-widget/tab-widget.vue2.js +0 -1
- package/src/components/desginer/form-widget/container-widget/tab-widget.vue2.js.map +1 -1
- package/src/components/desginer/form-widget/container-widget/useTableWidget.js +0 -1
- package/src/components/desginer/form-widget/container-widget/useTableWidget.js.map +1 -1
- package/src/components/desginer/form-widget/container-widget/vf-box-widget.vue2.js +0 -1
- package/src/components/desginer/form-widget/container-widget/vf-box-widget.vue2.js.map +1 -1
- package/src/components/desginer/form-widget/container-widget/vf-collapse-widget.vue2.js +0 -1
- package/src/components/desginer/form-widget/container-widget/vf-collapse-widget.vue2.js.map +1 -1
- package/src/components/desginer/form-widget/container-widget/vf-dialog-widget.vue2.js +0 -1
- package/src/components/desginer/form-widget/container-widget/vf-dialog-widget.vue2.js.map +1 -1
- package/src/components/field-widget/bpmn-editor-widget.vue2.js +0 -1
- package/src/components/field-widget/bpmn-editor-widget.vue2.js.map +1 -1
- package/src/components/field-widget/button-list-widget.vue2.js +0 -1
- package/src/components/field-widget/button-list-widget.vue2.js.map +1 -1
- package/src/components/field-widget/button-widget.vue2.js +0 -1
- package/src/components/field-widget/button-widget.vue2.js.map +1 -1
- package/src/components/field-widget/cascader-widget.vue2.js +0 -1
- package/src/components/field-widget/cascader-widget.vue2.js.map +1 -1
- package/src/components/field-widget/checkbox-widget.vue2.js +0 -1
- package/src/components/field-widget/checkbox-widget.vue2.js.map +1 -1
- package/src/components/field-widget/code-editor-widget.vue2.js +0 -1
- package/src/components/field-widget/code-editor-widget.vue2.js.map +1 -1
- package/src/components/field-widget/color-widget.vue2.js +0 -1
- package/src/components/field-widget/color-widget.vue2.js.map +1 -1
- package/src/components/field-widget/date-range-widget.vue2.js +0 -1
- package/src/components/field-widget/date-range-widget.vue2.js.map +1 -1
- package/src/components/field-widget/date-widget.vue2.js +0 -1
- package/src/components/field-widget/date-widget.vue2.js.map +1 -1
- package/src/components/field-widget/divider-widget.vue2.js +0 -1
- package/src/components/field-widget/divider-widget.vue2.js.map +1 -1
- package/src/components/field-widget/diy-compontent-widget.vue2.js +0 -1
- package/src/components/field-widget/diy-compontent-widget.vue2.js.map +1 -1
- package/src/components/field-widget/dropdown-widget.vue2.js +0 -1
- package/src/components/field-widget/dropdown-widget.vue2.js.map +1 -1
- package/src/components/field-widget/file-upload-widget.vue2.js +0 -1
- package/src/components/field-widget/file-upload-widget.vue2.js.map +1 -1
- package/src/components/field-widget/form-item-wrapper.vue2.js +0 -1
- package/src/components/field-widget/form-item-wrapper.vue2.js.map +1 -1
- package/src/components/field-widget/hooks/useSelect.js +0 -1
- package/src/components/field-widget/hooks/useSelect.js.map +1 -1
- package/src/components/field-widget/html-text-widget.vue2.js +0 -1
- package/src/components/field-widget/html-text-widget.vue2.js.map +1 -1
- package/src/components/field-widget/index.js +0 -1
- package/src/components/field-widget/index.js.map +1 -1
- package/src/components/field-widget/input-widget.vue2.js +0 -1
- package/src/components/field-widget/input-widget.vue2.js.map +1 -1
- package/src/components/field-widget/number-widget.vue2.js +0 -1
- package/src/components/field-widget/number-widget.vue2.js.map +1 -1
- package/src/components/field-widget/radio-widget.vue2.js +0 -1
- package/src/components/field-widget/radio-widget.vue2.js.map +1 -1
- package/src/components/field-widget/rate-widget.vue2.js +0 -1
- package/src/components/field-widget/rate-widget.vue2.js.map +1 -1
- package/src/components/field-widget/rich-editor-widget.vue2.js +0 -1
- package/src/components/field-widget/rich-editor-widget.vue2.js.map +1 -1
- package/src/components/field-widget/select-widget.vue2.js +0 -1
- package/src/components/field-widget/select-widget.vue2.js.map +1 -1
- package/src/components/field-widget/slider-widget.vue2.js +0 -1
- package/src/components/field-widget/slider-widget.vue2.js.map +1 -1
- package/src/components/field-widget/static-text-widget.vue2.js +0 -1
- package/src/components/field-widget/static-text-widget.vue2.js.map +1 -1
- package/src/components/field-widget/switch-widget.vue2.js +0 -1
- package/src/components/field-widget/switch-widget.vue2.js.map +1 -1
- package/src/components/field-widget/textarea-widget.vue2.js +0 -1
- package/src/components/field-widget/textarea-widget.vue2.js.map +1 -1
- package/src/components/field-widget/time-range-widget.vue2.js +0 -1
- package/src/components/field-widget/time-range-widget.vue2.js.map +1 -1
- package/src/components/field-widget/time-widget.vue2.js +0 -1
- package/src/components/field-widget/time-widget.vue2.js.map +1 -1
- package/src/components/field-widget/tree-widget.vue2.js +0 -1
- package/src/components/field-widget/tree-widget.vue2.js.map +1 -1
- package/src/components/field-widget/treeSelect-widget.vue2.js +0 -1
- package/src/components/field-widget/treeSelect-widget.vue2.js.map +1 -1
- package/src/components/field-widget/useField.js +0 -1
- package/src/components/field-widget/useField.js.map +1 -1
- package/src/components/field-widget/vue-render-widget.vue2.js +0 -1
- package/src/components/field-widget/vue-render-widget.vue2.js.map +1 -1
- package/src/components/form-render/container-items/data-table-widget.vue2.js +0 -1
- package/src/components/form-render/container-items/data-table-widget.vue2.js.map +1 -1
- package/src/components/form-render/container-items/grid-col-widget.vue2.js +0 -1
- package/src/components/form-render/container-items/grid-col-widget.vue2.js.map +1 -1
- package/src/components/form-render/container-items/grid-sub-form-widget.vue2.js +0 -1
- package/src/components/form-render/container-items/grid-sub-form-widget.vue2.js.map +1 -1
- package/src/components/form-render/container-items/grid-widget.vue2.js +0 -1
- package/src/components/form-render/container-items/grid-widget.vue2.js.map +1 -1
- package/src/components/form-render/container-items/index.js +0 -1
- package/src/components/form-render/container-items/index.js.map +1 -1
- package/src/components/form-render/container-items/tab-widget.vue2.js +0 -1
- package/src/components/form-render/container-items/tab-widget.vue2.js.map +1 -1
- package/src/components/form-render/container-items/vf-box-widget.vue2.js +0 -1
- package/src/components/form-render/container-items/vf-box-widget.vue2.js.map +1 -1
- package/src/components/form-render/container-items/vf-collapse-widget.vue2.js +0 -1
- package/src/components/form-render/container-items/vf-collapse-widget.vue2.js.map +1 -1
- package/src/components/public/ActionButtonListRender.vue2.js +0 -1
- package/src/components/public/ActionButtonListRender.vue2.js.map +1 -1
- package/src/components/public/ConfigView/CustomPageRender.vue.js +0 -1
- package/src/components/public/ConfigView/CustomPageRender.vue.js.map +1 -1
- package/src/components/public/CustomerModal/CustomerModal.vue2.js +0 -1
- package/src/components/public/CustomerModal/CustomerModal.vue2.js.map +1 -1
- package/src/components/public/DynamicDialog.vue.js +0 -1
- package/src/components/public/DynamicDialog.vue.js.map +1 -1
- package/src/components/render/index.vue2.js +0 -1
- package/src/components/render/index.vue2.js.map +1 -1
- package/stats.html +1 -1
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { defineComponent, createElementBlock, openBlock, normalizeClass, createElementVNode, unref, createVNode, toDisplayString } from "vue";
|
|
2
|
-
/* empty css */
|
|
3
2
|
import { SvgIcon } from "tmgc2-share";
|
|
4
3
|
import { useI18n } from "../utils/i18n.js";
|
|
5
4
|
const _hoisted_1 = ["title"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DragBtn.vue2.js","sources":["../../../../../core/src/components/DragBtn.vue"],"sourcesContent":["<template>\n <div :class=\"{ 'drag-handler': true, selected: selected }\">\n <i :title=\"i18nt('designer.hint.dragHandler')\">\n <svg-icon icon-class=\"icon-el-drag-move\" />\n </i>\n <i>\n {{\n i18n2t(\n `designer.widgetLabel.${widget.type}`,\n `extension.widgetLabel.${widget.type}`\n )\n }}\n </i>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { useI18n } from '@kp-ui/lowcode-core';\n import { SvgIcon } from 'tmgc2-share';\n import type { Widget } from '@kp-ui/lowcode-core';\n\n const { i18nt, i18n2t } = useI18n();\n\n const props = defineProps<{\n selected: boolean;\n widget: Widget;\n }>();\n</script>\n<style lang=\"scss\" scoped>\n .drag-handler {\n position: absolute;\n top: -1px;\n left: -1px;\n height: 20px;\n line-height: 20px;\n z-index: 12;\n background: var(--ant-primary-color);\n display: flex;\n align-items: center;\n padding: 0 4px;\n opacity: 0;\n transition: opacity 0.2s;\n visibility: hidden;\n &.selected {\n opacity: 0.6;\n visibility: visible;\n &:hover {\n opacity: 1;\n }\n }\n\n i {\n font-size: 12px;\n font-style: normal;\n color: #fff;\n margin: 0 2px;\n cursor: move;\n display: flex;\n align-items: center;\n }\n }\n</style>\n"],"names":["_createElementBlock","selected","_createElementVNode","_unref","_createVNode","widget"],"mappings":"
|
|
1
|
+
{"version":3,"file":"DragBtn.vue2.js","sources":["../../../../../core/src/components/DragBtn.vue"],"sourcesContent":["<template>\n <div :class=\"{ 'drag-handler': true, selected: selected }\">\n <i :title=\"i18nt('designer.hint.dragHandler')\">\n <svg-icon icon-class=\"icon-el-drag-move\" />\n </i>\n <i>\n {{\n i18n2t(\n `designer.widgetLabel.${widget.type}`,\n `extension.widgetLabel.${widget.type}`\n )\n }}\n </i>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { useI18n } from '@kp-ui/lowcode-core';\n import { SvgIcon } from 'tmgc2-share';\n import type { Widget } from '@kp-ui/lowcode-core';\n\n const { i18nt, i18n2t } = useI18n();\n\n const props = defineProps<{\n selected: boolean;\n widget: Widget;\n }>();\n</script>\n<style lang=\"scss\" scoped>\n .drag-handler {\n position: absolute;\n top: -1px;\n left: -1px;\n height: 20px;\n line-height: 20px;\n z-index: 12;\n background: var(--ant-primary-color);\n display: flex;\n align-items: center;\n padding: 0 4px;\n opacity: 0;\n transition: opacity 0.2s;\n visibility: hidden;\n &.selected {\n opacity: 0.6;\n visibility: visible;\n &:hover {\n opacity: 1;\n }\n }\n\n i {\n font-size: 12px;\n font-style: normal;\n color: #fff;\n margin: 0 2px;\n cursor: move;\n display: flex;\n align-items: center;\n }\n }\n</style>\n"],"names":["_createElementBlock","selected","_createElementVNode","_unref","_createVNode","widget"],"mappings":";;;;;;;;;;;AAqBI,UAAM,EAAE,OAAO,OAAA,IAAW,QAAA;;0BApB1BA,mBAYM,OAAA;AAAA,QAZA,wDAAyCC,KAAAA,UAAQ;AAAA,MAAA;QACnDC,mBAEI,KAAA;AAAA,UAFA,OAAOC,MAAA,KAAA,EAAK,2BAAA;AAAA,QAAA;UACZC,YAA2CD,MAAA,OAAA,GAAA,EAAjC,cAAW,qBAAmB;AAAA,QAAA;QAE5CD,mBAOI,2BALIC,MAAA,MAAA;AAAA,UAAoDE,wBAAAA,KAAAA,OAAO,IAAI;AAAA,UAAiDA,yBAAAA,KAAAA,OAAO,IAAI;AAAA,QAAA;;;;;"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { defineComponent, mergeModels, useModel, createBlock, createElementBlock, unref, openBlock, normalizeClass, withCtx, createCommentVNode, createElementVNode, createVNode, resolveDynamicComponent, Fragment, renderList } from "vue";
|
|
2
2
|
import Draggable from "vuedraggable";
|
|
3
3
|
import { useDesigner } from "../../hooks/useDesigner.js";
|
|
4
|
-
/* empty css */
|
|
5
4
|
import WidgetWrapper from "./desginer/WidgetWrapper.vue.js";
|
|
6
5
|
const _hoisted_1 = ["id", "data-widget-id"];
|
|
7
6
|
const _hoisted_2 = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenderWidgetList.vue2.js","sources":["../../../../../../core/src/components/common/RenderWidgetList.vue"],"sourcesContent":["<template>\n <template v-if=\"designState\">\n <draggable\n v-model=\"draggableList\"\n class=\"designer-widget-list list-transition-container\"\n :class=\"[{ 'empty-list': !draggableList.length }, { 'desginer-canvas': isCanvas }]\"\n tag=\"div\"\n :animation=\"200\"\n group=\"widget\"\n handle=\".drag-handler\"\n item-key=\"id\"\n :move=\"onMove\"\n :data-allow-types=\"allowTypes.join(',')\"\n :data-not-allow-types=\"notAllowTypes.join(',')\"\n @update=\"onDragUpdate\"\n @add=\"(evt: any) => onDragAdd(evt, draggableList)\"\n >\n <template #item=\"{ element: widget, index }\">\n <div :id=\"widget.id\" class=\"transition-group-el\" :data-widget-id=\"widget.id\">\n <WidgetWrapper :widget=\"widget\" :index=\"index\" v-model:list=\"draggableList\">\n <component\n :is=\"getWidget(widget)\"\n :widget=\"widget\"\n :field=\"widget\"\n :index=\"index\"\n />\n </WidgetWrapper>\n </div>\n </template>\n <template #footer>\n <div v-if=\"!draggableList.length\" class=\"empty-drop-zone\"> 拖拽组件到此处 </div>\n </template>\n </draggable>\n </template>\n <template v-else>\n <div\n v-for=\"(widget, index) in draggableList\"\n :key=\"`${widget.id}_${index}`\"\n class=\"t-overflow-hidden\"\n >\n <component :is=\"getWidget(widget)\" :widget=\"widget\" :field=\"widget\" :index=\"index\" />\n </div>\n </template>\n</template>\n\n<script lang=\"ts\" setup>\n import draggable from 'vuedraggable';\n import { useDesigner, WidgetWrapper } from '@kp-ui/lowcode-core';\n import type { Widget, FormDesigner } from '@kp-ui/lowcode-core';\n\n defineOptions({\n inheritAttrs: false,\n name: 'RenderWidgetList'\n });\n\n const props = withDefaults(\n defineProps<{\n isCanvas?: boolean;\n allowTypes?: string[];\n notAllowTypes?: string[];\n parentWidget: Widget | FormDesigner | null;\n }>(),\n {\n isCanvas: false,\n allowTypes: () => [],\n notAllowTypes: () => []\n }\n );\n\n const { designer, onDragAdd, onDragUpdate, designState, getWidget } = useDesigner();\n\n const onMove = (evt: any) => {\n return designer.value.checkWidgetMove(evt);\n };\n\n const draggableList = defineModel<Widget[]>('list', {\n type: Array,\n default: []\n });\n</script>\n\n<style scoped lang=\"scss\">\n .designer-widget-list {\n position: relative;\n display: flex;\n flex-direction: column;\n // gap: 3px;\n &.empty-list {\n min-height: 96px;\n }\n .empty-drop-zone {\n position: absolute;\n // top: 5px;\n left: 0;\n width: 100%;\n z-index: 2;\n }\n :deep(.sortable-ghost) {\n z-index: 99;\n }\n }\n\n .list-transition-container {\n display: flex;\n flex-direction: column;\n padding: 2px;\n }\n\n .transition-group-el {\n position: relative;\n padding: 1px;\n .sortable-ghost {\n width: 100%;\n }\n }\n\n /* SortableJS 自动应用的类 */\n .ghost-placeholder {\n opacity: 0.5;\n background: #c8ebfb;\n border: 2px dashed var(--ant-primary-color);\n height: 40px;\n margin: 4px 0;\n border-radius: 4px;\n }\n\n .sortable-chosen {\n background: #fdfdfd;\n }\n\n .empty-drop-zone {\n line-height: 1.2;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n font-size: 12px;\n margin: 2px 0;\n height: 90px;\n background: rgba(#000, 0.05);\n border: 1px dashed #d9d9d9;\n border-radius: 2px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #999;\n font-size: 14px;\n }\n .desginer-canvas {\n &:deep(.ant-form-item) {\n margin-bottom: 0;\n }\n }\n</style>\n"],"names":["_useModel","_unref","_createBlock","draggable","isCanvas","allowTypes","notAllowTypes","_withCtx","_createElementVNode","_createVNode","_resolveDynamicComponent","_createElementBlock","_openBlock","_Fragment","_renderList"],"mappings":"
|
|
1
|
+
{"version":3,"file":"RenderWidgetList.vue2.js","sources":["../../../../../../core/src/components/common/RenderWidgetList.vue"],"sourcesContent":["<template>\n <template v-if=\"designState\">\n <draggable\n v-model=\"draggableList\"\n class=\"designer-widget-list list-transition-container\"\n :class=\"[{ 'empty-list': !draggableList.length }, { 'desginer-canvas': isCanvas }]\"\n tag=\"div\"\n :animation=\"200\"\n group=\"widget\"\n handle=\".drag-handler\"\n item-key=\"id\"\n :move=\"onMove\"\n :data-allow-types=\"allowTypes.join(',')\"\n :data-not-allow-types=\"notAllowTypes.join(',')\"\n @update=\"onDragUpdate\"\n @add=\"(evt: any) => onDragAdd(evt, draggableList)\"\n >\n <template #item=\"{ element: widget, index }\">\n <div :id=\"widget.id\" class=\"transition-group-el\" :data-widget-id=\"widget.id\">\n <WidgetWrapper :widget=\"widget\" :index=\"index\" v-model:list=\"draggableList\">\n <component\n :is=\"getWidget(widget)\"\n :widget=\"widget\"\n :field=\"widget\"\n :index=\"index\"\n />\n </WidgetWrapper>\n </div>\n </template>\n <template #footer>\n <div v-if=\"!draggableList.length\" class=\"empty-drop-zone\"> 拖拽组件到此处 </div>\n </template>\n </draggable>\n </template>\n <template v-else>\n <div\n v-for=\"(widget, index) in draggableList\"\n :key=\"`${widget.id}_${index}`\"\n class=\"t-overflow-hidden\"\n >\n <component :is=\"getWidget(widget)\" :widget=\"widget\" :field=\"widget\" :index=\"index\" />\n </div>\n </template>\n</template>\n\n<script lang=\"ts\" setup>\n import draggable from 'vuedraggable';\n import { useDesigner, WidgetWrapper } from '@kp-ui/lowcode-core';\n import type { Widget, FormDesigner } from '@kp-ui/lowcode-core';\n\n defineOptions({\n inheritAttrs: false,\n name: 'RenderWidgetList'\n });\n\n const props = withDefaults(\n defineProps<{\n isCanvas?: boolean;\n allowTypes?: string[];\n notAllowTypes?: string[];\n parentWidget: Widget | FormDesigner | null;\n }>(),\n {\n isCanvas: false,\n allowTypes: () => [],\n notAllowTypes: () => []\n }\n );\n\n const { designer, onDragAdd, onDragUpdate, designState, getWidget } = useDesigner();\n\n const onMove = (evt: any) => {\n return designer.value.checkWidgetMove(evt);\n };\n\n const draggableList = defineModel<Widget[]>('list', {\n type: Array,\n default: []\n });\n</script>\n\n<style scoped lang=\"scss\">\n .designer-widget-list {\n position: relative;\n display: flex;\n flex-direction: column;\n // gap: 3px;\n &.empty-list {\n min-height: 96px;\n }\n .empty-drop-zone {\n position: absolute;\n // top: 5px;\n left: 0;\n width: 100%;\n z-index: 2;\n }\n :deep(.sortable-ghost) {\n z-index: 99;\n }\n }\n\n .list-transition-container {\n display: flex;\n flex-direction: column;\n padding: 2px;\n }\n\n .transition-group-el {\n position: relative;\n padding: 1px;\n .sortable-ghost {\n width: 100%;\n }\n }\n\n /* SortableJS 自动应用的类 */\n .ghost-placeholder {\n opacity: 0.5;\n background: #c8ebfb;\n border: 2px dashed var(--ant-primary-color);\n height: 40px;\n margin: 4px 0;\n border-radius: 4px;\n }\n\n .sortable-chosen {\n background: #fdfdfd;\n }\n\n .empty-drop-zone {\n line-height: 1.2;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n font-size: 12px;\n margin: 2px 0;\n height: 90px;\n background: rgba(#000, 0.05);\n border: 1px dashed #d9d9d9;\n border-radius: 2px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #999;\n font-size: 14px;\n }\n .desginer-canvas {\n &:deep(.ant-form-item) {\n margin-bottom: 0;\n }\n }\n</style>\n"],"names":["_useModel","_unref","_createBlock","draggable","isCanvas","allowTypes","notAllowTypes","_withCtx","_createElementVNode","_createVNode","_resolveDynamicComponent","_createElementBlock","_openBlock","_Fragment","_renderList"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqEI,UAAM,EAAE,UAAU,WAAW,cAAc,aAAa,UAAA,IAAc,YAAA;AAEtE,UAAM,SAAS,CAAC,QAAa;AACzB,aAAO,SAAS,MAAM,gBAAgB,GAAG;AAAA,IAC7C;AAEA,UAAM,gBAAgBA,kBAAsB,MAG3C;;aA7EeC,MAAA,WAAA,kBACZC,YA8BYD,MAAAE,SAAA,GAAA;AAAA;oBA7BC,cAAA;AAAA,qEAAA,cAAa,QAAA;AAAA,QACtB,uBAAM,kDAAgD,CAAA,EAAA,cAAA,CAC5B,oBAAc,OAAA,wBAA+BC,KAAAA,SAAAA,CAAQ,CAAA,CAAA;AAAA,QAC/E,KAAI;AAAA,QACH,WAAW;AAAA,QACZ,OAAM;AAAA,QACN,QAAO;AAAA,QACP,YAAS;AAAA,QACR,MAAM;AAAA,QACN,oBAAkBC,KAAAA,WAAW,KAAI,GAAA;AAAA,QACjC,wBAAsBC,KAAAA,cAAc,KAAI,GAAA;AAAA,QACxC,UAAQL,MAAA,YAAA;AAAA,QACR,kCAAM,QAAaA,iBAAU,KAAK,cAAA,KAAa;AAAA,MAAA;QAErC,MAAIM,QACX,CASM,EAAA,SAVkB,QAAQ,YAAK;AAAA,UACrCC,mBASM,OAAA;AAAA,YATA,IAAI,OAAO;AAAA,YAAI,OAAM;AAAA,YAAuB,kBAAgB,OAAO;AAAA,UAAA;YACrEC,YAOgBR,MAAA,aAAA,GAAA;AAAA,cAPA;AAAA,cAAiB;AAAA,cAAsB,MAAM,cAAA;AAAA,qEAAA,cAAa,QAAA;AAAA,YAAA;+BACtE,MAKE;AAAA,8BALFC,YAKEQ,wBAJOT,MAAA,SAAA,EAAU,MAAM,CAAA,GAAA;AAAA,kBACpB;AAAA,kBACA,OAAO;AAAA,kBACP;AAAA,gBAAA;;;;;;QAKN,gBACP,MAAyE;AAAA,UAA7D,CAAA,cAAA,MAAc,uBAA1BU,mBAAyE,OAAzE,YAA0D,WAAS;;;iGAK3EC,UAAA,IAAA,GAAAD,mBAMME,UAAA,EAAA,KAAA,EAAA,GAAAC,WALwB,cAAA,OAAa,CAA/B,QAAQ,UAAK;4BADzBH,mBAMM,OAAA;AAAA,UAJD,KAAG,GAAK,OAAO,EAAE,IAAI,KAAK;AAAA,UAC3B,OAAM;AAAA,QAAA;wBAENT,YAAqFQ,wBAArET,MAAA,SAAA,EAAU,MAAM,CAAA,GAAA;AAAA,YAAI;AAAA,YAAiB,OAAO;AAAA,YAAS;AAAA,UAAA;;;;;;"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { defineComponent, mergeModels, useModel, reactive, createElementBlock, openBlock, withModifiers, normalizeClass, unref, createVNode, createCommentVNode, renderSlot, createBlock } from "vue";
|
|
2
2
|
import { useDesigner } from "../../../hooks/useDesigner.js";
|
|
3
|
-
/* empty css */
|
|
4
3
|
import DragBtn from "../../DragBtn.vue.js";
|
|
5
4
|
import WidgetContextMenu from "../../contextMenu/WidgetContextMenu.vue.js";
|
|
6
5
|
const _hoisted_1 = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WidgetWrapper.vue2.js","sources":["../../../../../../../core/src/components/common/desginer/WidgetWrapper.vue"],"sourcesContent":["<template>\n <div\n class=\"widget-wrapper\"\n :class=\"{\n selected: selected(widget.id),\n 'container-wrapper': widget.category === 'container'\n }\"\n @click.stop=\"onWidgetClick(widget)\"\n @contextmenu.prevent.stop=\"onContextMenu\"\n >\n <!-- 拖动手柄 -->\n <DragBtn :selected=\"selected(widget.id)\" :widget=\"widget\" />\n <!-- 隐藏 -->\n <div v-if=\"widget.options.hidden\" class=\"widget-hidden\"></div>\n\n <slot></slot>\n <!-- 右键菜单 -->\n <WidgetContextMenu\n v-if=\"contextMenuState.visible\"\n v-model:visible=\"contextMenuState.visible\"\n v-model:list=\"list\"\n :x=\"contextMenuState.x\"\n :y=\"contextMenuState.y\"\n :widget=\"widget\"\n :index=\"index\"\n :parentWidget=\"parentWidget\"\n />\n </div>\n</template>\n\n<script lang=\"ts\" setup>\n import { reactive } from 'vue';\n import { useDesigner, Widget, WidgetContextMenu, DragBtn } from '@kp-ui/lowcode-core';\n\n const props = defineProps<{\n widget: Widget;\n index: number;\n parentWidget?: any;\n }>();\n\n const list = defineModel<Widget[]>('list', { default: () => [] });\n const { designer, selected, onWidgetClick } = useDesigner();\n\n const contextMenuState = reactive({\n visible: false,\n x: 0,\n y: 0\n });\n\n const onContextMenu = (event: MouseEvent) => {\n contextMenuState.x = event.clientX;\n contextMenuState.y = event.clientY;\n contextMenuState.visible = true;\n };\n</script>\n\n<style lang=\"scss\" scoped>\n .widget-wrapper {\n position: relative;\n padding: 2px;\n min-height: 20px;\n cursor: pointer;\n border: 1px dashed #cccccc;\n gap: 3px;\n\n &.container-wrapper {\n border-width: 2px;\n &.selected {\n outline: solid var(--ant-primary-color);\n }\n }\n\n &.selected {\n /* background-color: rgba(24, 144, 255, 0.1); */\n outline: 2px solid var(--ant-primary-color);\n }\n\n .widget-hidden {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: repeating-linear-gradient(\n 45deg,\n rgba(0, 0, 0, 0.1),\n rgba(0, 0, 0, 0.1) 10px,\n rgba(0, 0, 0, 0.2) 10px,\n rgba(0, 0, 0, 0.2) 20px\n );\n z-index: 11;\n }\n\n .action-buttons {\n position: absolute;\n bottom: -2px;\n right: -2px;\n height: 22px;\n width: 22px;\n background-color: var(--ant-primary-color);\n color: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 11;\n font-size: 14px;\n\n &:hover {\n background-color: #ff4d4f;\n }\n }\n }\n</style>\n"],"names":["_useModel","_createElementBlock","_unref","widget","_withModifiers","_createVNode","_openBlock","_renderSlot","_createBlock","index","parentWidget"],"mappings":"
|
|
1
|
+
{"version":3,"file":"WidgetWrapper.vue2.js","sources":["../../../../../../../core/src/components/common/desginer/WidgetWrapper.vue"],"sourcesContent":["<template>\n <div\n class=\"widget-wrapper\"\n :class=\"{\n selected: selected(widget.id),\n 'container-wrapper': widget.category === 'container'\n }\"\n @click.stop=\"onWidgetClick(widget)\"\n @contextmenu.prevent.stop=\"onContextMenu\"\n >\n <!-- 拖动手柄 -->\n <DragBtn :selected=\"selected(widget.id)\" :widget=\"widget\" />\n <!-- 隐藏 -->\n <div v-if=\"widget.options.hidden\" class=\"widget-hidden\"></div>\n\n <slot></slot>\n <!-- 右键菜单 -->\n <WidgetContextMenu\n v-if=\"contextMenuState.visible\"\n v-model:visible=\"contextMenuState.visible\"\n v-model:list=\"list\"\n :x=\"contextMenuState.x\"\n :y=\"contextMenuState.y\"\n :widget=\"widget\"\n :index=\"index\"\n :parentWidget=\"parentWidget\"\n />\n </div>\n</template>\n\n<script lang=\"ts\" setup>\n import { reactive } from 'vue';\n import { useDesigner, Widget, WidgetContextMenu, DragBtn } from '@kp-ui/lowcode-core';\n\n const props = defineProps<{\n widget: Widget;\n index: number;\n parentWidget?: any;\n }>();\n\n const list = defineModel<Widget[]>('list', { default: () => [] });\n const { designer, selected, onWidgetClick } = useDesigner();\n\n const contextMenuState = reactive({\n visible: false,\n x: 0,\n y: 0\n });\n\n const onContextMenu = (event: MouseEvent) => {\n contextMenuState.x = event.clientX;\n contextMenuState.y = event.clientY;\n contextMenuState.visible = true;\n };\n</script>\n\n<style lang=\"scss\" scoped>\n .widget-wrapper {\n position: relative;\n padding: 2px;\n min-height: 20px;\n cursor: pointer;\n border: 1px dashed #cccccc;\n gap: 3px;\n\n &.container-wrapper {\n border-width: 2px;\n &.selected {\n outline: solid var(--ant-primary-color);\n }\n }\n\n &.selected {\n /* background-color: rgba(24, 144, 255, 0.1); */\n outline: 2px solid var(--ant-primary-color);\n }\n\n .widget-hidden {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: repeating-linear-gradient(\n 45deg,\n rgba(0, 0, 0, 0.1),\n rgba(0, 0, 0, 0.1) 10px,\n rgba(0, 0, 0, 0.2) 10px,\n rgba(0, 0, 0, 0.2) 20px\n );\n z-index: 11;\n }\n\n .action-buttons {\n position: absolute;\n bottom: -2px;\n right: -2px;\n height: 22px;\n width: 22px;\n background-color: var(--ant-primary-color);\n color: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 11;\n font-size: 14px;\n\n &:hover {\n background-color: #ff4d4f;\n }\n }\n }\n</style>\n"],"names":["_useModel","_createElementBlock","_unref","widget","_withModifiers","_createVNode","_openBlock","_renderSlot","_createBlock","index","parentWidget"],"mappings":";;;;;;;;;;;;;;;;;;;;AAwCI,UAAM,OAAOA,SAAqB,SAAC,MAA6B;AAChE,UAAM,EAAY,UAAU,cAAA,IAAkB,YAAA;AAE9C,UAAM,mBAAmB,SAAS;AAAA,MAC9B,SAAS;AAAA,MACT,GAAG;AAAA,MACH,GAAG;AAAA,IAAA,CACN;AAED,UAAM,gBAAgB,CAAC,UAAsB;AACzC,uBAAiB,IAAI,MAAM;AAC3B,uBAAiB,IAAI,MAAM;AAC3B,uBAAiB,UAAU;AAAA,IAC/B;;0BApDAC,mBA0BM,OAAA;AAAA,QAzBF,uBAAM,kBAAgB;AAAA,oBACUC,MAAA,QAAA,EAASC,KAAAA,OAAO,EAAE;AAAA,UAAoCA,qBAAAA,KAAAA,OAAO,aAAQ;AAAA,QAAA;QAIpG,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAAC,cAAA,CAAA,WAAOF,MAAA,aAAA,EAAcC,KAAAA,MAAM,GAAA,CAAA,MAAA,CAAA;AAAA,QAChC,6BAA0B,eAAa,CAAA,WAAA,MAAA,CAAA;AAAA,MAAA;QAGxCE,YAA4DH,MAAA,OAAA,GAAA;AAAA,UAAlD,UAAUA,MAAA,QAAA,EAASC,KAAAA,OAAO,EAAE;AAAA,UAAI,QAAQA,KAAAA;AAAAA,QAAAA;QAEvCA,KAAAA,OAAO,QAAQ,UAA1BG,UAAA,GAAAL,mBAA8D,OAA9D,UAA8D;QAE9DM,WAAa,KAAA,QAAA,WAAA,CAAA,GAAA,QAAA,IAAA;AAAA,QAGH,iBAAiB,wBAD3BC,YASEN,MAAA,iBAAA,GAAA;AAAA;UAPU,SAAS,iBAAiB;AAAA,UAAjB,oBAAA,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAA,iBAAiB,UAAO;AAAA,UACjC,MAAM,KAAA;AAAA,iEAAA,KAAI,QAAA;AAAA,UACjB,GAAG,iBAAiB;AAAA,UACpB,GAAG,iBAAiB;AAAA,UACpB,QAAQC,KAAAA;AAAAA,UACR,OAAOM,KAAAA;AAAAA,UACP,cAAcC,KAAAA;AAAAA,QAAAA;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LowcodeRenderProvider.vue.js","sources":["../../../../../../../core/src/components/common/render/LowcodeRenderProvider.vue"],"sourcesContent":["<template>\n <slot></slot>\n</template>\n<script lang=\"tsx\" setup>\n import { useI18n, type Widget } from '@kp-ui/lowcode-core';\n import { Component, provide, watch } from 'vue';\n import { useLocaleStore } from '@kp-ui/i18n';\n import { storeToRefs } from 'pinia';\n\n defineOptions({\n inheritAttrs: false,\n name: 'LowcodeRenderProvider'\n });\n\n const props = withDefaults(\n defineProps<{\n designState?: boolean;\n getWidget: (widget: Widget) => Component;\n context: any;\n }>(),\n {\n designState: false\n }\n );\n\n const localeStore = useLocaleStore();\n const { locale } = storeToRefs(localeStore);\n const { initLocale } = useI18n();\n\n watch(\n locale,\n () => {\n initLocale(locale.value);\n },\n {\n immediate: true\n }\n );\n\n provide('designState', props.designState); // 设计态标识\n provide('getWidget', props.getWidget);\n provide('formConfig', props.context?.formConfig);\n provide('formWidgetId', props.context?.formWidgetId);\n // 提供给子组件的数据\n provide('refList', props.context?.widgetRefList);\n provide('formData', props.context?.formDataModel);\n provide('getReadMode', () => props.context?.readModeFlag.value);\n</script>\n"],"names":["props","__props","localeStore","useLocaleStore","locale","storeToRefs","initLocale","useI18n","watch","value","immediate","provide","designState","getWidget","context","formConfig","formWidgetId","widgetRefList","formDataModel","readModeFlag","_renderSlot","_ctx","$slots"],"mappings":"
|
|
1
|
+
{"version":3,"file":"LowcodeRenderProvider.vue.js","sources":["../../../../../../../core/src/components/common/render/LowcodeRenderProvider.vue"],"sourcesContent":["<template>\n <slot></slot>\n</template>\n<script lang=\"tsx\" setup>\n import { useI18n, type Widget } from '@kp-ui/lowcode-core';\n import { Component, provide, watch } from 'vue';\n import { useLocaleStore } from '@kp-ui/i18n';\n import { storeToRefs } from 'pinia';\n\n defineOptions({\n inheritAttrs: false,\n name: 'LowcodeRenderProvider'\n });\n\n const props = withDefaults(\n defineProps<{\n designState?: boolean;\n getWidget: (widget: Widget) => Component;\n context: any;\n }>(),\n {\n designState: false\n }\n );\n\n const localeStore = useLocaleStore();\n const { locale } = storeToRefs(localeStore);\n const { initLocale } = useI18n();\n\n watch(\n locale,\n () => {\n initLocale(locale.value);\n },\n {\n immediate: true\n }\n );\n\n provide('designState', props.designState); // 设计态标识\n provide('getWidget', props.getWidget);\n provide('formConfig', props.context?.formConfig);\n provide('formWidgetId', props.context?.formWidgetId);\n // 提供给子组件的数据\n provide('refList', props.context?.widgetRefList);\n provide('formData', props.context?.formDataModel);\n provide('getReadMode', () => props.context?.readModeFlag.value);\n</script>\n"],"names":["props","__props","localeStore","useLocaleStore","locale","storeToRefs","initLocale","useI18n","watch","value","immediate","provide","designState","getWidget","context","formConfig","formWidgetId","widgetRefList","formDataModel","readModeFlag","_renderSlot","_ctx","$slots"],"mappings":";;;;;;;;;;;;;;;;;;;;AAcI,UAAMA,QAAQC;AAWd,UAAMC,cAAcC,eAAc;AAClC,UAAM;AAAA,MAAEC;AAAAA,IAAO,IAAIC,YAAYH,WAAW;AAC1C,UAAM;AAAA,MAAEI;AAAAA,QAAeC,QAAO;AAE9BC,UACIJ,QACA,MAAM;AACFE,iBAAWF,OAAOK,KAAK;AAAA,IAC3B,GACA;AAAA,MACIC,WAAW;AAAA,IACf,CACJ;AAEAC,YAAQ,eAAeX,MAAMY,WAAW;AACxCD,YAAQ,aAAaX,MAAMa,SAAS;AACpCF,YAAQ,eAAcX,WAAMc,YAANd,mBAAee,UAAU;AAC/CJ,YAAQ,iBAAgBX,WAAMc,YAANd,mBAAegB,YAAY;AAEnDL,YAAQ,YAAWX,WAAMc,YAANd,mBAAeiB,aAAa;AAC/CN,YAAQ,aAAYX,WAAMc,YAANd,mBAAekB,aAAa;AAChDP,YAAQ,eAAe,MAAA;;AAAMX,cAAAA,MAAAA,MAAMc,YAANd,gBAAAA,IAAemB,aAAaV;AAAAA,KAAK;;aA7C9DW,WAAaC,KAAAC,QAAA,SAAA;AAAA;;;"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { defineComponent, ref, computed, onMounted, createBlock, openBlock, unref, withKeys, normalizeClass, withCtx, createVNode } from "vue";
|
|
2
2
|
import { Form } from "ant-design-vue";
|
|
3
|
-
/* empty css */
|
|
4
3
|
import { useEmitter } from "../../../utils/useEmitter.js";
|
|
5
4
|
import RenderWidgetList from "../RenderWidgetList.vue.js";
|
|
6
5
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenderForm.vue.js","sources":["../../../../../../../core/src/components/common/render/RenderForm.vue"],"sourcesContent":["<template>\n <Form\n ref=\"renderForm\"\n :layout=\"labelPosition\"\n :class=\"['render-form', 'tpf-form', customClass, readModeFlag ? 'readonly-mode-form' : '']\"\n :scrollToFirstError=\"true\"\n :validateOnRuleChange=\"false\"\n :model=\"formDataModel\"\n @keydown.enter=\"handleEnterKey\"\n >\n <RenderWidgetList :parentWidget=\"null\" v-model:list=\"widgetList\" />\n </Form>\n</template>\n\n<script lang=\"ts\" setup>\n import { computed, ref, onMounted, type PropType } from 'vue';\n import { Form } from 'ant-design-vue';\n import { RenderWidgetList } from '@kp-ui/lowcode-core';\n import { useEmitter } from '@kp-ui/lowcode-core/src/utils/useEmitter';\n\n /**\n * 表单容器组件\n * 负责渲染表单及其子组件\n */\n const props = defineProps({\n context: {\n type: Object as PropType<any>,\n required: true\n }\n });\n\n const emit = defineEmits(['form-submit', 'form-cancel']);\n\n // 组件引用\n const renderForm = ref();\n const { emit$, on$, off$ } = useEmitter();\n\n // 从上下文中获取数据\n const formDataModel = computed({\n get: () => props.context.formDataModel.value,\n set: val => {\n props.context.formDataModel.value = val;\n }\n });\n const readModeFlag = computed(() => props.context.readModeFlag.value);\n const formConfig = computed(() => props.context.formConfig.value);\n const widgetList = computed(() => props.context.widgetList.value);\n const labelPosition = computed(() => props.context.labelPosition.value);\n const customClass = computed(() => props.context.customClass.value);\n\n /**\n * 处理回车键事件\n */\n const handleEnterKey = () => {\n if (formConfig.value?.isEnterSubmit === 1) {\n props.context.onFormUpdate();\n }\n };\n\n onMounted(() => {});\n\n // 暴露方法\n defineExpose({\n renderForm,\n off$,\n on$,\n emit$\n });\n</script>\n"],"names":["_createBlock","_unref","_normalizeClass","_createVNode"],"mappings":"
|
|
1
|
+
{"version":3,"file":"RenderForm.vue.js","sources":["../../../../../../../core/src/components/common/render/RenderForm.vue"],"sourcesContent":["<template>\n <Form\n ref=\"renderForm\"\n :layout=\"labelPosition\"\n :class=\"['render-form', 'tpf-form', customClass, readModeFlag ? 'readonly-mode-form' : '']\"\n :scrollToFirstError=\"true\"\n :validateOnRuleChange=\"false\"\n :model=\"formDataModel\"\n @keydown.enter=\"handleEnterKey\"\n >\n <RenderWidgetList :parentWidget=\"null\" v-model:list=\"widgetList\" />\n </Form>\n</template>\n\n<script lang=\"ts\" setup>\n import { computed, ref, onMounted, type PropType } from 'vue';\n import { Form } from 'ant-design-vue';\n import { RenderWidgetList } from '@kp-ui/lowcode-core';\n import { useEmitter } from '@kp-ui/lowcode-core/src/utils/useEmitter';\n\n /**\n * 表单容器组件\n * 负责渲染表单及其子组件\n */\n const props = defineProps({\n context: {\n type: Object as PropType<any>,\n required: true\n }\n });\n\n const emit = defineEmits(['form-submit', 'form-cancel']);\n\n // 组件引用\n const renderForm = ref();\n const { emit$, on$, off$ } = useEmitter();\n\n // 从上下文中获取数据\n const formDataModel = computed({\n get: () => props.context.formDataModel.value,\n set: val => {\n props.context.formDataModel.value = val;\n }\n });\n const readModeFlag = computed(() => props.context.readModeFlag.value);\n const formConfig = computed(() => props.context.formConfig.value);\n const widgetList = computed(() => props.context.widgetList.value);\n const labelPosition = computed(() => props.context.labelPosition.value);\n const customClass = computed(() => props.context.customClass.value);\n\n /**\n * 处理回车键事件\n */\n const handleEnterKey = () => {\n if (formConfig.value?.isEnterSubmit === 1) {\n props.context.onFormUpdate();\n }\n };\n\n onMounted(() => {});\n\n // 暴露方法\n defineExpose({\n renderForm,\n off$,\n on$,\n emit$\n });\n</script>\n"],"names":["_createBlock","_unref","_normalizeClass","_createVNode"],"mappings":";;;;;;;;;;;;;;AAwBI,UAAM,QAAQ;AAUd,UAAM,aAAa,IAAA;AACnB,UAAM,EAAE,OAAO,KAAK,KAAA,IAAS,WAAA;AAG7B,UAAM,gBAAgB,SAAS;AAAA,MAC3B,KAAK,MAAM,MAAM,QAAQ,cAAc;AAAA,MACvC,KAAK,CAAA,QAAO;AACR,cAAM,QAAQ,cAAc,QAAQ;AAAA,MACxC;AAAA,IAAA,CACH;AACD,UAAM,eAAe,SAAS,MAAM,MAAM,QAAQ,aAAa,KAAK;AACpE,UAAM,aAAa,SAAS,MAAM,MAAM,QAAQ,WAAW,KAAK;AAChE,UAAM,aAAa,SAAS,MAAM,MAAM,QAAQ,WAAW,KAAK;AAChE,UAAM,gBAAgB,SAAS,MAAM,MAAM,QAAQ,cAAc,KAAK;AACtE,UAAM,cAAc,SAAS,MAAM,MAAM,QAAQ,YAAY,KAAK;AAKlE,UAAM,iBAAiB,MAAM;;AACzB,YAAI,gBAAW,UAAX,mBAAkB,mBAAkB,GAAG;AACvC,cAAM,QAAQ,aAAA;AAAA,MAClB;AAAA,IACJ;AAEA,cAAU,MAAM;AAAA,IAAC,CAAC;AAGlB,aAAa;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACH;;0BAlEDA,YAUOC,MAAA,IAAA,GAAA;AAAA,iBATC;AAAA,QAAJ,KAAI;AAAA,QACH,QAAQ,cAAA;AAAA,QACR,OAAKC,eAAA,CAAA,eAAA,YAA8B,YAAA,OAAa,aAAA,QAAY,uBAAA,EAAA,CAAA;AAAA,QAC5D,oBAAoB;AAAA,QACpB,sBAAsB;AAAA,QACtB,OAAO,cAAA;AAAA,QACP,oBAAe,gBAAc,CAAA,OAAA,CAAA;AAAA,MAAA;yBAE9B,MAAmE;AAAA,UAAnEC,YAAmEF,MAAA,gBAAA,GAAA;AAAA,YAAhD,cAAc;AAAA,YAAc,MAAM,WAAA;AAAA,mEAAA,WAAU,QAAA;AAAA,UAAA;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFormContext.js","sources":["../../../../../../../core/src/components/common/render/useFormContext.ts"],"sourcesContent":["import { computed, nextTick, onMounted, provide, ref, useTemplateRef, watchEffect } from 'vue';\nimport {\n useFormValidation,\n FormConfig,\n Widget,\n cloneFormConfigWithoutEventHandler,\n generateId,\n getContainerWidgetByName,\n insertCustomCssToHead,\n insertGlobalFunctionsToHtml\n} from '@kp-ui/lowcode-core';\nimport { cloneDeep, set } from 'lodash-es';\nimport { message } from 'ant-design-vue';\nimport { getUuidKey } from '@kp-ui/tool';\nimport { routerReloadStatus, useComRef, useExecFunction, useRef } from 'tmgc2-share';\nimport { useEmitter } from '@kp-ui/lowcode-core/src/utils/useEmitter';\nimport { useI18n, useAppRef } from '@kp-ui/lowcode-core';\n\nexport interface FormRenderProps {\n vfCtx?: Record<string, any>;\n formJson?: any;\n formData?: Record<string, any>;\n optionData?: Record<string, any>;\n disabledMode?: boolean;\n renderConfig?: {\n languageName?: string;\n };\n parentForm?: any;\n dynamicCreation?: boolean;\n debug?: boolean;\n}\n\n/**\n * 表单上下文配置\n */\nexport interface FormContextOptions {\n props: FormRenderProps;\n renderForm: any;\n}\n\n/**\n * 创建表单上下文\n * @param options 表单上下文配置\n * @returns 表单上下文\n */\nexport const useFormContext = ({ renderForm, props }: FormContextOptions) => {\n const { formJson } = props;\n const dynamicDialogRef = useTemplateRef<any>('dynamicDialogRef');\n const { i18nt } = useI18n();\n const [readModeFlag, setReadMode] = useRef(false);\n\n const emitter = useEmitter();\n\n const formJsonObj = ref();\n // 状态变量\n const formDataModel = ref<Record<string, any>>({});\n const isLoading = ref(false);\n const widgetRefList = ref<Map<string, any>>(new Map());\n const dialogProps = ref({});\n const childFormRef = ref();\n\n const formWidgetId = Symbol('formWidget');\n\n const dialogOrDrawerRef = ref();\n\n const { executeFunction, context, execHttpFunction } = useExecFunction();\n const { getFormRef, getWidgetRef, registerToRefList } = useAppRef(widgetRefList, formWidgetId);\n\n // 计算属性\n const formConfig = computed<FormConfig>(() => formJsonObj.value?.formConfig || {});\n\n const widgetList = computed(() => formJsonObj.value?.widgetList || []);\n const labelPosition = computed(() => {\n return formConfig.value?.labelPosition || 'horizontal';\n });\n\n const setChildFormRef = chid => {\n childFormRef.value = chid;\n };\n\n const labelWidth = computed(() => {\n return formConfig.value?.labelWidth ? `${formConfig.value.labelWidth}px` : '80px';\n });\n\n const customClass = computed(() => {\n return formConfig.value?.customClass || '';\n });\n\n // 初始化表单验证器\n let formValidator = useFormValidation(renderForm);\n\n // 监听 widgetList 变化,重新初始化验证器\n watchEffect(() => {\n formValidator = useFormValidation(renderForm);\n });\n\n /**\n * 设置表单JSON数据\n */\n const setFormJson = async (json: any) => {\n formJsonObj.value = json || { widgetList: [], formConfig: {} };\n\n // 重新构建表单数据模型\n formDataModel.value = {};\n insertCustomCode();\n await nextTick();\n handleOnMounted();\n };\n\n /**\n * 获取表单数据\n */\n const getFormData = () => {\n return formDataModel.value || {};\n };\n\n /**\n * 设置表单数据\n */\n const setFormData = (data: Record<string, any>) => {\n if (!data) return;\n // 更新表单数据模型\n Object.keys(data).forEach(key => {\n if (Object.prototype.hasOwnProperty.call(formDataModel.value, key)) {\n formDataModel.value[key] = data[key];\n }\n });\n };\n\n /**\n * 设置加载状态\n */\n const setLoading = (loading: boolean) => {\n isLoading.value = loading;\n };\n\n /**\n * 重置表单验证\n */\n const resetValidation = () => {\n formValidator.resetValidation();\n };\n\n /**\n * 清除表单验证\n */\n const clearValidate = () => {\n formValidator.clearValidate();\n };\n\n const setDialogOrDrawerRef = (ddRef: any) => {\n dialogOrDrawerRef.value = ddRef;\n };\n\n /**\n * 当显示多级嵌套弹窗或抽屉时,获取最顶层VFormRender组件实例\n * @returns {object}\n */\n const getTopFormRef = () => {\n if (!props.parentForm) {\n return getFormRef();\n }\n\n let topFormRef = props.parentForm;\n while (topFormRef.parentForm) {\n topFormRef = topFormRef.parentForm;\n }\n\n return topFormRef;\n };\n\n /**\n * 显示弹窗表单,动态创建v-form-render组件,option-data、global-dsv等属性继承父级表单\n * @param dialogName\n * @param formData\n * @param extraData\n */\n const showDialog = (dialogName, formData = {}, extraData = {}) => {\n const topFormRef = getTopFormRef();\n const dialogCon = (getContainerWidgetByName(topFormRef?.widgetList || [], dialogName) ||\n getContainerWidgetByName(widgetList.value || [], dialogName)) as Widget | null;\n\n if (dialogCon === null) {\n message.error(i18nt('render.hint.refNotFound') + dialogName);\n return;\n }\n\n if (!dialogName || dialogCon.type !== 'vf-dialog') {\n message.error(i18nt('render.hint.refNotFound') + dialogName);\n return;\n }\n const dFormJson = {\n widgetList: cloneDeep(dialogCon?.widgetList || []),\n formConfig: cloneFormConfigWithoutEventHandler(topFormRef?.formConfig?.value || {})\n };\n const wrapperDivId = getUuidKey();\n dialogProps.value = {\n options: dialogCon.options,\n formJson: dFormJson,\n formData: { ...formData },\n optionData: topFormRef.optionData,\n parentFormRef: context.value,\n extraData: extraData,\n wrapperId: wrapperDivId,\n vfCtx: { ...formData }\n };\n\n dynamicDialogRef.value?.show();\n };\n /**\n * 获取父级VFormRender组件实例\n * @returns {object}\n */\n const getParentFormRef = () => {\n return props.parentForm;\n };\n\n const getChildFormRef = () => {\n return dynamicDialogRef.value?.getFormRef();\n };\n\n /**\n * 字段值变化事件处理器\n */\n const fieldChangeEventHandler = () => {\n emitter.off$('fieldChange');\n emitter.on$('fieldChange', ({ fieldName, value }) => {\n // 过滤掉错误值\n value = value ?? '';\n set(formDataModel.value, fieldName, value);\n });\n };\n\n const onFormDetail = async () => {\n const serveList = formConfig.value.serveList;\n const res = await execHttpFunction(serveList.vformDetail, {\n vfCtx: props.vfCtx\n });\n console.log('res: ', res);\n return res;\n };\n\n const onFormUpdate = async () => {\n const valid = await formValidator.validate();\n if (!valid) throw new Error(i18nt('表单验证失败'));\n\n const serveList = formConfig.value.serveList;\n const res = await execHttpFunction(serveList.vformUpdate, {\n data: formDataModel.value,\n vfCtx: props.vfCtx\n });\n console.log('res: ', res);\n return res;\n };\n\n const handleOnMounted = () => {\n if (formConfig.value?.onFormMounted) {\n console.log('onFormMounted: ');\n executeFunction({\n functionBody: formConfig.value?.onFormMounted\n });\n }\n };\n\n /**\n * 插入自定义样式和脚本\n * @param cssCode CSS代码\n * @param functions 自定义函数\n * @param formId 表单ID\n */\n const insertCustomCode = () => {\n const formId = 'vfRender' + generateId();\n const { cssCode, functions } = formConfig.value;\n console.log({ cssCode });\n\n if (cssCode) {\n insertCustomCssToHead(cssCode, formId || '');\n }\n if (functions) {\n insertGlobalFunctionsToHtml(functions, formId || '');\n }\n };\n\n const reload = () => {\n const router = context.value?.$router;\n router?.replace({\n query: {\n ...router.currentRoute.value.query,\n _t: Date.now()\n }\n });\n };\n\n const goBack = (reloadStatus?: routerReloadStatus, cb?: () => void) => {\n const goBack = getFormRef().vfCtx?.goBack;\n if (typeof goBack === 'function') {\n goBack(reloadStatus, cb);\n } else {\n const router = context.value?.$router;\n router?.go(-1);\n }\n };\n\n const getFieldValue = (field: string) => {\n return formDataModel.value[field];\n };\n\n const getVfCtx = () => {\n return props.vfCtx;\n };\n\n onMounted(() => {\n if (formJson) {\n setFormJson(formJson);\n }\n fieldChangeEventHandler();\n });\n\n const expose = {\n context,\n i18nt,\n goBack,\n reload,\n formValidator,\n getFieldValue,\n resetValidation,\n clearValidate,\n getVfCtx,\n getParentFormRef,\n getFormRef,\n getWidgetRef,\n showDialog,\n getFormData,\n getChildFormRef,\n setFormData,\n setReadMode,\n setFormJson,\n setLoading,\n onFormDetail,\n onFormUpdate,\n formDataModel,\n isLoading,\n vfCtx: props.vfCtx,\n // 计算属性\n formConfig,\n dynamicDialogRef,\n setChildFormRef,\n setDialogOrDrawerRef\n };\n\n return {\n formWidgetId,\n registerToRefList,\n dialogOrDrawerRef,\n\n emitter,\n // 状态\n formJsonObj,\n readModeFlag,\n // 引用\n widgetRefList,\n\n widgetList,\n labelPosition,\n labelWidth,\n customClass,\n dialogProps,\n\n expose,\n ...expose\n };\n};\n"],"names":["goBack"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useFormContext.js","sources":["../../../../../../../core/src/components/common/render/useFormContext.ts"],"sourcesContent":["import { computed, nextTick, onMounted, provide, ref, useTemplateRef, watchEffect } from 'vue';\nimport {\n useFormValidation,\n FormConfig,\n Widget,\n cloneFormConfigWithoutEventHandler,\n generateId,\n getContainerWidgetByName,\n insertCustomCssToHead,\n insertGlobalFunctionsToHtml\n} from '@kp-ui/lowcode-core';\nimport { cloneDeep, set } from 'lodash-es';\nimport { message } from 'ant-design-vue';\nimport { getUuidKey } from '@kp-ui/tool';\nimport { routerReloadStatus, useComRef, useExecFunction, useRef } from 'tmgc2-share';\nimport { useEmitter } from '@kp-ui/lowcode-core/src/utils/useEmitter';\nimport { useI18n, useAppRef } from '@kp-ui/lowcode-core';\n\nexport interface FormRenderProps {\n vfCtx?: Record<string, any>;\n formJson?: any;\n formData?: Record<string, any>;\n optionData?: Record<string, any>;\n disabledMode?: boolean;\n renderConfig?: {\n languageName?: string;\n };\n parentForm?: any;\n dynamicCreation?: boolean;\n debug?: boolean;\n}\n\n/**\n * 表单上下文配置\n */\nexport interface FormContextOptions {\n props: FormRenderProps;\n renderForm: any;\n}\n\n/**\n * 创建表单上下文\n * @param options 表单上下文配置\n * @returns 表单上下文\n */\nexport const useFormContext = ({ renderForm, props }: FormContextOptions) => {\n const { formJson } = props;\n const dynamicDialogRef = useTemplateRef<any>('dynamicDialogRef');\n const { i18nt } = useI18n();\n const [readModeFlag, setReadMode] = useRef(false);\n\n const emitter = useEmitter();\n\n const formJsonObj = ref();\n // 状态变量\n const formDataModel = ref<Record<string, any>>({});\n const isLoading = ref(false);\n const widgetRefList = ref<Map<string, any>>(new Map());\n const dialogProps = ref({});\n const childFormRef = ref();\n\n const formWidgetId = Symbol('formWidget');\n\n const dialogOrDrawerRef = ref();\n\n const { executeFunction, context, execHttpFunction } = useExecFunction();\n const { getFormRef, getWidgetRef, registerToRefList } = useAppRef(widgetRefList, formWidgetId);\n\n // 计算属性\n const formConfig = computed<FormConfig>(() => formJsonObj.value?.formConfig || {});\n\n const widgetList = computed(() => formJsonObj.value?.widgetList || []);\n const labelPosition = computed(() => {\n return formConfig.value?.labelPosition || 'horizontal';\n });\n\n const setChildFormRef = chid => {\n childFormRef.value = chid;\n };\n\n const labelWidth = computed(() => {\n return formConfig.value?.labelWidth ? `${formConfig.value.labelWidth}px` : '80px';\n });\n\n const customClass = computed(() => {\n return formConfig.value?.customClass || '';\n });\n\n // 初始化表单验证器\n let formValidator = useFormValidation(renderForm);\n\n // 监听 widgetList 变化,重新初始化验证器\n watchEffect(() => {\n formValidator = useFormValidation(renderForm);\n });\n\n /**\n * 设置表单JSON数据\n */\n const setFormJson = async (json: any) => {\n formJsonObj.value = json || { widgetList: [], formConfig: {} };\n\n // 重新构建表单数据模型\n formDataModel.value = {};\n insertCustomCode();\n await nextTick();\n handleOnMounted();\n };\n\n /**\n * 获取表单数据\n */\n const getFormData = () => {\n return formDataModel.value || {};\n };\n\n /**\n * 设置表单数据\n */\n const setFormData = (data: Record<string, any>) => {\n if (!data) return;\n // 更新表单数据模型\n Object.keys(data).forEach(key => {\n if (Object.prototype.hasOwnProperty.call(formDataModel.value, key)) {\n formDataModel.value[key] = data[key];\n }\n });\n };\n\n /**\n * 设置加载状态\n */\n const setLoading = (loading: boolean) => {\n isLoading.value = loading;\n };\n\n /**\n * 重置表单验证\n */\n const resetValidation = () => {\n formValidator.resetValidation();\n };\n\n /**\n * 清除表单验证\n */\n const clearValidate = () => {\n formValidator.clearValidate();\n };\n\n const setDialogOrDrawerRef = (ddRef: any) => {\n dialogOrDrawerRef.value = ddRef;\n };\n\n /**\n * 当显示多级嵌套弹窗或抽屉时,获取最顶层VFormRender组件实例\n * @returns {object}\n */\n const getTopFormRef = () => {\n if (!props.parentForm) {\n return getFormRef();\n }\n\n let topFormRef = props.parentForm;\n while (topFormRef.parentForm) {\n topFormRef = topFormRef.parentForm;\n }\n\n return topFormRef;\n };\n\n /**\n * 显示弹窗表单,动态创建v-form-render组件,option-data、global-dsv等属性继承父级表单\n * @param dialogName\n * @param formData\n * @param extraData\n */\n const showDialog = (dialogName, formData = {}, extraData = {}) => {\n const topFormRef = getTopFormRef();\n const dialogCon = (getContainerWidgetByName(topFormRef?.widgetList || [], dialogName) ||\n getContainerWidgetByName(widgetList.value || [], dialogName)) as Widget | null;\n\n if (dialogCon === null) {\n message.error(i18nt('render.hint.refNotFound') + dialogName);\n return;\n }\n\n if (!dialogName || dialogCon.type !== 'vf-dialog') {\n message.error(i18nt('render.hint.refNotFound') + dialogName);\n return;\n }\n const dFormJson = {\n widgetList: cloneDeep(dialogCon?.widgetList || []),\n formConfig: cloneFormConfigWithoutEventHandler(topFormRef?.formConfig?.value || {})\n };\n const wrapperDivId = getUuidKey();\n dialogProps.value = {\n options: dialogCon.options,\n formJson: dFormJson,\n formData: { ...formData },\n optionData: topFormRef.optionData,\n parentFormRef: context.value,\n extraData: extraData,\n wrapperId: wrapperDivId,\n vfCtx: { ...formData }\n };\n\n dynamicDialogRef.value?.show();\n };\n /**\n * 获取父级VFormRender组件实例\n * @returns {object}\n */\n const getParentFormRef = () => {\n return props.parentForm;\n };\n\n const getChildFormRef = () => {\n return dynamicDialogRef.value?.getFormRef();\n };\n\n /**\n * 字段值变化事件处理器\n */\n const fieldChangeEventHandler = () => {\n emitter.off$('fieldChange');\n emitter.on$('fieldChange', ({ fieldName, value }) => {\n // 过滤掉错误值\n value = value ?? '';\n set(formDataModel.value, fieldName, value);\n });\n };\n\n const onFormDetail = async () => {\n const serveList = formConfig.value.serveList;\n const res = await execHttpFunction(serveList.vformDetail, {\n vfCtx: props.vfCtx\n });\n console.log('res: ', res);\n return res;\n };\n\n const onFormUpdate = async () => {\n const valid = await formValidator.validate();\n if (!valid) throw new Error(i18nt('表单验证失败'));\n\n const serveList = formConfig.value.serveList;\n const res = await execHttpFunction(serveList.vformUpdate, {\n data: formDataModel.value,\n vfCtx: props.vfCtx\n });\n console.log('res: ', res);\n return res;\n };\n\n const handleOnMounted = () => {\n if (formConfig.value?.onFormMounted) {\n console.log('onFormMounted: ');\n executeFunction({\n functionBody: formConfig.value?.onFormMounted\n });\n }\n };\n\n /**\n * 插入自定义样式和脚本\n * @param cssCode CSS代码\n * @param functions 自定义函数\n * @param formId 表单ID\n */\n const insertCustomCode = () => {\n const formId = 'vfRender' + generateId();\n const { cssCode, functions } = formConfig.value;\n console.log({ cssCode });\n\n if (cssCode) {\n insertCustomCssToHead(cssCode, formId || '');\n }\n if (functions) {\n insertGlobalFunctionsToHtml(functions, formId || '');\n }\n };\n\n const reload = () => {\n const router = context.value?.$router;\n router?.replace({\n query: {\n ...router.currentRoute.value.query,\n _t: Date.now()\n }\n });\n };\n\n const goBack = (reloadStatus?: routerReloadStatus, cb?: () => void) => {\n const goBack = getFormRef().vfCtx?.goBack;\n if (typeof goBack === 'function') {\n goBack(reloadStatus, cb);\n } else {\n const router = context.value?.$router;\n router?.go(-1);\n }\n };\n\n const getFieldValue = (field: string) => {\n return formDataModel.value[field];\n };\n\n const getVfCtx = () => {\n return props.vfCtx;\n };\n\n onMounted(() => {\n if (formJson) {\n setFormJson(formJson);\n }\n fieldChangeEventHandler();\n });\n\n const expose = {\n context,\n i18nt,\n goBack,\n reload,\n formValidator,\n getFieldValue,\n resetValidation,\n clearValidate,\n getVfCtx,\n getParentFormRef,\n getFormRef,\n getWidgetRef,\n showDialog,\n getFormData,\n getChildFormRef,\n setFormData,\n setReadMode,\n setFormJson,\n setLoading,\n onFormDetail,\n onFormUpdate,\n formDataModel,\n isLoading,\n vfCtx: props.vfCtx,\n // 计算属性\n formConfig,\n dynamicDialogRef,\n setChildFormRef,\n setDialogOrDrawerRef\n };\n\n return {\n formWidgetId,\n registerToRefList,\n dialogOrDrawerRef,\n\n emitter,\n // 状态\n formJsonObj,\n readModeFlag,\n // 引用\n widgetRefList,\n\n widgetList,\n labelPosition,\n labelWidth,\n customClass,\n dialogProps,\n\n expose,\n ...expose\n };\n};\n"],"names":["goBack"],"mappings":"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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { computed } from "vue";
|
|
2
2
|
import { RollbackOutlined, UnlockOutlined, LockOutlined, VerticalAlignTopOutlined, VerticalAlignBottomOutlined, ArrowUpOutlined, ArrowDownOutlined, AppstoreOutlined, CopyOutlined, DeleteOutlined } from "@ant-design/icons-vue";
|
|
3
3
|
import { useDesigner } from "../../hooks/useDesigner.js";
|
|
4
|
-
/* empty css */
|
|
5
4
|
import { useI18n } from "../../utils/i18n.js";
|
|
6
5
|
function useWidgetContextMenu(props) {
|
|
7
6
|
const { designer, isBI } = useDesigner();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useWidgetContextMenu.js","sources":["../../../../../../core/src/components/contextMenu/useWidgetContextMenu.ts"],"sourcesContent":["import { Component, computed, Ref } from 'vue';\nimport { Widget } from '@kp-ui/lowcode-core/src/types/schema';\nimport {\n DeleteOutlined,\n LockOutlined,\n UnlockOutlined,\n VerticalAlignTopOutlined,\n VerticalAlignBottomOutlined,\n ArrowUpOutlined,\n ArrowDownOutlined,\n AppstoreOutlined,\n CopyOutlined,\n RollbackOutlined\n} from '@ant-design/icons-vue';\nimport { useDesigner } from '@kp-ui/lowcode-core';\nimport { useI18n } from '@kp-ui/lowcode-core';\n\nexport interface MenuItem {\n key: string;\n label?: string;\n icon?: Component;\n onClick?: () => void;\n divider?: boolean;\n children?: MenuItem[];\n hidden?: boolean;\n}\n\nexport function useWidgetContextMenu(props: {\n widget: Widget;\n index: number;\n parentWidget?: Widget;\n onClose: () => void;\n list: Ref<Widget[]>;\n}) {\n const { designer, isBI } = useDesigner();\n const { i18nt } = useI18n();\n\n // 上移组件\n const moveUpWidget = () => {\n designer.value.moveUpWidget(props.list.value, props.index);\n designer.value.emitHistoryChange();\n };\n\n // 下移组件\n const moveDownWidget = () => {\n designer.value.moveDownWidget(props.list.value, props.index);\n designer.value.emitHistoryChange();\n };\n\n // 复制组件\n const cloneWidget = () => {\n const list = props.list.value;\n if (!list) return;\n const cloned = designer.value.copyWidget(props.widget);\n list.splice(props.index + 1, 0, cloned);\n designer.value.setSelected(cloned);\n designer.value.emitHistoryChange();\n };\n\n // 删除组件\n const removeWidget = () => {\n designer.value.removeWidget(props.list.value, props.index, props.parentWidget);\n };\n\n // 选择父组件\n const selectParentWidget = () => {\n if (props.parentWidget?.id) {\n designer.value.setSelected(props.parentWidget);\n } else {\n designer.value.clearSelected();\n }\n };\n\n const handleAction = (action: () => void) => {\n action();\n props.onClose();\n };\n\n const handleLock = () => {\n props.widget.options.locked = !props.widget.options.locked;\n props.onClose();\n };\n\n const handleLayer = (type: 'top' | 'bottom' | 'up' | 'down') => {\n const widget = props.widget;\n const zIndex = widget.options.zIndex || 0;\n const list = designer.value.widgetList;\n switch (type) {\n case 'top':\n const maxZ = Math.max(...list.map(w => w.options.zIndex || 0));\n widget.options.zIndex = maxZ + 1;\n break;\n case 'bottom':\n const minZ = Math.min(...list.map(w => w.options.zIndex || 0));\n widget.options.zIndex = minZ - 1;\n break;\n case 'up':\n widget.options.zIndex = zIndex + 1;\n break;\n case 'down':\n widget.options.zIndex = zIndex - 1;\n break;\n }\n props.onClose();\n };\n\n const menuConfigs = computed<MenuItem[]>(() => {\n const configs: MenuItem[] = [];\n\n // 选择父组件\n if (props.parentWidget?.id) {\n configs.push({\n key: 'selectParent',\n label: i18nt('designer.hint.selectParentWidget'),\n icon: RollbackOutlined,\n onClick: () => handleAction(selectParentWidget)\n });\n configs.push({ key: 'd1', divider: true });\n }\n\n if (isBI.value) {\n // BI 模式特有:锁定\n configs.push({\n key: 'lock',\n label: props.widget.options.locked\n ? i18nt('designer.hint.unlock')\n : i18nt('designer.hint.lock'),\n icon: props.widget.options.locked ? UnlockOutlined : LockOutlined,\n onClick: handleLock\n });\n\n // BI 模式特有:图层\n configs.push({\n key: 'layer',\n label: i18nt('designer.hint.layer'),\n icon: AppstoreOutlined,\n children: [\n {\n key: 'bringToFront',\n label: i18nt('designer.hint.bringToFront'),\n icon: VerticalAlignTopOutlined,\n onClick: () => handleLayer('top')\n },\n {\n key: 'sendToBack',\n label: i18nt('designer.hint.sendToBack'),\n icon: VerticalAlignBottomOutlined,\n onClick: () => handleLayer('bottom')\n },\n {\n key: 'bringForward',\n label: i18nt('designer.hint.bringForward'),\n icon: ArrowUpOutlined,\n onClick: () => handleLayer('up')\n },\n {\n key: 'sendBackward',\n label: i18nt('designer.hint.sendBackward'),\n icon: ArrowDownOutlined,\n onClick: () => handleLayer('down')\n }\n ]\n });\n\n configs.push({\n key: 'clone',\n label: i18nt('designer.hint.cloneWidget'),\n icon: CopyOutlined,\n onClick: () => handleAction(cloneWidget)\n });\n\n configs.push({ key: 'd2', divider: true });\n } else {\n // 非 BI 模式:上移/下移/复制\n configs.push({\n key: 'moveUp',\n label: i18nt('designer.hint.moveUpWidget'),\n icon: ArrowUpOutlined,\n onClick: () => handleAction(moveUpWidget),\n hidden: props.index <= 0\n });\n configs.push({\n key: 'moveDown',\n label: i18nt('designer.hint.moveDownWidget'),\n icon: ArrowDownOutlined,\n onClick: () => handleAction(moveDownWidget),\n hidden: props.index >= props.list.value.length - 1\n });\n\n configs.push({\n key: 'clone',\n label: i18nt('designer.hint.cloneWidget'),\n icon: CopyOutlined,\n onClick: () => handleAction(cloneWidget)\n });\n\n configs.push({ key: 'd3', divider: true });\n }\n\n // 删除\n configs.push({\n key: 'delete',\n label: i18nt('designer.hint.remove'),\n icon: DeleteOutlined,\n onClick: () => handleAction(removeWidget)\n });\n\n return configs.filter(item => !item.hidden);\n });\n\n return {\n menuConfigs,\n moveUpWidget,\n moveDownWidget,\n cloneWidget,\n removeWidget,\n selectParentWidget\n };\n}\n"],"names":[],"mappings":";;;;;AA2BO,SAAS,qBAAqB,OAMlC;AACC,QAAM,EAAE,UAAU,KAAA,IAAS,YAAA;AAC3B,QAAM,EAAE,MAAA,IAAU,QAAA;AAGlB,QAAM,eAAe,MAAM;AACvB,aAAS,MAAM,aAAa,MAAM,KAAK,OAAO,MAAM,KAAK;AACzD,aAAS,MAAM,kBAAA;AAAA,EACnB;AAGA,QAAM,iBAAiB,MAAM;AACzB,aAAS,MAAM,eAAe,MAAM,KAAK,OAAO,MAAM,KAAK;AAC3D,aAAS,MAAM,kBAAA;AAAA,EACnB;AAGA,QAAM,cAAc,MAAM;AACtB,UAAM,OAAO,MAAM,KAAK;AACxB,QAAI,CAAC,KAAM;AACX,UAAM,SAAS,SAAS,MAAM,WAAW,MAAM,MAAM;AACrD,SAAK,OAAO,MAAM,QAAQ,GAAG,GAAG,MAAM;AACtC,aAAS,MAAM,YAAY,MAAM;AACjC,aAAS,MAAM,kBAAA;AAAA,EACnB;AAGA,QAAM,eAAe,MAAM;AACvB,aAAS,MAAM,aAAa,MAAM,KAAK,OAAO,MAAM,OAAO,MAAM,YAAY;AAAA,EACjF;AAGA,QAAM,qBAAqB,MAAM;;AAC7B,SAAI,WAAM,iBAAN,mBAAoB,IAAI;AACxB,eAAS,MAAM,YAAY,MAAM,YAAY;AAAA,IACjD,OAAO;AACH,eAAS,MAAM,cAAA;AAAA,IACnB;AAAA,EACJ;AAEA,QAAM,eAAe,CAAC,WAAuB;AACzC,WAAA;AACA,UAAM,QAAA;AAAA,EACV;AAEA,QAAM,aAAa,MAAM;AACrB,UAAM,OAAO,QAAQ,SAAS,CAAC,MAAM,OAAO,QAAQ;AACpD,UAAM,QAAA;AAAA,EACV;AAEA,QAAM,cAAc,CAAC,SAA2C;AAC5D,UAAM,SAAS,MAAM;AACrB,UAAM,SAAS,OAAO,QAAQ,UAAU;AACxC,UAAM,OAAO,SAAS,MAAM;AAC5B,YAAQ,MAAA;AAAA,MACJ,KAAK;AACD,cAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,CAAA,MAAK,EAAE,QAAQ,UAAU,CAAC,CAAC;AAC7D,eAAO,QAAQ,SAAS,OAAO;AAC/B;AAAA,MACJ,KAAK;AACD,cAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,CAAA,MAAK,EAAE,QAAQ,UAAU,CAAC,CAAC;AAC7D,eAAO,QAAQ,SAAS,OAAO;AAC/B;AAAA,MACJ,KAAK;AACD,eAAO,QAAQ,SAAS,SAAS;AACjC;AAAA,MACJ,KAAK;AACD,eAAO,QAAQ,SAAS,SAAS;AACjC;AAAA,IAAA;AAER,UAAM,QAAA;AAAA,EACV;AAEA,QAAM,cAAc,SAAqB,MAAM;;AAC3C,UAAM,UAAsB,CAAA;AAG5B,SAAI,WAAM,iBAAN,mBAAoB,IAAI;AACxB,cAAQ,KAAK;AAAA,QACT,KAAK;AAAA,QACL,OAAO,MAAM,kCAAkC;AAAA,QAC/C,MAAM;AAAA,QACN,SAAS,MAAM,aAAa,kBAAkB;AAAA,MAAA,CACjD;AACD,cAAQ,KAAK,EAAE,KAAK,MAAM,SAAS,MAAM;AAAA,IAC7C;AAEA,QAAI,KAAK,OAAO;AAEZ,cAAQ,KAAK;AAAA,QACT,KAAK;AAAA,QACL,OAAO,MAAM,OAAO,QAAQ,SACtB,MAAM,sBAAsB,IAC5B,MAAM,oBAAoB;AAAA,QAChC,MAAM,MAAM,OAAO,QAAQ,SAAS,iBAAiB;AAAA,QACrD,SAAS;AAAA,MAAA,CACZ;AAGD,cAAQ,KAAK;AAAA,QACT,KAAK;AAAA,QACL,OAAO,MAAM,qBAAqB;AAAA,QAClC,MAAM;AAAA,QACN,UAAU;AAAA,UACN;AAAA,YACI,KAAK;AAAA,YACL,OAAO,MAAM,4BAA4B;AAAA,YACzC,MAAM;AAAA,YACN,SAAS,MAAM,YAAY,KAAK;AAAA,UAAA;AAAA,UAEpC;AAAA,YACI,KAAK;AAAA,YACL,OAAO,MAAM,0BAA0B;AAAA,YACvC,MAAM;AAAA,YACN,SAAS,MAAM,YAAY,QAAQ;AAAA,UAAA;AAAA,UAEvC;AAAA,YACI,KAAK;AAAA,YACL,OAAO,MAAM,4BAA4B;AAAA,YACzC,MAAM;AAAA,YACN,SAAS,MAAM,YAAY,IAAI;AAAA,UAAA;AAAA,UAEnC;AAAA,YACI,KAAK;AAAA,YACL,OAAO,MAAM,4BAA4B;AAAA,YACzC,MAAM;AAAA,YACN,SAAS,MAAM,YAAY,MAAM;AAAA,UAAA;AAAA,QACrC;AAAA,MACJ,CACH;AAED,cAAQ,KAAK;AAAA,QACT,KAAK;AAAA,QACL,OAAO,MAAM,2BAA2B;AAAA,QACxC,MAAM;AAAA,QACN,SAAS,MAAM,aAAa,WAAW;AAAA,MAAA,CAC1C;AAED,cAAQ,KAAK,EAAE,KAAK,MAAM,SAAS,MAAM;AAAA,IAC7C,OAAO;AAEH,cAAQ,KAAK;AAAA,QACT,KAAK;AAAA,QACL,OAAO,MAAM,4BAA4B;AAAA,QACzC,MAAM;AAAA,QACN,SAAS,MAAM,aAAa,YAAY;AAAA,QACxC,QAAQ,MAAM,SAAS;AAAA,MAAA,CAC1B;AACD,cAAQ,KAAK;AAAA,QACT,KAAK;AAAA,QACL,OAAO,MAAM,8BAA8B;AAAA,QAC3C,MAAM;AAAA,QACN,SAAS,MAAM,aAAa,cAAc;AAAA,QAC1C,QAAQ,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS;AAAA,MAAA,CACpD;AAED,cAAQ,KAAK;AAAA,QACT,KAAK;AAAA,QACL,OAAO,MAAM,2BAA2B;AAAA,QACxC,MAAM;AAAA,QACN,SAAS,MAAM,aAAa,WAAW;AAAA,MAAA,CAC1C;AAED,cAAQ,KAAK,EAAE,KAAK,MAAM,SAAS,MAAM;AAAA,IAC7C;AAGA,YAAQ,KAAK;AAAA,MACT,KAAK;AAAA,MACL,OAAO,MAAM,sBAAsB;AAAA,MACnC,MAAM;AAAA,MACN,SAAS,MAAM,aAAa,YAAY;AAAA,IAAA,CAC3C;AAED,WAAO,QAAQ,OAAO,CAAA,SAAQ,CAAC,KAAK,MAAM;AAAA,EAC9C,CAAC;AAED,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAER;"}
|
|
1
|
+
{"version":3,"file":"useWidgetContextMenu.js","sources":["../../../../../../core/src/components/contextMenu/useWidgetContextMenu.ts"],"sourcesContent":["import { Component, computed, Ref } from 'vue';\nimport { Widget } from '@kp-ui/lowcode-core/src/types/schema';\nimport {\n DeleteOutlined,\n LockOutlined,\n UnlockOutlined,\n VerticalAlignTopOutlined,\n VerticalAlignBottomOutlined,\n ArrowUpOutlined,\n ArrowDownOutlined,\n AppstoreOutlined,\n CopyOutlined,\n RollbackOutlined\n} from '@ant-design/icons-vue';\nimport { useDesigner } from '@kp-ui/lowcode-core';\nimport { useI18n } from '@kp-ui/lowcode-core';\n\nexport interface MenuItem {\n key: string;\n label?: string;\n icon?: Component;\n onClick?: () => void;\n divider?: boolean;\n children?: MenuItem[];\n hidden?: boolean;\n}\n\nexport function useWidgetContextMenu(props: {\n widget: Widget;\n index: number;\n parentWidget?: Widget;\n onClose: () => void;\n list: Ref<Widget[]>;\n}) {\n const { designer, isBI } = useDesigner();\n const { i18nt } = useI18n();\n\n // 上移组件\n const moveUpWidget = () => {\n designer.value.moveUpWidget(props.list.value, props.index);\n designer.value.emitHistoryChange();\n };\n\n // 下移组件\n const moveDownWidget = () => {\n designer.value.moveDownWidget(props.list.value, props.index);\n designer.value.emitHistoryChange();\n };\n\n // 复制组件\n const cloneWidget = () => {\n const list = props.list.value;\n if (!list) return;\n const cloned = designer.value.copyWidget(props.widget);\n list.splice(props.index + 1, 0, cloned);\n designer.value.setSelected(cloned);\n designer.value.emitHistoryChange();\n };\n\n // 删除组件\n const removeWidget = () => {\n designer.value.removeWidget(props.list.value, props.index, props.parentWidget);\n };\n\n // 选择父组件\n const selectParentWidget = () => {\n if (props.parentWidget?.id) {\n designer.value.setSelected(props.parentWidget);\n } else {\n designer.value.clearSelected();\n }\n };\n\n const handleAction = (action: () => void) => {\n action();\n props.onClose();\n };\n\n const handleLock = () => {\n props.widget.options.locked = !props.widget.options.locked;\n props.onClose();\n };\n\n const handleLayer = (type: 'top' | 'bottom' | 'up' | 'down') => {\n const widget = props.widget;\n const zIndex = widget.options.zIndex || 0;\n const list = designer.value.widgetList;\n switch (type) {\n case 'top':\n const maxZ = Math.max(...list.map(w => w.options.zIndex || 0));\n widget.options.zIndex = maxZ + 1;\n break;\n case 'bottom':\n const minZ = Math.min(...list.map(w => w.options.zIndex || 0));\n widget.options.zIndex = minZ - 1;\n break;\n case 'up':\n widget.options.zIndex = zIndex + 1;\n break;\n case 'down':\n widget.options.zIndex = zIndex - 1;\n break;\n }\n props.onClose();\n };\n\n const menuConfigs = computed<MenuItem[]>(() => {\n const configs: MenuItem[] = [];\n\n // 选择父组件\n if (props.parentWidget?.id) {\n configs.push({\n key: 'selectParent',\n label: i18nt('designer.hint.selectParentWidget'),\n icon: RollbackOutlined,\n onClick: () => handleAction(selectParentWidget)\n });\n configs.push({ key: 'd1', divider: true });\n }\n\n if (isBI.value) {\n // BI 模式特有:锁定\n configs.push({\n key: 'lock',\n label: props.widget.options.locked\n ? i18nt('designer.hint.unlock')\n : i18nt('designer.hint.lock'),\n icon: props.widget.options.locked ? UnlockOutlined : LockOutlined,\n onClick: handleLock\n });\n\n // BI 模式特有:图层\n configs.push({\n key: 'layer',\n label: i18nt('designer.hint.layer'),\n icon: AppstoreOutlined,\n children: [\n {\n key: 'bringToFront',\n label: i18nt('designer.hint.bringToFront'),\n icon: VerticalAlignTopOutlined,\n onClick: () => handleLayer('top')\n },\n {\n key: 'sendToBack',\n label: i18nt('designer.hint.sendToBack'),\n icon: VerticalAlignBottomOutlined,\n onClick: () => handleLayer('bottom')\n },\n {\n key: 'bringForward',\n label: i18nt('designer.hint.bringForward'),\n icon: ArrowUpOutlined,\n onClick: () => handleLayer('up')\n },\n {\n key: 'sendBackward',\n label: i18nt('designer.hint.sendBackward'),\n icon: ArrowDownOutlined,\n onClick: () => handleLayer('down')\n }\n ]\n });\n\n configs.push({\n key: 'clone',\n label: i18nt('designer.hint.cloneWidget'),\n icon: CopyOutlined,\n onClick: () => handleAction(cloneWidget)\n });\n\n configs.push({ key: 'd2', divider: true });\n } else {\n // 非 BI 模式:上移/下移/复制\n configs.push({\n key: 'moveUp',\n label: i18nt('designer.hint.moveUpWidget'),\n icon: ArrowUpOutlined,\n onClick: () => handleAction(moveUpWidget),\n hidden: props.index <= 0\n });\n configs.push({\n key: 'moveDown',\n label: i18nt('designer.hint.moveDownWidget'),\n icon: ArrowDownOutlined,\n onClick: () => handleAction(moveDownWidget),\n hidden: props.index >= props.list.value.length - 1\n });\n\n configs.push({\n key: 'clone',\n label: i18nt('designer.hint.cloneWidget'),\n icon: CopyOutlined,\n onClick: () => handleAction(cloneWidget)\n });\n\n configs.push({ key: 'd3', divider: true });\n }\n\n // 删除\n configs.push({\n key: 'delete',\n label: i18nt('designer.hint.remove'),\n icon: DeleteOutlined,\n onClick: () => handleAction(removeWidget)\n });\n\n return configs.filter(item => !item.hidden);\n });\n\n return {\n menuConfigs,\n moveUpWidget,\n moveDownWidget,\n cloneWidget,\n removeWidget,\n selectParentWidget\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAppRef.js","sources":["../../../../../core/src/hooks/useAppRef.ts"],"sourcesContent":["import { useI18n } from '@kp-ui/lowcode-core';\nimport { message } from 'ant-design-vue';\nimport { computed, getCurrentInstance, inject, ref, Ref } from 'vue';\n\nexport function useAppRef(widgetRefList?: Ref<Map<string, any>>, formWidgetId?: any) {\n const { i18nt } = useI18n();\n const isRoot = formWidgetId !== undefined;\n\n if (!isRoot) {\n formWidgetId = inject('formWidgetId', '');\n }\n\n const refList = inject<Ref<Map<string, any>>>('refList', widgetRefList || ref(new Map()));\n\n const instance = getCurrentInstance();\n\n const widgetId = computed(() => instance?.exposed?.field?.options?.name as string);\n\n const initRefList = () => {\n registerToRefList();\n };\n\n const getWidgetRef = (widgetName, showError?: boolean) => {\n const list = isRoot ? (widgetRefList?.value as Map<any, any>) : refList.value;\n const foundRef = list.get(widgetName);\n if (!foundRef && !!showError) {\n message.error(i18nt('render.hint.refNotFound') + widgetName);\n }\n return foundRef;\n };\n\n /* 该方法用于组件重名检查!! */\n const registerToRefList = (widgetName?: symbol | string) => {\n const list = isRoot ? (widgetRefList?.value as Map<any, any>) : refList.value;\n list.set(widgetName || widgetId.value, {\n instance,\n proxy: instance?.proxy,\n ...instance?.appContext.config.globalProperties,\n ...instance?.exposed\n });\n };\n\n /**\n * 从引用列表中注销\n */\n const unregisterFromRefList = () => {\n const widgetId = instance?.exposed?.field?.options?.name;\n refList?.value?.delete(widgetId);\n };\n\n const getFormRef = () => {\n return getWidgetRef(formWidgetId);\n };\n\n return {\n refList,\n getFormRef,\n registerToRefList,\n unregisterFromRefList,\n initRefList,\n getWidgetRef\n };\n}\n"],"names":["widgetId"],"mappings":"
|
|
1
|
+
{"version":3,"file":"useAppRef.js","sources":["../../../../../core/src/hooks/useAppRef.ts"],"sourcesContent":["import { useI18n } from '@kp-ui/lowcode-core';\nimport { message } from 'ant-design-vue';\nimport { computed, getCurrentInstance, inject, ref, Ref } from 'vue';\n\nexport function useAppRef(widgetRefList?: Ref<Map<string, any>>, formWidgetId?: any) {\n const { i18nt } = useI18n();\n const isRoot = formWidgetId !== undefined;\n\n if (!isRoot) {\n formWidgetId = inject('formWidgetId', '');\n }\n\n const refList = inject<Ref<Map<string, any>>>('refList', widgetRefList || ref(new Map()));\n\n const instance = getCurrentInstance();\n\n const widgetId = computed(() => instance?.exposed?.field?.options?.name as string);\n\n const initRefList = () => {\n registerToRefList();\n };\n\n const getWidgetRef = (widgetName, showError?: boolean) => {\n const list = isRoot ? (widgetRefList?.value as Map<any, any>) : refList.value;\n const foundRef = list.get(widgetName);\n if (!foundRef && !!showError) {\n message.error(i18nt('render.hint.refNotFound') + widgetName);\n }\n return foundRef;\n };\n\n /* 该方法用于组件重名检查!! */\n const registerToRefList = (widgetName?: symbol | string) => {\n const list = isRoot ? (widgetRefList?.value as Map<any, any>) : refList.value;\n list.set(widgetName || widgetId.value, {\n instance,\n proxy: instance?.proxy,\n ...instance?.appContext.config.globalProperties,\n ...instance?.exposed\n });\n };\n\n /**\n * 从引用列表中注销\n */\n const unregisterFromRefList = () => {\n const widgetId = instance?.exposed?.field?.options?.name;\n refList?.value?.delete(widgetId);\n };\n\n const getFormRef = () => {\n return getWidgetRef(formWidgetId);\n };\n\n return {\n refList,\n getFormRef,\n registerToRefList,\n unregisterFromRefList,\n initRefList,\n getWidgetRef\n };\n}\n"],"names":["widgetId"],"mappings":";;;AAIO,SAAS,UAAU,eAAuC,cAAoB;AACjF,QAAM,EAAE,MAAA,IAAU,QAAA;AAClB,QAAM,SAAS,iBAAiB;AAEhC,MAAI,CAAC,QAAQ;AACT,mBAAe,OAAO,gBAAgB,EAAE;AAAA,EAC5C;AAEA,QAAM,UAAU,OAA8B,WAAW,iBAAiB,IAAI,oBAAI,IAAA,CAAK,CAAC;AAExF,QAAM,WAAW,mBAAA;AAEjB,QAAM,WAAW,SAAS,MAAA;;AAAM,kEAAU,YAAV,mBAAmB,UAAnB,mBAA0B,YAA1B,mBAAmC;AAAA,GAAc;AAEjF,QAAM,cAAc,MAAM;AACtB,sBAAA;AAAA,EACJ;AAEA,QAAM,eAAe,CAAC,YAAY,cAAwB;AACtD,UAAM,OAAO,SAAU,+CAAe,QAA0B,QAAQ;AACxE,UAAM,WAAW,KAAK,IAAI,UAAU;AACpC,QAAI,CAAC,YAAY,CAAC,CAAC,WAAW;AAC1B,cAAQ,MAAM,MAAM,yBAAyB,IAAI,UAAU;AAAA,IAC/D;AACA,WAAO;AAAA,EACX;AAGA,QAAM,oBAAoB,CAAC,eAAiC;AACxD,UAAM,OAAO,SAAU,+CAAe,QAA0B,QAAQ;AACxE,SAAK,IAAI,cAAc,SAAS,OAAO;AAAA,MACnC;AAAA,MACA,OAAO,qCAAU;AAAA,MACjB,GAAG,qCAAU,WAAW,OAAO;AAAA,MAC/B,GAAG,qCAAU;AAAA,IAAA,CAChB;AAAA,EACL;AAKA,QAAM,wBAAwB,MAAM;;AAChC,UAAMA,aAAW,sDAAU,YAAV,mBAAmB,UAAnB,mBAA0B,YAA1B,mBAAmC;AACpD,6CAAS,UAAT,mBAAgB,OAAOA;AAAAA,EAC3B;AAEA,QAAM,aAAa,MAAM;AACrB,WAAO,aAAa,YAAY;AAAA,EACpC;AAEA,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAER;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDataHttp.js","sources":["../../../../../core/src/hooks/useDataHttp.ts"],"sourcesContent":["import { ref } from 'vue';\nimport { PaginationProps } from 'ant-design-vue';\nimport { useI18n, WidgetProps } from '@kp-ui/lowcode-core';\nimport { useExecFunction } from 'tmgc2-share';\n\nexport function useDataHttp({ props }: { props: WidgetProps<any> }) {\n const { http, dataHandlerCode, dataReqHandlerCode } = props.field.options;\n\n const { i18nt } = useI18n();\n const isLoading = ref(false);\n\n const { execHttpFunction } = useExecFunction();\n const pagintion = ref<PaginationProps>({\n ...(props.widget.options.pagination as any),\n onShowSizeChange: (current, pageSize) => {\n props.field.options.pagination.pageSize = pageSize;\n props.field.options.pagination.current = 1;\n pagintion.value.current = 1;\n },\n showTotal: total => i18nt('designer.showTotal', { total })\n });\n\n const loadataSource = async (): Promise<any> => {\n try {\n isLoading.value = true;\n const data = await execHttpFunction(\n {\n http,\n dataHandlerCode,\n dataReqHandlerCode\n },\n {}\n );\n return data;\n } catch (error) {\n console.error(error);\n return {};\n } finally {\n isLoading.value = false;\n }\n };\n\n const getPagination = () => {\n return pagintion.value;\n };\n\n /**\n * 设置表格分页\n * @param pagination\n */\n const setPagination = pagination => {\n if (pagination.current !== undefined) {\n pagintion.value.current = pagination.current;\n props.field.options.pagination.current = pagination.current;\n }\n\n if (pagination.page !== undefined) {\n pagintion.value.current = pagination.page;\n props.field.options.pagination.current = pagination.page;\n }\n\n if (pagination.total !== undefined) {\n pagintion.value.total = pagination.total;\n props.field.options.pagination.total = pagination.total;\n }\n };\n\n return {\n pagintion,\n setPagination,\n getPagination,\n loadataSource,\n isLoading\n };\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useDataHttp.js","sources":["../../../../../core/src/hooks/useDataHttp.ts"],"sourcesContent":["import { ref } from 'vue';\nimport { PaginationProps } from 'ant-design-vue';\nimport { useI18n, WidgetProps } from '@kp-ui/lowcode-core';\nimport { useExecFunction } from 'tmgc2-share';\n\nexport function useDataHttp({ props }: { props: WidgetProps<any> }) {\n const { http, dataHandlerCode, dataReqHandlerCode } = props.field.options;\n\n const { i18nt } = useI18n();\n const isLoading = ref(false);\n\n const { execHttpFunction } = useExecFunction();\n const pagintion = ref<PaginationProps>({\n ...(props.widget.options.pagination as any),\n onShowSizeChange: (current, pageSize) => {\n props.field.options.pagination.pageSize = pageSize;\n props.field.options.pagination.current = 1;\n pagintion.value.current = 1;\n },\n showTotal: total => i18nt('designer.showTotal', { total })\n });\n\n const loadataSource = async (): Promise<any> => {\n try {\n isLoading.value = true;\n const data = await execHttpFunction(\n {\n http,\n dataHandlerCode,\n dataReqHandlerCode\n },\n {}\n );\n return data;\n } catch (error) {\n console.error(error);\n return {};\n } finally {\n isLoading.value = false;\n }\n };\n\n const getPagination = () => {\n return pagintion.value;\n };\n\n /**\n * 设置表格分页\n * @param pagination\n */\n const setPagination = pagination => {\n if (pagination.current !== undefined) {\n pagintion.value.current = pagination.current;\n props.field.options.pagination.current = pagination.current;\n }\n\n if (pagination.page !== undefined) {\n pagintion.value.current = pagination.page;\n props.field.options.pagination.current = pagination.page;\n }\n\n if (pagination.total !== undefined) {\n pagintion.value.total = pagination.total;\n props.field.options.pagination.total = pagination.total;\n }\n };\n\n return {\n pagintion,\n setPagination,\n getPagination,\n loadataSource,\n isLoading\n };\n}\n"],"names":[],"mappings":";;;AAKO,SAAS,YAAY,EAAE,SAAsC;AAChE,QAAM,EAAE,MAAM,iBAAiB,mBAAA,IAAuB,MAAM,MAAM;AAElE,QAAM,EAAE,MAAA,IAAU,QAAA;AAClB,QAAM,YAAY,IAAI,KAAK;AAE3B,QAAM,EAAE,iBAAA,IAAqB,gBAAA;AAC7B,QAAM,YAAY,IAAqB;AAAA,IACnC,GAAI,MAAM,OAAO,QAAQ;AAAA,IACzB,kBAAkB,CAAC,SAAS,aAAa;AACrC,YAAM,MAAM,QAAQ,WAAW,WAAW;AAC1C,YAAM,MAAM,QAAQ,WAAW,UAAU;AACzC,gBAAU,MAAM,UAAU;AAAA,IAC9B;AAAA,IACA,WAAW,CAAA,UAAS,MAAM,sBAAsB,EAAE,OAAO;AAAA,EAAA,CAC5D;AAED,QAAM,gBAAgB,YAA0B;AAC5C,QAAI;AACA,gBAAU,QAAQ;AAClB,YAAM,OAAO,MAAM;AAAA,QACf;AAAA,UACI;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,QAEJ,CAAA;AAAA,MAAC;AAEL,aAAO;AAAA,IACX,SAAS,OAAO;AACZ,cAAQ,MAAM,KAAK;AACnB,aAAO,CAAA;AAAA,IACX,UAAA;AACI,gBAAU,QAAQ;AAAA,IACtB;AAAA,EACJ;AAEA,QAAM,gBAAgB,MAAM;AACxB,WAAO,UAAU;AAAA,EACrB;AAMA,QAAM,gBAAgB,CAAA,eAAc;AAChC,QAAI,WAAW,YAAY,QAAW;AAClC,gBAAU,MAAM,UAAU,WAAW;AACrC,YAAM,MAAM,QAAQ,WAAW,UAAU,WAAW;AAAA,IACxD;AAEA,QAAI,WAAW,SAAS,QAAW;AAC/B,gBAAU,MAAM,UAAU,WAAW;AACrC,YAAM,MAAM,QAAQ,WAAW,UAAU,WAAW;AAAA,IACxD;AAEA,QAAI,WAAW,UAAU,QAAW;AAChC,gBAAU,MAAM,QAAQ,WAAW;AACnC,YAAM,MAAM,QAAQ,WAAW,QAAQ,WAAW;AAAA,IACtD;AAAA,EACJ;AAEA,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAER;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDesigner.js","sources":["../../../../../core/src/hooks/useDesigner.ts"],"sourcesContent":["import { FormConfig, Widget } from '@kp-ui/lowcode-core/src/types/schema';\nimport { FormDesigner } from '@kp-ui/lowcode-core/src/types/designer';\nimport { LayoutTypeEnum } from '@kp-ui/lowcode-core';\nimport { computed, inject, nextTick, ref, Ref } from 'vue';\n\nexport function useDesigner() {\n const designer = inject<Ref<FormDesigner>>('designer', ref({} as FormDesigner));\n const designState = inject('designState', false);\n const getWidget = inject('getWidget', (widget: Widget) => {});\n const formConfig = inject<Ref<FormConfig>>('formConfig', ref({} as FormConfig));\n const formData = inject('formData', ref({}));\n\n const layoutType = inject('layoutType', ref(LayoutTypeEnum.PC));\n const isPc = computed(\n () => layoutType.value === LayoutTypeEnum.PC || layoutType.value === LayoutTypeEnum.H5\n );\n const isH5 = computed(() => layoutType.value === LayoutTypeEnum.H5);\n\n const isBI = computed(() => layoutType.value === LayoutTypeEnum.BI);\n\n const onDragAdd = ({ newIndex }, widgetList: Widget[]) => {\n const newWidget = widgetList[newIndex];\n if (newWidget) {\n designer.value.setSelected(newWidget);\n } else {\n designer.value.setSelected(widgetList[newIndex - 1]);\n }\n };\n\n const onDragUpdate = () => {\n designer.value.emitHistoryChange();\n };\n\n /**\n * 选择子组件\n * @param widget 组件配置\n */\n const selectWidget = widget => {\n designer.value.setSelected(widget);\n };\n\n const selectedWidget = computed(() => designer.value.selectedWidget);\n\n const selected = (widgetId: string) => {\n return designer.value.selectedId === widgetId;\n };\n\n const onWidgetClick = (widget: Widget) => {\n designer.value.setSelected(widget);\n };\n\n return {\n selectedWidget,\n getWidget,\n selected,\n isPc,\n isH5,\n isBI,\n designState,\n formData,\n formConfig,\n designer,\n layoutType,\n onWidgetClick,\n selectWidget,\n onDragAdd,\n onDragUpdate\n };\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useDesigner.js","sources":["../../../../../core/src/hooks/useDesigner.ts"],"sourcesContent":["import { FormConfig, Widget } from '@kp-ui/lowcode-core/src/types/schema';\nimport { FormDesigner } from '@kp-ui/lowcode-core/src/types/designer';\nimport { LayoutTypeEnum } from '@kp-ui/lowcode-core';\nimport { computed, inject, nextTick, ref, Ref } from 'vue';\n\nexport function useDesigner() {\n const designer = inject<Ref<FormDesigner>>('designer', ref({} as FormDesigner));\n const designState = inject('designState', false);\n const getWidget = inject('getWidget', (widget: Widget) => {});\n const formConfig = inject<Ref<FormConfig>>('formConfig', ref({} as FormConfig));\n const formData = inject('formData', ref({}));\n\n const layoutType = inject('layoutType', ref(LayoutTypeEnum.PC));\n const isPc = computed(\n () => layoutType.value === LayoutTypeEnum.PC || layoutType.value === LayoutTypeEnum.H5\n );\n const isH5 = computed(() => layoutType.value === LayoutTypeEnum.H5);\n\n const isBI = computed(() => layoutType.value === LayoutTypeEnum.BI);\n\n const onDragAdd = ({ newIndex }, widgetList: Widget[]) => {\n const newWidget = widgetList[newIndex];\n if (newWidget) {\n designer.value.setSelected(newWidget);\n } else {\n designer.value.setSelected(widgetList[newIndex - 1]);\n }\n };\n\n const onDragUpdate = () => {\n designer.value.emitHistoryChange();\n };\n\n /**\n * 选择子组件\n * @param widget 组件配置\n */\n const selectWidget = widget => {\n designer.value.setSelected(widget);\n };\n\n const selectedWidget = computed(() => designer.value.selectedWidget);\n\n const selected = (widgetId: string) => {\n return designer.value.selectedId === widgetId;\n };\n\n const onWidgetClick = (widget: Widget) => {\n designer.value.setSelected(widget);\n };\n\n return {\n selectedWidget,\n getWidget,\n selected,\n isPc,\n isH5,\n isBI,\n designState,\n formData,\n formConfig,\n designer,\n layoutType,\n onWidgetClick,\n selectWidget,\n onDragAdd,\n onDragUpdate\n };\n}\n"],"names":[],"mappings":";;AAKO,SAAS,cAAc;AAC1B,QAAM,WAAW,OAA0B,YAAY,IAAI,CAAA,CAAkB,CAAC;AAC9E,QAAM,cAAc,OAAO,eAAe,KAAK;AAC/C,QAAM,YAAY,OAAO,aAAa,CAAC,WAAmB;AAAA,EAAC,CAAC;AAC5D,QAAM,aAAa,OAAwB,cAAc,IAAI,CAAA,CAAgB,CAAC;AAC9E,QAAM,WAAW,OAAO,YAAY,IAAI,CAAA,CAAE,CAAC;AAE3C,QAAM,aAAa,OAAO,cAAc,IAAI,eAAe,EAAE,CAAC;AAC9D,QAAM,OAAO;AAAA,IACT,MAAM,WAAW,UAAU,eAAe,MAAM,WAAW,UAAU,eAAe;AAAA,EAAA;AAExF,QAAM,OAAO,SAAS,MAAM,WAAW,UAAU,eAAe,EAAE;AAElE,QAAM,OAAO,SAAS,MAAM,WAAW,UAAU,eAAe,EAAE;AAElE,QAAM,YAAY,CAAC,EAAE,SAAA,GAAY,eAAyB;AACtD,UAAM,YAAY,WAAW,QAAQ;AACrC,QAAI,WAAW;AACX,eAAS,MAAM,YAAY,SAAS;AAAA,IACxC,OAAO;AACH,eAAS,MAAM,YAAY,WAAW,WAAW,CAAC,CAAC;AAAA,IACvD;AAAA,EACJ;AAEA,QAAM,eAAe,MAAM;AACvB,aAAS,MAAM,kBAAA;AAAA,EACnB;AAMA,QAAM,eAAe,CAAA,WAAU;AAC3B,aAAS,MAAM,YAAY,MAAM;AAAA,EACrC;AAEA,QAAM,iBAAiB,SAAS,MAAM,SAAS,MAAM,cAAc;AAEnE,QAAM,WAAW,CAAC,aAAqB;AACnC,WAAO,SAAS,MAAM,eAAe;AAAA,EACzC;AAEA,QAAM,gBAAgB,CAAC,WAAmB;AACtC,aAAS,MAAM,YAAY,MAAM;AAAA,EACrC;AAEA,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAER;"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { inject, ref, getCurrentInstance, computed, toRaw, onMounted, onBeforeUnmount } from "vue";
|
|
2
2
|
import FormValidators from "../utils/validators.js";
|
|
3
3
|
import { get, eq, isArray, cloneDeep } from "lodash-es";
|
|
4
|
-
/* empty css */
|
|
5
4
|
import { useExecFunction } from "tmgc2-share";
|
|
6
5
|
import { useAppRef } from "./useAppRef.js";
|
|
7
6
|
import { useEmitter } from "../utils/useEmitter.js";
|
|
@@ -479,12 +478,13 @@ function useField(props, isInitModelValue = true) {
|
|
|
479
478
|
onBeforeUnmount(() => {
|
|
480
479
|
unregisterFromRefList();
|
|
481
480
|
});
|
|
481
|
+
const widget = computed(() => props.field);
|
|
482
482
|
const defineExposed = {
|
|
483
483
|
i18nt,
|
|
484
484
|
options,
|
|
485
485
|
proxy: instance == null ? void 0 : instance.proxy,
|
|
486
486
|
field,
|
|
487
|
-
widget:
|
|
487
|
+
widget: widget.value,
|
|
488
488
|
fieldModel,
|
|
489
489
|
fieldEditor,
|
|
490
490
|
isReadMode,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useField.js","sources":["../../../../../core/src/hooks/useField.ts"],"sourcesContent":["import {\n ref,\n computed,\n inject,\n onMounted,\n onBeforeUnmount,\n getCurrentInstance,\n Ref,\n toRaw,\n toRefs\n} from 'vue';\nimport FormValidators from '@kp-ui/lowcode-core/src/utils/validators';\nimport { isArray, eq, get, cloneDeep } from 'lodash-es';\nimport { deepClone, FormConfig, Widget } from '@kp-ui/lowcode-core';\nimport { useI18n } from '@kp-ui/lowcode-core';\nimport { useEmitter, useAppRef } from '@kp-ui/lowcode-core';\nimport { useExecFunction } from 'tmgc2-share';\n\nexport type FieldProps<T = Widget> = {\n widget: T;\n field: T;\n designer?: any;\n parentWidget?: Widget | null;\n parentList?: T[] | null;\n indexOfParentList?: number;\n subFormRowIndex?: number;\n subFormRowId?: string;\n subFormColIndex?: number;\n};\n\n/**\n * 表单字段 Hook,提供表单字段的通用功能\n * @returns 表单字段相关的状态和方法\n */\nexport function useField<T extends Widget>(props: FieldProps<T>, isInitModelValue = true) {\n // 注入依赖\n const formConfig = inject<Ref<FormConfig>>('formConfig', ref({} as FormConfig));\n const formModel = inject<Ref<any>>('formData', ref({}));\n const getReadMode = inject('getReadMode', () => false);\n const isSubFormField = inject('isSubFormField', false);\n\n const getSubFormName = inject('getSubFormName', () => '');\n const designState = inject('designState', false);\n\n const { registerToRefList, getWidgetRef, getFormRef, unregisterFromRefList } = useAppRef();\n const { executeFunction, asyncExecuteFunction } = useExecFunction();\n\n const { i18nt, i18n2t } = useI18n();\n const field = props.field;\n\n const fieldEditor = ref<InstanceType<any>>(null);\n // 状态\n const oldFieldValue = ref<any>(null);\n const fieldReadonlyFlag = ref<boolean>(false);\n const loading = ref<boolean>(false);\n const rules = ref<any[]>([]);\n const uploadData = ref<Record<string, any>>({});\n const customToolbar = ref<any>(null);\n const instance = getCurrentInstance();\n const { dispatch } = useEmitter();\n\n const size = computed(() => {\n if (options.value?.size) {\n return options.value.size;\n }\n return formConfig.value.size || 'middle';\n });\n\n const subFormName = computed(() => {\n return getSubFormName ? getSubFormName() : '';\n });\n\n const fieldModel = computed({\n get() {\n return get(formModel?.value || {}, getPropName.value);\n },\n set(value) {\n syncUpdateFormModel(value);\n }\n });\n\n const subFormData = computed(() => formModel.value[subFormName.value]);\n\n const isReadMode = computed(() => {\n return getReadMode() ? true : fieldReadonlyFlag.value;\n });\n\n /**\n * 处理字段隐藏逻辑\n * @returns 是否隐藏\n */\n const handleHidden = computed(() => {\n if (designState) {\n return false;\n }\n const { onHidden, hidden } = options.value;\n\n if (hidden) return true;\n if (onHidden) {\n try {\n const result = executeFunction({\n functionBody: onHidden\n });\n if (typeof result === 'boolean') {\n return result;\n } else {\n return false;\n }\n } catch {\n return false;\n }\n }\n return false;\n });\n\n /**\n * 处理字段禁用逻辑\n * @returns 是否禁用\n */\n const handleDisabled = computed(() => {\n const { onDisabled, disabled } = options.value;\n if (disabled) return true;\n if (onDisabled) {\n try {\n const result = executeFunction({\n functionBody: onDisabled\n });\n if (typeof result === 'boolean') {\n return result;\n } else {\n return false;\n }\n } catch (error) {\n console.log({ error });\n return false;\n }\n }\n return false;\n });\n\n /**\n * 在数组中查找元素\n * @param arrayObject 数组对象\n * @param element 要查找的元素\n * @returns 找到的索引,未找到返回-1\n */\n const findInArray = (arrayObject: any[], element: any) => {\n if (!Array.isArray(arrayObject)) {\n return -1;\n }\n\n let foundIdx = -1;\n arrayObject.forEach((aItem, aIdx) => {\n if (aItem === element) {\n foundIdx = aIdx;\n }\n });\n\n return foundIdx;\n };\n\n /**\n * 获取属性名称\n * @returns 属性名称\n */\n const getPropName = computed(() => {\n if (isSubFormField && !designState) {\n return subFormName.value + '.' + props.subFormRowIndex + '.' + options.value.name + '';\n } else {\n return options.value.name;\n }\n });\n\n /**\n * 处理组件创建事件\n */\n async function handleOnCreated() {\n if (designState) {\n // 设计状态不触发事件\n return;\n }\n\n if (options.value.onCreated) {\n await asyncExecuteFunction({\n functionBody: options.value.onCreated\n });\n }\n }\n\n /**\n * 处理组件挂载事件\n */\n async function handleOnMounted() {\n if (designState) {\n // 设计状态不触发事件\n return;\n }\n if (options.value.onMounted) {\n await asyncExecuteFunction({\n functionBody: options.value.onMounted\n });\n }\n }\n\n /**\n * 刷新默认值\n */\n const refreshDefaultValue = () => {\n fieldModel.value = options.value.defaultValue;\n };\n\n /**\n * 清除字段规则\n */\n const clearFieldRules = () => {\n if (!field.formItemFlag) {\n return;\n }\n\n rules.value.splice(0, rules.value.length); // 清空已有\n };\n\n /**\n * 构建字段规则\n */\n const buildFieldRules = () => {\n if (!field.formItemFlag || options.value.hidden) {\n return;\n }\n\n rules.value.splice(0, rules.value.length); // 清空已有\n if (options.value.required) {\n rules.value.push({\n required: true,\n // trigger: ['blur', 'change'],\n trigger: [\n 'blur'\n ] /* 去掉change事件触发校验,change事件触发时formModel数据尚未更新,导致radio/checkbox必填校验出错!! */,\n message: options.value.requiredHint || i18nt('render.hint.fieldRequired')\n });\n }\n\n if (options.value.validation) {\n const vldName = options.value.validation;\n if (FormValidators[vldName]) {\n rules.value.push({\n validator: FormValidators[vldName],\n trigger: ['blur', 'change'],\n label: options.value.label,\n errorMsg: options.value.validationHint\n });\n } else {\n rules.value.push({\n validator: FormValidators['regExp'],\n trigger: ['blur', 'change'],\n regExp: vldName,\n label: options.value.label,\n errorMsg: options.value.validationHint\n });\n }\n }\n\n if (options.value.onValidate) {\n const customFn = (rule: any, value: any) => {\n return executeFunction({\n functionBody: options.value.onValidate,\n params: { rule, value },\n keys: ['rule', 'value']\n });\n };\n rules.value.push({\n validator: customFn,\n trigger: ['blur'],\n label: options.value.label\n });\n }\n };\n\n /**\n * 禁用字段值变动触发表单校验\n */\n const disableChangeValidate = () => {\n if (!rules.value) {\n return;\n }\n\n rules.value.forEach(rule => {\n if (rule.trigger) {\n rule.trigger.splice(0, rule.trigger.length);\n }\n });\n };\n\n /**\n * 启用字段值变动触发表单校验\n */\n const enableChangeValidate = () => {\n if (!rules.value) {\n return;\n }\n\n rules.value.forEach(rule => {\n if (rule.trigger) {\n rule.trigger.push('blur');\n rule.trigger.push('change');\n }\n });\n };\n\n /**\n * 禁用列表中的选项\n * @param optionList 选项列表\n * @param optionValue 选项值\n */\n const disableOptionOfList = (optionList: any[], optionValue: any) => {\n if (optionList && optionList.length > 0) {\n optionList.forEach(opt => {\n if (opt.value === optionValue) {\n opt.disabled = true;\n }\n });\n }\n };\n\n /**\n * 启用列表中的选项\n * @param optionList 选项列表\n * @param optionValue 选项值\n */\n const enableOptionOfList = (optionList: any[], optionValue: any) => {\n if (optionList && optionList.length > 0) {\n optionList.forEach(opt => {\n if (opt.value === optionValue) {\n opt.disabled = false;\n }\n });\n }\n };\n\n /**\n * 发送字段数据变更事件\n * @param newValue 新值\n * @param oldValue 旧值\n */\n const emitFieldDataChange = (newValue: any, oldValue: any) => {\n if (newValue) {\n newValue = newValue.target ? newValue.target.value : newValue;\n }\n\n if (!instance) return;\n\n /* 必须用dispatch向指定父组件派发消息!! */\n dispatch('VFormRender', 'fieldChange', [\n options.value.name,\n newValue,\n oldValue,\n subFormName.value,\n props.subFormRowIndex\n ]);\n };\n\n /**\n * 同步更新表单模型\n * @param value 值\n */\n\n const syncUpdateFormModel = value => {\n if (designState) {\n dispatch('VFormDesigner', 'fieldChange', {\n fieldName: getPropName.value,\n value,\n field: field\n });\n //设计状态不触发事件\n return;\n }\n /* 主动触发表单的单个字段校验,用于清除字段可能存在的校验错误提示 */\n dispatch('VFormRender', 'fieldValidation', [getPropName.value]);\n const oldValue = toRaw(fieldModel.value);\n dispatch('VFormRender', 'fieldChange', {\n fieldName: getPropName.value,\n value,\n oldValue: oldValue,\n field: field\n });\n handleOnChange(value, oldValue);\n };\n\n /**\n * 处理焦点自定义事件\n * @param event 事件对象\n */\n const handleFocusCustomEvent = (event: any) => {\n if (designState) {\n // 设计状态不触发事件\n return;\n }\n\n oldFieldValue.value = cloneDeep(fieldModel.value); // 保存修改change之前的值\n\n if (options.value.onFocus) {\n executeFunction({\n functionBody: options.value.onFocus,\n params: { event },\n keys: ['event']\n });\n }\n };\n\n /**\n * 处理失焦自定义事件\n * @param event 事件对象\n */\n const handleBlurCustomEvent = (event: any) => {\n if (designState) {\n // 设计状态不触发事件\n return;\n }\n\n if (options.value.onBlur) {\n executeFunction({\n functionBody: options.value.onBlur,\n params: { event },\n keys: ['event']\n });\n }\n };\n\n /**\n * 发送附加按钮点击事件\n */\n const emitAppendButtonClick = () => {\n if (designState) {\n // 设计状态不触发点击事件\n return;\n }\n\n if (options.value.onAppendButtonClick) {\n executeFunction({\n functionBody: options.value.onAppendButtonClick\n });\n }\n };\n\n const executeWidgetEventFunction = async (eventName: string, params: any) => {\n if (designState) {\n // 设计状态不触发事件\n return;\n }\n\n if (options.value[eventName]) {\n await asyncExecuteFunction({\n functionBody: options.value[eventName],\n params: { params },\n keys: ['params']\n });\n }\n };\n\n /**\n * 处理变更事件\n * @param val 新值\n * @param oldVal 旧值\n * @param ops 选项\n */\n const handleOnChange = (val: any, oldVal: any) => {\n // 自定义onChange事件\n if (designState) {\n // 设计状态不触发事件\n return;\n }\n\n if (options.value.onChange) {\n executeFunction({\n functionBody: options.value.onChange,\n params: {\n value: val,\n oldValue: oldVal,\n subFormData: subFormData.value,\n rowId: props.subFormRowId\n },\n keys: ['value', 'oldValue', 'subFormData', 'rowId']\n });\n }\n };\n\n /**\n * 处理图标点击事件\n */\n const handleClickIcon = async () => {\n // if (designState) {\n // // 设计状态不触发事件\n // return;\n // }\n // if (handleDisabled.value) {\n // return;\n // }\n // if (options.value.onClickIcon) {\n // await asyncExecuteFunction({\n // functionBody: options.value.onClickIcon\n // });\n // }\n await executeWidgetEventFunction('onClickIcon', {});\n };\n\n /**\n * 获取字段编辑器\n * @returns 字段编辑器\n */\n const getFieldEditor = () => {\n // 获取内置的el表单组件\n return fieldEditor.value;\n };\n\n /**\n * 显示文件列表\n * @param list 文件列表\n * @returns 格式化后的文件列表\n */\n const showFileList = (list: any) => {\n if (typeof list === 'string') {\n list = JSON.parse(list);\n }\n if (!isArray(list)) return [];\n const res = list.map((item: any, uid: number) => ({\n ...item,\n name: item.fileName,\n uid\n }));\n return res;\n };\n\n /**\n * 设置值\n * @param newValue 新值\n * @param disableChangeEvent 是否禁用变更事件\n */\n const setValue = (newValue: any, disableChangeEvent = false) => {\n if (newValue) {\n newValue = newValue.target ? newValue.target.value : newValue;\n }\n if (eq(fieldModel.value, newValue)) return;\n\n const oldValue = deepClone(fieldModel.value);\n if (field.type === 'file-upload') {\n newValue = showFileList(newValue || []);\n // TODO\n } else if (field.type === 'code-editor') {\n const fieldEditor = getFieldEditor();\n if (fieldEditor) {\n fieldEditor.setValue(newValue);\n }\n }\n fieldModel.value = newValue;\n if (!disableChangeEvent) {\n emitFieldDataChange(newValue, oldValue);\n }\n };\n\n /**\n * 获取值\n * @returns 字段值\n */\n const getValue = () => {\n return fieldModel.value;\n };\n\n /**\n * 重置字段\n */\n const resetField = () => {\n const defaultValue = options.value.defaultValue;\n setValue(defaultValue);\n\n // 清空上传组件文件列表\n if (field.type === 'picture-upload' || field.type === 'file-upload') {\n fieldModel.value.splice(0, fieldModel.value.length);\n // handleChangeEvent(fieldModel.value);\n }\n };\n\n /**\n * 设置只读\n * @param flag 是否只读\n */\n const setReadonly = (flag: boolean) => {\n options.value.readonly = flag;\n };\n\n /**\n * 设置禁用\n * @param flag 是否禁用\n */\n const setDisabled = (flag: boolean) => {\n options.value.disabled = flag;\n };\n\n /**\n * 设置附加按钮可见性\n * @param flag 是否可见\n */\n const setAppendButtonVisible = (flag: boolean) => {\n options.value.appendButton = flag;\n };\n\n /**\n * 设置附加按钮禁用状态\n * @param flag 是否禁用\n */\n const setAppendButtonDisabled = (flag: boolean) => {\n options.value.appendButtonDisabled = flag;\n };\n\n /**\n * 设置隐藏\n * @param flag 是否隐藏\n */\n const setHidden = (flag: boolean) => {\n options.value.hidden = flag;\n\n if (flag) {\n // 清除组件校验规则\n clearFieldRules();\n } else {\n // 重建组件校验规则\n buildFieldRules();\n }\n };\n\n /**\n * 设置必填\n * @param flag 是否必填\n */\n const setRequired = (flag: boolean) => {\n options.value.required = flag;\n buildFieldRules();\n\n if (!designState && !flag) {\n // 清除必填校验提示\n clearValidate();\n }\n };\n\n /**\n * 清除字段校验提示\n */\n const clearValidate = () => {\n if (designState) {\n return;\n }\n\n getFormRef().clearValidate(getPropName.value);\n };\n\n /**\n * 获取VForm上下文\n * @returns VForm上下文\n */\n const getVfCtx = () => {\n return getFormRef().vfCtx;\n };\n\n /**\n * 设置标签\n * @param newLabel 新标签\n */\n const setLabel = (newLabel: string) => {\n options.value.label = newLabel;\n };\n\n /**\n * 聚焦\n */\n const focus = () => {\n const fieldEditor = getFieldEditor();\n if (fieldEditor && fieldEditor.focus) {\n fieldEditor.focus();\n }\n };\n\n /**\n * 设置上传数据\n * @param name 名称\n * @param value 值\n */\n const setUploadData = (name: string, value: any) => {\n uploadData.value[name] = value;\n };\n\n /**\n * 设置或取消设置字段只读查看模式\n * @param readonlyFlag 只读标志\n */\n const setReadMode = (readonlyFlag = true) => {\n fieldReadonlyFlag.value = readonlyFlag;\n };\n\n /**\n * 动态增加自定义css样式\n * @param className 类名\n */\n const addCssClass = (className: string) => {\n if (!options.value.customClass) {\n options.value.customClass = [className];\n } else {\n options.value.customClass.push(className);\n }\n };\n const customClass = computed(() => options.value.customClass);\n\n /**\n * 动态移除自定义css样式\n * @param className 类名\n */\n const removeCssClass = (className: string) => {\n if (!options.value.customClass) {\n return;\n }\n\n let foundIdx = -1;\n options.value.customClass.map((cc: string, idx: number) => {\n if (cc === className) {\n foundIdx = idx;\n }\n });\n if (foundIdx > -1) {\n options.value.customClass.splice(foundIdx, 1);\n }\n };\n\n const getEl = () => {\n return fieldEditor.value?.$el;\n };\n\n /**\n * 设置组件选项\n * @param optionName 选项名称\n * @param optionValue 选项值\n */\n const setWidgetOption = (optionName: string, optionValue: any) => {\n // 通用组件选项修改API\n options.value[optionName] = optionValue;\n };\n\n const options = computed({\n get() {\n return props.field.options;\n },\n set(value) {\n props.field.options = value;\n }\n });\n\n const initFieldModel = () => {\n const defaultValue =\n typeof options.value.defaultValue === 'undefined' ? '' : options.value.defaultValue;\n dispatch('VFormRender', 'fieldChange', {\n fieldName: getPropName.value,\n value: defaultValue,\n oldValue: toRaw(fieldModel.value),\n field: field\n });\n };\n\n // 生命周期钩子\n onMounted(async () => {\n if (isInitModelValue) {\n initFieldModel();\n }\n await registerToRefList();\n\n await handleOnCreated();\n\n await handleOnMounted();\n buildFieldRules();\n });\n\n onBeforeUnmount(() => {\n unregisterFromRefList();\n });\n\n const defineExposed = {\n i18nt,\n options,\n proxy: instance?.proxy,\n field,\n widget: computed(() => props.field),\n fieldModel,\n fieldEditor,\n isReadMode,\n setWidgetOption,\n setReadonly,\n setDisabled,\n getVfCtx,\n setLabel,\n getEl,\n setReadMode,\n resetField,\n setValue,\n getValue,\n getFieldEditor,\n getFormRef,\n getWidgetRef,\n setHidden,\n addCssClass,\n removeCssClass,\n setRequired,\n clearValidate,\n focus,\n executeWidgetEventFunction\n };\n\n return {\n asyncExecuteFunction,\n executeFunction,\n customClass,\n // 状态\n oldFieldValue,\n fieldReadonlyFlag,\n loading,\n rules,\n uploadData,\n designState,\n customToolbar,\n i18n2t,\n size,\n // 计算属性\n formConfig,\n subFormName,\n\n formModel,\n\n // 方法\n handleHidden,\n handleDisabled,\n findInArray,\n getPropName,\n refreshDefaultValue,\n clearFieldRules,\n buildFieldRules,\n disableChangeValidate,\n enableChangeValidate,\n disableOptionOfList,\n enableOptionOfList,\n emitFieldDataChange,\n syncUpdateFormModel,\n handleFocusCustomEvent,\n handleBlurCustomEvent,\n emitAppendButtonClick,\n handleOnChange,\n handleClickIcon,\n showFileList,\n\n setAppendButtonVisible,\n setAppendButtonDisabled,\n\n setUploadData,\n\n isSubFormField,\n ...defineExposed,\n defineExposed\n };\n}\n"],"names":["fieldEditor"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useField.js","sources":["../../../../../core/src/hooks/useField.ts"],"sourcesContent":["import {\n ref,\n computed,\n inject,\n onMounted,\n onBeforeUnmount,\n getCurrentInstance,\n Ref,\n toRaw,\n toRefs\n} from 'vue';\nimport FormValidators from '@kp-ui/lowcode-core/src/utils/validators';\nimport { isArray, eq, get, cloneDeep } from 'lodash-es';\nimport { deepClone, FormConfig, Widget } from '@kp-ui/lowcode-core';\nimport { useI18n } from '@kp-ui/lowcode-core';\nimport { useEmitter, useAppRef } from '@kp-ui/lowcode-core';\nimport { useExecFunction } from 'tmgc2-share';\n\nexport type FieldProps<T = Widget> = {\n widget: T;\n field: T;\n designer?: any;\n parentWidget?: Widget | null;\n parentList?: T[] | null;\n indexOfParentList?: number;\n subFormRowIndex?: number;\n subFormRowId?: string;\n subFormColIndex?: number;\n};\n\n/**\n * 表单字段 Hook,提供表单字段的通用功能\n * @returns 表单字段相关的状态和方法\n */\nexport function useField<T extends Widget>(props: FieldProps<T>, isInitModelValue = true) {\n // 注入依赖\n const formConfig = inject<Ref<FormConfig>>('formConfig', ref({} as FormConfig));\n const formModel = inject<Ref<any>>('formData', ref({}));\n const getReadMode = inject('getReadMode', () => false);\n const isSubFormField = inject('isSubFormField', false);\n\n const getSubFormName = inject('getSubFormName', () => '');\n const designState = inject('designState', false);\n\n const { registerToRefList, getWidgetRef, getFormRef, unregisterFromRefList } = useAppRef();\n const { executeFunction, asyncExecuteFunction } = useExecFunction();\n\n const { i18nt, i18n2t } = useI18n();\n const field = props.field;\n\n const fieldEditor = ref<InstanceType<any>>(null);\n // 状态\n const oldFieldValue = ref<any>(null);\n const fieldReadonlyFlag = ref<boolean>(false);\n const loading = ref<boolean>(false);\n const rules = ref<any[]>([]);\n const uploadData = ref<Record<string, any>>({});\n const customToolbar = ref<any>(null);\n const instance = getCurrentInstance();\n const { dispatch } = useEmitter();\n\n const size = computed(() => {\n if (options.value?.size) {\n return options.value.size;\n }\n return formConfig.value.size || 'middle';\n });\n\n const subFormName = computed(() => {\n return getSubFormName ? getSubFormName() : '';\n });\n\n const fieldModel = computed({\n get() {\n return get(formModel?.value || {}, getPropName.value);\n },\n set(value) {\n syncUpdateFormModel(value);\n }\n });\n\n const subFormData = computed(() => formModel.value[subFormName.value]);\n\n const isReadMode = computed(() => {\n return getReadMode() ? true : fieldReadonlyFlag.value;\n });\n\n /**\n * 处理字段隐藏逻辑\n * @returns 是否隐藏\n */\n const handleHidden = computed(() => {\n if (designState) {\n return false;\n }\n const { onHidden, hidden } = options.value;\n\n if (hidden) return true;\n if (onHidden) {\n try {\n const result = executeFunction({\n functionBody: onHidden\n });\n if (typeof result === 'boolean') {\n return result;\n } else {\n return false;\n }\n } catch {\n return false;\n }\n }\n return false;\n });\n\n /**\n * 处理字段禁用逻辑\n * @returns 是否禁用\n */\n const handleDisabled = computed(() => {\n const { onDisabled, disabled } = options.value;\n if (disabled) return true;\n if (onDisabled) {\n try {\n const result = executeFunction({\n functionBody: onDisabled\n });\n if (typeof result === 'boolean') {\n return result;\n } else {\n return false;\n }\n } catch (error) {\n console.log({ error });\n return false;\n }\n }\n return false;\n });\n\n /**\n * 在数组中查找元素\n * @param arrayObject 数组对象\n * @param element 要查找的元素\n * @returns 找到的索引,未找到返回-1\n */\n const findInArray = (arrayObject: any[], element: any) => {\n if (!Array.isArray(arrayObject)) {\n return -1;\n }\n\n let foundIdx = -1;\n arrayObject.forEach((aItem, aIdx) => {\n if (aItem === element) {\n foundIdx = aIdx;\n }\n });\n\n return foundIdx;\n };\n\n /**\n * 获取属性名称\n * @returns 属性名称\n */\n const getPropName = computed(() => {\n if (isSubFormField && !designState) {\n return subFormName.value + '.' + props.subFormRowIndex + '.' + options.value.name + '';\n } else {\n return options.value.name;\n }\n });\n\n /**\n * 处理组件创建事件\n */\n async function handleOnCreated() {\n if (designState) {\n // 设计状态不触发事件\n return;\n }\n\n if (options.value.onCreated) {\n await asyncExecuteFunction({\n functionBody: options.value.onCreated\n });\n }\n }\n\n /**\n * 处理组件挂载事件\n */\n async function handleOnMounted() {\n if (designState) {\n // 设计状态不触发事件\n return;\n }\n if (options.value.onMounted) {\n await asyncExecuteFunction({\n functionBody: options.value.onMounted\n });\n }\n }\n\n /**\n * 刷新默认值\n */\n const refreshDefaultValue = () => {\n fieldModel.value = options.value.defaultValue;\n };\n\n /**\n * 清除字段规则\n */\n const clearFieldRules = () => {\n if (!field.formItemFlag) {\n return;\n }\n\n rules.value.splice(0, rules.value.length); // 清空已有\n };\n\n /**\n * 构建字段规则\n */\n const buildFieldRules = () => {\n if (!field.formItemFlag || options.value.hidden) {\n return;\n }\n\n rules.value.splice(0, rules.value.length); // 清空已有\n if (options.value.required) {\n rules.value.push({\n required: true,\n // trigger: ['blur', 'change'],\n trigger: [\n 'blur'\n ] /* 去掉change事件触发校验,change事件触发时formModel数据尚未更新,导致radio/checkbox必填校验出错!! */,\n message: options.value.requiredHint || i18nt('render.hint.fieldRequired')\n });\n }\n\n if (options.value.validation) {\n const vldName = options.value.validation;\n if (FormValidators[vldName]) {\n rules.value.push({\n validator: FormValidators[vldName],\n trigger: ['blur', 'change'],\n label: options.value.label,\n errorMsg: options.value.validationHint\n });\n } else {\n rules.value.push({\n validator: FormValidators['regExp'],\n trigger: ['blur', 'change'],\n regExp: vldName,\n label: options.value.label,\n errorMsg: options.value.validationHint\n });\n }\n }\n\n if (options.value.onValidate) {\n const customFn = (rule: any, value: any) => {\n return executeFunction({\n functionBody: options.value.onValidate,\n params: { rule, value },\n keys: ['rule', 'value']\n });\n };\n rules.value.push({\n validator: customFn,\n trigger: ['blur'],\n label: options.value.label\n });\n }\n };\n\n /**\n * 禁用字段值变动触发表单校验\n */\n const disableChangeValidate = () => {\n if (!rules.value) {\n return;\n }\n\n rules.value.forEach(rule => {\n if (rule.trigger) {\n rule.trigger.splice(0, rule.trigger.length);\n }\n });\n };\n\n /**\n * 启用字段值变动触发表单校验\n */\n const enableChangeValidate = () => {\n if (!rules.value) {\n return;\n }\n\n rules.value.forEach(rule => {\n if (rule.trigger) {\n rule.trigger.push('blur');\n rule.trigger.push('change');\n }\n });\n };\n\n /**\n * 禁用列表中的选项\n * @param optionList 选项列表\n * @param optionValue 选项值\n */\n const disableOptionOfList = (optionList: any[], optionValue: any) => {\n if (optionList && optionList.length > 0) {\n optionList.forEach(opt => {\n if (opt.value === optionValue) {\n opt.disabled = true;\n }\n });\n }\n };\n\n /**\n * 启用列表中的选项\n * @param optionList 选项列表\n * @param optionValue 选项值\n */\n const enableOptionOfList = (optionList: any[], optionValue: any) => {\n if (optionList && optionList.length > 0) {\n optionList.forEach(opt => {\n if (opt.value === optionValue) {\n opt.disabled = false;\n }\n });\n }\n };\n\n /**\n * 发送字段数据变更事件\n * @param newValue 新值\n * @param oldValue 旧值\n */\n const emitFieldDataChange = (newValue: any, oldValue: any) => {\n if (newValue) {\n newValue = newValue.target ? newValue.target.value : newValue;\n }\n\n if (!instance) return;\n\n /* 必须用dispatch向指定父组件派发消息!! */\n dispatch('VFormRender', 'fieldChange', [\n options.value.name,\n newValue,\n oldValue,\n subFormName.value,\n props.subFormRowIndex\n ]);\n };\n\n /**\n * 同步更新表单模型\n * @param value 值\n */\n\n const syncUpdateFormModel = value => {\n if (designState) {\n dispatch('VFormDesigner', 'fieldChange', {\n fieldName: getPropName.value,\n value,\n field: field\n });\n //设计状态不触发事件\n return;\n }\n /* 主动触发表单的单个字段校验,用于清除字段可能存在的校验错误提示 */\n dispatch('VFormRender', 'fieldValidation', [getPropName.value]);\n const oldValue = toRaw(fieldModel.value);\n dispatch('VFormRender', 'fieldChange', {\n fieldName: getPropName.value,\n value,\n oldValue: oldValue,\n field: field\n });\n handleOnChange(value, oldValue);\n };\n\n /**\n * 处理焦点自定义事件\n * @param event 事件对象\n */\n const handleFocusCustomEvent = (event: any) => {\n if (designState) {\n // 设计状态不触发事件\n return;\n }\n\n oldFieldValue.value = cloneDeep(fieldModel.value); // 保存修改change之前的值\n\n if (options.value.onFocus) {\n executeFunction({\n functionBody: options.value.onFocus,\n params: { event },\n keys: ['event']\n });\n }\n };\n\n /**\n * 处理失焦自定义事件\n * @param event 事件对象\n */\n const handleBlurCustomEvent = (event: any) => {\n if (designState) {\n // 设计状态不触发事件\n return;\n }\n\n if (options.value.onBlur) {\n executeFunction({\n functionBody: options.value.onBlur,\n params: { event },\n keys: ['event']\n });\n }\n };\n\n /**\n * 发送附加按钮点击事件\n */\n const emitAppendButtonClick = () => {\n if (designState) {\n // 设计状态不触发点击事件\n return;\n }\n\n if (options.value.onAppendButtonClick) {\n executeFunction({\n functionBody: options.value.onAppendButtonClick\n });\n }\n };\n\n const executeWidgetEventFunction = async (eventName: string, params: any) => {\n if (designState) {\n // 设计状态不触发事件\n return;\n }\n\n if (options.value[eventName]) {\n await asyncExecuteFunction({\n functionBody: options.value[eventName],\n params: { params },\n keys: ['params']\n });\n }\n };\n\n /**\n * 处理变更事件\n * @param val 新值\n * @param oldVal 旧值\n * @param ops 选项\n */\n const handleOnChange = (val: any, oldVal: any) => {\n // 自定义onChange事件\n if (designState) {\n // 设计状态不触发事件\n return;\n }\n\n if (options.value.onChange) {\n executeFunction({\n functionBody: options.value.onChange,\n params: {\n value: val,\n oldValue: oldVal,\n subFormData: subFormData.value,\n rowId: props.subFormRowId\n },\n keys: ['value', 'oldValue', 'subFormData', 'rowId']\n });\n }\n };\n\n /**\n * 处理图标点击事件\n */\n const handleClickIcon = async () => {\n // if (designState) {\n // // 设计状态不触发事件\n // return;\n // }\n // if (handleDisabled.value) {\n // return;\n // }\n // if (options.value.onClickIcon) {\n // await asyncExecuteFunction({\n // functionBody: options.value.onClickIcon\n // });\n // }\n await executeWidgetEventFunction('onClickIcon', {});\n };\n\n /**\n * 获取字段编辑器\n * @returns 字段编辑器\n */\n const getFieldEditor = () => {\n // 获取内置的el表单组件\n return fieldEditor.value;\n };\n\n /**\n * 显示文件列表\n * @param list 文件列表\n * @returns 格式化后的文件列表\n */\n const showFileList = (list: any) => {\n if (typeof list === 'string') {\n list = JSON.parse(list);\n }\n if (!isArray(list)) return [];\n const res = list.map((item: any, uid: number) => ({\n ...item,\n name: item.fileName,\n uid\n }));\n return res;\n };\n\n /**\n * 设置值\n * @param newValue 新值\n * @param disableChangeEvent 是否禁用变更事件\n */\n const setValue = (newValue: any, disableChangeEvent = false) => {\n if (newValue) {\n newValue = newValue.target ? newValue.target.value : newValue;\n }\n if (eq(fieldModel.value, newValue)) return;\n\n const oldValue = deepClone(fieldModel.value);\n if (field.type === 'file-upload') {\n newValue = showFileList(newValue || []);\n // TODO\n } else if (field.type === 'code-editor') {\n const fieldEditor = getFieldEditor();\n if (fieldEditor) {\n fieldEditor.setValue(newValue);\n }\n }\n fieldModel.value = newValue;\n if (!disableChangeEvent) {\n emitFieldDataChange(newValue, oldValue);\n }\n };\n\n /**\n * 获取值\n * @returns 字段值\n */\n const getValue = () => {\n return fieldModel.value;\n };\n\n /**\n * 重置字段\n */\n const resetField = () => {\n const defaultValue = options.value.defaultValue;\n setValue(defaultValue);\n\n // 清空上传组件文件列表\n if (field.type === 'picture-upload' || field.type === 'file-upload') {\n fieldModel.value.splice(0, fieldModel.value.length);\n // handleChangeEvent(fieldModel.value);\n }\n };\n\n /**\n * 设置只读\n * @param flag 是否只读\n */\n const setReadonly = (flag: boolean) => {\n options.value.readonly = flag;\n };\n\n /**\n * 设置禁用\n * @param flag 是否禁用\n */\n const setDisabled = (flag: boolean) => {\n options.value.disabled = flag;\n };\n\n /**\n * 设置附加按钮可见性\n * @param flag 是否可见\n */\n const setAppendButtonVisible = (flag: boolean) => {\n options.value.appendButton = flag;\n };\n\n /**\n * 设置附加按钮禁用状态\n * @param flag 是否禁用\n */\n const setAppendButtonDisabled = (flag: boolean) => {\n options.value.appendButtonDisabled = flag;\n };\n\n /**\n * 设置隐藏\n * @param flag 是否隐藏\n */\n const setHidden = (flag: boolean) => {\n options.value.hidden = flag;\n\n if (flag) {\n // 清除组件校验规则\n clearFieldRules();\n } else {\n // 重建组件校验规则\n buildFieldRules();\n }\n };\n\n /**\n * 设置必填\n * @param flag 是否必填\n */\n const setRequired = (flag: boolean) => {\n options.value.required = flag;\n buildFieldRules();\n\n if (!designState && !flag) {\n // 清除必填校验提示\n clearValidate();\n }\n };\n\n /**\n * 清除字段校验提示\n */\n const clearValidate = () => {\n if (designState) {\n return;\n }\n\n getFormRef().clearValidate(getPropName.value);\n };\n\n /**\n * 获取VForm上下文\n * @returns VForm上下文\n */\n const getVfCtx = () => {\n return getFormRef().vfCtx;\n };\n\n /**\n * 设置标签\n * @param newLabel 新标签\n */\n const setLabel = (newLabel: string) => {\n options.value.label = newLabel;\n };\n\n /**\n * 聚焦\n */\n const focus = () => {\n const fieldEditor = getFieldEditor();\n if (fieldEditor && fieldEditor.focus) {\n fieldEditor.focus();\n }\n };\n\n /**\n * 设置上传数据\n * @param name 名称\n * @param value 值\n */\n const setUploadData = (name: string, value: any) => {\n uploadData.value[name] = value;\n };\n\n /**\n * 设置或取消设置字段只读查看模式\n * @param readonlyFlag 只读标志\n */\n const setReadMode = (readonlyFlag = true) => {\n fieldReadonlyFlag.value = readonlyFlag;\n };\n\n /**\n * 动态增加自定义css样式\n * @param className 类名\n */\n const addCssClass = (className: string) => {\n if (!options.value.customClass) {\n options.value.customClass = [className];\n } else {\n options.value.customClass.push(className);\n }\n };\n const customClass = computed(() => options.value.customClass);\n\n /**\n * 动态移除自定义css样式\n * @param className 类名\n */\n const removeCssClass = (className: string) => {\n if (!options.value.customClass) {\n return;\n }\n\n let foundIdx = -1;\n options.value.customClass.map((cc: string, idx: number) => {\n if (cc === className) {\n foundIdx = idx;\n }\n });\n if (foundIdx > -1) {\n options.value.customClass.splice(foundIdx, 1);\n }\n };\n\n const getEl = () => {\n return fieldEditor.value?.$el;\n };\n\n /**\n * 设置组件选项\n * @param optionName 选项名称\n * @param optionValue 选项值\n */\n const setWidgetOption = (optionName: string, optionValue: any) => {\n // 通用组件选项修改API\n options.value[optionName] = optionValue;\n };\n\n const options = computed({\n get() {\n return props.field.options;\n },\n set(value) {\n props.field.options = value;\n }\n });\n\n const initFieldModel = () => {\n const defaultValue =\n typeof options.value.defaultValue === 'undefined' ? '' : options.value.defaultValue;\n dispatch('VFormRender', 'fieldChange', {\n fieldName: getPropName.value,\n value: defaultValue,\n oldValue: toRaw(fieldModel.value),\n field: field\n });\n };\n\n // 生命周期钩子\n onMounted(async () => {\n if (isInitModelValue) {\n initFieldModel();\n }\n await registerToRefList();\n\n await handleOnCreated();\n\n await handleOnMounted();\n buildFieldRules();\n });\n\n onBeforeUnmount(() => {\n unregisterFromRefList();\n });\n\n const widget = computed(() => props.field);\n\n const defineExposed = {\n i18nt,\n options,\n proxy: instance?.proxy,\n field,\n widget: widget.value,\n fieldModel,\n fieldEditor,\n isReadMode,\n setWidgetOption,\n setReadonly,\n setDisabled,\n getVfCtx,\n setLabel,\n getEl,\n setReadMode,\n resetField,\n setValue,\n getValue,\n getFieldEditor,\n getFormRef,\n getWidgetRef,\n setHidden,\n addCssClass,\n removeCssClass,\n setRequired,\n clearValidate,\n focus,\n executeWidgetEventFunction\n };\n\n return {\n asyncExecuteFunction,\n executeFunction,\n customClass,\n // 状态\n oldFieldValue,\n fieldReadonlyFlag,\n loading,\n rules,\n uploadData,\n designState,\n customToolbar,\n i18n2t,\n size,\n // 计算属性\n formConfig,\n subFormName,\n\n formModel,\n\n // 方法\n handleHidden,\n handleDisabled,\n findInArray,\n getPropName,\n refreshDefaultValue,\n clearFieldRules,\n buildFieldRules,\n disableChangeValidate,\n enableChangeValidate,\n disableOptionOfList,\n enableOptionOfList,\n emitFieldDataChange,\n syncUpdateFormModel,\n handleFocusCustomEvent,\n handleBlurCustomEvent,\n emitAppendButtonClick,\n handleOnChange,\n handleClickIcon,\n showFileList,\n\n setAppendButtonVisible,\n setAppendButtonDisabled,\n\n setUploadData,\n\n isSubFormField,\n ...defineExposed,\n defineExposed\n };\n}\n"],"names":["fieldEditor"],"mappings":"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"}
|