lyflowchart 1.0.135 → 1.0.139
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/dist/{ApprovalEditorModal-suKPJ-vN.js → ApprovalEditorModal-19j5zbe2.js} +1 -1
- package/dist/{Cell_click_approve-DoemsGnY.js → Cell_click_approve-BGDZUzTS.js} +1 -1
- package/dist/{approval-BaVHder3.js → approval-BaD4Bmw6.js} +1 -1
- package/dist/components/approval/utils.d.ts +1 -0
- package/dist/{core-BOc9ch_5.js → core-Cv0Erg9E.js} +10 -11
- package/dist/index.js +2 -2
- package/dist/lyflowchart.css +1 -1
- package/package.json +1 -1
- package/dist/ActionsConfig-BuvSvRbv.js.map +0 -1
- package/dist/ApprovalEditorModal-suKPJ-vN.js.map +0 -1
- package/dist/CancelModal-BUi3ieI8.js.map +0 -1
- package/dist/Cell_click_approve-DoemsGnY.js.map +0 -1
- package/dist/JsonTags-BbWLqghI.js.map +0 -1
- package/dist/MyProcess-FWGEwQcv.js.map +0 -1
- package/dist/approval-BW2WjPxY.js.map +0 -1
- package/dist/approval-BaVHder3.js.map +0 -1
- package/dist/approvalHistory-B2gpQbFC.js.map +0 -1
- package/dist/approvalHistoryViewModal-DgLpv2ot.js.map +0 -1
- package/dist/approvalPageConfig-D0zPXOUf.js.map +0 -1
- package/dist/approveLeftConfig-BOU_UgHp.js.map +0 -1
- package/dist/codeHistoryViewModal-BfSjIbEU.js.map +0 -1
- package/dist/columnTables-DLwtgcC7.js.map +0 -1
- package/dist/core-BOc9ch_5.js.map +0 -1
- package/dist/dataStoreSettingHistoryViewModal-D_so-KLp.js.map +0 -1
- package/dist/debugCode-Cm9-WiUG.js.map +0 -1
- package/dist/debugCode-dD1YnQSD.js.map +0 -1
- package/dist/default-VdDMlY4e.js.map +0 -1
- package/dist/example_code-C_xF8RRG.js.map +0 -1
- package/dist/flowHistoryViewModal-D8DJP7Te.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/init-plugin-fQTSQzui.js.map +0 -1
- package/dist/leftColumn-CsPjufue.js.map +0 -1
- package/dist/middleColumn-C7M6-eVo.js.map +0 -1
- package/dist/recordActions-BgFlNsGU.js.map +0 -1
- package/dist/settingsState-CI81PG-i.js.map +0 -1
- package/dist/tableConfig-uLXue-BS.js.map +0 -1
- package/dist/tableModal-BcYfVL02.js.map +0 -1
- package/dist/useApprovalRecordActions-BQ6MgV2L.js.map +0 -1
- package/dist/utils-CLet2gLV.js.map +0 -1
- package/dist/v0001-OaBeBCXI.js.map +0 -1
- package/dist/viewer-Dv3kQsMf.js.map +0 -1
- package/dist/vue-print-next-HRweUmNi.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"approveLeftConfig-BOU_UgHp.js","names":[],"sources":["../src/components/approval/components/approvalPageConfig/approveLeftConfig.vue","../src/components/approval/components/approvalPageConfig/approveLeftConfig.vue"],"sourcesContent":["<template>\n <div class=\"approve-left-content\">\n <div class=\"left-item\">\n <a-form layout=\"vertical\">\n <a-form-item label=\"流程组织\">\n <a-tree-select\n :disabled=\"disableTree\"\n v-model:value=\"selectedFlowOrgID\"\n :treeLine=\"{ showLeafIcon: false }\"\n :treeData=\"flowOrgTreeData\"\n :fieldNames=\"{ label: 'name', value: 'id' }\"\n style=\"width: 100%\"\n @select=\"flowOrgSelect\"\n :treeDefaultExpandAll=\"true\"\n ></a-tree-select>\n </a-form-item>\n </a-form>\n </div>\n <div class=\"left-item\">\n <a-tree\n :disabled=\"disableTree\"\n v-model:selectedKeys=\"selectedFlowNodeIds\"\n :treeData=\"flowNodeTreeData\"\n :fieldNames=\"{ title: 'name', key: 'id' }\"\n :defaultExpandAll=\"true\"\n :showLine=\"{ showLeafIcon: false }\"\n :showIcon=\"true\"\n :key=\"selectedFlowOrgID\"\n v-if=\"flowNodeTreeData.length > 0\"\n @select=\"flowNodeSelect\"\n >\n <template #icon=\"node\">\n <component\n v-if=\"node._icon\"\n :is=\"node._icon\"\n />\n </template>\n </a-tree>\n <div v-else>\n <a-empty></a-empty>\n </div>\n </div>\n </div>\n</template>\n<script setup lang=\"ts\">\nimport { cachedGetApiData } from '@/init-plugin';\nimport { onMounted, onUnmounted, ref, watch } from 'vue';\nimport {\n useSettingsStateStore,\n SET_SELECT_NODE,\n CLEAR_SELECT_NODE,\n} from '../../store/settingsState';\nimport { useRoute } from 'vue-router';\nimport { cloneDeep } from 'lodash';\n\nconst flowOrgTreeData = ref<any[]>([]);\nconst flowNodeTreeData = ref<any[]>([]);\nconst selectedFlowOrgID = ref<any>(null);\nlet firstFlowOrgID = null;\nconst flowOrgIDMap = {};\nconst selectedFlowNodeIds = ref<any>([]);\nconst flowNodeFlagMap = {};\nconst settingsState = useSettingsStateStore();\nconst route = useRoute();\nconst emit = defineEmits(['change']);\nconst disableTree = ref(false);\n\nconst processFlowOrgTreeData = (items: any[]) => {\n for (const item of items) {\n flowOrgIDMap[item.id] = item;\n if (item.children && item.children.length > 0) {\n item.selectable = false;\n processFlowOrgTreeData(item.children);\n } else {\n item.selectable = true;\n if (!firstFlowOrgID) {\n firstFlowOrgID = item.id;\n }\n }\n }\n return items;\n};\nconst processFlowNodeTreeData = (items: any[]) => {\n for (const item of items) {\n item._icon = item.icon;\n delete item.icon;\n if (item.children && item.children.length > 0) {\n processFlowNodeTreeData(item.children);\n } else if (!selectedFlowNodeIds.value?.length && !disableTree.value) {\n setCurrentState(item.menu_flag);\n }\n }\n return items;\n};\nconst queryFlowOrg = async () => {\n const res = await cachedGetApiData(\n 'left_config_flow_org',\n { is_active: true },\n '/approve/query_flow_org_list',\n true,\n { skip_error: true },\n );\n if (res) {\n // 先处理数据,但不立即触发选择\n flowOrgTreeData.value = processFlowOrgTreeData(res.data);\n // 处理完所有数据后再检查localStorage中的值是否有效\n const storedId = settingsState.flowOrgID;\n if (storedId) {\n // 检查存储的ID是否在当前数据中存在且是叶子节点\n let foundStoredItem = flowOrgIDMap[storedId];\n\n if (foundStoredItem) {\n // 存储的ID有效,使用它\n selectedFlowOrgID.value = foundStoredItem.id;\n // 延迟执行以确保DOM更新\n } else {\n // 存储的ID无效,清除存储的值\n localStorage.removeItem('selectedFlowOrgID');\n selectedFlowOrgID.value = firstFlowOrgID;\n }\n } else {\n selectedFlowOrgID.value = firstFlowOrgID;\n }\n setTimeout(() => {\n queryFlowNode(flowOrgIDMap[selectedFlowOrgID.value]);\n }, 0);\n }\n};\n\nconst queryFlowNode = async flow_org => {\n const cache_key = `flow_node_list_${flow_org.id}`;\n const res = await cachedGetApiData(\n cache_key,\n {\n flow_org_id: flow_org.id,\n is_active: true,\n },\n '/approve/query_flow_node_list',\n true,\n { skip_error: true },\n );\n if (res && res.data?.length) {\n flowNodeTreeData.value = [\n {\n isLeaf: false,\n name: flow_org.name,\n id: 0,\n children: processFlowNodeTreeData(cloneDeep(res.data)),\n },\n ];\n } else {\n flowNodeTreeData.value = [];\n }\n};\n\nconst getFlowNodeMap = async () => {\n const res = await cachedGetApiData(\n 'left_config_all_flow_node',\n { is_active: true },\n '/approve/query_flow_node_list',\n false,\n { skip_error: true },\n );\n if (res && res.data?.length) {\n for (const item of res.data) {\n flowNodeFlagMap[item.menu_flag] = item;\n }\n }\n};\nlet onValueSetting = false;\nconst setCurrentState = flag => {\n onValueSetting = true;\n let findNode = false;\n if (flowNodeFlagMap[flag]) {\n const { flow_org_id, menu_flag, name, id } = flowNodeFlagMap[flag];\n const selectNode = { state: menu_flag, name, id };\n settingsState[SET_SELECT_NODE](flow_org_id, selectNode);\n selectedFlowNodeIds.value = [id];\n emit('change', selectNode);\n findNode = true;\n }\n setTimeout(() => {\n onValueSetting = false;\n }, 0);\n return findNode;\n};\nconst flowOrgSelect = (value, node) => {\n flowNodeTreeData.value = [];\n selectedFlowNodeIds.value = [];\n selectedFlowOrgID.value = node.id;\n queryFlowNode(node);\n};\nconst flowNodeSelect = (value, e) => {\n setCurrentState(e.node.menu_flag);\n};\n\nonMounted(async () => {\n await getFlowNodeMap();\n if (!settingsState.selectNode) {\n const path_arr = route.path.split('/');\n const modelType = path_arr[path_arr.length - 1];\n if (!setCurrentState(modelType)) {\n disableTree.value = true;\n emit('change', { id: null, name: route.meta.title, state: modelType });\n } else {\n disableTree.value = false;\n }\n } else {\n selectedFlowNodeIds.value = [settingsState.selectNode.id];\n emit('change', settingsState.selectNode);\n }\n queryFlowOrg();\n});\nonUnmounted(() => {\n settingsState[CLEAR_SELECT_NODE]();\n}),\n watch(\n () => route.path,\n async () => {\n const path_arr = route.path.split('/');\n const modelType = path_arr[path_arr.length - 1];\n if (!setCurrentState(modelType)) {\n disableTree.value = true;\n emit('change', { id: null, name: route.meta.title, state: modelType });\n } else {\n disableTree.value = false;\n }\n },\n );\n\nwatch(\n () => settingsState.selectNode,\n newNode => {\n if (!newNode) {\n return;\n }\n if (disableTree.value) {\n return;\n }\n if (onValueSetting) {\n return;\n }\n if (settingsState.flowOrgID !== selectedFlowOrgID.value) {\n flowNodeTreeData.value = [];\n selectedFlowOrgID.value = settingsState.flowOrgID;\n queryFlowNode(flowOrgIDMap[selectedFlowOrgID.value]);\n }\n setCurrentState(newNode.state);\n },\n {\n deep: true,\n },\n);\n</script>\n<style lang=\"less\" scoped>\n.approve-left-content {\n height: 100%;\n overflow: auto;\n padding: 4px;\n}\n</style>\n","<template>\n <div class=\"approve-left-content\">\n <div class=\"left-item\">\n <a-form layout=\"vertical\">\n <a-form-item label=\"流程组织\">\n <a-tree-select\n :disabled=\"disableTree\"\n v-model:value=\"selectedFlowOrgID\"\n :treeLine=\"{ showLeafIcon: false }\"\n :treeData=\"flowOrgTreeData\"\n :fieldNames=\"{ label: 'name', value: 'id' }\"\n style=\"width: 100%\"\n @select=\"flowOrgSelect\"\n :treeDefaultExpandAll=\"true\"\n ></a-tree-select>\n </a-form-item>\n </a-form>\n </div>\n <div class=\"left-item\">\n <a-tree\n :disabled=\"disableTree\"\n v-model:selectedKeys=\"selectedFlowNodeIds\"\n :treeData=\"flowNodeTreeData\"\n :fieldNames=\"{ title: 'name', key: 'id' }\"\n :defaultExpandAll=\"true\"\n :showLine=\"{ showLeafIcon: false }\"\n :showIcon=\"true\"\n :key=\"selectedFlowOrgID\"\n v-if=\"flowNodeTreeData.length > 0\"\n @select=\"flowNodeSelect\"\n >\n <template #icon=\"node\">\n <component\n v-if=\"node._icon\"\n :is=\"node._icon\"\n />\n </template>\n </a-tree>\n <div v-else>\n <a-empty></a-empty>\n </div>\n </div>\n </div>\n</template>\n<script setup lang=\"ts\">\nimport { cachedGetApiData } from '@/init-plugin';\nimport { onMounted, onUnmounted, ref, watch } from 'vue';\nimport {\n useSettingsStateStore,\n SET_SELECT_NODE,\n CLEAR_SELECT_NODE,\n} from '../../store/settingsState';\nimport { useRoute } from 'vue-router';\nimport { cloneDeep } from 'lodash';\n\nconst flowOrgTreeData = ref<any[]>([]);\nconst flowNodeTreeData = ref<any[]>([]);\nconst selectedFlowOrgID = ref<any>(null);\nlet firstFlowOrgID = null;\nconst flowOrgIDMap = {};\nconst selectedFlowNodeIds = ref<any>([]);\nconst flowNodeFlagMap = {};\nconst settingsState = useSettingsStateStore();\nconst route = useRoute();\nconst emit = defineEmits(['change']);\nconst disableTree = ref(false);\n\nconst processFlowOrgTreeData = (items: any[]) => {\n for (const item of items) {\n flowOrgIDMap[item.id] = item;\n if (item.children && item.children.length > 0) {\n item.selectable = false;\n processFlowOrgTreeData(item.children);\n } else {\n item.selectable = true;\n if (!firstFlowOrgID) {\n firstFlowOrgID = item.id;\n }\n }\n }\n return items;\n};\nconst processFlowNodeTreeData = (items: any[]) => {\n for (const item of items) {\n item._icon = item.icon;\n delete item.icon;\n if (item.children && item.children.length > 0) {\n processFlowNodeTreeData(item.children);\n } else if (!selectedFlowNodeIds.value?.length && !disableTree.value) {\n setCurrentState(item.menu_flag);\n }\n }\n return items;\n};\nconst queryFlowOrg = async () => {\n const res = await cachedGetApiData(\n 'left_config_flow_org',\n { is_active: true },\n '/approve/query_flow_org_list',\n true,\n { skip_error: true },\n );\n if (res) {\n // 先处理数据,但不立即触发选择\n flowOrgTreeData.value = processFlowOrgTreeData(res.data);\n // 处理完所有数据后再检查localStorage中的值是否有效\n const storedId = settingsState.flowOrgID;\n if (storedId) {\n // 检查存储的ID是否在当前数据中存在且是叶子节点\n let foundStoredItem = flowOrgIDMap[storedId];\n\n if (foundStoredItem) {\n // 存储的ID有效,使用它\n selectedFlowOrgID.value = foundStoredItem.id;\n // 延迟执行以确保DOM更新\n } else {\n // 存储的ID无效,清除存储的值\n localStorage.removeItem('selectedFlowOrgID');\n selectedFlowOrgID.value = firstFlowOrgID;\n }\n } else {\n selectedFlowOrgID.value = firstFlowOrgID;\n }\n setTimeout(() => {\n queryFlowNode(flowOrgIDMap[selectedFlowOrgID.value]);\n }, 0);\n }\n};\n\nconst queryFlowNode = async flow_org => {\n const cache_key = `flow_node_list_${flow_org.id}`;\n const res = await cachedGetApiData(\n cache_key,\n {\n flow_org_id: flow_org.id,\n is_active: true,\n },\n '/approve/query_flow_node_list',\n true,\n { skip_error: true },\n );\n if (res && res.data?.length) {\n flowNodeTreeData.value = [\n {\n isLeaf: false,\n name: flow_org.name,\n id: 0,\n children: processFlowNodeTreeData(cloneDeep(res.data)),\n },\n ];\n } else {\n flowNodeTreeData.value = [];\n }\n};\n\nconst getFlowNodeMap = async () => {\n const res = await cachedGetApiData(\n 'left_config_all_flow_node',\n { is_active: true },\n '/approve/query_flow_node_list',\n false,\n { skip_error: true },\n );\n if (res && res.data?.length) {\n for (const item of res.data) {\n flowNodeFlagMap[item.menu_flag] = item;\n }\n }\n};\nlet onValueSetting = false;\nconst setCurrentState = flag => {\n onValueSetting = true;\n let findNode = false;\n if (flowNodeFlagMap[flag]) {\n const { flow_org_id, menu_flag, name, id } = flowNodeFlagMap[flag];\n const selectNode = { state: menu_flag, name, id };\n settingsState[SET_SELECT_NODE](flow_org_id, selectNode);\n selectedFlowNodeIds.value = [id];\n emit('change', selectNode);\n findNode = true;\n }\n setTimeout(() => {\n onValueSetting = false;\n }, 0);\n return findNode;\n};\nconst flowOrgSelect = (value, node) => {\n flowNodeTreeData.value = [];\n selectedFlowNodeIds.value = [];\n selectedFlowOrgID.value = node.id;\n queryFlowNode(node);\n};\nconst flowNodeSelect = (value, e) => {\n setCurrentState(e.node.menu_flag);\n};\n\nonMounted(async () => {\n await getFlowNodeMap();\n if (!settingsState.selectNode) {\n const path_arr = route.path.split('/');\n const modelType = path_arr[path_arr.length - 1];\n if (!setCurrentState(modelType)) {\n disableTree.value = true;\n emit('change', { id: null, name: route.meta.title, state: modelType });\n } else {\n disableTree.value = false;\n }\n } else {\n selectedFlowNodeIds.value = [settingsState.selectNode.id];\n emit('change', settingsState.selectNode);\n }\n queryFlowOrg();\n});\nonUnmounted(() => {\n settingsState[CLEAR_SELECT_NODE]();\n}),\n watch(\n () => route.path,\n async () => {\n const path_arr = route.path.split('/');\n const modelType = path_arr[path_arr.length - 1];\n if (!setCurrentState(modelType)) {\n disableTree.value = true;\n emit('change', { id: null, name: route.meta.title, state: modelType });\n } else {\n disableTree.value = false;\n }\n },\n );\n\nwatch(\n () => settingsState.selectNode,\n newNode => {\n if (!newNode) {\n return;\n }\n if (disableTree.value) {\n return;\n }\n if (onValueSetting) {\n return;\n }\n if (settingsState.flowOrgID !== selectedFlowOrgID.value) {\n flowNodeTreeData.value = [];\n selectedFlowOrgID.value = settingsState.flowOrgID;\n queryFlowNode(flowOrgIDMap[selectedFlowOrgID.value]);\n }\n setCurrentState(newNode.state);\n },\n {\n deep: true,\n },\n);\n</script>\n<style lang=\"less\" scoped>\n.approve-left-content {\n height: 100%;\n overflow: auto;\n padding: 4px;\n}\n</style>\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codeHistoryViewModal-BfSjIbEU.js","names":[],"sources":["../src/components/approval/components/codeHistory/codeHistoryViewModal.vue","../src/components/approval/components/codeHistory/codeHistoryViewModal.vue"],"sourcesContent":["<template>\n <a-modal\n :open=\"true\"\n :title=\"$t('历史版本')\"\n width=\"100%\"\n wrap-class-name=\"full-modal\"\n @cancel=\"handleCancel\"\n >\n <template #footer></template>\n <a-tabs\n type=\"card\"\n size=\"middle\"\n class=\"tab-content\"\n >\n <a-tab-pane\n :key=\"0\"\n v-if=\"history_ids.length === 2\"\n :tab=\"$t('版本比较')\"\n >\n <TextDiff\n :left=\"history_records[0] || {}\"\n :right=\"history_records[1] || {}\"\n />\n </a-tab-pane>\n <a-tab-pane\n v-for=\"record in history_records\"\n :tab=\"record.name\"\n :key=\"record.name\"\n >\n <div class=\"json-obj-container\">\n <code-editor\n :editorValue=\"record.content\"\n mode=\"javascript\"\n :lineWrapping=\"true\"\n />\n </div>\n </a-tab-pane>\n </a-tabs>\n </a-modal>\n</template>\n<script lang=\"ts\">\nimport { defineComponent, onMounted, PropType, ref } from 'vue';\nimport { getApiData } from '@/init-plugin';\nexport default defineComponent({\n name: 'codeHistoryViewModal',\n props: {\n height: {\n type: Number,\n default: () => 1000,\n },\n history_ids: {\n type: Array as PropType<string[]>,\n default: () => [],\n },\n },\n components: {\n },\n emits: ['ok', 'cancel'],\n\n setup(props, { emit }) {\n const handleCancel = () => {\n emit('cancel');\n };\n const handleOk = () => {};\n const loading = ref(false);\n const history_records = ref([]);\n const getHistoryRecords = async () => {\n const conditions = [\n {\n field_name: 'id',\n operator: 'in',\n value: props.history_ids,\n format: 'input',\n class_name: 'str',\n },\n ];\n const queryParams = {\n is_pagination: false,\n column_fields: ['id', 'create_time', 'code'],\n sort_fields: ['-id'],\n conditions: [conditions],\n };\n getApiData(queryParams, '/approve/query_action_code_setting_history_list')\n .then((res: any) => {\n const tmpMap = {};\n loading.value = true;\n res.data.forEach((item: any) => {\n tmpMap[item.id] = {\n name: `[${item.id}]${item.create_time}`,\n content: item.code,\n };\n });\n history_records.value.length = 0;\n props.history_ids.forEach(id => {\n history_records.value.push(tmpMap[id]);\n });\n loading.value = false;\n })\n .catch(() => {\n loading.value = false;\n });\n };\n onMounted(() => {\n getHistoryRecords();\n });\n return {\n handleCancel,\n handleOk,\n loading,\n history_records,\n };\n },\n});\n</script>\n<style scoped lang=\"less\">\n.ant-layout-content,\n.ant-layout-sider {\n overflow: auto;\n background-color: white;\n outline: 1px #ebeef5 solid;\n}\n.tab-content {\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n.ant-tabs {\n height: 100%;\n\n ::v-deep(.ant-tabs-content-top) {\n height: 100%;\n }\n}\n.json-obj-container {\n height: 100%;\n overflow-y: auto;\n}\n</style>\n","<template>\n <a-modal\n :open=\"true\"\n :title=\"$t('历史版本')\"\n width=\"100%\"\n wrap-class-name=\"full-modal\"\n @cancel=\"handleCancel\"\n >\n <template #footer></template>\n <a-tabs\n type=\"card\"\n size=\"middle\"\n class=\"tab-content\"\n >\n <a-tab-pane\n :key=\"0\"\n v-if=\"history_ids.length === 2\"\n :tab=\"$t('版本比较')\"\n >\n <TextDiff\n :left=\"history_records[0] || {}\"\n :right=\"history_records[1] || {}\"\n />\n </a-tab-pane>\n <a-tab-pane\n v-for=\"record in history_records\"\n :tab=\"record.name\"\n :key=\"record.name\"\n >\n <div class=\"json-obj-container\">\n <code-editor\n :editorValue=\"record.content\"\n mode=\"javascript\"\n :lineWrapping=\"true\"\n />\n </div>\n </a-tab-pane>\n </a-tabs>\n </a-modal>\n</template>\n<script lang=\"ts\">\nimport { defineComponent, onMounted, PropType, ref } from 'vue';\nimport { getApiData } from '@/init-plugin';\nexport default defineComponent({\n name: 'codeHistoryViewModal',\n props: {\n height: {\n type: Number,\n default: () => 1000,\n },\n history_ids: {\n type: Array as PropType<string[]>,\n default: () => [],\n },\n },\n components: {\n },\n emits: ['ok', 'cancel'],\n\n setup(props, { emit }) {\n const handleCancel = () => {\n emit('cancel');\n };\n const handleOk = () => {};\n const loading = ref(false);\n const history_records = ref([]);\n const getHistoryRecords = async () => {\n const conditions = [\n {\n field_name: 'id',\n operator: 'in',\n value: props.history_ids,\n format: 'input',\n class_name: 'str',\n },\n ];\n const queryParams = {\n is_pagination: false,\n column_fields: ['id', 'create_time', 'code'],\n sort_fields: ['-id'],\n conditions: [conditions],\n };\n getApiData(queryParams, '/approve/query_action_code_setting_history_list')\n .then((res: any) => {\n const tmpMap = {};\n loading.value = true;\n res.data.forEach((item: any) => {\n tmpMap[item.id] = {\n name: `[${item.id}]${item.create_time}`,\n content: item.code,\n };\n });\n history_records.value.length = 0;\n props.history_ids.forEach(id => {\n history_records.value.push(tmpMap[id]);\n });\n loading.value = false;\n })\n .catch(() => {\n loading.value = false;\n });\n };\n onMounted(() => {\n getHistoryRecords();\n });\n return {\n handleCancel,\n handleOk,\n loading,\n history_records,\n };\n },\n});\n</script>\n<style scoped lang=\"less\">\n.ant-layout-content,\n.ant-layout-sider {\n overflow: auto;\n background-color: white;\n outline: 1px #ebeef5 solid;\n}\n.tab-content {\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n.ant-tabs {\n height: 100%;\n\n ::v-deep(.ant-tabs-content-top) {\n height: 100%;\n }\n}\n.json-obj-container {\n height: 100%;\n overflow-y: auto;\n}\n</style>\n"],"mappings":";;;AA2CA,IAAA,IAAe,EAAgB;CAC7B,MAAM;CACN,OAAO;EACL,QAAQ;GACN,MAAM;GACN,eAAe;GAChB;EACD,aAAa;GACX,MAAM;GACN,eAAe,EAAE;GAClB;EACF;CACD,YAAY,EACX;CACD,OAAO,CAAC,MAAM,SAAS;CAEvB,MAAM,GAAO,EAAE,WAAQ;EACrB,IAAM,UAAqB;AACzB,KAAK,SAAS;KAEV,UAAiB,IACjB,IAAU,EAAI,GAAM,EACpB,IAAkB,EAAI,EAAE,CAAC,EACzB,IAAoB,YAAY;AAgBpC,KANoB;IAClB,eAAe;IACf,eAAe;KAAC;KAAM;KAAe;KAAO;IAC5C,aAAa,CAAC,MAAM;IACpB,YAAY,CAbK,CACjB;KACE,YAAY;KACZ,UAAU;KACV,OAAO,EAAM;KACb,QAAQ;KACR,YAAY;KACb,CACF,CAKyB;IACzB,EACuB,kDAAiD,CACtE,MAAM,MAAa;IAClB,IAAM,IAAS,EAAE;AAYjB,IAXA,EAAQ,QAAQ,IAChB,EAAI,KAAK,SAAS,MAAc;AAC9B,OAAO,EAAK,MAAM;MAChB,MAAM,IAAI,EAAK,GAAG,GAAG,EAAK;MAC1B,SAAS,EAAK;MACf;MACD,EACF,EAAgB,MAAM,SAAS,GAC/B,EAAM,YAAY,SAAQ,MAAM;AAC9B,OAAgB,MAAM,KAAK,EAAO,GAAI;MACtC,EACF,EAAQ,QAAQ;KACjB,CACA,YAAY;AACX,MAAQ,QAAQ;KAChB;;AAKN,SAHA,QAAgB;AACd,MAAmB;IACnB,EACK;GACL;GACA;GACA;GACA;GACD;;CAEJ,CAAC,QCnFW,OAAM,sBAAoB;;;aA5BrC,EAqCU,GAAA;EApCP,MAAM;EACN,OAAO,EAAA,GAAE,OAAA;EACV,OAAM;EACN,mBAAgB;EACf,UAAQ,EAAA;;EAEE,QAAM,QAAY,CAAA,GAAA,AAAA,EAAA,OAAA,EAAA,CAAA,CAAA;mBA6BpB,CA5BT,EA4BS,GAAA;GA3BP,MAAK;GACL,MAAK;GACL,OAAM;;oBAWO,CAPL,EAAA,YAAY,WAAM,KAAA,GAAA,EAF1B,EASa,GAAA;IARV,KAAK;IAEL,KAAK,EAAA,GAAE,OAAA;;qBAKN,CAHF,EAGE,GAAA;KAFC,MAAM,EAAA,gBAAe,MAAA,EAAA;KACrB,OAAO,EAAA,gBAAe,MAAA,EAAA;;;wCAG3B,EAYa,GAAA,MAAA,EAXM,EAAA,kBAAV,YADT,EAYa,GAAA;IAVV,KAAK,EAAO;IACZ,KAAK,EAAO;;qBAQP,CANN,EAMM,OANN,GAMM,CALJ,EAIE,GAAA;KAHC,aAAa,EAAO;KACrB,MAAK;KACJ,cAAc"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"columnTables-DLwtgcC7.js","names":[],"sources":["../src/components/approval/components/searchSummary.vue","../src/components/approval/components/searchSummary.vue","../src/components/approval/components/search.vue","../src/components/approval/components/search.vue","../src/components/approval/store/context.ts","../src/components/approval/components/actionsBar.vue","../src/components/approval/components/actionsBar.vue","../src/components/approval/components/table.vue","../src/components/approval/components/table.vue","../src/components/approval/components/columnTables.vue","../src/components/approval/components/columnTables.vue"],"sourcesContent":["<template>\n <span class=\"search-summary\">\n <a-tag\n v-for=\"item in dataSource\"\n :key=\"item.field_name\"\n color=\"green\"\n closable\n @close=\"handleClose(item.field_name)\"\n >\n {{ item.summary }}\n </a-tag>\n <a-button\n size=\"small\"\n type=\"text\"\n @click=\"handleRefresh\"\n >\n <RedoOutlined />\n </a-button>\n </span>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onMounted, ref, computed } from 'vue';\nimport { Condition, SearchConfig } from '../typing';\nimport { useOperatorTypeMap, options_for_date_eq } from '../utils';\nimport { isEmpty, isNotEmpty } from '@/utils/function';\nimport { useI18n } from 'vue-i18n';\nimport moment from 'moment';\nexport default defineComponent({\n name: 'searchSummary',\n props: {\n searchConfig: {\n type: Array<SearchConfig>,\n required: true,\n },\n searchConditions: {\n type: Array<Condition>,\n required: true,\n },\n eventBus: {\n type: Object as any,\n required: false,\n },\n },\n emits: ['update:searchConditions'],\n\n setup(props, { emit }) {\n const operator_type_map = useOperatorTypeMap();\n const { t } = useI18n();\n const transferValue = (configItem, operator, value) => {\n const str_list: any = [];\n let transfer_value;\n if (operator === 'is_or_not_blank_or_null' || operator === 'is_or_not_null') {\n if (value === 'yes') {\n return t('is_or_not_blank_or_null.yes');\n } else {\n return t('is_or_not_blank_or_null.no');\n }\n } else if (operator === '_eq') {\n if (['上月', '本月', '今日', '昨日', '期初'].includes(value)) {\n return t(value);\n }\n } else if (configItem.options instanceof Array) {\n if (value instanceof Array) {\n value.forEach(item => {\n configItem.options.forEach(i => {\n if (item == i.value) {\n str_list.push(i.label);\n }\n });\n });\n return `${operator_type_map[operator]} ${str_list.join(',')}`;\n } else {\n configItem.options.forEach(i => {\n if (value == i.value) {\n transfer_value = i.label;\n }\n });\n return `${operator_type_map[operator]} ${transfer_value}`;\n }\n } else if (configItem.type == 'monthpicker' && configItem.dateFormat) {\n if (value instanceof Array) {\n const str_list = [];\n value.forEach(i => {\n if (i) {\n str_list.push(moment(i).format(configItem.dateFormat));\n } else {\n str_list.push(i);\n }\n });\n transfer_value = str_list.join(',');\n } else {\n transfer_value = moment(value).format(configItem.dateFormat);\n }\n return `${operator_type_map[operator]} ${transfer_value}`;\n } else {\n return `${operator_type_map[operator]} ${value}`;\n }\n };\n const dataSource = computed(() => {\n const searchConditionsMap = {};\n for (const condition of props.searchConditions) {\n searchConditionsMap[condition.field_name] = {\n value: condition.value,\n operator: condition.operator,\n };\n }\n return props.searchConfig\n ?.map(configItem => {\n const data = searchConditionsMap[configItem.field_name] || {\n operator: configItem.default_operator || 'eq',\n value: null,\n };\n let summary = null;\n if (\n data.value instanceof Array &&\n data.value.length > 0 &&\n !data.value.some(item => isEmpty(item))\n ) {\n summary = `${configItem.label}: ${transferValue(\n configItem,\n data.operator,\n data.value,\n )}`;\n }\n return {\n field_name: configItem.field_name,\n summary,\n };\n })\n .filter(item => item.summary);\n });\n const handleClose = (fieldName: string) => {\n emit(\n 'update:searchConditions',\n props.searchConditions.filter(item => item.field_name !== fieldName),\n );\n };\n const handleRefresh = () => {\n props.eventBus.emit('refresh');\n };\n\n return { dataSource, handleClose, handleRefresh };\n },\n components: {},\n});\n</script>\n<style lang=\"less\" scoped>\n.search-summary {\n display: inline-block;\n padding: 4px 2px;\n}\n</style>\n","<template>\n <span class=\"search-summary\">\n <a-tag\n v-for=\"item in dataSource\"\n :key=\"item.field_name\"\n color=\"green\"\n closable\n @close=\"handleClose(item.field_name)\"\n >\n {{ item.summary }}\n </a-tag>\n <a-button\n size=\"small\"\n type=\"text\"\n @click=\"handleRefresh\"\n >\n <RedoOutlined />\n </a-button>\n </span>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onMounted, ref, computed } from 'vue';\nimport { Condition, SearchConfig } from '../typing';\nimport { useOperatorTypeMap, options_for_date_eq } from '../utils';\nimport { isEmpty, isNotEmpty } from '@/utils/function';\nimport { useI18n } from 'vue-i18n';\nimport moment from 'moment';\nexport default defineComponent({\n name: 'searchSummary',\n props: {\n searchConfig: {\n type: Array<SearchConfig>,\n required: true,\n },\n searchConditions: {\n type: Array<Condition>,\n required: true,\n },\n eventBus: {\n type: Object as any,\n required: false,\n },\n },\n emits: ['update:searchConditions'],\n\n setup(props, { emit }) {\n const operator_type_map = useOperatorTypeMap();\n const { t } = useI18n();\n const transferValue = (configItem, operator, value) => {\n const str_list: any = [];\n let transfer_value;\n if (operator === 'is_or_not_blank_or_null' || operator === 'is_or_not_null') {\n if (value === 'yes') {\n return t('is_or_not_blank_or_null.yes');\n } else {\n return t('is_or_not_blank_or_null.no');\n }\n } else if (operator === '_eq') {\n if (['上月', '本月', '今日', '昨日', '期初'].includes(value)) {\n return t(value);\n }\n } else if (configItem.options instanceof Array) {\n if (value instanceof Array) {\n value.forEach(item => {\n configItem.options.forEach(i => {\n if (item == i.value) {\n str_list.push(i.label);\n }\n });\n });\n return `${operator_type_map[operator]} ${str_list.join(',')}`;\n } else {\n configItem.options.forEach(i => {\n if (value == i.value) {\n transfer_value = i.label;\n }\n });\n return `${operator_type_map[operator]} ${transfer_value}`;\n }\n } else if (configItem.type == 'monthpicker' && configItem.dateFormat) {\n if (value instanceof Array) {\n const str_list = [];\n value.forEach(i => {\n if (i) {\n str_list.push(moment(i).format(configItem.dateFormat));\n } else {\n str_list.push(i);\n }\n });\n transfer_value = str_list.join(',');\n } else {\n transfer_value = moment(value).format(configItem.dateFormat);\n }\n return `${operator_type_map[operator]} ${transfer_value}`;\n } else {\n return `${operator_type_map[operator]} ${value}`;\n }\n };\n const dataSource = computed(() => {\n const searchConditionsMap = {};\n for (const condition of props.searchConditions) {\n searchConditionsMap[condition.field_name] = {\n value: condition.value,\n operator: condition.operator,\n };\n }\n return props.searchConfig\n ?.map(configItem => {\n const data = searchConditionsMap[configItem.field_name] || {\n operator: configItem.default_operator || 'eq',\n value: null,\n };\n let summary = null;\n if (\n data.value instanceof Array &&\n data.value.length > 0 &&\n !data.value.some(item => isEmpty(item))\n ) {\n summary = `${configItem.label}: ${transferValue(\n configItem,\n data.operator,\n data.value,\n )}`;\n }\n return {\n field_name: configItem.field_name,\n summary,\n };\n })\n .filter(item => item.summary);\n });\n const handleClose = (fieldName: string) => {\n emit(\n 'update:searchConditions',\n props.searchConditions.filter(item => item.field_name !== fieldName),\n );\n };\n const handleRefresh = () => {\n props.eventBus.emit('refresh');\n };\n\n return { dataSource, handleClose, handleRefresh };\n },\n components: {},\n});\n</script>\n<style lang=\"less\" scoped>\n.search-summary {\n display: inline-block;\n padding: 4px 2px;\n}\n</style>\n","<template>\n <span class=\"search-switch\">\n <a-button\n v-if=\"!isShowForm\"\n type=\"link\"\n size=\"small\"\n @click=\"isShowForm = true\"\n >\n <span class=\"expand-btn\">{{ $t('展开') }}</span>\n </a-button>\n <a-button\n v-else\n type=\"link\"\n size=\"small\"\n @click=\"isShowForm = false\"\n >\n {{ $t('隐藏') }}\n </a-button>\n </span>\n <search-summary\n v-if=\"!isShowForm\"\n :search-conditions=\"searchConditions\"\n :search-config=\"searchConfig\"\n :event-bus=\"eventBus\"\n @update:searchConditions=\"handleUpdateSearchConditions\"\n />\n <template v-if=\"isShowForm\">\n <a-form layout=\"inline\">\n <a-form-item\n v-for=\"(condition, k) in dataSource\"\n :key=\"condition.field_name\"\n :label=\"condition.label\"\n >\n <a-input-group\n compact\n size=\"small\"\n >\n <a-select\n v-if=\"condition.operator_list.length > 0\"\n :dropdownMatchSelectWidth=\"false\"\n :value=\"condition.operator\"\n @change=\"onChange(condition.field_name, 'operator', $event)\"\n size=\"small\"\n >\n <a-select-option\n v-for=\"item in condition.operator_list\"\n :value=\"item\"\n :key=\"item\"\n >\n {{ operator_type_map[item] }}\n </a-select-option>\n </a-select>\n <template\n v-if=\"['is_or_not_blank_or_null', 'is_or_not_null'].includes(condition.operator)\"\n >\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{\n ...condition,\n type: 'select',\n mode: 'default',\n format: 'choices',\n class_name: 'str',\n placeholder: '',\n }\"\n :formModel=\"formModel\"\n :options=\"is_or_not_blank_or_null_options\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template v-else-if=\"['input'].includes(condition.format)\">\n <template\n v-if=\"condition.operator === 'between' || condition.operator === 'notbetween'\"\n >\n <template v-if=\"condition.type === 'datepicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{ ...condition, type: 'rangepicker', format: condition.dateFormat }\"\n :formModel=\"formModel\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template v-else-if=\"condition.type === 'monthpicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{\n ...condition,\n type: 'monthrangepicker',\n }\"\n :formModel=\"formModel\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template v-else>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"condition.value?.[0]\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"70\"\n @update:value=\"onChange(condition.field_name, 'value', $event, 0)\"\n />\n <span class=\"range\">~</span>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"condition.value?.[1]\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"70\"\n @update:value=\"onChange(condition.field_name, 'value', $event, 1)\"\n />\n </template>\n </template>\n <template v-else-if=\"condition.operator === '_eq'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{\n ...condition,\n type: 'select',\n mode: 'default',\n format: 'choices',\n class_name: 'str',\n placeholder: '',\n }\"\n :formModel=\"formModel\"\n :options=\"options_for_date_eq\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template\n v-else-if=\"condition.type === 'datepicker' || condition.type === 'monthpicker'\"\n >\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{ ...condition, format: condition.dateFormat }\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template v-else>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n </template>\n <template v-else-if=\"['choices', 'remote'].includes(condition.format)\">\n <template v-if=\"condition.format === 'choices'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template v-else-if=\"condition.format === 'remote'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{ ...condition, name: condition?.field_name }\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n </template>\n </a-input-group>\n </a-form-item>\n </a-form>\n <div class=\"btn-content\">\n <a-button\n size=\"small\"\n type=\"primary\"\n @click=\"handleRefresh\"\n >\n 查询\n </a-button>\n </div>\n </template>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, onMounted, ref } from 'vue';\nimport searchSummary from './searchSummary.vue';\nimport { Condition, SearchConfig } from '../typing';\nimport { cloneDeep, cond } from 'lodash';\nimport { useI18n } from 'vue-i18n';\n// @ts-ignore\nimport { useOperatorTypeMap, options_for_date_eq, getParamsCount } from '../utils';\nimport { isEmpty, isNotEmpty } from '@/utils/function';\nexport default defineComponent({\n name: 'Search',\n props: {\n searchConfig: {\n type: Array<SearchConfig>,\n required: true,\n },\n searchConditions: {\n type: Array<Condition>,\n required: true,\n },\n eventBus: {\n type: Object as any,\n required: false,\n },\n },\n emits: ['update:searchConditions'],\n\n setup(props, { emit }) {\n const operator_type_map = useOperatorTypeMap();\n const { t } = useI18n();\n const isShowForm = ref(true);\n const searchModel = ref({});\n const formModel = ref({});\n const validateInfos = ref({});\n\n const is_or_not_blank_or_null_options = ref([\n { value: 'yes', label: t('is_or_not_blank_or_null.yes') },\n { value: 'no', label: t('is_or_not_blank_or_null.no') },\n ]);\n\n const dataSource = computed(() => {\n const searchConditionsMap = {};\n for (const condition of props.searchConditions) {\n searchConditionsMap[condition.field_name] = {\n value: condition.value,\n operator: condition.operator,\n };\n }\n return props.searchConfig?.map(configItem => {\n const data = searchConditionsMap[configItem.field_name] || {\n operator: configItem.default_operator || 'eq',\n value: null,\n };\n let formValue = data.value;\n if (isNotEmpty(data.value)) {\n const paramsCount = getParamsCount(data.operator, configItem);\n if (paramsCount === 1 && formValue instanceof Array) {\n formValue = formValue[0];\n }\n }\n formModel.value[configItem.field_name] = formValue;\n return {\n ...configItem,\n value: data.value,\n operator: data.operator,\n model: 'default',\n };\n });\n });\n const getValue = configItemAndValue => {\n const value_count = getParamsCount(configItemAndValue.operator, configItemAndValue);\n let value = configItemAndValue.value;\n if (value_count == 1) {\n if (value instanceof Array) {\n return value[0] || undefined;\n } else {\n return value || undefined;\n }\n } else if (value_count == 2) {\n if (value instanceof Array) {\n const [first, seconds] = value;\n return [first, seconds];\n } else if (value) {\n const first = value;\n return [first, null];\n } else {\n return [null, null];\n }\n } else {\n return value;\n }\n };\n const onChange = (\n field_name: string,\n type: 'value' | 'operator',\n newValue: any,\n array_index: number | undefined = undefined,\n ) => {\n const conditions = cloneDeep(props.searchConditions);\n const configItem = props.searchConfig.find(item => item.field_name === field_name);\n let value;\n let operator;\n let condition = conditions.find(item => item.field_name === field_name);\n if (type === 'value') {\n if (condition) {\n operator = condition.operator;\n } else {\n operator = configItem?.default_operator || 'eq';\n }\n if (array_index !== undefined) {\n const value_count = getParamsCount(newValue, configItem);\n if (condition) {\n value = condition.value;\n if (isEmpty(value) || !(value instanceof Array)) {\n value = [];\n for (let i = 0; i < value_count; i++) {\n value.push(null);\n }\n }\n value[array_index] = newValue;\n } else {\n value = [];\n for (let i = 0; i < value_count; i++) {\n value.push(null);\n }\n value[array_index] = newValue;\n }\n } else {\n if (isNotEmpty(newValue) && !(newValue instanceof Array)) {\n newValue = [newValue];\n }\n value = newValue;\n }\n } else if (type === 'operator') {\n operator = newValue;\n const value_count = getParamsCount(newValue, configItem);\n if (value_count) {\n value = [];\n for (let i = 0; i < value_count; i++) {\n value.push(null);\n }\n } else {\n value = undefined;\n }\n }\n if (condition) {\n condition.operator = operator;\n condition.value = value;\n } else {\n let format = 'input';\n let class_name = 'str';\n if (configItem) {\n format = configItem.format || 'input';\n class_name = configItem.class_name || 'str';\n }\n condition = {\n field_name: field_name,\n value,\n operator,\n format,\n class_name,\n };\n conditions.push(condition);\n }\n emit('update:searchConditions', conditions);\n };\n const handleUpdateSearchConditions = (newConditions: Condition[]) => {\n emit('update:searchConditions', newConditions);\n };\n const handleRefresh = () => {\n props.eventBus.emit('refresh');\n };\n return {\n isShowForm,\n searchModel,\n dataSource,\n onChange,\n operator_type_map,\n formModel,\n is_or_not_blank_or_null_options,\n validateInfos,\n options_for_date_eq,\n handleUpdateSearchConditions,\n handleRefresh,\n getValue,\n };\n },\n components: {\n searchSummary,\n },\n});\n</script>\n<style lang=\"less\" scoped>\n.card {\n overflow: auto;\n max-height: 300px;\n background: #f2f5f7;\n}\n\n.condition-group {\n padding: 5px;\n}\n\n.close-icon {\n width: 15px;\n margin-top: 5px;\n margin-left: 5px;\n color: red;\n}\n\n.search-bar {\n background: #f2f5f7;\n text-align: right;\n}\n\n:deep(.divider .ant-divider) {\n margin: 0;\n}\n.btn-content {\n display: flex;\n justify-content: flex-end;\n padding: 4px;\n}\n.search-switch {\n display: inline-block;\n line-height: 32px;\n height: 32px;\n}\n</style>\n","<template>\n <span class=\"search-switch\">\n <a-button\n v-if=\"!isShowForm\"\n type=\"link\"\n size=\"small\"\n @click=\"isShowForm = true\"\n >\n <span class=\"expand-btn\">{{ $t('展开') }}</span>\n </a-button>\n <a-button\n v-else\n type=\"link\"\n size=\"small\"\n @click=\"isShowForm = false\"\n >\n {{ $t('隐藏') }}\n </a-button>\n </span>\n <search-summary\n v-if=\"!isShowForm\"\n :search-conditions=\"searchConditions\"\n :search-config=\"searchConfig\"\n :event-bus=\"eventBus\"\n @update:searchConditions=\"handleUpdateSearchConditions\"\n />\n <template v-if=\"isShowForm\">\n <a-form layout=\"inline\">\n <a-form-item\n v-for=\"(condition, k) in dataSource\"\n :key=\"condition.field_name\"\n :label=\"condition.label\"\n >\n <a-input-group\n compact\n size=\"small\"\n >\n <a-select\n v-if=\"condition.operator_list.length > 0\"\n :dropdownMatchSelectWidth=\"false\"\n :value=\"condition.operator\"\n @change=\"onChange(condition.field_name, 'operator', $event)\"\n size=\"small\"\n >\n <a-select-option\n v-for=\"item in condition.operator_list\"\n :value=\"item\"\n :key=\"item\"\n >\n {{ operator_type_map[item] }}\n </a-select-option>\n </a-select>\n <template\n v-if=\"['is_or_not_blank_or_null', 'is_or_not_null'].includes(condition.operator)\"\n >\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{\n ...condition,\n type: 'select',\n mode: 'default',\n format: 'choices',\n class_name: 'str',\n placeholder: '',\n }\"\n :formModel=\"formModel\"\n :options=\"is_or_not_blank_or_null_options\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template v-else-if=\"['input'].includes(condition.format)\">\n <template\n v-if=\"condition.operator === 'between' || condition.operator === 'notbetween'\"\n >\n <template v-if=\"condition.type === 'datepicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{ ...condition, type: 'rangepicker', format: condition.dateFormat }\"\n :formModel=\"formModel\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template v-else-if=\"condition.type === 'monthpicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{\n ...condition,\n type: 'monthrangepicker',\n }\"\n :formModel=\"formModel\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template v-else>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"condition.value?.[0]\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"70\"\n @update:value=\"onChange(condition.field_name, 'value', $event, 0)\"\n />\n <span class=\"range\">~</span>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"condition.value?.[1]\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"70\"\n @update:value=\"onChange(condition.field_name, 'value', $event, 1)\"\n />\n </template>\n </template>\n <template v-else-if=\"condition.operator === '_eq'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{\n ...condition,\n type: 'select',\n mode: 'default',\n format: 'choices',\n class_name: 'str',\n placeholder: '',\n }\"\n :formModel=\"formModel\"\n :options=\"options_for_date_eq\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template\n v-else-if=\"condition.type === 'datepicker' || condition.type === 'monthpicker'\"\n >\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{ ...condition, format: condition.dateFormat }\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template v-else>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n </template>\n <template v-else-if=\"['choices', 'remote'].includes(condition.format)\">\n <template v-if=\"condition.format === 'choices'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template v-else-if=\"condition.format === 'remote'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{ ...condition, name: condition?.field_name }\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n </template>\n </a-input-group>\n </a-form-item>\n </a-form>\n <div class=\"btn-content\">\n <a-button\n size=\"small\"\n type=\"primary\"\n @click=\"handleRefresh\"\n >\n 查询\n </a-button>\n </div>\n </template>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, onMounted, ref } from 'vue';\nimport searchSummary from './searchSummary.vue';\nimport { Condition, SearchConfig } from '../typing';\nimport { cloneDeep, cond } from 'lodash';\nimport { useI18n } from 'vue-i18n';\n// @ts-ignore\nimport { useOperatorTypeMap, options_for_date_eq, getParamsCount } from '../utils';\nimport { isEmpty, isNotEmpty } from '@/utils/function';\nexport default defineComponent({\n name: 'Search',\n props: {\n searchConfig: {\n type: Array<SearchConfig>,\n required: true,\n },\n searchConditions: {\n type: Array<Condition>,\n required: true,\n },\n eventBus: {\n type: Object as any,\n required: false,\n },\n },\n emits: ['update:searchConditions'],\n\n setup(props, { emit }) {\n const operator_type_map = useOperatorTypeMap();\n const { t } = useI18n();\n const isShowForm = ref(true);\n const searchModel = ref({});\n const formModel = ref({});\n const validateInfos = ref({});\n\n const is_or_not_blank_or_null_options = ref([\n { value: 'yes', label: t('is_or_not_blank_or_null.yes') },\n { value: 'no', label: t('is_or_not_blank_or_null.no') },\n ]);\n\n const dataSource = computed(() => {\n const searchConditionsMap = {};\n for (const condition of props.searchConditions) {\n searchConditionsMap[condition.field_name] = {\n value: condition.value,\n operator: condition.operator,\n };\n }\n return props.searchConfig?.map(configItem => {\n const data = searchConditionsMap[configItem.field_name] || {\n operator: configItem.default_operator || 'eq',\n value: null,\n };\n let formValue = data.value;\n if (isNotEmpty(data.value)) {\n const paramsCount = getParamsCount(data.operator, configItem);\n if (paramsCount === 1 && formValue instanceof Array) {\n formValue = formValue[0];\n }\n }\n formModel.value[configItem.field_name] = formValue;\n return {\n ...configItem,\n value: data.value,\n operator: data.operator,\n model: 'default',\n };\n });\n });\n const getValue = configItemAndValue => {\n const value_count = getParamsCount(configItemAndValue.operator, configItemAndValue);\n let value = configItemAndValue.value;\n if (value_count == 1) {\n if (value instanceof Array) {\n return value[0] || undefined;\n } else {\n return value || undefined;\n }\n } else if (value_count == 2) {\n if (value instanceof Array) {\n const [first, seconds] = value;\n return [first, seconds];\n } else if (value) {\n const first = value;\n return [first, null];\n } else {\n return [null, null];\n }\n } else {\n return value;\n }\n };\n const onChange = (\n field_name: string,\n type: 'value' | 'operator',\n newValue: any,\n array_index: number | undefined = undefined,\n ) => {\n const conditions = cloneDeep(props.searchConditions);\n const configItem = props.searchConfig.find(item => item.field_name === field_name);\n let value;\n let operator;\n let condition = conditions.find(item => item.field_name === field_name);\n if (type === 'value') {\n if (condition) {\n operator = condition.operator;\n } else {\n operator = configItem?.default_operator || 'eq';\n }\n if (array_index !== undefined) {\n const value_count = getParamsCount(newValue, configItem);\n if (condition) {\n value = condition.value;\n if (isEmpty(value) || !(value instanceof Array)) {\n value = [];\n for (let i = 0; i < value_count; i++) {\n value.push(null);\n }\n }\n value[array_index] = newValue;\n } else {\n value = [];\n for (let i = 0; i < value_count; i++) {\n value.push(null);\n }\n value[array_index] = newValue;\n }\n } else {\n if (isNotEmpty(newValue) && !(newValue instanceof Array)) {\n newValue = [newValue];\n }\n value = newValue;\n }\n } else if (type === 'operator') {\n operator = newValue;\n const value_count = getParamsCount(newValue, configItem);\n if (value_count) {\n value = [];\n for (let i = 0; i < value_count; i++) {\n value.push(null);\n }\n } else {\n value = undefined;\n }\n }\n if (condition) {\n condition.operator = operator;\n condition.value = value;\n } else {\n let format = 'input';\n let class_name = 'str';\n if (configItem) {\n format = configItem.format || 'input';\n class_name = configItem.class_name || 'str';\n }\n condition = {\n field_name: field_name,\n value,\n operator,\n format,\n class_name,\n };\n conditions.push(condition);\n }\n emit('update:searchConditions', conditions);\n };\n const handleUpdateSearchConditions = (newConditions: Condition[]) => {\n emit('update:searchConditions', newConditions);\n };\n const handleRefresh = () => {\n props.eventBus.emit('refresh');\n };\n return {\n isShowForm,\n searchModel,\n dataSource,\n onChange,\n operator_type_map,\n formModel,\n is_or_not_blank_or_null_options,\n validateInfos,\n options_for_date_eq,\n handleUpdateSearchConditions,\n handleRefresh,\n getValue,\n };\n },\n components: {\n searchSummary,\n },\n});\n</script>\n<style lang=\"less\" scoped>\n.card {\n overflow: auto;\n max-height: 300px;\n background: #f2f5f7;\n}\n\n.condition-group {\n padding: 5px;\n}\n\n.close-icon {\n width: 15px;\n margin-top: 5px;\n margin-left: 5px;\n color: red;\n}\n\n.search-bar {\n background: #f2f5f7;\n text-align: right;\n}\n\n:deep(.divider .ant-divider) {\n margin: 0;\n}\n.btn-content {\n display: flex;\n justify-content: flex-end;\n padding: 4px;\n}\n.search-switch {\n display: inline-block;\n line-height: 32px;\n height: 32px;\n}\n</style>\n","import { acceptHMRUpdate, defineStore } from 'pinia';\n\nexport interface TableContext {\n searchConditions: any[];\n selectedRowKeys: any[];\n selectedRecord: any[];\n datasource: any[];\n}\nexport interface Context {\n tables: Record<string, TableContext>;\n formModel: any;\n globalData: any;\n current_history_id?: any;\n request_history_id?: any;\n isEdit: boolean;\n editState: any;\n current_flow_history_id?: any;\n request_flow_history_id?: any;\n}\n\nexport interface ContextState {\n contexts: Record<string, Context>;\n}\n\nexport const SET_SEARCH_CONDITIONS = 'SET_SEARCH_CONDITIONS';\nexport const SET_SELECTED_ROWKEYS = 'SET_SELECTED_ROWKEYS';\nexport const SET_DATASOURCE = 'SET_DATASOURCE';\nexport const SET_FORM_MODEL = 'SET_FORM_MODEL';\nexport const SET_RAW = 'SET_RAW';\nexport const SET_CURRENT_HISTORY_ID = 'SET_CURRENT_HISTORY_ID';\nexport const SET_REQUST_HISTORY_ID = 'SET_REQUST_HISTORY_ID';\nexport const CLEAR_CONTEXT = 'CLEAR_CONTEXT';\nexport const SET_EDIT = 'SET_EDIT';\nexport const SET_CURRENT_FLOW_HISTORY_ID = 'SET_CURRENT_FLOW_HISTORY_ID';\nexport const SET_REQUST_FLOW_HISTORY_ID = 'SET_REQUST_FLOW_HISTORY_ID';\nexport const SET_GLOBAL_DATA = 'SET_GLOBAL_DATA';\n\nexport const useContextStore = defineStore('approval_context', {\n persist: false,\n state: (): ContextState => ({\n contexts: null,\n }),\n actions: {\n init(model_type: string) {\n if (!this.contexts) {\n this.contexts = {};\n }\n if (!this.contexts[model_type]) {\n this.contexts[model_type] = {\n tables: {},\n formModel: null,\n isEdit: false,\n editState: {},\n globalData: {},\n };\n }\n return this.contexts[model_type];\n },\n initTable(model_type: string, table_id: string) {\n const context = this.init(model_type);\n if (!context.tables) {\n context.tables = {};\n }\n if (!context.tables[table_id]) {\n context.tables[table_id] = {\n searchConditions: [],\n selectedRowKeys: [],\n selectedRecord: [],\n datasource: [],\n };\n }\n return context.tables[table_id];\n },\n\n [SET_SEARCH_CONDITIONS](model_type: string, table_id: string, searchConditions: any[]) {\n const table = this.initTable(model_type, table_id);\n table.searchConditions = searchConditions;\n },\n [SET_SELECTED_ROWKEYS](\n model_type: string,\n table_id: string,\n selectedRowKeys: any[],\n selectedRecord: any[],\n ) {\n const table = this.initTable(model_type, table_id);\n table.selectedRowKeys = selectedRowKeys;\n table.selectedRecord = selectedRecord;\n },\n [SET_DATASOURCE](model_type: string, table_id: string, datasource: any[]) {\n const table = this.initTable(model_type, table_id);\n table.datasource = datasource;\n },\n [SET_FORM_MODEL](model_type: string, formModel: any) {\n const context = this.init(model_type);\n context.formModel = formModel;\n },\n [SET_GLOBAL_DATA](model_type: string, globalData: any) {\n const context = this.init(model_type);\n context.globalData = globalData;\n },\n [SET_RAW](model_type: string, data: any) {\n this.init(model_type);\n this.contexts[model_type] = {\n ...data,\n current_history_id: this.contexts[model_type].current_history_id,\n current_flow_history_id: this.contexts[model_type].current_flow_history_id,\n };\n },\n\n [SET_CURRENT_HISTORY_ID](model_type: string, current_history_id: any) {\n this.init(model_type);\n this.contexts[model_type].current_history_id = current_history_id;\n },\n\n [SET_REQUST_HISTORY_ID](model_type: string, request_history_id: any) {\n this.init(model_type);\n this.contexts[model_type].request_history_id = request_history_id;\n },\n [SET_CURRENT_FLOW_HISTORY_ID](model_type: string, current_flow_history_id: any) {\n this.init(model_type);\n this.contexts[model_type].current_flow_history_id = current_flow_history_id;\n },\n [SET_REQUST_FLOW_HISTORY_ID](model_type: string, request_flow_history_id: any) {\n this.init(model_type);\n this.contexts[model_type].request_flow_history_id = request_flow_history_id;\n },\n [SET_EDIT](model_type: string, isEdit: boolean, editState: any) {\n this.init(model_type);\n this.contexts[model_type].isEdit = isEdit;\n this.contexts[model_type].editState = editState;\n },\n [CLEAR_CONTEXT](model_type: string) {\n delete this.contexts[model_type];\n },\n },\n});\n// 原来写的是 import.meta.webpackHot(webpack 专有),Vite 下不存在;\n// 改用 Vite 的 import.meta.hot + acceptHMRUpdate,类型由 vite/client 提供。\nif (import.meta.hot) {\n import.meta.hot.accept(acceptHMRUpdate(useContextStore, import.meta.hot));\n}\n","<template>\n <div\n class=\"actions\"\n v-if=\"actions\"\n ref=\"rowActionTestRef\"\n >\n <template\n v-for=\"(action, index) in topActions\"\n :key=\"index\"\n >\n <debugCode\n :action_code_id=\"action.action_code_id\"\n v-model:code=\"action.code\"\n v-model:action=\"action.action\"\n v-model:showCode=\"action.showCode\"\n v-model:disableCode=\"action.disableCode\"\n :options=\"actionTypes\"\n :show=\"showMap[action.action_code_id]\"\n >\n <a-button\n size=\"small\"\n :type=\"action.type as ButtonType\"\n :danger=\"action.danger\"\n :loading=\"!!action.loading\"\n @click=\"handleClick(action)\"\n :disabled=\"disableMap[action.action_code_id]\"\n >\n {{ action.label }}\n </a-button>\n </debugCode>\n </template>\n <template v-for=\"group in dropDonwList\">\n <a-dropdown>\n <template #overlay>\n <a-menu>\n <template\n v-for=\"(action, index) in group.children\"\n :key=\"index\"\n >\n <debugCode\n :action_code_id=\"action.action_code_id\"\n v-model:code=\"action.code\"\n v-model:action=\"action.action\"\n v-model:showCode=\"action.showCode\"\n v-model:disableCode=\"action.disableCode\"\n :options=\"actionTypes\"\n :show=\"showMap[action.action_code_id]\"\n >\n <a-menu-item\n @click=\"handleClick(action)\"\n :disabled=\"disableMap[action.action_code_id]\"\n >\n {{ action.label }}\n </a-menu-item>\n </debugCode>\n </template>\n </a-menu>\n </template>\n <a-button\n size=\"small\"\n v-if=\"group.name\"\n >\n {{ group.name }}\n <DownOutlined />\n </a-button>\n <div\n v-else\n style=\"cursor: pointer; padding: 4px 16px\"\n >\n · · ·\n </div>\n </a-dropdown>\n </template>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue';\nimport { ButtonType } from 'ant-design-vue/es/button';\nimport { Action } from '../typing';\nimport { useResizeObserver } from '@vueuse/core';\nimport { actionTypes } from '../utils';\nimport { executeScriptInWorker } from '@/init-plugin';\nimport { cloneDeep, debounce } from 'lodash';\n\ndefineOptions({\n name: 'actionBar',\n});\n\nconst props = withDefaults(\n defineProps<{\n actions: Action[];\n action_width?: number;\n params?: any;\n }>(),\n {\n action_width: 70,\n params: undefined,\n },\n);\n\nconst emit = defineEmits<{\n (e: 'click', action: any): void;\n (e: 'update:action_width', width: number): void;\n}>();\n\nconst rowActionTestRef = ref(null);\nconst showMap = ref<Record<string, boolean>>({});\nconst disableMap = ref<Record<string, boolean>>({});\n\nconst topActions = computed(() => {\n return props.actions.filter(item => {\n return !item.is_dropdown;\n });\n});\n\nuseResizeObserver(rowActionTestRef, entries => {\n emit('update:action_width', entries[0].contentRect.width);\n});\n\nconst dropDonwList = computed(() => {\n const topsMap = {};\n const tops = [];\n\n for (const item of props.actions) {\n if (item.is_dropdown) {\n if (!topsMap[item.group_name]) {\n topsMap[item.group_name] = { name: item.group_name, children: [] };\n tops.push(topsMap[item.group_name]);\n }\n const data = topsMap[item.group_name];\n data.children.push(item);\n }\n }\n return tops;\n});\n\nconst showAll = () => {\n const _showMap = cloneDeep(showMap.value);\n const _disableMap = cloneDeep(disableMap.value);\n for (const item of props.actions || []) {\n _showMap[item.action_code_id] = true;\n _disableMap[item.action_code_id] = false;\n }\n showMap.value = _showMap;\n disableMap.value = _disableMap;\n};\n\nconst syncShowDisable = debounce(async params => {\n const _showMap = cloneDeep(showMap.value);\n const _disableMap = cloneDeep(disableMap.value);\n for (const item of props.actions || []) {\n _showMap[item.action_code_id] = true;\n _disableMap[item.action_code_id] = false;\n\n if (item.showCode?.enable && item.showCode?.code) {\n try {\n _showMap[item.action_code_id] = await executeScriptInWorker(item.showCode?.code, {\n ...params,\n settings: item.settings,\n });\n } catch (e) {\n console.error(e);\n }\n }\n if (item.disableCode?.enable && item.disableCode?.code) {\n try {\n _disableMap[item.action_code_id] = await executeScriptInWorker(item.disableCode?.code, {\n ...params,\n settings: item.settings,\n });\n } catch (e) {\n console.error(e);\n }\n }\n }\n showMap.value = _showMap;\n disableMap.value = _disableMap;\n}, 200);\n\nwatch(\n () => [props.params, props.actions],\n (newValue, oldValue) => {\n newValue = newValue || [];\n oldValue = oldValue || [];\n let params = newValue[0];\n // if (isEqual(newValue, oldValue)) return;\n if (params === undefined) {\n showAll();\n return;\n }\n params = params || {};\n syncShowDisable(params);\n },\n {\n deep: true,\n immediate: true,\n },\n);\n\nconst handleClick = async action => {\n emit('click', action);\n};\n</script>\n<style lang=\"less\" scoped>\n.actions {\n display: flex;\n gap: 4px;\n white-space: nowrap;\n width: fit-content;\n}\n</style>\n","<template>\n <div\n class=\"actions\"\n v-if=\"actions\"\n ref=\"rowActionTestRef\"\n >\n <template\n v-for=\"(action, index) in topActions\"\n :key=\"index\"\n >\n <debugCode\n :action_code_id=\"action.action_code_id\"\n v-model:code=\"action.code\"\n v-model:action=\"action.action\"\n v-model:showCode=\"action.showCode\"\n v-model:disableCode=\"action.disableCode\"\n :options=\"actionTypes\"\n :show=\"showMap[action.action_code_id]\"\n >\n <a-button\n size=\"small\"\n :type=\"action.type as ButtonType\"\n :danger=\"action.danger\"\n :loading=\"!!action.loading\"\n @click=\"handleClick(action)\"\n :disabled=\"disableMap[action.action_code_id]\"\n >\n {{ action.label }}\n </a-button>\n </debugCode>\n </template>\n <template v-for=\"group in dropDonwList\">\n <a-dropdown>\n <template #overlay>\n <a-menu>\n <template\n v-for=\"(action, index) in group.children\"\n :key=\"index\"\n >\n <debugCode\n :action_code_id=\"action.action_code_id\"\n v-model:code=\"action.code\"\n v-model:action=\"action.action\"\n v-model:showCode=\"action.showCode\"\n v-model:disableCode=\"action.disableCode\"\n :options=\"actionTypes\"\n :show=\"showMap[action.action_code_id]\"\n >\n <a-menu-item\n @click=\"handleClick(action)\"\n :disabled=\"disableMap[action.action_code_id]\"\n >\n {{ action.label }}\n </a-menu-item>\n </debugCode>\n </template>\n </a-menu>\n </template>\n <a-button\n size=\"small\"\n v-if=\"group.name\"\n >\n {{ group.name }}\n <DownOutlined />\n </a-button>\n <div\n v-else\n style=\"cursor: pointer; padding: 4px 16px\"\n >\n · · ·\n </div>\n </a-dropdown>\n </template>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue';\nimport { ButtonType } from 'ant-design-vue/es/button';\nimport { Action } from '../typing';\nimport { useResizeObserver } from '@vueuse/core';\nimport { actionTypes } from '../utils';\nimport { executeScriptInWorker } from '@/init-plugin';\nimport { cloneDeep, debounce } from 'lodash';\n\ndefineOptions({\n name: 'actionBar',\n});\n\nconst props = withDefaults(\n defineProps<{\n actions: Action[];\n action_width?: number;\n params?: any;\n }>(),\n {\n action_width: 70,\n params: undefined,\n },\n);\n\nconst emit = defineEmits<{\n (e: 'click', action: any): void;\n (e: 'update:action_width', width: number): void;\n}>();\n\nconst rowActionTestRef = ref(null);\nconst showMap = ref<Record<string, boolean>>({});\nconst disableMap = ref<Record<string, boolean>>({});\n\nconst topActions = computed(() => {\n return props.actions.filter(item => {\n return !item.is_dropdown;\n });\n});\n\nuseResizeObserver(rowActionTestRef, entries => {\n emit('update:action_width', entries[0].contentRect.width);\n});\n\nconst dropDonwList = computed(() => {\n const topsMap = {};\n const tops = [];\n\n for (const item of props.actions) {\n if (item.is_dropdown) {\n if (!topsMap[item.group_name]) {\n topsMap[item.group_name] = { name: item.group_name, children: [] };\n tops.push(topsMap[item.group_name]);\n }\n const data = topsMap[item.group_name];\n data.children.push(item);\n }\n }\n return tops;\n});\n\nconst showAll = () => {\n const _showMap = cloneDeep(showMap.value);\n const _disableMap = cloneDeep(disableMap.value);\n for (const item of props.actions || []) {\n _showMap[item.action_code_id] = true;\n _disableMap[item.action_code_id] = false;\n }\n showMap.value = _showMap;\n disableMap.value = _disableMap;\n};\n\nconst syncShowDisable = debounce(async params => {\n const _showMap = cloneDeep(showMap.value);\n const _disableMap = cloneDeep(disableMap.value);\n for (const item of props.actions || []) {\n _showMap[item.action_code_id] = true;\n _disableMap[item.action_code_id] = false;\n\n if (item.showCode?.enable && item.showCode?.code) {\n try {\n _showMap[item.action_code_id] = await executeScriptInWorker(item.showCode?.code, {\n ...params,\n settings: item.settings,\n });\n } catch (e) {\n console.error(e);\n }\n }\n if (item.disableCode?.enable && item.disableCode?.code) {\n try {\n _disableMap[item.action_code_id] = await executeScriptInWorker(item.disableCode?.code, {\n ...params,\n settings: item.settings,\n });\n } catch (e) {\n console.error(e);\n }\n }\n }\n showMap.value = _showMap;\n disableMap.value = _disableMap;\n}, 200);\n\nwatch(\n () => [props.params, props.actions],\n (newValue, oldValue) => {\n newValue = newValue || [];\n oldValue = oldValue || [];\n let params = newValue[0];\n // if (isEqual(newValue, oldValue)) return;\n if (params === undefined) {\n showAll();\n return;\n }\n params = params || {};\n syncShowDisable(params);\n },\n {\n deep: true,\n immediate: true,\n },\n);\n\nconst handleClick = async action => {\n emit('click', action);\n};\n</script>\n<style lang=\"less\" scoped>\n.actions {\n display: flex;\n gap: 4px;\n white-space: nowrap;\n width: fit-content;\n}\n</style>\n","<template>\n <div\n class=\"table-wraper\"\n ref=\"tableWraperRef\"\n >\n <div ref=\"searchRef\">\n <Search\n v-if=\"config.search_config\"\n :searchConfig=\"config.search_config\"\n v-model:searchConditions=\"searchConditions\"\n :event-bus=\"selfEventBus\"\n ></Search>\n </div>\n <s-table\n :columns=\"columns\"\n v-model:selectedRowKeys=\"selectedRowKeys\"\n :data-source=\"dataSource\"\n :bordered=\"true\"\n size=\"small\"\n :scroll=\"{\n y: tableHeight,\n x: config.columns.length * 150,\n }\"\n :loading=\"loading\"\n :pagination=\"{\n current: state.current,\n pageSize: state.pageSize,\n total: state.total,\n onChange: handlePageChange,\n showSizeChanger: true,\n\n pageSizeOptions: pageSizeOptions,\n }\"\n :rowKey=\"'id'\"\n :rowSelection=\"row_selection\"\n :virtual=\"true\"\n :wrapText=\"true\"\n sticky\n stripe\n summary-fixed\n table-layout=\"auto\"\n :preserveRow=\"preserveRow\"\n @change=\"handleChange\"\n >\n <template #bodyCell=\"{ column, index, text, record }\">\n <template v-if=\"column.dataIndex == 'index'\">\n {{ index + 1 + state.pageSize * (state.current - 1) }}\n </template>\n <template v-else-if=\"column.dataIndex == '_action'\">\n <actions-bar\n :actions=\"config.row_actions\"\n @click=\"handleRowAction($event, record)\"\n :params=\"{\n table_id: config.id,\n record,\n context: context.contexts[modelType],\n }\"\n />\n </template>\n <component\n :is=\"'Cell_' + column.cellComponent\"\n v-else-if=\"column.cellComponent\"\n :cmpObj=\"{\n column: column ? column : {},\n index: index,\n text: text,\n dataSource: dataSource,\n record: record ? record : {},\n pageSize: state.pageSize ? state.pageSize : 500,\n current: state.current ? state.current : 1,\n eventBus: eventBus,\n call_cell_row_action: (title) => callRowActionByTitle(title, record),\n }\"\n ></component>\n\n <template v-else>\n {{ text }}\n </template>\n </template>\n <template\n #summary\n v-if=\"summaryColumns.length > 0\"\n >\n <s-table-summary-row>\n <s-table-summary-cell :index=\"0\">合计</s-table-summary-cell>\n <s-table-summary-cell\n v-for=\"item in summaryColumns\"\n :key=\"item.index\"\n :index=\"item.index\"\n >\n <template #default=\"{ total }\">\n <component\n :is=\"'CellSummary_' + item.cellSummaryComponent\"\n v-if=\"item.cellSummaryComponent\"\n :cmpObj=\"{\n item: item,\n total: total,\n }\"\n ></component>\n <span v-else>{{ item.total_content ? item.total_content(total) : total }}</span>\n </template>\n </s-table-summary-cell>\n </s-table-summary-row>\n </template>\n </s-table>\n <div\n ref=\"actionRef\"\n class=\"btn-wraper\"\n >\n <template v-if=\"!hideAllButtons\">\n <actions-bar\n :actions=\"config.actions\"\n @click=\"handleAction\"\n :params=\"{\n table_id: config.id,\n context: context.contexts[modelType],\n }\"\n />\n </template>\n </div>\n <!--用于测试行操作宽度-->\n <div style=\"position: fixed; width: 0; height: 0; display: block; overflow: hidden\">\n <actions-bar\n :actions=\"config.row_actions\"\n v-model:action_width=\"rowActionWidth\"\n />\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport {\n defineComponent,\n onMounted,\n ref,\n reactive,\n computed,\n watch,\n onUnmounted,\n PropType,\n} from 'vue';\nimport { executeScriptInWorker, getApiData } from '@/init-plugin';\nimport Search from './search.vue';\nimport { cloneDeep, debounce, isArray, isEqual } from 'lodash';\nimport { isNotEmpty, isEmpty } from '@/utils/function';\nimport { filterConditions, getQueryConditionParams, resolveParamValue } from '../utils';\nimport { Table, Column, ApprovalSetting } from '../typing';\nimport mitt from 'mitt';\nimport { useResizeObserver } from '@vueuse/core';\nimport {\n SET_DATASOURCE,\n SET_SEARCH_CONDITIONS,\n SET_SELECTED_ROWKEYS,\n useContextStore,\n} from '@/components/approval/store/context';\nimport actionsBar from './actionsBar.vue';\nimport { TableProps, message } from 'ant-design-vue';\nconst DEFAULT_PAGE_SIZE = 50;\nexport default defineComponent({\n name: 'ApprovalTable',\n props: {\n config: {\n type: Object as () => Table,\n required: true,\n },\n modelType: {\n type: String,\n required: false,\n },\n eventBus: {\n type: Object,\n required: false,\n },\n approvalConfig: {\n type: Object as () => ApprovalSetting,\n required: false,\n },\n rowSelectionType: {\n type: String,\n required: false,\n },\n hideAllButtons: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['selection-change'],\n setup(props, { emit }) {\n const context = useContextStore();\n const dataSource = ref([]);\n const selectedRowKeys = ref([]);\n const loading = ref(false);\n const selfEventBus = mitt();\n const searchConditions = ref([]);\n let loadDataId = null;\n const tableWraperRef = ref(null);\n const tableWraperHeight = ref(null);\n const searchRef = ref(null);\n const searchHeight = ref(null);\n const actionRef = ref(null);\n const actionHeight = ref(null);\n const rowActionWidth = ref(70);\n const sortedMap = ref({});\n const sortedList = ref([]);\n let hasGlobalConditions = false;\n let hasFormConditions = false;\n\n const pageSizeOptions = ref([\n '10',\n '20',\n '50',\n '100',\n '200',\n '500',\n '1000',\n '3000',\n '10000',\n '50000',\n '60000',\n '70000',\n ]);\n const state = reactive({\n current: 1,\n pageSize: DEFAULT_PAGE_SIZE,\n total: 0,\n });\n useResizeObserver(tableWraperRef, entries => {\n tableWraperHeight.value = entries[0].contentRect.height;\n });\n useResizeObserver(searchRef, entries => {\n searchHeight.value = entries[0].contentRect.height;\n });\n useResizeObserver(actionRef, entries => {\n actionHeight.value = entries[0].contentRect.height;\n });\n const preserveRow = () => {\n return false;\n };\n const convertBaseConditions = conditions => {\n if (!conditions) {\n return [];\n }\n // 页面配置里的查询值可能带 {{xxx}} 占位符,执行查询时在这里注入实际值\n const conditionParams = getQueryConditionParams(props.modelType);\n const current_context = context.contexts?.[props.modelType] || ({} as any);\n const formKeymap = {};\n for (const item of props.approvalConfig?.columns || []) {\n if (item.type === 'form') {\n const dynamicFieldList = item.form?.dynamicFieldList;\n if (dynamicFieldList) {\n for (const group of dynamicFieldList) {\n for (const field of group.children || []) {\n formKeymap[field.key] = field.name;\n }\n }\n }\n }\n }\n const convertItem = item => {\n let newValue = item.value;\n if (item.value_type == 'global') {\n if (item.value?.length == 2) {\n hasGlobalConditions = true;\n const temp = current_context.globalData?.[item.value[0]]?.[item.value[1]];\n if (temp) {\n newValue = [temp];\n } else {\n newValue = null;\n }\n } else {\n newValue = null;\n }\n } else if (item.value_type == 'form') {\n if (item.value?.length == 2) {\n hasFormConditions = true;\n const temp = current_context.formModel?.[formKeymap[item.value[1]]];\n if (temp) {\n newValue = [temp];\n } else {\n newValue = null;\n }\n } else {\n newValue = null;\n }\n } else {\n // fixed(或未配置 value_type):值里可能带 {{xxx}} 占位符\n newValue = resolveParamValue(item.value, conditionParams);\n }\n return {\n ...item,\n value_type: undefined,\n value: newValue,\n };\n };\n const convertGroup = group => {\n const list = Array.isArray(group) ? group : [group];\n return list.map(convertItem).filter(item => isNotEmpty(item.value));\n };\n // 兼容旧格式:若第一层不是数组(组),则整体当作单个组处理\n const isGroupFormat = conditions.length > 0 && Array.isArray(conditions[0]);\n const groups = isGroupFormat ? conditions : [conditions];\n return groups.map(convertGroup).filter(group => group.length > 0);\n };\n\n const getData = async () => {\n if (!props.config.list_url) {\n return;\n }\n const currentLoadId = Symbol();\n loadDataId = currentLoadId;\n try {\n loading.value = true;\n // 参数缺失时条件解析会直接报错:此时不能继续查(要么查不到、要么过滤失效),\n // 提示出来比静默出一张空表或错误数据更容易排查\n let baseConditions = [];\n try {\n baseConditions = convertBaseConditions(props.config.base_conditions);\n } catch (err) {\n console.error(err);\n message.error(err instanceof Error ? err.message : String(err));\n return;\n }\n const searchConditionList = filterConditions(searchConditions.value);\n // 新的条件格式:第一层为组({ op, children }),与页面输入的查询条件整合\n // 搜索条件作为一组(and),基础查询条件的各个组(组间 or)作为另一组(and)\n const conditions = [];\n if (searchConditionList.length > 0) {\n conditions.push({ op: 'and', children: searchConditionList });\n }\n if (baseConditions.length > 0) {\n conditions.push({ op: 'and', children: baseConditions });\n }\n const column_fields = props.config.columns?.map(item => {\n return item.dataIndex;\n });\n const sort_fields = [];\n for (const item of sortedList.value) {\n if (item.order == 'descend') {\n sort_fields.push('-' + item.key);\n } else {\n sort_fields.push(item.key);\n }\n }\n const params = {\n ...(props.config.query_params || {}),\n current: state.current,\n pageSize: state.pageSize,\n conditions: conditions,\n column_fields: column_fields,\n sort_fields,\n };\n const response = await getApiData(params, props.config.list_url);\n if (loadDataId !== currentLoadId) {\n return;\n }\n dataSource.value = response.data;\n if (props.modelType) {\n context[SET_DATASOURCE](props.modelType, props.config.id, dataSource.value);\n }\n state.current = response.current;\n state.total = response.total;\n } finally {\n if (loadDataId !== currentLoadId) {\n return;\n }\n loading.value = false;\n }\n };\n const delayGetDate = debounce(getData, 500);\n const handlePageChange = (page: any, pageSize: any) => {\n if (state.current == page && state.pageSize == pageSize) {\n return;\n }\n state.current = page ? page : 1;\n state.pageSize = pageSize ? pageSize : DEFAULT_PAGE_SIZE;\n getData();\n };\n const row_selection: any = computed(() => {\n const rowSelectionType =\n props.rowSelectionType || props.config.rowSelectionType || 'checkbox';\n const onChange = selectedRowKeys => {\n const selectdRecord = dataSource.value.filter(item => {\n return selectedRowKeys.includes(item.id);\n });\n if (props.modelType) {\n context[SET_SELECTED_ROWKEYS](\n props.modelType,\n props.config.id,\n selectedRowKeys,\n selectdRecord,\n );\n }\n };\n return { type: rowSelectionType, onChange };\n });\n /**\n * 已选行数上报:供上层(columnTables / tableModal)显示「已选 N 条」并做选择数量校验。\n * 用 watch 而不是写进 rowSelection.onChange,是为了覆盖所有改选途径(勾选/取消/全选等)——\n * s-table 统一通过 `update:selectedRowKeys` 回写,都在这个 ref 上。\n */\n watch(\n selectedRowKeys,\n keys => {\n emit('selection-change', (keys || []).length);\n },\n { deep: true, immediate: true },\n );\n const columns = computed(() => {\n const filterValueMap = {};\n for (const item of searchConditions.value) {\n if (['in', 'eq'].includes(item.operator)) {\n filterValueMap[item.field_name] = item.value;\n }\n }\n const sorted = sortedMap.value || {};\n const sourceColumns = cloneDeep(props.config.columns || []);\n const hasAutoWidth = sourceColumns.some(item => item.autoWidth);\n if (!hasAutoWidth && sourceColumns.length) {\n sourceColumns[sourceColumns.length - 1].autoWidth = true;\n }\n const res = sourceColumns.map(item => {\n if (item.autoWidth) {\n return {\n ...item,\n minWidth: item.width,\n width: undefined,\n filteredValue: filterValueMap[item.dataIndex] || null,\n sortOrder: sorted[item.dataIndex] || false,\n key: item.dataIndex,\n };\n } else {\n return {\n ...item,\n width: item.width,\n minWidth: undefined,\n filteredValue: filterValueMap[item.dataIndex] || null,\n sortOrder: sorted[item.dataIndex] || false,\n key: item.dataIndex,\n };\n }\n });\n if (\n props.config.row_actions &&\n props.config.row_actions.length > 0 &&\n !props.hideAllButtons\n ) {\n return [\n ...res,\n {\n title: '操作',\n dataIndex: '_action',\n width: rowActionWidth.value + 20,\n resizable: true,\n fixed: 'right',\n },\n ];\n } else {\n return res;\n }\n });\n const refresh = () => {\n getData();\n };\n //const response = await getApiData(params, props.config.list_url);\n const handleRowAction = async (action, record) => {\n if (!action.action) {\n console.error('未定义action');\n return;\n }\n if (props.eventBus) {\n props.eventBus.emit('run_action', {\n code: action.code,\n action: action,\n params: {\n table_id: props.config.id,\n record,\n context: context.contexts?.[props.modelType] || {},\n settings: action.settings,\n },\n });\n }\n };\n // cellComponent 触发行按钮:按按钮名称(label)匹配出携带代码的完整 action 对象并执行\n const callRowActionByTitle = (title, record) => {\n const actions = (props.config && props.config.row_actions) || [];\n if (!actions.length) return;\n // 仅按按钮名称 label 匹配(调用方只能传按钮名称,不允许传 action 操作标识)\n const action = actions.find(a => a.label === title);\n if (!action) {\n console.warn('cellComponent 触发的行按钮未找到:', title);\n return;\n }\n // 复用原行按钮逻辑:handleRowAction 内部 emit('run_action', { code, action, record, settings })\n handleRowAction(action, record);\n };\n // eventBus 事件处理函数(方式 B,兼容保留)\n const handleCellExecuteRowAction = ({ title, record }) => {\n callRowActionByTitle(title, record);\n };\n const handleAction = async action => {\n if (!action.action) {\n console.error('未定义action');\n return;\n }\n if (props.eventBus) {\n props.eventBus.emit('run_action', {\n code: action.code,\n action: action,\n params: {\n table_id: props.config.id,\n context: context.contexts?.[props.modelType] || {},\n settings: action.settings,\n },\n });\n }\n };\n const tableHeight = computed(() => {\n let value = tableWraperHeight.value - searchHeight.value - actionHeight.value - 130;\n if (summaryColumns.value.length > 0) {\n value -= 40;\n }\n return value;\n });\n\n const init = async () => {\n await getData();\n const savedSearchConditions =\n context.contexts?.[props.modelType]?.tables?.[props.config.id]?.searchConditions;\n if (savedSearchConditions) {\n searchConditions.value = savedSearchConditions;\n }\n };\n const eventReinit = async () => {\n init();\n };\n const eventReload = async () => {\n await getData();\n };\n const summaryColumns = computed(() => {\n const list = [];\n let index = 0;\n for (const item of columns.value) {\n if (item.approve_summary) {\n list.push({\n index: index + 1,\n cellSummaryComponent: item.cellSummaryComponent,\n });\n }\n index++;\n }\n return list;\n });\n const handleChange: TableProps['onChange'] = (pagination, filters, sorter, action) => {\n if (action.action === 'paginate') {\n return;\n } else if (action.action === 'filter') {\n const searchMap = {};\n for (const item of searchConditions.value) {\n searchMap[item.field_name] = item;\n }\n for (const key of Object.keys(filters)) {\n const value = filters[key];\n const item = searchMap[key];\n if (item) {\n if (value?.length > 1) {\n item.operator = 'in';\n } else {\n if (!['in', 'eq'].includes(item.operator)) {\n item.operator = 'in';\n }\n }\n item.value = value;\n } else {\n searchMap[key] = {\n field_name: key,\n operator: 'eq',\n value: value,\n format: 'input',\n class_name: 'str',\n };\n }\n }\n searchConditions.value = Object.values(searchMap);\n getData();\n } else if (action.action === 'sort') {\n const tmpMap = {};\n const tmpList = [];\n if (!isArray(sorter)) {\n tmpMap[sorter.columnKey] = sorter.order;\n tmpList.push({ key: sorter.columnKey, order: sorter.order });\n } else {\n for (const item of sorter) {\n tmpMap[item.columnKey] = item.order;\n tmpList.push({ key: item.columnKey, order: item.order });\n }\n }\n sortedMap.value = tmpMap;\n sortedList.value = tmpList;\n getData();\n }\n };\n\n onMounted(async () => {\n selfEventBus.on('refresh', refresh);\n if (props.eventBus) {\n props.eventBus.on('reinit', eventReinit);\n props.eventBus.on('reload_table', eventReload);\n props.eventBus.on('cell_execute_row_action', handleCellExecuteRowAction);\n }\n await init();\n const defaultSortField = props.config.columns.filter(\n column => column.sorter && column.defaultSortOrder,\n );\n defaultSortField.sort((a, b) => (a.defaultSortIndex || 0) - (b.defaultSortIndex || 0));\n for (const column of defaultSortField) {\n sortedMap.value[column.dataIndex] = column.defaultSortOrder;\n sortedList.value.push({ key: column.dataIndex, order: column.defaultSortOrder });\n }\n });\n onUnmounted(() => {\n selfEventBus.off('refresh', refresh);\n if (props.eventBus) {\n props.eventBus.off('reinit', eventReinit);\n props.eventBus.off('reload_table', eventReload);\n props.eventBus.off('cell_execute_row_action', handleCellExecuteRowAction);\n }\n });\n if (props.modelType) {\n watch(\n () => searchConditions.value,\n (newValue, oldValue) => {\n if (!isEqual(filterConditions(newValue), filterConditions(oldValue))) {\n context[SET_SEARCH_CONDITIONS](props.modelType, props.config.id, newValue);\n delayGetDate();\n }\n },\n { deep: true },\n );\n watch(\n () => cloneDeep(context.contexts[props.modelType]?.globalData),\n (newValue, oldValue) => {\n if (!isEqual(newValue, oldValue) && hasGlobalConditions) {\n delayGetDate();\n }\n },\n { deep: true },\n );\n watch(\n () => cloneDeep(context.contexts[props.modelType]?.formModel),\n (newValue, oldValue) => {\n if (!isEqual(newValue, oldValue) && hasFormConditions) {\n delayGetDate();\n }\n },\n { deep: true },\n );\n }\n return {\n dataSource,\n selectedRowKeys,\n loading,\n state,\n handlePageChange,\n handleRowAction,\n callRowActionByTitle,\n pageSizeOptions,\n columns,\n searchConditions,\n delayGetDate,\n selfEventBus,\n row_selection,\n handleAction,\n searchRef,\n actionRef,\n searchHeight,\n actionHeight,\n tableHeight,\n rowActionWidth,\n context,\n summaryColumns,\n preserveRow,\n handleChange,\n tableWraperHeight,\n tableWraperRef,\n };\n },\n components: {\n Search,\n actionsBar,\n },\n});\n</script>\n<style lang=\"less\" scoped>\n.btn-wraper {\n display: flex;\n justify-content: flex-end;\n}\n.table-wraper {\n height: 100%;\n}\n</style>\n","<template>\n <div\n class=\"table-wraper\"\n ref=\"tableWraperRef\"\n >\n <div ref=\"searchRef\">\n <Search\n v-if=\"config.search_config\"\n :searchConfig=\"config.search_config\"\n v-model:searchConditions=\"searchConditions\"\n :event-bus=\"selfEventBus\"\n ></Search>\n </div>\n <s-table\n :columns=\"columns\"\n v-model:selectedRowKeys=\"selectedRowKeys\"\n :data-source=\"dataSource\"\n :bordered=\"true\"\n size=\"small\"\n :scroll=\"{\n y: tableHeight,\n x: config.columns.length * 150,\n }\"\n :loading=\"loading\"\n :pagination=\"{\n current: state.current,\n pageSize: state.pageSize,\n total: state.total,\n onChange: handlePageChange,\n showSizeChanger: true,\n\n pageSizeOptions: pageSizeOptions,\n }\"\n :rowKey=\"'id'\"\n :rowSelection=\"row_selection\"\n :virtual=\"true\"\n :wrapText=\"true\"\n sticky\n stripe\n summary-fixed\n table-layout=\"auto\"\n :preserveRow=\"preserveRow\"\n @change=\"handleChange\"\n >\n <template #bodyCell=\"{ column, index, text, record }\">\n <template v-if=\"column.dataIndex == 'index'\">\n {{ index + 1 + state.pageSize * (state.current - 1) }}\n </template>\n <template v-else-if=\"column.dataIndex == '_action'\">\n <actions-bar\n :actions=\"config.row_actions\"\n @click=\"handleRowAction($event, record)\"\n :params=\"{\n table_id: config.id,\n record,\n context: context.contexts[modelType],\n }\"\n />\n </template>\n <component\n :is=\"'Cell_' + column.cellComponent\"\n v-else-if=\"column.cellComponent\"\n :cmpObj=\"{\n column: column ? column : {},\n index: index,\n text: text,\n dataSource: dataSource,\n record: record ? record : {},\n pageSize: state.pageSize ? state.pageSize : 500,\n current: state.current ? state.current : 1,\n eventBus: eventBus,\n call_cell_row_action: (title) => callRowActionByTitle(title, record),\n }\"\n ></component>\n\n <template v-else>\n {{ text }}\n </template>\n </template>\n <template\n #summary\n v-if=\"summaryColumns.length > 0\"\n >\n <s-table-summary-row>\n <s-table-summary-cell :index=\"0\">合计</s-table-summary-cell>\n <s-table-summary-cell\n v-for=\"item in summaryColumns\"\n :key=\"item.index\"\n :index=\"item.index\"\n >\n <template #default=\"{ total }\">\n <component\n :is=\"'CellSummary_' + item.cellSummaryComponent\"\n v-if=\"item.cellSummaryComponent\"\n :cmpObj=\"{\n item: item,\n total: total,\n }\"\n ></component>\n <span v-else>{{ item.total_content ? item.total_content(total) : total }}</span>\n </template>\n </s-table-summary-cell>\n </s-table-summary-row>\n </template>\n </s-table>\n <div\n ref=\"actionRef\"\n class=\"btn-wraper\"\n >\n <template v-if=\"!hideAllButtons\">\n <actions-bar\n :actions=\"config.actions\"\n @click=\"handleAction\"\n :params=\"{\n table_id: config.id,\n context: context.contexts[modelType],\n }\"\n />\n </template>\n </div>\n <!--用于测试行操作宽度-->\n <div style=\"position: fixed; width: 0; height: 0; display: block; overflow: hidden\">\n <actions-bar\n :actions=\"config.row_actions\"\n v-model:action_width=\"rowActionWidth\"\n />\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport {\n defineComponent,\n onMounted,\n ref,\n reactive,\n computed,\n watch,\n onUnmounted,\n PropType,\n} from 'vue';\nimport { executeScriptInWorker, getApiData } from '@/init-plugin';\nimport Search from './search.vue';\nimport { cloneDeep, debounce, isArray, isEqual } from 'lodash';\nimport { isNotEmpty, isEmpty } from '@/utils/function';\nimport { filterConditions, getQueryConditionParams, resolveParamValue } from '../utils';\nimport { Table, Column, ApprovalSetting } from '../typing';\nimport mitt from 'mitt';\nimport { useResizeObserver } from '@vueuse/core';\nimport {\n SET_DATASOURCE,\n SET_SEARCH_CONDITIONS,\n SET_SELECTED_ROWKEYS,\n useContextStore,\n} from '@/components/approval/store/context';\nimport actionsBar from './actionsBar.vue';\nimport { TableProps, message } from 'ant-design-vue';\nconst DEFAULT_PAGE_SIZE = 50;\nexport default defineComponent({\n name: 'ApprovalTable',\n props: {\n config: {\n type: Object as () => Table,\n required: true,\n },\n modelType: {\n type: String,\n required: false,\n },\n eventBus: {\n type: Object,\n required: false,\n },\n approvalConfig: {\n type: Object as () => ApprovalSetting,\n required: false,\n },\n rowSelectionType: {\n type: String,\n required: false,\n },\n hideAllButtons: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['selection-change'],\n setup(props, { emit }) {\n const context = useContextStore();\n const dataSource = ref([]);\n const selectedRowKeys = ref([]);\n const loading = ref(false);\n const selfEventBus = mitt();\n const searchConditions = ref([]);\n let loadDataId = null;\n const tableWraperRef = ref(null);\n const tableWraperHeight = ref(null);\n const searchRef = ref(null);\n const searchHeight = ref(null);\n const actionRef = ref(null);\n const actionHeight = ref(null);\n const rowActionWidth = ref(70);\n const sortedMap = ref({});\n const sortedList = ref([]);\n let hasGlobalConditions = false;\n let hasFormConditions = false;\n\n const pageSizeOptions = ref([\n '10',\n '20',\n '50',\n '100',\n '200',\n '500',\n '1000',\n '3000',\n '10000',\n '50000',\n '60000',\n '70000',\n ]);\n const state = reactive({\n current: 1,\n pageSize: DEFAULT_PAGE_SIZE,\n total: 0,\n });\n useResizeObserver(tableWraperRef, entries => {\n tableWraperHeight.value = entries[0].contentRect.height;\n });\n useResizeObserver(searchRef, entries => {\n searchHeight.value = entries[0].contentRect.height;\n });\n useResizeObserver(actionRef, entries => {\n actionHeight.value = entries[0].contentRect.height;\n });\n const preserveRow = () => {\n return false;\n };\n const convertBaseConditions = conditions => {\n if (!conditions) {\n return [];\n }\n // 页面配置里的查询值可能带 {{xxx}} 占位符,执行查询时在这里注入实际值\n const conditionParams = getQueryConditionParams(props.modelType);\n const current_context = context.contexts?.[props.modelType] || ({} as any);\n const formKeymap = {};\n for (const item of props.approvalConfig?.columns || []) {\n if (item.type === 'form') {\n const dynamicFieldList = item.form?.dynamicFieldList;\n if (dynamicFieldList) {\n for (const group of dynamicFieldList) {\n for (const field of group.children || []) {\n formKeymap[field.key] = field.name;\n }\n }\n }\n }\n }\n const convertItem = item => {\n let newValue = item.value;\n if (item.value_type == 'global') {\n if (item.value?.length == 2) {\n hasGlobalConditions = true;\n const temp = current_context.globalData?.[item.value[0]]?.[item.value[1]];\n if (temp) {\n newValue = [temp];\n } else {\n newValue = null;\n }\n } else {\n newValue = null;\n }\n } else if (item.value_type == 'form') {\n if (item.value?.length == 2) {\n hasFormConditions = true;\n const temp = current_context.formModel?.[formKeymap[item.value[1]]];\n if (temp) {\n newValue = [temp];\n } else {\n newValue = null;\n }\n } else {\n newValue = null;\n }\n } else {\n // fixed(或未配置 value_type):值里可能带 {{xxx}} 占位符\n newValue = resolveParamValue(item.value, conditionParams);\n }\n return {\n ...item,\n value_type: undefined,\n value: newValue,\n };\n };\n const convertGroup = group => {\n const list = Array.isArray(group) ? group : [group];\n return list.map(convertItem).filter(item => isNotEmpty(item.value));\n };\n // 兼容旧格式:若第一层不是数组(组),则整体当作单个组处理\n const isGroupFormat = conditions.length > 0 && Array.isArray(conditions[0]);\n const groups = isGroupFormat ? conditions : [conditions];\n return groups.map(convertGroup).filter(group => group.length > 0);\n };\n\n const getData = async () => {\n if (!props.config.list_url) {\n return;\n }\n const currentLoadId = Symbol();\n loadDataId = currentLoadId;\n try {\n loading.value = true;\n // 参数缺失时条件解析会直接报错:此时不能继续查(要么查不到、要么过滤失效),\n // 提示出来比静默出一张空表或错误数据更容易排查\n let baseConditions = [];\n try {\n baseConditions = convertBaseConditions(props.config.base_conditions);\n } catch (err) {\n console.error(err);\n message.error(err instanceof Error ? err.message : String(err));\n return;\n }\n const searchConditionList = filterConditions(searchConditions.value);\n // 新的条件格式:第一层为组({ op, children }),与页面输入的查询条件整合\n // 搜索条件作为一组(and),基础查询条件的各个组(组间 or)作为另一组(and)\n const conditions = [];\n if (searchConditionList.length > 0) {\n conditions.push({ op: 'and', children: searchConditionList });\n }\n if (baseConditions.length > 0) {\n conditions.push({ op: 'and', children: baseConditions });\n }\n const column_fields = props.config.columns?.map(item => {\n return item.dataIndex;\n });\n const sort_fields = [];\n for (const item of sortedList.value) {\n if (item.order == 'descend') {\n sort_fields.push('-' + item.key);\n } else {\n sort_fields.push(item.key);\n }\n }\n const params = {\n ...(props.config.query_params || {}),\n current: state.current,\n pageSize: state.pageSize,\n conditions: conditions,\n column_fields: column_fields,\n sort_fields,\n };\n const response = await getApiData(params, props.config.list_url);\n if (loadDataId !== currentLoadId) {\n return;\n }\n dataSource.value = response.data;\n if (props.modelType) {\n context[SET_DATASOURCE](props.modelType, props.config.id, dataSource.value);\n }\n state.current = response.current;\n state.total = response.total;\n } finally {\n if (loadDataId !== currentLoadId) {\n return;\n }\n loading.value = false;\n }\n };\n const delayGetDate = debounce(getData, 500);\n const handlePageChange = (page: any, pageSize: any) => {\n if (state.current == page && state.pageSize == pageSize) {\n return;\n }\n state.current = page ? page : 1;\n state.pageSize = pageSize ? pageSize : DEFAULT_PAGE_SIZE;\n getData();\n };\n const row_selection: any = computed(() => {\n const rowSelectionType =\n props.rowSelectionType || props.config.rowSelectionType || 'checkbox';\n const onChange = selectedRowKeys => {\n const selectdRecord = dataSource.value.filter(item => {\n return selectedRowKeys.includes(item.id);\n });\n if (props.modelType) {\n context[SET_SELECTED_ROWKEYS](\n props.modelType,\n props.config.id,\n selectedRowKeys,\n selectdRecord,\n );\n }\n };\n return { type: rowSelectionType, onChange };\n });\n /**\n * 已选行数上报:供上层(columnTables / tableModal)显示「已选 N 条」并做选择数量校验。\n * 用 watch 而不是写进 rowSelection.onChange,是为了覆盖所有改选途径(勾选/取消/全选等)——\n * s-table 统一通过 `update:selectedRowKeys` 回写,都在这个 ref 上。\n */\n watch(\n selectedRowKeys,\n keys => {\n emit('selection-change', (keys || []).length);\n },\n { deep: true, immediate: true },\n );\n const columns = computed(() => {\n const filterValueMap = {};\n for (const item of searchConditions.value) {\n if (['in', 'eq'].includes(item.operator)) {\n filterValueMap[item.field_name] = item.value;\n }\n }\n const sorted = sortedMap.value || {};\n const sourceColumns = cloneDeep(props.config.columns || []);\n const hasAutoWidth = sourceColumns.some(item => item.autoWidth);\n if (!hasAutoWidth && sourceColumns.length) {\n sourceColumns[sourceColumns.length - 1].autoWidth = true;\n }\n const res = sourceColumns.map(item => {\n if (item.autoWidth) {\n return {\n ...item,\n minWidth: item.width,\n width: undefined,\n filteredValue: filterValueMap[item.dataIndex] || null,\n sortOrder: sorted[item.dataIndex] || false,\n key: item.dataIndex,\n };\n } else {\n return {\n ...item,\n width: item.width,\n minWidth: undefined,\n filteredValue: filterValueMap[item.dataIndex] || null,\n sortOrder: sorted[item.dataIndex] || false,\n key: item.dataIndex,\n };\n }\n });\n if (\n props.config.row_actions &&\n props.config.row_actions.length > 0 &&\n !props.hideAllButtons\n ) {\n return [\n ...res,\n {\n title: '操作',\n dataIndex: '_action',\n width: rowActionWidth.value + 20,\n resizable: true,\n fixed: 'right',\n },\n ];\n } else {\n return res;\n }\n });\n const refresh = () => {\n getData();\n };\n //const response = await getApiData(params, props.config.list_url);\n const handleRowAction = async (action, record) => {\n if (!action.action) {\n console.error('未定义action');\n return;\n }\n if (props.eventBus) {\n props.eventBus.emit('run_action', {\n code: action.code,\n action: action,\n params: {\n table_id: props.config.id,\n record,\n context: context.contexts?.[props.modelType] || {},\n settings: action.settings,\n },\n });\n }\n };\n // cellComponent 触发行按钮:按按钮名称(label)匹配出携带代码的完整 action 对象并执行\n const callRowActionByTitle = (title, record) => {\n const actions = (props.config && props.config.row_actions) || [];\n if (!actions.length) return;\n // 仅按按钮名称 label 匹配(调用方只能传按钮名称,不允许传 action 操作标识)\n const action = actions.find(a => a.label === title);\n if (!action) {\n console.warn('cellComponent 触发的行按钮未找到:', title);\n return;\n }\n // 复用原行按钮逻辑:handleRowAction 内部 emit('run_action', { code, action, record, settings })\n handleRowAction(action, record);\n };\n // eventBus 事件处理函数(方式 B,兼容保留)\n const handleCellExecuteRowAction = ({ title, record }) => {\n callRowActionByTitle(title, record);\n };\n const handleAction = async action => {\n if (!action.action) {\n console.error('未定义action');\n return;\n }\n if (props.eventBus) {\n props.eventBus.emit('run_action', {\n code: action.code,\n action: action,\n params: {\n table_id: props.config.id,\n context: context.contexts?.[props.modelType] || {},\n settings: action.settings,\n },\n });\n }\n };\n const tableHeight = computed(() => {\n let value = tableWraperHeight.value - searchHeight.value - actionHeight.value - 130;\n if (summaryColumns.value.length > 0) {\n value -= 40;\n }\n return value;\n });\n\n const init = async () => {\n await getData();\n const savedSearchConditions =\n context.contexts?.[props.modelType]?.tables?.[props.config.id]?.searchConditions;\n if (savedSearchConditions) {\n searchConditions.value = savedSearchConditions;\n }\n };\n const eventReinit = async () => {\n init();\n };\n const eventReload = async () => {\n await getData();\n };\n const summaryColumns = computed(() => {\n const list = [];\n let index = 0;\n for (const item of columns.value) {\n if (item.approve_summary) {\n list.push({\n index: index + 1,\n cellSummaryComponent: item.cellSummaryComponent,\n });\n }\n index++;\n }\n return list;\n });\n const handleChange: TableProps['onChange'] = (pagination, filters, sorter, action) => {\n if (action.action === 'paginate') {\n return;\n } else if (action.action === 'filter') {\n const searchMap = {};\n for (const item of searchConditions.value) {\n searchMap[item.field_name] = item;\n }\n for (const key of Object.keys(filters)) {\n const value = filters[key];\n const item = searchMap[key];\n if (item) {\n if (value?.length > 1) {\n item.operator = 'in';\n } else {\n if (!['in', 'eq'].includes(item.operator)) {\n item.operator = 'in';\n }\n }\n item.value = value;\n } else {\n searchMap[key] = {\n field_name: key,\n operator: 'eq',\n value: value,\n format: 'input',\n class_name: 'str',\n };\n }\n }\n searchConditions.value = Object.values(searchMap);\n getData();\n } else if (action.action === 'sort') {\n const tmpMap = {};\n const tmpList = [];\n if (!isArray(sorter)) {\n tmpMap[sorter.columnKey] = sorter.order;\n tmpList.push({ key: sorter.columnKey, order: sorter.order });\n } else {\n for (const item of sorter) {\n tmpMap[item.columnKey] = item.order;\n tmpList.push({ key: item.columnKey, order: item.order });\n }\n }\n sortedMap.value = tmpMap;\n sortedList.value = tmpList;\n getData();\n }\n };\n\n onMounted(async () => {\n selfEventBus.on('refresh', refresh);\n if (props.eventBus) {\n props.eventBus.on('reinit', eventReinit);\n props.eventBus.on('reload_table', eventReload);\n props.eventBus.on('cell_execute_row_action', handleCellExecuteRowAction);\n }\n await init();\n const defaultSortField = props.config.columns.filter(\n column => column.sorter && column.defaultSortOrder,\n );\n defaultSortField.sort((a, b) => (a.defaultSortIndex || 0) - (b.defaultSortIndex || 0));\n for (const column of defaultSortField) {\n sortedMap.value[column.dataIndex] = column.defaultSortOrder;\n sortedList.value.push({ key: column.dataIndex, order: column.defaultSortOrder });\n }\n });\n onUnmounted(() => {\n selfEventBus.off('refresh', refresh);\n if (props.eventBus) {\n props.eventBus.off('reinit', eventReinit);\n props.eventBus.off('reload_table', eventReload);\n props.eventBus.off('cell_execute_row_action', handleCellExecuteRowAction);\n }\n });\n if (props.modelType) {\n watch(\n () => searchConditions.value,\n (newValue, oldValue) => {\n if (!isEqual(filterConditions(newValue), filterConditions(oldValue))) {\n context[SET_SEARCH_CONDITIONS](props.modelType, props.config.id, newValue);\n delayGetDate();\n }\n },\n { deep: true },\n );\n watch(\n () => cloneDeep(context.contexts[props.modelType]?.globalData),\n (newValue, oldValue) => {\n if (!isEqual(newValue, oldValue) && hasGlobalConditions) {\n delayGetDate();\n }\n },\n { deep: true },\n );\n watch(\n () => cloneDeep(context.contexts[props.modelType]?.formModel),\n (newValue, oldValue) => {\n if (!isEqual(newValue, oldValue) && hasFormConditions) {\n delayGetDate();\n }\n },\n { deep: true },\n );\n }\n return {\n dataSource,\n selectedRowKeys,\n loading,\n state,\n handlePageChange,\n handleRowAction,\n callRowActionByTitle,\n pageSizeOptions,\n columns,\n searchConditions,\n delayGetDate,\n selfEventBus,\n row_selection,\n handleAction,\n searchRef,\n actionRef,\n searchHeight,\n actionHeight,\n tableHeight,\n rowActionWidth,\n context,\n summaryColumns,\n preserveRow,\n handleChange,\n tableWraperHeight,\n tableWraperRef,\n };\n },\n components: {\n Search,\n actionsBar,\n },\n});\n</script>\n<style lang=\"less\" scoped>\n.btn-wraper {\n display: flex;\n justify-content: flex-end;\n}\n.table-wraper {\n height: 100%;\n}\n</style>\n","<template>\n <div class=\"approval-column-tables\">\n <div\n v-for=\"(config, index) in filterTables\"\n :key=\"index\"\n class=\"table-item\"\n >\n <div class=\"title\">\n <span class=\"title-text\">{{ config.title }}</span>\n <span\n v-if=\"getSelectLimit(config.id)\"\n class=\"select-limit\"\n :class=\"{ 'is-invalid': isSelectCountInvalid(config.id) }\"\n >\n ({{ getSelectLimitText(config.id) }} · 已选 {{ getSelectedCount(config.id) }} 条)\n </span>\n </div>\n <ApprovalTable\n :config=\"config\"\n :modelType=\"modelType\"\n :eventBus=\"eventBus\"\n :approvalConfig=\"approvalConfig\"\n :hideAllButtons=\"hideAllButtons\"\n :rowSelectionType=\"rowSelectionTypeMap[config.id]\"\n @selection-change=\"handleSelectionChange(config.id, $event)\"\n />\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, onMounted, PropType, reactive, ref } from 'vue';\nimport ApprovalTable from './table.vue';\nimport { ApprovalSetting } from '../typing';\nimport {\n getTableSelectLimit,\n getTableSelectLimitText,\n isTableSelectCountInvalid,\n TableSelectLimit,\n} from '../utils';\n\nexport default defineComponent({\n name: 'ApprovalColumnTables',\n\n props: {\n columnConfig: {\n type: Object,\n required: true,\n },\n height: {\n type: Number,\n required: true,\n },\n eventBus: {\n type: Object,\n required: true,\n },\n modelType: {\n type: String,\n required: true,\n },\n approvalConfig: {\n type: Object as PropType<ApprovalSetting>,\n required: true,\n },\n groupTitle: {\n type: String,\n required: false,\n },\n filterTables: {\n type: Array as PropType<any[]>,\n default: () => [],\n required: false,\n },\n hideAllButtons: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['selected-counts-change'],\n setup(props, { emit }) {\n const activeKey = ref([]);\n onMounted(() => {\n activeKey.value = props.columnConfig.tables?.map((_, index) => index);\n });\n const filterTables = computed(() => {\n let filterKeys = props.filterTables.map(table => table.id);\n return props.columnConfig.tables.filter(table => {\n if (filterKeys && filterKeys.length > 0) {\n return filterKeys.includes(table.id);\n }\n if (props.groupTitle) {\n const group_title = table.group_title || '未命名';\n return group_title === props.groupTitle;\n }\n return true;\n });\n });\n const rowSelectionTypeMap = computed(() => {\n const res = {};\n for (const table of props.filterTables) {\n res[table.id] = table.isMul ? 'checkbox' : 'radio';\n }\n return res;\n });\n /**\n * 各表的选择数量限制。只认 showTables 入参(filterTables)上的 min_count / max_count,\n * 未配置的表不提示、不参与校验;抽屉/模型列表面板(不传 filterTables)天然不受影响。\n */\n const limitMap = computed<Record<string, TableSelectLimit>>(() => {\n const res: Record<string, TableSelectLimit> = {};\n for (const table of props.filterTables || []) {\n const limit = getTableSelectLimit(table);\n if (limit) {\n res[table.id] = limit;\n }\n }\n return res;\n });\n /** 表 id → 已选条数(由 ApprovalTable 的 selection-change 实时上报) */\n const selectedCountMap = reactive<Record<string, number>>({});\n const getSelectLimit = (tableId: string): TableSelectLimit | null =>\n limitMap.value[tableId] || null;\n const getSelectLimitText = (tableId: string): string =>\n getTableSelectLimitText(getSelectLimit(tableId));\n const getSelectedCount = (tableId: string): number => selectedCountMap[tableId] || 0;\n const isSelectCountInvalid = (tableId: string): boolean =>\n isTableSelectCountInvalid(getSelectLimit(tableId), getSelectedCount(tableId));\n const handleSelectionChange = (tableId: string, count: number) => {\n selectedCountMap[tableId] = Number(count) || 0;\n // 向上抛出纯对象副本:弹窗按同一份数据做校验,避免两处各算一套\n emit('selected-counts-change', { ...selectedCountMap });\n };\n return {\n activeKey,\n filterTables,\n rowSelectionTypeMap,\n getSelectLimit,\n getSelectLimitText,\n getSelectedCount,\n isSelectCountInvalid,\n handleSelectionChange,\n };\n },\n components: {\n ApprovalTable,\n },\n});\n</script>\n<style lang=\"less\" scoped>\n.approval-column-tables {\n height: 100%;\n padding: 4px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.table-item {\n flex: 1; /* 均分可用空间 */\n\n overflow: hidden; /* 防止子元素撑开 */\n border: solid 1px #dcdfe6;\n border-radius: 4px;\n padding: 4px;\n .title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n line-height: 22px;\n padding-left: 8px;\n padding-right: 8px;\n background-color: #f5f5f5;\n .title-text {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n /* 选择数量规则 + 实时已选条数(仅在 showTables 入参配置了 min_count/max_count 时出现) */\n .select-limit {\n flex: 0 0 auto;\n font-size: 12px;\n color: rgba(0, 0, 0, 0.45);\n }\n .select-limit.is-invalid {\n color: #ff4d4f;\n font-weight: 600;\n }\n }\n}\n</style>\n","<template>\n <div class=\"approval-column-tables\">\n <div\n v-for=\"(config, index) in filterTables\"\n :key=\"index\"\n class=\"table-item\"\n >\n <div class=\"title\">\n <span class=\"title-text\">{{ config.title }}</span>\n <span\n v-if=\"getSelectLimit(config.id)\"\n class=\"select-limit\"\n :class=\"{ 'is-invalid': isSelectCountInvalid(config.id) }\"\n >\n ({{ getSelectLimitText(config.id) }} · 已选 {{ getSelectedCount(config.id) }} 条)\n </span>\n </div>\n <ApprovalTable\n :config=\"config\"\n :modelType=\"modelType\"\n :eventBus=\"eventBus\"\n :approvalConfig=\"approvalConfig\"\n :hideAllButtons=\"hideAllButtons\"\n :rowSelectionType=\"rowSelectionTypeMap[config.id]\"\n @selection-change=\"handleSelectionChange(config.id, $event)\"\n />\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, onMounted, PropType, reactive, ref } from 'vue';\nimport ApprovalTable from './table.vue';\nimport { ApprovalSetting } from '../typing';\nimport {\n getTableSelectLimit,\n getTableSelectLimitText,\n isTableSelectCountInvalid,\n TableSelectLimit,\n} from '../utils';\n\nexport default defineComponent({\n name: 'ApprovalColumnTables',\n\n props: {\n columnConfig: {\n type: Object,\n required: true,\n },\n height: {\n type: Number,\n required: true,\n },\n eventBus: {\n type: Object,\n required: true,\n },\n modelType: {\n type: String,\n required: true,\n },\n approvalConfig: {\n type: Object as PropType<ApprovalSetting>,\n required: true,\n },\n groupTitle: {\n type: String,\n required: false,\n },\n filterTables: {\n type: Array as PropType<any[]>,\n default: () => [],\n required: false,\n },\n hideAllButtons: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['selected-counts-change'],\n setup(props, { emit }) {\n const activeKey = ref([]);\n onMounted(() => {\n activeKey.value = props.columnConfig.tables?.map((_, index) => index);\n });\n const filterTables = computed(() => {\n let filterKeys = props.filterTables.map(table => table.id);\n return props.columnConfig.tables.filter(table => {\n if (filterKeys && filterKeys.length > 0) {\n return filterKeys.includes(table.id);\n }\n if (props.groupTitle) {\n const group_title = table.group_title || '未命名';\n return group_title === props.groupTitle;\n }\n return true;\n });\n });\n const rowSelectionTypeMap = computed(() => {\n const res = {};\n for (const table of props.filterTables) {\n res[table.id] = table.isMul ? 'checkbox' : 'radio';\n }\n return res;\n });\n /**\n * 各表的选择数量限制。只认 showTables 入参(filterTables)上的 min_count / max_count,\n * 未配置的表不提示、不参与校验;抽屉/模型列表面板(不传 filterTables)天然不受影响。\n */\n const limitMap = computed<Record<string, TableSelectLimit>>(() => {\n const res: Record<string, TableSelectLimit> = {};\n for (const table of props.filterTables || []) {\n const limit = getTableSelectLimit(table);\n if (limit) {\n res[table.id] = limit;\n }\n }\n return res;\n });\n /** 表 id → 已选条数(由 ApprovalTable 的 selection-change 实时上报) */\n const selectedCountMap = reactive<Record<string, number>>({});\n const getSelectLimit = (tableId: string): TableSelectLimit | null =>\n limitMap.value[tableId] || null;\n const getSelectLimitText = (tableId: string): string =>\n getTableSelectLimitText(getSelectLimit(tableId));\n const getSelectedCount = (tableId: string): number => selectedCountMap[tableId] || 0;\n const isSelectCountInvalid = (tableId: string): boolean =>\n isTableSelectCountInvalid(getSelectLimit(tableId), getSelectedCount(tableId));\n const handleSelectionChange = (tableId: string, count: number) => {\n selectedCountMap[tableId] = Number(count) || 0;\n // 向上抛出纯对象副本:弹窗按同一份数据做校验,避免两处各算一套\n emit('selected-counts-change', { ...selectedCountMap });\n };\n return {\n activeKey,\n filterTables,\n rowSelectionTypeMap,\n getSelectLimit,\n getSelectLimitText,\n getSelectedCount,\n isSelectCountInvalid,\n handleSelectionChange,\n };\n },\n components: {\n ApprovalTable,\n },\n});\n</script>\n<style lang=\"less\" scoped>\n.approval-column-tables {\n height: 100%;\n padding: 4px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.table-item {\n flex: 1; /* 均分可用空间 */\n\n overflow: hidden; /* 防止子元素撑开 */\n border: solid 1px #dcdfe6;\n border-radius: 4px;\n padding: 4px;\n .title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n line-height: 22px;\n padding-left: 8px;\n padding-right: 8px;\n background-color: #f5f5f5;\n .title-text {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n /* 选择数量规则 + 实时已选条数(仅在 showTables 入参配置了 min_count/max_count 时出现) */\n .select-limit {\n flex: 0 0 auto;\n font-size: 12px;\n color: rgba(0, 0, 0, 0.45);\n }\n .select-limit.is-invalid {\n color: #ff4d4f;\n font-weight: 600;\n }\n }\n}\n</style>\n"],"mappings":"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"}
|