@kp-ui/lowcode-pc 1.0.1 → 1.0.3

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.
Files changed (27) hide show
  1. package/assets/styles/style.css +61 -59
  2. package/core/src/components/common/RenderWidgetList.vue.js +1 -1
  3. package/core/src/components/common/RenderWidgetList.vue2.js +4 -2
  4. package/core/src/components/common/RenderWidgetList.vue2.js.map +1 -1
  5. package/core/src/hooks/useField.js +1 -0
  6. package/core/src/hooks/useField.js.map +1 -1
  7. package/core/src/store/useTableColumnStore.js +42 -0
  8. package/core/src/store/useTableColumnStore.js.map +1 -0
  9. package/package.json +1 -1
  10. package/src/components/desginer/form-widget/container-widget/useTableWidget.js +59 -3
  11. package/src/components/desginer/form-widget/container-widget/useTableWidget.js.map +1 -1
  12. package/src/components/desginer/widget-panel/advanced/data-table.js +1 -1
  13. package/src/components/desginer/widget-panel/advanced/data-table.js.map +1 -1
  14. package/src/components/field-widget/diy-compontent-widget.vue2.js +7 -3
  15. package/src/components/field-widget/diy-compontent-widget.vue2.js.map +1 -1
  16. package/src/components/form-render/container-items/data-table-widget.vue.js +1 -1
  17. package/src/components/form-render/container-items/data-table-widget.vue2.js +25 -68
  18. package/src/components/form-render/container-items/data-table-widget.vue2.js.map +1 -1
  19. package/src/components/form-render/container-items/grid-sub-form-widget.vue.js +1 -1
  20. package/src/components/form-render/container-items/grid-sub-form-widget.vue2.js +9 -8
  21. package/src/components/form-render/container-items/grid-sub-form-widget.vue2.js.map +1 -1
  22. package/src/components/public/ConfigView/CustomPageRender.vue.js +10 -4
  23. package/src/components/public/ConfigView/CustomPageRender.vue.js.map +1 -1
  24. package/src/components/public/DataTableColumnDialog.vue.js +1 -1
  25. package/src/components/public/DataTableColumnDialog.vue2.js +103 -32
  26. package/src/components/public/DataTableColumnDialog.vue2.js.map +1 -1
  27. package/stats.html +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"grid-sub-form-widget.vue2.js","sources":["../../../../../src/components/form-render/container-items/grid-sub-form-widget.vue"],"sourcesContent":["<template>\n <div class=\"sub-form-container\" v-show=\"!handleHidden\">\n <div v-for=\"(subFormRowId, sfrIdx) in rowIdData\" class=\"sub-form-row\" :key=\"subFormRowId\">\n <div class=\"row-no-column\">\n <span class=\"row-number-span\">#{{ sfrIdx + 1 }}</span>\n </div>\n <div class=\"grid-sub-form-data-row\">\n <RenderWigetList\n :widgetList=\"widget.widgetList || []\"\n :parentWidget=\"widget\"\n :subFormRowIndex=\"sfrIdx\"\n :subFormRowId=\"subFormRowId\"\n />\n </div>\n <div class=\"sub-form-action-column hide-label\">\n <div class=\"action-button-column\" v-show=\"!isReadMode\">\n <a-button\n type=\"link\"\n :title=\"i18nt('render.hint.insertSubFormRow')\"\n :disabled=\"actionDisabled || insertDisabled\"\n @click=\"insertSubFormRow(sfrIdx)\"\n >\n <template #icon>\n <PlusOutlined />\n </template>\n </a-button>\n <a-button\n type=\"link\"\n :title=\"i18nt('render.hint.deleteSubFormRow')\"\n :disabled=\"actionDisabled || deleteDisabled\"\n v-show=\"!onSubFormRowDeleteHide || !onSubFormRowDeleteHide(sfrIdx)\"\n @click=\"deleteSubFormRow(sfrIdx)\"\n >\n <template #icon>\n <DeleteOutlined />\n </template>\n </a-button>\n </div>\n </div>\n </div>\n <div class=\"header-row\">\n <a-button\n block\n v-if=\"!isReadMode\"\n :disabled=\"actionDisabled || insertDisabled\"\n shape=\"round\"\n type=\"dashed\"\n size=\"small\"\n class=\"action-button\"\n @click=\"addSubFormRow\"\n :title=\"i18nt('render.hint.subFormAddActionHint')\"\n >\n <template #icon>\n <svg-icon icon-class=\"icon-el-plus\" />\n </template>\n {{ i18nt('render.hint.subFormAddAction') }}\n </a-button>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\n import { computed, ref, provide, onMounted, nextTick } from 'vue';\n import {\n deepClone,\n generateId,\n traverseFieldWidgetsOfContainer\n } from '@kp-ui/lowcode-core/src/utils/util';\n import RenderWigetList from '../RenderWigetList.vue';\n import { SvgIcon, TpfDelConfirm } from 'tmgc2-share';\n import { ComponentNameEnum, ContainerTypeEnum, WidgetProps } from '@kp-ui/lowcode-core';\n import { useI18n } from '@kp-ui/lowcode-core';\n import { useField } from '@kp-ui/lowcode-core';\n import { GridSubFormWidget } from '../../desginer/widget-panel/containers';\n import { PlusOutlined, DeleteOutlined } from '@ant-design/icons-vue';\n defineOptions({\n name: ContainerTypeEnum.GridSubFormWidget,\n componentName: ComponentNameEnum.ContainerWidget,\n inheritAttrs: false\n });\n\n provide('isSubFormField', true);\n provide('getSubFormName', () => props.widget.options.name);\n\n const { i18nt } = useI18n();\n const props = withDefaults(defineProps<WidgetProps<GridSubFormWidget>>(), {});\n\n const rowIdData = ref<string[]>([]);\n const fieldWidgetList = ref<any[]>([]);\n const insertDisabled = ref(false);\n const deleteDisabled = ref(false);\n const actionDisabled = ref(false);\n\n const {\n formModel,\n isReadMode,\n handleHidden,\n executeFunction,\n defineExposed,\n executeWidgetEventFunction\n } = useField(props);\n\n const extractFieldWidgetList = () => {\n fieldWidgetList.value = [];\n const fieldListFn = (fw: any) => {\n fieldWidgetList.value.push(fw);\n };\n traverseFieldWidgetsOfContainer(props.widget, fieldListFn);\n };\n\n const initRowIdData = (initFlag = false) => {\n rowIdData.value = [];\n const subFormModel = formModel.value[props.widget.options.name];\n if (!!subFormModel && subFormModel.length > 0) {\n subFormModel.forEach(() => {\n rowIdData.value.push('id' + generateId());\n });\n\n if (initFlag) {\n setTimeout(() => {\n handleSubFormRowChange(subFormModel);\n }, 800);\n }\n }\n };\n\n const handleSubFormRowChange = (subFormData: any) => {\n if (props.widget.options.onSubFormRowChange) {\n executeFunction({\n functionBody: props.widget.options.onSubFormRowChange,\n keys: ['subFormData'],\n params: { subFormData }\n });\n }\n };\n\n const handleSubFormRowAdd = (subFormData: any, newRowId: string) => {\n executeFunction({\n functionBody: props.widget.options.onSubFormRowAdd,\n params: {\n subFormData,\n newRowId\n },\n keys: ['subFormData', 'newRowId']\n });\n };\n\n const handleSubFormRowInsert = (subFormData: any, newRowId: string) => {\n executeFunction({\n functionBody: props.widget.options.onSubFormRowInsert,\n params: {\n subFormData,\n newRowId\n },\n keys: ['subFormData', 'newRowId']\n });\n };\n\n const handleSubFormRowDelete = (subFormData: any, deletedDataRow: any) => {\n executeFunction({\n functionBody: props.widget.options.onSubFormRowDelete,\n params: {\n subFormData,\n deletedDataRow\n },\n keys: ['subFormData', 'deletedDataRow']\n });\n };\n\n const addSubFormRow = () => {\n const newSubFormDataRow: Record<string, any> = {};\n fieldWidgetList.value.forEach(subFormItem => {\n if (subFormItem?.formItemFlag) {\n newSubFormDataRow[subFormItem.options.name] = subFormItem.options.defaultValue;\n }\n });\n\n const oldSubFormData = formModel.value[props.widget.options.name] || [];\n oldSubFormData.push(newSubFormDataRow);\n // Ensure formModel is updated if it was empty/undefined\n if (!formModel.value[props.widget.options.name]) {\n formModel.value[props.widget.options.name] = oldSubFormData;\n }\n\n const newRowId = 'id' + generateId();\n rowIdData.value.push(newRowId);\n\n nextTick(() => {\n handleSubFormRowAdd(oldSubFormData, newRowId);\n handleSubFormRowChange(oldSubFormData);\n });\n };\n\n const insertSubFormRow = (index: number) => {\n const newSubFormDataRow: Record<string, any> = {};\n fieldWidgetList.value.forEach(subFormItem => {\n if (subFormItem?.formItemFlag) {\n newSubFormDataRow[subFormItem.options.name] = subFormItem.options.defaultValue;\n }\n });\n\n const oldSubFormData = formModel.value[props.widget.options.name] || [];\n oldSubFormData.splice(index, 0, newSubFormDataRow);\n // Ensure formModel is updated\n if (!formModel.value[props.widget.options.name]) {\n formModel.value[props.widget.options.name] = oldSubFormData;\n }\n\n const newRowId = 'id' + generateId();\n rowIdData.value.splice(index, 0, newRowId);\n\n nextTick(() => {\n handleSubFormRowInsert(oldSubFormData, newRowId);\n handleSubFormRowChange(oldSubFormData);\n });\n };\n\n const deleteSubFormRow = (index: number) => {\n TpfDelConfirm({\n type: 'confirm',\n content: i18nt('render.hint.deleteSubFormRow') + '?',\n title: i18nt('render.hint.prompt'),\n okText: i18nt('render.hint.confirm'),\n cancelText: i18nt('render.hint.cancel')\n })\n .then(() => {\n const oldSubFormData = formModel.value[props.widget.options.name] || [];\n const deletedDataRow = deepClone(oldSubFormData[index]);\n oldSubFormData.splice(index, 1);\n rowIdData.value.splice(index, 1);\n\n nextTick(() => {\n handleSubFormRowDelete(oldSubFormData, deletedDataRow);\n handleSubFormRowChange(oldSubFormData);\n });\n })\n .catch(() => {});\n };\n\n const handleSubFormFirstRowAdd = () => {\n if (!!props.widget.options.showBlankRow && rowIdData.value.length === 0) {\n if (fieldWidgetList.value.length === 0) extractFieldWidgetList();\n addSubFormRow();\n }\n };\n\n const onSubFormRowDeleteHide = index => {\n return executeFunction({\n functionBody: props.widget.options.onSubFormRowDeleteHide,\n params: {\n subFormData: formModel.value[props.widget.options.name],\n index\n },\n keys: ['subFormData', 'index']\n });\n };\n\n onMounted(() => {\n extractFieldWidgetList();\n initRowIdData(true);\n handleSubFormFirstRowAdd();\n });\n\n defineExpose({\n ...defineExposed,\n insertDisabled,\n deleteDisabled,\n actionDisabled,\n setInsertDisabled: (flag: boolean) => {\n insertDisabled.value = flag;\n },\n setDeleteDisabled: (flag: boolean) => {\n deleteDisabled.value = flag;\n },\n setActionDisabled: (flag: boolean) => {\n actionDisabled.value = flag;\n }\n });\n</script>\n\n<style lang=\"scss\" scoped>\n .sub-form-container {\n margin-bottom: 16px;\n text-align: left;\n background: #fafafa;\n border-radius: 8px;\n padding: 10px;\n\n .header-row {\n margin-top: 15px;\n :deep(.action-button) {\n height: 35px;\n }\n }\n\n .sub-form-row {\n display: flex;\n align-items: center;\n background: white;\n margin: 8px 0;\n border-radius: 6px;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.03);\n\n .row-number-span {\n margin-left: 16px;\n }\n }\n }\n\n .sub-form-action-column {\n display: inline-block;\n align-items: center;\n text-align: center;\n padding: 8px;\n }\n\n .grid-sub-form-data-row {\n display: inline-block;\n flex: 1;\n padding: 10px;\n position: relative;\n &:before,\n &:after {\n content: '';\n display: inline-block;\n width: 1px;\n height: 60%;\n background: #e1e2e3;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n }\n &:before {\n left: 0;\n }\n &:after {\n right: 0;\n }\n :deep(.ant-form-item) {\n margin-bottom: 0;\n }\n }\n\n div.sub-form-action-column.hide-label {\n }\n\n div.row-no-column {\n display: flex;\n align-items: center;\n width: 50px;\n border-radius: 10px;\n background: #f1f2f3;\n padding: 5px 0;\n margin: 0 6px;\n font-size: 14px;\n color: #666;\n }\n\n .action-button-column {\n width: 140px;\n }\n</style>\n"],"names":["_withDirectives","_openBlock","_createElementBlock","_Fragment","_renderList","_createElementVNode","_createVNode","RenderWigetList","widget","_unref","_createBlock","_createTextVNode"],"mappings":"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"}
