lyflowchart 1.0.133 → 1.0.135

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.
@@ -189,6 +189,7 @@ var E = { style: {
189
189
  key: 4,
190
190
  loading: S(z),
191
191
  style: { "margin-left": "10px" },
192
+ type: "primary",
192
193
  onClick: t[5] ||= (e) => S(R)("edit_approve")
193
194
  }, {
194
195
  default: C(() => [...t[14] ||= [d(" 修改 ", -1)]]),
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cell_click_approve-DoemsGnY.js","names":[],"sources":["../src/components/Cell_click_approve.vue","../src/components/Cell_click_approve.vue"],"sourcesContent":["<template>\n <a-button\n :title=\"cmpObj.text\"\n style=\"padding-left: 1px; width: 100%\"\n type=\"link\"\n @click=\"is_open()\"\n >\n <span\n style=\"\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 100%;\n user-select: text;\n text-align: left;\n \"\n >\n {{ cmpObj.text }}\n </span>\n </a-button>\n <a-drawer\n :body-style=\"{ padding: '10px 20px' }\"\n :footer=\"null\"\n :open=\"open\"\n :width=\"1120\"\n title=\"审批信息\"\n @close=\"onClose\"\n >\n <template #extra>\n <!-- 以下 4 个是本单元格特有的流程动作,不属于审批记录上的「修改/删除」,保持原样 -->\n <a-button\n v-if=\"cmpObj.record.process_status === 'init' || cmpObj.record.result_status === 'reject'\"\n :loading=\"loading1\"\n type=\"primary\"\n @click=\"commitApprove(cmpObj.record)\"\n >\n 提交\n </a-button>\n <a-button\n v-if=\"cmpObj.record.process_status === 'init' || cmpObj.record.result_status === 'reject'\"\n :loading=\"loading2\"\n danger\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"cancelApprove(cmpObj.record)\"\n >\n 撤销\n </a-button>\n <a-button\n v-if=\"task_id\"\n :loading=\"loading3\"\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"handleApprove('agree')\"\n >\n 审批通过\n </a-button>\n <a-button\n v-if=\"task_id\"\n :loading=\"loading4\"\n style=\"margin-left: 10px\"\n danger\n type=\"primary\"\n @click=\"handleApprove('refuse')\"\n >\n 审批拒绝\n </a-button>\n\n <!--\n 修改 / 删除 / 打印:按钮「各自在外部提供」,但**是否显示**与**点击行为**统一由\n `useApproveRecordActions` 封装(与审批列表页行按钮跑同一份 `recordActions.ts` 逻辑)。\n 所以这里既看不到判断表达式,也看不到接口调用 —— 都在 composable 里。\n -->\n <a-button\n v-if=\"canShow('edit_approve')\"\n :loading=\"actionsLoading\"\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"runAction('edit_approve')\"\n >\n 修改\n </a-button>\n <a-button\n v-if=\"canShow('cancel_agree_approve')\"\n :loading=\"actionsLoading\"\n danger\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"runAction('cancel_agree_approve')\"\n >\n 删除\n </a-button>\n <a-button\n v-if=\"canShow('print')\"\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"runAction('print')\"\n >\n 打印\n </a-button>\n </template>\n <div ref=\"printAreaRef\">\n <!--\n :show-actions=\"false\" —— 修改/删除/打印按钮已在上面的 #extra 里,\n 关掉详情组件自带的那一份,避免同一个抽屉里出现两套同名按钮。\n -->\n <approval-for-details\n ref=\"detailRef\"\n :record=\"cmpObj.record\"\n :show-actions=\"false\"\n />\n </div>\n </a-drawer>\n <!--\n 两个模态框按需渲染(v-if 用 editorOpen / removeOpen,而不是恒真的 true):\n 只要 `<ApprovalEditorModal>` 进了 vdom,异步加载器就会触发 chunk 下载,\n 所以必须等真正要用了才渲染。\n -->\n <ApprovalEditorModal\n v-if=\"editorOpen\"\n v-model:open=\"editorOpen\"\n v-bind=\"editorProps\"\n />\n <ApprovalCancelModal\n v-if=\"removeOpen\"\n v-model:cancel-modal-show=\"removeOpen\"\n v-bind=\"removeProps\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { defineAsyncComponent, reactive, ref } from 'vue';\nimport { message, Modal } from 'ant-design-vue';\n// ⚠️ 这三项都是宿主的「转发函数」(库不得反向依赖 liyu-pc-lib,见 src/init-plugin.ts 顶部铁律):\n// getApiData ← liyu-pc-lib/api/api-model\n// useUserStore← liyu-pc-lib/store/user\n// modalBox ← liyu-pc-lib/components/form-modal/modal-tools(默认导出)\n// 调用签名与宿主侧完全一致,只是换了个 import 来源。\nimport { getApiData, modalBox, useUserStore } from '../init-plugin';\nimport ApprovalForDetails from './approval_for_details.vue';\nimport ApprovalCancelModal from './approval/components/CancelModal.vue';\nimport { useApproveRecordActions } from './approval/useApprovalRecordActions';\n\n/**\n * 「审批」单元格组件:表格里显示一个链接按钮,点开右侧抽屉看审批详情。\n *\n * 从 `PSM_ApproveSystemPC/src/components/cellComponent/Cell_click_approve.vue` **原样移植**进公共库,\n * 与 `Cell_click_data_source.vue` 走同一套形态:库内实现 + `src/index.ts` 的 install() 里\n * **按名字全局注册**(`cellComponentList` 里的单元格类型就是靠组件名解析的,只查全局注册)。\n * 宿主侧因此不再需要这个文件,也不需要 `app.component('Cell_click_approve', …)`。\n *\n * 除「依赖来源」外与宿主版本**逐字一致**(含 4 个流程动作、接口路径、报错与刷新行为),\n * 移植时只做了三类替换:依赖 → init-plugin;库内组件 → 相对路径 import;编辑器 → 异步引入(见下)。\n */\ndefineOptions({\n name: 'Cell_click_approve',\n});\n\nconst props = defineProps<{\n cmpObj: Record<string, any>;\n}>();\n\nconst userStore = useUserStore();\nconst current_org = userStore.currentOrg;\nconst open = ref(false);\nconst loading1 = ref(false);\nconst loading2 = ref(false);\nconst loading3 = ref(false);\nconst loading4 = ref(false);\nconst task_id = ref<string | null>(null);\nconst printAreaRef = ref<HTMLElement | null>(null);\n/** 详情组件实例:操作成功后调它的 reload() 重拉详情 */\nconst detailRef = ref<{ reload: () => void } | null>(null);\n\n/**\n * 修改 / 删除 / 打印的统一封装(是否显示 + 点击行为)。\n *\n * ⚠️ `recordId` 里那个 `open.value ?` 不能去掉:\n * 本组件是**单元格组件**,列表里每一行都会渲染一个实例。若不带这个门条件,\n * `useApproveRecordActions` 内部的 immediate watch 会让**每一行**都在挂载时去拉\n * `/approve/get_approve_record` —— 列表一页 50 行就是 50 个请求。\n * 加上之后,只有用户真正点开某一行的抽屉才会取数。\n */\nconst {\n canShow,\n runAction,\n loading: actionsLoading,\n editorOpen,\n editorProps,\n removeOpen,\n removeProps,\n} = useApproveRecordActions({\n recordId: () => (open.value ? props.cmpObj?.record?.id : null),\n modelType: () => props.cmpObj?.record?.menu_flag,\n getPrintElement: () => printAreaRef.value,\n printTitle: '审批信息',\n onChange: () => {\n // 抽屉里的详情重拉 + 通知外层列表刷新\n detailRef.value?.reload();\n refresh();\n },\n});\n\n/**\n * 编辑模态框必须**异步**引入 —— 与 `approval_for_details.vue` 里同一个理由:\n *\n * 本组件在 `install()` 里是**静态注册**的(`app.component('Cell_click_approve', …)`),\n * 所以它的静态依赖会整块进入宿主**首屏静态闭包**;而\n * `ApprovalEditorModal` → `core.vue` → `flowConfig.vue` → bpmn-js 是一条约 1.1 MB 的重链\n * (宿主实测:上一轮刚把它从首屏摘掉,静态 import 会原样拉回来)。\n *\n * 这里**不能**写成 `import { ApprovalEditorModal } from '../index'`:`index.ts` 又 import 了本文件,\n * 会构成循环依赖,而 `defineAsyncComponent(...)` 在模块求值时就要读那个绑定。\n * 所以就地再包一层 —— 同一个模块被**两处动态 import** 没有问题(合并进同一个 chunk),\n * 危险的是「一处静态 + 一处动态」(那会报 `INEFFECTIVE_DYNAMIC_IMPORT`,拆不出独立 chunk)。\n */\nconst ApprovalEditorModal = defineAsyncComponent(\n () => import('./approval/ApprovalEditorModal.vue'),\n);\n\nconst is_open = async () => {\n open.value = true;\n const res = await getApiData(\n {\n org_id: current_org?.id,\n approve_record_id: props.cmpObj.record.id,\n },\n '/approve/get_approve_record_info',\n );\n if (res?.current_task?.id) {\n task_id.value = res.current_task.id;\n }\n};\nconst onClose = () => {\n open.value = false;\n};\nconst refresh = () => {\n if (props.cmpObj?.eventBus) {\n props.cmpObj.eventBus.emit('reinit');\n }\n if (props.cmpObj?.event_obj) {\n props.cmpObj.event_obj.emit('refresh');\n }\n};\nconst commitApprove = (record: any) => {\n loading1.value = true;\n Modal.confirm({\n title: '提示',\n content: '是否确认要发起审批',\n async onOk() {\n getApiData(\n {\n org_id: current_org?.id,\n approve_record_id: record.id,\n },\n '/approve/commit_approve_record',\n )\n .then(() => {\n message.success('操作成功');\n refresh();\n })\n .finally(() => {\n loading1.value = false;\n });\n },\n onCancel() {\n loading1.value = false;\n },\n });\n};\nconst cancelApprove = (record: any) => {\n loading2.value = true;\n Modal.confirm({\n title: '提示',\n content: '是否确认要撤销审批',\n async onOk() {\n getApiData(\n {\n org_id: current_org?.id,\n approve_record_id: record.id,\n },\n '/approve/cancel_approve_record',\n )\n .then(() => {\n message.success('操作成功');\n refresh();\n })\n .finally(() => {\n loading2.value = false;\n });\n },\n onCancel() {\n loading2.value = false;\n },\n });\n};\nconst handleApprove = (is_reject: any) => {\n const rules: any = reactive({});\n if (is_reject == 'refuse') {\n rules.comment = [{ required: true, message: '请输入审批意见' }];\n loading4.value = true;\n } else {\n loading3.value = true;\n }\n const tempModal = reactive({\n open: true,\n loading: false,\n title: '审批意见',\n form: {\n settings: {\n labelAlign: 'right',\n layout: 'vertical',\n col: [],\n },\n fields: [\n {\n type: 'textarea',\n name: 'comment',\n label: '审批意见',\n disabled: false,\n allowClear: true,\n inputType: 'text',\n maxlength: 200,\n defaultValue: '',\n placeholder: '请输入审批意见',\n },\n ],\n rules: rules,\n model: reactive({\n comment: null,\n }),\n },\n options: {},\n ok: (obj: any) => {\n return new Promise(function (resolve) {\n tempModal.open = false;\n getApiData(\n {\n org_id: current_org?.id,\n task_id: task_id.value,\n comment: obj.comment,\n approval_result: is_reject,\n },\n '/lyapprove/claim_and_complete_task',\n )\n .then(() => {\n message.success(is_reject == 'refuse' ? '审批拒绝' : '审批通过');\n refresh();\n resolve(null);\n })\n .finally(() => {\n loading3.value = false;\n loading4.value = false;\n });\n });\n },\n onCancel() {\n tempModal.open = false;\n },\n });\n modalBox(tempModal);\n};\n</script>\n","<template>\n <a-button\n :title=\"cmpObj.text\"\n style=\"padding-left: 1px; width: 100%\"\n type=\"link\"\n @click=\"is_open()\"\n >\n <span\n style=\"\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 100%;\n user-select: text;\n text-align: left;\n \"\n >\n {{ cmpObj.text }}\n </span>\n </a-button>\n <a-drawer\n :body-style=\"{ padding: '10px 20px' }\"\n :footer=\"null\"\n :open=\"open\"\n :width=\"1120\"\n title=\"审批信息\"\n @close=\"onClose\"\n >\n <template #extra>\n <!-- 以下 4 个是本单元格特有的流程动作,不属于审批记录上的「修改/删除」,保持原样 -->\n <a-button\n v-if=\"cmpObj.record.process_status === 'init' || cmpObj.record.result_status === 'reject'\"\n :loading=\"loading1\"\n type=\"primary\"\n @click=\"commitApprove(cmpObj.record)\"\n >\n 提交\n </a-button>\n <a-button\n v-if=\"cmpObj.record.process_status === 'init' || cmpObj.record.result_status === 'reject'\"\n :loading=\"loading2\"\n danger\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"cancelApprove(cmpObj.record)\"\n >\n 撤销\n </a-button>\n <a-button\n v-if=\"task_id\"\n :loading=\"loading3\"\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"handleApprove('agree')\"\n >\n 审批通过\n </a-button>\n <a-button\n v-if=\"task_id\"\n :loading=\"loading4\"\n style=\"margin-left: 10px\"\n danger\n type=\"primary\"\n @click=\"handleApprove('refuse')\"\n >\n 审批拒绝\n </a-button>\n\n <!--\n 修改 / 删除 / 打印:按钮「各自在外部提供」,但**是否显示**与**点击行为**统一由\n `useApproveRecordActions` 封装(与审批列表页行按钮跑同一份 `recordActions.ts` 逻辑)。\n 所以这里既看不到判断表达式,也看不到接口调用 —— 都在 composable 里。\n -->\n <a-button\n v-if=\"canShow('edit_approve')\"\n :loading=\"actionsLoading\"\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"runAction('edit_approve')\"\n >\n 修改\n </a-button>\n <a-button\n v-if=\"canShow('cancel_agree_approve')\"\n :loading=\"actionsLoading\"\n danger\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"runAction('cancel_agree_approve')\"\n >\n 删除\n </a-button>\n <a-button\n v-if=\"canShow('print')\"\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"runAction('print')\"\n >\n 打印\n </a-button>\n </template>\n <div ref=\"printAreaRef\">\n <!--\n :show-actions=\"false\" —— 修改/删除/打印按钮已在上面的 #extra 里,\n 关掉详情组件自带的那一份,避免同一个抽屉里出现两套同名按钮。\n -->\n <approval-for-details\n ref=\"detailRef\"\n :record=\"cmpObj.record\"\n :show-actions=\"false\"\n />\n </div>\n </a-drawer>\n <!--\n 两个模态框按需渲染(v-if 用 editorOpen / removeOpen,而不是恒真的 true):\n 只要 `<ApprovalEditorModal>` 进了 vdom,异步加载器就会触发 chunk 下载,\n 所以必须等真正要用了才渲染。\n -->\n <ApprovalEditorModal\n v-if=\"editorOpen\"\n v-model:open=\"editorOpen\"\n v-bind=\"editorProps\"\n />\n <ApprovalCancelModal\n v-if=\"removeOpen\"\n v-model:cancel-modal-show=\"removeOpen\"\n v-bind=\"removeProps\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { defineAsyncComponent, reactive, ref } from 'vue';\nimport { message, Modal } from 'ant-design-vue';\n// ⚠️ 这三项都是宿主的「转发函数」(库不得反向依赖 liyu-pc-lib,见 src/init-plugin.ts 顶部铁律):\n// getApiData ← liyu-pc-lib/api/api-model\n// useUserStore← liyu-pc-lib/store/user\n// modalBox ← liyu-pc-lib/components/form-modal/modal-tools(默认导出)\n// 调用签名与宿主侧完全一致,只是换了个 import 来源。\nimport { getApiData, modalBox, useUserStore } from '../init-plugin';\nimport ApprovalForDetails from './approval_for_details.vue';\nimport ApprovalCancelModal from './approval/components/CancelModal.vue';\nimport { useApproveRecordActions } from './approval/useApprovalRecordActions';\n\n/**\n * 「审批」单元格组件:表格里显示一个链接按钮,点开右侧抽屉看审批详情。\n *\n * 从 `PSM_ApproveSystemPC/src/components/cellComponent/Cell_click_approve.vue` **原样移植**进公共库,\n * 与 `Cell_click_data_source.vue` 走同一套形态:库内实现 + `src/index.ts` 的 install() 里\n * **按名字全局注册**(`cellComponentList` 里的单元格类型就是靠组件名解析的,只查全局注册)。\n * 宿主侧因此不再需要这个文件,也不需要 `app.component('Cell_click_approve', …)`。\n *\n * 除「依赖来源」外与宿主版本**逐字一致**(含 4 个流程动作、接口路径、报错与刷新行为),\n * 移植时只做了三类替换:依赖 → init-plugin;库内组件 → 相对路径 import;编辑器 → 异步引入(见下)。\n */\ndefineOptions({\n name: 'Cell_click_approve',\n});\n\nconst props = defineProps<{\n cmpObj: Record<string, any>;\n}>();\n\nconst userStore = useUserStore();\nconst current_org = userStore.currentOrg;\nconst open = ref(false);\nconst loading1 = ref(false);\nconst loading2 = ref(false);\nconst loading3 = ref(false);\nconst loading4 = ref(false);\nconst task_id = ref<string | null>(null);\nconst printAreaRef = ref<HTMLElement | null>(null);\n/** 详情组件实例:操作成功后调它的 reload() 重拉详情 */\nconst detailRef = ref<{ reload: () => void } | null>(null);\n\n/**\n * 修改 / 删除 / 打印的统一封装(是否显示 + 点击行为)。\n *\n * ⚠️ `recordId` 里那个 `open.value ?` 不能去掉:\n * 本组件是**单元格组件**,列表里每一行都会渲染一个实例。若不带这个门条件,\n * `useApproveRecordActions` 内部的 immediate watch 会让**每一行**都在挂载时去拉\n * `/approve/get_approve_record` —— 列表一页 50 行就是 50 个请求。\n * 加上之后,只有用户真正点开某一行的抽屉才会取数。\n */\nconst {\n canShow,\n runAction,\n loading: actionsLoading,\n editorOpen,\n editorProps,\n removeOpen,\n removeProps,\n} = useApproveRecordActions({\n recordId: () => (open.value ? props.cmpObj?.record?.id : null),\n modelType: () => props.cmpObj?.record?.menu_flag,\n getPrintElement: () => printAreaRef.value,\n printTitle: '审批信息',\n onChange: () => {\n // 抽屉里的详情重拉 + 通知外层列表刷新\n detailRef.value?.reload();\n refresh();\n },\n});\n\n/**\n * 编辑模态框必须**异步**引入 —— 与 `approval_for_details.vue` 里同一个理由:\n *\n * 本组件在 `install()` 里是**静态注册**的(`app.component('Cell_click_approve', …)`),\n * 所以它的静态依赖会整块进入宿主**首屏静态闭包**;而\n * `ApprovalEditorModal` → `core.vue` → `flowConfig.vue` → bpmn-js 是一条约 1.1 MB 的重链\n * (宿主实测:上一轮刚把它从首屏摘掉,静态 import 会原样拉回来)。\n *\n * 这里**不能**写成 `import { ApprovalEditorModal } from '../index'`:`index.ts` 又 import 了本文件,\n * 会构成循环依赖,而 `defineAsyncComponent(...)` 在模块求值时就要读那个绑定。\n * 所以就地再包一层 —— 同一个模块被**两处动态 import** 没有问题(合并进同一个 chunk),\n * 危险的是「一处静态 + 一处动态」(那会报 `INEFFECTIVE_DYNAMIC_IMPORT`,拆不出独立 chunk)。\n */\nconst ApprovalEditorModal = defineAsyncComponent(\n () => import('./approval/ApprovalEditorModal.vue'),\n);\n\nconst is_open = async () => {\n open.value = true;\n const res = await getApiData(\n {\n org_id: current_org?.id,\n approve_record_id: props.cmpObj.record.id,\n },\n '/approve/get_approve_record_info',\n );\n if (res?.current_task?.id) {\n task_id.value = res.current_task.id;\n }\n};\nconst onClose = () => {\n open.value = false;\n};\nconst refresh = () => {\n if (props.cmpObj?.eventBus) {\n props.cmpObj.eventBus.emit('reinit');\n }\n if (props.cmpObj?.event_obj) {\n props.cmpObj.event_obj.emit('refresh');\n }\n};\nconst commitApprove = (record: any) => {\n loading1.value = true;\n Modal.confirm({\n title: '提示',\n content: '是否确认要发起审批',\n async onOk() {\n getApiData(\n {\n org_id: current_org?.id,\n approve_record_id: record.id,\n },\n '/approve/commit_approve_record',\n )\n .then(() => {\n message.success('操作成功');\n refresh();\n })\n .finally(() => {\n loading1.value = false;\n });\n },\n onCancel() {\n loading1.value = false;\n },\n });\n};\nconst cancelApprove = (record: any) => {\n loading2.value = true;\n Modal.confirm({\n title: '提示',\n content: '是否确认要撤销审批',\n async onOk() {\n getApiData(\n {\n org_id: current_org?.id,\n approve_record_id: record.id,\n },\n '/approve/cancel_approve_record',\n )\n .then(() => {\n message.success('操作成功');\n refresh();\n })\n .finally(() => {\n loading2.value = false;\n });\n },\n onCancel() {\n loading2.value = false;\n },\n });\n};\nconst handleApprove = (is_reject: any) => {\n const rules: any = reactive({});\n if (is_reject == 'refuse') {\n rules.comment = [{ required: true, message: '请输入审批意见' }];\n loading4.value = true;\n } else {\n loading3.value = true;\n }\n const tempModal = reactive({\n open: true,\n loading: false,\n title: '审批意见',\n form: {\n settings: {\n labelAlign: 'right',\n layout: 'vertical',\n col: [],\n },\n fields: [\n {\n type: 'textarea',\n name: 'comment',\n label: '审批意见',\n disabled: false,\n allowClear: true,\n inputType: 'text',\n maxlength: 200,\n defaultValue: '',\n placeholder: '请输入审批意见',\n },\n ],\n rules: rules,\n model: reactive({\n comment: null,\n }),\n },\n options: {},\n ok: (obj: any) => {\n return new Promise(function (resolve) {\n tempModal.open = false;\n getApiData(\n {\n org_id: current_org?.id,\n task_id: task_id.value,\n comment: obj.comment,\n approval_result: is_reject,\n },\n '/lyapprove/claim_and_complete_task',\n )\n .then(() => {\n message.success(is_reject == 'refuse' ? '审批拒绝' : '审批通过');\n refresh();\n resolve(null);\n })\n .finally(() => {\n loading3.value = false;\n loading4.value = false;\n });\n });\n },\n onCancel() {\n tempModal.open = false;\n },\n });\n modalBox(tempModal);\n};\n</script>\n"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -392,6 +392,7 @@ var j = { style: {
392
392
  k(V)("edit_approve") ? (T(), m(n, {
393
393
  key: 0,
394
394
  loading: k(U),
395
+ type: "primary",
395
396
  onClick: t[1] ||= (e) => k(H)("edit_approve")
396
397
  }, {
397
398
  default: A(() => [...t[7] ||= [v(" 修改 ", -1)]]),
@@ -529,7 +530,7 @@ var j = { style: {
529
530
  ], 64);
530
531
  };
531
532
  }
532
- }), I = b(() => import("./approval-BaVHder3.js")), L = b(() => import("./approvalPageConfig-D0zPXOUf.js")), R = b(() => import("./approvalHistory-B2gpQbFC.js")), z = b(() => import("./debugCode-Cm9-WiUG.js")), B = b(() => import("./ApprovalEditorModal-suKPJ-vN.js")), V = b(() => import("./Cell_click_approve-Dr83RkI-.js")), H = {
533
+ }), I = b(() => import("./approval-BaVHder3.js")), L = b(() => import("./approvalPageConfig-D0zPXOUf.js")), R = b(() => import("./approvalHistory-B2gpQbFC.js")), z = b(() => import("./debugCode-Cm9-WiUG.js")), B = b(() => import("./ApprovalEditorModal-suKPJ-vN.js")), V = b(() => import("./Cell_click_approve-DoemsGnY.js")), H = {
533
534
  codeHistoryViewModal: () => import("./codeHistoryViewModal-BfSjIbEU.js"),
534
535
  approvalHistoryViewModal: () => import("./approvalHistoryViewModal-DgLpv2ot.js"),
535
536
  flowHistoryViewModal: () => import("./flowHistoryViewModal-D8DJP7Te.js")
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../node_modules/codemirror/mode/xml/xml.js","../node_modules/codemirror/lib/codemirror.css","../src/components/Cell_click_data_source.vue","../src/components/Cell_click_data_source.vue","../src/index.ts"],"sourcesContent":["// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/LICENSE\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"../../lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nvar htmlConfig = {\n autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true,\n 'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true,\n 'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true,\n 'track': true, 'wbr': true, 'menuitem': true},\n implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true,\n 'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true,\n 'th': true, 'tr': true},\n contextGrabbers: {\n 'dd': {'dd': true, 'dt': true},\n 'dt': {'dd': true, 'dt': true},\n 'li': {'li': true},\n 'option': {'option': true, 'optgroup': true},\n 'optgroup': {'optgroup': true},\n 'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true,\n 'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true,\n 'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true,\n 'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true,\n 'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true},\n 'rp': {'rp': true, 'rt': true},\n 'rt': {'rp': true, 'rt': true},\n 'tbody': {'tbody': true, 'tfoot': true},\n 'td': {'td': true, 'th': true},\n 'tfoot': {'tbody': true},\n 'th': {'td': true, 'th': true},\n 'thead': {'tbody': true, 'tfoot': true},\n 'tr': {'tr': true}\n },\n doNotIndent: {\"pre\": true},\n allowUnquoted: true,\n allowMissing: true,\n caseFold: true\n}\n\nvar xmlConfig = {\n autoSelfClosers: {},\n implicitlyClosed: {},\n contextGrabbers: {},\n doNotIndent: {},\n allowUnquoted: false,\n allowMissing: false,\n allowMissingTagName: false,\n caseFold: false\n}\n\nCodeMirror.defineMode(\"xml\", function(editorConf, config_) {\n var indentUnit = editorConf.indentUnit\n var config = {}\n var defaults = config_.htmlMode ? htmlConfig : xmlConfig\n for (var prop in defaults) config[prop] = defaults[prop]\n for (var prop in config_) config[prop] = config_[prop]\n\n // Return variables for tokenizers\n var type, setStyle;\n\n function inText(stream, state) {\n function chain(parser) {\n state.tokenize = parser;\n return parser(stream, state);\n }\n\n var ch = stream.next();\n if (ch == \"<\") {\n if (stream.eat(\"!\")) {\n if (stream.eat(\"[\")) {\n if (stream.match(\"CDATA[\")) return chain(inBlock(\"atom\", \"]]>\"));\n else return null;\n } else if (stream.match(\"--\")) {\n return chain(inBlock(\"comment\", \"-->\"));\n } else if (stream.match(\"DOCTYPE\", true, true)) {\n stream.eatWhile(/[\\w\\._\\-]/);\n return chain(doctype(1));\n } else {\n return null;\n }\n } else if (stream.eat(\"?\")) {\n stream.eatWhile(/[\\w\\._\\-]/);\n state.tokenize = inBlock(\"meta\", \"?>\");\n return \"meta\";\n } else {\n type = stream.eat(\"/\") ? \"closeTag\" : \"openTag\";\n state.tokenize = inTag;\n return \"tag bracket\";\n }\n } else if (ch == \"&\") {\n var ok;\n if (stream.eat(\"#\")) {\n if (stream.eat(\"x\")) {\n ok = stream.eatWhile(/[a-fA-F\\d]/) && stream.eat(\";\");\n } else {\n ok = stream.eatWhile(/[\\d]/) && stream.eat(\";\");\n }\n } else {\n ok = stream.eatWhile(/[\\w\\.\\-:]/) && stream.eat(\";\");\n }\n return ok ? \"atom\" : \"error\";\n } else {\n stream.eatWhile(/[^&<]/);\n return null;\n }\n }\n inText.isInText = true;\n\n function inTag(stream, state) {\n var ch = stream.next();\n if (ch == \">\" || (ch == \"/\" && stream.eat(\">\"))) {\n state.tokenize = inText;\n type = ch == \">\" ? \"endTag\" : \"selfcloseTag\";\n return \"tag bracket\";\n } else if (ch == \"=\") {\n type = \"equals\";\n return null;\n } else if (ch == \"<\") {\n state.tokenize = inText;\n state.state = baseState;\n state.tagName = state.tagStart = null;\n var next = state.tokenize(stream, state);\n return next ? next + \" tag error\" : \"tag error\";\n } else if (/[\\'\\\"]/.test(ch)) {\n state.tokenize = inAttribute(ch);\n state.stringStartCol = stream.column();\n return state.tokenize(stream, state);\n } else {\n stream.match(/^[^\\s\\u00a0=<>\\\"\\']*[^\\s\\u00a0=<>\\\"\\'\\/]/);\n return \"word\";\n }\n }\n\n function inAttribute(quote) {\n var closure = function(stream, state) {\n while (!stream.eol()) {\n if (stream.next() == quote) {\n state.tokenize = inTag;\n break;\n }\n }\n return \"string\";\n };\n closure.isInAttribute = true;\n return closure;\n }\n\n function inBlock(style, terminator) {\n return function(stream, state) {\n while (!stream.eol()) {\n if (stream.match(terminator)) {\n state.tokenize = inText;\n break;\n }\n stream.next();\n }\n return style;\n }\n }\n\n function doctype(depth) {\n return function(stream, state) {\n var ch;\n while ((ch = stream.next()) != null) {\n if (ch == \"<\") {\n state.tokenize = doctype(depth + 1);\n return state.tokenize(stream, state);\n } else if (ch == \">\") {\n if (depth == 1) {\n state.tokenize = inText;\n break;\n } else {\n state.tokenize = doctype(depth - 1);\n return state.tokenize(stream, state);\n }\n }\n }\n return \"meta\";\n };\n }\n\n function lower(tagName) {\n return tagName && tagName.toLowerCase();\n }\n\n function Context(state, tagName, startOfLine) {\n this.prev = state.context;\n this.tagName = tagName || \"\";\n this.indent = state.indented;\n this.startOfLine = startOfLine;\n if (config.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent))\n this.noIndent = true;\n }\n function popContext(state) {\n if (state.context) state.context = state.context.prev;\n }\n function maybePopContext(state, nextTagName) {\n var parentTagName;\n while (true) {\n if (!state.context) {\n return;\n }\n parentTagName = state.context.tagName;\n if (!config.contextGrabbers.hasOwnProperty(lower(parentTagName)) ||\n !config.contextGrabbers[lower(parentTagName)].hasOwnProperty(lower(nextTagName))) {\n return;\n }\n popContext(state);\n }\n }\n\n function baseState(type, stream, state) {\n if (type == \"openTag\") {\n state.tagStart = stream.column();\n return tagNameState;\n } else if (type == \"closeTag\") {\n return closeTagNameState;\n } else {\n return baseState;\n }\n }\n function tagNameState(type, stream, state) {\n if (type == \"word\") {\n state.tagName = stream.current();\n setStyle = \"tag\";\n return attrState;\n } else if (config.allowMissingTagName && type == \"endTag\") {\n setStyle = \"tag bracket\";\n return attrState(type, stream, state);\n } else {\n setStyle = \"error\";\n return tagNameState;\n }\n }\n function closeTagNameState(type, stream, state) {\n if (type == \"word\") {\n var tagName = stream.current();\n if (state.context && state.context.tagName != tagName &&\n config.implicitlyClosed.hasOwnProperty(lower(state.context.tagName)))\n popContext(state);\n if ((state.context && state.context.tagName == tagName) || config.matchClosing === false) {\n setStyle = \"tag\";\n return closeState;\n } else {\n setStyle = \"tag error\";\n return closeStateErr;\n }\n } else if (config.allowMissingTagName && type == \"endTag\") {\n setStyle = \"tag bracket\";\n return closeState(type, stream, state);\n } else {\n setStyle = \"error\";\n return closeStateErr;\n }\n }\n\n function closeState(type, _stream, state) {\n if (type != \"endTag\") {\n setStyle = \"error\";\n return closeState;\n }\n popContext(state);\n return baseState;\n }\n function closeStateErr(type, stream, state) {\n setStyle = \"error\";\n return closeState(type, stream, state);\n }\n\n function attrState(type, _stream, state) {\n if (type == \"word\") {\n setStyle = \"attribute\";\n return attrEqState;\n } else if (type == \"endTag\" || type == \"selfcloseTag\") {\n var tagName = state.tagName, tagStart = state.tagStart;\n state.tagName = state.tagStart = null;\n if (type == \"selfcloseTag\" ||\n config.autoSelfClosers.hasOwnProperty(lower(tagName))) {\n maybePopContext(state, tagName);\n } else {\n maybePopContext(state, tagName);\n state.context = new Context(state, tagName, tagStart == state.indented);\n }\n return baseState;\n }\n setStyle = \"error\";\n return attrState;\n }\n function attrEqState(type, stream, state) {\n if (type == \"equals\") return attrValueState;\n if (!config.allowMissing) setStyle = \"error\";\n return attrState(type, stream, state);\n }\n function attrValueState(type, stream, state) {\n if (type == \"string\") return attrContinuedState;\n if (type == \"word\" && config.allowUnquoted) {setStyle = \"string\"; return attrState;}\n setStyle = \"error\";\n return attrState(type, stream, state);\n }\n function attrContinuedState(type, stream, state) {\n if (type == \"string\") return attrContinuedState;\n return attrState(type, stream, state);\n }\n\n return {\n startState: function(baseIndent) {\n var state = {tokenize: inText,\n state: baseState,\n indented: baseIndent || 0,\n tagName: null, tagStart: null,\n context: null}\n if (baseIndent != null) state.baseIndent = baseIndent\n return state\n },\n\n token: function(stream, state) {\n if (!state.tagName && stream.sol())\n state.indented = stream.indentation();\n\n if (stream.eatSpace()) return null;\n type = null;\n var style = state.tokenize(stream, state);\n if ((style || type) && style != \"comment\") {\n setStyle = null;\n state.state = state.state(type || style, stream, state);\n if (setStyle)\n style = setStyle == \"error\" ? style + \" error\" : setStyle;\n }\n return style;\n },\n\n indent: function(state, textAfter, fullLine) {\n var context = state.context;\n // Indent multi-line strings (e.g. css).\n if (state.tokenize.isInAttribute) {\n if (state.tagStart == state.indented)\n return state.stringStartCol + 1;\n else\n return state.indented + indentUnit;\n }\n if (context && context.noIndent) return CodeMirror.Pass;\n if (state.tokenize != inTag && state.tokenize != inText)\n return fullLine ? fullLine.match(/^(\\s*)/)[0].length : 0;\n // Indent the starts of attribute names.\n if (state.tagName) {\n if (config.multilineTagIndentPastTag !== false)\n return state.tagStart + state.tagName.length + 2;\n else\n return state.tagStart + indentUnit * (config.multilineTagIndentFactor || 1);\n }\n if (config.alignCDATA && /<!\\[CDATA\\[/.test(textAfter)) return 0;\n var tagAfter = textAfter && /^<(\\/)?([\\w_:\\.-]*)/.exec(textAfter);\n if (tagAfter && tagAfter[1]) { // Closing tag spotted\n while (context) {\n if (context.tagName == tagAfter[2]) {\n context = context.prev;\n break;\n } else if (config.implicitlyClosed.hasOwnProperty(lower(context.tagName))) {\n context = context.prev;\n } else {\n break;\n }\n }\n } else if (tagAfter) { // Opening tag spotted\n while (context) {\n var grabbers = config.contextGrabbers[lower(context.tagName)];\n if (grabbers && grabbers.hasOwnProperty(lower(tagAfter[2])))\n context = context.prev;\n else\n break;\n }\n }\n while (context && context.prev && !context.startOfLine)\n context = context.prev;\n if (context) return context.indent + indentUnit;\n else return state.baseIndent || 0;\n },\n\n electricInput: /<\\/[\\s\\w:]+>$/,\n blockCommentStart: \"<!--\",\n blockCommentEnd: \"-->\",\n\n configuration: config.htmlMode ? \"html\" : \"xml\",\n helperType: config.htmlMode ? \"html\" : \"xml\",\n\n skipAttribute: function(state) {\n if (state.state == attrValueState)\n state.state = attrState\n },\n\n xmlCurrentTag: function(state) {\n return state.tagName ? {name: state.tagName, close: state.type == \"closeTag\"} : null\n },\n\n xmlCurrentContext: function(state) {\n var context = []\n for (var cx = state.context; cx; cx = cx.prev)\n context.push(cx.tagName)\n return context.reverse()\n }\n };\n});\n\nCodeMirror.defineMIME(\"text/xml\", \"xml\");\nCodeMirror.defineMIME(\"application/xml\", \"xml\");\nif (!CodeMirror.mimeModes.hasOwnProperty(\"text/html\"))\n CodeMirror.defineMIME(\"text/html\", {name: \"xml\", htmlMode: true});\n\n});\n","/* BASICS */\n\n.CodeMirror {\n /* Set height, width, borders, and global font properties here */\n font-family: monospace;\n height: 300px;\n color: black;\n direction: ltr;\n}\n\n/* PADDING */\n\n.CodeMirror-lines {\n padding: 4px 0; /* Vertical padding around content */\n}\n.CodeMirror pre.CodeMirror-line,\n.CodeMirror pre.CodeMirror-line-like {\n padding: 0 4px; /* Horizontal padding of content */\n}\n\n.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n background-color: white; /* The little square between H and V scrollbars */\n}\n\n/* GUTTER */\n\n.CodeMirror-gutters {\n border-right: 1px solid #ddd;\n background-color: #f7f7f7;\n white-space: nowrap;\n}\n.CodeMirror-linenumbers {}\n.CodeMirror-linenumber {\n padding: 0 3px 0 5px;\n min-width: 20px;\n text-align: right;\n color: #999;\n white-space: nowrap;\n}\n\n.CodeMirror-guttermarker { color: black; }\n.CodeMirror-guttermarker-subtle { color: #999; }\n\n/* CURSOR */\n\n.CodeMirror-cursor {\n border-left: 1px solid black;\n border-right: none;\n width: 0;\n}\n/* Shown when moving in bi-directional text */\n.CodeMirror div.CodeMirror-secondarycursor {\n border-left: 1px solid silver;\n}\n.cm-fat-cursor .CodeMirror-cursor {\n width: auto;\n border: 0 !important;\n background: #7e7;\n}\n.cm-fat-cursor div.CodeMirror-cursors {\n z-index: 1;\n}\n.cm-fat-cursor .CodeMirror-line::selection,\n.cm-fat-cursor .CodeMirror-line > span::selection, \n.cm-fat-cursor .CodeMirror-line > span > span::selection { background: transparent; }\n.cm-fat-cursor .CodeMirror-line::-moz-selection,\n.cm-fat-cursor .CodeMirror-line > span::-moz-selection,\n.cm-fat-cursor .CodeMirror-line > span > span::-moz-selection { background: transparent; }\n.cm-fat-cursor { caret-color: transparent; }\n@-moz-keyframes blink {\n 0% {}\n 50% { background-color: transparent; }\n 100% {}\n}\n@-webkit-keyframes blink {\n 0% {}\n 50% { background-color: transparent; }\n 100% {}\n}\n@keyframes blink {\n 0% {}\n 50% { background-color: transparent; }\n 100% {}\n}\n\n/* Can style cursor different in overwrite (non-insert) mode */\n.CodeMirror-overwrite .CodeMirror-cursor {}\n\n.cm-tab { display: inline-block; text-decoration: inherit; }\n\n.CodeMirror-rulers {\n position: absolute;\n left: 0; right: 0; top: -50px; bottom: 0;\n overflow: hidden;\n}\n.CodeMirror-ruler {\n border-left: 1px solid #ccc;\n top: 0; bottom: 0;\n position: absolute;\n}\n\n/* DEFAULT THEME */\n\n.cm-s-default .cm-header {color: blue;}\n.cm-s-default .cm-quote {color: #090;}\n.cm-negative {color: #d44;}\n.cm-positive {color: #292;}\n.cm-header, .cm-strong {font-weight: bold;}\n.cm-em {font-style: italic;}\n.cm-link {text-decoration: underline;}\n.cm-strikethrough {text-decoration: line-through;}\n\n.cm-s-default .cm-keyword {color: #708;}\n.cm-s-default .cm-atom {color: #219;}\n.cm-s-default .cm-number {color: #164;}\n.cm-s-default .cm-def {color: #00f;}\n.cm-s-default .cm-variable,\n.cm-s-default .cm-punctuation,\n.cm-s-default .cm-property,\n.cm-s-default .cm-operator {}\n.cm-s-default .cm-variable-2 {color: #05a;}\n.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;}\n.cm-s-default .cm-comment {color: #a50;}\n.cm-s-default .cm-string {color: #a11;}\n.cm-s-default .cm-string-2 {color: #f50;}\n.cm-s-default .cm-meta {color: #555;}\n.cm-s-default .cm-qualifier {color: #555;}\n.cm-s-default .cm-builtin {color: #30a;}\n.cm-s-default .cm-bracket {color: #997;}\n.cm-s-default .cm-tag {color: #170;}\n.cm-s-default .cm-attribute {color: #00c;}\n.cm-s-default .cm-hr {color: #999;}\n.cm-s-default .cm-link {color: #00c;}\n\n.cm-s-default .cm-error {color: #f00;}\n.cm-invalidchar {color: #f00;}\n\n.CodeMirror-composing { border-bottom: 2px solid; }\n\n/* Default styles for common addons */\n\ndiv.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;}\ndiv.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}\n.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }\n.CodeMirror-activeline-background {background: #e8f2ff;}\n\n/* STOP */\n\n/* The rest of this file contains styles related to the mechanics of\n the editor. You probably shouldn't touch them. */\n\n.CodeMirror {\n position: relative;\n overflow: hidden;\n background: white;\n}\n\n.CodeMirror-scroll {\n overflow: scroll !important; /* Things will break if this is overridden */\n /* 50px is the magic margin used to hide the element's real scrollbars */\n /* See overflow: hidden in .CodeMirror */\n margin-bottom: -50px; margin-right: -50px;\n padding-bottom: 50px;\n height: 100%;\n outline: none; /* Prevent dragging from highlighting the element */\n position: relative;\n z-index: 0;\n}\n.CodeMirror-sizer {\n position: relative;\n border-right: 50px solid transparent;\n}\n\n/* The fake, visible scrollbars. Used to force redraw during scrolling\n before actual scrolling happens, thus preventing shaking and\n flickering artifacts. */\n.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n position: absolute;\n z-index: 6;\n display: none;\n outline: none;\n}\n.CodeMirror-vscrollbar {\n right: 0; top: 0;\n overflow-x: hidden;\n overflow-y: scroll;\n}\n.CodeMirror-hscrollbar {\n bottom: 0; left: 0;\n overflow-y: hidden;\n overflow-x: scroll;\n}\n.CodeMirror-scrollbar-filler {\n right: 0; bottom: 0;\n}\n.CodeMirror-gutter-filler {\n left: 0; bottom: 0;\n}\n\n.CodeMirror-gutters {\n position: absolute; left: 0; top: 0;\n min-height: 100%;\n z-index: 3;\n}\n.CodeMirror-gutter {\n white-space: normal;\n height: 100%;\n display: inline-block;\n vertical-align: top;\n margin-bottom: -50px;\n}\n.CodeMirror-gutter-wrapper {\n position: absolute;\n z-index: 4;\n background: none !important;\n border: none !important;\n}\n.CodeMirror-gutter-background {\n position: absolute;\n top: 0; bottom: 0;\n z-index: 4;\n}\n.CodeMirror-gutter-elt {\n position: absolute;\n cursor: default;\n z-index: 4;\n}\n.CodeMirror-gutter-wrapper ::selection { background-color: transparent }\n.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent }\n\n.CodeMirror-lines {\n cursor: text;\n min-height: 1px; /* prevents collapsing before first draw */\n}\n.CodeMirror pre.CodeMirror-line,\n.CodeMirror pre.CodeMirror-line-like {\n /* Reset some styles that the rest of the page might have set */\n -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;\n border-width: 0;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n margin: 0;\n white-space: pre;\n word-wrap: normal;\n line-height: inherit;\n color: inherit;\n z-index: 2;\n position: relative;\n overflow: visible;\n -webkit-tap-highlight-color: transparent;\n -webkit-font-variant-ligatures: contextual;\n font-variant-ligatures: contextual;\n}\n.CodeMirror-wrap pre.CodeMirror-line,\n.CodeMirror-wrap pre.CodeMirror-line-like {\n word-wrap: break-word;\n white-space: pre-wrap;\n word-break: normal;\n}\n\n.CodeMirror-linebackground {\n position: absolute;\n left: 0; right: 0; top: 0; bottom: 0;\n z-index: 0;\n}\n\n.CodeMirror-linewidget {\n position: relative;\n z-index: 2;\n padding: 0.1px; /* Force widget margins to stay inside of the container */\n}\n\n.CodeMirror-widget {}\n\n.CodeMirror-rtl pre { direction: rtl; }\n\n.CodeMirror-code {\n outline: none;\n}\n\n/* Force content-box sizing for the elements where we expect it */\n.CodeMirror-scroll,\n.CodeMirror-sizer,\n.CodeMirror-gutter,\n.CodeMirror-gutters,\n.CodeMirror-linenumber {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n}\n\n.CodeMirror-measure {\n position: absolute;\n width: 100%;\n height: 0;\n overflow: hidden;\n visibility: hidden;\n}\n\n.CodeMirror-cursor {\n position: absolute;\n pointer-events: none;\n}\n.CodeMirror-measure pre { position: static; }\n\ndiv.CodeMirror-cursors {\n visibility: hidden;\n position: relative;\n z-index: 3;\n}\ndiv.CodeMirror-dragcursors {\n visibility: visible;\n}\n\n.CodeMirror-focused div.CodeMirror-cursors {\n visibility: visible;\n}\n\n.CodeMirror-selected { background: #d9d9d9; }\n.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }\n.CodeMirror-crosshair { cursor: crosshair; }\n.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }\n.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }\n\n.cm-searching {\n background-color: #ffa;\n background-color: rgba(255, 255, 0, .4);\n}\n\n/* Used to force a border model for a node */\n.cm-force-border { padding-right: .1px; }\n\n@media print {\n /* Hide the cursor when printing */\n .CodeMirror div.CodeMirror-cursors {\n visibility: hidden;\n }\n}\n\n/* See issue #2901 */\n.cm-tab-wrap-hack:after { content: ''; }\n\n/* Help users use markselection to safely style text background */\nspan.CodeMirror-selectedtext { background: none; }\n","<template>\n <a-button\n :title=\"display_text\"\n :disabled=\"!hasText\"\n style=\"padding-left: 1px; width: 100%\"\n type=\"link\"\n @click=\"is_open()\"\n >\n <span\n style=\"\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 100%;\n user-select: text;\n text-align: left;\n \"\n >\n {{ hasText ? display_text : '—' }}\n </span>\n </a-button>\n <a-drawer\n :body-style=\"{ padding: '10px 20px' }\"\n :footer=\"null\"\n :open=\"open\"\n :width=\"1120\"\n title=\"数据来源\"\n @close=\"onClose\"\n >\n <a-spin :spinning=\"loading\">\n <a-tabs v-model:activeKey=\"active_tab\">\n <!--\n 修改 / 删除 / 打印放在 tabs 的 #rightExtra:按钮属于「审批单」这条记录,\n 不属于「基础信息」tab,所以必须等切到审批单 tab 才显示(v-if 看 active_tab)。\n 是否显示与点击行为统一由 useApproveRecordActions 封装 —— 与 Cell_click_approve\n 抽屉右上角是同一份 composable、同一段按钮写法。\n -->\n <template #rightExtra>\n <template v-if=\"active_tab === 'approve'\">\n <a-button\n v-if=\"canShow('edit_approve')\"\n :loading=\"actionsLoading\"\n @click=\"runAction('edit_approve')\"\n >\n 修改\n </a-button>\n <a-button\n v-if=\"canShow('cancel_agree_approve')\"\n :loading=\"actionsLoading\"\n danger\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"runAction('cancel_agree_approve')\"\n >\n 删除\n </a-button>\n <a-button\n v-if=\"canShow('print')\"\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"runAction('print')\"\n >\n 打印\n </a-button>\n </template>\n </template>\n <a-tab-pane\n key=\"base\"\n tab=\"基础信息\"\n >\n <a-descriptions\n bordered\n :column=\"3\"\n size=\"small\"\n >\n <a-descriptions-item label=\"数据ID\">\n {{ excel_item.id }}\n </a-descriptions-item>\n <a-descriptions-item\n :span=\"2\"\n label=\"文件名称\"\n >\n {{ excel_item.name }}\n </a-descriptions-item>\n <a-descriptions-item label=\"数据类型\">\n {{ excel_item.excel_type__name }}\n </a-descriptions-item>\n <a-descriptions-item label=\"数据来源\">\n {{ excel_item.source_type_display }}\n </a-descriptions-item>\n <a-descriptions-item label=\"状态\">\n {{ excel_item.status_display }}\n </a-descriptions-item>\n <a-descriptions-item label=\"上传人\">\n {{ excel_item.real_name }}\n </a-descriptions-item>\n <a-descriptions-item label=\"上传时间\">\n {{ excel_item.create_time }}\n </a-descriptions-item>\n <a-descriptions-item label=\"更新时间\">\n {{ excel_item.update_time }}\n </a-descriptions-item>\n <a-descriptions-item label=\"在用数据\">\n {{ excel_item.is_used ? '在用' : '禁用' }}\n </a-descriptions-item>\n <a-descriptions-item label=\"正确记录数\">\n {{ excel_item.good_record_num }}\n </a-descriptions-item>\n <a-descriptions-item label=\"错误记录数\">\n {{ excel_item.error_record_num }}\n </a-descriptions-item>\n <a-descriptions-item label=\"导入数量\">\n {{ excel_item.import_num }}\n </a-descriptions-item>\n <a-descriptions-item label=\"最大行号\">\n {{ excel_item.max_row_index }}\n </a-descriptions-item>\n <a-descriptions-item\n :span=\"2\"\n label=\"备注\"\n >\n {{ excel_item.bz }}\n </a-descriptions-item>\n </a-descriptions>\n </a-tab-pane>\n <a-tab-pane\n v-if=\"approve_record\"\n key=\"approve\"\n tab=\"审批单\"\n >\n <!--\n :show-actions=\"false\" —— 修改/删除/打印按钮已移到上面 tabs 的 #rightExtra,\n 关掉详情组件自带的那一份,避免同一个抽屉里出现两套同名按钮。\n 外层包一层 ref 是打印区域:runAction('print') 打的就是它。\n -->\n <div ref=\"printAreaRef\">\n <approval-for-details\n ref=\"detailRef\"\n :key=\"approve_record.id\"\n :record=\"approve_record\"\n :show-actions=\"false\"\n />\n </div>\n </a-tab-pane>\n </a-tabs>\n </a-spin>\n </a-drawer>\n <!--\n 两个模态框按需渲染(v-if 用 editorOpen / removeOpen):只要 <ApprovalEditorModal>\n 进了 vdom,异步加载器就会触发 chunk 下载(core.vue → bpmn-js 约 1MB 的重链),\n 所以必须等真正点「修改」了才渲染。\n -->\n <ApprovalEditorModal\n v-if=\"editorOpen\"\n v-model:open=\"editorOpen\"\n v-bind=\"editorProps\"\n />\n <cancel-modal\n v-if=\"removeOpen\"\n v-model:cancel-modal-show=\"removeOpen\"\n v-bind=\"removeProps\"\n />\n</template>\n\n<script lang=\"ts\">\n// ⚠️ 这段在普通 <script> 块中:模块加载时只执行一次,缓存才是真正的全局共享。\n// (<script setup> 内的代码编译后进入 setup(),每个实例创建都会重新执行,放那里等于没缓存)\nconst INFO_CACHE_TTL = 5 * 60 * 1000;\nconst infoCache = new Map<string, { data: Record<string, any>; time: number }>();\nconst infoPending = new Map<string, Promise<Record<string, any>>>();\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, defineAsyncComponent, onMounted, ref } from 'vue';\nimport ApprovalForDetails from './approval_for_details.vue';\nimport CancelModal from './approval/components/CancelModal.vue';\nimport { useApproveRecordActions } from './approval/useApprovalRecordActions';\nimport { useGetApiData, useUserStore } from '../init-plugin';\n\ndefineOptions({\n name: 'Cell_click_data_source',\n});\n\nconst props = defineProps<{\n cmpObj: Record<string, any>;\n}>();\n\nconst getApiData = useGetApiData();\nconst userStore = useUserStore();\nconst current_org = userStore?.current_org;\n\nconst open = ref(false);\nconst loading = ref(false);\nconst active_tab = ref('base');\nconst loaded = ref(false);\nconst display_text = ref(props.cmpObj?.text);\n/**\n * `cmpObj.text` 是数据来源记录 id;为空(null / undefined / 空串)时这条单元格\n * 没有可点击的数据来源:按钮禁用、显示横杠、禁止拉接口。\n */\nconst hasText = computed(() => {\n const t = props.cmpObj?.text;\n return t !== null && t !== undefined && t !== '';\n});\nconst excel_item = ref<Record<string, any>>({});\nconst approve_record = ref<Record<string, any> | null>(null);\nconst printAreaRef = ref<HTMLElement | null>(null);\n/** 详情组件实例:修改保存 / 作废成功后调它的 reload() 重拉详情 */\nconst detailRef = ref<{ reload: () => void } | null>(null);\n\n/**\n * 修改 / 删除 / 打印的统一封装(是否显示 + 点击行为),按钮渲染在 tabs 的 #rightExtra。\n *\n * ⚠️ `recordId` 里的 `open.value ?` 门条件不能去掉:\n * 本组件是**单元格组件**,列表里每一行都会渲染一个实例;`useApproveRecordActions`\n * 内部的 immediate watch 会对非空 recordId 立即拉 `/approve/get_approve_record`,\n * 不加门就是一页 50 行 = 50 个请求。抽屉没开(或这条数据没有审批单)时保持 null。\n */\nconst {\n canShow,\n runAction,\n loading: actionsLoading,\n editorOpen,\n editorProps,\n removeOpen,\n removeProps,\n} = useApproveRecordActions({\n recordId: () => (open.value ? (approve_record.value?.id ?? null) : null),\n modelType: () => approve_record.value?.menu_flag,\n getPrintElement: () => printAreaRef.value,\n printTitle: '审批信息',\n onChange: () => {\n // 详情组件的 :key 是 approve_record.id,保存后 id 不变,必须手动调 reload 重拉\n detailRef.value?.reload();\n },\n});\n\n/**\n * 编辑模态框必须**异步**引入(与 approval_for_details / Cell_click_approve 同一个理由):\n * 本组件在 install() 里是静态注册的,静态 import 会把\n * ApprovalEditorModal → core.vue → bpmn-js 这条约 1MB 的重链拉回首屏静态闭包。\n */\nconst ApprovalEditorModal = defineAsyncComponent(\n () => import('./approval/ApprovalEditorModal.vue'),\n);\n\nconst fetch_info = async (excel_item_id: string) => {\n const cached = infoCache.get(excel_item_id);\n if (cached && Date.now() - cached.time < INFO_CACHE_TTL) {\n return cached.data;\n }\n // 并发去重:多个实例同时挂载时只发一次请求\n let pending = infoPending.get(excel_item_id);\n if (!pending) {\n pending = getApiData(\n {\n org_id: current_org?.id,\n excel_item_id,\n },\n '/approve/get_excel_item_source_info',\n ).finally(() => {\n infoPending.delete(excel_item_id);\n });\n infoPending.set(excel_item_id, pending);\n }\n const res: any = await pending;\n const data = {\n excel_item: res?.excel_item || {},\n approve_record: res?.approve_record || null,\n };\n infoCache.set(excel_item_id, { data, time: Date.now() });\n return data;\n};\n\nconst load_info = async () => {\n loading.value = true;\n try {\n const data = await fetch_info(props.cmpObj.text);\n excel_item.value = data.excel_item;\n approve_record.value = data.approve_record;\n if (excel_item.value.name) {\n display_text.value = excel_item.value.name;\n }\n loaded.value = true;\n } finally {\n loading.value = false;\n }\n};\n// 挂载时预取一次(有模块级缓存兜底),让按钮点击前就显示文件名称\nonMounted(() => {\n if (hasText.value) {\n load_info();\n }\n});\nconst is_open = async () => {\n if (!hasText.value) {\n return;\n }\n open.value = true;\n active_tab.value = 'base';\n if (!loaded.value) {\n await load_info();\n }\n};\nconst onClose = () => {\n open.value = false;\n};\n</script>\n","<template>\n <a-button\n :title=\"display_text\"\n :disabled=\"!hasText\"\n style=\"padding-left: 1px; width: 100%\"\n type=\"link\"\n @click=\"is_open()\"\n >\n <span\n style=\"\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 100%;\n user-select: text;\n text-align: left;\n \"\n >\n {{ hasText ? display_text : '—' }}\n </span>\n </a-button>\n <a-drawer\n :body-style=\"{ padding: '10px 20px' }\"\n :footer=\"null\"\n :open=\"open\"\n :width=\"1120\"\n title=\"数据来源\"\n @close=\"onClose\"\n >\n <a-spin :spinning=\"loading\">\n <a-tabs v-model:activeKey=\"active_tab\">\n <!--\n 修改 / 删除 / 打印放在 tabs 的 #rightExtra:按钮属于「审批单」这条记录,\n 不属于「基础信息」tab,所以必须等切到审批单 tab 才显示(v-if 看 active_tab)。\n 是否显示与点击行为统一由 useApproveRecordActions 封装 —— 与 Cell_click_approve\n 抽屉右上角是同一份 composable、同一段按钮写法。\n -->\n <template #rightExtra>\n <template v-if=\"active_tab === 'approve'\">\n <a-button\n v-if=\"canShow('edit_approve')\"\n :loading=\"actionsLoading\"\n @click=\"runAction('edit_approve')\"\n >\n 修改\n </a-button>\n <a-button\n v-if=\"canShow('cancel_agree_approve')\"\n :loading=\"actionsLoading\"\n danger\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"runAction('cancel_agree_approve')\"\n >\n 删除\n </a-button>\n <a-button\n v-if=\"canShow('print')\"\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"runAction('print')\"\n >\n 打印\n </a-button>\n </template>\n </template>\n <a-tab-pane\n key=\"base\"\n tab=\"基础信息\"\n >\n <a-descriptions\n bordered\n :column=\"3\"\n size=\"small\"\n >\n <a-descriptions-item label=\"数据ID\">\n {{ excel_item.id }}\n </a-descriptions-item>\n <a-descriptions-item\n :span=\"2\"\n label=\"文件名称\"\n >\n {{ excel_item.name }}\n </a-descriptions-item>\n <a-descriptions-item label=\"数据类型\">\n {{ excel_item.excel_type__name }}\n </a-descriptions-item>\n <a-descriptions-item label=\"数据来源\">\n {{ excel_item.source_type_display }}\n </a-descriptions-item>\n <a-descriptions-item label=\"状态\">\n {{ excel_item.status_display }}\n </a-descriptions-item>\n <a-descriptions-item label=\"上传人\">\n {{ excel_item.real_name }}\n </a-descriptions-item>\n <a-descriptions-item label=\"上传时间\">\n {{ excel_item.create_time }}\n </a-descriptions-item>\n <a-descriptions-item label=\"更新时间\">\n {{ excel_item.update_time }}\n </a-descriptions-item>\n <a-descriptions-item label=\"在用数据\">\n {{ excel_item.is_used ? '在用' : '禁用' }}\n </a-descriptions-item>\n <a-descriptions-item label=\"正确记录数\">\n {{ excel_item.good_record_num }}\n </a-descriptions-item>\n <a-descriptions-item label=\"错误记录数\">\n {{ excel_item.error_record_num }}\n </a-descriptions-item>\n <a-descriptions-item label=\"导入数量\">\n {{ excel_item.import_num }}\n </a-descriptions-item>\n <a-descriptions-item label=\"最大行号\">\n {{ excel_item.max_row_index }}\n </a-descriptions-item>\n <a-descriptions-item\n :span=\"2\"\n label=\"备注\"\n >\n {{ excel_item.bz }}\n </a-descriptions-item>\n </a-descriptions>\n </a-tab-pane>\n <a-tab-pane\n v-if=\"approve_record\"\n key=\"approve\"\n tab=\"审批单\"\n >\n <!--\n :show-actions=\"false\" —— 修改/删除/打印按钮已移到上面 tabs 的 #rightExtra,\n 关掉详情组件自带的那一份,避免同一个抽屉里出现两套同名按钮。\n 外层包一层 ref 是打印区域:runAction('print') 打的就是它。\n -->\n <div ref=\"printAreaRef\">\n <approval-for-details\n ref=\"detailRef\"\n :key=\"approve_record.id\"\n :record=\"approve_record\"\n :show-actions=\"false\"\n />\n </div>\n </a-tab-pane>\n </a-tabs>\n </a-spin>\n </a-drawer>\n <!--\n 两个模态框按需渲染(v-if 用 editorOpen / removeOpen):只要 <ApprovalEditorModal>\n 进了 vdom,异步加载器就会触发 chunk 下载(core.vue → bpmn-js 约 1MB 的重链),\n 所以必须等真正点「修改」了才渲染。\n -->\n <ApprovalEditorModal\n v-if=\"editorOpen\"\n v-model:open=\"editorOpen\"\n v-bind=\"editorProps\"\n />\n <cancel-modal\n v-if=\"removeOpen\"\n v-model:cancel-modal-show=\"removeOpen\"\n v-bind=\"removeProps\"\n />\n</template>\n\n<script lang=\"ts\">\n// ⚠️ 这段在普通 <script> 块中:模块加载时只执行一次,缓存才是真正的全局共享。\n// (<script setup> 内的代码编译后进入 setup(),每个实例创建都会重新执行,放那里等于没缓存)\nconst INFO_CACHE_TTL = 5 * 60 * 1000;\nconst infoCache = new Map<string, { data: Record<string, any>; time: number }>();\nconst infoPending = new Map<string, Promise<Record<string, any>>>();\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, defineAsyncComponent, onMounted, ref } from 'vue';\nimport ApprovalForDetails from './approval_for_details.vue';\nimport CancelModal from './approval/components/CancelModal.vue';\nimport { useApproveRecordActions } from './approval/useApprovalRecordActions';\nimport { useGetApiData, useUserStore } from '../init-plugin';\n\ndefineOptions({\n name: 'Cell_click_data_source',\n});\n\nconst props = defineProps<{\n cmpObj: Record<string, any>;\n}>();\n\nconst getApiData = useGetApiData();\nconst userStore = useUserStore();\nconst current_org = userStore?.current_org;\n\nconst open = ref(false);\nconst loading = ref(false);\nconst active_tab = ref('base');\nconst loaded = ref(false);\nconst display_text = ref(props.cmpObj?.text);\n/**\n * `cmpObj.text` 是数据来源记录 id;为空(null / undefined / 空串)时这条单元格\n * 没有可点击的数据来源:按钮禁用、显示横杠、禁止拉接口。\n */\nconst hasText = computed(() => {\n const t = props.cmpObj?.text;\n return t !== null && t !== undefined && t !== '';\n});\nconst excel_item = ref<Record<string, any>>({});\nconst approve_record = ref<Record<string, any> | null>(null);\nconst printAreaRef = ref<HTMLElement | null>(null);\n/** 详情组件实例:修改保存 / 作废成功后调它的 reload() 重拉详情 */\nconst detailRef = ref<{ reload: () => void } | null>(null);\n\n/**\n * 修改 / 删除 / 打印的统一封装(是否显示 + 点击行为),按钮渲染在 tabs 的 #rightExtra。\n *\n * ⚠️ `recordId` 里的 `open.value ?` 门条件不能去掉:\n * 本组件是**单元格组件**,列表里每一行都会渲染一个实例;`useApproveRecordActions`\n * 内部的 immediate watch 会对非空 recordId 立即拉 `/approve/get_approve_record`,\n * 不加门就是一页 50 行 = 50 个请求。抽屉没开(或这条数据没有审批单)时保持 null。\n */\nconst {\n canShow,\n runAction,\n loading: actionsLoading,\n editorOpen,\n editorProps,\n removeOpen,\n removeProps,\n} = useApproveRecordActions({\n recordId: () => (open.value ? (approve_record.value?.id ?? null) : null),\n modelType: () => approve_record.value?.menu_flag,\n getPrintElement: () => printAreaRef.value,\n printTitle: '审批信息',\n onChange: () => {\n // 详情组件的 :key 是 approve_record.id,保存后 id 不变,必须手动调 reload 重拉\n detailRef.value?.reload();\n },\n});\n\n/**\n * 编辑模态框必须**异步**引入(与 approval_for_details / Cell_click_approve 同一个理由):\n * 本组件在 install() 里是静态注册的,静态 import 会把\n * ApprovalEditorModal → core.vue → bpmn-js 这条约 1MB 的重链拉回首屏静态闭包。\n */\nconst ApprovalEditorModal = defineAsyncComponent(\n () => import('./approval/ApprovalEditorModal.vue'),\n);\n\nconst fetch_info = async (excel_item_id: string) => {\n const cached = infoCache.get(excel_item_id);\n if (cached && Date.now() - cached.time < INFO_CACHE_TTL) {\n return cached.data;\n }\n // 并发去重:多个实例同时挂载时只发一次请求\n let pending = infoPending.get(excel_item_id);\n if (!pending) {\n pending = getApiData(\n {\n org_id: current_org?.id,\n excel_item_id,\n },\n '/approve/get_excel_item_source_info',\n ).finally(() => {\n infoPending.delete(excel_item_id);\n });\n infoPending.set(excel_item_id, pending);\n }\n const res: any = await pending;\n const data = {\n excel_item: res?.excel_item || {},\n approve_record: res?.approve_record || null,\n };\n infoCache.set(excel_item_id, { data, time: Date.now() });\n return data;\n};\n\nconst load_info = async () => {\n loading.value = true;\n try {\n const data = await fetch_info(props.cmpObj.text);\n excel_item.value = data.excel_item;\n approve_record.value = data.approve_record;\n if (excel_item.value.name) {\n display_text.value = excel_item.value.name;\n }\n loaded.value = true;\n } finally {\n loading.value = false;\n }\n};\n// 挂载时预取一次(有模块级缓存兜底),让按钮点击前就显示文件名称\nonMounted(() => {\n if (hasText.value) {\n load_info();\n }\n});\nconst is_open = async () => {\n if (!hasText.value) {\n return;\n }\n open.value = true;\n active_tab.value = 'base';\n if (!loaded.value) {\n await load_info();\n }\n};\nconst onClose = () => {\n open.value = false;\n};\n</script>\n","// 导出组件,供外部 import 使用\nimport './styles';\nimport MyProcess from './MyProcess.vue';\nimport MyProcessViewer from './components/Process/viewer/index.vue';\nimport ApprovalForDetails from './components/approval_for_details.vue';\nimport CellClickDataSource from './components/Cell_click_data_source.vue';\n/**\n * 审批作废(= 删除)弹窗:填作废原因 → `/approve/cancel_agree_approve_record`。\n *\n * ⚠️ **静态**导出(不包 `defineAsyncComponent`):本文件自己的 `import` 就把它放进了\n * 宿主首屏静态闭包,而它本身只有约 2KB;再包一层异步外壳会产出\n * 「同一个模块既被静态 import 又被 `import()`」的形状,宿主构建随即报\n * `INEFFECTIVE_DYNAMIC_IMPORT`,对一个已加载的小模块也没有意义。\n * (历史上它还被 `approval_for_details.vue` 静态引用过;现在按钮/弹窗都已外置到\n * `Cell_click_approve` / `Cell_click_data_source`,本组件不再引用它。)\n */\nimport ApprovalCancelModal from './components/approval/components/CancelModal.vue';\nimport { depsInit, HOST_COMPONENTS } from './init-plugin';\nimport { defineAsyncComponent } from 'vue';\nimport type { Component } from 'vue';\n\n/**\n * 审批相关的 4 个组件走**懒加载导出**(`defineAsyncComponent` + 动态 `import()`)。\n *\n * 为什么:静态 import 会让整块审批代码 —— 包括它依赖的 bpmn-js 流程图引擎 —— 一起进入宿主的\n * **首屏静态闭包**(实测宿主里是约 1 018 KiB 的 `dist-*.js`,被入口 `main-*.js` 静态 `from` 引入),\n * 而宿主可能整场会话都不会渲染审批页。改成动态 import 后构建器会把它拆成独立 chunk,\n * 宿主只在真正路由过去 / 挂载该组件时才下载。\n *\n * 宿主侧的用法**完全不变**(`componentMap: { '...': ApprovalIndex }`、\n * `settingsExtra.tabs[].component = ApprovalSettings`),**不需要**再套一层\n * `defineAsyncComponent(() => ApprovalIndex)` —— 那会变成双层异步包装。\n *\n * 其余静态导出(MyProcess / MyProcessViewer / ApprovalForDetails / CellClickDataSource /\n * ApprovalCancelModal)引用方拿到的依然是**同步组件** —— `ApprovalCancelModal` 是静态的,\n * 原因见文件顶部它 import 处的注释。\n *\n * ⚠️ `: Component` 这个显式注解**不能删**:不加注解时 TS 会把 `defineAsyncComponent` 的推导弹出\n * 类型写进 `dist/index.d.ts`,而该类型引用了 `.vue` 文件里没有导出的私有 `Props`\n * (`error TS4023: Exported variable 'ApprovalSettings' has or is using name 'Props' from external\n * module \".../approvalPageConfig/index.vue\" but cannot be named`),后果是整个 `index.d.ts`\n * 静默不产出、宿主全部解析失败。注解成公开类型 `Component` 就能切断这条私有名的传播链。\n */\nconst ApprovalIndex: Component = defineAsyncComponent(\n () => import('./components/approval/index.vue'),\n);\nconst ApprovalSettings: Component = defineAsyncComponent(\n () => import('./components/approval/components/approvalPageConfig/index.vue'),\n);\nconst ApprovalHistory: Component = defineAsyncComponent(\n () => import('./components/approval/components/approvalHistory/index.vue'),\n);\nconst ApprovalDebugCode: Component = defineAsyncComponent(\n () => import('./components/approval/components/debugCode/debugCode.vue'),\n);\n/**\n * 全屏编辑模态框(详情页/列表单元格上的「修改」用它打开)。\n * 同样必须懒加载:它内部是 core.vue → formConfig/flowConfig → bpmn-js 那条重链。\n * 宿主用法:`<ApprovalEditorModal v-if=\"editorOpen\" v-model:open=\"editorOpen\" v-bind=\"editorProps\" />`\n * —— `v-if` 不能省,否则异步加载器在挂载时就会被触发,懒加载形同虚设。\n */\nconst ApprovalEditorModal: Component = defineAsyncComponent(\n () => import('./components/approval/ApprovalEditorModal.vue'),\n);\n/**\n * 「审批」单元格组件(表格里那个点开看审批详情的链接按钮)—— 从\n * `PSM_ApproveSystemPC/src/components/cellComponent/Cell_click_approve.vue` 移植进库。\n *\n * ⚠️ 必须**懒加载导出 + 懒加载注册**(`install()` 里 `.component('Cell_click_approve', CellClickApprove)`):\n * - 通用表格是用**单元格类型字符串**找组件的(`resolveAsset` 只查全局注册与 `components` 选项),\n * 所以名字必须真的注册进 app 组件表,否则那一格渲染空白、只留一行 warning;\n * - 它内部整条链(`approval_for_details` / `core.vue` / bpmn-js)很重,而**大部分页面根本用不到这一格**,\n * 所以连组件自身也走异步:宿主首屏不为它付任何体积,代价是每一格按钮比同行晚一帧出现。\n *\n * ⛔ 别顺手改成静态 `import`:一旦本文件静态引入它,同时 `install()` 里又保留这层 `defineAsyncComponent`,\n * 就构成「同一 chunk 既静态 import 又被 `import()`」→ 宿主构建直接报 `INEFFECTIVE_DYNAMIC_IMPORT`。\n * (`CancelModal` 正好是相反的情形:它必须静态,原因见文件顶部。)\n *\n * `: Component` 注解同样不能删(TS4023,见上面 ApprovalIndex 处的说明)。\n */\nconst CellClickApprove: Component = defineAsyncComponent(\n () => import('./components/Cell_click_approve.vue'),\n);\n\nexport {\n MyProcess,\n MyProcessViewer,\n ApprovalForDetails,\n CellClickDataSource,\n CellClickApprove,\n ApprovalIndex,\n ApprovalSettings,\n ApprovalHistory,\n ApprovalDebugCode,\n ApprovalEditorModal,\n ApprovalCancelModal,\n};\n\n/**\n * 审批记录「修改 / 删除 / 打印」的**统一封装**:是否显示(判断函数)+ 点击行为。\n *\n * 纯逻辑模块(只依赖 init-plugin 与一份 action 配置片段),可以静态导出:\n * 它不会把审批页或 bpmn 拖进来。宿主/详情壳的按钮都应当走它,别再各写一遍判断,\n * 否则详情页与列表页行按钮的行为迟早漂移。\n */\nexport {\n useApproveRecordActions,\n APPROVE_DETAIL_ACTION_KEYS,\n} from './components/approval/useApprovalRecordActions';\nexport type {\n ApproveDetailActionKey,\n UseApproveRecordActionsOptions,\n} from './components/approval/useApprovalRecordActions';\n\n/** 审批模块内部按名称弹窗的 modal(走宿主 modalBox -> 宿主 basic-layout 的全局组件解析) */\nconst APPROVAL_MODALS: Record<string, () => Promise<any>> = {\n codeHistoryViewModal: () => import('./components/approval/components/codeHistory/codeHistoryViewModal.vue'),\n approvalHistoryViewModal: () =>\n import('./components/approval/components/approvalHistory/approvalHistoryViewModal.vue'),\n flowHistoryViewModal: () =>\n import('./components/approval/components/approvalHistory/flowHistoryViewModal.vue'),\n};\n\nexport default {\n install(app: any, options: any) {\n // 宿主依赖统一收口(request / useUserStore / getApiData / modalBox / 常量 / 组件 ...),\n // 详见 src/init-plugin.ts\n app.use(depsInit(options || {}));\n\n // 宿主传入的组件在这里全局注册:Options API 的模板只会查 components 选项与全局注册,\n // 注入进来的组件无法写进 components 选项,所以必须走全局注册。\n for (const key of Object.keys(HOST_COMPONENTS)) {\n const component = options?.[key];\n if (component) {\n app.component(HOST_COMPONENTS[key], component);\n }\n }\n\n // 审批内部按名称弹窗的 modal,必须全局注册宿主才能通过 modalBox({ component: 'xxx' }) 解析到\n for (const name of Object.keys(APPROVAL_MODALS)) {\n app.component(\n name,\n defineAsyncComponent(APPROVAL_MODALS[name]),\n );\n }\n\n // 这里注册的都是文件顶部那批**已经包装好**的组件引用(`CellClickApprove` / `approvalIndex` /\n // `approvalSettings` / `approvalHistory` 是懒加载包装过的,`CellClickDataSource` 是同步组件)。\n // 别在这里再套一层 `defineAsyncComponent(() => import('...'))`:虽然同一个模块被两处动态\n // import 会被合并到同一个 chunk,但会多出一层无意义的异步包装;更要紧的是,一旦日后有人把\n // 这些组件加回静态 import,就会触发 INEFFECTIVE_DYNAMIC_IMPORT(拆不出独立 chunk)。\n app\n // ⚠️ 这两个单元格组件**必须按名字全局注册**:通用表格的单元格类型是字符串,\n // 解析走的是全局注册表(resolveAsset 不查 <script setup> 的顶层绑定)。\n // `Cell_click_data_source` 是同步注册(它本来就静态导出,且详情组件已在静态闭包内);\n // `Cell_click_approve` 自 2026-09-21 从 PSM_ApproveSystemPC 移植进来,走**异步注册**\n // (宿主首屏不为它付体积,见上面 CellClickApprove 处的说明)。\n .component('Cell_click_data_source', CellClickDataSource)\n .component('Cell_click_approve', CellClickApprove)\n .component('approvalIndex', ApprovalIndex)\n .component('approvalSettings', ApprovalSettings)\n .component('approvalHistory', ApprovalHistory);\n },\n};\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../node_modules/codemirror/mode/xml/xml.js","../node_modules/codemirror/lib/codemirror.css","../src/components/Cell_click_data_source.vue","../src/components/Cell_click_data_source.vue","../src/index.ts"],"sourcesContent":["// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/LICENSE\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"../../lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nvar htmlConfig = {\n autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true,\n 'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true,\n 'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true,\n 'track': true, 'wbr': true, 'menuitem': true},\n implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true,\n 'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true,\n 'th': true, 'tr': true},\n contextGrabbers: {\n 'dd': {'dd': true, 'dt': true},\n 'dt': {'dd': true, 'dt': true},\n 'li': {'li': true},\n 'option': {'option': true, 'optgroup': true},\n 'optgroup': {'optgroup': true},\n 'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true,\n 'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true,\n 'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true,\n 'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true,\n 'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true},\n 'rp': {'rp': true, 'rt': true},\n 'rt': {'rp': true, 'rt': true},\n 'tbody': {'tbody': true, 'tfoot': true},\n 'td': {'td': true, 'th': true},\n 'tfoot': {'tbody': true},\n 'th': {'td': true, 'th': true},\n 'thead': {'tbody': true, 'tfoot': true},\n 'tr': {'tr': true}\n },\n doNotIndent: {\"pre\": true},\n allowUnquoted: true,\n allowMissing: true,\n caseFold: true\n}\n\nvar xmlConfig = {\n autoSelfClosers: {},\n implicitlyClosed: {},\n contextGrabbers: {},\n doNotIndent: {},\n allowUnquoted: false,\n allowMissing: false,\n allowMissingTagName: false,\n caseFold: false\n}\n\nCodeMirror.defineMode(\"xml\", function(editorConf, config_) {\n var indentUnit = editorConf.indentUnit\n var config = {}\n var defaults = config_.htmlMode ? htmlConfig : xmlConfig\n for (var prop in defaults) config[prop] = defaults[prop]\n for (var prop in config_) config[prop] = config_[prop]\n\n // Return variables for tokenizers\n var type, setStyle;\n\n function inText(stream, state) {\n function chain(parser) {\n state.tokenize = parser;\n return parser(stream, state);\n }\n\n var ch = stream.next();\n if (ch == \"<\") {\n if (stream.eat(\"!\")) {\n if (stream.eat(\"[\")) {\n if (stream.match(\"CDATA[\")) return chain(inBlock(\"atom\", \"]]>\"));\n else return null;\n } else if (stream.match(\"--\")) {\n return chain(inBlock(\"comment\", \"-->\"));\n } else if (stream.match(\"DOCTYPE\", true, true)) {\n stream.eatWhile(/[\\w\\._\\-]/);\n return chain(doctype(1));\n } else {\n return null;\n }\n } else if (stream.eat(\"?\")) {\n stream.eatWhile(/[\\w\\._\\-]/);\n state.tokenize = inBlock(\"meta\", \"?>\");\n return \"meta\";\n } else {\n type = stream.eat(\"/\") ? \"closeTag\" : \"openTag\";\n state.tokenize = inTag;\n return \"tag bracket\";\n }\n } else if (ch == \"&\") {\n var ok;\n if (stream.eat(\"#\")) {\n if (stream.eat(\"x\")) {\n ok = stream.eatWhile(/[a-fA-F\\d]/) && stream.eat(\";\");\n } else {\n ok = stream.eatWhile(/[\\d]/) && stream.eat(\";\");\n }\n } else {\n ok = stream.eatWhile(/[\\w\\.\\-:]/) && stream.eat(\";\");\n }\n return ok ? \"atom\" : \"error\";\n } else {\n stream.eatWhile(/[^&<]/);\n return null;\n }\n }\n inText.isInText = true;\n\n function inTag(stream, state) {\n var ch = stream.next();\n if (ch == \">\" || (ch == \"/\" && stream.eat(\">\"))) {\n state.tokenize = inText;\n type = ch == \">\" ? \"endTag\" : \"selfcloseTag\";\n return \"tag bracket\";\n } else if (ch == \"=\") {\n type = \"equals\";\n return null;\n } else if (ch == \"<\") {\n state.tokenize = inText;\n state.state = baseState;\n state.tagName = state.tagStart = null;\n var next = state.tokenize(stream, state);\n return next ? next + \" tag error\" : \"tag error\";\n } else if (/[\\'\\\"]/.test(ch)) {\n state.tokenize = inAttribute(ch);\n state.stringStartCol = stream.column();\n return state.tokenize(stream, state);\n } else {\n stream.match(/^[^\\s\\u00a0=<>\\\"\\']*[^\\s\\u00a0=<>\\\"\\'\\/]/);\n return \"word\";\n }\n }\n\n function inAttribute(quote) {\n var closure = function(stream, state) {\n while (!stream.eol()) {\n if (stream.next() == quote) {\n state.tokenize = inTag;\n break;\n }\n }\n return \"string\";\n };\n closure.isInAttribute = true;\n return closure;\n }\n\n function inBlock(style, terminator) {\n return function(stream, state) {\n while (!stream.eol()) {\n if (stream.match(terminator)) {\n state.tokenize = inText;\n break;\n }\n stream.next();\n }\n return style;\n }\n }\n\n function doctype(depth) {\n return function(stream, state) {\n var ch;\n while ((ch = stream.next()) != null) {\n if (ch == \"<\") {\n state.tokenize = doctype(depth + 1);\n return state.tokenize(stream, state);\n } else if (ch == \">\") {\n if (depth == 1) {\n state.tokenize = inText;\n break;\n } else {\n state.tokenize = doctype(depth - 1);\n return state.tokenize(stream, state);\n }\n }\n }\n return \"meta\";\n };\n }\n\n function lower(tagName) {\n return tagName && tagName.toLowerCase();\n }\n\n function Context(state, tagName, startOfLine) {\n this.prev = state.context;\n this.tagName = tagName || \"\";\n this.indent = state.indented;\n this.startOfLine = startOfLine;\n if (config.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent))\n this.noIndent = true;\n }\n function popContext(state) {\n if (state.context) state.context = state.context.prev;\n }\n function maybePopContext(state, nextTagName) {\n var parentTagName;\n while (true) {\n if (!state.context) {\n return;\n }\n parentTagName = state.context.tagName;\n if (!config.contextGrabbers.hasOwnProperty(lower(parentTagName)) ||\n !config.contextGrabbers[lower(parentTagName)].hasOwnProperty(lower(nextTagName))) {\n return;\n }\n popContext(state);\n }\n }\n\n function baseState(type, stream, state) {\n if (type == \"openTag\") {\n state.tagStart = stream.column();\n return tagNameState;\n } else if (type == \"closeTag\") {\n return closeTagNameState;\n } else {\n return baseState;\n }\n }\n function tagNameState(type, stream, state) {\n if (type == \"word\") {\n state.tagName = stream.current();\n setStyle = \"tag\";\n return attrState;\n } else if (config.allowMissingTagName && type == \"endTag\") {\n setStyle = \"tag bracket\";\n return attrState(type, stream, state);\n } else {\n setStyle = \"error\";\n return tagNameState;\n }\n }\n function closeTagNameState(type, stream, state) {\n if (type == \"word\") {\n var tagName = stream.current();\n if (state.context && state.context.tagName != tagName &&\n config.implicitlyClosed.hasOwnProperty(lower(state.context.tagName)))\n popContext(state);\n if ((state.context && state.context.tagName == tagName) || config.matchClosing === false) {\n setStyle = \"tag\";\n return closeState;\n } else {\n setStyle = \"tag error\";\n return closeStateErr;\n }\n } else if (config.allowMissingTagName && type == \"endTag\") {\n setStyle = \"tag bracket\";\n return closeState(type, stream, state);\n } else {\n setStyle = \"error\";\n return closeStateErr;\n }\n }\n\n function closeState(type, _stream, state) {\n if (type != \"endTag\") {\n setStyle = \"error\";\n return closeState;\n }\n popContext(state);\n return baseState;\n }\n function closeStateErr(type, stream, state) {\n setStyle = \"error\";\n return closeState(type, stream, state);\n }\n\n function attrState(type, _stream, state) {\n if (type == \"word\") {\n setStyle = \"attribute\";\n return attrEqState;\n } else if (type == \"endTag\" || type == \"selfcloseTag\") {\n var tagName = state.tagName, tagStart = state.tagStart;\n state.tagName = state.tagStart = null;\n if (type == \"selfcloseTag\" ||\n config.autoSelfClosers.hasOwnProperty(lower(tagName))) {\n maybePopContext(state, tagName);\n } else {\n maybePopContext(state, tagName);\n state.context = new Context(state, tagName, tagStart == state.indented);\n }\n return baseState;\n }\n setStyle = \"error\";\n return attrState;\n }\n function attrEqState(type, stream, state) {\n if (type == \"equals\") return attrValueState;\n if (!config.allowMissing) setStyle = \"error\";\n return attrState(type, stream, state);\n }\n function attrValueState(type, stream, state) {\n if (type == \"string\") return attrContinuedState;\n if (type == \"word\" && config.allowUnquoted) {setStyle = \"string\"; return attrState;}\n setStyle = \"error\";\n return attrState(type, stream, state);\n }\n function attrContinuedState(type, stream, state) {\n if (type == \"string\") return attrContinuedState;\n return attrState(type, stream, state);\n }\n\n return {\n startState: function(baseIndent) {\n var state = {tokenize: inText,\n state: baseState,\n indented: baseIndent || 0,\n tagName: null, tagStart: null,\n context: null}\n if (baseIndent != null) state.baseIndent = baseIndent\n return state\n },\n\n token: function(stream, state) {\n if (!state.tagName && stream.sol())\n state.indented = stream.indentation();\n\n if (stream.eatSpace()) return null;\n type = null;\n var style = state.tokenize(stream, state);\n if ((style || type) && style != \"comment\") {\n setStyle = null;\n state.state = state.state(type || style, stream, state);\n if (setStyle)\n style = setStyle == \"error\" ? style + \" error\" : setStyle;\n }\n return style;\n },\n\n indent: function(state, textAfter, fullLine) {\n var context = state.context;\n // Indent multi-line strings (e.g. css).\n if (state.tokenize.isInAttribute) {\n if (state.tagStart == state.indented)\n return state.stringStartCol + 1;\n else\n return state.indented + indentUnit;\n }\n if (context && context.noIndent) return CodeMirror.Pass;\n if (state.tokenize != inTag && state.tokenize != inText)\n return fullLine ? fullLine.match(/^(\\s*)/)[0].length : 0;\n // Indent the starts of attribute names.\n if (state.tagName) {\n if (config.multilineTagIndentPastTag !== false)\n return state.tagStart + state.tagName.length + 2;\n else\n return state.tagStart + indentUnit * (config.multilineTagIndentFactor || 1);\n }\n if (config.alignCDATA && /<!\\[CDATA\\[/.test(textAfter)) return 0;\n var tagAfter = textAfter && /^<(\\/)?([\\w_:\\.-]*)/.exec(textAfter);\n if (tagAfter && tagAfter[1]) { // Closing tag spotted\n while (context) {\n if (context.tagName == tagAfter[2]) {\n context = context.prev;\n break;\n } else if (config.implicitlyClosed.hasOwnProperty(lower(context.tagName))) {\n context = context.prev;\n } else {\n break;\n }\n }\n } else if (tagAfter) { // Opening tag spotted\n while (context) {\n var grabbers = config.contextGrabbers[lower(context.tagName)];\n if (grabbers && grabbers.hasOwnProperty(lower(tagAfter[2])))\n context = context.prev;\n else\n break;\n }\n }\n while (context && context.prev && !context.startOfLine)\n context = context.prev;\n if (context) return context.indent + indentUnit;\n else return state.baseIndent || 0;\n },\n\n electricInput: /<\\/[\\s\\w:]+>$/,\n blockCommentStart: \"<!--\",\n blockCommentEnd: \"-->\",\n\n configuration: config.htmlMode ? \"html\" : \"xml\",\n helperType: config.htmlMode ? \"html\" : \"xml\",\n\n skipAttribute: function(state) {\n if (state.state == attrValueState)\n state.state = attrState\n },\n\n xmlCurrentTag: function(state) {\n return state.tagName ? {name: state.tagName, close: state.type == \"closeTag\"} : null\n },\n\n xmlCurrentContext: function(state) {\n var context = []\n for (var cx = state.context; cx; cx = cx.prev)\n context.push(cx.tagName)\n return context.reverse()\n }\n };\n});\n\nCodeMirror.defineMIME(\"text/xml\", \"xml\");\nCodeMirror.defineMIME(\"application/xml\", \"xml\");\nif (!CodeMirror.mimeModes.hasOwnProperty(\"text/html\"))\n CodeMirror.defineMIME(\"text/html\", {name: \"xml\", htmlMode: true});\n\n});\n","/* BASICS */\n\n.CodeMirror {\n /* Set height, width, borders, and global font properties here */\n font-family: monospace;\n height: 300px;\n color: black;\n direction: ltr;\n}\n\n/* PADDING */\n\n.CodeMirror-lines {\n padding: 4px 0; /* Vertical padding around content */\n}\n.CodeMirror pre.CodeMirror-line,\n.CodeMirror pre.CodeMirror-line-like {\n padding: 0 4px; /* Horizontal padding of content */\n}\n\n.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n background-color: white; /* The little square between H and V scrollbars */\n}\n\n/* GUTTER */\n\n.CodeMirror-gutters {\n border-right: 1px solid #ddd;\n background-color: #f7f7f7;\n white-space: nowrap;\n}\n.CodeMirror-linenumbers {}\n.CodeMirror-linenumber {\n padding: 0 3px 0 5px;\n min-width: 20px;\n text-align: right;\n color: #999;\n white-space: nowrap;\n}\n\n.CodeMirror-guttermarker { color: black; }\n.CodeMirror-guttermarker-subtle { color: #999; }\n\n/* CURSOR */\n\n.CodeMirror-cursor {\n border-left: 1px solid black;\n border-right: none;\n width: 0;\n}\n/* Shown when moving in bi-directional text */\n.CodeMirror div.CodeMirror-secondarycursor {\n border-left: 1px solid silver;\n}\n.cm-fat-cursor .CodeMirror-cursor {\n width: auto;\n border: 0 !important;\n background: #7e7;\n}\n.cm-fat-cursor div.CodeMirror-cursors {\n z-index: 1;\n}\n.cm-fat-cursor .CodeMirror-line::selection,\n.cm-fat-cursor .CodeMirror-line > span::selection, \n.cm-fat-cursor .CodeMirror-line > span > span::selection { background: transparent; }\n.cm-fat-cursor .CodeMirror-line::-moz-selection,\n.cm-fat-cursor .CodeMirror-line > span::-moz-selection,\n.cm-fat-cursor .CodeMirror-line > span > span::-moz-selection { background: transparent; }\n.cm-fat-cursor { caret-color: transparent; }\n@-moz-keyframes blink {\n 0% {}\n 50% { background-color: transparent; }\n 100% {}\n}\n@-webkit-keyframes blink {\n 0% {}\n 50% { background-color: transparent; }\n 100% {}\n}\n@keyframes blink {\n 0% {}\n 50% { background-color: transparent; }\n 100% {}\n}\n\n/* Can style cursor different in overwrite (non-insert) mode */\n.CodeMirror-overwrite .CodeMirror-cursor {}\n\n.cm-tab { display: inline-block; text-decoration: inherit; }\n\n.CodeMirror-rulers {\n position: absolute;\n left: 0; right: 0; top: -50px; bottom: 0;\n overflow: hidden;\n}\n.CodeMirror-ruler {\n border-left: 1px solid #ccc;\n top: 0; bottom: 0;\n position: absolute;\n}\n\n/* DEFAULT THEME */\n\n.cm-s-default .cm-header {color: blue;}\n.cm-s-default .cm-quote {color: #090;}\n.cm-negative {color: #d44;}\n.cm-positive {color: #292;}\n.cm-header, .cm-strong {font-weight: bold;}\n.cm-em {font-style: italic;}\n.cm-link {text-decoration: underline;}\n.cm-strikethrough {text-decoration: line-through;}\n\n.cm-s-default .cm-keyword {color: #708;}\n.cm-s-default .cm-atom {color: #219;}\n.cm-s-default .cm-number {color: #164;}\n.cm-s-default .cm-def {color: #00f;}\n.cm-s-default .cm-variable,\n.cm-s-default .cm-punctuation,\n.cm-s-default .cm-property,\n.cm-s-default .cm-operator {}\n.cm-s-default .cm-variable-2 {color: #05a;}\n.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;}\n.cm-s-default .cm-comment {color: #a50;}\n.cm-s-default .cm-string {color: #a11;}\n.cm-s-default .cm-string-2 {color: #f50;}\n.cm-s-default .cm-meta {color: #555;}\n.cm-s-default .cm-qualifier {color: #555;}\n.cm-s-default .cm-builtin {color: #30a;}\n.cm-s-default .cm-bracket {color: #997;}\n.cm-s-default .cm-tag {color: #170;}\n.cm-s-default .cm-attribute {color: #00c;}\n.cm-s-default .cm-hr {color: #999;}\n.cm-s-default .cm-link {color: #00c;}\n\n.cm-s-default .cm-error {color: #f00;}\n.cm-invalidchar {color: #f00;}\n\n.CodeMirror-composing { border-bottom: 2px solid; }\n\n/* Default styles for common addons */\n\ndiv.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;}\ndiv.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}\n.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }\n.CodeMirror-activeline-background {background: #e8f2ff;}\n\n/* STOP */\n\n/* The rest of this file contains styles related to the mechanics of\n the editor. You probably shouldn't touch them. */\n\n.CodeMirror {\n position: relative;\n overflow: hidden;\n background: white;\n}\n\n.CodeMirror-scroll {\n overflow: scroll !important; /* Things will break if this is overridden */\n /* 50px is the magic margin used to hide the element's real scrollbars */\n /* See overflow: hidden in .CodeMirror */\n margin-bottom: -50px; margin-right: -50px;\n padding-bottom: 50px;\n height: 100%;\n outline: none; /* Prevent dragging from highlighting the element */\n position: relative;\n z-index: 0;\n}\n.CodeMirror-sizer {\n position: relative;\n border-right: 50px solid transparent;\n}\n\n/* The fake, visible scrollbars. Used to force redraw during scrolling\n before actual scrolling happens, thus preventing shaking and\n flickering artifacts. */\n.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n position: absolute;\n z-index: 6;\n display: none;\n outline: none;\n}\n.CodeMirror-vscrollbar {\n right: 0; top: 0;\n overflow-x: hidden;\n overflow-y: scroll;\n}\n.CodeMirror-hscrollbar {\n bottom: 0; left: 0;\n overflow-y: hidden;\n overflow-x: scroll;\n}\n.CodeMirror-scrollbar-filler {\n right: 0; bottom: 0;\n}\n.CodeMirror-gutter-filler {\n left: 0; bottom: 0;\n}\n\n.CodeMirror-gutters {\n position: absolute; left: 0; top: 0;\n min-height: 100%;\n z-index: 3;\n}\n.CodeMirror-gutter {\n white-space: normal;\n height: 100%;\n display: inline-block;\n vertical-align: top;\n margin-bottom: -50px;\n}\n.CodeMirror-gutter-wrapper {\n position: absolute;\n z-index: 4;\n background: none !important;\n border: none !important;\n}\n.CodeMirror-gutter-background {\n position: absolute;\n top: 0; bottom: 0;\n z-index: 4;\n}\n.CodeMirror-gutter-elt {\n position: absolute;\n cursor: default;\n z-index: 4;\n}\n.CodeMirror-gutter-wrapper ::selection { background-color: transparent }\n.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent }\n\n.CodeMirror-lines {\n cursor: text;\n min-height: 1px; /* prevents collapsing before first draw */\n}\n.CodeMirror pre.CodeMirror-line,\n.CodeMirror pre.CodeMirror-line-like {\n /* Reset some styles that the rest of the page might have set */\n -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;\n border-width: 0;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n margin: 0;\n white-space: pre;\n word-wrap: normal;\n line-height: inherit;\n color: inherit;\n z-index: 2;\n position: relative;\n overflow: visible;\n -webkit-tap-highlight-color: transparent;\n -webkit-font-variant-ligatures: contextual;\n font-variant-ligatures: contextual;\n}\n.CodeMirror-wrap pre.CodeMirror-line,\n.CodeMirror-wrap pre.CodeMirror-line-like {\n word-wrap: break-word;\n white-space: pre-wrap;\n word-break: normal;\n}\n\n.CodeMirror-linebackground {\n position: absolute;\n left: 0; right: 0; top: 0; bottom: 0;\n z-index: 0;\n}\n\n.CodeMirror-linewidget {\n position: relative;\n z-index: 2;\n padding: 0.1px; /* Force widget margins to stay inside of the container */\n}\n\n.CodeMirror-widget {}\n\n.CodeMirror-rtl pre { direction: rtl; }\n\n.CodeMirror-code {\n outline: none;\n}\n\n/* Force content-box sizing for the elements where we expect it */\n.CodeMirror-scroll,\n.CodeMirror-sizer,\n.CodeMirror-gutter,\n.CodeMirror-gutters,\n.CodeMirror-linenumber {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n}\n\n.CodeMirror-measure {\n position: absolute;\n width: 100%;\n height: 0;\n overflow: hidden;\n visibility: hidden;\n}\n\n.CodeMirror-cursor {\n position: absolute;\n pointer-events: none;\n}\n.CodeMirror-measure pre { position: static; }\n\ndiv.CodeMirror-cursors {\n visibility: hidden;\n position: relative;\n z-index: 3;\n}\ndiv.CodeMirror-dragcursors {\n visibility: visible;\n}\n\n.CodeMirror-focused div.CodeMirror-cursors {\n visibility: visible;\n}\n\n.CodeMirror-selected { background: #d9d9d9; }\n.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }\n.CodeMirror-crosshair { cursor: crosshair; }\n.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }\n.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }\n\n.cm-searching {\n background-color: #ffa;\n background-color: rgba(255, 255, 0, .4);\n}\n\n/* Used to force a border model for a node */\n.cm-force-border { padding-right: .1px; }\n\n@media print {\n /* Hide the cursor when printing */\n .CodeMirror div.CodeMirror-cursors {\n visibility: hidden;\n }\n}\n\n/* See issue #2901 */\n.cm-tab-wrap-hack:after { content: ''; }\n\n/* Help users use markselection to safely style text background */\nspan.CodeMirror-selectedtext { background: none; }\n","<template>\n <a-button\n :title=\"display_text\"\n :disabled=\"!hasText\"\n style=\"padding-left: 1px; width: 100%\"\n type=\"link\"\n @click=\"is_open()\"\n >\n <span\n style=\"\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 100%;\n user-select: text;\n text-align: left;\n \"\n >\n {{ hasText ? display_text : '—' }}\n </span>\n </a-button>\n <a-drawer\n :body-style=\"{ padding: '10px 20px' }\"\n :footer=\"null\"\n :open=\"open\"\n :width=\"1120\"\n title=\"数据来源\"\n @close=\"onClose\"\n >\n <a-spin :spinning=\"loading\">\n <a-tabs v-model:activeKey=\"active_tab\">\n <!--\n 修改 / 删除 / 打印放在 tabs 的 #rightExtra:按钮属于「审批单」这条记录,\n 不属于「基础信息」tab,所以必须等切到审批单 tab 才显示(v-if 看 active_tab)。\n 是否显示与点击行为统一由 useApproveRecordActions 封装 —— 与 Cell_click_approve\n 抽屉右上角是同一份 composable、同一段按钮写法。\n -->\n <template #rightExtra>\n <template v-if=\"active_tab === 'approve'\">\n <a-button\n v-if=\"canShow('edit_approve')\"\n :loading=\"actionsLoading\"\n type=\"primary\"\n @click=\"runAction('edit_approve')\"\n >\n 修改\n </a-button>\n <a-button\n v-if=\"canShow('cancel_agree_approve')\"\n :loading=\"actionsLoading\"\n danger\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"runAction('cancel_agree_approve')\"\n >\n 删除\n </a-button>\n <a-button\n v-if=\"canShow('print')\"\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"runAction('print')\"\n >\n 打印\n </a-button>\n </template>\n </template>\n <a-tab-pane\n key=\"base\"\n tab=\"基础信息\"\n >\n <a-descriptions\n bordered\n :column=\"3\"\n size=\"small\"\n >\n <a-descriptions-item label=\"数据ID\">\n {{ excel_item.id }}\n </a-descriptions-item>\n <a-descriptions-item\n :span=\"2\"\n label=\"文件名称\"\n >\n {{ excel_item.name }}\n </a-descriptions-item>\n <a-descriptions-item label=\"数据类型\">\n {{ excel_item.excel_type__name }}\n </a-descriptions-item>\n <a-descriptions-item label=\"数据来源\">\n {{ excel_item.source_type_display }}\n </a-descriptions-item>\n <a-descriptions-item label=\"状态\">\n {{ excel_item.status_display }}\n </a-descriptions-item>\n <a-descriptions-item label=\"上传人\">\n {{ excel_item.real_name }}\n </a-descriptions-item>\n <a-descriptions-item label=\"上传时间\">\n {{ excel_item.create_time }}\n </a-descriptions-item>\n <a-descriptions-item label=\"更新时间\">\n {{ excel_item.update_time }}\n </a-descriptions-item>\n <a-descriptions-item label=\"在用数据\">\n {{ excel_item.is_used ? '在用' : '禁用' }}\n </a-descriptions-item>\n <a-descriptions-item label=\"正确记录数\">\n {{ excel_item.good_record_num }}\n </a-descriptions-item>\n <a-descriptions-item label=\"错误记录数\">\n {{ excel_item.error_record_num }}\n </a-descriptions-item>\n <a-descriptions-item label=\"导入数量\">\n {{ excel_item.import_num }}\n </a-descriptions-item>\n <a-descriptions-item label=\"最大行号\">\n {{ excel_item.max_row_index }}\n </a-descriptions-item>\n <a-descriptions-item\n :span=\"2\"\n label=\"备注\"\n >\n {{ excel_item.bz }}\n </a-descriptions-item>\n </a-descriptions>\n </a-tab-pane>\n <a-tab-pane\n v-if=\"approve_record\"\n key=\"approve\"\n tab=\"审批单\"\n >\n <!--\n :show-actions=\"false\" —— 修改/删除/打印按钮已移到上面 tabs 的 #rightExtra,\n 关掉详情组件自带的那一份,避免同一个抽屉里出现两套同名按钮。\n 外层包一层 ref 是打印区域:runAction('print') 打的就是它。\n -->\n <div ref=\"printAreaRef\">\n <approval-for-details\n ref=\"detailRef\"\n :key=\"approve_record.id\"\n :record=\"approve_record\"\n :show-actions=\"false\"\n />\n </div>\n </a-tab-pane>\n </a-tabs>\n </a-spin>\n </a-drawer>\n <!--\n 两个模态框按需渲染(v-if 用 editorOpen / removeOpen):只要 <ApprovalEditorModal>\n 进了 vdom,异步加载器就会触发 chunk 下载(core.vue → bpmn-js 约 1MB 的重链),\n 所以必须等真正点「修改」了才渲染。\n -->\n <ApprovalEditorModal\n v-if=\"editorOpen\"\n v-model:open=\"editorOpen\"\n v-bind=\"editorProps\"\n />\n <cancel-modal\n v-if=\"removeOpen\"\n v-model:cancel-modal-show=\"removeOpen\"\n v-bind=\"removeProps\"\n />\n</template>\n\n<script lang=\"ts\">\n// ⚠️ 这段在普通 <script> 块中:模块加载时只执行一次,缓存才是真正的全局共享。\n// (<script setup> 内的代码编译后进入 setup(),每个实例创建都会重新执行,放那里等于没缓存)\nconst INFO_CACHE_TTL = 5 * 60 * 1000;\nconst infoCache = new Map<string, { data: Record<string, any>; time: number }>();\nconst infoPending = new Map<string, Promise<Record<string, any>>>();\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, defineAsyncComponent, onMounted, ref } from 'vue';\nimport ApprovalForDetails from './approval_for_details.vue';\nimport CancelModal from './approval/components/CancelModal.vue';\nimport { useApproveRecordActions } from './approval/useApprovalRecordActions';\nimport { useGetApiData, useUserStore } from '../init-plugin';\n\ndefineOptions({\n name: 'Cell_click_data_source',\n});\n\nconst props = defineProps<{\n cmpObj: Record<string, any>;\n}>();\n\nconst getApiData = useGetApiData();\nconst userStore = useUserStore();\nconst current_org = userStore?.current_org;\n\nconst open = ref(false);\nconst loading = ref(false);\nconst active_tab = ref('base');\nconst loaded = ref(false);\nconst display_text = ref(props.cmpObj?.text);\n/**\n * `cmpObj.text` 是数据来源记录 id;为空(null / undefined / 空串)时这条单元格\n * 没有可点击的数据来源:按钮禁用、显示横杠、禁止拉接口。\n */\nconst hasText = computed(() => {\n const t = props.cmpObj?.text;\n return t !== null && t !== undefined && t !== '';\n});\nconst excel_item = ref<Record<string, any>>({});\nconst approve_record = ref<Record<string, any> | null>(null);\nconst printAreaRef = ref<HTMLElement | null>(null);\n/** 详情组件实例:修改保存 / 作废成功后调它的 reload() 重拉详情 */\nconst detailRef = ref<{ reload: () => void } | null>(null);\n\n/**\n * 修改 / 删除 / 打印的统一封装(是否显示 + 点击行为),按钮渲染在 tabs 的 #rightExtra。\n *\n * ⚠️ `recordId` 里的 `open.value ?` 门条件不能去掉:\n * 本组件是**单元格组件**,列表里每一行都会渲染一个实例;`useApproveRecordActions`\n * 内部的 immediate watch 会对非空 recordId 立即拉 `/approve/get_approve_record`,\n * 不加门就是一页 50 行 = 50 个请求。抽屉没开(或这条数据没有审批单)时保持 null。\n */\nconst {\n canShow,\n runAction,\n loading: actionsLoading,\n editorOpen,\n editorProps,\n removeOpen,\n removeProps,\n} = useApproveRecordActions({\n recordId: () => (open.value ? (approve_record.value?.id ?? null) : null),\n modelType: () => approve_record.value?.menu_flag,\n getPrintElement: () => printAreaRef.value,\n printTitle: '审批信息',\n onChange: () => {\n // 详情组件的 :key 是 approve_record.id,保存后 id 不变,必须手动调 reload 重拉\n detailRef.value?.reload();\n },\n});\n\n/**\n * 编辑模态框必须**异步**引入(与 approval_for_details / Cell_click_approve 同一个理由):\n * 本组件在 install() 里是静态注册的,静态 import 会把\n * ApprovalEditorModal → core.vue → bpmn-js 这条约 1MB 的重链拉回首屏静态闭包。\n */\nconst ApprovalEditorModal = defineAsyncComponent(\n () => import('./approval/ApprovalEditorModal.vue'),\n);\n\nconst fetch_info = async (excel_item_id: string) => {\n const cached = infoCache.get(excel_item_id);\n if (cached && Date.now() - cached.time < INFO_CACHE_TTL) {\n return cached.data;\n }\n // 并发去重:多个实例同时挂载时只发一次请求\n let pending = infoPending.get(excel_item_id);\n if (!pending) {\n pending = getApiData(\n {\n org_id: current_org?.id,\n excel_item_id,\n },\n '/approve/get_excel_item_source_info',\n ).finally(() => {\n infoPending.delete(excel_item_id);\n });\n infoPending.set(excel_item_id, pending);\n }\n const res: any = await pending;\n const data = {\n excel_item: res?.excel_item || {},\n approve_record: res?.approve_record || null,\n };\n infoCache.set(excel_item_id, { data, time: Date.now() });\n return data;\n};\n\nconst load_info = async () => {\n loading.value = true;\n try {\n const data = await fetch_info(props.cmpObj.text);\n excel_item.value = data.excel_item;\n approve_record.value = data.approve_record;\n if (excel_item.value.name) {\n display_text.value = excel_item.value.name;\n }\n loaded.value = true;\n } finally {\n loading.value = false;\n }\n};\n// 挂载时预取一次(有模块级缓存兜底),让按钮点击前就显示文件名称\nonMounted(() => {\n if (hasText.value) {\n load_info();\n }\n});\nconst is_open = async () => {\n if (!hasText.value) {\n return;\n }\n open.value = true;\n active_tab.value = 'base';\n if (!loaded.value) {\n await load_info();\n }\n};\nconst onClose = () => {\n open.value = false;\n};\n</script>\n","<template>\n <a-button\n :title=\"display_text\"\n :disabled=\"!hasText\"\n style=\"padding-left: 1px; width: 100%\"\n type=\"link\"\n @click=\"is_open()\"\n >\n <span\n style=\"\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 100%;\n user-select: text;\n text-align: left;\n \"\n >\n {{ hasText ? display_text : '—' }}\n </span>\n </a-button>\n <a-drawer\n :body-style=\"{ padding: '10px 20px' }\"\n :footer=\"null\"\n :open=\"open\"\n :width=\"1120\"\n title=\"数据来源\"\n @close=\"onClose\"\n >\n <a-spin :spinning=\"loading\">\n <a-tabs v-model:activeKey=\"active_tab\">\n <!--\n 修改 / 删除 / 打印放在 tabs 的 #rightExtra:按钮属于「审批单」这条记录,\n 不属于「基础信息」tab,所以必须等切到审批单 tab 才显示(v-if 看 active_tab)。\n 是否显示与点击行为统一由 useApproveRecordActions 封装 —— 与 Cell_click_approve\n 抽屉右上角是同一份 composable、同一段按钮写法。\n -->\n <template #rightExtra>\n <template v-if=\"active_tab === 'approve'\">\n <a-button\n v-if=\"canShow('edit_approve')\"\n :loading=\"actionsLoading\"\n type=\"primary\"\n @click=\"runAction('edit_approve')\"\n >\n 修改\n </a-button>\n <a-button\n v-if=\"canShow('cancel_agree_approve')\"\n :loading=\"actionsLoading\"\n danger\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"runAction('cancel_agree_approve')\"\n >\n 删除\n </a-button>\n <a-button\n v-if=\"canShow('print')\"\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"runAction('print')\"\n >\n 打印\n </a-button>\n </template>\n </template>\n <a-tab-pane\n key=\"base\"\n tab=\"基础信息\"\n >\n <a-descriptions\n bordered\n :column=\"3\"\n size=\"small\"\n >\n <a-descriptions-item label=\"数据ID\">\n {{ excel_item.id }}\n </a-descriptions-item>\n <a-descriptions-item\n :span=\"2\"\n label=\"文件名称\"\n >\n {{ excel_item.name }}\n </a-descriptions-item>\n <a-descriptions-item label=\"数据类型\">\n {{ excel_item.excel_type__name }}\n </a-descriptions-item>\n <a-descriptions-item label=\"数据来源\">\n {{ excel_item.source_type_display }}\n </a-descriptions-item>\n <a-descriptions-item label=\"状态\">\n {{ excel_item.status_display }}\n </a-descriptions-item>\n <a-descriptions-item label=\"上传人\">\n {{ excel_item.real_name }}\n </a-descriptions-item>\n <a-descriptions-item label=\"上传时间\">\n {{ excel_item.create_time }}\n </a-descriptions-item>\n <a-descriptions-item label=\"更新时间\">\n {{ excel_item.update_time }}\n </a-descriptions-item>\n <a-descriptions-item label=\"在用数据\">\n {{ excel_item.is_used ? '在用' : '禁用' }}\n </a-descriptions-item>\n <a-descriptions-item label=\"正确记录数\">\n {{ excel_item.good_record_num }}\n </a-descriptions-item>\n <a-descriptions-item label=\"错误记录数\">\n {{ excel_item.error_record_num }}\n </a-descriptions-item>\n <a-descriptions-item label=\"导入数量\">\n {{ excel_item.import_num }}\n </a-descriptions-item>\n <a-descriptions-item label=\"最大行号\">\n {{ excel_item.max_row_index }}\n </a-descriptions-item>\n <a-descriptions-item\n :span=\"2\"\n label=\"备注\"\n >\n {{ excel_item.bz }}\n </a-descriptions-item>\n </a-descriptions>\n </a-tab-pane>\n <a-tab-pane\n v-if=\"approve_record\"\n key=\"approve\"\n tab=\"审批单\"\n >\n <!--\n :show-actions=\"false\" —— 修改/删除/打印按钮已移到上面 tabs 的 #rightExtra,\n 关掉详情组件自带的那一份,避免同一个抽屉里出现两套同名按钮。\n 外层包一层 ref 是打印区域:runAction('print') 打的就是它。\n -->\n <div ref=\"printAreaRef\">\n <approval-for-details\n ref=\"detailRef\"\n :key=\"approve_record.id\"\n :record=\"approve_record\"\n :show-actions=\"false\"\n />\n </div>\n </a-tab-pane>\n </a-tabs>\n </a-spin>\n </a-drawer>\n <!--\n 两个模态框按需渲染(v-if 用 editorOpen / removeOpen):只要 <ApprovalEditorModal>\n 进了 vdom,异步加载器就会触发 chunk 下载(core.vue → bpmn-js 约 1MB 的重链),\n 所以必须等真正点「修改」了才渲染。\n -->\n <ApprovalEditorModal\n v-if=\"editorOpen\"\n v-model:open=\"editorOpen\"\n v-bind=\"editorProps\"\n />\n <cancel-modal\n v-if=\"removeOpen\"\n v-model:cancel-modal-show=\"removeOpen\"\n v-bind=\"removeProps\"\n />\n</template>\n\n<script lang=\"ts\">\n// ⚠️ 这段在普通 <script> 块中:模块加载时只执行一次,缓存才是真正的全局共享。\n// (<script setup> 内的代码编译后进入 setup(),每个实例创建都会重新执行,放那里等于没缓存)\nconst INFO_CACHE_TTL = 5 * 60 * 1000;\nconst infoCache = new Map<string, { data: Record<string, any>; time: number }>();\nconst infoPending = new Map<string, Promise<Record<string, any>>>();\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, defineAsyncComponent, onMounted, ref } from 'vue';\nimport ApprovalForDetails from './approval_for_details.vue';\nimport CancelModal from './approval/components/CancelModal.vue';\nimport { useApproveRecordActions } from './approval/useApprovalRecordActions';\nimport { useGetApiData, useUserStore } from '../init-plugin';\n\ndefineOptions({\n name: 'Cell_click_data_source',\n});\n\nconst props = defineProps<{\n cmpObj: Record<string, any>;\n}>();\n\nconst getApiData = useGetApiData();\nconst userStore = useUserStore();\nconst current_org = userStore?.current_org;\n\nconst open = ref(false);\nconst loading = ref(false);\nconst active_tab = ref('base');\nconst loaded = ref(false);\nconst display_text = ref(props.cmpObj?.text);\n/**\n * `cmpObj.text` 是数据来源记录 id;为空(null / undefined / 空串)时这条单元格\n * 没有可点击的数据来源:按钮禁用、显示横杠、禁止拉接口。\n */\nconst hasText = computed(() => {\n const t = props.cmpObj?.text;\n return t !== null && t !== undefined && t !== '';\n});\nconst excel_item = ref<Record<string, any>>({});\nconst approve_record = ref<Record<string, any> | null>(null);\nconst printAreaRef = ref<HTMLElement | null>(null);\n/** 详情组件实例:修改保存 / 作废成功后调它的 reload() 重拉详情 */\nconst detailRef = ref<{ reload: () => void } | null>(null);\n\n/**\n * 修改 / 删除 / 打印的统一封装(是否显示 + 点击行为),按钮渲染在 tabs 的 #rightExtra。\n *\n * ⚠️ `recordId` 里的 `open.value ?` 门条件不能去掉:\n * 本组件是**单元格组件**,列表里每一行都会渲染一个实例;`useApproveRecordActions`\n * 内部的 immediate watch 会对非空 recordId 立即拉 `/approve/get_approve_record`,\n * 不加门就是一页 50 行 = 50 个请求。抽屉没开(或这条数据没有审批单)时保持 null。\n */\nconst {\n canShow,\n runAction,\n loading: actionsLoading,\n editorOpen,\n editorProps,\n removeOpen,\n removeProps,\n} = useApproveRecordActions({\n recordId: () => (open.value ? (approve_record.value?.id ?? null) : null),\n modelType: () => approve_record.value?.menu_flag,\n getPrintElement: () => printAreaRef.value,\n printTitle: '审批信息',\n onChange: () => {\n // 详情组件的 :key 是 approve_record.id,保存后 id 不变,必须手动调 reload 重拉\n detailRef.value?.reload();\n },\n});\n\n/**\n * 编辑模态框必须**异步**引入(与 approval_for_details / Cell_click_approve 同一个理由):\n * 本组件在 install() 里是静态注册的,静态 import 会把\n * ApprovalEditorModal → core.vue → bpmn-js 这条约 1MB 的重链拉回首屏静态闭包。\n */\nconst ApprovalEditorModal = defineAsyncComponent(\n () => import('./approval/ApprovalEditorModal.vue'),\n);\n\nconst fetch_info = async (excel_item_id: string) => {\n const cached = infoCache.get(excel_item_id);\n if (cached && Date.now() - cached.time < INFO_CACHE_TTL) {\n return cached.data;\n }\n // 并发去重:多个实例同时挂载时只发一次请求\n let pending = infoPending.get(excel_item_id);\n if (!pending) {\n pending = getApiData(\n {\n org_id: current_org?.id,\n excel_item_id,\n },\n '/approve/get_excel_item_source_info',\n ).finally(() => {\n infoPending.delete(excel_item_id);\n });\n infoPending.set(excel_item_id, pending);\n }\n const res: any = await pending;\n const data = {\n excel_item: res?.excel_item || {},\n approve_record: res?.approve_record || null,\n };\n infoCache.set(excel_item_id, { data, time: Date.now() });\n return data;\n};\n\nconst load_info = async () => {\n loading.value = true;\n try {\n const data = await fetch_info(props.cmpObj.text);\n excel_item.value = data.excel_item;\n approve_record.value = data.approve_record;\n if (excel_item.value.name) {\n display_text.value = excel_item.value.name;\n }\n loaded.value = true;\n } finally {\n loading.value = false;\n }\n};\n// 挂载时预取一次(有模块级缓存兜底),让按钮点击前就显示文件名称\nonMounted(() => {\n if (hasText.value) {\n load_info();\n }\n});\nconst is_open = async () => {\n if (!hasText.value) {\n return;\n }\n open.value = true;\n active_tab.value = 'base';\n if (!loaded.value) {\n await load_info();\n }\n};\nconst onClose = () => {\n open.value = false;\n};\n</script>\n","// 导出组件,供外部 import 使用\nimport './styles';\nimport MyProcess from './MyProcess.vue';\nimport MyProcessViewer from './components/Process/viewer/index.vue';\nimport ApprovalForDetails from './components/approval_for_details.vue';\nimport CellClickDataSource from './components/Cell_click_data_source.vue';\n/**\n * 审批作废(= 删除)弹窗:填作废原因 → `/approve/cancel_agree_approve_record`。\n *\n * ⚠️ **静态**导出(不包 `defineAsyncComponent`):本文件自己的 `import` 就把它放进了\n * 宿主首屏静态闭包,而它本身只有约 2KB;再包一层异步外壳会产出\n * 「同一个模块既被静态 import 又被 `import()`」的形状,宿主构建随即报\n * `INEFFECTIVE_DYNAMIC_IMPORT`,对一个已加载的小模块也没有意义。\n * (历史上它还被 `approval_for_details.vue` 静态引用过;现在按钮/弹窗都已外置到\n * `Cell_click_approve` / `Cell_click_data_source`,本组件不再引用它。)\n */\nimport ApprovalCancelModal from './components/approval/components/CancelModal.vue';\nimport { depsInit, HOST_COMPONENTS } from './init-plugin';\nimport { defineAsyncComponent } from 'vue';\nimport type { Component } from 'vue';\n\n/**\n * 审批相关的 4 个组件走**懒加载导出**(`defineAsyncComponent` + 动态 `import()`)。\n *\n * 为什么:静态 import 会让整块审批代码 —— 包括它依赖的 bpmn-js 流程图引擎 —— 一起进入宿主的\n * **首屏静态闭包**(实测宿主里是约 1 018 KiB 的 `dist-*.js`,被入口 `main-*.js` 静态 `from` 引入),\n * 而宿主可能整场会话都不会渲染审批页。改成动态 import 后构建器会把它拆成独立 chunk,\n * 宿主只在真正路由过去 / 挂载该组件时才下载。\n *\n * 宿主侧的用法**完全不变**(`componentMap: { '...': ApprovalIndex }`、\n * `settingsExtra.tabs[].component = ApprovalSettings`),**不需要**再套一层\n * `defineAsyncComponent(() => ApprovalIndex)` —— 那会变成双层异步包装。\n *\n * 其余静态导出(MyProcess / MyProcessViewer / ApprovalForDetails / CellClickDataSource /\n * ApprovalCancelModal)引用方拿到的依然是**同步组件** —— `ApprovalCancelModal` 是静态的,\n * 原因见文件顶部它 import 处的注释。\n *\n * ⚠️ `: Component` 这个显式注解**不能删**:不加注解时 TS 会把 `defineAsyncComponent` 的推导弹出\n * 类型写进 `dist/index.d.ts`,而该类型引用了 `.vue` 文件里没有导出的私有 `Props`\n * (`error TS4023: Exported variable 'ApprovalSettings' has or is using name 'Props' from external\n * module \".../approvalPageConfig/index.vue\" but cannot be named`),后果是整个 `index.d.ts`\n * 静默不产出、宿主全部解析失败。注解成公开类型 `Component` 就能切断这条私有名的传播链。\n */\nconst ApprovalIndex: Component = defineAsyncComponent(\n () => import('./components/approval/index.vue'),\n);\nconst ApprovalSettings: Component = defineAsyncComponent(\n () => import('./components/approval/components/approvalPageConfig/index.vue'),\n);\nconst ApprovalHistory: Component = defineAsyncComponent(\n () => import('./components/approval/components/approvalHistory/index.vue'),\n);\nconst ApprovalDebugCode: Component = defineAsyncComponent(\n () => import('./components/approval/components/debugCode/debugCode.vue'),\n);\n/**\n * 全屏编辑模态框(详情页/列表单元格上的「修改」用它打开)。\n * 同样必须懒加载:它内部是 core.vue → formConfig/flowConfig → bpmn-js 那条重链。\n * 宿主用法:`<ApprovalEditorModal v-if=\"editorOpen\" v-model:open=\"editorOpen\" v-bind=\"editorProps\" />`\n * —— `v-if` 不能省,否则异步加载器在挂载时就会被触发,懒加载形同虚设。\n */\nconst ApprovalEditorModal: Component = defineAsyncComponent(\n () => import('./components/approval/ApprovalEditorModal.vue'),\n);\n/**\n * 「审批」单元格组件(表格里那个点开看审批详情的链接按钮)—— 从\n * `PSM_ApproveSystemPC/src/components/cellComponent/Cell_click_approve.vue` 移植进库。\n *\n * ⚠️ 必须**懒加载导出 + 懒加载注册**(`install()` 里 `.component('Cell_click_approve', CellClickApprove)`):\n * - 通用表格是用**单元格类型字符串**找组件的(`resolveAsset` 只查全局注册与 `components` 选项),\n * 所以名字必须真的注册进 app 组件表,否则那一格渲染空白、只留一行 warning;\n * - 它内部整条链(`approval_for_details` / `core.vue` / bpmn-js)很重,而**大部分页面根本用不到这一格**,\n * 所以连组件自身也走异步:宿主首屏不为它付任何体积,代价是每一格按钮比同行晚一帧出现。\n *\n * ⛔ 别顺手改成静态 `import`:一旦本文件静态引入它,同时 `install()` 里又保留这层 `defineAsyncComponent`,\n * 就构成「同一 chunk 既静态 import 又被 `import()`」→ 宿主构建直接报 `INEFFECTIVE_DYNAMIC_IMPORT`。\n * (`CancelModal` 正好是相反的情形:它必须静态,原因见文件顶部。)\n *\n * `: Component` 注解同样不能删(TS4023,见上面 ApprovalIndex 处的说明)。\n */\nconst CellClickApprove: Component = defineAsyncComponent(\n () => import('./components/Cell_click_approve.vue'),\n);\n\nexport {\n MyProcess,\n MyProcessViewer,\n ApprovalForDetails,\n CellClickDataSource,\n CellClickApprove,\n ApprovalIndex,\n ApprovalSettings,\n ApprovalHistory,\n ApprovalDebugCode,\n ApprovalEditorModal,\n ApprovalCancelModal,\n};\n\n/**\n * 审批记录「修改 / 删除 / 打印」的**统一封装**:是否显示(判断函数)+ 点击行为。\n *\n * 纯逻辑模块(只依赖 init-plugin 与一份 action 配置片段),可以静态导出:\n * 它不会把审批页或 bpmn 拖进来。宿主/详情壳的按钮都应当走它,别再各写一遍判断,\n * 否则详情页与列表页行按钮的行为迟早漂移。\n */\nexport {\n useApproveRecordActions,\n APPROVE_DETAIL_ACTION_KEYS,\n} from './components/approval/useApprovalRecordActions';\nexport type {\n ApproveDetailActionKey,\n UseApproveRecordActionsOptions,\n} from './components/approval/useApprovalRecordActions';\n\n/** 审批模块内部按名称弹窗的 modal(走宿主 modalBox -> 宿主 basic-layout 的全局组件解析) */\nconst APPROVAL_MODALS: Record<string, () => Promise<any>> = {\n codeHistoryViewModal: () => import('./components/approval/components/codeHistory/codeHistoryViewModal.vue'),\n approvalHistoryViewModal: () =>\n import('./components/approval/components/approvalHistory/approvalHistoryViewModal.vue'),\n flowHistoryViewModal: () =>\n import('./components/approval/components/approvalHistory/flowHistoryViewModal.vue'),\n};\n\nexport default {\n install(app: any, options: any) {\n // 宿主依赖统一收口(request / useUserStore / getApiData / modalBox / 常量 / 组件 ...),\n // 详见 src/init-plugin.ts\n app.use(depsInit(options || {}));\n\n // 宿主传入的组件在这里全局注册:Options API 的模板只会查 components 选项与全局注册,\n // 注入进来的组件无法写进 components 选项,所以必须走全局注册。\n for (const key of Object.keys(HOST_COMPONENTS)) {\n const component = options?.[key];\n if (component) {\n app.component(HOST_COMPONENTS[key], component);\n }\n }\n\n // 审批内部按名称弹窗的 modal,必须全局注册宿主才能通过 modalBox({ component: 'xxx' }) 解析到\n for (const name of Object.keys(APPROVAL_MODALS)) {\n app.component(\n name,\n defineAsyncComponent(APPROVAL_MODALS[name]),\n );\n }\n\n // 这里注册的都是文件顶部那批**已经包装好**的组件引用(`CellClickApprove` / `approvalIndex` /\n // `approvalSettings` / `approvalHistory` 是懒加载包装过的,`CellClickDataSource` 是同步组件)。\n // 别在这里再套一层 `defineAsyncComponent(() => import('...'))`:虽然同一个模块被两处动态\n // import 会被合并到同一个 chunk,但会多出一层无意义的异步包装;更要紧的是,一旦日后有人把\n // 这些组件加回静态 import,就会触发 INEFFECTIVE_DYNAMIC_IMPORT(拆不出独立 chunk)。\n app\n // ⚠️ 这两个单元格组件**必须按名字全局注册**:通用表格的单元格类型是字符串,\n // 解析走的是全局注册表(resolveAsset 不查 <script setup> 的顶层绑定)。\n // `Cell_click_data_source` 是同步注册(它本来就静态导出,且详情组件已在静态闭包内);\n // `Cell_click_approve` 自 2026-09-21 从 PSM_ApproveSystemPC 移植进来,走**异步注册**\n // (宿主首屏不为它付体积,见上面 CellClickApprove 处的说明)。\n .component('Cell_click_data_source', CellClickDataSource)\n .component('Cell_click_approve', CellClickApprove)\n .component('approvalIndex', ApprovalIndex)\n .component('approvalSettings', ApprovalSettings)\n .component('approvalHistory', ApprovalHistory);\n },\n};\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "lyflowchart",
3
3
  "type": "module",
4
4
  "license": "MIT",
5
- "version": "1.0.133",
5
+ "version": "1.0.135",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
8
  "scripts": {
@@ -1 +0,0 @@
1
- {"version":3,"file":"Cell_click_approve-Dr83RkI-.js","names":[],"sources":["../src/components/Cell_click_approve.vue","../src/components/Cell_click_approve.vue"],"sourcesContent":["<template>\n <a-button\n :title=\"cmpObj.text\"\n style=\"padding-left: 1px; width: 100%\"\n type=\"link\"\n @click=\"is_open()\"\n >\n <span\n style=\"\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 100%;\n user-select: text;\n text-align: left;\n \"\n >\n {{ cmpObj.text }}\n </span>\n </a-button>\n <a-drawer\n :body-style=\"{ padding: '10px 20px' }\"\n :footer=\"null\"\n :open=\"open\"\n :width=\"1120\"\n title=\"审批信息\"\n @close=\"onClose\"\n >\n <template #extra>\n <!-- 以下 4 个是本单元格特有的流程动作,不属于审批记录上的「修改/删除」,保持原样 -->\n <a-button\n v-if=\"cmpObj.record.process_status === 'init' || cmpObj.record.result_status === 'reject'\"\n :loading=\"loading1\"\n type=\"primary\"\n @click=\"commitApprove(cmpObj.record)\"\n >\n 提交\n </a-button>\n <a-button\n v-if=\"cmpObj.record.process_status === 'init' || cmpObj.record.result_status === 'reject'\"\n :loading=\"loading2\"\n danger\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"cancelApprove(cmpObj.record)\"\n >\n 撤销\n </a-button>\n <a-button\n v-if=\"task_id\"\n :loading=\"loading3\"\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"handleApprove('agree')\"\n >\n 审批通过\n </a-button>\n <a-button\n v-if=\"task_id\"\n :loading=\"loading4\"\n style=\"margin-left: 10px\"\n danger\n type=\"primary\"\n @click=\"handleApprove('refuse')\"\n >\n 审批拒绝\n </a-button>\n\n <!--\n 修改 / 删除 / 打印:按钮「各自在外部提供」,但**是否显示**与**点击行为**统一由\n `useApproveRecordActions` 封装(与审批列表页行按钮跑同一份 `recordActions.ts` 逻辑)。\n 所以这里既看不到判断表达式,也看不到接口调用 —— 都在 composable 里。\n -->\n <a-button\n v-if=\"canShow('edit_approve')\"\n :loading=\"actionsLoading\"\n style=\"margin-left: 10px\"\n @click=\"runAction('edit_approve')\"\n >\n 修改\n </a-button>\n <a-button\n v-if=\"canShow('cancel_agree_approve')\"\n :loading=\"actionsLoading\"\n danger\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"runAction('cancel_agree_approve')\"\n >\n 删除\n </a-button>\n <a-button\n v-if=\"canShow('print')\"\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"runAction('print')\"\n >\n 打印\n </a-button>\n </template>\n <div ref=\"printAreaRef\">\n <!--\n :show-actions=\"false\" —— 修改/删除/打印按钮已在上面的 #extra 里,\n 关掉详情组件自带的那一份,避免同一个抽屉里出现两套同名按钮。\n -->\n <approval-for-details\n ref=\"detailRef\"\n :record=\"cmpObj.record\"\n :show-actions=\"false\"\n />\n </div>\n </a-drawer>\n <!--\n 两个模态框按需渲染(v-if 用 editorOpen / removeOpen,而不是恒真的 true):\n 只要 `<ApprovalEditorModal>` 进了 vdom,异步加载器就会触发 chunk 下载,\n 所以必须等真正要用了才渲染。\n -->\n <ApprovalEditorModal\n v-if=\"editorOpen\"\n v-model:open=\"editorOpen\"\n v-bind=\"editorProps\"\n />\n <ApprovalCancelModal\n v-if=\"removeOpen\"\n v-model:cancel-modal-show=\"removeOpen\"\n v-bind=\"removeProps\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { defineAsyncComponent, reactive, ref } from 'vue';\nimport { message, Modal } from 'ant-design-vue';\n// ⚠️ 这三项都是宿主的「转发函数」(库不得反向依赖 liyu-pc-lib,见 src/init-plugin.ts 顶部铁律):\n// getApiData ← liyu-pc-lib/api/api-model\n// useUserStore← liyu-pc-lib/store/user\n// modalBox ← liyu-pc-lib/components/form-modal/modal-tools(默认导出)\n// 调用签名与宿主侧完全一致,只是换了个 import 来源。\nimport { getApiData, modalBox, useUserStore } from '../init-plugin';\nimport ApprovalForDetails from './approval_for_details.vue';\nimport ApprovalCancelModal from './approval/components/CancelModal.vue';\nimport { useApproveRecordActions } from './approval/useApprovalRecordActions';\n\n/**\n * 「审批」单元格组件:表格里显示一个链接按钮,点开右侧抽屉看审批详情。\n *\n * 从 `PSM_ApproveSystemPC/src/components/cellComponent/Cell_click_approve.vue` **原样移植**进公共库,\n * 与 `Cell_click_data_source.vue` 走同一套形态:库内实现 + `src/index.ts` 的 install() 里\n * **按名字全局注册**(`cellComponentList` 里的单元格类型就是靠组件名解析的,只查全局注册)。\n * 宿主侧因此不再需要这个文件,也不需要 `app.component('Cell_click_approve', …)`。\n *\n * 除「依赖来源」外与宿主版本**逐字一致**(含 4 个流程动作、接口路径、报错与刷新行为),\n * 移植时只做了三类替换:依赖 → init-plugin;库内组件 → 相对路径 import;编辑器 → 异步引入(见下)。\n */\ndefineOptions({\n name: 'Cell_click_approve',\n});\n\nconst props = defineProps<{\n cmpObj: Record<string, any>;\n}>();\n\nconst userStore = useUserStore();\nconst current_org = userStore.currentOrg;\nconst open = ref(false);\nconst loading1 = ref(false);\nconst loading2 = ref(false);\nconst loading3 = ref(false);\nconst loading4 = ref(false);\nconst task_id = ref<string | null>(null);\nconst printAreaRef = ref<HTMLElement | null>(null);\n/** 详情组件实例:操作成功后调它的 reload() 重拉详情 */\nconst detailRef = ref<{ reload: () => void } | null>(null);\n\n/**\n * 修改 / 删除 / 打印的统一封装(是否显示 + 点击行为)。\n *\n * ⚠️ `recordId` 里那个 `open.value ?` 不能去掉:\n * 本组件是**单元格组件**,列表里每一行都会渲染一个实例。若不带这个门条件,\n * `useApproveRecordActions` 内部的 immediate watch 会让**每一行**都在挂载时去拉\n * `/approve/get_approve_record` —— 列表一页 50 行就是 50 个请求。\n * 加上之后,只有用户真正点开某一行的抽屉才会取数。\n */\nconst {\n canShow,\n runAction,\n loading: actionsLoading,\n editorOpen,\n editorProps,\n removeOpen,\n removeProps,\n} = useApproveRecordActions({\n recordId: () => (open.value ? props.cmpObj?.record?.id : null),\n modelType: () => props.cmpObj?.record?.menu_flag,\n getPrintElement: () => printAreaRef.value,\n printTitle: '审批信息',\n onChange: () => {\n // 抽屉里的详情重拉 + 通知外层列表刷新\n detailRef.value?.reload();\n refresh();\n },\n});\n\n/**\n * 编辑模态框必须**异步**引入 —— 与 `approval_for_details.vue` 里同一个理由:\n *\n * 本组件在 `install()` 里是**静态注册**的(`app.component('Cell_click_approve', …)`),\n * 所以它的静态依赖会整块进入宿主**首屏静态闭包**;而\n * `ApprovalEditorModal` → `core.vue` → `flowConfig.vue` → bpmn-js 是一条约 1.1 MB 的重链\n * (宿主实测:上一轮刚把它从首屏摘掉,静态 import 会原样拉回来)。\n *\n * 这里**不能**写成 `import { ApprovalEditorModal } from '../index'`:`index.ts` 又 import 了本文件,\n * 会构成循环依赖,而 `defineAsyncComponent(...)` 在模块求值时就要读那个绑定。\n * 所以就地再包一层 —— 同一个模块被**两处动态 import** 没有问题(合并进同一个 chunk),\n * 危险的是「一处静态 + 一处动态」(那会报 `INEFFECTIVE_DYNAMIC_IMPORT`,拆不出独立 chunk)。\n */\nconst ApprovalEditorModal = defineAsyncComponent(\n () => import('./approval/ApprovalEditorModal.vue'),\n);\n\nconst is_open = async () => {\n open.value = true;\n const res = await getApiData(\n {\n org_id: current_org?.id,\n approve_record_id: props.cmpObj.record.id,\n },\n '/approve/get_approve_record_info',\n );\n if (res?.current_task?.id) {\n task_id.value = res.current_task.id;\n }\n};\nconst onClose = () => {\n open.value = false;\n};\nconst refresh = () => {\n if (props.cmpObj?.eventBus) {\n props.cmpObj.eventBus.emit('reinit');\n }\n if (props.cmpObj?.event_obj) {\n props.cmpObj.event_obj.emit('refresh');\n }\n};\nconst commitApprove = (record: any) => {\n loading1.value = true;\n Modal.confirm({\n title: '提示',\n content: '是否确认要发起审批',\n async onOk() {\n getApiData(\n {\n org_id: current_org?.id,\n approve_record_id: record.id,\n },\n '/approve/commit_approve_record',\n )\n .then(() => {\n message.success('操作成功');\n refresh();\n })\n .finally(() => {\n loading1.value = false;\n });\n },\n onCancel() {\n loading1.value = false;\n },\n });\n};\nconst cancelApprove = (record: any) => {\n loading2.value = true;\n Modal.confirm({\n title: '提示',\n content: '是否确认要撤销审批',\n async onOk() {\n getApiData(\n {\n org_id: current_org?.id,\n approve_record_id: record.id,\n },\n '/approve/cancel_approve_record',\n )\n .then(() => {\n message.success('操作成功');\n refresh();\n })\n .finally(() => {\n loading2.value = false;\n });\n },\n onCancel() {\n loading2.value = false;\n },\n });\n};\nconst handleApprove = (is_reject: any) => {\n const rules: any = reactive({});\n if (is_reject == 'refuse') {\n rules.comment = [{ required: true, message: '请输入审批意见' }];\n loading4.value = true;\n } else {\n loading3.value = true;\n }\n const tempModal = reactive({\n open: true,\n loading: false,\n title: '审批意见',\n form: {\n settings: {\n labelAlign: 'right',\n layout: 'vertical',\n col: [],\n },\n fields: [\n {\n type: 'textarea',\n name: 'comment',\n label: '审批意见',\n disabled: false,\n allowClear: true,\n inputType: 'text',\n maxlength: 200,\n defaultValue: '',\n placeholder: '请输入审批意见',\n },\n ],\n rules: rules,\n model: reactive({\n comment: null,\n }),\n },\n options: {},\n ok: (obj: any) => {\n return new Promise(function (resolve) {\n tempModal.open = false;\n getApiData(\n {\n org_id: current_org?.id,\n task_id: task_id.value,\n comment: obj.comment,\n approval_result: is_reject,\n },\n '/lyapprove/claim_and_complete_task',\n )\n .then(() => {\n message.success(is_reject == 'refuse' ? '审批拒绝' : '审批通过');\n refresh();\n resolve(null);\n })\n .finally(() => {\n loading3.value = false;\n loading4.value = false;\n });\n });\n },\n onCancel() {\n tempModal.open = false;\n },\n });\n modalBox(tempModal);\n};\n</script>\n","<template>\n <a-button\n :title=\"cmpObj.text\"\n style=\"padding-left: 1px; width: 100%\"\n type=\"link\"\n @click=\"is_open()\"\n >\n <span\n style=\"\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 100%;\n user-select: text;\n text-align: left;\n \"\n >\n {{ cmpObj.text }}\n </span>\n </a-button>\n <a-drawer\n :body-style=\"{ padding: '10px 20px' }\"\n :footer=\"null\"\n :open=\"open\"\n :width=\"1120\"\n title=\"审批信息\"\n @close=\"onClose\"\n >\n <template #extra>\n <!-- 以下 4 个是本单元格特有的流程动作,不属于审批记录上的「修改/删除」,保持原样 -->\n <a-button\n v-if=\"cmpObj.record.process_status === 'init' || cmpObj.record.result_status === 'reject'\"\n :loading=\"loading1\"\n type=\"primary\"\n @click=\"commitApprove(cmpObj.record)\"\n >\n 提交\n </a-button>\n <a-button\n v-if=\"cmpObj.record.process_status === 'init' || cmpObj.record.result_status === 'reject'\"\n :loading=\"loading2\"\n danger\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"cancelApprove(cmpObj.record)\"\n >\n 撤销\n </a-button>\n <a-button\n v-if=\"task_id\"\n :loading=\"loading3\"\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"handleApprove('agree')\"\n >\n 审批通过\n </a-button>\n <a-button\n v-if=\"task_id\"\n :loading=\"loading4\"\n style=\"margin-left: 10px\"\n danger\n type=\"primary\"\n @click=\"handleApprove('refuse')\"\n >\n 审批拒绝\n </a-button>\n\n <!--\n 修改 / 删除 / 打印:按钮「各自在外部提供」,但**是否显示**与**点击行为**统一由\n `useApproveRecordActions` 封装(与审批列表页行按钮跑同一份 `recordActions.ts` 逻辑)。\n 所以这里既看不到判断表达式,也看不到接口调用 —— 都在 composable 里。\n -->\n <a-button\n v-if=\"canShow('edit_approve')\"\n :loading=\"actionsLoading\"\n style=\"margin-left: 10px\"\n @click=\"runAction('edit_approve')\"\n >\n 修改\n </a-button>\n <a-button\n v-if=\"canShow('cancel_agree_approve')\"\n :loading=\"actionsLoading\"\n danger\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"runAction('cancel_agree_approve')\"\n >\n 删除\n </a-button>\n <a-button\n v-if=\"canShow('print')\"\n style=\"margin-left: 10px\"\n type=\"primary\"\n @click=\"runAction('print')\"\n >\n 打印\n </a-button>\n </template>\n <div ref=\"printAreaRef\">\n <!--\n :show-actions=\"false\" —— 修改/删除/打印按钮已在上面的 #extra 里,\n 关掉详情组件自带的那一份,避免同一个抽屉里出现两套同名按钮。\n -->\n <approval-for-details\n ref=\"detailRef\"\n :record=\"cmpObj.record\"\n :show-actions=\"false\"\n />\n </div>\n </a-drawer>\n <!--\n 两个模态框按需渲染(v-if 用 editorOpen / removeOpen,而不是恒真的 true):\n 只要 `<ApprovalEditorModal>` 进了 vdom,异步加载器就会触发 chunk 下载,\n 所以必须等真正要用了才渲染。\n -->\n <ApprovalEditorModal\n v-if=\"editorOpen\"\n v-model:open=\"editorOpen\"\n v-bind=\"editorProps\"\n />\n <ApprovalCancelModal\n v-if=\"removeOpen\"\n v-model:cancel-modal-show=\"removeOpen\"\n v-bind=\"removeProps\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { defineAsyncComponent, reactive, ref } from 'vue';\nimport { message, Modal } from 'ant-design-vue';\n// ⚠️ 这三项都是宿主的「转发函数」(库不得反向依赖 liyu-pc-lib,见 src/init-plugin.ts 顶部铁律):\n// getApiData ← liyu-pc-lib/api/api-model\n// useUserStore← liyu-pc-lib/store/user\n// modalBox ← liyu-pc-lib/components/form-modal/modal-tools(默认导出)\n// 调用签名与宿主侧完全一致,只是换了个 import 来源。\nimport { getApiData, modalBox, useUserStore } from '../init-plugin';\nimport ApprovalForDetails from './approval_for_details.vue';\nimport ApprovalCancelModal from './approval/components/CancelModal.vue';\nimport { useApproveRecordActions } from './approval/useApprovalRecordActions';\n\n/**\n * 「审批」单元格组件:表格里显示一个链接按钮,点开右侧抽屉看审批详情。\n *\n * 从 `PSM_ApproveSystemPC/src/components/cellComponent/Cell_click_approve.vue` **原样移植**进公共库,\n * 与 `Cell_click_data_source.vue` 走同一套形态:库内实现 + `src/index.ts` 的 install() 里\n * **按名字全局注册**(`cellComponentList` 里的单元格类型就是靠组件名解析的,只查全局注册)。\n * 宿主侧因此不再需要这个文件,也不需要 `app.component('Cell_click_approve', …)`。\n *\n * 除「依赖来源」外与宿主版本**逐字一致**(含 4 个流程动作、接口路径、报错与刷新行为),\n * 移植时只做了三类替换:依赖 → init-plugin;库内组件 → 相对路径 import;编辑器 → 异步引入(见下)。\n */\ndefineOptions({\n name: 'Cell_click_approve',\n});\n\nconst props = defineProps<{\n cmpObj: Record<string, any>;\n}>();\n\nconst userStore = useUserStore();\nconst current_org = userStore.currentOrg;\nconst open = ref(false);\nconst loading1 = ref(false);\nconst loading2 = ref(false);\nconst loading3 = ref(false);\nconst loading4 = ref(false);\nconst task_id = ref<string | null>(null);\nconst printAreaRef = ref<HTMLElement | null>(null);\n/** 详情组件实例:操作成功后调它的 reload() 重拉详情 */\nconst detailRef = ref<{ reload: () => void } | null>(null);\n\n/**\n * 修改 / 删除 / 打印的统一封装(是否显示 + 点击行为)。\n *\n * ⚠️ `recordId` 里那个 `open.value ?` 不能去掉:\n * 本组件是**单元格组件**,列表里每一行都会渲染一个实例。若不带这个门条件,\n * `useApproveRecordActions` 内部的 immediate watch 会让**每一行**都在挂载时去拉\n * `/approve/get_approve_record` —— 列表一页 50 行就是 50 个请求。\n * 加上之后,只有用户真正点开某一行的抽屉才会取数。\n */\nconst {\n canShow,\n runAction,\n loading: actionsLoading,\n editorOpen,\n editorProps,\n removeOpen,\n removeProps,\n} = useApproveRecordActions({\n recordId: () => (open.value ? props.cmpObj?.record?.id : null),\n modelType: () => props.cmpObj?.record?.menu_flag,\n getPrintElement: () => printAreaRef.value,\n printTitle: '审批信息',\n onChange: () => {\n // 抽屉里的详情重拉 + 通知外层列表刷新\n detailRef.value?.reload();\n refresh();\n },\n});\n\n/**\n * 编辑模态框必须**异步**引入 —— 与 `approval_for_details.vue` 里同一个理由:\n *\n * 本组件在 `install()` 里是**静态注册**的(`app.component('Cell_click_approve', …)`),\n * 所以它的静态依赖会整块进入宿主**首屏静态闭包**;而\n * `ApprovalEditorModal` → `core.vue` → `flowConfig.vue` → bpmn-js 是一条约 1.1 MB 的重链\n * (宿主实测:上一轮刚把它从首屏摘掉,静态 import 会原样拉回来)。\n *\n * 这里**不能**写成 `import { ApprovalEditorModal } from '../index'`:`index.ts` 又 import 了本文件,\n * 会构成循环依赖,而 `defineAsyncComponent(...)` 在模块求值时就要读那个绑定。\n * 所以就地再包一层 —— 同一个模块被**两处动态 import** 没有问题(合并进同一个 chunk),\n * 危险的是「一处静态 + 一处动态」(那会报 `INEFFECTIVE_DYNAMIC_IMPORT`,拆不出独立 chunk)。\n */\nconst ApprovalEditorModal = defineAsyncComponent(\n () => import('./approval/ApprovalEditorModal.vue'),\n);\n\nconst is_open = async () => {\n open.value = true;\n const res = await getApiData(\n {\n org_id: current_org?.id,\n approve_record_id: props.cmpObj.record.id,\n },\n '/approve/get_approve_record_info',\n );\n if (res?.current_task?.id) {\n task_id.value = res.current_task.id;\n }\n};\nconst onClose = () => {\n open.value = false;\n};\nconst refresh = () => {\n if (props.cmpObj?.eventBus) {\n props.cmpObj.eventBus.emit('reinit');\n }\n if (props.cmpObj?.event_obj) {\n props.cmpObj.event_obj.emit('refresh');\n }\n};\nconst commitApprove = (record: any) => {\n loading1.value = true;\n Modal.confirm({\n title: '提示',\n content: '是否确认要发起审批',\n async onOk() {\n getApiData(\n {\n org_id: current_org?.id,\n approve_record_id: record.id,\n },\n '/approve/commit_approve_record',\n )\n .then(() => {\n message.success('操作成功');\n refresh();\n })\n .finally(() => {\n loading1.value = false;\n });\n },\n onCancel() {\n loading1.value = false;\n },\n });\n};\nconst cancelApprove = (record: any) => {\n loading2.value = true;\n Modal.confirm({\n title: '提示',\n content: '是否确认要撤销审批',\n async onOk() {\n getApiData(\n {\n org_id: current_org?.id,\n approve_record_id: record.id,\n },\n '/approve/cancel_approve_record',\n )\n .then(() => {\n message.success('操作成功');\n refresh();\n })\n .finally(() => {\n loading2.value = false;\n });\n },\n onCancel() {\n loading2.value = false;\n },\n });\n};\nconst handleApprove = (is_reject: any) => {\n const rules: any = reactive({});\n if (is_reject == 'refuse') {\n rules.comment = [{ required: true, message: '请输入审批意见' }];\n loading4.value = true;\n } else {\n loading3.value = true;\n }\n const tempModal = reactive({\n open: true,\n loading: false,\n title: '审批意见',\n form: {\n settings: {\n labelAlign: 'right',\n layout: 'vertical',\n col: [],\n },\n fields: [\n {\n type: 'textarea',\n name: 'comment',\n label: '审批意见',\n disabled: false,\n allowClear: true,\n inputType: 'text',\n maxlength: 200,\n defaultValue: '',\n placeholder: '请输入审批意见',\n },\n ],\n rules: rules,\n model: reactive({\n comment: null,\n }),\n },\n options: {},\n ok: (obj: any) => {\n return new Promise(function (resolve) {\n tempModal.open = false;\n getApiData(\n {\n org_id: current_org?.id,\n task_id: task_id.value,\n comment: obj.comment,\n approval_result: is_reject,\n },\n '/lyapprove/claim_and_complete_task',\n )\n .then(() => {\n message.success(is_reject == 'refuse' ? '审批拒绝' : '审批通过');\n refresh();\n resolve(null);\n })\n .finally(() => {\n loading3.value = false;\n loading4.value = false;\n });\n });\n },\n onCancel() {\n tempModal.open = false;\n },\n });\n modalBox(tempModal);\n};\n</script>\n"],"mappings":"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"}