liyu-pc-base 1.0.916 → 1.0.921
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{FieldRender-DUylkdFU.js → FieldRender-BOg7nm5z.js} +3 -3
- package/dist/{FieldRender-DUylkdFU.js.map → FieldRender-BOg7nm5z.js.map} +1 -1
- package/dist/{FieldRender2-ni4dCoWb.js → FieldRender2-_MtcDkI5.js} +7 -7
- package/dist/{FieldRender2-ni4dCoWb.js.map → FieldRender2-_MtcDkI5.js.map} +1 -1
- package/dist/{FormRender3-D8g1u8XE.js → FormRender3-BtY9d91e.js} +3 -3
- package/dist/{FormRender3-D8g1u8XE.js.map → FormRender3-BtY9d91e.js.map} +1 -1
- package/dist/{RemoteModal-Bcj3dfNQ.js → RemoteModal-Dqy32RFN.js} +1 -1
- package/dist/{RemoteModal-Bcj3dfNQ.js.map → RemoteModal-Dqy32RFN.js.map} +1 -1
- package/dist/{RemoteSelectPro-DzCL3v2d.js → RemoteSelectPro-CcWTS4f6.js} +2 -2
- package/dist/{RemoteSelectPro-DzCL3v2d.js.map → RemoteSelectPro-CcWTS4f6.js.map} +1 -1
- package/dist/{RemoteTable-Wk-bmeCF.js → RemoteTable-D_12PvNS.js} +2 -2
- package/dist/{RemoteTable-Wk-bmeCF.js.map → RemoteTable-D_12PvNS.js.map} +1 -1
- package/dist/{RemoteTreeSelectPro-D2RSKzFr.js → RemoteTreeSelectPro-CXMOariR.js} +1 -1
- package/dist/{RemoteTreeSelectPro-D2RSKzFr.js.map → RemoteTreeSelectPro-CXMOariR.js.map} +1 -1
- package/dist/{SearchRender-IBjoONHu.js → SearchRender-ByarFel1.js} +1 -1
- package/dist/{SearchRender-IBjoONHu.js.map → SearchRender-ByarFel1.js.map} +1 -1
- package/dist/{TinymceEditor-BLPIZIaP.js → TinymceEditor-waI-dlC5.js} +3 -3
- package/dist/{TinymceEditor-BLPIZIaP.js.map → TinymceEditor-waI-dlC5.js.map} +1 -1
- package/dist/components/index.js +11 -11
- package/dist/{dbViewConfig-BauCY_B2.js → dbViewConfig-RGSyUx3F.js} +2 -2
- package/dist/{dbViewConfig-BauCY_B2.js.map → dbViewConfig-RGSyUx3F.js.map} +1 -1
- package/dist/{detailTablePro-CmhEujKb.js → detailTablePro-CqcVbn8O.js} +1 -1
- package/dist/{detailTablePro-CmhEujKb.js.map → detailTablePro-CqcVbn8O.js.map} +1 -1
- package/dist/{function-DQjzcDkk.js → function-BhYSb8ls.js} +96 -88
- package/dist/function-BhYSb8ls.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/liyu-pc-base.css +1 -1
- package/dist/{tableModal-Cjjw_VUe.js → tableModal-DSKuV-hn.js} +1 -1
- package/dist/{tableModal-Cjjw_VUe.js.map → tableModal-DSKuV-hn.js.map} +1 -1
- package/dist/{tablePageHost-LnRX1FVx.js → tablePageHost-B_BOlBNA.js} +8416 -7870
- package/dist/tablePageHost-B_BOlBNA.js.map +1 -0
- package/dist/{tablePro-CerNGQgL.js → tablePro-IAcxxAGI.js} +17 -17
- package/dist/tablePro-IAcxxAGI.js.map +1 -0
- package/dist/utils/function.js +1 -1
- package/dist/utils/hooks/useFetchData.js +1 -1
- package/package.json +1 -1
- package/dist/function-DQjzcDkk.js.map +0 -1
- package/dist/tablePageHost-LnRX1FVx.js.map +0 -1
- package/dist/tablePro-CerNGQgL.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemoteTable-Wk-bmeCF.js","names":[],"sources":["../src/components/FormRender/RemoteTreeSelect/index.ts","../src/components/FormRender/RemoteTreeSelect/RemoteTreeSelect.vue","../src/components/FormRender/RemoteTreeSelect/RemoteTreeSelect.vue","../src/components/FormRender/RemoteTable/RemoteTable.vue","../src/components/FormRender/RemoteTable/RemoteTable.vue"],"sourcesContent":["import type { RemoteTreeSelect } from 'liyu-pc-base/components/FormRender/RemoteTreeSelect/typing';\nimport { useGlobMap } from 'liyu-pc-base/init-plugin';\n\nconst res_components: { [key: string]: any } = {};\nconst init = () => {\n if (Object.keys(res_components).length > 0) {\n return;\n }\n const allComponents: any = import.meta.glob(\n 'liyu-pc-base/components/FormRender/RemoteTreeSelect/*/*.ts',\n {\n eager: true,\n },\n );\n const customComponents = useGlobMap('remoteTreeSelect');\n Object.assign(allComponents, customComponents);\n Object.keys(allComponents).forEach(full_file_name => {\n const file_name_list = full_file_name.split('/');\n const file_name = file_name_list[file_name_list.length - 1].replace('.ts', '');\n res_components[file_name] = allComponents[full_file_name].default;\n });\n};\nexport default (modalType: string): RemoteTreeSelect => {\n init();\n if (res_components[modalType] == undefined) {\n console.error('remotetreeselect没有组件:' + modalType);\n return {\n getData: undefined,\n searchConfig: undefined,\n };\n }\n return {\n ...res_components[modalType](`remotetreeselect_${modalType}`),\n };\n};\n","<template>\n <a-layout\n width=\"100%\"\n style=\"min-width: 190px\"\n >\n <a-layout-content>\n <a-tree-select\n v-model:value=\"modalRef.selectedRows\"\n size=\"small\"\n style=\"min-width: 150px\"\n :placeholder=\"field.placeholder\"\n :dropdownMatchSelectWidth=\"false\"\n :disabled=\"field.disabled\"\n :default-value=\"field.defaultValue\"\n :allow-clear=\"field.allowClear\"\n :tree-data=\"modalRef.datasource\"\n :tree-checkable=\"field.multiple\"\n :tree-node-filter-prop=\"field.valueKey\"\n :tree-label-prop=\"field.labelKey\"\n :dropdownStyle=\"{ maxHeight: '400px' }\"\n @change=\"handleChange\"\n />\n </a-layout-content>\n <a-layout-sider\n width=\"30px\"\n style=\"background: rgba(0, 0, 0, 0)\"\n >\n <a-button\n size=\"small\"\n style=\"width: 30px\"\n @click=\"btnClick(true)\"\n type=\"text\"\n >\n <template #icon>\n <reload-outlined />\n </template>\n </a-button>\n </a-layout-sider>\n </a-layout>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, reactive, watch } from 'vue';\nimport type { ReponseData } from 'liyu-pc-base/utils/hooks/useFetchData';\nimport getFormConfig from 'liyu-pc-base/components/FormRender/RemoteTreeSelect/index';\nimport { message } from 'ant-design-vue';\n\nexport default defineComponent({\n name: 'RemoteTreeSelect',\n props: {\n field: {\n type: Object,\n required: true,\n },\n value: {\n type: [Array, Number, String],\n required: false,\n default: () => null,\n },\n search_config: {\n type: Object,\n required: false,\n default: () => {},\n },\n label: {\n type: [Array, String],\n required: false,\n },\n formModel: {\n type: Object,\n required: true,\n },\n },\n emits: ['update:value', 'update:label'],\n setup(props, { emit }) {\n const modalRef: any = reactive({\n selectedRows: [],\n datasource: [],\n });\n const { searchConfig, getData } = getFormConfig(props.field.modalType);\n const search_modelRef = reactive({\n ...searchConfig.model,\n });\n\n if (props.value) {\n modalRef.selectedRows.push(props.value);\n }\n\n const getLabelFromDatasource = (datasource: Array<any>) => {\n const labelList: Array<string> = [];\n datasource.forEach((item: any) => {\n if (\n modalRef.selectedRows instanceof Array &&\n modalRef.selectedRows.includes(item[props.field.valueKey])\n ) {\n labelList.push(item[props.field.labelKey]);\n }\n if (\n !(modalRef.selectedRows instanceof Array) &&\n modalRef.selectedRows == item[props.field.valueKey]\n ) {\n labelList.push(item[props.field.labelKey]);\n }\n if (item.children && item.children.length > 0) {\n getLabelFromDatasource(item.children).forEach(obj => labelList.push(obj));\n }\n });\n return labelList;\n };\n\n const handleChange = () => {\n emit('update:value', modalRef.selectedRows);\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n };\n\n watch(\n () => props.formModel[props.field.name],\n () => {\n if (props.field.mode === 'default') {\n if (props.formModel[props.field.name]) {\n modalRef.selectedRows = [props.formModel[props.field.name]];\n } else {\n modalRef.selectedRows = [];\n }\n } else {\n //modalRef.selectedRows.length = 0;\n if (props.formModel[props.field.name] && props.formModel[props.field.name].length > 0) {\n modalRef.selectedRows = props.formModel[props.field.name].map((item: any) => {\n return item;\n });\n }\n }\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n },\n );\n\n const btnClick = (noCache?: boolean) => {\n if (noCache) {\n message.loading({ content: '刷新数据……', key: props.field.modalType });\n }\n\n getData({ ...search_modelRef, ...props.search_config }, noCache)\n .then(function (res: ReponseData<any>) {\n modalRef.datasource = res.data;\n if (modalRef.datasource.length > 0 && modalRef.selectedRows.length > 0) {\n if (\n typeof modalRef.datasource[0][props.field.valueKey] == 'number' &&\n typeof modalRef.selectedRows[0] == 'string'\n ) {\n const list: Array<number> = [];\n modalRef.selectedRows.map((item: string) => {\n item.split(',').map(obj => {\n list.push(Number(obj));\n });\n });\n if (props.field.multiple) {\n modalRef.selectedRows = list;\n } else {\n if (list.length > 1) {\n list.length = 1;\n }\n modalRef.selectedRows = list;\n }\n }\n }\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n if (noCache) {\n message.success({ content: '刷新数据成功', key: props.field.modalType, duration: 2 });\n }\n })\n .catch(() => {\n message.destroy();\n message.error('接口调用失败', 10);\n });\n };\n btnClick();\n\n return {\n props,\n modalRef,\n search_modelRef,\n handleChange,\n btnClick,\n };\n },\n\n data() {\n return {\n model: this.value,\n };\n },\n});\n</script>\n","<template>\n <a-layout\n width=\"100%\"\n style=\"min-width: 190px\"\n >\n <a-layout-content>\n <a-tree-select\n v-model:value=\"modalRef.selectedRows\"\n size=\"small\"\n style=\"min-width: 150px\"\n :placeholder=\"field.placeholder\"\n :dropdownMatchSelectWidth=\"false\"\n :disabled=\"field.disabled\"\n :default-value=\"field.defaultValue\"\n :allow-clear=\"field.allowClear\"\n :tree-data=\"modalRef.datasource\"\n :tree-checkable=\"field.multiple\"\n :tree-node-filter-prop=\"field.valueKey\"\n :tree-label-prop=\"field.labelKey\"\n :dropdownStyle=\"{ maxHeight: '400px' }\"\n @change=\"handleChange\"\n />\n </a-layout-content>\n <a-layout-sider\n width=\"30px\"\n style=\"background: rgba(0, 0, 0, 0)\"\n >\n <a-button\n size=\"small\"\n style=\"width: 30px\"\n @click=\"btnClick(true)\"\n type=\"text\"\n >\n <template #icon>\n <reload-outlined />\n </template>\n </a-button>\n </a-layout-sider>\n </a-layout>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, reactive, watch } from 'vue';\nimport type { ReponseData } from 'liyu-pc-base/utils/hooks/useFetchData';\nimport getFormConfig from 'liyu-pc-base/components/FormRender/RemoteTreeSelect/index';\nimport { message } from 'ant-design-vue';\n\nexport default defineComponent({\n name: 'RemoteTreeSelect',\n props: {\n field: {\n type: Object,\n required: true,\n },\n value: {\n type: [Array, Number, String],\n required: false,\n default: () => null,\n },\n search_config: {\n type: Object,\n required: false,\n default: () => {},\n },\n label: {\n type: [Array, String],\n required: false,\n },\n formModel: {\n type: Object,\n required: true,\n },\n },\n emits: ['update:value', 'update:label'],\n setup(props, { emit }) {\n const modalRef: any = reactive({\n selectedRows: [],\n datasource: [],\n });\n const { searchConfig, getData } = getFormConfig(props.field.modalType);\n const search_modelRef = reactive({\n ...searchConfig.model,\n });\n\n if (props.value) {\n modalRef.selectedRows.push(props.value);\n }\n\n const getLabelFromDatasource = (datasource: Array<any>) => {\n const labelList: Array<string> = [];\n datasource.forEach((item: any) => {\n if (\n modalRef.selectedRows instanceof Array &&\n modalRef.selectedRows.includes(item[props.field.valueKey])\n ) {\n labelList.push(item[props.field.labelKey]);\n }\n if (\n !(modalRef.selectedRows instanceof Array) &&\n modalRef.selectedRows == item[props.field.valueKey]\n ) {\n labelList.push(item[props.field.labelKey]);\n }\n if (item.children && item.children.length > 0) {\n getLabelFromDatasource(item.children).forEach(obj => labelList.push(obj));\n }\n });\n return labelList;\n };\n\n const handleChange = () => {\n emit('update:value', modalRef.selectedRows);\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n };\n\n watch(\n () => props.formModel[props.field.name],\n () => {\n if (props.field.mode === 'default') {\n if (props.formModel[props.field.name]) {\n modalRef.selectedRows = [props.formModel[props.field.name]];\n } else {\n modalRef.selectedRows = [];\n }\n } else {\n //modalRef.selectedRows.length = 0;\n if (props.formModel[props.field.name] && props.formModel[props.field.name].length > 0) {\n modalRef.selectedRows = props.formModel[props.field.name].map((item: any) => {\n return item;\n });\n }\n }\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n },\n );\n\n const btnClick = (noCache?: boolean) => {\n if (noCache) {\n message.loading({ content: '刷新数据……', key: props.field.modalType });\n }\n\n getData({ ...search_modelRef, ...props.search_config }, noCache)\n .then(function (res: ReponseData<any>) {\n modalRef.datasource = res.data;\n if (modalRef.datasource.length > 0 && modalRef.selectedRows.length > 0) {\n if (\n typeof modalRef.datasource[0][props.field.valueKey] == 'number' &&\n typeof modalRef.selectedRows[0] == 'string'\n ) {\n const list: Array<number> = [];\n modalRef.selectedRows.map((item: string) => {\n item.split(',').map(obj => {\n list.push(Number(obj));\n });\n });\n if (props.field.multiple) {\n modalRef.selectedRows = list;\n } else {\n if (list.length > 1) {\n list.length = 1;\n }\n modalRef.selectedRows = list;\n }\n }\n }\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n if (noCache) {\n message.success({ content: '刷新数据成功', key: props.field.modalType, duration: 2 });\n }\n })\n .catch(() => {\n message.destroy();\n message.error('接口调用失败', 10);\n });\n };\n btnClick();\n\n return {\n props,\n modalRef,\n search_modelRef,\n handleChange,\n btnClick,\n };\n },\n\n data() {\n return {\n model: this.value,\n };\n },\n});\n</script>\n","<template>\n <a-table\n :bordered=\"true\"\n size=\"small\"\n :loading=\"state.loading\"\n :scroll=\"{ y: 400, x: columnState.tableWidth }\"\n :row-selection=\"rowSelection\"\n :columns=\"dynamicColumns\"\n row-key=\"id\"\n :data-source=\"state.dataSource\"\n :pagination=\"{\n current: state.current,\n pageSize: state.pageSize,\n total: state.total,\n }\"\n @change=\"handleTableChange\"\n >\n <template\n v-for=\"item in slotList\"\n v-slot:[item.slotName]=\"{ index, text }\"\n :key=\"item.slotName\"\n >\n <span v-if=\"item.slotName === 'index'\">\n {{ index + 1 + state.pageSize * (state.current - 1) }}\n </span>\n <span v-if=\"item.type === 'custom'\">\n {{ item['field_' + text] }}\n </span>\n <span v-if=\"item.type === 'datetime'\">\n {{ getDateTime(text) }}\n </span>\n <span v-if=\"item.type === 'date'\">\n {{ getDate(text) }}\n </span>\n <span v-if=\"item.type === 'full_date'\">\n {{ getFullDate(text) }}\n </span>\n <span v-if=\"item.type === 'time'\">\n {{ getTime(text) }}\n </span>\n <a-tag\n color=\"green\"\n v-if=\"text && item.type === 'boolean'\"\n >\n {{ item.name1 }}\n </a-tag>\n <a-tag\n color=\"red\"\n v-if=\"!text && item.type === 'boolean'\"\n >\n {{ item.name2 }}\n </a-tag>\n <template v-if=\"item.type === 'list'\">\n <a-tag\n color=\"#87d068\"\n v-for=\"obj in text\"\n :key=\"obj.id\"\n style=\"margin-bottom: 1px\"\n >\n {{ obj.name }}\n </a-tag>\n </template>\n </template>\n </a-table>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, onMounted, reactive, ref, watch } from 'vue';\n// import { ColumnProps } from 'ant-design-vue/es/table/interface';\nimport { useFetchData } from 'liyu-pc-base/utils/hooks/useFetchData';\nimport { useForm } from 'ant-design-vue/es/form';\n\nimport getFormConfig from 'liyu-pc-base/components/FormRender/RemoteModal/index';\nimport { useTableDynamicColumns } from 'liyu-pc-base/utils/hooks/useTableColumn';\nimport { getDate, getDateTime, getFullDate, getTime } from 'liyu-pc-base/utils/function';\n\n// type Key = ColumnProps['key'];\n\n// interface DataType {\n// id: number;\n// key: Key;\n// name: string;\n// }\n\nexport default defineComponent({\n name: 'RemoteTable',\n props: {\n field: {\n type: Object,\n required: true,\n },\n modalType: {\n type: String,\n required: true,\n default: () => '',\n },\n value: {\n type: Array,\n required: true,\n default: () => [],\n },\n init_model: {\n type: Object,\n default: () => {},\n },\n field_status: {\n type: Object,\n default: () => {},\n },\n watch: {\n type: Array,\n default: () => [],\n },\n formModel: {\n type: Object,\n required: true,\n },\n },\n emits: ['update:value'],\n setup(props, { emit }) {\n const loading = ref(false);\n const { searchConfig, searchConfigOptions, getData, columns, slotList } = getFormConfig(\n props.modalType,\n );\n const search_modelRef = reactive({\n ...searchConfig.model,\n is_active: true,\n ...props.init_model,\n });\n\n for (const field of searchConfig.fields) {\n if (props.field_status && props.field_status.hasOwnProperty(field.name)) {\n if (props.field_status[field.name] == 0) {\n field.disabled = true;\n field.hidden = false;\n } else if (props.field_status[field.name] == 1) {\n field.disabled = false;\n field.hidden = true;\n } else {\n field.disabled = false;\n field.hidden = false;\n }\n }\n }\n\n const old_obj: { [key: string]: any } = {};\n onMounted(() => {\n if (props.watch) {\n for (const k of props.watch) {\n if (props.formModel) {\n old_obj[k as string] = props.formModel[k as string];\n }\n }\n }\n if (props.watch && props.formModel) {\n for (const k of props.watch) {\n search_modelRef[k as string] = props.formModel[k as string];\n watch(\n () => props.formModel[k as string],\n () => {\n if (props.watch && props.formModel) {\n for (const k of props.watch) {\n if (old_obj[k as string] != props.formModel[k as string]) {\n search_modelRef[k as string] = props.formModel[k as string];\n }\n }\n }\n },\n { immediate: true },\n );\n }\n }\n });\n\n const { state: columnState, dynamicColumns } = useTableDynamicColumns(columns, {\n checkAll: false,\n needRowIndex: false,\n });\n const datasource = computed(() => {\n return modalRef.datasource.map(item => {\n return {\n value: item[props.field.valueKey ? (props.field.valueKey as string) : 'id'],\n label: item[props.field.labelKey ? (props.field.labelKey as string) : 'name'],\n };\n });\n });\n const modalRef = reactive({\n visible: false,\n selectedRows: new Array<number>(),\n selectedRowsKey: new Array<number>(),\n selectedRowsTotal: new Array<any>(),\n datasource: new Array<any>(),\n });\n\n const rowSelection = {\n type:\n props.field.mode == 'default'\n ? 'radio'\n : props.field.mode == 'multiple'\n ? 'checkbox'\n : 'checkbox',\n columnWidth: '30px',\n selectedRowKeys: modalRef.selectedRowsKey,\n onChange: (selectedRowKeys: any, selectedRows: any) => {\n // modalRef.selectedRowsKey.length = 0;\n const remove_key: Array<number> = modalRef.selectedRowsKey.filter(\n item => selectedRowKeys.indexOf(Number(item)) == -1,\n );\n modalRef.selectedRowsTotal = modalRef.selectedRowsTotal.filter(\n item => remove_key.indexOf(item.id) == -1,\n );\n selectedRows.forEach((item: any) => {\n if (modalRef.selectedRowsKey.indexOf(item.id) == -1) {\n modalRef.selectedRowsTotal.push(item);\n }\n });\n\n modalRef.selectedRowsKey.length = 0;\n selectedRows.forEach((item: any) => {\n modalRef.selectedRowsKey.push(item.id);\n modalRef.datasource.push(item);\n });\n },\n };\n\n const {\n reload,\n setPageInfo,\n context: state,\n } = useFetchData(getData, {\n current: 1,\n pageSize: 20,\n tableSize: 'middle', // 'default' | 'middle' | 'small'\n stripe: true,\n requestParams: {\n ...search_modelRef,\n },\n });\n watch(\n () => state.dataSource,\n () => {\n const total_ids: Array<number> = modalRef.selectedRowsTotal.map(item => item.id);\n state.dataSource.map((item: any) => {\n if (total_ids.indexOf(item.id) > -1) {\n modalRef.selectedRowsKey.push(item.id);\n }\n });\n },\n );\n const init = () => {\n let list: any[] = [];\n if (props.value instanceof Array) {\n if (props.value.length > 0) {\n list = props.value as Array<number>;\n }\n } else {\n if (props.value) {\n list.push(props.value);\n }\n }\n if (list.length > 0) {\n const tmp_ids: any[] = [];\n const tmp_item_ids: any[] = [];\n modalRef.datasource.map(item => tmp_item_ids.push(item.id));\n list.map(item => {\n if (modalRef.selectedRows.indexOf(Number(item)) == -1) {\n modalRef.selectedRows.push(Number(item));\n modalRef.selectedRowsKey.push(Number(item));\n }\n if (tmp_item_ids.indexOf(item) == -1) {\n tmp_ids.push(item);\n }\n });\n if (tmp_ids.length > 0) {\n getData({ current: 1, ...search_modelRef, pageSize: 2000, ids: tmp_ids.join(',') }).then(\n function (res: any) {\n res.data.forEach(item => {\n if (list.indexOf(item.id) >= 0) {\n modalRef.datasource.push(item);\n modalRef.selectedRowsTotal.push(item);\n }\n });\n },\n );\n }\n } else {\n modalRef.selectedRows.length = 0;\n modalRef.selectedRowsKey.length = 0;\n modalRef.selectedRowsTotal.length = 0;\n }\n };\n init();\n\n watch(\n () => props.value,\n () => {\n init();\n },\n );\n\n const handleTableChange = ({ current, pageSize }: any, filters: any, sorter: any) => {\n console.log(sorter);\n setPageInfo({\n current,\n pageSize,\n ...filters,\n ...search_modelRef,\n });\n\n reload();\n };\n\n const { validateInfos: searchValidateInfos } = useForm(search_modelRef, {});\n\n const search = () => {\n setPageInfo({\n current: 1,\n ...search_modelRef,\n });\n reload();\n };\n\n return {\n props,\n modalRef,\n datasource,\n state,\n loading,\n getDateTime,\n getDate,\n getFullDate,\n getTime,\n search,\n handleTableChange,\n rowSelection,\n searchValidateInfos,\n search_modelRef,\n searchConfig,\n searchConfigOptions,\n getData,\n columnState,\n dynamicColumns,\n slotList,\n };\n },\n\n data() {\n return {\n model: this.value,\n };\n },\n});\n</script>\n","<template>\n <a-table\n :bordered=\"true\"\n size=\"small\"\n :loading=\"state.loading\"\n :scroll=\"{ y: 400, x: columnState.tableWidth }\"\n :row-selection=\"rowSelection\"\n :columns=\"dynamicColumns\"\n row-key=\"id\"\n :data-source=\"state.dataSource\"\n :pagination=\"{\n current: state.current,\n pageSize: state.pageSize,\n total: state.total,\n }\"\n @change=\"handleTableChange\"\n >\n <template\n v-for=\"item in slotList\"\n v-slot:[item.slotName]=\"{ index, text }\"\n :key=\"item.slotName\"\n >\n <span v-if=\"item.slotName === 'index'\">\n {{ index + 1 + state.pageSize * (state.current - 1) }}\n </span>\n <span v-if=\"item.type === 'custom'\">\n {{ item['field_' + text] }}\n </span>\n <span v-if=\"item.type === 'datetime'\">\n {{ getDateTime(text) }}\n </span>\n <span v-if=\"item.type === 'date'\">\n {{ getDate(text) }}\n </span>\n <span v-if=\"item.type === 'full_date'\">\n {{ getFullDate(text) }}\n </span>\n <span v-if=\"item.type === 'time'\">\n {{ getTime(text) }}\n </span>\n <a-tag\n color=\"green\"\n v-if=\"text && item.type === 'boolean'\"\n >\n {{ item.name1 }}\n </a-tag>\n <a-tag\n color=\"red\"\n v-if=\"!text && item.type === 'boolean'\"\n >\n {{ item.name2 }}\n </a-tag>\n <template v-if=\"item.type === 'list'\">\n <a-tag\n color=\"#87d068\"\n v-for=\"obj in text\"\n :key=\"obj.id\"\n style=\"margin-bottom: 1px\"\n >\n {{ obj.name }}\n </a-tag>\n </template>\n </template>\n </a-table>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, onMounted, reactive, ref, watch } from 'vue';\n// import { ColumnProps } from 'ant-design-vue/es/table/interface';\nimport { useFetchData } from 'liyu-pc-base/utils/hooks/useFetchData';\nimport { useForm } from 'ant-design-vue/es/form';\n\nimport getFormConfig from 'liyu-pc-base/components/FormRender/RemoteModal/index';\nimport { useTableDynamicColumns } from 'liyu-pc-base/utils/hooks/useTableColumn';\nimport { getDate, getDateTime, getFullDate, getTime } from 'liyu-pc-base/utils/function';\n\n// type Key = ColumnProps['key'];\n\n// interface DataType {\n// id: number;\n// key: Key;\n// name: string;\n// }\n\nexport default defineComponent({\n name: 'RemoteTable',\n props: {\n field: {\n type: Object,\n required: true,\n },\n modalType: {\n type: String,\n required: true,\n default: () => '',\n },\n value: {\n type: Array,\n required: true,\n default: () => [],\n },\n init_model: {\n type: Object,\n default: () => {},\n },\n field_status: {\n type: Object,\n default: () => {},\n },\n watch: {\n type: Array,\n default: () => [],\n },\n formModel: {\n type: Object,\n required: true,\n },\n },\n emits: ['update:value'],\n setup(props, { emit }) {\n const loading = ref(false);\n const { searchConfig, searchConfigOptions, getData, columns, slotList } = getFormConfig(\n props.modalType,\n );\n const search_modelRef = reactive({\n ...searchConfig.model,\n is_active: true,\n ...props.init_model,\n });\n\n for (const field of searchConfig.fields) {\n if (props.field_status && props.field_status.hasOwnProperty(field.name)) {\n if (props.field_status[field.name] == 0) {\n field.disabled = true;\n field.hidden = false;\n } else if (props.field_status[field.name] == 1) {\n field.disabled = false;\n field.hidden = true;\n } else {\n field.disabled = false;\n field.hidden = false;\n }\n }\n }\n\n const old_obj: { [key: string]: any } = {};\n onMounted(() => {\n if (props.watch) {\n for (const k of props.watch) {\n if (props.formModel) {\n old_obj[k as string] = props.formModel[k as string];\n }\n }\n }\n if (props.watch && props.formModel) {\n for (const k of props.watch) {\n search_modelRef[k as string] = props.formModel[k as string];\n watch(\n () => props.formModel[k as string],\n () => {\n if (props.watch && props.formModel) {\n for (const k of props.watch) {\n if (old_obj[k as string] != props.formModel[k as string]) {\n search_modelRef[k as string] = props.formModel[k as string];\n }\n }\n }\n },\n { immediate: true },\n );\n }\n }\n });\n\n const { state: columnState, dynamicColumns } = useTableDynamicColumns(columns, {\n checkAll: false,\n needRowIndex: false,\n });\n const datasource = computed(() => {\n return modalRef.datasource.map(item => {\n return {\n value: item[props.field.valueKey ? (props.field.valueKey as string) : 'id'],\n label: item[props.field.labelKey ? (props.field.labelKey as string) : 'name'],\n };\n });\n });\n const modalRef = reactive({\n visible: false,\n selectedRows: new Array<number>(),\n selectedRowsKey: new Array<number>(),\n selectedRowsTotal: new Array<any>(),\n datasource: new Array<any>(),\n });\n\n const rowSelection = {\n type:\n props.field.mode == 'default'\n ? 'radio'\n : props.field.mode == 'multiple'\n ? 'checkbox'\n : 'checkbox',\n columnWidth: '30px',\n selectedRowKeys: modalRef.selectedRowsKey,\n onChange: (selectedRowKeys: any, selectedRows: any) => {\n // modalRef.selectedRowsKey.length = 0;\n const remove_key: Array<number> = modalRef.selectedRowsKey.filter(\n item => selectedRowKeys.indexOf(Number(item)) == -1,\n );\n modalRef.selectedRowsTotal = modalRef.selectedRowsTotal.filter(\n item => remove_key.indexOf(item.id) == -1,\n );\n selectedRows.forEach((item: any) => {\n if (modalRef.selectedRowsKey.indexOf(item.id) == -1) {\n modalRef.selectedRowsTotal.push(item);\n }\n });\n\n modalRef.selectedRowsKey.length = 0;\n selectedRows.forEach((item: any) => {\n modalRef.selectedRowsKey.push(item.id);\n modalRef.datasource.push(item);\n });\n },\n };\n\n const {\n reload,\n setPageInfo,\n context: state,\n } = useFetchData(getData, {\n current: 1,\n pageSize: 20,\n tableSize: 'middle', // 'default' | 'middle' | 'small'\n stripe: true,\n requestParams: {\n ...search_modelRef,\n },\n });\n watch(\n () => state.dataSource,\n () => {\n const total_ids: Array<number> = modalRef.selectedRowsTotal.map(item => item.id);\n state.dataSource.map((item: any) => {\n if (total_ids.indexOf(item.id) > -1) {\n modalRef.selectedRowsKey.push(item.id);\n }\n });\n },\n );\n const init = () => {\n let list: any[] = [];\n if (props.value instanceof Array) {\n if (props.value.length > 0) {\n list = props.value as Array<number>;\n }\n } else {\n if (props.value) {\n list.push(props.value);\n }\n }\n if (list.length > 0) {\n const tmp_ids: any[] = [];\n const tmp_item_ids: any[] = [];\n modalRef.datasource.map(item => tmp_item_ids.push(item.id));\n list.map(item => {\n if (modalRef.selectedRows.indexOf(Number(item)) == -1) {\n modalRef.selectedRows.push(Number(item));\n modalRef.selectedRowsKey.push(Number(item));\n }\n if (tmp_item_ids.indexOf(item) == -1) {\n tmp_ids.push(item);\n }\n });\n if (tmp_ids.length > 0) {\n getData({ current: 1, ...search_modelRef, pageSize: 2000, ids: tmp_ids.join(',') }).then(\n function (res: any) {\n res.data.forEach(item => {\n if (list.indexOf(item.id) >= 0) {\n modalRef.datasource.push(item);\n modalRef.selectedRowsTotal.push(item);\n }\n });\n },\n );\n }\n } else {\n modalRef.selectedRows.length = 0;\n modalRef.selectedRowsKey.length = 0;\n modalRef.selectedRowsTotal.length = 0;\n }\n };\n init();\n\n watch(\n () => props.value,\n () => {\n init();\n },\n );\n\n const handleTableChange = ({ current, pageSize }: any, filters: any, sorter: any) => {\n console.log(sorter);\n setPageInfo({\n current,\n pageSize,\n ...filters,\n ...search_modelRef,\n });\n\n reload();\n };\n\n const { validateInfos: searchValidateInfos } = useForm(search_modelRef, {});\n\n const search = () => {\n setPageInfo({\n current: 1,\n ...search_modelRef,\n });\n reload();\n };\n\n return {\n props,\n modalRef,\n datasource,\n state,\n loading,\n getDateTime,\n getDate,\n getFullDate,\n getTime,\n search,\n handleTableChange,\n rowSelection,\n searchValidateInfos,\n search_modelRef,\n searchConfig,\n searchConfigOptions,\n getData,\n columnState,\n dynamicColumns,\n slotList,\n };\n },\n\n data() {\n return {\n model: this.value,\n };\n },\n});\n</script>\n"],"mappings":";;;;;;;;;AAGA,IAAM,IAAyC,CAAC,GAC1C,UAAa;CACjB,IAAI,OAAO,KAAK,CAAc,CAAC,CAAC,SAAS,GACvC;CAEF,IAAM,IAAqB,uBAAA,OAAA,CAAA,CAAA,GAMrB,IAAmB,EAAW,kBAAkB;CAEtD,AADA,OAAO,OAAO,GAAe,CAAgB,GAC7C,OAAO,KAAK,CAAa,CAAC,CAAC,SAAQ,MAAkB;EACnD,IAAM,IAAiB,EAAe,MAAM,GAAG,GACzC,IAAY,EAAe,EAAe,SAAS,EAAE,CAAC,QAAQ,OAAO,EAAE;EAC7E,EAAe,KAAa,EAAc,EAAe,CAAC;CAC5D,CAAC;AACH,GACA,KAAgB,OACd,EAAK,GACD,EAAe,MAAc,QAC/B,QAAQ,MAAM,0BAA0B,CAAS,GAC1C;CACL,SAAS,KAAA;CACT,cAAc,KAAA;AAChB,KAEK,EACL,GAAG,EAAe,EAAU,CAAC,oBAAoB,GAAW,EAC9D,ICcF,IAAe,EAAgB;CAC7B,MAAM;CACN,OAAO;EACL,OAAO;GACL,MAAM;GACN,UAAU;EACZ;EACA,OAAO;GACL,MAAM;IAAC;IAAO;IAAQ;GAAM;GAC5B,UAAU;GACV,eAAe;EACjB;EACA,eAAe;GACb,MAAM;GACN,UAAU;GACV,eAAe,CAAC;EAClB;EACA,OAAO;GACL,MAAM,CAAC,OAAO,MAAM;GACpB,UAAU;EACZ;EACA,WAAW;GACT,MAAM;GACN,UAAU;EACZ;CACF;CACA,OAAO,CAAC,gBAAgB,cAAc;CACtC,MAAM,GAAO,EAAE,WAAQ;EACrB,IAAM,IAAgB,EAAS;GAC7B,cAAc,CAAC;GACf,YAAY,CAAC;EACf,CAAC,GACK,EAAE,iBAAc,eAAY,EAAc,EAAM,MAAM,SAAS,GAC/D,IAAkB,EAAS,EAC/B,GAAG,EAAa,MAClB,CAAC;EAED,AAAI,EAAM,SACR,EAAS,aAAa,KAAK,EAAM,KAAK;EAGxC,IAAM,KAA0B,MAA2B;GACzD,IAAM,IAA2B,CAAC;GAkBlC,OAjBA,EAAW,SAAS,MAAc;IAahC,AAXE,EAAS,wBAAwB,SACjC,EAAS,aAAa,SAAS,EAAK,EAAM,MAAM,SAAS,KAEzD,EAAU,KAAK,EAAK,EAAM,MAAM,SAAS,GAGzC,EAAE,EAAS,wBAAwB,UACnC,EAAS,gBAAgB,EAAK,EAAM,MAAM,aAE1C,EAAU,KAAK,EAAK,EAAM,MAAM,SAAS,GAEvC,EAAK,YAAY,EAAK,SAAS,SAAS,KAC1C,EAAuB,EAAK,QAAQ,CAAC,CAAC,SAAQ,MAAO,EAAU,KAAK,CAAG,CAAC;GAE5E,CAAC,GACM;EACT,GAEM,UAAqB;GAEzB,AADA,EAAK,gBAAgB,EAAS,YAAY,GAC1C,EAAK,gBAAgB,EAAuB,EAAS,UAAU,CAAC;EAClE;EAEA,QACQ,EAAM,UAAU,EAAM,MAAM,aAC5B;GAeJ,AAdI,EAAM,MAAM,SAAS,YACnB,EAAM,UAAU,EAAM,MAAM,QAC9B,EAAS,eAAe,CAAC,EAAM,UAAU,EAAM,MAAM,KAAK,IAE1D,EAAS,eAAe,CAAC,IAIvB,EAAM,UAAU,EAAM,MAAM,SAAS,EAAM,UAAU,EAAM,MAAM,KAAK,CAAC,SAAS,MAClF,EAAS,eAAe,EAAM,UAAU,EAAM,MAAM,KAAK,CAAC,KAAK,MACtD,CACR,IAGL,EAAK,gBAAgB,EAAuB,EAAS,UAAU,CAAC;EAClE,CACF;EAEA,IAAM,KAAY,MAAsB;GAKtC,AAJI,KACF,EAAQ,QAAQ;IAAE,SAAS;IAAU,KAAK,EAAM,MAAM;GAAU,CAAC,GAGnE,EAAQ;IAAE,GAAG;IAAiB,GAAG,EAAM;GAAc,GAAG,CAAO,CAAA,CAC5D,KAAK,SAAU,GAAuB;IAErC,IADA,EAAS,aAAa,EAAI,MACtB,EAAS,WAAW,SAAS,KAAK,EAAS,aAAa,SAAS,KAEjE,OAAO,EAAS,WAAW,EAAE,CAAC,EAAM,MAAM,aAAa,YACvD,OAAO,EAAS,aAAa,MAAM,UACnC;KACA,IAAM,IAAsB,CAAC;KAM7B,AALA,EAAS,aAAa,KAAK,MAAiB;MAC1C,EAAK,MAAM,GAAG,CAAC,CAAC,KAAI,MAAO;OACzB,EAAK,KAAK,OAAO,CAAG,CAAC;MACvB,CAAC;KACH,CAAC,GACG,EAAM,MAAM,YAGV,EAAK,SAAS,MAChB,EAAK,SAAS,IAHhB,EAAS,eAAe;IAO5B;IAGF,AADA,EAAK,gBAAgB,EAAuB,EAAS,UAAU,CAAC,GAC5D,KACF,EAAQ,QAAQ;KAAE,SAAS;KAAU,KAAK,EAAM,MAAM;KAAW,UAAU;IAAE,CAAC;GAElF,CAAC,CAAA,CACA,YAAY;IAEX,AADA,EAAQ,QAAQ,GAChB,EAAQ,MAAM,UAAU,EAAE;GAC5B,CAAC;EACL;EAGA,OAFA,EAAS,GAEF;GACL;GACA;GACA;GACA;GACA;EACF;CACF;CAEA,OAAO;EACL,OAAO,EACL,OAAO,KAAK,MACd;CACF;AACF,CAAC;;;;;aC9LC,EAqCW,GAAA;EApCT,OAAM;EACN,OAAA,EAAA,aAAA,QAAA;;EAHJ,SAAA,QAsBuB,CAjBnB,EAiBmB,GAAA,MAAA;GAtBvB,SAAA,QAqBQ,CAfF,EAeE,GAAA;IAdQ,OAAO,EAAA,SAAS;IAPhC,kBAAA,AAAA,EAAA,QAAA,MAAA,EAOuB,SAAS,eAAY;IACpC,MAAK;IACL,OAAA,EAAA,aAAA,QAAA;IACC,aAAa,EAAA,MAAM;IACnB,0BAA0B;IAC1B,UAAU,EAAA,MAAM;IAChB,iBAAe,EAAA,MAAM;IACrB,eAAa,EAAA,MAAM;IACnB,aAAW,EAAA,SAAS;IACpB,kBAAgB,EAAA,MAAM;IACtB,yBAAuB,EAAA,MAAM;IAC7B,mBAAiB,EAAA,MAAM;IACvB,eAAe,EAAA,WAAA,QAAA;IACf,UAAQ,EAAA;;;;;;;;;;;;;GApBjB,GAAA;MAuBI,EAciB,GAAA;GAbf,OAAM;GACN,OAAA,EAAA,YAAA,mBAAA;;GAzBN,SAAA,QAoCiB,CATX,EASW,GAAA;IART,MAAK;IACL,OAAA,EAAA,OAAA,OAAA;IACC,SAAK,AAAA,EAAA,QAAA,MAAE,EAAA,SAAQ,EAAA;IAChB,MAAK;;IAEM,MAAI,QACM,CAAnB,EAAmB,CAAA,CAAA,CAAA;IAlC7B,GAAA;;GAAA,GAAA;;EAAA,GAAA;;;6CCoFA,IAAe,EAAgB;CAC7B,MAAM;CACN,OAAO;EACL,OAAO;GACL,MAAM;GACN,UAAU;EACZ;EACA,WAAW;GACT,MAAM;GACN,UAAU;GACV,eAAe;EACjB;EACA,OAAO;GACL,MAAM;GACN,UAAU;GACV,eAAe,CAAC;EAClB;EACA,YAAY;GACV,MAAM;GACN,eAAe,CAAC;EAClB;EACA,cAAc;GACZ,MAAM;GACN,eAAe,CAAC;EAClB;EACA,OAAO;GACL,MAAM;GACN,eAAe,CAAC;EAClB;EACA,WAAW;GACT,MAAM;GACN,UAAU;EACZ;CACF;CACA,OAAO,CAAC,cAAc;CACtB,MAAM,GAAO,EAAE,WAAQ;EACrB,IAAM,IAAU,EAAI,EAAK,GACnB,EAAE,iBAAc,wBAAqB,YAAS,YAAS,gBAAa,EACxE,EAAM,SACR,GACM,IAAkB,EAAS;GAC/B,GAAG,EAAa;GAChB,WAAW;GACX,GAAG,EAAM;EACX,CAAC;EAED,KAAK,IAAM,KAAS,EAAa,QAC/B,AAAI,EAAM,gBAAgB,EAAM,aAAa,eAAe,EAAM,IAAI,MAChE,EAAM,aAAa,EAAM,SAAS,KACpC,EAAM,WAAW,IACjB,EAAM,SAAS,MACN,EAAM,aAAa,EAAM,SAAS,KAC3C,EAAM,WAAW,IACjB,EAAM,SAAS,OAEf,EAAM,WAAW,IACjB,EAAM,SAAS;EAKrB,IAAM,IAAkC,CAAC;EACzC,QAAgB;GACd,IAAI,EAAM,YACH,IAAM,KAAK,EAAM,OACpB,AAAI,EAAM,cACR,EAAQ,KAAe,EAAM,UAAU;GAI7C,IAAI,EAAM,SAAS,EAAM,WACvB,KAAK,IAAM,KAAK,EAAM,OAEpB,AADA,EAAgB,KAAe,EAAM,UAAU,IAC/C,QACQ,EAAM,UAAU,UAChB;IACJ,IAAI,EAAM,SAAS,EAAM,gBAClB,IAAM,KAAK,EAAM,OACpB,AAAI,EAAQ,MAAgB,EAAM,UAAU,OAC1C,EAAgB,KAAe,EAAM,UAAU;GAIvD,GACA,EAAE,WAAW,GAAK,CACpB;EAGN,CAAC;EAED,IAAM,EAAE,OAAO,GAAa,sBAAmB,EAAuB,GAAS;GAC7E,UAAU;GACV,cAAc;EAChB,CAAC,GACK,IAAa,QACV,EAAS,WAAW,KAAI,OACtB;GACL,OAAO,EAAK,EAAM,MAAM,WAAY,EAAM,MAAM,WAAsB;GACtE,OAAO,EAAK,EAAM,MAAM,WAAY,EAAM,MAAM,WAAsB;EACxE,EACD,CACF,GACK,IAAW,EAAS;GACxB,SAAS;GACT,cAAc,CAAkB;GAChC,iBAAiB,CAAkB;GACnC,mBAAmB,CAAe;GAClC,YAAY,CAAe;EAC7B,CAAC,GAEK,IAAe;GACnB,MACE,EAAM,MAAM,QAAQ,YAChB,WACA,EAAM,MAAM,MACZ;GAEN,aAAa;GACb,iBAAiB,EAAS;GAC1B,WAAW,GAAsB,MAAsB;IAErD,IAAM,IAA4B,EAAS,gBAAgB,QACzD,MAAQ,EAAgB,QAAQ,OAAO,CAAI,CAAC,KAAK,EACnD;IAWA,AAVA,EAAS,oBAAoB,EAAS,kBAAkB,QACtD,MAAQ,EAAW,QAAQ,EAAK,EAAE,KAAK,EACzC,GACA,EAAa,SAAS,MAAc;KAClC,AAAI,EAAS,gBAAgB,QAAQ,EAAK,EAAE,KAAK,MAC/C,EAAS,kBAAkB,KAAK,CAAI;IAExC,CAAC,GAED,EAAS,gBAAgB,SAAS,GAClC,EAAa,SAAS,MAAc;KAElC,AADA,EAAS,gBAAgB,KAAK,EAAK,EAAE,GACrC,EAAS,WAAW,KAAK,CAAI;IAC/B,CAAC;GACH;EACF,GAEM,EACJ,WACA,gBACA,SAAS,MACP,EAAa,GAAS;GACxB,SAAS;GACT,UAAU;GACV,WAAW;GACX,QAAQ;GACR,eAAe,EACb,GAAG,EACL;EACF,CAAC;EACD,QACQ,EAAM,kBACN;GACJ,IAAM,IAA2B,EAAS,kBAAkB,KAAI,MAAQ,EAAK,EAAE;GAC/E,EAAM,WAAW,KAAK,MAAc;IAClC,AAAI,EAAU,QAAQ,EAAK,EAAE,IAAI,MAC/B,EAAS,gBAAgB,KAAK,EAAK,EAAE;GAEzC,CAAC;EACH,CACF;EACA,IAAM,UAAa;GACjB,IAAI,IAAc,CAAC;GAUnB,IATI,EAAM,iBAAiB,QACrB,EAAM,MAAM,SAAS,MACvB,IAAO,EAAM,SAGX,EAAM,SACR,EAAK,KAAK,EAAM,KAAK,GAGrB,EAAK,SAAS,GAAG;IACnB,IAAM,IAAiB,CAAC,GAClB,IAAsB,CAAC;IAW7B,AAVA,EAAS,WAAW,KAAI,MAAQ,EAAa,KAAK,EAAK,EAAE,CAAC,GAC1D,EAAK,KAAI,MAAQ;KAKf,AAJI,EAAS,aAAa,QAAQ,OAAO,CAAI,CAAC,KAAK,OACjD,EAAS,aAAa,KAAK,OAAO,CAAI,CAAC,GACvC,EAAS,gBAAgB,KAAK,OAAO,CAAI,CAAC,IAExC,EAAa,QAAQ,CAAI,KAAK,MAChC,EAAQ,KAAK,CAAI;IAErB,CAAC,GACG,EAAQ,SAAS,KACnB,EAAQ;KAAE,SAAS;KAAG,GAAG;KAAiB,UAAU;KAAM,KAAK,EAAQ,KAAK,GAAG;IAAE,CAAC,CAAC,CAAC,KAClF,SAAU,GAAU;KAClB,EAAI,KAAK,SAAQ,MAAQ;MACvB,AAAI,EAAK,QAAQ,EAAK,EAAE,KAAK,MAC3B,EAAS,WAAW,KAAK,CAAI,GAC7B,EAAS,kBAAkB,KAAK,CAAI;KAExC,CAAC;IACH,CACF;GAEJ,OAGE,AAFA,EAAS,aAAa,SAAS,GAC/B,EAAS,gBAAgB,SAAS,GAClC,EAAS,kBAAkB,SAAS;EAExC;EAGA,AAFA,EAAK,GAEL,QACQ,EAAM,aACN;GACJ,EAAK;EACP,CACF;EAEA,IAAM,KAAqB,EAAE,YAAS,eAAiB,GAAc,MAAgB;GASnF,AARA,QAAQ,IAAI,CAAM,GAClB,EAAY;IACV;IACA;IACA,GAAG;IACH,GAAG;GACL,CAAC,GAED,EAAO;EACT,GAEM,EAAE,eAAe,MAAwB,EAAQ,GAAiB,CAAC,CAAC;EAU1E,OAAO;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,cAlBmB;IAKnB,AAJA,EAAY;KACV,SAAS;KACT,GAAG;IACL,CAAC,GACD,EAAO;GACT;GAaE;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF;CACF;CAEA,OAAO;EACL,OAAO,EACL,OAAO,KAAK,MACd;CACF;AACF,CAAC,SC/VD,KAAA,EAAA,SAAA,KAAA,EAAA,SAAA,KAAA,EAAA,SAAA,KAAA,EAAA,SAAA,KAAA,EAAA,SAAA,KAAA,EAAA;;;aACE,EA8DU,GAAA;EA7DP,UAAU;EACX,MAAK;EACJ,SAAS,EAAA,MAAM;EACf,QAAM;GAAA,GAAA;GAAA,GAAe,EAAA,YAAY;EAAU;EAC3C,iBAAe,EAAA;EACf,SAAS,EAAA;EACV,WAAQ;EACP,eAAa,EAAA,MAAM;EACnB,YAAU;YAAmB,EAAA,MAAM;aAAyB,EAAA,MAAM;UAAuB,EAAA,MAAM;;EAK/F,UAAQ,EAAA;IAfb,EAAA,EAAA,GAAA,EAAA,GAAA,CAAA,EAkBqB,EAAA,WAAR;EAlBb,MAmBa,EAAK;EAnBlB,IAAA,GAwBa,EALmB,UAAO,cAAI;GAGzB,EAAK,aAAQ,WAAA,EAAA,GAAzB,EAEO,QAxBb,GAAA,EAuBW,IAAK,IAAO,EAAA,MAAM,YAAY,EAAA,MAAM,UAAO,EAAA,GAAA,CAAA,KAvBtD,EAAA,IAAA,EAAA;GAyBkB,EAAK,SAAI,YAAA,EAAA,GAArB,EAEO,QA3Bb,GAAA,EA0BW,EAAI,WAAY,EAAI,GAAA,CAAA,KA1B/B,EAAA,IAAA,EAAA;GA4BkB,EAAK,SAAI,cAAA,EAAA,GAArB,EAEO,QA9Bb,GAAA,EA6BW,EAAA,YAAY,CAAI,CAAA,GAAA,CAAA,KA7B3B,EAAA,IAAA,EAAA;GA+BkB,EAAK,SAAI,UAAA,EAAA,GAArB,EAEO,QAjCb,GAAA,EAgCW,EAAA,QAAQ,CAAI,CAAA,GAAA,CAAA,KAhCvB,EAAA,IAAA,EAAA;GAkCkB,EAAK,SAAI,eAAA,EAAA,GAArB,EAEO,QApCb,GAAA,EAmCW,EAAA,YAAY,CAAI,CAAA,GAAA,CAAA,KAnC3B,EAAA,IAAA,EAAA;GAqCkB,EAAK,SAAI,UAAA,EAAA,GAArB,EAEO,QAvCb,GAAA,EAsCW,EAAA,QAAQ,CAAI,CAAA,GAAA,CAAA,KAtCvB,EAAA,IAAA,EAAA;GA0Cc,KAAQ,EAAK,SAAI,aAAA,EAAA,GAFzB,EAKQ,GAAA;IA7Cd,KAAA;IAyCQ,OAAM;;IAzCd,SAAA,QA4CwB,CA5CxB,EAAA,EA4CW,EAAK,KAAK,GAAA,CAAA,CAAA,CAAA;IA5CrB,GAAA;eAAA,EAAA,IAAA,EAAA;IAgDe,KAAQ,EAAK,SAAI,aAAA,EAAA,GAF1B,EAKQ,GAAA;IAnDd,KAAA;IA+CQ,OAAM;;IA/Cd,SAAA,QAkDwB,CAlDxB,EAAA,EAkDW,EAAK,KAAK,GAAA,CAAA,CAAA,CAAA;IAlDrB,GAAA;eAAA,EAAA,IAAA,EAAA;GAoDsB,EAAK,SAAI,UAAA,EAAA,EAAA,GACvB,EAOQ,GAAA,EA5DhB,KAAA,EAAA,GAAA,EAuDwB,IAAP,YAFT,EAOQ,GAAA;IANN,OAAM;IAEL,KAAK,EAAI;IACV,OAAA,EAAA,iBAAA,MAAA;;IAzDV,SAAA,QA2DwB,CA3DxB,EAAA,EA2Da,EAAI,IAAI,GAAA,CAAA,CAAA,CAAA;IA3DrB,GAAA;uBAAA,EAAA,IAAA,EAAA"}
|
|
1
|
+
{"version":3,"file":"RemoteTable-D_12PvNS.js","names":[],"sources":["../src/components/FormRender/RemoteTreeSelect/index.ts","../src/components/FormRender/RemoteTreeSelect/RemoteTreeSelect.vue","../src/components/FormRender/RemoteTreeSelect/RemoteTreeSelect.vue","../src/components/FormRender/RemoteTable/RemoteTable.vue","../src/components/FormRender/RemoteTable/RemoteTable.vue"],"sourcesContent":["import type { RemoteTreeSelect } from 'liyu-pc-base/components/FormRender/RemoteTreeSelect/typing';\nimport { useGlobMap } from 'liyu-pc-base/init-plugin';\n\nconst res_components: { [key: string]: any } = {};\nconst init = () => {\n if (Object.keys(res_components).length > 0) {\n return;\n }\n const allComponents: any = import.meta.glob(\n 'liyu-pc-base/components/FormRender/RemoteTreeSelect/*/*.ts',\n {\n eager: true,\n },\n );\n const customComponents = useGlobMap('remoteTreeSelect');\n Object.assign(allComponents, customComponents);\n Object.keys(allComponents).forEach(full_file_name => {\n const file_name_list = full_file_name.split('/');\n const file_name = file_name_list[file_name_list.length - 1].replace('.ts', '');\n res_components[file_name] = allComponents[full_file_name].default;\n });\n};\nexport default (modalType: string): RemoteTreeSelect => {\n init();\n if (res_components[modalType] == undefined) {\n console.error('remotetreeselect没有组件:' + modalType);\n return {\n getData: undefined,\n searchConfig: undefined,\n };\n }\n return {\n ...res_components[modalType](`remotetreeselect_${modalType}`),\n };\n};\n","<template>\n <a-layout\n width=\"100%\"\n style=\"min-width: 190px\"\n >\n <a-layout-content>\n <a-tree-select\n v-model:value=\"modalRef.selectedRows\"\n size=\"small\"\n style=\"min-width: 150px\"\n :placeholder=\"field.placeholder\"\n :dropdownMatchSelectWidth=\"false\"\n :disabled=\"field.disabled\"\n :default-value=\"field.defaultValue\"\n :allow-clear=\"field.allowClear\"\n :tree-data=\"modalRef.datasource\"\n :tree-checkable=\"field.multiple\"\n :tree-node-filter-prop=\"field.valueKey\"\n :tree-label-prop=\"field.labelKey\"\n :dropdownStyle=\"{ maxHeight: '400px' }\"\n @change=\"handleChange\"\n />\n </a-layout-content>\n <a-layout-sider\n width=\"30px\"\n style=\"background: rgba(0, 0, 0, 0)\"\n >\n <a-button\n size=\"small\"\n style=\"width: 30px\"\n @click=\"btnClick(true)\"\n type=\"text\"\n >\n <template #icon>\n <reload-outlined />\n </template>\n </a-button>\n </a-layout-sider>\n </a-layout>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, reactive, watch } from 'vue';\nimport type { ReponseData } from 'liyu-pc-base/utils/hooks/useFetchData';\nimport getFormConfig from 'liyu-pc-base/components/FormRender/RemoteTreeSelect/index';\nimport { message } from 'ant-design-vue';\n\nexport default defineComponent({\n name: 'RemoteTreeSelect',\n props: {\n field: {\n type: Object,\n required: true,\n },\n value: {\n type: [Array, Number, String],\n required: false,\n default: () => null,\n },\n search_config: {\n type: Object,\n required: false,\n default: () => {},\n },\n label: {\n type: [Array, String],\n required: false,\n },\n formModel: {\n type: Object,\n required: true,\n },\n },\n emits: ['update:value', 'update:label'],\n setup(props, { emit }) {\n const modalRef: any = reactive({\n selectedRows: [],\n datasource: [],\n });\n const { searchConfig, getData } = getFormConfig(props.field.modalType);\n const search_modelRef = reactive({\n ...searchConfig.model,\n });\n\n if (props.value) {\n modalRef.selectedRows.push(props.value);\n }\n\n const getLabelFromDatasource = (datasource: Array<any>) => {\n const labelList: Array<string> = [];\n datasource.forEach((item: any) => {\n if (\n modalRef.selectedRows instanceof Array &&\n modalRef.selectedRows.includes(item[props.field.valueKey])\n ) {\n labelList.push(item[props.field.labelKey]);\n }\n if (\n !(modalRef.selectedRows instanceof Array) &&\n modalRef.selectedRows == item[props.field.valueKey]\n ) {\n labelList.push(item[props.field.labelKey]);\n }\n if (item.children && item.children.length > 0) {\n getLabelFromDatasource(item.children).forEach(obj => labelList.push(obj));\n }\n });\n return labelList;\n };\n\n const handleChange = () => {\n emit('update:value', modalRef.selectedRows);\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n };\n\n watch(\n () => props.formModel[props.field.name],\n () => {\n if (props.field.mode === 'default') {\n if (props.formModel[props.field.name]) {\n modalRef.selectedRows = [props.formModel[props.field.name]];\n } else {\n modalRef.selectedRows = [];\n }\n } else {\n //modalRef.selectedRows.length = 0;\n if (props.formModel[props.field.name] && props.formModel[props.field.name].length > 0) {\n modalRef.selectedRows = props.formModel[props.field.name].map((item: any) => {\n return item;\n });\n }\n }\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n },\n );\n\n const btnClick = (noCache?: boolean) => {\n if (noCache) {\n message.loading({ content: '刷新数据……', key: props.field.modalType });\n }\n\n getData({ ...search_modelRef, ...props.search_config }, noCache)\n .then(function (res: ReponseData<any>) {\n modalRef.datasource = res.data;\n if (modalRef.datasource.length > 0 && modalRef.selectedRows.length > 0) {\n if (\n typeof modalRef.datasource[0][props.field.valueKey] == 'number' &&\n typeof modalRef.selectedRows[0] == 'string'\n ) {\n const list: Array<number> = [];\n modalRef.selectedRows.map((item: string) => {\n item.split(',').map(obj => {\n list.push(Number(obj));\n });\n });\n if (props.field.multiple) {\n modalRef.selectedRows = list;\n } else {\n if (list.length > 1) {\n list.length = 1;\n }\n modalRef.selectedRows = list;\n }\n }\n }\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n if (noCache) {\n message.success({ content: '刷新数据成功', key: props.field.modalType, duration: 2 });\n }\n })\n .catch(() => {\n message.destroy();\n message.error('接口调用失败', 10);\n });\n };\n btnClick();\n\n return {\n props,\n modalRef,\n search_modelRef,\n handleChange,\n btnClick,\n };\n },\n\n data() {\n return {\n model: this.value,\n };\n },\n});\n</script>\n","<template>\n <a-layout\n width=\"100%\"\n style=\"min-width: 190px\"\n >\n <a-layout-content>\n <a-tree-select\n v-model:value=\"modalRef.selectedRows\"\n size=\"small\"\n style=\"min-width: 150px\"\n :placeholder=\"field.placeholder\"\n :dropdownMatchSelectWidth=\"false\"\n :disabled=\"field.disabled\"\n :default-value=\"field.defaultValue\"\n :allow-clear=\"field.allowClear\"\n :tree-data=\"modalRef.datasource\"\n :tree-checkable=\"field.multiple\"\n :tree-node-filter-prop=\"field.valueKey\"\n :tree-label-prop=\"field.labelKey\"\n :dropdownStyle=\"{ maxHeight: '400px' }\"\n @change=\"handleChange\"\n />\n </a-layout-content>\n <a-layout-sider\n width=\"30px\"\n style=\"background: rgba(0, 0, 0, 0)\"\n >\n <a-button\n size=\"small\"\n style=\"width: 30px\"\n @click=\"btnClick(true)\"\n type=\"text\"\n >\n <template #icon>\n <reload-outlined />\n </template>\n </a-button>\n </a-layout-sider>\n </a-layout>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, reactive, watch } from 'vue';\nimport type { ReponseData } from 'liyu-pc-base/utils/hooks/useFetchData';\nimport getFormConfig from 'liyu-pc-base/components/FormRender/RemoteTreeSelect/index';\nimport { message } from 'ant-design-vue';\n\nexport default defineComponent({\n name: 'RemoteTreeSelect',\n props: {\n field: {\n type: Object,\n required: true,\n },\n value: {\n type: [Array, Number, String],\n required: false,\n default: () => null,\n },\n search_config: {\n type: Object,\n required: false,\n default: () => {},\n },\n label: {\n type: [Array, String],\n required: false,\n },\n formModel: {\n type: Object,\n required: true,\n },\n },\n emits: ['update:value', 'update:label'],\n setup(props, { emit }) {\n const modalRef: any = reactive({\n selectedRows: [],\n datasource: [],\n });\n const { searchConfig, getData } = getFormConfig(props.field.modalType);\n const search_modelRef = reactive({\n ...searchConfig.model,\n });\n\n if (props.value) {\n modalRef.selectedRows.push(props.value);\n }\n\n const getLabelFromDatasource = (datasource: Array<any>) => {\n const labelList: Array<string> = [];\n datasource.forEach((item: any) => {\n if (\n modalRef.selectedRows instanceof Array &&\n modalRef.selectedRows.includes(item[props.field.valueKey])\n ) {\n labelList.push(item[props.field.labelKey]);\n }\n if (\n !(modalRef.selectedRows instanceof Array) &&\n modalRef.selectedRows == item[props.field.valueKey]\n ) {\n labelList.push(item[props.field.labelKey]);\n }\n if (item.children && item.children.length > 0) {\n getLabelFromDatasource(item.children).forEach(obj => labelList.push(obj));\n }\n });\n return labelList;\n };\n\n const handleChange = () => {\n emit('update:value', modalRef.selectedRows);\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n };\n\n watch(\n () => props.formModel[props.field.name],\n () => {\n if (props.field.mode === 'default') {\n if (props.formModel[props.field.name]) {\n modalRef.selectedRows = [props.formModel[props.field.name]];\n } else {\n modalRef.selectedRows = [];\n }\n } else {\n //modalRef.selectedRows.length = 0;\n if (props.formModel[props.field.name] && props.formModel[props.field.name].length > 0) {\n modalRef.selectedRows = props.formModel[props.field.name].map((item: any) => {\n return item;\n });\n }\n }\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n },\n );\n\n const btnClick = (noCache?: boolean) => {\n if (noCache) {\n message.loading({ content: '刷新数据……', key: props.field.modalType });\n }\n\n getData({ ...search_modelRef, ...props.search_config }, noCache)\n .then(function (res: ReponseData<any>) {\n modalRef.datasource = res.data;\n if (modalRef.datasource.length > 0 && modalRef.selectedRows.length > 0) {\n if (\n typeof modalRef.datasource[0][props.field.valueKey] == 'number' &&\n typeof modalRef.selectedRows[0] == 'string'\n ) {\n const list: Array<number> = [];\n modalRef.selectedRows.map((item: string) => {\n item.split(',').map(obj => {\n list.push(Number(obj));\n });\n });\n if (props.field.multiple) {\n modalRef.selectedRows = list;\n } else {\n if (list.length > 1) {\n list.length = 1;\n }\n modalRef.selectedRows = list;\n }\n }\n }\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n if (noCache) {\n message.success({ content: '刷新数据成功', key: props.field.modalType, duration: 2 });\n }\n })\n .catch(() => {\n message.destroy();\n message.error('接口调用失败', 10);\n });\n };\n btnClick();\n\n return {\n props,\n modalRef,\n search_modelRef,\n handleChange,\n btnClick,\n };\n },\n\n data() {\n return {\n model: this.value,\n };\n },\n});\n</script>\n","<template>\n <a-table\n :bordered=\"true\"\n size=\"small\"\n :loading=\"state.loading\"\n :scroll=\"{ y: 400, x: columnState.tableWidth }\"\n :row-selection=\"rowSelection\"\n :columns=\"dynamicColumns\"\n row-key=\"id\"\n :data-source=\"state.dataSource\"\n :pagination=\"{\n current: state.current,\n pageSize: state.pageSize,\n total: state.total,\n }\"\n @change=\"handleTableChange\"\n >\n <template\n v-for=\"item in slotList\"\n v-slot:[item.slotName]=\"{ index, text }\"\n :key=\"item.slotName\"\n >\n <span v-if=\"item.slotName === 'index'\">\n {{ index + 1 + state.pageSize * (state.current - 1) }}\n </span>\n <span v-if=\"item.type === 'custom'\">\n {{ item['field_' + text] }}\n </span>\n <span v-if=\"item.type === 'datetime'\">\n {{ getDateTime(text) }}\n </span>\n <span v-if=\"item.type === 'date'\">\n {{ getDate(text) }}\n </span>\n <span v-if=\"item.type === 'full_date'\">\n {{ getFullDate(text) }}\n </span>\n <span v-if=\"item.type === 'time'\">\n {{ getTime(text) }}\n </span>\n <a-tag\n color=\"green\"\n v-if=\"text && item.type === 'boolean'\"\n >\n {{ item.name1 }}\n </a-tag>\n <a-tag\n color=\"red\"\n v-if=\"!text && item.type === 'boolean'\"\n >\n {{ item.name2 }}\n </a-tag>\n <template v-if=\"item.type === 'list'\">\n <a-tag\n color=\"#87d068\"\n v-for=\"obj in text\"\n :key=\"obj.id\"\n style=\"margin-bottom: 1px\"\n >\n {{ obj.name }}\n </a-tag>\n </template>\n </template>\n </a-table>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, onMounted, reactive, ref, watch } from 'vue';\n// import { ColumnProps } from 'ant-design-vue/es/table/interface';\nimport { useFetchData } from 'liyu-pc-base/utils/hooks/useFetchData';\nimport { useForm } from 'ant-design-vue/es/form';\n\nimport getFormConfig from 'liyu-pc-base/components/FormRender/RemoteModal/index';\nimport { useTableDynamicColumns } from 'liyu-pc-base/utils/hooks/useTableColumn';\nimport { getDate, getDateTime, getFullDate, getTime } from 'liyu-pc-base/utils/function';\n\n// type Key = ColumnProps['key'];\n\n// interface DataType {\n// id: number;\n// key: Key;\n// name: string;\n// }\n\nexport default defineComponent({\n name: 'RemoteTable',\n props: {\n field: {\n type: Object,\n required: true,\n },\n modalType: {\n type: String,\n required: true,\n default: () => '',\n },\n value: {\n type: Array,\n required: true,\n default: () => [],\n },\n init_model: {\n type: Object,\n default: () => {},\n },\n field_status: {\n type: Object,\n default: () => {},\n },\n watch: {\n type: Array,\n default: () => [],\n },\n formModel: {\n type: Object,\n required: true,\n },\n },\n emits: ['update:value'],\n setup(props, { emit }) {\n const loading = ref(false);\n const { searchConfig, searchConfigOptions, getData, columns, slotList } = getFormConfig(\n props.modalType,\n );\n const search_modelRef = reactive({\n ...searchConfig.model,\n is_active: true,\n ...props.init_model,\n });\n\n for (const field of searchConfig.fields) {\n if (props.field_status && props.field_status.hasOwnProperty(field.name)) {\n if (props.field_status[field.name] == 0) {\n field.disabled = true;\n field.hidden = false;\n } else if (props.field_status[field.name] == 1) {\n field.disabled = false;\n field.hidden = true;\n } else {\n field.disabled = false;\n field.hidden = false;\n }\n }\n }\n\n const old_obj: { [key: string]: any } = {};\n onMounted(() => {\n if (props.watch) {\n for (const k of props.watch) {\n if (props.formModel) {\n old_obj[k as string] = props.formModel[k as string];\n }\n }\n }\n if (props.watch && props.formModel) {\n for (const k of props.watch) {\n search_modelRef[k as string] = props.formModel[k as string];\n watch(\n () => props.formModel[k as string],\n () => {\n if (props.watch && props.formModel) {\n for (const k of props.watch) {\n if (old_obj[k as string] != props.formModel[k as string]) {\n search_modelRef[k as string] = props.formModel[k as string];\n }\n }\n }\n },\n { immediate: true },\n );\n }\n }\n });\n\n const { state: columnState, dynamicColumns } = useTableDynamicColumns(columns, {\n checkAll: false,\n needRowIndex: false,\n });\n const datasource = computed(() => {\n return modalRef.datasource.map(item => {\n return {\n value: item[props.field.valueKey ? (props.field.valueKey as string) : 'id'],\n label: item[props.field.labelKey ? (props.field.labelKey as string) : 'name'],\n };\n });\n });\n const modalRef = reactive({\n visible: false,\n selectedRows: new Array<number>(),\n selectedRowsKey: new Array<number>(),\n selectedRowsTotal: new Array<any>(),\n datasource: new Array<any>(),\n });\n\n const rowSelection = {\n type:\n props.field.mode == 'default'\n ? 'radio'\n : props.field.mode == 'multiple'\n ? 'checkbox'\n : 'checkbox',\n columnWidth: '30px',\n selectedRowKeys: modalRef.selectedRowsKey,\n onChange: (selectedRowKeys: any, selectedRows: any) => {\n // modalRef.selectedRowsKey.length = 0;\n const remove_key: Array<number> = modalRef.selectedRowsKey.filter(\n item => selectedRowKeys.indexOf(Number(item)) == -1,\n );\n modalRef.selectedRowsTotal = modalRef.selectedRowsTotal.filter(\n item => remove_key.indexOf(item.id) == -1,\n );\n selectedRows.forEach((item: any) => {\n if (modalRef.selectedRowsKey.indexOf(item.id) == -1) {\n modalRef.selectedRowsTotal.push(item);\n }\n });\n\n modalRef.selectedRowsKey.length = 0;\n selectedRows.forEach((item: any) => {\n modalRef.selectedRowsKey.push(item.id);\n modalRef.datasource.push(item);\n });\n },\n };\n\n const {\n reload,\n setPageInfo,\n context: state,\n } = useFetchData(getData, {\n current: 1,\n pageSize: 20,\n tableSize: 'middle', // 'default' | 'middle' | 'small'\n stripe: true,\n requestParams: {\n ...search_modelRef,\n },\n });\n watch(\n () => state.dataSource,\n () => {\n const total_ids: Array<number> = modalRef.selectedRowsTotal.map(item => item.id);\n state.dataSource.map((item: any) => {\n if (total_ids.indexOf(item.id) > -1) {\n modalRef.selectedRowsKey.push(item.id);\n }\n });\n },\n );\n const init = () => {\n let list: any[] = [];\n if (props.value instanceof Array) {\n if (props.value.length > 0) {\n list = props.value as Array<number>;\n }\n } else {\n if (props.value) {\n list.push(props.value);\n }\n }\n if (list.length > 0) {\n const tmp_ids: any[] = [];\n const tmp_item_ids: any[] = [];\n modalRef.datasource.map(item => tmp_item_ids.push(item.id));\n list.map(item => {\n if (modalRef.selectedRows.indexOf(Number(item)) == -1) {\n modalRef.selectedRows.push(Number(item));\n modalRef.selectedRowsKey.push(Number(item));\n }\n if (tmp_item_ids.indexOf(item) == -1) {\n tmp_ids.push(item);\n }\n });\n if (tmp_ids.length > 0) {\n getData({ current: 1, ...search_modelRef, pageSize: 2000, ids: tmp_ids.join(',') }).then(\n function (res: any) {\n res.data.forEach(item => {\n if (list.indexOf(item.id) >= 0) {\n modalRef.datasource.push(item);\n modalRef.selectedRowsTotal.push(item);\n }\n });\n },\n );\n }\n } else {\n modalRef.selectedRows.length = 0;\n modalRef.selectedRowsKey.length = 0;\n modalRef.selectedRowsTotal.length = 0;\n }\n };\n init();\n\n watch(\n () => props.value,\n () => {\n init();\n },\n );\n\n const handleTableChange = ({ current, pageSize }: any, filters: any, sorter: any) => {\n console.log(sorter);\n setPageInfo({\n current,\n pageSize,\n ...filters,\n ...search_modelRef,\n });\n\n reload();\n };\n\n const { validateInfos: searchValidateInfos } = useForm(search_modelRef, {});\n\n const search = () => {\n setPageInfo({\n current: 1,\n ...search_modelRef,\n });\n reload();\n };\n\n return {\n props,\n modalRef,\n datasource,\n state,\n loading,\n getDateTime,\n getDate,\n getFullDate,\n getTime,\n search,\n handleTableChange,\n rowSelection,\n searchValidateInfos,\n search_modelRef,\n searchConfig,\n searchConfigOptions,\n getData,\n columnState,\n dynamicColumns,\n slotList,\n };\n },\n\n data() {\n return {\n model: this.value,\n };\n },\n});\n</script>\n","<template>\n <a-table\n :bordered=\"true\"\n size=\"small\"\n :loading=\"state.loading\"\n :scroll=\"{ y: 400, x: columnState.tableWidth }\"\n :row-selection=\"rowSelection\"\n :columns=\"dynamicColumns\"\n row-key=\"id\"\n :data-source=\"state.dataSource\"\n :pagination=\"{\n current: state.current,\n pageSize: state.pageSize,\n total: state.total,\n }\"\n @change=\"handleTableChange\"\n >\n <template\n v-for=\"item in slotList\"\n v-slot:[item.slotName]=\"{ index, text }\"\n :key=\"item.slotName\"\n >\n <span v-if=\"item.slotName === 'index'\">\n {{ index + 1 + state.pageSize * (state.current - 1) }}\n </span>\n <span v-if=\"item.type === 'custom'\">\n {{ item['field_' + text] }}\n </span>\n <span v-if=\"item.type === 'datetime'\">\n {{ getDateTime(text) }}\n </span>\n <span v-if=\"item.type === 'date'\">\n {{ getDate(text) }}\n </span>\n <span v-if=\"item.type === 'full_date'\">\n {{ getFullDate(text) }}\n </span>\n <span v-if=\"item.type === 'time'\">\n {{ getTime(text) }}\n </span>\n <a-tag\n color=\"green\"\n v-if=\"text && item.type === 'boolean'\"\n >\n {{ item.name1 }}\n </a-tag>\n <a-tag\n color=\"red\"\n v-if=\"!text && item.type === 'boolean'\"\n >\n {{ item.name2 }}\n </a-tag>\n <template v-if=\"item.type === 'list'\">\n <a-tag\n color=\"#87d068\"\n v-for=\"obj in text\"\n :key=\"obj.id\"\n style=\"margin-bottom: 1px\"\n >\n {{ obj.name }}\n </a-tag>\n </template>\n </template>\n </a-table>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, onMounted, reactive, ref, watch } from 'vue';\n// import { ColumnProps } from 'ant-design-vue/es/table/interface';\nimport { useFetchData } from 'liyu-pc-base/utils/hooks/useFetchData';\nimport { useForm } from 'ant-design-vue/es/form';\n\nimport getFormConfig from 'liyu-pc-base/components/FormRender/RemoteModal/index';\nimport { useTableDynamicColumns } from 'liyu-pc-base/utils/hooks/useTableColumn';\nimport { getDate, getDateTime, getFullDate, getTime } from 'liyu-pc-base/utils/function';\n\n// type Key = ColumnProps['key'];\n\n// interface DataType {\n// id: number;\n// key: Key;\n// name: string;\n// }\n\nexport default defineComponent({\n name: 'RemoteTable',\n props: {\n field: {\n type: Object,\n required: true,\n },\n modalType: {\n type: String,\n required: true,\n default: () => '',\n },\n value: {\n type: Array,\n required: true,\n default: () => [],\n },\n init_model: {\n type: Object,\n default: () => {},\n },\n field_status: {\n type: Object,\n default: () => {},\n },\n watch: {\n type: Array,\n default: () => [],\n },\n formModel: {\n type: Object,\n required: true,\n },\n },\n emits: ['update:value'],\n setup(props, { emit }) {\n const loading = ref(false);\n const { searchConfig, searchConfigOptions, getData, columns, slotList } = getFormConfig(\n props.modalType,\n );\n const search_modelRef = reactive({\n ...searchConfig.model,\n is_active: true,\n ...props.init_model,\n });\n\n for (const field of searchConfig.fields) {\n if (props.field_status && props.field_status.hasOwnProperty(field.name)) {\n if (props.field_status[field.name] == 0) {\n field.disabled = true;\n field.hidden = false;\n } else if (props.field_status[field.name] == 1) {\n field.disabled = false;\n field.hidden = true;\n } else {\n field.disabled = false;\n field.hidden = false;\n }\n }\n }\n\n const old_obj: { [key: string]: any } = {};\n onMounted(() => {\n if (props.watch) {\n for (const k of props.watch) {\n if (props.formModel) {\n old_obj[k as string] = props.formModel[k as string];\n }\n }\n }\n if (props.watch && props.formModel) {\n for (const k of props.watch) {\n search_modelRef[k as string] = props.formModel[k as string];\n watch(\n () => props.formModel[k as string],\n () => {\n if (props.watch && props.formModel) {\n for (const k of props.watch) {\n if (old_obj[k as string] != props.formModel[k as string]) {\n search_modelRef[k as string] = props.formModel[k as string];\n }\n }\n }\n },\n { immediate: true },\n );\n }\n }\n });\n\n const { state: columnState, dynamicColumns } = useTableDynamicColumns(columns, {\n checkAll: false,\n needRowIndex: false,\n });\n const datasource = computed(() => {\n return modalRef.datasource.map(item => {\n return {\n value: item[props.field.valueKey ? (props.field.valueKey as string) : 'id'],\n label: item[props.field.labelKey ? (props.field.labelKey as string) : 'name'],\n };\n });\n });\n const modalRef = reactive({\n visible: false,\n selectedRows: new Array<number>(),\n selectedRowsKey: new Array<number>(),\n selectedRowsTotal: new Array<any>(),\n datasource: new Array<any>(),\n });\n\n const rowSelection = {\n type:\n props.field.mode == 'default'\n ? 'radio'\n : props.field.mode == 'multiple'\n ? 'checkbox'\n : 'checkbox',\n columnWidth: '30px',\n selectedRowKeys: modalRef.selectedRowsKey,\n onChange: (selectedRowKeys: any, selectedRows: any) => {\n // modalRef.selectedRowsKey.length = 0;\n const remove_key: Array<number> = modalRef.selectedRowsKey.filter(\n item => selectedRowKeys.indexOf(Number(item)) == -1,\n );\n modalRef.selectedRowsTotal = modalRef.selectedRowsTotal.filter(\n item => remove_key.indexOf(item.id) == -1,\n );\n selectedRows.forEach((item: any) => {\n if (modalRef.selectedRowsKey.indexOf(item.id) == -1) {\n modalRef.selectedRowsTotal.push(item);\n }\n });\n\n modalRef.selectedRowsKey.length = 0;\n selectedRows.forEach((item: any) => {\n modalRef.selectedRowsKey.push(item.id);\n modalRef.datasource.push(item);\n });\n },\n };\n\n const {\n reload,\n setPageInfo,\n context: state,\n } = useFetchData(getData, {\n current: 1,\n pageSize: 20,\n tableSize: 'middle', // 'default' | 'middle' | 'small'\n stripe: true,\n requestParams: {\n ...search_modelRef,\n },\n });\n watch(\n () => state.dataSource,\n () => {\n const total_ids: Array<number> = modalRef.selectedRowsTotal.map(item => item.id);\n state.dataSource.map((item: any) => {\n if (total_ids.indexOf(item.id) > -1) {\n modalRef.selectedRowsKey.push(item.id);\n }\n });\n },\n );\n const init = () => {\n let list: any[] = [];\n if (props.value instanceof Array) {\n if (props.value.length > 0) {\n list = props.value as Array<number>;\n }\n } else {\n if (props.value) {\n list.push(props.value);\n }\n }\n if (list.length > 0) {\n const tmp_ids: any[] = [];\n const tmp_item_ids: any[] = [];\n modalRef.datasource.map(item => tmp_item_ids.push(item.id));\n list.map(item => {\n if (modalRef.selectedRows.indexOf(Number(item)) == -1) {\n modalRef.selectedRows.push(Number(item));\n modalRef.selectedRowsKey.push(Number(item));\n }\n if (tmp_item_ids.indexOf(item) == -1) {\n tmp_ids.push(item);\n }\n });\n if (tmp_ids.length > 0) {\n getData({ current: 1, ...search_modelRef, pageSize: 2000, ids: tmp_ids.join(',') }).then(\n function (res: any) {\n res.data.forEach(item => {\n if (list.indexOf(item.id) >= 0) {\n modalRef.datasource.push(item);\n modalRef.selectedRowsTotal.push(item);\n }\n });\n },\n );\n }\n } else {\n modalRef.selectedRows.length = 0;\n modalRef.selectedRowsKey.length = 0;\n modalRef.selectedRowsTotal.length = 0;\n }\n };\n init();\n\n watch(\n () => props.value,\n () => {\n init();\n },\n );\n\n const handleTableChange = ({ current, pageSize }: any, filters: any, sorter: any) => {\n console.log(sorter);\n setPageInfo({\n current,\n pageSize,\n ...filters,\n ...search_modelRef,\n });\n\n reload();\n };\n\n const { validateInfos: searchValidateInfos } = useForm(search_modelRef, {});\n\n const search = () => {\n setPageInfo({\n current: 1,\n ...search_modelRef,\n });\n reload();\n };\n\n return {\n props,\n modalRef,\n datasource,\n state,\n loading,\n getDateTime,\n getDate,\n getFullDate,\n getTime,\n search,\n handleTableChange,\n rowSelection,\n searchValidateInfos,\n search_modelRef,\n searchConfig,\n searchConfigOptions,\n getData,\n columnState,\n dynamicColumns,\n slotList,\n };\n },\n\n data() {\n return {\n model: this.value,\n };\n },\n});\n</script>\n"],"mappings":";;;;;;;;;AAGA,IAAM,IAAyC,CAAC,GAC1C,UAAa;CACjB,IAAI,OAAO,KAAK,CAAc,CAAC,CAAC,SAAS,GACvC;CAEF,IAAM,IAAqB,uBAAA,OAAA,CAAA,CAAA,GAMrB,IAAmB,EAAW,kBAAkB;CAEtD,AADA,OAAO,OAAO,GAAe,CAAgB,GAC7C,OAAO,KAAK,CAAa,CAAC,CAAC,SAAQ,MAAkB;EACnD,IAAM,IAAiB,EAAe,MAAM,GAAG,GACzC,IAAY,EAAe,EAAe,SAAS,EAAE,CAAC,QAAQ,OAAO,EAAE;EAC7E,EAAe,KAAa,EAAc,EAAe,CAAC;CAC5D,CAAC;AACH,GACA,KAAgB,OACd,EAAK,GACD,EAAe,MAAc,QAC/B,QAAQ,MAAM,0BAA0B,CAAS,GAC1C;CACL,SAAS,KAAA;CACT,cAAc,KAAA;AAChB,KAEK,EACL,GAAG,EAAe,EAAU,CAAC,oBAAoB,GAAW,EAC9D,ICcF,IAAe,EAAgB;CAC7B,MAAM;CACN,OAAO;EACL,OAAO;GACL,MAAM;GACN,UAAU;EACZ;EACA,OAAO;GACL,MAAM;IAAC;IAAO;IAAQ;GAAM;GAC5B,UAAU;GACV,eAAe;EACjB;EACA,eAAe;GACb,MAAM;GACN,UAAU;GACV,eAAe,CAAC;EAClB;EACA,OAAO;GACL,MAAM,CAAC,OAAO,MAAM;GACpB,UAAU;EACZ;EACA,WAAW;GACT,MAAM;GACN,UAAU;EACZ;CACF;CACA,OAAO,CAAC,gBAAgB,cAAc;CACtC,MAAM,GAAO,EAAE,WAAQ;EACrB,IAAM,IAAgB,EAAS;GAC7B,cAAc,CAAC;GACf,YAAY,CAAC;EACf,CAAC,GACK,EAAE,iBAAc,eAAY,EAAc,EAAM,MAAM,SAAS,GAC/D,IAAkB,EAAS,EAC/B,GAAG,EAAa,MAClB,CAAC;EAED,AAAI,EAAM,SACR,EAAS,aAAa,KAAK,EAAM,KAAK;EAGxC,IAAM,KAA0B,MAA2B;GACzD,IAAM,IAA2B,CAAC;GAkBlC,OAjBA,EAAW,SAAS,MAAc;IAahC,AAXE,EAAS,wBAAwB,SACjC,EAAS,aAAa,SAAS,EAAK,EAAM,MAAM,SAAS,KAEzD,EAAU,KAAK,EAAK,EAAM,MAAM,SAAS,GAGzC,EAAE,EAAS,wBAAwB,UACnC,EAAS,gBAAgB,EAAK,EAAM,MAAM,aAE1C,EAAU,KAAK,EAAK,EAAM,MAAM,SAAS,GAEvC,EAAK,YAAY,EAAK,SAAS,SAAS,KAC1C,EAAuB,EAAK,QAAQ,CAAC,CAAC,SAAQ,MAAO,EAAU,KAAK,CAAG,CAAC;GAE5E,CAAC,GACM;EACT,GAEM,UAAqB;GAEzB,AADA,EAAK,gBAAgB,EAAS,YAAY,GAC1C,EAAK,gBAAgB,EAAuB,EAAS,UAAU,CAAC;EAClE;EAEA,QACQ,EAAM,UAAU,EAAM,MAAM,aAC5B;GAeJ,AAdI,EAAM,MAAM,SAAS,YACnB,EAAM,UAAU,EAAM,MAAM,QAC9B,EAAS,eAAe,CAAC,EAAM,UAAU,EAAM,MAAM,KAAK,IAE1D,EAAS,eAAe,CAAC,IAIvB,EAAM,UAAU,EAAM,MAAM,SAAS,EAAM,UAAU,EAAM,MAAM,KAAK,CAAC,SAAS,MAClF,EAAS,eAAe,EAAM,UAAU,EAAM,MAAM,KAAK,CAAC,KAAK,MACtD,CACR,IAGL,EAAK,gBAAgB,EAAuB,EAAS,UAAU,CAAC;EAClE,CACF;EAEA,IAAM,KAAY,MAAsB;GAKtC,AAJI,KACF,EAAQ,QAAQ;IAAE,SAAS;IAAU,KAAK,EAAM,MAAM;GAAU,CAAC,GAGnE,EAAQ;IAAE,GAAG;IAAiB,GAAG,EAAM;GAAc,GAAG,CAAO,CAAA,CAC5D,KAAK,SAAU,GAAuB;IAErC,IADA,EAAS,aAAa,EAAI,MACtB,EAAS,WAAW,SAAS,KAAK,EAAS,aAAa,SAAS,KAEjE,OAAO,EAAS,WAAW,EAAE,CAAC,EAAM,MAAM,aAAa,YACvD,OAAO,EAAS,aAAa,MAAM,UACnC;KACA,IAAM,IAAsB,CAAC;KAM7B,AALA,EAAS,aAAa,KAAK,MAAiB;MAC1C,EAAK,MAAM,GAAG,CAAC,CAAC,KAAI,MAAO;OACzB,EAAK,KAAK,OAAO,CAAG,CAAC;MACvB,CAAC;KACH,CAAC,GACG,EAAM,MAAM,YAGV,EAAK,SAAS,MAChB,EAAK,SAAS,IAHhB,EAAS,eAAe;IAO5B;IAGF,AADA,EAAK,gBAAgB,EAAuB,EAAS,UAAU,CAAC,GAC5D,KACF,EAAQ,QAAQ;KAAE,SAAS;KAAU,KAAK,EAAM,MAAM;KAAW,UAAU;IAAE,CAAC;GAElF,CAAC,CAAA,CACA,YAAY;IAEX,AADA,EAAQ,QAAQ,GAChB,EAAQ,MAAM,UAAU,EAAE;GAC5B,CAAC;EACL;EAGA,OAFA,EAAS,GAEF;GACL;GACA;GACA;GACA;GACA;EACF;CACF;CAEA,OAAO;EACL,OAAO,EACL,OAAO,KAAK,MACd;CACF;AACF,CAAC;;;;;aC9LC,EAqCW,GAAA;EApCT,OAAM;EACN,OAAA,EAAA,aAAA,QAAA;;EAHJ,SAAA,QAsBuB,CAjBnB,EAiBmB,GAAA,MAAA;GAtBvB,SAAA,QAqBQ,CAfF,EAeE,GAAA;IAdQ,OAAO,EAAA,SAAS;IAPhC,kBAAA,AAAA,EAAA,QAAA,MAAA,EAOuB,SAAS,eAAY;IACpC,MAAK;IACL,OAAA,EAAA,aAAA,QAAA;IACC,aAAa,EAAA,MAAM;IACnB,0BAA0B;IAC1B,UAAU,EAAA,MAAM;IAChB,iBAAe,EAAA,MAAM;IACrB,eAAa,EAAA,MAAM;IACnB,aAAW,EAAA,SAAS;IACpB,kBAAgB,EAAA,MAAM;IACtB,yBAAuB,EAAA,MAAM;IAC7B,mBAAiB,EAAA,MAAM;IACvB,eAAe,EAAA,WAAA,QAAA;IACf,UAAQ,EAAA;;;;;;;;;;;;;GApBjB,GAAA;MAuBI,EAciB,GAAA;GAbf,OAAM;GACN,OAAA,EAAA,YAAA,mBAAA;;GAzBN,SAAA,QAoCiB,CATX,EASW,GAAA;IART,MAAK;IACL,OAAA,EAAA,OAAA,OAAA;IACC,SAAK,AAAA,EAAA,QAAA,MAAE,EAAA,SAAQ,EAAA;IAChB,MAAK;;IAEM,MAAI,QACM,CAAnB,EAAmB,CAAA,CAAA,CAAA;IAlC7B,GAAA;;GAAA,GAAA;;EAAA,GAAA;;;6CCoFA,IAAe,EAAgB;CAC7B,MAAM;CACN,OAAO;EACL,OAAO;GACL,MAAM;GACN,UAAU;EACZ;EACA,WAAW;GACT,MAAM;GACN,UAAU;GACV,eAAe;EACjB;EACA,OAAO;GACL,MAAM;GACN,UAAU;GACV,eAAe,CAAC;EAClB;EACA,YAAY;GACV,MAAM;GACN,eAAe,CAAC;EAClB;EACA,cAAc;GACZ,MAAM;GACN,eAAe,CAAC;EAClB;EACA,OAAO;GACL,MAAM;GACN,eAAe,CAAC;EAClB;EACA,WAAW;GACT,MAAM;GACN,UAAU;EACZ;CACF;CACA,OAAO,CAAC,cAAc;CACtB,MAAM,GAAO,EAAE,WAAQ;EACrB,IAAM,IAAU,EAAI,EAAK,GACnB,EAAE,iBAAc,wBAAqB,YAAS,YAAS,gBAAa,EACxE,EAAM,SACR,GACM,IAAkB,EAAS;GAC/B,GAAG,EAAa;GAChB,WAAW;GACX,GAAG,EAAM;EACX,CAAC;EAED,KAAK,IAAM,KAAS,EAAa,QAC/B,AAAI,EAAM,gBAAgB,EAAM,aAAa,eAAe,EAAM,IAAI,MAChE,EAAM,aAAa,EAAM,SAAS,KACpC,EAAM,WAAW,IACjB,EAAM,SAAS,MACN,EAAM,aAAa,EAAM,SAAS,KAC3C,EAAM,WAAW,IACjB,EAAM,SAAS,OAEf,EAAM,WAAW,IACjB,EAAM,SAAS;EAKrB,IAAM,IAAkC,CAAC;EACzC,QAAgB;GACd,IAAI,EAAM,YACH,IAAM,KAAK,EAAM,OACpB,AAAI,EAAM,cACR,EAAQ,KAAe,EAAM,UAAU;GAI7C,IAAI,EAAM,SAAS,EAAM,WACvB,KAAK,IAAM,KAAK,EAAM,OAEpB,AADA,EAAgB,KAAe,EAAM,UAAU,IAC/C,QACQ,EAAM,UAAU,UAChB;IACJ,IAAI,EAAM,SAAS,EAAM,gBAClB,IAAM,KAAK,EAAM,OACpB,AAAI,EAAQ,MAAgB,EAAM,UAAU,OAC1C,EAAgB,KAAe,EAAM,UAAU;GAIvD,GACA,EAAE,WAAW,GAAK,CACpB;EAGN,CAAC;EAED,IAAM,EAAE,OAAO,GAAa,sBAAmB,EAAuB,GAAS;GAC7E,UAAU;GACV,cAAc;EAChB,CAAC,GACK,IAAa,QACV,EAAS,WAAW,KAAI,OACtB;GACL,OAAO,EAAK,EAAM,MAAM,WAAY,EAAM,MAAM,WAAsB;GACtE,OAAO,EAAK,EAAM,MAAM,WAAY,EAAM,MAAM,WAAsB;EACxE,EACD,CACF,GACK,IAAW,EAAS;GACxB,SAAS;GACT,cAAc,CAAkB;GAChC,iBAAiB,CAAkB;GACnC,mBAAmB,CAAe;GAClC,YAAY,CAAe;EAC7B,CAAC,GAEK,IAAe;GACnB,MACE,EAAM,MAAM,QAAQ,YAChB,WACA,EAAM,MAAM,MACZ;GAEN,aAAa;GACb,iBAAiB,EAAS;GAC1B,WAAW,GAAsB,MAAsB;IAErD,IAAM,IAA4B,EAAS,gBAAgB,QACzD,MAAQ,EAAgB,QAAQ,OAAO,CAAI,CAAC,KAAK,EACnD;IAWA,AAVA,EAAS,oBAAoB,EAAS,kBAAkB,QACtD,MAAQ,EAAW,QAAQ,EAAK,EAAE,KAAK,EACzC,GACA,EAAa,SAAS,MAAc;KAClC,AAAI,EAAS,gBAAgB,QAAQ,EAAK,EAAE,KAAK,MAC/C,EAAS,kBAAkB,KAAK,CAAI;IAExC,CAAC,GAED,EAAS,gBAAgB,SAAS,GAClC,EAAa,SAAS,MAAc;KAElC,AADA,EAAS,gBAAgB,KAAK,EAAK,EAAE,GACrC,EAAS,WAAW,KAAK,CAAI;IAC/B,CAAC;GACH;EACF,GAEM,EACJ,WACA,gBACA,SAAS,MACP,EAAa,GAAS;GACxB,SAAS;GACT,UAAU;GACV,WAAW;GACX,QAAQ;GACR,eAAe,EACb,GAAG,EACL;EACF,CAAC;EACD,QACQ,EAAM,kBACN;GACJ,IAAM,IAA2B,EAAS,kBAAkB,KAAI,MAAQ,EAAK,EAAE;GAC/E,EAAM,WAAW,KAAK,MAAc;IAClC,AAAI,EAAU,QAAQ,EAAK,EAAE,IAAI,MAC/B,EAAS,gBAAgB,KAAK,EAAK,EAAE;GAEzC,CAAC;EACH,CACF;EACA,IAAM,UAAa;GACjB,IAAI,IAAc,CAAC;GAUnB,IATI,EAAM,iBAAiB,QACrB,EAAM,MAAM,SAAS,MACvB,IAAO,EAAM,SAGX,EAAM,SACR,EAAK,KAAK,EAAM,KAAK,GAGrB,EAAK,SAAS,GAAG;IACnB,IAAM,IAAiB,CAAC,GAClB,IAAsB,CAAC;IAW7B,AAVA,EAAS,WAAW,KAAI,MAAQ,EAAa,KAAK,EAAK,EAAE,CAAC,GAC1D,EAAK,KAAI,MAAQ;KAKf,AAJI,EAAS,aAAa,QAAQ,OAAO,CAAI,CAAC,KAAK,OACjD,EAAS,aAAa,KAAK,OAAO,CAAI,CAAC,GACvC,EAAS,gBAAgB,KAAK,OAAO,CAAI,CAAC,IAExC,EAAa,QAAQ,CAAI,KAAK,MAChC,EAAQ,KAAK,CAAI;IAErB,CAAC,GACG,EAAQ,SAAS,KACnB,EAAQ;KAAE,SAAS;KAAG,GAAG;KAAiB,UAAU;KAAM,KAAK,EAAQ,KAAK,GAAG;IAAE,CAAC,CAAC,CAAC,KAClF,SAAU,GAAU;KAClB,EAAI,KAAK,SAAQ,MAAQ;MACvB,AAAI,EAAK,QAAQ,EAAK,EAAE,KAAK,MAC3B,EAAS,WAAW,KAAK,CAAI,GAC7B,EAAS,kBAAkB,KAAK,CAAI;KAExC,CAAC;IACH,CACF;GAEJ,OAGE,AAFA,EAAS,aAAa,SAAS,GAC/B,EAAS,gBAAgB,SAAS,GAClC,EAAS,kBAAkB,SAAS;EAExC;EAGA,AAFA,EAAK,GAEL,QACQ,EAAM,aACN;GACJ,EAAK;EACP,CACF;EAEA,IAAM,KAAqB,EAAE,YAAS,eAAiB,GAAc,MAAgB;GASnF,AARA,QAAQ,IAAI,CAAM,GAClB,EAAY;IACV;IACA;IACA,GAAG;IACH,GAAG;GACL,CAAC,GAED,EAAO;EACT,GAEM,EAAE,eAAe,MAAwB,EAAQ,GAAiB,CAAC,CAAC;EAU1E,OAAO;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,cAlBmB;IAKnB,AAJA,EAAY;KACV,SAAS;KACT,GAAG;IACL,CAAC,GACD,EAAO;GACT;GAaE;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF;CACF;CAEA,OAAO;EACL,OAAO,EACL,OAAO,KAAK,MACd;CACF;AACF,CAAC,SC/VD,KAAA,EAAA,SAAA,KAAA,EAAA,SAAA,KAAA,EAAA,SAAA,KAAA,EAAA,SAAA,KAAA,EAAA,SAAA,KAAA,EAAA;;;aACE,EA8DU,GAAA;EA7DP,UAAU;EACX,MAAK;EACJ,SAAS,EAAA,MAAM;EACf,QAAM;GAAA,GAAA;GAAA,GAAe,EAAA,YAAY;EAAU;EAC3C,iBAAe,EAAA;EACf,SAAS,EAAA;EACV,WAAQ;EACP,eAAa,EAAA,MAAM;EACnB,YAAU;YAAmB,EAAA,MAAM;aAAyB,EAAA,MAAM;UAAuB,EAAA,MAAM;;EAK/F,UAAQ,EAAA;IAfb,EAAA,EAAA,GAAA,EAAA,GAAA,CAAA,EAkBqB,EAAA,WAAR;EAlBb,MAmBa,EAAK;EAnBlB,IAAA,GAwBa,EALmB,UAAO,cAAI;GAGzB,EAAK,aAAQ,WAAA,EAAA,GAAzB,EAEO,QAxBb,GAAA,EAuBW,IAAK,IAAO,EAAA,MAAM,YAAY,EAAA,MAAM,UAAO,EAAA,GAAA,CAAA,KAvBtD,EAAA,IAAA,EAAA;GAyBkB,EAAK,SAAI,YAAA,EAAA,GAArB,EAEO,QA3Bb,GAAA,EA0BW,EAAI,WAAY,EAAI,GAAA,CAAA,KA1B/B,EAAA,IAAA,EAAA;GA4BkB,EAAK,SAAI,cAAA,EAAA,GAArB,EAEO,QA9Bb,GAAA,EA6BW,EAAA,YAAY,CAAI,CAAA,GAAA,CAAA,KA7B3B,EAAA,IAAA,EAAA;GA+BkB,EAAK,SAAI,UAAA,EAAA,GAArB,EAEO,QAjCb,GAAA,EAgCW,EAAA,QAAQ,CAAI,CAAA,GAAA,CAAA,KAhCvB,EAAA,IAAA,EAAA;GAkCkB,EAAK,SAAI,eAAA,EAAA,GAArB,EAEO,QApCb,GAAA,EAmCW,EAAA,YAAY,CAAI,CAAA,GAAA,CAAA,KAnC3B,EAAA,IAAA,EAAA;GAqCkB,EAAK,SAAI,UAAA,EAAA,GAArB,EAEO,QAvCb,GAAA,EAsCW,EAAA,QAAQ,CAAI,CAAA,GAAA,CAAA,KAtCvB,EAAA,IAAA,EAAA;GA0Cc,KAAQ,EAAK,SAAI,aAAA,EAAA,GAFzB,EAKQ,GAAA;IA7Cd,KAAA;IAyCQ,OAAM;;IAzCd,SAAA,QA4CwB,CA5CxB,EAAA,EA4CW,EAAK,KAAK,GAAA,CAAA,CAAA,CAAA;IA5CrB,GAAA;eAAA,EAAA,IAAA,EAAA;IAgDe,KAAQ,EAAK,SAAI,aAAA,EAAA,GAF1B,EAKQ,GAAA;IAnDd,KAAA;IA+CQ,OAAM;;IA/Cd,SAAA,QAkDwB,CAlDxB,EAAA,EAkDW,EAAK,KAAK,GAAA,CAAA,CAAA,CAAA;IAlDrB,GAAA;eAAA,EAAA,IAAA,EAAA;GAoDsB,EAAK,SAAI,UAAA,EAAA,EAAA,GACvB,EAOQ,GAAA,EA5DhB,KAAA,EAAA,GAAA,EAuDwB,IAAP,YAFT,EAOQ,GAAA;IANN,OAAM;IAEL,KAAK,EAAI;IACV,OAAA,EAAA,iBAAA,MAAA;;IAzDV,SAAA,QA2DwB,CA3DxB,EAAA,EA2Da,EAAI,IAAI,GAAA,CAAA,CAAA,CAAA;IA3DrB,GAAA;uBAAA,EAAA,IAAA,EAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { E as e, N as t, g as n } from "./init-plugin-CvgtEpwY.js";
|
|
2
2
|
import { t as r } from "./_plugin-vue_export-helper-B3ysoDQm.js";
|
|
3
3
|
import { getApiData as i } from "./api/api-model.js";
|
|
4
|
-
import { P as a, n as o } from "./function-
|
|
4
|
+
import { P as a, n as o } from "./function-BhYSb8ls.js";
|
|
5
5
|
import { Fragment as s, createBlock as c, createElementBlock as l, createTextVNode as u, defineComponent as d, onMounted as f, onUnmounted as p, openBlock as m, reactive as h, ref as g, renderList as _, resolveComponent as v, toDisplayString as y, watch as b, withCtx as x } from "vue";
|
|
6
6
|
import { debounce as S, isArray as C } from "lodash-es";
|
|
7
7
|
import w from "emmet";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemoteTreeSelectPro-D2RSKzFr.js","names":[],"sources":["../src/utils/load-async-asset.ts","../src/components/code/CodeEditor.vue","../src/components/code/CodeEditor.vue","../src/components/FormRender/RemoteTreeSelectPro/RemoteTreeSelectPro.vue","../src/components/FormRender/RemoteTreeSelectPro/RemoteTreeSelectPro.vue"],"sourcesContent":["export function loadScript(src: string): Promise<Event> {\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = src;\n script.onload = resolve;\n script.onerror = reject;\n document.head.appendChild(script);\n });\n}\n\nexport function loadStyle(href: string): Promise<Event> {\n return new Promise((resolve, reject) => {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = href;\n link.onload = resolve;\n link.onerror = reject;\n document.head.appendChild(link);\n });\n}\n","<template>\n <textarea\n style=\"display: none\"\n :id=\"code_edit_id\"\n ></textarea>\n</template>\n\n<script lang=\"ts\">\nimport { onMounted, onUnmounted, PropType, watch } from 'vue';\nimport { loadScript, loadStyle } from 'liyu-pc-base/utils/load-async-asset';\nimport { useEnv } from 'liyu-pc-base/init-plugin';\nimport expand from 'emmet';\n\ntype modeType = 'javascript' | 'htmlmixed' | 'css' | 'python' | 'jinja2' | 'sql' | 'xml';\n\n// Dynamically set asset URLs based on the environment\nconst get_CODEMIRROR_BASE_URL = () => {\n const env = useEnv();\n return env.VUE_APP_PUBLIC_PATH + 'codemirror';\n};\n\nconst loadedModes = new Set<string>();\n\nasync function loadMode(mode: modeType) {\n if (loadedModes.has(mode)) {\n return;\n }\n // The files copied from node_modules are not minified, so we use the standard names.\n let modeFile = '';\n switch (mode) {\n case 'javascript':\n case 'css':\n case 'htmlmixed':\n case 'python':\n case 'jinja2':\n case 'sql':\n case 'xml':\n modeFile = `${mode}/${mode}.js`;\n break;\n }\n if (modeFile) {\n await loadScript(`${get_CODEMIRROR_BASE_URL()}/mode/${modeFile}`);\n loadedModes.add(mode);\n }\n}\n\nfunction getWord(line: string, ch: number): [string, number] {\n const getNearTagChar = (str: string): string => {\n for (let i = str.length - 1; i > 0; i--) {\n if (str[i] === '>' || str[i] === '<') return str[i];\n }\n return str[0] || '<';\n };\n // 光标位于行末或单词末尾\n if (ch === line.length || (line.length > ch + 1 && (/S/.test(line[ch]) || line[ch] === '<'))) {\n let i;\n for (i = ch - 1; i >= 0; i--) {\n if (/S/.test(line[i]) || (line[i] === '>' && getNearTagChar(line.slice(0, i)) === '<')) {\n break;\n }\n }\n return [line.slice(i + 1, ch), i + 1];\n }\n return ['', 0];\n}\n\nfunction debounce(fn: any, delay = 1000) {\n let timer: any;\n return function (this: any) {\n const context = this;\n const args = arguments;\n clearTimeout(timer);\n timer = setTimeout(function () {\n fn.apply(context, args);\n }, delay);\n };\n}\n\nexport default {\n name: 'CodeEditor',\n props: {\n editorValue: {\n type: String,\n default: '',\n },\n mode: {\n type: String as PropType<modeType>,\n required: true,\n default: 'javascript',\n },\n lineWrapping: {\n type: Boolean,\n default: true,\n },\n options: {\n type: Object,\n default: () => {\n return {\n lineNumbers: true,\n line: true,\n indentUnit: 2,\n lineWidth: 4,\n lineColor: '#b99944',\n immediate: true,\n };\n },\n },\n },\n setup(props: any, context: any) {\n let cmInstance: any;\n const code_edit_id: string = 'code_edit_id' + new Date().getTime();\n\n const initCodeMirror = async () => {\n const editor = document.getElementById(code_edit_id);\n let word: string, wordIndex: number;\n\n await loadMode(props.mode);\n\n const extraKeys = {\n 'Ctrl-Space': 'autocomplete',\n };\n\n cmInstance = window.CodeMirror.fromTextArea(editor as HTMLTextAreaElement, {\n ...props.options,\n extraKeys,\n hintOptions: {\n // tables: {\n // users: ['name', 'score', 'birthDate'],\n // countries: ['name', 'population', 'size'],\n // },\n },\n lineWrapping: props.lineWrapping,\n });\n\n cmInstance.setOption('mode', props.mode);\n cmInstance.setOption('theme', 'material-darker');\n cmInstance.setValue(props.editorValue || '');\n\n cmInstance.on('change', (coder: any) => {\n if (props.mode === 'htmlmixed' || props.mode === 'css' || props.mode === 'xml') {\n // HTML模式下使用Emmet\n const { line: lineIndex, ch } = coder.getCursor();\n const line = coder.getLine(lineIndex);\n const wordResult = getWord(line, ch);\n word = wordResult[0];\n wordIndex = wordResult[1];\n }\n context.emit('update:editorValue', coder.getValue());\n });\n\n cmInstance.on(\n 'change',\n debounce(() => {\n context.emit('debounce-update');\n }, 5000) as (instance: any) => void,\n );\n\n // Autocomplete on input\n cmInstance.on('inputRead', (cm: any, change: any) => {\n if (cm.state.completionActive || change.origin === '+delete' || change.origin === 'paste') {\n return;\n }\n // Show hint for normal typing\n const NON_SPECIAL_CHARS = /^[a-zA-Z0-9_.]*$/;\n if (NON_SPECIAL_CHARS.test(change.text[0])) {\n cm.showHint({ completeSingle: false });\n }\n });\n\n if (props.mode === 'htmlmixed' || props.mode === 'css' || props.mode === 'xml') {\n const currentExtraKeys = cmInstance.getOption('extraKeys');\n cmInstance.setOption('extraKeys', {\n ...currentExtraKeys,\n Tab: function (coder: any) {\n const indent = coder.getOption('indentUnit') || 2;\n const spaces = Array(indent + 1).join(' ');\n if (!word) {\n coder.replaceSelection(spaces);\n } else {\n try {\n const typeMap: any = {\n htmlmixed: 'markup',\n css: 'stylesheet',\n xml: 'markup',\n };\n const emmet = expand(word, { type: typeMap[props.mode] });\n const { line, ch } = coder.getCursor();\n coder.setSelection({ line, ch }, { line, ch: wordIndex });\n const formatterEmmet = emmet\n .split('\\n')\n .map((line: string, index: number) => {\n if (index > 0) {\n line = line.replace(/\\t/g, spaces);\n line = Array(wordIndex + 1).join(' ') + line;\n }\n return line;\n })\n .join('\\n');\n coder.replaceSelection(formatterEmmet);\n } catch (e) {\n console.error(e);\n coder.replaceSelection(spaces);\n }\n }\n },\n });\n }\n };\n\n onMounted(async () => {\n try {\n if (!(window as any).CodeMirror) {\n // First time loading: fetch all assets in the correct order.\n await Promise.all([\n loadStyle(`${get_CODEMIRROR_BASE_URL()}/lib/codemirror.css`),\n loadStyle(`${get_CODEMIRROR_BASE_URL()}/theme/material-darker.css`),\n loadStyle(`${get_CODEMIRROR_BASE_URL()}/addon/hint/show-hint.css`),\n ]);\n await loadScript(`${get_CODEMIRROR_BASE_URL()}/lib/codemirror.js`);\n await Promise.all([\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/show-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/anyword-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/xml-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/sql-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/javascript-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/css-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/html-hint.js`),\n ]);\n }\n\n await initCodeMirror();\n\n await new Promise((resolve, reject) => {\n setTimeout(() => {\n resolve(null);\n }, 500);\n });\n if (cmInstance) {\n cmInstance.refresh();\n }\n } catch (error) {\n console.error('Failed to load CodeMirror assets:', error);\n }\n });\n\n onUnmounted(() => {\n if (cmInstance) {\n cmInstance.toTextArea();\n cmInstance = null;\n }\n });\n\n watch(\n () => props.mode,\n async val => {\n if (cmInstance) {\n await loadMode(val);\n cmInstance.setOption('mode', val);\n }\n },\n );\n\n watch(\n () => props.editorValue,\n async newValue => {\n if (cmInstance && newValue !== cmInstance.getValue()) {\n cmInstance.setValue(newValue || '');\n }\n },\n );\n\n return {\n code_edit_id,\n handleCodeMirrorRefresh() {\n if (cmInstance) {\n cmInstance.refresh();\n }\n },\n };\n },\n};\n</script>\n<style>\n.CodeMirror {\n height: 300px !important;\n font-size: 15px !important;\n font-family: Monaco, MonoSpace;\n line-height: 1.4 !important;\n}\n\n.CodeMirror-lines {\n padding: 4px 0;\n min-height: 1px; /* Ensure line measure div is not collapsed */\n}\n\n.CodeMirror-hints {\n position: absolute;\n z-index: 9999 !important;\n overflow: hidden;\n list-style: none;\n margin: 0 0 0 5px; /* Add a 5px offset to the left */\n padding: 2px;\n box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);\n border-radius: 3px;\n border: 1px solid #555; /* A softer border for the theme */\n background: #2d2d2d;\n font-size: 100%;\n font-family: monospace;\n max-height: 20em;\n overflow-y: auto;\n}\n\n.CodeMirror-hint {\n margin: 0;\n padding: 0 4px;\n border-radius: 2px;\n white-space: pre;\n color: white;\n cursor: pointer;\n}\n\nli.CodeMirror-hint-active {\n background: #08f;\n color: white;\n}\n</style>\n","<template>\n <textarea\n style=\"display: none\"\n :id=\"code_edit_id\"\n ></textarea>\n</template>\n\n<script lang=\"ts\">\nimport { onMounted, onUnmounted, PropType, watch } from 'vue';\nimport { loadScript, loadStyle } from 'liyu-pc-base/utils/load-async-asset';\nimport { useEnv } from 'liyu-pc-base/init-plugin';\nimport expand from 'emmet';\n\ntype modeType = 'javascript' | 'htmlmixed' | 'css' | 'python' | 'jinja2' | 'sql' | 'xml';\n\n// Dynamically set asset URLs based on the environment\nconst get_CODEMIRROR_BASE_URL = () => {\n const env = useEnv();\n return env.VUE_APP_PUBLIC_PATH + 'codemirror';\n};\n\nconst loadedModes = new Set<string>();\n\nasync function loadMode(mode: modeType) {\n if (loadedModes.has(mode)) {\n return;\n }\n // The files copied from node_modules are not minified, so we use the standard names.\n let modeFile = '';\n switch (mode) {\n case 'javascript':\n case 'css':\n case 'htmlmixed':\n case 'python':\n case 'jinja2':\n case 'sql':\n case 'xml':\n modeFile = `${mode}/${mode}.js`;\n break;\n }\n if (modeFile) {\n await loadScript(`${get_CODEMIRROR_BASE_URL()}/mode/${modeFile}`);\n loadedModes.add(mode);\n }\n}\n\nfunction getWord(line: string, ch: number): [string, number] {\n const getNearTagChar = (str: string): string => {\n for (let i = str.length - 1; i > 0; i--) {\n if (str[i] === '>' || str[i] === '<') return str[i];\n }\n return str[0] || '<';\n };\n // 光标位于行末或单词末尾\n if (ch === line.length || (line.length > ch + 1 && (/S/.test(line[ch]) || line[ch] === '<'))) {\n let i;\n for (i = ch - 1; i >= 0; i--) {\n if (/S/.test(line[i]) || (line[i] === '>' && getNearTagChar(line.slice(0, i)) === '<')) {\n break;\n }\n }\n return [line.slice(i + 1, ch), i + 1];\n }\n return ['', 0];\n}\n\nfunction debounce(fn: any, delay = 1000) {\n let timer: any;\n return function (this: any) {\n const context = this;\n const args = arguments;\n clearTimeout(timer);\n timer = setTimeout(function () {\n fn.apply(context, args);\n }, delay);\n };\n}\n\nexport default {\n name: 'CodeEditor',\n props: {\n editorValue: {\n type: String,\n default: '',\n },\n mode: {\n type: String as PropType<modeType>,\n required: true,\n default: 'javascript',\n },\n lineWrapping: {\n type: Boolean,\n default: true,\n },\n options: {\n type: Object,\n default: () => {\n return {\n lineNumbers: true,\n line: true,\n indentUnit: 2,\n lineWidth: 4,\n lineColor: '#b99944',\n immediate: true,\n };\n },\n },\n },\n setup(props: any, context: any) {\n let cmInstance: any;\n const code_edit_id: string = 'code_edit_id' + new Date().getTime();\n\n const initCodeMirror = async () => {\n const editor = document.getElementById(code_edit_id);\n let word: string, wordIndex: number;\n\n await loadMode(props.mode);\n\n const extraKeys = {\n 'Ctrl-Space': 'autocomplete',\n };\n\n cmInstance = window.CodeMirror.fromTextArea(editor as HTMLTextAreaElement, {\n ...props.options,\n extraKeys,\n hintOptions: {\n // tables: {\n // users: ['name', 'score', 'birthDate'],\n // countries: ['name', 'population', 'size'],\n // },\n },\n lineWrapping: props.lineWrapping,\n });\n\n cmInstance.setOption('mode', props.mode);\n cmInstance.setOption('theme', 'material-darker');\n cmInstance.setValue(props.editorValue || '');\n\n cmInstance.on('change', (coder: any) => {\n if (props.mode === 'htmlmixed' || props.mode === 'css' || props.mode === 'xml') {\n // HTML模式下使用Emmet\n const { line: lineIndex, ch } = coder.getCursor();\n const line = coder.getLine(lineIndex);\n const wordResult = getWord(line, ch);\n word = wordResult[0];\n wordIndex = wordResult[1];\n }\n context.emit('update:editorValue', coder.getValue());\n });\n\n cmInstance.on(\n 'change',\n debounce(() => {\n context.emit('debounce-update');\n }, 5000) as (instance: any) => void,\n );\n\n // Autocomplete on input\n cmInstance.on('inputRead', (cm: any, change: any) => {\n if (cm.state.completionActive || change.origin === '+delete' || change.origin === 'paste') {\n return;\n }\n // Show hint for normal typing\n const NON_SPECIAL_CHARS = /^[a-zA-Z0-9_.]*$/;\n if (NON_SPECIAL_CHARS.test(change.text[0])) {\n cm.showHint({ completeSingle: false });\n }\n });\n\n if (props.mode === 'htmlmixed' || props.mode === 'css' || props.mode === 'xml') {\n const currentExtraKeys = cmInstance.getOption('extraKeys');\n cmInstance.setOption('extraKeys', {\n ...currentExtraKeys,\n Tab: function (coder: any) {\n const indent = coder.getOption('indentUnit') || 2;\n const spaces = Array(indent + 1).join(' ');\n if (!word) {\n coder.replaceSelection(spaces);\n } else {\n try {\n const typeMap: any = {\n htmlmixed: 'markup',\n css: 'stylesheet',\n xml: 'markup',\n };\n const emmet = expand(word, { type: typeMap[props.mode] });\n const { line, ch } = coder.getCursor();\n coder.setSelection({ line, ch }, { line, ch: wordIndex });\n const formatterEmmet = emmet\n .split('\\n')\n .map((line: string, index: number) => {\n if (index > 0) {\n line = line.replace(/\\t/g, spaces);\n line = Array(wordIndex + 1).join(' ') + line;\n }\n return line;\n })\n .join('\\n');\n coder.replaceSelection(formatterEmmet);\n } catch (e) {\n console.error(e);\n coder.replaceSelection(spaces);\n }\n }\n },\n });\n }\n };\n\n onMounted(async () => {\n try {\n if (!(window as any).CodeMirror) {\n // First time loading: fetch all assets in the correct order.\n await Promise.all([\n loadStyle(`${get_CODEMIRROR_BASE_URL()}/lib/codemirror.css`),\n loadStyle(`${get_CODEMIRROR_BASE_URL()}/theme/material-darker.css`),\n loadStyle(`${get_CODEMIRROR_BASE_URL()}/addon/hint/show-hint.css`),\n ]);\n await loadScript(`${get_CODEMIRROR_BASE_URL()}/lib/codemirror.js`);\n await Promise.all([\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/show-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/anyword-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/xml-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/sql-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/javascript-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/css-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/html-hint.js`),\n ]);\n }\n\n await initCodeMirror();\n\n await new Promise((resolve, reject) => {\n setTimeout(() => {\n resolve(null);\n }, 500);\n });\n if (cmInstance) {\n cmInstance.refresh();\n }\n } catch (error) {\n console.error('Failed to load CodeMirror assets:', error);\n }\n });\n\n onUnmounted(() => {\n if (cmInstance) {\n cmInstance.toTextArea();\n cmInstance = null;\n }\n });\n\n watch(\n () => props.mode,\n async val => {\n if (cmInstance) {\n await loadMode(val);\n cmInstance.setOption('mode', val);\n }\n },\n );\n\n watch(\n () => props.editorValue,\n async newValue => {\n if (cmInstance && newValue !== cmInstance.getValue()) {\n cmInstance.setValue(newValue || '');\n }\n },\n );\n\n return {\n code_edit_id,\n handleCodeMirrorRefresh() {\n if (cmInstance) {\n cmInstance.refresh();\n }\n },\n };\n },\n};\n</script>\n<style>\n.CodeMirror {\n height: 300px !important;\n font-size: 15px !important;\n font-family: Monaco, MonoSpace;\n line-height: 1.4 !important;\n}\n\n.CodeMirror-lines {\n padding: 4px 0;\n min-height: 1px; /* Ensure line measure div is not collapsed */\n}\n\n.CodeMirror-hints {\n position: absolute;\n z-index: 9999 !important;\n overflow: hidden;\n list-style: none;\n margin: 0 0 0 5px; /* Add a 5px offset to the left */\n padding: 2px;\n box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);\n border-radius: 3px;\n border: 1px solid #555; /* A softer border for the theme */\n background: #2d2d2d;\n font-size: 100%;\n font-family: monospace;\n max-height: 20em;\n overflow-y: auto;\n}\n\n.CodeMirror-hint {\n margin: 0;\n padding: 0 4px;\n border-radius: 2px;\n white-space: pre;\n color: white;\n cursor: pointer;\n}\n\nli.CodeMirror-hint-active {\n background: #08f;\n color: white;\n}\n</style>\n","<template>\n <a-tree-select\n v-model:search-value=\"searchValue\"\n v-model:value=\"modalRef.selectedRows\"\n size=\"small\"\n style=\"min-width: 150px\"\n :placeholder=\"placeholder\"\n :dropdownMatchSelectWidth=\"false\"\n :disabled=\"field.disabled\"\n :default-value=\"field.defaultValue\"\n :allow-clear=\"field.allowClear !== false\"\n :tree-data=\"modalRef.datasource\"\n :multiple=\"field.multiple\"\n :tree-node-filter-prop=\"labelKey\"\n :tree-label-prop=\"labelKey\"\n :dropdownStyle=\"{ maxHeight: '400px' }\"\n @change=\"handleChange\"\n @mouseenter=\"handleMouseenter\"\n :show-search=\"true\"\n >\n <template #title=\"value\">\n <template\n v-for=\"(fragment, i) in value[labelKey || 'name']\n ?.toString()\n .split(new RegExp(`(?<=${searchValue})|(?=${searchValue})`, 'i'))\"\n >\n <span\n v-if=\"fragment.toLowerCase() === searchValue.toLowerCase()\"\n :key=\"i\"\n style=\"color: #08c\"\n >\n {{ fragment }}\n </span>\n <template v-else>{{ fragment }}</template>\n </template>\n </template>\n </a-tree-select>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, reactive, watch, onMounted, onUnmounted, ref } from 'vue';\nimport type { ReponseData } from 'liyu-pc-base/utils/hooks/useFetchData';\nimport { convertValueByClassName, isNotEmpty } from 'liyu-pc-base/utils/function';\nimport { debounce, isArray } from 'lodash-es';\nimport { getApiData } from 'liyu-pc-base/api/api-model';\nimport { useRequiredConditionStore, required_condition_event_obj } from 'liyu-pc-base/init-plugin';\n\nexport default defineComponent({\n name: 'RemoteTreeSelectPro',\n props: {\n field: {\n type: Object,\n required: true,\n },\n value: {\n type: [Array, Number, String],\n required: false,\n default: () => null,\n },\n valueKey: {\n type: String,\n },\n labelKeyType: {\n type: Number,\n default: () => 1,\n },\n labelKey: {\n type: String,\n },\n labelSpace: {\n type: String,\n default: '-',\n },\n labelKeyList: {\n type: Array,\n },\n search_config: {\n type: Object,\n required: false,\n default: () => {},\n },\n label: {\n type: [Array, String],\n required: false,\n },\n formModel: {\n type: Object,\n required: true,\n },\n outModel: {\n required: false,\n },\n placeholder: {\n type: String,\n },\n init_model: {\n type: Object,\n default: () => {},\n },\n init_watch: {\n // 普通查询监听字段 {监听key: 传参key}\n type: Object,\n default: () => {},\n },\n is_form_design: {\n type: Boolean,\n default: () => false,\n },\n },\n emits: ['update:value', 'update:label'],\n setup(props, { emit }) {\n const searchValue = ref('');\n const requiredConditionStore = useRequiredConditionStore();\n const modalRef: any = reactive({\n selectedRows: props.field.multiple ? [] : null,\n datasource: [],\n baseData: null,\n });\n let is_refresh = false; // 是否触发刷新\n const getSelectedRows = (value: any) => {\n if (value) {\n if (props.field.multiple) {\n modalRef.selectedRows = [];\n if (isArray(value)) {\n value.forEach((item: any) => {\n modalRef.selectedRows.push(item);\n });\n } else {\n modalRef.selectedRows.push(value);\n }\n } else {\n if (isArray(value)) {\n if (value?.length > 0) {\n modalRef.selectedRows = value[0];\n } else {\n modalRef.selectedRows = null;\n }\n } else {\n modalRef.selectedRows = value;\n }\n }\n } else {\n if (props.field.multiple) {\n modalRef.selectedRows = [];\n } else {\n modalRef.selectedRows = null;\n }\n }\n };\n getSelectedRows(props.value);\n const getTreeData = (res: any) => {\n const result = [...res.data];\n // 递归排序函数\n function dataChildren(nodes) {\n nodes.forEach(node => {\n node.key = node[get_value_key()];\n node.value = node[get_value_key()];\n if (props.labelKeyList && props.labelKeyList.length > 0 && props.labelKeyType == 2) {\n const label = [];\n for (const key of props.labelKeyList) {\n label.push(node[key as string]);\n }\n node.title = label.join(props.labelSpace);\n } else {\n node.title = node[get_label_key()];\n }\n if (node?.children && node.children.length > 0) {\n dataChildren(node.children); // 递归排序子节点\n } else {\n delete node.children;\n }\n });\n }\n dataChildren(result); // 然后递归地对每个根节点的子节点排序\n modalRef.datasource = result;\n };\n const get_value_key = () => {\n return props.valueKey ? (props.valueKey as string) : 'id';\n };\n const get_label_key = () => {\n return props.labelKey ? (props.labelKey as string) : 'name';\n };\n const getConditionsItem = (value: any, list: any, item: any) => {\n if (item.operator === 'not_blank_not_null') {\n list.push({\n field_name: item.field_name,\n operator: item.operator,\n value: [],\n format: item.format,\n class_name: item.class_name,\n });\n } else if (value instanceof Array) {\n const [first] = value;\n if (isNotEmpty(first)) {\n list.push({\n field_name: item.field_name,\n operator: item.operator,\n value: convertValueByClassName(value, item.class_name),\n format: item.format,\n class_name: item.class_name,\n });\n }\n } else if (isNotEmpty(value)) {\n let val = value;\n if (item.operator === 'in' || item.operator === 'notin') {\n if (value.includes('[')) {\n val = JSON.parse(value);\n } else if (value.includes(',')) {\n val = value.split(',');\n }\n if (item.class_name === 'int') {\n val = val.map(Number);\n }\n }\n list.push({\n field_name: item.field_name,\n operator: item.operator,\n value: convertValueByClassName(val instanceof Array ? val : [val], item.class_name),\n format: item.format,\n class_name: item.class_name,\n });\n }\n };\n /**\n * searchType === 1 时按 key 同时处理 outModel 与 formModel:\n * outModel 中该字段有值(非 undefined / null)时优先,否则回退 formModel 的同名字段。\n * 不能用 `outModel ? outModel : formModel` 做对象级二选一(outModel 默认为 {} 恒为真值)。\n */\n const resolveModelValue = (selectName: any): { found: boolean; value: any } => {\n if (\n props.outModel &&\n Object.prototype.hasOwnProperty.call(props.outModel, selectName) &&\n props.outModel[selectName] !== undefined &&\n props.outModel[selectName] !== null\n ) {\n return { found: true, value: props.outModel[selectName] };\n }\n if (props.formModel && Object.prototype.hasOwnProperty.call(props.formModel, selectName)) {\n return { found: true, value: props.formModel[selectName] };\n }\n return { found: false, value: undefined };\n };\n const getConditions = () => {\n const conditions = [];\n let search_conditions = [\n [\n {\n searchType: 3,\n field_name: 'is_active',\n operator: 'eq',\n value: [true],\n format: 'choices',\n class_name: 'bool',\n },\n ],\n ];\n if (props.field.searchConditions) {\n search_conditions = props.field.searchConditions;\n }\n search_conditions.forEach((item: any) => {\n const list = [];\n item.forEach((item1: any) => {\n if (item1.searchType === 1) {\n // outModel 优先、formModel 兜底,两者同时参与查找\n const resolved = resolveModelValue(item1.select_name);\n if (resolved.found) {\n getConditionsItem(resolved.value, list, item1);\n }\n } else if (item1.searchType === 2) {\n Object.keys(props.formModel).forEach((key: any) => {\n if (item1.select_name == key) {\n getConditionsItem(props.formModel[key], list, item1);\n }\n });\n } else {\n getConditionsItem(item1.value, list, item1);\n }\n });\n conditions.push(list);\n });\n return conditions;\n };\n const getSimpleSearchParams = () => {\n const params = {};\n if (props.field.simpleSearchConditions) {\n props.field.simpleSearchConditions.forEach((item: any) => {\n if (item.searchType === 1) {\n // outModel 优先、formModel 兜底,两者同时参与查找\n const resolved = resolveModelValue(item.select_name);\n if (resolved.found) {\n params[item.field_name] = resolved.value;\n }\n } else if (item.searchType === 3) {\n params[item.field_name] = item.value;\n }\n });\n return params;\n }\n };\n const searchConfig: any = {\n current: 1,\n pageSize: 2000,\n is_pagination: true,\n is_active: true,\n ...props.init_model, // 普通查询条件\n column_fields: [],\n conditions: [],\n simpleSearchParams: {},\n };\n if (props.field.queryType === 'simple') {\n searchConfig.simpleSearchParams = getSimpleSearchParams();\n } else {\n searchConfig.conditions = getConditions();\n }\n const getColumnFields = () => {\n const list = [];\n if (props.labelKeyType == 2) {\n list.push(get_value_key(), ...props.labelKeyList);\n } else {\n list.push(get_value_key(), get_label_key());\n }\n searchConfig.column_fields = [].concat(list);\n };\n getColumnFields();\n const getLabelFromDatasource = (datasource: Array<any>) => {\n const labelList: Array<string> = [];\n datasource.forEach((item: any) => {\n if (modalRef.selectedRows instanceof Array && modalRef.selectedRows.includes(item.key)) {\n labelList.push(item.title);\n }\n if (!(modalRef.selectedRows instanceof Array) && modalRef.selectedRows == item.key) {\n labelList.push(item.title);\n }\n if (item.children && item.children.length > 0) {\n getLabelFromDatasource(item.children).forEach(obj => labelList.push(obj));\n }\n });\n return labelList;\n };\n\n const handleChange = () => {\n emit('update:value', modalRef.selectedRows);\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n };\n\n watch(\n () => props.formModel[props.field.name],\n () => {\n getSelectedRows(props.formModel[props.field.name]);\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n },\n );\n const getRequiredConditionObj = () => {\n const required_condition = props.field.required_condition;\n const required_condition_obj = {};\n if (required_condition) {\n required_condition.forEach((item: any) => {\n const value = requiredConditionStore.value_map[item.key];\n if (value !== undefined && value !== null) {\n required_condition_obj[item.field_name] = value;\n }\n });\n }\n return required_condition_obj;\n };\n const refresh = () => {\n if (props.field.postUrl) {\n let params: any = {};\n if (props.field.queryType === 'simple') {\n params = {\n ...searchConfig.simpleSearchParams,\n required_condition: getRequiredConditionObj(),\n };\n } else {\n params = {\n ...searchConfig,\n ...props.search_config,\n required_condition: getRequiredConditionObj(),\n };\n delete params.simpleSearchParams;\n }\n getApiData(\n params,\n props.field.postUrl.replace('__tree', ''),\n props.field.postUrl.includes('__tree'),\n ).then(function (res: ReponseData<any>) {\n // console.log('res', res.data);\n modalRef.baseData = res;\n getTreeData(modalRef.baseData);\n getSelectedRows(modalRef.selectedRows);\n if (!props.is_form_design) {\n if (props.field.defaultValueType === 'first') {\n if (!modalRef.selectedRows || modalRef.selectedRows.length === 0) {\n if (!props.field.multiple) {\n modalRef.selectedRows = modalRef.datasource[0].value;\n } else {\n modalRef.selectedRows = [modalRef.datasource[0].value];\n }\n }\n } else if (props.field.defaultValueType === 'global') {\n if (!modalRef.selectedRows || modalRef.selectedRows.length === 0) {\n const globalDefaultKey = props.field.globalDefaultKey;\n const globalDefaultField = props.field.globalDefaultField;\n const globalDefaultValue = requiredConditionStore.value_map[globalDefaultKey];\n console.log('globalDefaultValue', globalDefaultValue);\n if (globalDefaultValue) {\n const globalDefaultItem = findDataItem(\n res.data,\n globalDefaultField,\n globalDefaultValue,\n );\n if (globalDefaultItem) {\n if (!props.field.multiple) {\n modalRef.selectedRows = globalDefaultItem[get_value_key()];\n } else {\n modalRef.selectedRows = [globalDefaultItem[get_value_key()]];\n }\n }\n }\n }\n }\n }\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n emit('update:value', modalRef.selectedRows);\n });\n }\n };\n const findDataItem = (rawDataList: any, key: string, value: any) => {\n for (const rawData of rawDataList) {\n if (rawData[key] === value) {\n return rawData;\n }\n if (rawData.children) {\n const result = findDataItem(rawData.children, key, value);\n if (result) {\n return result;\n }\n }\n }\n return null;\n };\n const debounce1: any = debounce(() => {\n refresh();\n }, 1000);\n const handleMouseenter = () => {\n if (is_refresh) {\n is_refresh = false;\n refresh();\n }\n };\n watch(\n // outModel 参与 searchType===1 的取值(见 resolveModelValue),必须一并监听:\n // 否则外部模型变化时查询条件不会重建。下方 JSON.stringify(searchConfig) 比对会挡住\n // 参数未变化时的重复刷新,不会多打请求。\n () => [props.formModel, props.outModel],\n () => {\n const oldSearch = JSON.stringify(searchConfig);\n if (props.field.queryType === 'simple') {\n searchConfig.simpleSearchParams = getSimpleSearchParams();\n } else {\n searchConfig.conditions = getConditions();\n }\n if (props.init_watch) {\n Object.keys(props.init_watch).forEach((key: any) => {\n searchConfig[props.init_watch[key]] = props.formModel[key];\n });\n }\n if (oldSearch == JSON.stringify(searchConfig)) {\n return;\n } else {\n debounce1();\n }\n },\n { deep: true },\n );\n watch(\n () => [\n props.field.searchConditions,\n props.field.queryType,\n props.field.simpleSearchConditions,\n ],\n () => {\n if (props.field.queryType === 'simple') {\n searchConfig.simpleSearchParams = getSimpleSearchParams();\n } else {\n searchConfig.conditions = getConditions();\n }\n is_refresh = true;\n },\n { deep: true },\n );\n watch(\n () => [\n props.labelKeyList,\n props.labelKey,\n props.labelKeyType,\n props.valueKey,\n props.labelSpace,\n ],\n () => {\n getTreeData(modalRef.baseData);\n },\n { deep: true },\n );\n watch(\n () => props.field.multiple,\n () => {\n getSelectedRows(modalRef.selectedRows);\n emit('update:value', modalRef.selectedRows);\n },\n );\n watch(\n () => props.field.postUrl,\n () => {\n is_refresh = true;\n },\n );\n const handleRequiredConditionChange = (key: string) => {\n if (props.field.required_condition) {\n const item = props.field.required_condition.find((item: any) => item.key === key);\n if (item) {\n debounce1();\n }\n }\n };\n onMounted(() => {\n required_condition_event_obj().on('required_condition_change', handleRequiredConditionChange);\n refresh();\n });\n onUnmounted(() => {\n required_condition_event_obj().off(\n 'required_condition_change',\n handleRequiredConditionChange,\n );\n });\n return {\n props,\n modalRef,\n handleChange,\n handleMouseenter,\n searchValue,\n };\n },\n\n data() {\n return {\n model: this.value,\n };\n },\n});\n</script>\n","<template>\n <a-tree-select\n v-model:search-value=\"searchValue\"\n v-model:value=\"modalRef.selectedRows\"\n size=\"small\"\n style=\"min-width: 150px\"\n :placeholder=\"placeholder\"\n :dropdownMatchSelectWidth=\"false\"\n :disabled=\"field.disabled\"\n :default-value=\"field.defaultValue\"\n :allow-clear=\"field.allowClear !== false\"\n :tree-data=\"modalRef.datasource\"\n :multiple=\"field.multiple\"\n :tree-node-filter-prop=\"labelKey\"\n :tree-label-prop=\"labelKey\"\n :dropdownStyle=\"{ maxHeight: '400px' }\"\n @change=\"handleChange\"\n @mouseenter=\"handleMouseenter\"\n :show-search=\"true\"\n >\n <template #title=\"value\">\n <template\n v-for=\"(fragment, i) in value[labelKey || 'name']\n ?.toString()\n .split(new RegExp(`(?<=${searchValue})|(?=${searchValue})`, 'i'))\"\n >\n <span\n v-if=\"fragment.toLowerCase() === searchValue.toLowerCase()\"\n :key=\"i\"\n style=\"color: #08c\"\n >\n {{ fragment }}\n </span>\n <template v-else>{{ fragment }}</template>\n </template>\n </template>\n </a-tree-select>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, reactive, watch, onMounted, onUnmounted, ref } from 'vue';\nimport type { ReponseData } from 'liyu-pc-base/utils/hooks/useFetchData';\nimport { convertValueByClassName, isNotEmpty } from 'liyu-pc-base/utils/function';\nimport { debounce, isArray } from 'lodash-es';\nimport { getApiData } from 'liyu-pc-base/api/api-model';\nimport { useRequiredConditionStore, required_condition_event_obj } from 'liyu-pc-base/init-plugin';\n\nexport default defineComponent({\n name: 'RemoteTreeSelectPro',\n props: {\n field: {\n type: Object,\n required: true,\n },\n value: {\n type: [Array, Number, String],\n required: false,\n default: () => null,\n },\n valueKey: {\n type: String,\n },\n labelKeyType: {\n type: Number,\n default: () => 1,\n },\n labelKey: {\n type: String,\n },\n labelSpace: {\n type: String,\n default: '-',\n },\n labelKeyList: {\n type: Array,\n },\n search_config: {\n type: Object,\n required: false,\n default: () => {},\n },\n label: {\n type: [Array, String],\n required: false,\n },\n formModel: {\n type: Object,\n required: true,\n },\n outModel: {\n required: false,\n },\n placeholder: {\n type: String,\n },\n init_model: {\n type: Object,\n default: () => {},\n },\n init_watch: {\n // 普通查询监听字段 {监听key: 传参key}\n type: Object,\n default: () => {},\n },\n is_form_design: {\n type: Boolean,\n default: () => false,\n },\n },\n emits: ['update:value', 'update:label'],\n setup(props, { emit }) {\n const searchValue = ref('');\n const requiredConditionStore = useRequiredConditionStore();\n const modalRef: any = reactive({\n selectedRows: props.field.multiple ? [] : null,\n datasource: [],\n baseData: null,\n });\n let is_refresh = false; // 是否触发刷新\n const getSelectedRows = (value: any) => {\n if (value) {\n if (props.field.multiple) {\n modalRef.selectedRows = [];\n if (isArray(value)) {\n value.forEach((item: any) => {\n modalRef.selectedRows.push(item);\n });\n } else {\n modalRef.selectedRows.push(value);\n }\n } else {\n if (isArray(value)) {\n if (value?.length > 0) {\n modalRef.selectedRows = value[0];\n } else {\n modalRef.selectedRows = null;\n }\n } else {\n modalRef.selectedRows = value;\n }\n }\n } else {\n if (props.field.multiple) {\n modalRef.selectedRows = [];\n } else {\n modalRef.selectedRows = null;\n }\n }\n };\n getSelectedRows(props.value);\n const getTreeData = (res: any) => {\n const result = [...res.data];\n // 递归排序函数\n function dataChildren(nodes) {\n nodes.forEach(node => {\n node.key = node[get_value_key()];\n node.value = node[get_value_key()];\n if (props.labelKeyList && props.labelKeyList.length > 0 && props.labelKeyType == 2) {\n const label = [];\n for (const key of props.labelKeyList) {\n label.push(node[key as string]);\n }\n node.title = label.join(props.labelSpace);\n } else {\n node.title = node[get_label_key()];\n }\n if (node?.children && node.children.length > 0) {\n dataChildren(node.children); // 递归排序子节点\n } else {\n delete node.children;\n }\n });\n }\n dataChildren(result); // 然后递归地对每个根节点的子节点排序\n modalRef.datasource = result;\n };\n const get_value_key = () => {\n return props.valueKey ? (props.valueKey as string) : 'id';\n };\n const get_label_key = () => {\n return props.labelKey ? (props.labelKey as string) : 'name';\n };\n const getConditionsItem = (value: any, list: any, item: any) => {\n if (item.operator === 'not_blank_not_null') {\n list.push({\n field_name: item.field_name,\n operator: item.operator,\n value: [],\n format: item.format,\n class_name: item.class_name,\n });\n } else if (value instanceof Array) {\n const [first] = value;\n if (isNotEmpty(first)) {\n list.push({\n field_name: item.field_name,\n operator: item.operator,\n value: convertValueByClassName(value, item.class_name),\n format: item.format,\n class_name: item.class_name,\n });\n }\n } else if (isNotEmpty(value)) {\n let val = value;\n if (item.operator === 'in' || item.operator === 'notin') {\n if (value.includes('[')) {\n val = JSON.parse(value);\n } else if (value.includes(',')) {\n val = value.split(',');\n }\n if (item.class_name === 'int') {\n val = val.map(Number);\n }\n }\n list.push({\n field_name: item.field_name,\n operator: item.operator,\n value: convertValueByClassName(val instanceof Array ? val : [val], item.class_name),\n format: item.format,\n class_name: item.class_name,\n });\n }\n };\n /**\n * searchType === 1 时按 key 同时处理 outModel 与 formModel:\n * outModel 中该字段有值(非 undefined / null)时优先,否则回退 formModel 的同名字段。\n * 不能用 `outModel ? outModel : formModel` 做对象级二选一(outModel 默认为 {} 恒为真值)。\n */\n const resolveModelValue = (selectName: any): { found: boolean; value: any } => {\n if (\n props.outModel &&\n Object.prototype.hasOwnProperty.call(props.outModel, selectName) &&\n props.outModel[selectName] !== undefined &&\n props.outModel[selectName] !== null\n ) {\n return { found: true, value: props.outModel[selectName] };\n }\n if (props.formModel && Object.prototype.hasOwnProperty.call(props.formModel, selectName)) {\n return { found: true, value: props.formModel[selectName] };\n }\n return { found: false, value: undefined };\n };\n const getConditions = () => {\n const conditions = [];\n let search_conditions = [\n [\n {\n searchType: 3,\n field_name: 'is_active',\n operator: 'eq',\n value: [true],\n format: 'choices',\n class_name: 'bool',\n },\n ],\n ];\n if (props.field.searchConditions) {\n search_conditions = props.field.searchConditions;\n }\n search_conditions.forEach((item: any) => {\n const list = [];\n item.forEach((item1: any) => {\n if (item1.searchType === 1) {\n // outModel 优先、formModel 兜底,两者同时参与查找\n const resolved = resolveModelValue(item1.select_name);\n if (resolved.found) {\n getConditionsItem(resolved.value, list, item1);\n }\n } else if (item1.searchType === 2) {\n Object.keys(props.formModel).forEach((key: any) => {\n if (item1.select_name == key) {\n getConditionsItem(props.formModel[key], list, item1);\n }\n });\n } else {\n getConditionsItem(item1.value, list, item1);\n }\n });\n conditions.push(list);\n });\n return conditions;\n };\n const getSimpleSearchParams = () => {\n const params = {};\n if (props.field.simpleSearchConditions) {\n props.field.simpleSearchConditions.forEach((item: any) => {\n if (item.searchType === 1) {\n // outModel 优先、formModel 兜底,两者同时参与查找\n const resolved = resolveModelValue(item.select_name);\n if (resolved.found) {\n params[item.field_name] = resolved.value;\n }\n } else if (item.searchType === 3) {\n params[item.field_name] = item.value;\n }\n });\n return params;\n }\n };\n const searchConfig: any = {\n current: 1,\n pageSize: 2000,\n is_pagination: true,\n is_active: true,\n ...props.init_model, // 普通查询条件\n column_fields: [],\n conditions: [],\n simpleSearchParams: {},\n };\n if (props.field.queryType === 'simple') {\n searchConfig.simpleSearchParams = getSimpleSearchParams();\n } else {\n searchConfig.conditions = getConditions();\n }\n const getColumnFields = () => {\n const list = [];\n if (props.labelKeyType == 2) {\n list.push(get_value_key(), ...props.labelKeyList);\n } else {\n list.push(get_value_key(), get_label_key());\n }\n searchConfig.column_fields = [].concat(list);\n };\n getColumnFields();\n const getLabelFromDatasource = (datasource: Array<any>) => {\n const labelList: Array<string> = [];\n datasource.forEach((item: any) => {\n if (modalRef.selectedRows instanceof Array && modalRef.selectedRows.includes(item.key)) {\n labelList.push(item.title);\n }\n if (!(modalRef.selectedRows instanceof Array) && modalRef.selectedRows == item.key) {\n labelList.push(item.title);\n }\n if (item.children && item.children.length > 0) {\n getLabelFromDatasource(item.children).forEach(obj => labelList.push(obj));\n }\n });\n return labelList;\n };\n\n const handleChange = () => {\n emit('update:value', modalRef.selectedRows);\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n };\n\n watch(\n () => props.formModel[props.field.name],\n () => {\n getSelectedRows(props.formModel[props.field.name]);\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n },\n );\n const getRequiredConditionObj = () => {\n const required_condition = props.field.required_condition;\n const required_condition_obj = {};\n if (required_condition) {\n required_condition.forEach((item: any) => {\n const value = requiredConditionStore.value_map[item.key];\n if (value !== undefined && value !== null) {\n required_condition_obj[item.field_name] = value;\n }\n });\n }\n return required_condition_obj;\n };\n const refresh = () => {\n if (props.field.postUrl) {\n let params: any = {};\n if (props.field.queryType === 'simple') {\n params = {\n ...searchConfig.simpleSearchParams,\n required_condition: getRequiredConditionObj(),\n };\n } else {\n params = {\n ...searchConfig,\n ...props.search_config,\n required_condition: getRequiredConditionObj(),\n };\n delete params.simpleSearchParams;\n }\n getApiData(\n params,\n props.field.postUrl.replace('__tree', ''),\n props.field.postUrl.includes('__tree'),\n ).then(function (res: ReponseData<any>) {\n // console.log('res', res.data);\n modalRef.baseData = res;\n getTreeData(modalRef.baseData);\n getSelectedRows(modalRef.selectedRows);\n if (!props.is_form_design) {\n if (props.field.defaultValueType === 'first') {\n if (!modalRef.selectedRows || modalRef.selectedRows.length === 0) {\n if (!props.field.multiple) {\n modalRef.selectedRows = modalRef.datasource[0].value;\n } else {\n modalRef.selectedRows = [modalRef.datasource[0].value];\n }\n }\n } else if (props.field.defaultValueType === 'global') {\n if (!modalRef.selectedRows || modalRef.selectedRows.length === 0) {\n const globalDefaultKey = props.field.globalDefaultKey;\n const globalDefaultField = props.field.globalDefaultField;\n const globalDefaultValue = requiredConditionStore.value_map[globalDefaultKey];\n console.log('globalDefaultValue', globalDefaultValue);\n if (globalDefaultValue) {\n const globalDefaultItem = findDataItem(\n res.data,\n globalDefaultField,\n globalDefaultValue,\n );\n if (globalDefaultItem) {\n if (!props.field.multiple) {\n modalRef.selectedRows = globalDefaultItem[get_value_key()];\n } else {\n modalRef.selectedRows = [globalDefaultItem[get_value_key()]];\n }\n }\n }\n }\n }\n }\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n emit('update:value', modalRef.selectedRows);\n });\n }\n };\n const findDataItem = (rawDataList: any, key: string, value: any) => {\n for (const rawData of rawDataList) {\n if (rawData[key] === value) {\n return rawData;\n }\n if (rawData.children) {\n const result = findDataItem(rawData.children, key, value);\n if (result) {\n return result;\n }\n }\n }\n return null;\n };\n const debounce1: any = debounce(() => {\n refresh();\n }, 1000);\n const handleMouseenter = () => {\n if (is_refresh) {\n is_refresh = false;\n refresh();\n }\n };\n watch(\n // outModel 参与 searchType===1 的取值(见 resolveModelValue),必须一并监听:\n // 否则外部模型变化时查询条件不会重建。下方 JSON.stringify(searchConfig) 比对会挡住\n // 参数未变化时的重复刷新,不会多打请求。\n () => [props.formModel, props.outModel],\n () => {\n const oldSearch = JSON.stringify(searchConfig);\n if (props.field.queryType === 'simple') {\n searchConfig.simpleSearchParams = getSimpleSearchParams();\n } else {\n searchConfig.conditions = getConditions();\n }\n if (props.init_watch) {\n Object.keys(props.init_watch).forEach((key: any) => {\n searchConfig[props.init_watch[key]] = props.formModel[key];\n });\n }\n if (oldSearch == JSON.stringify(searchConfig)) {\n return;\n } else {\n debounce1();\n }\n },\n { deep: true },\n );\n watch(\n () => [\n props.field.searchConditions,\n props.field.queryType,\n props.field.simpleSearchConditions,\n ],\n () => {\n if (props.field.queryType === 'simple') {\n searchConfig.simpleSearchParams = getSimpleSearchParams();\n } else {\n searchConfig.conditions = getConditions();\n }\n is_refresh = true;\n },\n { deep: true },\n );\n watch(\n () => [\n props.labelKeyList,\n props.labelKey,\n props.labelKeyType,\n props.valueKey,\n props.labelSpace,\n ],\n () => {\n getTreeData(modalRef.baseData);\n },\n { deep: true },\n );\n watch(\n () => props.field.multiple,\n () => {\n getSelectedRows(modalRef.selectedRows);\n emit('update:value', modalRef.selectedRows);\n },\n );\n watch(\n () => props.field.postUrl,\n () => {\n is_refresh = true;\n },\n );\n const handleRequiredConditionChange = (key: string) => {\n if (props.field.required_condition) {\n const item = props.field.required_condition.find((item: any) => item.key === key);\n if (item) {\n debounce1();\n }\n }\n };\n onMounted(() => {\n required_condition_event_obj().on('required_condition_change', handleRequiredConditionChange);\n refresh();\n });\n onUnmounted(() => {\n required_condition_event_obj().off(\n 'required_condition_change',\n handleRequiredConditionChange,\n );\n });\n return {\n props,\n modalRef,\n handleChange,\n handleMouseenter,\n searchValue,\n };\n },\n\n data() {\n return {\n model: this.value,\n };\n },\n});\n</script>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RemoteTreeSelectPro-CXMOariR.js","names":[],"sources":["../src/utils/load-async-asset.ts","../src/components/code/CodeEditor.vue","../src/components/code/CodeEditor.vue","../src/components/FormRender/RemoteTreeSelectPro/RemoteTreeSelectPro.vue","../src/components/FormRender/RemoteTreeSelectPro/RemoteTreeSelectPro.vue"],"sourcesContent":["export function loadScript(src: string): Promise<Event> {\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = src;\n script.onload = resolve;\n script.onerror = reject;\n document.head.appendChild(script);\n });\n}\n\nexport function loadStyle(href: string): Promise<Event> {\n return new Promise((resolve, reject) => {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = href;\n link.onload = resolve;\n link.onerror = reject;\n document.head.appendChild(link);\n });\n}\n","<template>\n <textarea\n style=\"display: none\"\n :id=\"code_edit_id\"\n ></textarea>\n</template>\n\n<script lang=\"ts\">\nimport { onMounted, onUnmounted, PropType, watch } from 'vue';\nimport { loadScript, loadStyle } from 'liyu-pc-base/utils/load-async-asset';\nimport { useEnv } from 'liyu-pc-base/init-plugin';\nimport expand from 'emmet';\n\ntype modeType = 'javascript' | 'htmlmixed' | 'css' | 'python' | 'jinja2' | 'sql' | 'xml';\n\n// Dynamically set asset URLs based on the environment\nconst get_CODEMIRROR_BASE_URL = () => {\n const env = useEnv();\n return env.VUE_APP_PUBLIC_PATH + 'codemirror';\n};\n\nconst loadedModes = new Set<string>();\n\nasync function loadMode(mode: modeType) {\n if (loadedModes.has(mode)) {\n return;\n }\n // The files copied from node_modules are not minified, so we use the standard names.\n let modeFile = '';\n switch (mode) {\n case 'javascript':\n case 'css':\n case 'htmlmixed':\n case 'python':\n case 'jinja2':\n case 'sql':\n case 'xml':\n modeFile = `${mode}/${mode}.js`;\n break;\n }\n if (modeFile) {\n await loadScript(`${get_CODEMIRROR_BASE_URL()}/mode/${modeFile}`);\n loadedModes.add(mode);\n }\n}\n\nfunction getWord(line: string, ch: number): [string, number] {\n const getNearTagChar = (str: string): string => {\n for (let i = str.length - 1; i > 0; i--) {\n if (str[i] === '>' || str[i] === '<') return str[i];\n }\n return str[0] || '<';\n };\n // 光标位于行末或单词末尾\n if (ch === line.length || (line.length > ch + 1 && (/S/.test(line[ch]) || line[ch] === '<'))) {\n let i;\n for (i = ch - 1; i >= 0; i--) {\n if (/S/.test(line[i]) || (line[i] === '>' && getNearTagChar(line.slice(0, i)) === '<')) {\n break;\n }\n }\n return [line.slice(i + 1, ch), i + 1];\n }\n return ['', 0];\n}\n\nfunction debounce(fn: any, delay = 1000) {\n let timer: any;\n return function (this: any) {\n const context = this;\n const args = arguments;\n clearTimeout(timer);\n timer = setTimeout(function () {\n fn.apply(context, args);\n }, delay);\n };\n}\n\nexport default {\n name: 'CodeEditor',\n props: {\n editorValue: {\n type: String,\n default: '',\n },\n mode: {\n type: String as PropType<modeType>,\n required: true,\n default: 'javascript',\n },\n lineWrapping: {\n type: Boolean,\n default: true,\n },\n options: {\n type: Object,\n default: () => {\n return {\n lineNumbers: true,\n line: true,\n indentUnit: 2,\n lineWidth: 4,\n lineColor: '#b99944',\n immediate: true,\n };\n },\n },\n },\n setup(props: any, context: any) {\n let cmInstance: any;\n const code_edit_id: string = 'code_edit_id' + new Date().getTime();\n\n const initCodeMirror = async () => {\n const editor = document.getElementById(code_edit_id);\n let word: string, wordIndex: number;\n\n await loadMode(props.mode);\n\n const extraKeys = {\n 'Ctrl-Space': 'autocomplete',\n };\n\n cmInstance = window.CodeMirror.fromTextArea(editor as HTMLTextAreaElement, {\n ...props.options,\n extraKeys,\n hintOptions: {\n // tables: {\n // users: ['name', 'score', 'birthDate'],\n // countries: ['name', 'population', 'size'],\n // },\n },\n lineWrapping: props.lineWrapping,\n });\n\n cmInstance.setOption('mode', props.mode);\n cmInstance.setOption('theme', 'material-darker');\n cmInstance.setValue(props.editorValue || '');\n\n cmInstance.on('change', (coder: any) => {\n if (props.mode === 'htmlmixed' || props.mode === 'css' || props.mode === 'xml') {\n // HTML模式下使用Emmet\n const { line: lineIndex, ch } = coder.getCursor();\n const line = coder.getLine(lineIndex);\n const wordResult = getWord(line, ch);\n word = wordResult[0];\n wordIndex = wordResult[1];\n }\n context.emit('update:editorValue', coder.getValue());\n });\n\n cmInstance.on(\n 'change',\n debounce(() => {\n context.emit('debounce-update');\n }, 5000) as (instance: any) => void,\n );\n\n // Autocomplete on input\n cmInstance.on('inputRead', (cm: any, change: any) => {\n if (cm.state.completionActive || change.origin === '+delete' || change.origin === 'paste') {\n return;\n }\n // Show hint for normal typing\n const NON_SPECIAL_CHARS = /^[a-zA-Z0-9_.]*$/;\n if (NON_SPECIAL_CHARS.test(change.text[0])) {\n cm.showHint({ completeSingle: false });\n }\n });\n\n if (props.mode === 'htmlmixed' || props.mode === 'css' || props.mode === 'xml') {\n const currentExtraKeys = cmInstance.getOption('extraKeys');\n cmInstance.setOption('extraKeys', {\n ...currentExtraKeys,\n Tab: function (coder: any) {\n const indent = coder.getOption('indentUnit') || 2;\n const spaces = Array(indent + 1).join(' ');\n if (!word) {\n coder.replaceSelection(spaces);\n } else {\n try {\n const typeMap: any = {\n htmlmixed: 'markup',\n css: 'stylesheet',\n xml: 'markup',\n };\n const emmet = expand(word, { type: typeMap[props.mode] });\n const { line, ch } = coder.getCursor();\n coder.setSelection({ line, ch }, { line, ch: wordIndex });\n const formatterEmmet = emmet\n .split('\\n')\n .map((line: string, index: number) => {\n if (index > 0) {\n line = line.replace(/\\t/g, spaces);\n line = Array(wordIndex + 1).join(' ') + line;\n }\n return line;\n })\n .join('\\n');\n coder.replaceSelection(formatterEmmet);\n } catch (e) {\n console.error(e);\n coder.replaceSelection(spaces);\n }\n }\n },\n });\n }\n };\n\n onMounted(async () => {\n try {\n if (!(window as any).CodeMirror) {\n // First time loading: fetch all assets in the correct order.\n await Promise.all([\n loadStyle(`${get_CODEMIRROR_BASE_URL()}/lib/codemirror.css`),\n loadStyle(`${get_CODEMIRROR_BASE_URL()}/theme/material-darker.css`),\n loadStyle(`${get_CODEMIRROR_BASE_URL()}/addon/hint/show-hint.css`),\n ]);\n await loadScript(`${get_CODEMIRROR_BASE_URL()}/lib/codemirror.js`);\n await Promise.all([\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/show-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/anyword-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/xml-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/sql-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/javascript-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/css-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/html-hint.js`),\n ]);\n }\n\n await initCodeMirror();\n\n await new Promise((resolve, reject) => {\n setTimeout(() => {\n resolve(null);\n }, 500);\n });\n if (cmInstance) {\n cmInstance.refresh();\n }\n } catch (error) {\n console.error('Failed to load CodeMirror assets:', error);\n }\n });\n\n onUnmounted(() => {\n if (cmInstance) {\n cmInstance.toTextArea();\n cmInstance = null;\n }\n });\n\n watch(\n () => props.mode,\n async val => {\n if (cmInstance) {\n await loadMode(val);\n cmInstance.setOption('mode', val);\n }\n },\n );\n\n watch(\n () => props.editorValue,\n async newValue => {\n if (cmInstance && newValue !== cmInstance.getValue()) {\n cmInstance.setValue(newValue || '');\n }\n },\n );\n\n return {\n code_edit_id,\n handleCodeMirrorRefresh() {\n if (cmInstance) {\n cmInstance.refresh();\n }\n },\n };\n },\n};\n</script>\n<style>\n.CodeMirror {\n height: 300px !important;\n font-size: 15px !important;\n font-family: Monaco, MonoSpace;\n line-height: 1.4 !important;\n}\n\n.CodeMirror-lines {\n padding: 4px 0;\n min-height: 1px; /* Ensure line measure div is not collapsed */\n}\n\n.CodeMirror-hints {\n position: absolute;\n z-index: 9999 !important;\n overflow: hidden;\n list-style: none;\n margin: 0 0 0 5px; /* Add a 5px offset to the left */\n padding: 2px;\n box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);\n border-radius: 3px;\n border: 1px solid #555; /* A softer border for the theme */\n background: #2d2d2d;\n font-size: 100%;\n font-family: monospace;\n max-height: 20em;\n overflow-y: auto;\n}\n\n.CodeMirror-hint {\n margin: 0;\n padding: 0 4px;\n border-radius: 2px;\n white-space: pre;\n color: white;\n cursor: pointer;\n}\n\nli.CodeMirror-hint-active {\n background: #08f;\n color: white;\n}\n</style>\n","<template>\n <textarea\n style=\"display: none\"\n :id=\"code_edit_id\"\n ></textarea>\n</template>\n\n<script lang=\"ts\">\nimport { onMounted, onUnmounted, PropType, watch } from 'vue';\nimport { loadScript, loadStyle } from 'liyu-pc-base/utils/load-async-asset';\nimport { useEnv } from 'liyu-pc-base/init-plugin';\nimport expand from 'emmet';\n\ntype modeType = 'javascript' | 'htmlmixed' | 'css' | 'python' | 'jinja2' | 'sql' | 'xml';\n\n// Dynamically set asset URLs based on the environment\nconst get_CODEMIRROR_BASE_URL = () => {\n const env = useEnv();\n return env.VUE_APP_PUBLIC_PATH + 'codemirror';\n};\n\nconst loadedModes = new Set<string>();\n\nasync function loadMode(mode: modeType) {\n if (loadedModes.has(mode)) {\n return;\n }\n // The files copied from node_modules are not minified, so we use the standard names.\n let modeFile = '';\n switch (mode) {\n case 'javascript':\n case 'css':\n case 'htmlmixed':\n case 'python':\n case 'jinja2':\n case 'sql':\n case 'xml':\n modeFile = `${mode}/${mode}.js`;\n break;\n }\n if (modeFile) {\n await loadScript(`${get_CODEMIRROR_BASE_URL()}/mode/${modeFile}`);\n loadedModes.add(mode);\n }\n}\n\nfunction getWord(line: string, ch: number): [string, number] {\n const getNearTagChar = (str: string): string => {\n for (let i = str.length - 1; i > 0; i--) {\n if (str[i] === '>' || str[i] === '<') return str[i];\n }\n return str[0] || '<';\n };\n // 光标位于行末或单词末尾\n if (ch === line.length || (line.length > ch + 1 && (/S/.test(line[ch]) || line[ch] === '<'))) {\n let i;\n for (i = ch - 1; i >= 0; i--) {\n if (/S/.test(line[i]) || (line[i] === '>' && getNearTagChar(line.slice(0, i)) === '<')) {\n break;\n }\n }\n return [line.slice(i + 1, ch), i + 1];\n }\n return ['', 0];\n}\n\nfunction debounce(fn: any, delay = 1000) {\n let timer: any;\n return function (this: any) {\n const context = this;\n const args = arguments;\n clearTimeout(timer);\n timer = setTimeout(function () {\n fn.apply(context, args);\n }, delay);\n };\n}\n\nexport default {\n name: 'CodeEditor',\n props: {\n editorValue: {\n type: String,\n default: '',\n },\n mode: {\n type: String as PropType<modeType>,\n required: true,\n default: 'javascript',\n },\n lineWrapping: {\n type: Boolean,\n default: true,\n },\n options: {\n type: Object,\n default: () => {\n return {\n lineNumbers: true,\n line: true,\n indentUnit: 2,\n lineWidth: 4,\n lineColor: '#b99944',\n immediate: true,\n };\n },\n },\n },\n setup(props: any, context: any) {\n let cmInstance: any;\n const code_edit_id: string = 'code_edit_id' + new Date().getTime();\n\n const initCodeMirror = async () => {\n const editor = document.getElementById(code_edit_id);\n let word: string, wordIndex: number;\n\n await loadMode(props.mode);\n\n const extraKeys = {\n 'Ctrl-Space': 'autocomplete',\n };\n\n cmInstance = window.CodeMirror.fromTextArea(editor as HTMLTextAreaElement, {\n ...props.options,\n extraKeys,\n hintOptions: {\n // tables: {\n // users: ['name', 'score', 'birthDate'],\n // countries: ['name', 'population', 'size'],\n // },\n },\n lineWrapping: props.lineWrapping,\n });\n\n cmInstance.setOption('mode', props.mode);\n cmInstance.setOption('theme', 'material-darker');\n cmInstance.setValue(props.editorValue || '');\n\n cmInstance.on('change', (coder: any) => {\n if (props.mode === 'htmlmixed' || props.mode === 'css' || props.mode === 'xml') {\n // HTML模式下使用Emmet\n const { line: lineIndex, ch } = coder.getCursor();\n const line = coder.getLine(lineIndex);\n const wordResult = getWord(line, ch);\n word = wordResult[0];\n wordIndex = wordResult[1];\n }\n context.emit('update:editorValue', coder.getValue());\n });\n\n cmInstance.on(\n 'change',\n debounce(() => {\n context.emit('debounce-update');\n }, 5000) as (instance: any) => void,\n );\n\n // Autocomplete on input\n cmInstance.on('inputRead', (cm: any, change: any) => {\n if (cm.state.completionActive || change.origin === '+delete' || change.origin === 'paste') {\n return;\n }\n // Show hint for normal typing\n const NON_SPECIAL_CHARS = /^[a-zA-Z0-9_.]*$/;\n if (NON_SPECIAL_CHARS.test(change.text[0])) {\n cm.showHint({ completeSingle: false });\n }\n });\n\n if (props.mode === 'htmlmixed' || props.mode === 'css' || props.mode === 'xml') {\n const currentExtraKeys = cmInstance.getOption('extraKeys');\n cmInstance.setOption('extraKeys', {\n ...currentExtraKeys,\n Tab: function (coder: any) {\n const indent = coder.getOption('indentUnit') || 2;\n const spaces = Array(indent + 1).join(' ');\n if (!word) {\n coder.replaceSelection(spaces);\n } else {\n try {\n const typeMap: any = {\n htmlmixed: 'markup',\n css: 'stylesheet',\n xml: 'markup',\n };\n const emmet = expand(word, { type: typeMap[props.mode] });\n const { line, ch } = coder.getCursor();\n coder.setSelection({ line, ch }, { line, ch: wordIndex });\n const formatterEmmet = emmet\n .split('\\n')\n .map((line: string, index: number) => {\n if (index > 0) {\n line = line.replace(/\\t/g, spaces);\n line = Array(wordIndex + 1).join(' ') + line;\n }\n return line;\n })\n .join('\\n');\n coder.replaceSelection(formatterEmmet);\n } catch (e) {\n console.error(e);\n coder.replaceSelection(spaces);\n }\n }\n },\n });\n }\n };\n\n onMounted(async () => {\n try {\n if (!(window as any).CodeMirror) {\n // First time loading: fetch all assets in the correct order.\n await Promise.all([\n loadStyle(`${get_CODEMIRROR_BASE_URL()}/lib/codemirror.css`),\n loadStyle(`${get_CODEMIRROR_BASE_URL()}/theme/material-darker.css`),\n loadStyle(`${get_CODEMIRROR_BASE_URL()}/addon/hint/show-hint.css`),\n ]);\n await loadScript(`${get_CODEMIRROR_BASE_URL()}/lib/codemirror.js`);\n await Promise.all([\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/show-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/anyword-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/xml-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/sql-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/javascript-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/css-hint.js`),\n loadScript(`${get_CODEMIRROR_BASE_URL()}/addon/hint/html-hint.js`),\n ]);\n }\n\n await initCodeMirror();\n\n await new Promise((resolve, reject) => {\n setTimeout(() => {\n resolve(null);\n }, 500);\n });\n if (cmInstance) {\n cmInstance.refresh();\n }\n } catch (error) {\n console.error('Failed to load CodeMirror assets:', error);\n }\n });\n\n onUnmounted(() => {\n if (cmInstance) {\n cmInstance.toTextArea();\n cmInstance = null;\n }\n });\n\n watch(\n () => props.mode,\n async val => {\n if (cmInstance) {\n await loadMode(val);\n cmInstance.setOption('mode', val);\n }\n },\n );\n\n watch(\n () => props.editorValue,\n async newValue => {\n if (cmInstance && newValue !== cmInstance.getValue()) {\n cmInstance.setValue(newValue || '');\n }\n },\n );\n\n return {\n code_edit_id,\n handleCodeMirrorRefresh() {\n if (cmInstance) {\n cmInstance.refresh();\n }\n },\n };\n },\n};\n</script>\n<style>\n.CodeMirror {\n height: 300px !important;\n font-size: 15px !important;\n font-family: Monaco, MonoSpace;\n line-height: 1.4 !important;\n}\n\n.CodeMirror-lines {\n padding: 4px 0;\n min-height: 1px; /* Ensure line measure div is not collapsed */\n}\n\n.CodeMirror-hints {\n position: absolute;\n z-index: 9999 !important;\n overflow: hidden;\n list-style: none;\n margin: 0 0 0 5px; /* Add a 5px offset to the left */\n padding: 2px;\n box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);\n border-radius: 3px;\n border: 1px solid #555; /* A softer border for the theme */\n background: #2d2d2d;\n font-size: 100%;\n font-family: monospace;\n max-height: 20em;\n overflow-y: auto;\n}\n\n.CodeMirror-hint {\n margin: 0;\n padding: 0 4px;\n border-radius: 2px;\n white-space: pre;\n color: white;\n cursor: pointer;\n}\n\nli.CodeMirror-hint-active {\n background: #08f;\n color: white;\n}\n</style>\n","<template>\n <a-tree-select\n v-model:search-value=\"searchValue\"\n v-model:value=\"modalRef.selectedRows\"\n size=\"small\"\n style=\"min-width: 150px\"\n :placeholder=\"placeholder\"\n :dropdownMatchSelectWidth=\"false\"\n :disabled=\"field.disabled\"\n :default-value=\"field.defaultValue\"\n :allow-clear=\"field.allowClear !== false\"\n :tree-data=\"modalRef.datasource\"\n :multiple=\"field.multiple\"\n :tree-node-filter-prop=\"labelKey\"\n :tree-label-prop=\"labelKey\"\n :dropdownStyle=\"{ maxHeight: '400px' }\"\n @change=\"handleChange\"\n @mouseenter=\"handleMouseenter\"\n :show-search=\"true\"\n >\n <template #title=\"value\">\n <template\n v-for=\"(fragment, i) in value[labelKey || 'name']\n ?.toString()\n .split(new RegExp(`(?<=${searchValue})|(?=${searchValue})`, 'i'))\"\n >\n <span\n v-if=\"fragment.toLowerCase() === searchValue.toLowerCase()\"\n :key=\"i\"\n style=\"color: #08c\"\n >\n {{ fragment }}\n </span>\n <template v-else>{{ fragment }}</template>\n </template>\n </template>\n </a-tree-select>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, reactive, watch, onMounted, onUnmounted, ref } from 'vue';\nimport type { ReponseData } from 'liyu-pc-base/utils/hooks/useFetchData';\nimport { convertValueByClassName, isNotEmpty } from 'liyu-pc-base/utils/function';\nimport { debounce, isArray } from 'lodash-es';\nimport { getApiData } from 'liyu-pc-base/api/api-model';\nimport { useRequiredConditionStore, required_condition_event_obj } from 'liyu-pc-base/init-plugin';\n\nexport default defineComponent({\n name: 'RemoteTreeSelectPro',\n props: {\n field: {\n type: Object,\n required: true,\n },\n value: {\n type: [Array, Number, String],\n required: false,\n default: () => null,\n },\n valueKey: {\n type: String,\n },\n labelKeyType: {\n type: Number,\n default: () => 1,\n },\n labelKey: {\n type: String,\n },\n labelSpace: {\n type: String,\n default: '-',\n },\n labelKeyList: {\n type: Array,\n },\n search_config: {\n type: Object,\n required: false,\n default: () => {},\n },\n label: {\n type: [Array, String],\n required: false,\n },\n formModel: {\n type: Object,\n required: true,\n },\n outModel: {\n required: false,\n },\n placeholder: {\n type: String,\n },\n init_model: {\n type: Object,\n default: () => {},\n },\n init_watch: {\n // 普通查询监听字段 {监听key: 传参key}\n type: Object,\n default: () => {},\n },\n is_form_design: {\n type: Boolean,\n default: () => false,\n },\n },\n emits: ['update:value', 'update:label'],\n setup(props, { emit }) {\n const searchValue = ref('');\n const requiredConditionStore = useRequiredConditionStore();\n const modalRef: any = reactive({\n selectedRows: props.field.multiple ? [] : null,\n datasource: [],\n baseData: null,\n });\n let is_refresh = false; // 是否触发刷新\n const getSelectedRows = (value: any) => {\n if (value) {\n if (props.field.multiple) {\n modalRef.selectedRows = [];\n if (isArray(value)) {\n value.forEach((item: any) => {\n modalRef.selectedRows.push(item);\n });\n } else {\n modalRef.selectedRows.push(value);\n }\n } else {\n if (isArray(value)) {\n if (value?.length > 0) {\n modalRef.selectedRows = value[0];\n } else {\n modalRef.selectedRows = null;\n }\n } else {\n modalRef.selectedRows = value;\n }\n }\n } else {\n if (props.field.multiple) {\n modalRef.selectedRows = [];\n } else {\n modalRef.selectedRows = null;\n }\n }\n };\n getSelectedRows(props.value);\n const getTreeData = (res: any) => {\n const result = [...res.data];\n // 递归排序函数\n function dataChildren(nodes) {\n nodes.forEach(node => {\n node.key = node[get_value_key()];\n node.value = node[get_value_key()];\n if (props.labelKeyList && props.labelKeyList.length > 0 && props.labelKeyType == 2) {\n const label = [];\n for (const key of props.labelKeyList) {\n label.push(node[key as string]);\n }\n node.title = label.join(props.labelSpace);\n } else {\n node.title = node[get_label_key()];\n }\n if (node?.children && node.children.length > 0) {\n dataChildren(node.children); // 递归排序子节点\n } else {\n delete node.children;\n }\n });\n }\n dataChildren(result); // 然后递归地对每个根节点的子节点排序\n modalRef.datasource = result;\n };\n const get_value_key = () => {\n return props.valueKey ? (props.valueKey as string) : 'id';\n };\n const get_label_key = () => {\n return props.labelKey ? (props.labelKey as string) : 'name';\n };\n const getConditionsItem = (value: any, list: any, item: any) => {\n if (item.operator === 'not_blank_not_null') {\n list.push({\n field_name: item.field_name,\n operator: item.operator,\n value: [],\n format: item.format,\n class_name: item.class_name,\n });\n } else if (value instanceof Array) {\n const [first] = value;\n if (isNotEmpty(first)) {\n list.push({\n field_name: item.field_name,\n operator: item.operator,\n value: convertValueByClassName(value, item.class_name),\n format: item.format,\n class_name: item.class_name,\n });\n }\n } else if (isNotEmpty(value)) {\n let val = value;\n if (item.operator === 'in' || item.operator === 'notin') {\n if (value.includes('[')) {\n val = JSON.parse(value);\n } else if (value.includes(',')) {\n val = value.split(',');\n }\n if (item.class_name === 'int') {\n val = val.map(Number);\n }\n }\n list.push({\n field_name: item.field_name,\n operator: item.operator,\n value: convertValueByClassName(val instanceof Array ? val : [val], item.class_name),\n format: item.format,\n class_name: item.class_name,\n });\n }\n };\n /**\n * searchType === 1 时按 key 同时处理 outModel 与 formModel:\n * outModel 中该字段有值(非 undefined / null)时优先,否则回退 formModel 的同名字段。\n * 不能用 `outModel ? outModel : formModel` 做对象级二选一(outModel 默认为 {} 恒为真值)。\n */\n const resolveModelValue = (selectName: any): { found: boolean; value: any } => {\n if (\n props.outModel &&\n Object.prototype.hasOwnProperty.call(props.outModel, selectName) &&\n props.outModel[selectName] !== undefined &&\n props.outModel[selectName] !== null\n ) {\n return { found: true, value: props.outModel[selectName] };\n }\n if (props.formModel && Object.prototype.hasOwnProperty.call(props.formModel, selectName)) {\n return { found: true, value: props.formModel[selectName] };\n }\n return { found: false, value: undefined };\n };\n const getConditions = () => {\n const conditions = [];\n let search_conditions = [\n [\n {\n searchType: 3,\n field_name: 'is_active',\n operator: 'eq',\n value: [true],\n format: 'choices',\n class_name: 'bool',\n },\n ],\n ];\n if (props.field.searchConditions) {\n search_conditions = props.field.searchConditions;\n }\n search_conditions.forEach((item: any) => {\n const list = [];\n item.forEach((item1: any) => {\n if (item1.searchType === 1) {\n // outModel 优先、formModel 兜底,两者同时参与查找\n const resolved = resolveModelValue(item1.select_name);\n if (resolved.found) {\n getConditionsItem(resolved.value, list, item1);\n }\n } else if (item1.searchType === 2) {\n Object.keys(props.formModel).forEach((key: any) => {\n if (item1.select_name == key) {\n getConditionsItem(props.formModel[key], list, item1);\n }\n });\n } else {\n getConditionsItem(item1.value, list, item1);\n }\n });\n conditions.push(list);\n });\n return conditions;\n };\n const getSimpleSearchParams = () => {\n const params = {};\n if (props.field.simpleSearchConditions) {\n props.field.simpleSearchConditions.forEach((item: any) => {\n if (item.searchType === 1) {\n // outModel 优先、formModel 兜底,两者同时参与查找\n const resolved = resolveModelValue(item.select_name);\n if (resolved.found) {\n params[item.field_name] = resolved.value;\n }\n } else if (item.searchType === 3) {\n params[item.field_name] = item.value;\n }\n });\n return params;\n }\n };\n const searchConfig: any = {\n current: 1,\n pageSize: 2000,\n is_pagination: true,\n is_active: true,\n ...props.init_model, // 普通查询条件\n column_fields: [],\n conditions: [],\n simpleSearchParams: {},\n };\n if (props.field.queryType === 'simple') {\n searchConfig.simpleSearchParams = getSimpleSearchParams();\n } else {\n searchConfig.conditions = getConditions();\n }\n const getColumnFields = () => {\n const list = [];\n if (props.labelKeyType == 2) {\n list.push(get_value_key(), ...props.labelKeyList);\n } else {\n list.push(get_value_key(), get_label_key());\n }\n searchConfig.column_fields = [].concat(list);\n };\n getColumnFields();\n const getLabelFromDatasource = (datasource: Array<any>) => {\n const labelList: Array<string> = [];\n datasource.forEach((item: any) => {\n if (modalRef.selectedRows instanceof Array && modalRef.selectedRows.includes(item.key)) {\n labelList.push(item.title);\n }\n if (!(modalRef.selectedRows instanceof Array) && modalRef.selectedRows == item.key) {\n labelList.push(item.title);\n }\n if (item.children && item.children.length > 0) {\n getLabelFromDatasource(item.children).forEach(obj => labelList.push(obj));\n }\n });\n return labelList;\n };\n\n const handleChange = () => {\n emit('update:value', modalRef.selectedRows);\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n };\n\n watch(\n () => props.formModel[props.field.name],\n () => {\n getSelectedRows(props.formModel[props.field.name]);\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n },\n );\n const getRequiredConditionObj = () => {\n const required_condition = props.field.required_condition;\n const required_condition_obj = {};\n if (required_condition) {\n required_condition.forEach((item: any) => {\n const value = requiredConditionStore.value_map[item.key];\n if (value !== undefined && value !== null) {\n required_condition_obj[item.field_name] = value;\n }\n });\n }\n return required_condition_obj;\n };\n const refresh = () => {\n if (props.field.postUrl) {\n let params: any = {};\n if (props.field.queryType === 'simple') {\n params = {\n ...searchConfig.simpleSearchParams,\n required_condition: getRequiredConditionObj(),\n };\n } else {\n params = {\n ...searchConfig,\n ...props.search_config,\n required_condition: getRequiredConditionObj(),\n };\n delete params.simpleSearchParams;\n }\n getApiData(\n params,\n props.field.postUrl.replace('__tree', ''),\n props.field.postUrl.includes('__tree'),\n ).then(function (res: ReponseData<any>) {\n // console.log('res', res.data);\n modalRef.baseData = res;\n getTreeData(modalRef.baseData);\n getSelectedRows(modalRef.selectedRows);\n if (!props.is_form_design) {\n if (props.field.defaultValueType === 'first') {\n if (!modalRef.selectedRows || modalRef.selectedRows.length === 0) {\n if (!props.field.multiple) {\n modalRef.selectedRows = modalRef.datasource[0].value;\n } else {\n modalRef.selectedRows = [modalRef.datasource[0].value];\n }\n }\n } else if (props.field.defaultValueType === 'global') {\n if (!modalRef.selectedRows || modalRef.selectedRows.length === 0) {\n const globalDefaultKey = props.field.globalDefaultKey;\n const globalDefaultField = props.field.globalDefaultField;\n const globalDefaultValue = requiredConditionStore.value_map[globalDefaultKey];\n console.log('globalDefaultValue', globalDefaultValue);\n if (globalDefaultValue) {\n const globalDefaultItem = findDataItem(\n res.data,\n globalDefaultField,\n globalDefaultValue,\n );\n if (globalDefaultItem) {\n if (!props.field.multiple) {\n modalRef.selectedRows = globalDefaultItem[get_value_key()];\n } else {\n modalRef.selectedRows = [globalDefaultItem[get_value_key()]];\n }\n }\n }\n }\n }\n }\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n emit('update:value', modalRef.selectedRows);\n });\n }\n };\n const findDataItem = (rawDataList: any, key: string, value: any) => {\n for (const rawData of rawDataList) {\n if (rawData[key] === value) {\n return rawData;\n }\n if (rawData.children) {\n const result = findDataItem(rawData.children, key, value);\n if (result) {\n return result;\n }\n }\n }\n return null;\n };\n const debounce1: any = debounce(() => {\n refresh();\n }, 1000);\n const handleMouseenter = () => {\n if (is_refresh) {\n is_refresh = false;\n refresh();\n }\n };\n watch(\n // outModel 参与 searchType===1 的取值(见 resolveModelValue),必须一并监听:\n // 否则外部模型变化时查询条件不会重建。下方 JSON.stringify(searchConfig) 比对会挡住\n // 参数未变化时的重复刷新,不会多打请求。\n () => [props.formModel, props.outModel],\n () => {\n const oldSearch = JSON.stringify(searchConfig);\n if (props.field.queryType === 'simple') {\n searchConfig.simpleSearchParams = getSimpleSearchParams();\n } else {\n searchConfig.conditions = getConditions();\n }\n if (props.init_watch) {\n Object.keys(props.init_watch).forEach((key: any) => {\n searchConfig[props.init_watch[key]] = props.formModel[key];\n });\n }\n if (oldSearch == JSON.stringify(searchConfig)) {\n return;\n } else {\n debounce1();\n }\n },\n { deep: true },\n );\n watch(\n () => [\n props.field.searchConditions,\n props.field.queryType,\n props.field.simpleSearchConditions,\n ],\n () => {\n if (props.field.queryType === 'simple') {\n searchConfig.simpleSearchParams = getSimpleSearchParams();\n } else {\n searchConfig.conditions = getConditions();\n }\n is_refresh = true;\n },\n { deep: true },\n );\n watch(\n () => [\n props.labelKeyList,\n props.labelKey,\n props.labelKeyType,\n props.valueKey,\n props.labelSpace,\n ],\n () => {\n getTreeData(modalRef.baseData);\n },\n { deep: true },\n );\n watch(\n () => props.field.multiple,\n () => {\n getSelectedRows(modalRef.selectedRows);\n emit('update:value', modalRef.selectedRows);\n },\n );\n watch(\n () => props.field.postUrl,\n () => {\n is_refresh = true;\n },\n );\n const handleRequiredConditionChange = (key: string) => {\n if (props.field.required_condition) {\n const item = props.field.required_condition.find((item: any) => item.key === key);\n if (item) {\n debounce1();\n }\n }\n };\n onMounted(() => {\n required_condition_event_obj().on('required_condition_change', handleRequiredConditionChange);\n refresh();\n });\n onUnmounted(() => {\n required_condition_event_obj().off(\n 'required_condition_change',\n handleRequiredConditionChange,\n );\n });\n return {\n props,\n modalRef,\n handleChange,\n handleMouseenter,\n searchValue,\n };\n },\n\n data() {\n return {\n model: this.value,\n };\n },\n});\n</script>\n","<template>\n <a-tree-select\n v-model:search-value=\"searchValue\"\n v-model:value=\"modalRef.selectedRows\"\n size=\"small\"\n style=\"min-width: 150px\"\n :placeholder=\"placeholder\"\n :dropdownMatchSelectWidth=\"false\"\n :disabled=\"field.disabled\"\n :default-value=\"field.defaultValue\"\n :allow-clear=\"field.allowClear !== false\"\n :tree-data=\"modalRef.datasource\"\n :multiple=\"field.multiple\"\n :tree-node-filter-prop=\"labelKey\"\n :tree-label-prop=\"labelKey\"\n :dropdownStyle=\"{ maxHeight: '400px' }\"\n @change=\"handleChange\"\n @mouseenter=\"handleMouseenter\"\n :show-search=\"true\"\n >\n <template #title=\"value\">\n <template\n v-for=\"(fragment, i) in value[labelKey || 'name']\n ?.toString()\n .split(new RegExp(`(?<=${searchValue})|(?=${searchValue})`, 'i'))\"\n >\n <span\n v-if=\"fragment.toLowerCase() === searchValue.toLowerCase()\"\n :key=\"i\"\n style=\"color: #08c\"\n >\n {{ fragment }}\n </span>\n <template v-else>{{ fragment }}</template>\n </template>\n </template>\n </a-tree-select>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, reactive, watch, onMounted, onUnmounted, ref } from 'vue';\nimport type { ReponseData } from 'liyu-pc-base/utils/hooks/useFetchData';\nimport { convertValueByClassName, isNotEmpty } from 'liyu-pc-base/utils/function';\nimport { debounce, isArray } from 'lodash-es';\nimport { getApiData } from 'liyu-pc-base/api/api-model';\nimport { useRequiredConditionStore, required_condition_event_obj } from 'liyu-pc-base/init-plugin';\n\nexport default defineComponent({\n name: 'RemoteTreeSelectPro',\n props: {\n field: {\n type: Object,\n required: true,\n },\n value: {\n type: [Array, Number, String],\n required: false,\n default: () => null,\n },\n valueKey: {\n type: String,\n },\n labelKeyType: {\n type: Number,\n default: () => 1,\n },\n labelKey: {\n type: String,\n },\n labelSpace: {\n type: String,\n default: '-',\n },\n labelKeyList: {\n type: Array,\n },\n search_config: {\n type: Object,\n required: false,\n default: () => {},\n },\n label: {\n type: [Array, String],\n required: false,\n },\n formModel: {\n type: Object,\n required: true,\n },\n outModel: {\n required: false,\n },\n placeholder: {\n type: String,\n },\n init_model: {\n type: Object,\n default: () => {},\n },\n init_watch: {\n // 普通查询监听字段 {监听key: 传参key}\n type: Object,\n default: () => {},\n },\n is_form_design: {\n type: Boolean,\n default: () => false,\n },\n },\n emits: ['update:value', 'update:label'],\n setup(props, { emit }) {\n const searchValue = ref('');\n const requiredConditionStore = useRequiredConditionStore();\n const modalRef: any = reactive({\n selectedRows: props.field.multiple ? [] : null,\n datasource: [],\n baseData: null,\n });\n let is_refresh = false; // 是否触发刷新\n const getSelectedRows = (value: any) => {\n if (value) {\n if (props.field.multiple) {\n modalRef.selectedRows = [];\n if (isArray(value)) {\n value.forEach((item: any) => {\n modalRef.selectedRows.push(item);\n });\n } else {\n modalRef.selectedRows.push(value);\n }\n } else {\n if (isArray(value)) {\n if (value?.length > 0) {\n modalRef.selectedRows = value[0];\n } else {\n modalRef.selectedRows = null;\n }\n } else {\n modalRef.selectedRows = value;\n }\n }\n } else {\n if (props.field.multiple) {\n modalRef.selectedRows = [];\n } else {\n modalRef.selectedRows = null;\n }\n }\n };\n getSelectedRows(props.value);\n const getTreeData = (res: any) => {\n const result = [...res.data];\n // 递归排序函数\n function dataChildren(nodes) {\n nodes.forEach(node => {\n node.key = node[get_value_key()];\n node.value = node[get_value_key()];\n if (props.labelKeyList && props.labelKeyList.length > 0 && props.labelKeyType == 2) {\n const label = [];\n for (const key of props.labelKeyList) {\n label.push(node[key as string]);\n }\n node.title = label.join(props.labelSpace);\n } else {\n node.title = node[get_label_key()];\n }\n if (node?.children && node.children.length > 0) {\n dataChildren(node.children); // 递归排序子节点\n } else {\n delete node.children;\n }\n });\n }\n dataChildren(result); // 然后递归地对每个根节点的子节点排序\n modalRef.datasource = result;\n };\n const get_value_key = () => {\n return props.valueKey ? (props.valueKey as string) : 'id';\n };\n const get_label_key = () => {\n return props.labelKey ? (props.labelKey as string) : 'name';\n };\n const getConditionsItem = (value: any, list: any, item: any) => {\n if (item.operator === 'not_blank_not_null') {\n list.push({\n field_name: item.field_name,\n operator: item.operator,\n value: [],\n format: item.format,\n class_name: item.class_name,\n });\n } else if (value instanceof Array) {\n const [first] = value;\n if (isNotEmpty(first)) {\n list.push({\n field_name: item.field_name,\n operator: item.operator,\n value: convertValueByClassName(value, item.class_name),\n format: item.format,\n class_name: item.class_name,\n });\n }\n } else if (isNotEmpty(value)) {\n let val = value;\n if (item.operator === 'in' || item.operator === 'notin') {\n if (value.includes('[')) {\n val = JSON.parse(value);\n } else if (value.includes(',')) {\n val = value.split(',');\n }\n if (item.class_name === 'int') {\n val = val.map(Number);\n }\n }\n list.push({\n field_name: item.field_name,\n operator: item.operator,\n value: convertValueByClassName(val instanceof Array ? val : [val], item.class_name),\n format: item.format,\n class_name: item.class_name,\n });\n }\n };\n /**\n * searchType === 1 时按 key 同时处理 outModel 与 formModel:\n * outModel 中该字段有值(非 undefined / null)时优先,否则回退 formModel 的同名字段。\n * 不能用 `outModel ? outModel : formModel` 做对象级二选一(outModel 默认为 {} 恒为真值)。\n */\n const resolveModelValue = (selectName: any): { found: boolean; value: any } => {\n if (\n props.outModel &&\n Object.prototype.hasOwnProperty.call(props.outModel, selectName) &&\n props.outModel[selectName] !== undefined &&\n props.outModel[selectName] !== null\n ) {\n return { found: true, value: props.outModel[selectName] };\n }\n if (props.formModel && Object.prototype.hasOwnProperty.call(props.formModel, selectName)) {\n return { found: true, value: props.formModel[selectName] };\n }\n return { found: false, value: undefined };\n };\n const getConditions = () => {\n const conditions = [];\n let search_conditions = [\n [\n {\n searchType: 3,\n field_name: 'is_active',\n operator: 'eq',\n value: [true],\n format: 'choices',\n class_name: 'bool',\n },\n ],\n ];\n if (props.field.searchConditions) {\n search_conditions = props.field.searchConditions;\n }\n search_conditions.forEach((item: any) => {\n const list = [];\n item.forEach((item1: any) => {\n if (item1.searchType === 1) {\n // outModel 优先、formModel 兜底,两者同时参与查找\n const resolved = resolveModelValue(item1.select_name);\n if (resolved.found) {\n getConditionsItem(resolved.value, list, item1);\n }\n } else if (item1.searchType === 2) {\n Object.keys(props.formModel).forEach((key: any) => {\n if (item1.select_name == key) {\n getConditionsItem(props.formModel[key], list, item1);\n }\n });\n } else {\n getConditionsItem(item1.value, list, item1);\n }\n });\n conditions.push(list);\n });\n return conditions;\n };\n const getSimpleSearchParams = () => {\n const params = {};\n if (props.field.simpleSearchConditions) {\n props.field.simpleSearchConditions.forEach((item: any) => {\n if (item.searchType === 1) {\n // outModel 优先、formModel 兜底,两者同时参与查找\n const resolved = resolveModelValue(item.select_name);\n if (resolved.found) {\n params[item.field_name] = resolved.value;\n }\n } else if (item.searchType === 3) {\n params[item.field_name] = item.value;\n }\n });\n return params;\n }\n };\n const searchConfig: any = {\n current: 1,\n pageSize: 2000,\n is_pagination: true,\n is_active: true,\n ...props.init_model, // 普通查询条件\n column_fields: [],\n conditions: [],\n simpleSearchParams: {},\n };\n if (props.field.queryType === 'simple') {\n searchConfig.simpleSearchParams = getSimpleSearchParams();\n } else {\n searchConfig.conditions = getConditions();\n }\n const getColumnFields = () => {\n const list = [];\n if (props.labelKeyType == 2) {\n list.push(get_value_key(), ...props.labelKeyList);\n } else {\n list.push(get_value_key(), get_label_key());\n }\n searchConfig.column_fields = [].concat(list);\n };\n getColumnFields();\n const getLabelFromDatasource = (datasource: Array<any>) => {\n const labelList: Array<string> = [];\n datasource.forEach((item: any) => {\n if (modalRef.selectedRows instanceof Array && modalRef.selectedRows.includes(item.key)) {\n labelList.push(item.title);\n }\n if (!(modalRef.selectedRows instanceof Array) && modalRef.selectedRows == item.key) {\n labelList.push(item.title);\n }\n if (item.children && item.children.length > 0) {\n getLabelFromDatasource(item.children).forEach(obj => labelList.push(obj));\n }\n });\n return labelList;\n };\n\n const handleChange = () => {\n emit('update:value', modalRef.selectedRows);\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n };\n\n watch(\n () => props.formModel[props.field.name],\n () => {\n getSelectedRows(props.formModel[props.field.name]);\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n },\n );\n const getRequiredConditionObj = () => {\n const required_condition = props.field.required_condition;\n const required_condition_obj = {};\n if (required_condition) {\n required_condition.forEach((item: any) => {\n const value = requiredConditionStore.value_map[item.key];\n if (value !== undefined && value !== null) {\n required_condition_obj[item.field_name] = value;\n }\n });\n }\n return required_condition_obj;\n };\n const refresh = () => {\n if (props.field.postUrl) {\n let params: any = {};\n if (props.field.queryType === 'simple') {\n params = {\n ...searchConfig.simpleSearchParams,\n required_condition: getRequiredConditionObj(),\n };\n } else {\n params = {\n ...searchConfig,\n ...props.search_config,\n required_condition: getRequiredConditionObj(),\n };\n delete params.simpleSearchParams;\n }\n getApiData(\n params,\n props.field.postUrl.replace('__tree', ''),\n props.field.postUrl.includes('__tree'),\n ).then(function (res: ReponseData<any>) {\n // console.log('res', res.data);\n modalRef.baseData = res;\n getTreeData(modalRef.baseData);\n getSelectedRows(modalRef.selectedRows);\n if (!props.is_form_design) {\n if (props.field.defaultValueType === 'first') {\n if (!modalRef.selectedRows || modalRef.selectedRows.length === 0) {\n if (!props.field.multiple) {\n modalRef.selectedRows = modalRef.datasource[0].value;\n } else {\n modalRef.selectedRows = [modalRef.datasource[0].value];\n }\n }\n } else if (props.field.defaultValueType === 'global') {\n if (!modalRef.selectedRows || modalRef.selectedRows.length === 0) {\n const globalDefaultKey = props.field.globalDefaultKey;\n const globalDefaultField = props.field.globalDefaultField;\n const globalDefaultValue = requiredConditionStore.value_map[globalDefaultKey];\n console.log('globalDefaultValue', globalDefaultValue);\n if (globalDefaultValue) {\n const globalDefaultItem = findDataItem(\n res.data,\n globalDefaultField,\n globalDefaultValue,\n );\n if (globalDefaultItem) {\n if (!props.field.multiple) {\n modalRef.selectedRows = globalDefaultItem[get_value_key()];\n } else {\n modalRef.selectedRows = [globalDefaultItem[get_value_key()]];\n }\n }\n }\n }\n }\n }\n emit('update:label', getLabelFromDatasource(modalRef.datasource));\n emit('update:value', modalRef.selectedRows);\n });\n }\n };\n const findDataItem = (rawDataList: any, key: string, value: any) => {\n for (const rawData of rawDataList) {\n if (rawData[key] === value) {\n return rawData;\n }\n if (rawData.children) {\n const result = findDataItem(rawData.children, key, value);\n if (result) {\n return result;\n }\n }\n }\n return null;\n };\n const debounce1: any = debounce(() => {\n refresh();\n }, 1000);\n const handleMouseenter = () => {\n if (is_refresh) {\n is_refresh = false;\n refresh();\n }\n };\n watch(\n // outModel 参与 searchType===1 的取值(见 resolveModelValue),必须一并监听:\n // 否则外部模型变化时查询条件不会重建。下方 JSON.stringify(searchConfig) 比对会挡住\n // 参数未变化时的重复刷新,不会多打请求。\n () => [props.formModel, props.outModel],\n () => {\n const oldSearch = JSON.stringify(searchConfig);\n if (props.field.queryType === 'simple') {\n searchConfig.simpleSearchParams = getSimpleSearchParams();\n } else {\n searchConfig.conditions = getConditions();\n }\n if (props.init_watch) {\n Object.keys(props.init_watch).forEach((key: any) => {\n searchConfig[props.init_watch[key]] = props.formModel[key];\n });\n }\n if (oldSearch == JSON.stringify(searchConfig)) {\n return;\n } else {\n debounce1();\n }\n },\n { deep: true },\n );\n watch(\n () => [\n props.field.searchConditions,\n props.field.queryType,\n props.field.simpleSearchConditions,\n ],\n () => {\n if (props.field.queryType === 'simple') {\n searchConfig.simpleSearchParams = getSimpleSearchParams();\n } else {\n searchConfig.conditions = getConditions();\n }\n is_refresh = true;\n },\n { deep: true },\n );\n watch(\n () => [\n props.labelKeyList,\n props.labelKey,\n props.labelKeyType,\n props.valueKey,\n props.labelSpace,\n ],\n () => {\n getTreeData(modalRef.baseData);\n },\n { deep: true },\n );\n watch(\n () => props.field.multiple,\n () => {\n getSelectedRows(modalRef.selectedRows);\n emit('update:value', modalRef.selectedRows);\n },\n );\n watch(\n () => props.field.postUrl,\n () => {\n is_refresh = true;\n },\n );\n const handleRequiredConditionChange = (key: string) => {\n if (props.field.required_condition) {\n const item = props.field.required_condition.find((item: any) => item.key === key);\n if (item) {\n debounce1();\n }\n }\n };\n onMounted(() => {\n required_condition_event_obj().on('required_condition_change', handleRequiredConditionChange);\n refresh();\n });\n onUnmounted(() => {\n required_condition_event_obj().off(\n 'required_condition_change',\n handleRequiredConditionChange,\n );\n });\n return {\n props,\n modalRef,\n handleChange,\n handleMouseenter,\n searchValue,\n };\n },\n\n data() {\n return {\n model: this.value,\n };\n },\n});\n</script>\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { r as e } from "./rolldown-runtime-DY7j01NX.js";
|
|
2
2
|
import { t } from "./_plugin-vue_export-helper-B3ysoDQm.js";
|
|
3
3
|
import { t as n } from "./lodash-CMVwnWxD.js";
|
|
4
|
-
import { t as r } from "./FieldRender2-
|
|
4
|
+
import { t as r } from "./FieldRender2-_MtcDkI5.js";
|
|
5
5
|
import { Fragment as i, createBlock as a, createCommentVNode as o, createElementBlock as s, createElementVNode as c, createTextVNode as l, createVNode as u, openBlock as d, renderList as f, renderSlot as p, resolveComponent as m, toDisplayString as h, vShow as g, watch as _, withCtx as v, withDirectives as y } from "vue";
|
|
6
6
|
import b from "moment";
|
|
7
7
|
import { CloseOutlined as x, LeftOutlined as S, RightOutlined as C } from "@ant-design/icons-vue";
|