1
+ {"version":3,"file":"grid-sub-form-widget.vue2.js","sources":["../../../../../src/components/form-render/container-items/grid-sub-form-widget.vue"],"sourcesContent":["<template>\n <div class=\"sub-form-container\" v-show=\"!handleHidden\">\n <div v-for=\"(subFormRowId, sfrIdx) in listData\" class=\"sub-form-row\" :key=\"subFormRowId\">\n <div class=\"row-no-column\">\n <span class=\"row-number-span\">#{{ sfrIdx + 1 }}</span>\n </div>\n <div class=\"grid-sub-form-data-row\">\n <RenderWigetList\n :widgetList=\"widget.widgetList || []\"\n :parentWidget=\"widget\"\n :subFormRowIndex=\"sfrIdx\"\n :subFormRowId=\"subFormRowId\"\n />\n </div>\n <div class=\"sub-form-action-column hide-label\">\n <div class=\"action-button-column\" v-show=\"!isReadMode\">\n <a-button\n type=\"link\"\n :title=\"i18nt('render.hint.insertSubFormRow')\"\n :disabled=\"actionDisabled || insertDisabled\"\n @click=\"insertSubFormRow(sfrIdx)\"\n >\n <template #icon>\n <PlusOutlined />\n </template>\n </a-button>\n <a-button\n type=\"link\"\n :title=\"i18nt('render.hint.deleteSubFormRow')\"\n :disabled=\"actionDisabled || deleteDisabled\"\n v-show=\"!onSubFormRowDeleteHide || !onSubFormRowDeleteHide(sfrIdx)\"\n @click=\"deleteSubFormRow(sfrIdx)\"\n >\n <template #icon>\n <DeleteOutlined />\n </template>\n </a-button>\n </div>\n </div>\n </div>\n <div class=\"header-row\">\n <a-button\n block\n v-if=\"!isReadMode\"\n :disabled=\"actionDisabled || insertDisabled\"\n shape=\"round\"\n type=\"dashed\"\n size=\"small\"\n class=\"action-button\"\n @click=\"addSubFormRow\"\n :title=\"i18nt('render.hint.subFormAddActionHint')\"\n >\n <template #icon>\n <svg-icon icon-class=\"icon-el-plus\" />\n </template>\n {{ i18nt('render.hint.subFormAddAction') }}\n </a-button>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\n import { computed, ref, provide, onMounted, nextTick } from 'vue';\n import {\n deepClone,\n generateId,\n traverseFieldWidgetsOfContainer\n } from '@kp-ui/lowcode-core/src/utils/util';\n import RenderWigetList from '../RenderWigetList.vue';\n import { SvgIcon, TpfDelConfirm } from 'tmgc2-share';\n import { ComponentNameEnum, ContainerTypeEnum, WidgetProps } from '@kp-ui/lowcode-core';\n import { useI18n } from '@kp-ui/lowcode-core';\n import { useField } from '@kp-ui/lowcode-core';\n import { GridSubFormWidget } from '../../desginer/widget-panel/containers';\n import { PlusOutlined, DeleteOutlined } from '@ant-design/icons-vue';\n defineOptions({\n name: ContainerTypeEnum.GridSubFormWidget,\n componentName: ComponentNameEnum.ContainerWidget,\n inheritAttrs: false\n });\n\n provide('isSubFormField', true);\n provide('getSubFormName', () => props.widget.options.name);\n\n const { i18nt } = useI18n();\n const props = withDefaults(defineProps<WidgetProps<GridSubFormWidget>>(), {});\n\n const listData = ref<string[]>([]);\n const fieldWidgetList = ref<any[]>([]);\n const insertDisabled = ref(false);\n const deleteDisabled = ref(false);\n const actionDisabled = ref(false);\n\n const {\n formModel,\n isReadMode,\n handleHidden,\n executeFunction,\n defineExposed,\n executeWidgetEventFunction\n } = useField(props);\n\n const extractFieldWidgetList = () => {\n fieldWidgetList.value = [];\n const fieldListFn = (fw: any) => {\n fieldWidgetList.value.push(fw);\n };\n traverseFieldWidgetsOfContainer(props.widget, fieldListFn);\n };\n\n const initRowIdData = (initFlag = false) => {\n listData.value = [];\n const subFormModel = formModel.value[props.widget.options.name];\n if (!!subFormModel && subFormModel.length > 0) {\n subFormModel.forEach(() => {\n listData.value.push('id' + generateId());\n });\n\n if (initFlag) {\n setTimeout(() => {\n handleSubFormRowChange(subFormModel);\n }, 800);\n }\n }\n };\n\n const handleSubFormRowChange = (subFormData: any) => {\n if (props.widget.options.onSubFormRowChange) {\n executeFunction({\n functionBody: props.widget.options.onSubFormRowChange,\n keys: ['subFormData'],\n params: { subFormData }\n });\n }\n };\n\n const handleSubFormRowAdd = (subFormData: any, newRowId: string) => {\n executeFunction({\n functionBody: props.widget.options.onSubFormRowAdd,\n params: {\n subFormData,\n newRowId\n },\n keys: ['subFormData', 'newRowId']\n });\n };\n\n const handleSubFormRowInsert = (subFormData: any, newRowId: string) => {\n executeFunction({\n functionBody: props.widget.options.onSubFormRowInsert,\n params: {\n subFormData,\n newRowId\n },\n keys: ['subFormData', 'newRowId']\n });\n };\n\n const handleSubFormRowDelete = (subFormData: any, deletedDataRow: any) => {\n executeFunction({\n functionBody: props.widget.options.onSubFormRowDelete,\n params: {\n subFormData,\n deletedDataRow\n },\n keys: ['subFormData', 'deletedDataRow']\n });\n };\n\n const addSubFormRow = () => {\n const newSubFormDataRow: Record<string, any> = {};\n fieldWidgetList.value.forEach(subFormItem => {\n if (subFormItem?.formItemFlag) {\n newSubFormDataRow[subFormItem.options.name] = subFormItem.options.defaultValue;\n }\n });\n\n const oldSubFormData = formModel.value[props.widget.options.name] || [];\n oldSubFormData.push(newSubFormDataRow);\n // Ensure formModel is updated if it was empty/undefined\n if (!formModel.value[props.widget.options.name]) {\n formModel.value[props.widget.options.name] = oldSubFormData;\n }\n\n const newRowId = 'id' + generateId();\n listData.value.push(newRowId);\n\n nextTick(() => {\n handleSubFormRowAdd(oldSubFormData, newRowId);\n handleSubFormRowChange(oldSubFormData);\n });\n };\n\n const insertSubFormRow = (index: number) => {\n const newSubFormDataRow: Record<string, any> = {};\n fieldWidgetList.value.forEach(subFormItem => {\n if (subFormItem?.formItemFlag) {\n newSubFormDataRow[subFormItem.options.name] = subFormItem.options.defaultValue;\n }\n });\n\n const oldSubFormData = formModel.value[props.widget.options.name] || [];\n oldSubFormData.splice(index, 0, newSubFormDataRow);\n // Ensure formModel is updated\n if (!formModel.value[props.widget.options.name]) {\n formModel.value[props.widget.options.name] = oldSubFormData;\n }\n\n const newRowId = 'id' + generateId();\n listData.value.splice(index, 0, newRowId);\n\n nextTick(() => {\n handleSubFormRowInsert(oldSubFormData, newRowId);\n handleSubFormRowChange(oldSubFormData);\n });\n };\n\n const deleteSubFormRow = (index: number) => {\n TpfDelConfirm({\n type: 'confirm',\n content: i18nt('render.hint.deleteSubFormRow') + '?',\n title: i18nt('render.hint.prompt'),\n okText: i18nt('render.hint.confirm'),\n cancelText: i18nt('render.hint.cancel')\n })\n .then(() => {\n const oldSubFormData = formModel.value[props.widget.options.name] || [];\n const deletedDataRow = deepClone(oldSubFormData[index]);\n oldSubFormData.splice(index, 1);\n listData.value.splice(index, 1);\n\n nextTick(() => {\n handleSubFormRowDelete(oldSubFormData, deletedDataRow);\n handleSubFormRowChange(oldSubFormData);\n });\n })\n .catch(() => {});\n };\n\n const handleSubFormFirstRowAdd = () => {\n if (!!props.widget.options.showBlankRow && listData.value.length === 0) {\n if (fieldWidgetList.value.length === 0) extractFieldWidgetList();\n addSubFormRow();\n }\n };\n\n const onSubFormRowDeleteHide = index => {\n return executeFunction({\n functionBody: props.widget.options.onSubFormRowDeleteHide,\n params: {\n subFormData: formModel.value[props.widget.options.name],\n index\n },\n keys: ['subFormData', 'index']\n });\n };\n\n onMounted(() => {\n extractFieldWidgetList();\n initRowIdData(true);\n handleSubFormFirstRowAdd();\n });\n\n defineExpose({\n ...defineExposed,\n listData,\n insertDisabled,\n deleteDisabled,\n actionDisabled,\n setInsertDisabled: (flag: boolean) => {\n insertDisabled.value = flag;\n },\n setDeleteDisabled: (flag: boolean) => {\n deleteDisabled.value = flag;\n },\n setActionDisabled: (flag: boolean) => {\n actionDisabled.value = flag;\n }\n });\n</script>\n\n<style lang=\"scss\" scoped>\n .sub-form-container {\n margin-bottom: 16px;\n text-align: left;\n background: #fafafa;\n border-radius: 8px;\n padding: 10px;\n\n .header-row {\n margin-top: 15px;\n :deep(.action-button) {\n height: 35px;\n }\n }\n\n .sub-form-row {\n display: flex;\n align-items: center;\n background: white;\n margin: 8px 0;\n border-radius: 6px;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.03);\n\n .row-number-span {\n margin-left: 16px;\n }\n }\n }\n\n .sub-form-action-column {\n display: inline-block;\n align-items: center;\n text-align: center;\n padding: 8px;\n }\n\n .grid-sub-form-data-row {\n display: inline-block;\n flex: 1;\n padding: 10px;\n position: relative;\n &:before,\n &:after {\n content: '';\n display: inline-block;\n width: 1px;\n height: 60%;\n background: #e1e2e3;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n }\n &:before {\n left: 0;\n }\n &:after {\n right: 0;\n }\n :deep(.ant-form-item) {\n margin-bottom: 0;\n }\n }\n\n div.sub-form-action-column.hide-label {\n }\n\n div.row-no-column {\n display: flex;\n align-items: center;\n width: 50px;\n border-radius: 10px;\n background: #f1f2f3;\n padding: 5px 0;\n margin: 0 6px;\n font-size: 14px;\n color: #666;\n }\n\n .action-button-column {\n width: 140px;\n }\n</style>\n"],"names":["_withDirectives","_openBlock","_createElementBlock","_Fragment","_renderList","_createElementVNode","_createVNode","RenderWigetList","widget","_unref","_createBlock","_createTextVNode"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { defineComponent, onMounted, createElementBlock, openBlock, createVNode, unref, withCtx, createElementVNode } from "vue";
1
+ import { defineComponent, ref, onMounted, createElementBlock, openBlock, createVNode, unref, withCtx, createElementVNode } from "vue";
2
2
  import { getLocat } from "@kp-ui/tool";
3
3
  import { TpfAddInfoLayout } from "tmgc2-share";
4
4
  import ActionButtonListRender from "../ActionButtonListRender.vue.js";
@@ -21,6 +21,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
21
21
  id = "",
22
22
  type = "edit"
23
23
  } = getLocat();
24
+ const anchorList = ref([]);
25
+ const setAnchorList = (list) => {
26
+ anchorList.value = list;
27
+ };
24
28
  const {
25
29
  vfdRef,
26
30
  formConfig,
@@ -42,7 +46,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
42
46
  });
43
47
  return (_ctx, _cache) => {
44
48
  return openBlock(), createElementBlock("div", _hoisted_1, [createVNode(unref(TpfAddInfoLayout), {
45
- title: __props.title
49
+ title: __props.title,
50
+ "anchor-list": anchorList.value
46
51
  }, {
47
52
  footerRight: withCtx(() => {
48
53
  var _a, _b;
@@ -60,11 +65,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
60
65
  vfCtx: {
61
66
  _id: unref(id),
62
67
  ...unref(getLocat)(),
63
- goBack: unref(goBack)
68
+ goBack: unref(goBack),
69
+ setAnchorList
64
70
  }
65
71
  }, null, 8, ["vfCtx"])]),
66
72
  _: 1
67
- }, 8, ["title"])]);
73
+ }, 8, ["title", "anchor-list"])]);
68
74
  };
69
75
  }
70
76
  });
@@ -1 +1 @@
1
- {"version":3,"file":"CustomPageRender.vue.js","sources":["../../../../../src/components/public/ConfigView/CustomPageRender.vue"],"sourcesContent":["<template>\n <div class=\"t-bg-[#fff] t-h-full\">\n <TpfAddInfoLayout :title=\"title\">\n <VFormRender ref=\"vfdRef\" :vfCtx=\"{ _id: id, ...getLocat(), goBack }\" />\n <template #footerRight>\n <div id=\"fromBtn\"></div>\n <ActionButtonListRender\n :buttonList=\"formConfig?.buttonList || []\"\n :ctx=\"vfdRef?.context\"\n @on-click=\"handleButtonClick\"\n />\n </template>\n </TpfAddInfoLayout>\n </div>\n</template>\n\n<script lang=\"tsx\" setup>\n import { getLocat } from '@kp-ui/tool';\n import { onMounted } from 'vue';\n import { TpfAddInfoLayout } from 'tmgc2-share';\n import { useLowcode } from '@kp-ui/lowcode-core';\n import { type ActionButton } from '@kp-ui/lowcode-core';\n import ActionButtonListRender from '../ActionButtonListRender.vue';\n import VFormRender from '../../render/index.vue';\n\n const props = defineProps({\n title: {\n type: String,\n default: ''\n }\n });\n const { formCode = '', id = '', type = 'edit' } = getLocat();\n\n const { vfdRef, formConfig, getComponentJson, goBack } = useLowcode({ formCode, type });\n\n const handleButtonClick = ({ item }: { item: ActionButton }) => {\n if (item.name === 'cancelButton') {\n goBack();\n }\n };\n\n onMounted(async () => {\n await getComponentJson([]);\n });\n</script>\n\n<style lang=\"less\"></style>\n"],"names":["formCode","id","type","getLocat","vfdRef","formConfig","getComponentJson","goBack","useLowcode","handleButtonClick","item","name","onMounted","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","TpfAddInfoLayout","title","__props","footerRight","_createElementVNode","ActionButtonListRender","buttonList","ctx","context","onOnClick","VFormRender","ref","vfCtx","_id"],"mappings":";;;;;;;;;;;;;;;;;;AA+BI,UAAM;AAAA,MAAEA,WAAW;AAAA,MAAIC,KAAK;AAAA,MAAIC,OAAO;AAAA,QAAWC,SAAQ;AAE1D,UAAM;AAAA,MAAEC;AAAAA,MAAQC;AAAAA,MAAYC;AAAAA,MAAkBC;AAAAA,QAAWC,WAAW;AAAA,MAAER;AAAAA,MAAUE;AAAAA,IAAK,CAAC;AAEtF,UAAMO,oBAAoBA,CAAC;AAAA,MAAEC;AAAAA,IAA6B,MAAM;AAC5D,UAAIA,KAAKC,SAAS,gBAAgB;AAC9BJ,eAAM;AAAA,MACV;AAAA,IACJ;AAEAK,cAAU,YAAY;AAClB,YAAMN,iBAAiB,CAAA,CAAE;AAAA,IAC7B,CAAC;;AA1CD,aAAAO,UAAA,GAAAC,mBAYM,OAZNC,YAYM,CAXFC,YAUmBC,MAAAC,gBAAA,GAAA;AAAA,QAVAC,OAAOC,QAAAD;AAAAA,MAAK,GAAA;AAAA,QAEhBE,qBACP,MAAA;;AAAwB,4CAAxBC,mBAAwB,OAAA;AAAA,YAAnBrB,IAAG;AAAA,aAAS,MAAA,EAAA,IACjBe,YAIEO,wBAAA;AAAA,YAHGC,cAAYP,WAAAZ,UAAA,MAAAY,mBAAYO,eAAU,CAAA;AAAA,YAClCC,MAAKR,WAAAb,MAAA,MAAAa,mBAAQS;AAAAA,YACbC,WAAUlB;AAAAA;;yBANnB,MAAwE,CAAxEO,YAAwEY,aAAA;AAAA,mBAAvD;AAAA,UAAJC,KAAIzB;AAAAA,UAAU0B,OAAK;AAAA,YAAAC,KAASd,MAAAhB,EAAA;AAAA,YAAE,GAAKgB,MAAAd,QAAA,EAAQ;AAAA,oBAAIc,MAAAV,MAAA;AAAA,UAAM;AAAA;;;;;;"}
1
+ {"version":3,"file":"CustomPageRender.vue.js","sources":["../../../../../src/components/public/ConfigView/CustomPageRender.vue"],"sourcesContent":["<template>\n <div class=\"t-bg-[#fff] t-h-full\">\n <TpfAddInfoLayout :title=\"title\" :anchor-list=\"anchorList\">\n <VFormRender ref=\"vfdRef\" :vfCtx=\"{ _id: id, ...getLocat(), goBack, setAnchorList }\" />\n <template #footerRight>\n <div id=\"fromBtn\"></div>\n <ActionButtonListRender\n :buttonList=\"formConfig?.buttonList || []\"\n :ctx=\"vfdRef?.context\"\n @on-click=\"handleButtonClick\"\n />\n </template>\n </TpfAddInfoLayout>\n </div>\n</template>\n\n<script lang=\"tsx\" setup>\n import { getLocat } from '@kp-ui/tool';\n import { onMounted, ref } from 'vue';\n import { TpfAddInfoLayout, TpfAnchorList } from 'tmgc2-share';\n import { useLowcode } from '@kp-ui/lowcode-core';\n import { type ActionButton } from '@kp-ui/lowcode-core';\n import ActionButtonListRender from '../ActionButtonListRender.vue';\n import VFormRender from '../../render/index.vue';\n\n const props = defineProps({\n title: {\n type: String,\n default: ''\n }\n });\n const { formCode = '', id = '', type = 'edit' } = getLocat();\n const anchorList = ref<TpfAnchorList[]>([]);\n\n const setAnchorList = (list: TpfAnchorList[]) => {\n anchorList.value = list;\n };\n\n const { vfdRef, formConfig, getComponentJson, goBack } = useLowcode({ formCode, type });\n\n const handleButtonClick = ({ item }: { item: ActionButton }) => {\n if (item.name === 'cancelButton') {\n goBack();\n }\n };\n\n onMounted(async () => {\n await getComponentJson([]);\n });\n</script>\n\n<style lang=\"less\"></style>\n"],"names":["formCode","id","type","getLocat","anchorList","ref","setAnchorList","list","value","vfdRef","formConfig","getComponentJson","goBack","useLowcode","handleButtonClick","item","name","onMounted","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","TpfAddInfoLayout","title","__props","footerRight","_createElementVNode","ActionButtonListRender","buttonList","ctx","context","onOnClick","VFormRender","vfCtx"],"mappings":";;;;;;;;;;;;;;;;;;AA+BI,UAAM;AAAA,MAAEA,WAAW;AAAA,MAAIC,KAAK;AAAA,MAAIC,OAAO;AAAA,QAAWC,SAAQ;AAC1D,UAAMC,aAAaC,IAAqB,EAAE;AAE1C,UAAMC,gBAAiBC,UAA0B;AAC7CH,iBAAWI,QAAQD;AAAAA,IACvB;AAEA,UAAM;AAAA,MAAEE;AAAAA,MAAQC;AAAAA,MAAYC;AAAAA,MAAkBC;AAAAA,QAAWC,WAAW;AAAA,MAAEb;AAAAA,MAAUE;AAAAA,IAAK,CAAC;AAEtF,UAAMY,oBAAoBA,CAAC;AAAA,MAAEC;AAAAA,IAA6B,MAAM;AAC5D,UAAIA,KAAKC,SAAS,gBAAgB;AAC9BJ,eAAM;AAAA,MACV;AAAA,IACJ;AAEAK,cAAU,YAAY;AAClB,YAAMN,iBAAiB,CAAA,CAAE;AAAA,IAC7B,CAAC;;AA/CD,aAAAO,UAAA,GAAAC,mBAYM,OAZNC,YAYM,CAXFC,YAUmBC,MAAAC,gBAAA,GAAA;AAAA,QAVAC,OAAOC,QAAAD;AAAAA,QAAQ,eAAapB,WAAAI;AAAAA;QAEhCkB,qBACP,MAAA;;AAAwB,4CAAxBC,mBAAwB,OAAA;AAAA,YAAnB1B,IAAG;AAAA,aAAS,MAAA,EAAA,IACjBoB,YAIEO,wBAAA;AAAA,YAHGC,cAAYP,WAAAZ,UAAA,MAAAY,mBAAYO,eAAU,CAAA;AAAA,YAClCC,MAAKR,WAAAb,MAAA,MAAAa,mBAAQS;AAAAA,YACbC,WAAUlB;AAAAA;;yBANnB,MAAuF,CAAvFO,YAAuFY,aAAA;AAAA,mBAAtE;AAAA,UAAJ5B,KAAII;AAAAA,UAAUyB;iBAAcZ,MAAArB,EAAA;AAAA,YAAE,GAAKqB,gBAAQ;AAAA,YAAAV,QAAIU,MAAAV,MAAA;AAAA;UAAqB;AAAA;;;;;;"}
@@ -1,7 +1,7 @@
1
1
  import _sfc_main from "./DataTableColumnDialog.vue2.js";
2
2
  /* empty css */
3
3
  import _export_sfc from "../../../_virtual/_plugin-vue_export-helper.js";
4
- const DataTableColumnDialog = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-7ae2c55f"]]);
4
+ const DataTableColumnDialog = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-30a82eb1"]]);
5
5
  export {
6
6
  DataTableColumnDialog as default
7
7
  };
@@ -1,9 +1,12 @@
1
- import { defineComponent, mergeModels, useModel, ref, computed, watch, resolveComponent, createBlock, openBlock, unref, withCtx, createVNode, createElementVNode, toDisplayString, createCommentVNode, createTextVNode, createElementBlock, Fragment, renderList, normalizeClass } from "vue";
1
+ import { defineComponent, mergeModels, useModel, ref, computed, watch, resolveComponent, createBlock, openBlock, unref, withCtx, createVNode, createElementVNode, toDisplayString, createCommentVNode, createTextVNode, createElementBlock, Fragment, renderList, normalizeStyle, normalizeClass } from "vue";
2
2
  import { SearchOutlined } from "@ant-design/icons-vue";
3
3
  import { useI18n } from "@kp-ui/i18n";
4
4
  import { cloneDeep } from "lodash-es";
5
5
  import { TpfModal, SvgIcon } from "tmgc2-share";
6
6
  import Draggable from "vuedraggable";
7
+ import TpfDelConfirm from "tmgc2-share/src/components/TpfModal/TpfDelConfirm";
8
+ import { message } from "ant-design-vue";
9
+ import { useTableColumnStore } from "../../../core/src/store/useTableColumnStore.js";
7
10
  const _hoisted_1 = { class: "col-left-title" };
8
11
  const _hoisted_2 = { class: "title" };
9
12
  const _hoisted_3 = { class: "search" };
@@ -16,7 +19,9 @@ const _hoisted_9 = { class: "col-right-content-item-right" };
16
19
  const _sfc_main = /* @__PURE__ */ defineComponent({
17
20
  __name: "DataTableColumnDialog",
18
21
  props: /* @__PURE__ */ mergeModels({
19
- columns: { default: () => [] }
22
+ columns: { default: () => [] },
23
+ pageCode: { default: "" },
24
+ tableId: { default: "" }
20
25
  }, {
21
26
  "visible": { type: Boolean, ...{ default: false } },
22
27
  "visibleModifiers": {}
@@ -24,12 +29,20 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
24
29
  emits: /* @__PURE__ */ mergeModels(["update"], ["update:visible"]),
25
30
  setup(__props, { expose: __expose, emit: __emit }) {
26
31
  const { t } = useI18n();
32
+ const tableColumnStore = useTableColumnStore();
27
33
  const props = __props;
28
34
  const emit = __emit;
29
35
  const visible = useModel(__props, "visible");
30
36
  const searchKey = ref("");
31
37
  const tableColumns = ref([]);
32
38
  const rightShowColumns = ref([]);
39
+ const initColumn = ref([]);
40
+ const saveColumnConfig = () => {
41
+ const storageKey = props.pageCode || props.tableId;
42
+ if (!storageKey) return;
43
+ const columnList = mergeColumns();
44
+ tableColumnStore.saveColumnList(storageKey, columnList);
45
+ };
33
46
  const leftShowColumns = computed(() => {
34
47
  if (!searchKey.value) return tableColumns.value;
35
48
  return tableColumns.value.filter((item) => {
@@ -58,32 +71,43 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
58
71
  return 0;
59
72
  });
60
73
  };
61
- const resetColumns = () => {
62
- tableColumns.value = cloneDeep(props.columns);
74
+ const mergeColumns = () => {
75
+ const selectList = unref(rightShowColumns);
76
+ const unSelectList = [];
77
+ unref(initColumn).forEach((item) => {
78
+ const flag = unref(selectList).some((it) => it.dataIndex === item.dataIndex);
79
+ if (!flag) {
80
+ unSelectList.push({ ...item, visible: false });
81
+ }
82
+ });
83
+ const result = [...selectList, ...unSelectList];
84
+ return result.map((item, index) => ({
85
+ ...item,
86
+ displayOrdinal: index
87
+ }));
88
+ };
89
+ const restColum = () => {
90
+ tableColumns.value = cloneDeep(unref(initColumn));
63
91
  getRightShowColumns();
64
92
  updateCheckAll();
65
93
  };
94
+ const restPageJson = async () => {
95
+ const storageKey = props.pageCode || props.tableId;
96
+ if (!storageKey) {
97
+ message.warning(t("lang.未配置 pageCode 或 tableId"));
98
+ return;
99
+ }
100
+ await TpfDelConfirm({ content: t("lang.确定清除缓存记录吗") });
101
+ tableColumnStore.clearTableConfig(storageKey);
102
+ message.success(t("lang.清除成功"));
103
+ window.location.reload();
104
+ };
66
105
  const onCancel = () => {
67
106
  visible.value = false;
68
107
  };
69
108
  const handleOk = () => {
70
- const newTableColumns = [];
71
- rightShowColumns.value.forEach((rightItem) => {
72
- const found = tableColumns.value.find((item) => item.dataIndex === rightItem.dataIndex);
73
- if (found) {
74
- found.visible = true;
75
- found.fixed = rightItem.fixed;
76
- newTableColumns.push({ ...found });
77
- }
78
- });
79
- tableColumns.value.forEach((item) => {
80
- if (!rightShowColumns.value.find((right) => right.dataIndex === item.dataIndex)) {
81
- item.visible = false;
82
- delete item.fixed;
83
- newTableColumns.push({ ...item });
84
- }
85
- });
86
- emit("update", newTableColumns);
109
+ saveColumnConfig();
110
+ emit("update", mergeColumns());
87
111
  visible.value = false;
88
112
  };
89
113
  const changeCheckAll = (e) => {
@@ -129,11 +153,36 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
129
153
  const open = () => {
130
154
  visible.value = true;
131
155
  };
156
+ const restoreColumnFromStorage = () => {
157
+ const storageKey = props.pageCode || props.tableId;
158
+ if (!storageKey || !tableColumnStore.hasTableConfig(storageKey)) {
159
+ return cloneDeep(props.columns);
160
+ }
161
+ const storedColumnList = tableColumnStore.getColumnList(storageKey);
162
+ if (storedColumnList.length === 0) {
163
+ return cloneDeep(props.columns);
164
+ }
165
+ const columns = cloneDeep(props.columns);
166
+ return columns.map((col) => {
167
+ const stored = storedColumnList.find((item) => item.dataIndex === col.dataIndex);
168
+ if (stored) {
169
+ return {
170
+ ...col,
171
+ visible: stored.visible !== false,
172
+ fixed: stored.fixed,
173
+ displayOrdinal: stored.displayOrdinal
174
+ };
175
+ }
176
+ return col;
177
+ });
178
+ };
132
179
  watch(
133
180
  () => visible.value,
134
181
  async (val) => {
135
182
  if (val) {
136
- tableColumns.value = cloneDeep(props.columns);
183
+ const columnsConfig = restoreColumnFromStorage();
184
+ tableColumns.value = columnsConfig;
185
+ initColumn.value = columnsConfig;
137
186
  getRightShowColumns();
138
187
  sortRightColumns();
139
188
  updateCheckAll();
@@ -141,7 +190,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
141
190
  },
142
191
  { immediate: true }
143
192
  );
144
- __expose({ open, resetColumns });
193
+ __expose({ open, restColum });
145
194
  return (_ctx, _cache) => {
146
195
  const _component_a_input = resolveComponent("a-input");
147
196
  const _component_a_checkbox = resolveComponent("a-checkbox");
@@ -156,6 +205,26 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
156
205
  width: "800px",
157
206
  destroyOnClose: ""
158
207
  }, {
208
+ footerLeft: withCtx(() => [
209
+ createVNode(_component_a_button, {
210
+ class: "tpf-button",
211
+ onClick: restColum
212
+ }, {
213
+ default: withCtx(() => [
214
+ createTextVNode(toDisplayString(unref(t)("lang.重置")), 1)
215
+ ]),
216
+ _: 1
217
+ }),
218
+ createVNode(_component_a_button, {
219
+ class: "tpf-button",
220
+ onClick: restPageJson
221
+ }, {
222
+ default: withCtx(() => [
223
+ createTextVNode(toDisplayString(unref(t)("lang.清除缓存记录")), 1)
224
+ ]),
225
+ _: 1
226
+ })
227
+ ]),
159
228
  footerRight: withCtx(() => [
160
229
  createVNode(_component_a_button, {
161
230
  class: "tpf-button",
@@ -184,7 +253,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
184
253
  }, {
185
254
  default: withCtx(() => [
186
255
  createVNode(_component_a_col, {
187
- span: 12,
256
+ span: 17,
188
257
  class: "col-left"
189
258
  }, {
190
259
  default: withCtx(() => [
@@ -229,7 +298,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
229
298
  (openBlock(true), createElementBlock(Fragment, null, renderList(leftShowColumns.value, (item) => {
230
299
  return openBlock(), createBlock(_component_a_col, {
231
300
  key: item.dataIndex,
232
- span: 12
301
+ span: 6
233
302
  }, {
234
303
  default: withCtx(() => [
235
304
  createVNode(_component_a_checkbox, {
@@ -261,7 +330,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
261
330
  _: 1
262
331
  }),
263
332
  createVNode(_component_a_col, {
264
- span: 12,
333
+ span: 7,
265
334
  class: "col-right"
266
335
  }, {
267
336
  default: withCtx(() => [
@@ -292,19 +361,21 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
292
361
  move: "",
293
362
  shadow: ""
294
363
  }),
295
- createElementVNode("span", _hoisted_8, toDisplayString(item.title), 1),
364
+ createElementVNode("span", _hoisted_8, toDisplayString(item.title), 1)
365
+ ]),
366
+ createElementVNode("div", _hoisted_9, [
296
367
  createVNode(unref(SvgIcon), {
297
- size: "18",
368
+ size: "24",
298
369
  type: "icon-ding",
299
370
  class: normalizeClass(["icon-ding", item.fixed === "left" && "showIcon"]),
300
371
  cursor: "",
301
372
  shadow: "",
373
+ activeBackGround: item.fixed === "left" ? "" : "#e8e9e9",
374
+ style: normalizeStyle(`color:${item.fixed === "left" ? "var(--ant-primary-color)" : "#b0b4b7"}`),
302
375
  onClick: ($event) => toggleFixed(item)
303
- }, null, 8, ["class", "onClick"])
304
- ]),
305
- createElementVNode("div", _hoisted_9, [
376
+ }, null, 8, ["class", "activeBackGround", "style", "onClick"]),
306
377
  createVNode(unref(SvgIcon), {
307
- size: "18",
378
+ size: "24",
308
379
  type: "icon-guanbi",
309
380
  cursor: "",
310
381
  shadow: "",
@@ -1 +1 @@
1
- {"version":3,"file":"DataTableColumnDialog.vue2.js","sources":["../../../../src/components/public/DataTableColumnDialog.vue"],"sourcesContent":["<template>\n <TpfModal v-model:visible=\"visible\" :title=\"t('lang.列管理')\" width=\"800px\" destroyOnClose>\n <a-row :gutter=\"10\" class=\"column-row\">\n <!-- 左侧:可选字段 -->\n <a-col :span=\"12\" class=\"col-left\">\n <div class=\"col-left-title\">\n <div class=\"title\">\n <span>{{ t('lang.可选字段') }}</span>\n <span>({{ leftShowColumns.length }}{{ t('lang.个') }}) </span>\n </div>\n <div class=\"search\">\n <a-input\n :placeholder=\"t('lang.请搜索')\"\n size=\"small\"\n allow-clear\n v-model:value=\"searchKey\"\n >\n <template #prefix>\n <SearchOutlined />\n </template>\n </a-input>\n </div>\n </div>\n <div class=\"col-left-content\">\n <a-checkbox\n v-if=\"!!tableColumns.length\"\n v-model:checked=\"checkAll\"\n @change=\"changeCheckAll\"\n :indeterminate=\"indeterminate\"\n >\n {{ t('lang.全选') }}\n </a-checkbox>\n <a-row :gutter=\"[10, 10]\" class=\"checkbox-row\">\n <a-col v-for=\"item in leftShowColumns\" :key=\"item.dataIndex\" :span=\"12\">\n <a-checkbox\n v-model:checked=\"item.visible\"\n @change=\"onchangeCheck(item)\"\n >\n <a-tooltip :title=\"item.title\">\n {{ item.title }}\n </a-tooltip>\n </a-checkbox>\n </a-col>\n </a-row>\n </div>\n </a-col>\n\n <!-- 右侧:已选字段 -->\n <a-col :span=\"12\" class=\"col-right\">\n <div class=\"col-right-title\">\n <div class=\"title\">\n <span>{{ t('lang.已选字段') }}</span>\n <span>({{ rightShowColumns.length }}{{ t('lang.个') }}) </span>\n </div>\n </div>\n <Draggable\n tag=\"div\"\n :list=\"rightShowColumns\"\n class=\"col-right-content\"\n item-key=\"dataIndex\"\n handle=\".drag-handle\"\n animation=\"150\"\n >\n <template #item=\"{ element: item, index }\">\n <div class=\"col-right-content-item\" :key=\"item.dataIndex\">\n <div class=\"col-right-content-item-left\">\n <SvgIcon\n size=\"24\"\n type=\"icon-move1\"\n class=\"drag-handle icon-move1\"\n move\n shadow\n />\n <span class=\"title\">{{ item.title }}</span>\n <SvgIcon\n size=\"18\"\n type=\"icon-ding\"\n :class=\"['icon-ding', item.fixed === 'left' && 'showIcon']\"\n cursor\n shadow\n @click=\"toggleFixed(item)\"\n />\n </div>\n <div class=\"col-right-content-item-right\">\n <SvgIcon\n size=\"18\"\n type=\"icon-guanbi\"\n cursor\n shadow\n @click=\"removeColumn(item, index)\"\n />\n </div>\n </div>\n </template>\n </Draggable>\n </a-col>\n </a-row>\n\n <template #footerRight>\n <a-button class=\"tpf-button\" @click=\"onCancel\">{{ t('lang.取消') }} </a-button>\n <a-button class=\"tpf-button\" type=\"primary\" @click=\"handleOk\">\n {{ t('lang.保存') }}\n </a-button>\n </template>\n </TpfModal>\n</template>\n\n<script setup lang=\"ts\" name=\"DataTableColumnDialog\">\n import { ref, computed, watch } from 'vue';\n import { SearchOutlined } from '@ant-design/icons-vue';\n import { useI18n } from '@kp-ui/i18n';\n import { cloneDeep } from 'lodash-es';\n import { SvgIcon, TpfModal } from 'tmgc2-share';\n import Draggable from 'vuedraggable';\n\n const { t } = useI18n();\n\n interface ColumnType {\n dataIndex: string;\n title: string;\n visible?: boolean;\n fixed?: 'left' | 'right' | boolean;\n [key: string]: any;\n }\n\n interface Props {\n columns?: ColumnType[];\n }\n\n const props = withDefaults(defineProps<Props>(), {\n columns: () => []\n });\n\n const emit = defineEmits<{\n (e: 'update', columns: ColumnType[]): void;\n }>();\n\n const visible = defineModel<boolean>('visible', { default: false });\n\n const searchKey = ref('');\n\n // 可选字段列表\n const tableColumns = ref<ColumnType[]>([]);\n // 已选字段列表\n const rightShowColumns = ref<ColumnType[]>([]);\n\n // 左侧可筛选的字段\n const leftShowColumns = computed(() => {\n if (!searchKey.value) return tableColumns.value;\n return tableColumns.value.filter(item => {\n return item.title && item.title.toLowerCase().includes(searchKey.value.toLowerCase());\n });\n });\n\n // 全选相关\n const checkAll = ref(false);\n const indeterminate = ref(false);\n\n // 更新全选状态\n const updateCheckAll = () => {\n const visibleColumns = leftShowColumns.value.filter(item => item.visible);\n checkAll.value =\n visibleColumns.length === leftShowColumns.value.length &&\n leftShowColumns.value.length > 0;\n indeterminate.value =\n visibleColumns.length > 0 && visibleColumns.length < leftShowColumns.value.length;\n };\n\n // 获取已选字段\n const getRightShowColumns = () => {\n rightShowColumns.value = [];\n tableColumns.value.forEach(item => {\n if (item.visible) {\n rightShowColumns.value.push(item);\n }\n });\n };\n\n // 排序:固定列在前\n const sortRightColumns = () => {\n rightShowColumns.value.sort((a, b) => {\n if (a.fixed === 'left' && b.fixed !== 'left') return -1;\n if (a.fixed !== 'left' && b.fixed === 'left') return 1;\n return 0;\n });\n };\n\n // 重置\n const resetColumns = () => {\n tableColumns.value = cloneDeep(props.columns);\n getRightShowColumns();\n updateCheckAll();\n };\n\n // 取消\n const onCancel = () => {\n visible.value = false;\n };\n\n // 确定\n const handleOk = () => {\n // 根据 rightShowColumns 的顺序更新 tableColumns\n const newTableColumns: ColumnType[] = [];\n\n // 先添加可见列(按 rightShowColumns 顺序)\n rightShowColumns.value.forEach(rightItem => {\n const found = tableColumns.value.find(item => item.dataIndex === rightItem.dataIndex);\n if (found) {\n found.visible = true;\n found.fixed = rightItem.fixed;\n newTableColumns.push({ ...found });\n }\n });\n\n // 再添加隐藏列\n tableColumns.value.forEach(item => {\n if (!rightShowColumns.value.find(right => right.dataIndex === item.dataIndex)) {\n item.visible = false;\n delete item.fixed;\n newTableColumns.push({ ...item });\n }\n });\n\n emit('update', newTableColumns);\n visible.value = false;\n };\n\n // 全选/取消全选\n const changeCheckAll = (e: any) => {\n const checked = e.target.checked;\n checkAll.value = checked;\n indeterminate.value = false;\n tableColumns.value.forEach(item => {\n item.visible = checked;\n });\n getRightShowColumns();\n };\n\n // 单选\n const onchangeCheck = (row: ColumnType) => {\n const index = rightShowColumns.value.findIndex(item => item.dataIndex === row.dataIndex);\n if (row.visible) {\n if (index === -1) {\n rightShowColumns.value.push(row);\n }\n } else {\n if (index > -1) {\n rightShowColumns.value.splice(index, 1);\n }\n }\n updateCheckAll();\n };\n\n // 移除列\n const removeColumn = (row: ColumnType, index: number) => {\n row.visible = false;\n delete row.fixed;\n rightShowColumns.value.splice(index, 1);\n updateCheckAll();\n };\n\n // 切换固定\n const toggleFixed = (row: ColumnType) => {\n if (row.fixed === 'left') {\n delete row.fixed;\n } else {\n // 最多固定 2 列\n const fixedCount = rightShowColumns.value.filter(item => item.fixed === 'left').length;\n if (fixedCount >= 2) {\n return;\n }\n row.fixed = 'left';\n }\n sortRightColumns();\n };\n\n // 打开弹窗\n const open = () => {\n visible.value = true;\n };\n\n // 监听弹窗显示\n watch(\n () => visible.value,\n async val => {\n if (val) {\n // 初始化列数据\n tableColumns.value = cloneDeep(props.columns);\n getRightShowColumns();\n sortRightColumns();\n updateCheckAll();\n }\n },\n { immediate: true }\n );\n\n defineExpose({ open, resetColumns });\n</script>\n\n<style lang=\"less\" scoped>\n .column-row {\n height: 400px;\n display: flex;\n\n .col-left,\n .col-right {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .col-left {\n padding-left: 20px !important;\n padding-right: 10px !important;\n border-right: 1px solid #f0f0f0;\n }\n\n .col-right {\n padding-left: 10px !important;\n }\n\n .col-left-title,\n .col-right-title {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 10px;\n\n .title {\n font-weight: 500;\n color: #333;\n }\n\n .search {\n width: 150px;\n }\n }\n\n .col-left-content,\n .col-right-content {\n flex: 1 0 0;\n overflow-y: auto;\n overflow-x: hidden;\n }\n\n .checkbox-row {\n margin-top: 10px;\n }\n\n .col-right-content-item {\n margin-right: 5px;\n height: 32px;\n display: flex;\n align-items: center;\n\n .col-right-content-item-left {\n flex: 1 0 0;\n display: flex;\n align-items: center;\n\n .drag-handle {\n cursor: move;\n margin-right: 8px;\n flex-shrink: 0;\n }\n\n .title {\n flex: 1 0 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 14px;\n }\n\n .icon-ding {\n margin-left: 8px;\n flex-shrink: 0;\n opacity: 0;\n transition: opacity 0.2s;\n\n &:hover {\n opacity: 1;\n }\n\n &.showIcon {\n opacity: 1;\n }\n }\n }\n\n &:hover {\n .icon-ding {\n opacity: 1;\n }\n }\n\n .col-right-content-item-right {\n flex: 1 0 0;\n display: flex;\n justify-content: flex-end;\n padding-right: 10px;\n\n :deep(.icon-guanbi) {\n opacity: 0.6;\n\n &:hover {\n opacity: 1;\n }\n }\n }\n }\n }\n</style>\n"],"names":["_useModel","_createBlock","_unref","_createVNode","_createElementVNode","_toDisplayString","_createElementBlock","_Fragment","_renderList","_createTextVNode","_withCtx","_normalizeClass"],"mappings":"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"}
1
+ {"version":3,"file":"DataTableColumnDialog.vue2.js","sources":["../../../../src/components/public/DataTableColumnDialog.vue"],"sourcesContent":["<template>\n <TpfModal v-model:visible=\"visible\" :title=\"t('lang.列管理')\" width=\"800px\" destroyOnClose>\n <a-row :gutter=\"10\" class=\"column-row\">\n <!-- 左侧:可选字段 -->\n <a-col :span=\"17\" class=\"col-left\">\n <div class=\"col-left-title\">\n <div class=\"title\">\n <span>{{ t('lang.可选字段') }}</span>\n <span>({{ leftShowColumns.length }}{{ t('lang.个') }}) </span>\n </div>\n <div class=\"search\">\n <a-input\n :placeholder=\"t('lang.请搜索')\"\n size=\"small\"\n allow-clear\n v-model:value=\"searchKey\"\n >\n <template #prefix>\n <SearchOutlined />\n </template>\n </a-input>\n </div>\n </div>\n <div class=\"col-left-content\">\n <a-checkbox\n v-if=\"!!tableColumns.length\"\n v-model:checked=\"checkAll\"\n @change=\"changeCheckAll\"\n :indeterminate=\"indeterminate\"\n >\n {{ t('lang.全选') }}\n </a-checkbox>\n <a-row :gutter=\"[10, 10]\" class=\"checkbox-row\">\n <a-col v-for=\"item in leftShowColumns\" :key=\"item.dataIndex\" :span=\"6\">\n <a-checkbox\n v-model:checked=\"item.visible\"\n @change=\"onchangeCheck(item)\"\n >\n <a-tooltip :title=\"item.title\">\n {{ item.title }}\n </a-tooltip>\n </a-checkbox>\n </a-col>\n </a-row>\n </div>\n </a-col>\n\n <!-- 右侧:已选字段 -->\n <a-col :span=\"7\" class=\"col-right\">\n <div class=\"col-right-title\">\n <div class=\"title\">\n <span>{{ t('lang.已选字段') }}</span>\n <span>({{ rightShowColumns.length }}{{ t('lang.个') }}) </span>\n </div>\n </div>\n <Draggable\n tag=\"div\"\n :list=\"rightShowColumns\"\n class=\"col-right-content\"\n item-key=\"dataIndex\"\n handle=\".drag-handle\"\n animation=\"150\"\n >\n <template #item=\"{ element: item, index }\">\n <div class=\"col-right-content-item\" :key=\"item.dataIndex\">\n <div class=\"col-right-content-item-left\">\n <SvgIcon\n size=\"24\"\n type=\"icon-move1\"\n class=\"drag-handle icon-move1\"\n move\n shadow\n />\n <span class=\"title\">{{ item.title }}</span>\n </div>\n <div class=\"col-right-content-item-right\">\n <SvgIcon\n size=\"24\"\n type=\"icon-ding\"\n :class=\"['icon-ding', item.fixed === 'left' && 'showIcon']\"\n cursor\n shadow\n :activeBackGround=\"item.fixed === 'left' ? '' : '#e8e9e9'\"\n :style=\"`color:${\n item.fixed === 'left'\n ? 'var(--ant-primary-color)'\n : '#b0b4b7'\n }`\"\n @click=\"toggleFixed(item)\"\n />\n <SvgIcon\n size=\"24\"\n type=\"icon-guanbi\"\n cursor\n shadow\n @click=\"removeColumn(item, index)\"\n />\n </div>\n </div>\n </template>\n </Draggable>\n </a-col>\n </a-row>\n <template #footerLeft>\n <a-button class=\"tpf-button\" @click=\"restColum\"> {{ t('lang.重置') }} </a-button>\n <a-button class=\"tpf-button\" @click=\"restPageJson\">\n {{ t('lang.清除缓存记录') }}\n </a-button>\n </template>\n <template #footerRight>\n <a-button class=\"tpf-button\" @click=\"onCancel\">{{ t('lang.取消') }} </a-button>\n <a-button class=\"tpf-button\" type=\"primary\" @click=\"handleOk\">\n {{ t('lang.保存') }}\n </a-button>\n </template>\n </TpfModal>\n</template>\n\n<script setup lang=\"ts\" name=\"DataTableColumnDialog\">\n import { ref, computed, watch, unref } from 'vue';\n import { SearchOutlined } from '@ant-design/icons-vue';\n import { useI18n } from '@kp-ui/i18n';\n import { cloneDeep } from 'lodash-es';\n import { SvgIcon, TpfModal } from 'tmgc2-share';\n import Draggable from 'vuedraggable';\n import TpfDelConfirm from 'tmgc2-share/src/components/TpfModal/TpfDelConfirm';\n import { message } from 'ant-design-vue';\n import { useTableColumnStore, TableColumnConfig } from '@kp-ui/lowcode-core';\n\n const { t } = useI18n();\n const tableColumnStore = useTableColumnStore();\n\n interface ColumnType {\n dataIndex: string;\n title: string;\n visible?: boolean;\n fixed?: 'left' | 'right' | boolean;\n [key: string]: any;\n }\n\n interface Props {\n columns?: ColumnType[];\n pageCode?: string;\n tableId?: string;\n }\n\n const props = withDefaults(defineProps<Props>(), {\n columns: () => [],\n pageCode: '',\n tableId: ''\n });\n\n const emit = defineEmits<{\n (e: 'update', columns: ColumnType[]): void;\n }>();\n\n const visible = defineModel<boolean>('visible', { default: false });\n\n const searchKey = ref('');\n\n // 可选字段列表\n const tableColumns = ref<ColumnType[]>([]);\n // 已选字段列表\n const rightShowColumns = ref<ColumnType[]>([]);\n // 初始列配置(用于重置)\n const initColumn = ref<ColumnType[]>([]);\n\n // 获取存储的列配置\n const getStoredColumnConfig = () => {\n const storageKey = props.pageCode || props.tableId;\n if (!storageKey) return null;\n return tableColumnStore.getTableConfig(storageKey);\n };\n\n // 保存列配置到存储\n const saveColumnConfig = () => {\n const storageKey = props.pageCode || props.tableId;\n if (!storageKey) return;\n\n const columnList = mergeColumns();\n tableColumnStore.saveColumnList(storageKey, columnList as TableColumnConfig[]);\n };\n\n // 左侧可筛选的字段\n const leftShowColumns = computed(() => {\n if (!searchKey.value) return tableColumns.value;\n return tableColumns.value.filter(item => {\n return item.title && item.title.toLowerCase().includes(searchKey.value.toLowerCase());\n });\n });\n\n // 全选相关\n const checkAll = ref(false);\n const indeterminate = ref(false);\n\n // 更新全选状态\n const updateCheckAll = () => {\n const visibleColumns = leftShowColumns.value.filter(item => item.visible);\n checkAll.value =\n visibleColumns.length === leftShowColumns.value.length &&\n leftShowColumns.value.length > 0;\n indeterminate.value =\n visibleColumns.length > 0 && visibleColumns.length < leftShowColumns.value.length;\n };\n\n // 获取已选字段\n const getRightShowColumns = () => {\n rightShowColumns.value = [];\n tableColumns.value.forEach(item => {\n if (item.visible) {\n rightShowColumns.value.push(item);\n }\n });\n };\n\n // 排序:固定列在前\n const sortRightColumns = () => {\n rightShowColumns.value.sort((a, b) => {\n if (a.fixed === 'left' && b.fixed !== 'left') return -1;\n if (a.fixed !== 'left' && b.fixed === 'left') return 1;\n return 0;\n });\n };\n\n // 合并列配置(用于保存)- 保存完整列配置,包含用户调整的状态\n const mergeColumns = () => {\n const selectList = unref(rightShowColumns);\n const unSelectList: ColumnType[] = [];\n\n unref(initColumn).forEach(item => {\n const flag = unref(selectList).some(it => it.dataIndex === item.dataIndex);\n if (!flag) {\n unSelectList.push({ ...item, visible: false });\n }\n });\n\n // 按照 rightShowColumns 的顺序返回可见列,然后是隐藏列\n const result = [...selectList, ...unSelectList];\n // 添加 displayOrdinal 用于记录顺序,返回完整列配置\n return result.map((item, index) => ({\n ...item,\n displayOrdinal: index\n }));\n };\n\n // 重置 - 恢复初始配置\n const restColum = () => {\n tableColumns.value = cloneDeep(unref(initColumn));\n getRightShowColumns();\n updateCheckAll();\n };\n\n // 清除缓存记录\n const restPageJson = async () => {\n const storageKey = props.pageCode || props.tableId;\n if (!storageKey) {\n message.warning(t('lang.未配置 pageCode 或 tableId'));\n return;\n }\n await TpfDelConfirm({ content: t('lang.确定清除缓存记录吗') });\n tableColumnStore.clearTableConfig(storageKey);\n message.success(t('lang.清除成功'));\n window.location.reload();\n };\n\n // 取消\n const onCancel = () => {\n visible.value = false;\n };\n\n // 确定 - 保存列配置\n const handleOk = () => {\n saveColumnConfig();\n emit('update', mergeColumns());\n visible.value = false;\n };\n\n // 全选/取消全选\n const changeCheckAll = (e: any) => {\n const checked = e.target.checked;\n checkAll.value = checked;\n indeterminate.value = false;\n tableColumns.value.forEach(item => {\n item.visible = checked;\n });\n getRightShowColumns();\n };\n\n // 单选\n const onchangeCheck = (row: ColumnType) => {\n const index = rightShowColumns.value.findIndex(item => item.dataIndex === row.dataIndex);\n if (row.visible) {\n if (index === -1) {\n rightShowColumns.value.push(row);\n }\n } else {\n if (index > -1) {\n rightShowColumns.value.splice(index, 1);\n }\n }\n updateCheckAll();\n };\n\n // 移除列\n const removeColumn = (row: ColumnType, index: number) => {\n row.visible = false;\n delete row.fixed;\n rightShowColumns.value.splice(index, 1);\n updateCheckAll();\n };\n\n // 切换固定\n const toggleFixed = (row: ColumnType) => {\n if (row.fixed === 'left') {\n delete row.fixed;\n } else {\n // 最多固定 2 列\n const fixedCount = rightShowColumns.value.filter(item => item.fixed === 'left').length;\n if (fixedCount >= 2) {\n return;\n }\n row.fixed = 'left';\n }\n sortRightColumns();\n };\n\n // 打开弹窗\n const open = () => {\n visible.value = true;\n };\n\n // 从存储的配置中恢复列状态\n const restoreColumnFromStorage = () => {\n const storageKey = props.pageCode || props.tableId;\n if (!storageKey || !tableColumnStore.hasTableConfig(storageKey)) {\n return cloneDeep(props.columns);\n }\n\n const storedColumnList = tableColumnStore.getColumnList(storageKey);\n if (storedColumnList.length === 0) {\n return cloneDeep(props.columns);\n }\n\n // 将存储的配置应用到当前列\n const columns = cloneDeep(props.columns);\n return columns.map(col => {\n const stored = storedColumnList.find(item => item.dataIndex === col.dataIndex);\n if (stored) {\n return {\n ...col,\n visible: stored.visible !== false,\n fixed: stored.fixed,\n displayOrdinal: stored.displayOrdinal\n };\n }\n return col;\n });\n };\n\n // 监听弹窗显示\n watch(\n () => visible.value,\n async val => {\n if (val) {\n // 初始化列数据,从存储中恢复配置\n const columnsConfig = restoreColumnFromStorage();\n tableColumns.value = columnsConfig;\n initColumn.value = columnsConfig;\n getRightShowColumns();\n sortRightColumns();\n updateCheckAll();\n }\n },\n { immediate: true }\n );\n\n defineExpose({ open, restColum });\n</script>\n\n<style lang=\"less\" scoped>\n .column-row {\n height: 400px;\n display: flex;\n\n .col-left,\n .col-right {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .col-left {\n padding-left: 20px !important;\n padding-right: 10px !important;\n border-right: 1px solid #f0f0f0;\n }\n\n .col-right {\n padding-left: 10px !important;\n }\n\n .col-left-title,\n .col-right-title {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 10px;\n\n .title {\n font-weight: 500;\n color: #333;\n flex: 1;\n }\n\n .search {\n width: 150px;\n }\n }\n\n .col-left-content,\n .col-right-content {\n flex: 1 0 0;\n overflow-y: auto;\n overflow-x: hidden;\n }\n\n .checkbox-row {\n margin-top: 10px;\n }\n\n .col-right-content-item {\n margin-right: 5px;\n height: 32px;\n display: flex;\n align-items: center;\n\n .col-right-content-item-left {\n flex: 1 0 0;\n display: flex;\n align-items: center;\n\n .drag-handle {\n cursor: move;\n margin-right: 8px;\n flex-shrink: 0;\n }\n\n .title {\n flex: 1 0 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 12px;\n }\n }\n\n .col-right-content-item-right {\n flex: 0 0 50px;\n display: flex;\n justify-content: flex-end;\n padding-right: 10px;\n .icon-ding {\n margin-left: 8px;\n flex-shrink: 0;\n opacity: 0;\n transition: opacity 0.2s;\n color: var(--ant-primary-color);\n &:hover {\n opacity: 1;\n }\n\n &.showIcon {\n opacity: 1;\n }\n }\n &:hover {\n .icon-ding {\n opacity: 1;\n }\n }\n :deep(.icon-guanbi) {\n opacity: 0.6;\n\n &:hover {\n opacity: 1;\n }\n }\n }\n }\n }\n</style>\n"],"names":["_useModel","_createBlock","_unref","_createVNode","_createElementVNode","_toDisplayString","_createElementBlock","_Fragment","_renderList","_createTextVNode","_withCtx","_normalizeClass","_normalizeStyle"],"mappings":"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"}