liyu-pc-base 1.0.430 → 1.0.435
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-DX_3D1eR.js → FieldRender-Ds_QtqKD.js} +1 -1
- package/dist/{FieldRender-DX_3D1eR.js.map → FieldRender-Ds_QtqKD.js.map} +1 -1
- package/dist/FieldRender-SVmUCvTe.js +2 -0
- package/dist/{FieldRender2-BQSvLYKn.js → FieldRender2-DHY0ICJK.js} +2 -2
- package/dist/{FieldRender2-BQSvLYKn.js.map → FieldRender2-DHY0ICJK.js.map} +1 -1
- package/dist/{FormRender3-D6C2qJy8.js → FormRender3-BPhDGwhF.js} +1 -1
- package/dist/{FormRender3-D6C2qJy8.js.map → FormRender3-BPhDGwhF.js.map} +1 -1
- package/dist/FormRender3-CnwkCg5U.js +2 -0
- package/dist/{RemoteSelectPro-ChIbw_Ht.js → RemoteSelectPro-DJC3JXiQ.js} +14 -9
- package/dist/RemoteSelectPro-DJC3JXiQ.js.map +1 -0
- package/dist/SearchRender-BOd8P7OK.js +2 -0
- package/dist/{SearchRender-e3xeNBz-.js → SearchRender-BWcOPC54.js} +1 -1
- package/dist/{SearchRender-e3xeNBz-.js.map → SearchRender-BWcOPC54.js.map} +1 -1
- package/dist/components/index.js +6 -6
- package/dist/index.js +1 -1
- package/dist/liyu-pc-base.css +1 -1
- package/dist/{tableModal-CEdsjOPz.js → tableModal-C4CzR3Jr.js} +5 -4
- package/dist/tableModal-C4CzR3Jr.js.map +1 -0
- package/dist/{tablePro-Cz8hKqFc.js → tablePro-BYIW028a.js} +1 -1
- package/dist/{tablePro-Cz8hKqFc.js.map → tablePro-BYIW028a.js.map} +1 -1
- package/dist/tablePro-OkI6nALn.js +2 -0
- package/package.json +1 -1
- package/dist/FieldRender-BrWvVr7V.js +0 -2
- package/dist/FormRender3-BQw-IS_M.js +0 -2
- package/dist/RemoteSelectPro-ChIbw_Ht.js.map +0 -1
- package/dist/SearchRender-DFPI72Xt.js +0 -2
- package/dist/tableModal-CEdsjOPz.js.map +0 -1
- package/dist/tablePro-BNSE6jv8.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tablePro-Cz8hKqFc.js","names":[],"sources":["../src/components/FormRender/SmallTableSerarchField.vue","../src/components/FormRender/SmallTableSerarchField.vue","../src/api/view-model.ts","../src/utils/dom.ts","../src/utils/hooks/useFullscreen.ts","../src/components/tablePro/utils.ts","../src/components/tablePro/searchSummary.vue","../src/components/tablePro/searchSummary.vue","../src/components/tablePro/tableConfig/searchConfig.vue","../src/components/tablePro/tableConfig/searchConfig.vue","../src/components/tablePro/search.vue","../src/components/tablePro/search.vue","../src/components/tablePro/TableFilterDropdown.vue","../src/components/tablePro/TableFilterDropdown.vue","../src/components/tablePro/tableConfig/columnsConfig.vue","../src/components/tablePro/tableConfig/columnsConfig.vue","../src/components/tablePro/hooks/view.ts","../src/components/tablePro/tableConfig/viewsConfig.vue","../src/components/tablePro/tableConfig/viewsConfig.vue","../src/components/tablePro/tableConfig/index.vue","../src/components/tablePro/tableConfig/index.vue","../src/components/tablePro/head_btn_confirm.ts","../src/components/tablePro/head_btn_custom_component.ts","../src/components/tablePro/head_btn_form.ts","../src/components/tablePro/headBtnChildren.vue","../src/components/tablePro/headBtnChildren.vue","../src/components/tablePro/headBtn.vue","../src/components/tablePro/headBtn.vue","../src/components/tablePro/refresh-type-modal/index.vue","../src/components/tablePro/refresh-type-modal/index.vue","../src/components/tablePro/tableHeader.vue","../src/components/tablePro/tableHeader.vue","../src/components/tablePro/TableSummary.vue","../src/components/tablePro/TableSummary.vue","../src/components/tablePro/TableContextMenu.vue","../src/components/tablePro/TableContextMenu.vue","../src/components/tablePro/tablePro.vue","../src/components/tablePro/tablePro.vue"],"sourcesContent":["<template>\n <template\n v-if=\"field.type !== 'divider' && (field?.is_search_show !== false || field_render_show)\"\n >\n <slot />\n <div\n v-if=\"field.type === 'kong'\"\n style=\"height: 62px; width: 200px\"\n ></div>\n <!-- 展示内容-->\n <div v-if=\"field.type === 'tag'\">\n <a-tag\n :color=\"field.color ? field.color(field, model) : 'green'\"\n :style=\"field.style\"\n v-if=\"(field.content && field.content(field, model)) || model\"\n @click=\"field.cb ? field.cb(field, model) : ''\"\n >\n <span v-if=\"field.content\">\n {{ field.content(field, model) }}\n </span>\n <span v-else>{{ model }}</span>\n </a-tag>\n </div>\n <!-- 表单占位组件-->\n <!-- 默认 【表单空位 高62px; 名称空位 高30px;】 如遇个别特殊表单,根据实际情况自行调节 高度-->\n <!-- height 属性必填-->\n <div\n v-if=\"field.type === 'kong_title'\"\n :style=\"'height: ' + field.height + 'px'\"\n ></div>\n <div\n v-if=\"field.type === 'title'\"\n style=\"height: 30px; position: relative\"\n >\n <span\n style=\"\n position: absolute;\n bottom: 0;\n padding: 0;\n margin: 0;\n font-weight: bolder;\n font-size: 17px;\n \"\n >\n {{ field.name }}\n </span>\n </div>\n <a-rate\n v-if=\"field.type === 'rate'\"\n v-model:value=\"model\"\n :disabled=\"field.disabled\"\n allow-half\n :style=\"`width: ${field_width}px`\"\n />\n <a-input\n v-if=\"field.type === 'input'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear == undefined ? true : field.allowClear\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :maxlength=\"field.maxlength\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请输入') + field.label\"\n :type=\"field.inputType ? field.inputType : 'text'\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <template\n v-if=\"field?.prefix || field?.prefixIcon\"\n #prefix\n >\n <span v-if=\"field?.prefix\">{{ field.prefix }}</span>\n <component\n v-if=\"field?.prefixIcon\"\n :is=\"field?.prefixIcon\"\n />\n </template>\n <template\n v-if=\"field?.suffix || field?.suffixIcon\"\n #suffix\n >\n <span v-if=\"field?.suffix\">{{ field.suffix }}</span>\n <component\n v-if=\"field?.suffixIcon\"\n :is=\"field?.suffixIcon\"\n />\n </template>\n <template\n v-if=\"field?.addonBefore || field?.addonBeforeIcon\"\n #addonBefore\n >\n <span v-if=\"field?.addonBefore\">{{ field.addonBefore }}</span>\n <component\n v-if=\"field?.addonBeforeIcon\"\n :is=\"field?.addonBeforeIcon\"\n />\n </template>\n <template\n v-if=\"field?.addonAfter || field?.addonAfterIcon\"\n #addonAfter\n >\n <span v-if=\"field?.addonAfter\">{{ field.addonAfter }}</span>\n <component\n v-if=\"field?.addonAfterIcon\"\n :is=\"field?.addonAfterIcon\"\n />\n </template>\n </a-input>\n\n <a-input-number\n v-if=\"field.type === 'money'\"\n size=\"small\"\n v-model:value=\"model\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :disabled=\"field.disabled\"\n :default-value=\"field.defaultValue\"\n :min=\"field.min\"\n :max=\"field.max\"\n :formatter=\"value => `${value}`.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\"\n :precision=\"field.precision\"\n :step=\"field.step\"\n :placeholder=\"\n field.placeholder_i18n == undefined ? field.placeholder : t(field.placeholder_i18n)\n \"\n :style=\"`width: ${field_width}px`\"\n />\n <a-input-number\n v-if=\"field.type === 'number'\"\n v-model:value=\"model\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :formatter=\"field.formatter\"\n :max=\"field.max\"\n :min=\"field.min\"\n :placeholder=\"field.placeholder ? field.placeholder : '请输入' + field.label\"\n :precision=\"field.precision\"\n :step=\"field.step\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <template\n v-if=\"field?.prefix || field?.prefixIcon\"\n #prefix\n >\n <span v-if=\"field?.prefix\">{{ field.prefix }}</span>\n <component\n v-if=\"field?.prefixIcon\"\n :is=\"field?.prefixIcon\"\n />\n </template>\n <template\n v-if=\"field?.suffix || field?.suffixIcon\"\n #suffix\n >\n <span v-if=\"field?.suffix\">{{ field.suffix }}</span>\n <component\n v-if=\"field?.suffixIcon\"\n :is=\"field?.suffixIcon\"\n />\n </template>\n <template\n v-if=\"field?.addonBefore || field?.addonBeforeIcon\"\n #addonBefore\n >\n <span v-if=\"field?.addonBefore\">{{ field.addonBefore }}</span>\n <component\n v-if=\"field?.addonBeforeIcon\"\n :is=\"field?.addonBeforeIcon\"\n />\n </template>\n <template\n v-if=\"field?.addonAfter || field?.addonAfterIcon\"\n #addonAfter\n >\n <span v-if=\"field?.addonAfter\">{{ field.addonAfter }}</span>\n <component\n v-if=\"field?.addonAfterIcon\"\n :is=\"field?.addonAfterIcon\"\n />\n </template>\n </a-input-number>\n\n <template v-if=\"field.type === 'select'\">\n <a-select\n v-if=\"field.mode === 'default'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :dropdownMatchSelectWidth=\"false\"\n :maxTagCount=\"field.maxTagCount ? field.maxTagCount : 'responsive'\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :show-search=\"!!field.show_search\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <a-select-option\n v-for=\"option in options\"\n :key=\"option[field.valueKey ? field.valueKey : 'value']\"\n :value=\"option[field.valueKey ? field.valueKey : 'value']\"\n >\n {{ option[field.labelKey ? field.labelKey : 'label'] }}\n </a-select-option>\n </a-select>\n <a-select\n v-else\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :dropdownMatchSelectWidth=\"false\"\n :maxTagCount=\"field.maxTagCount ? field.maxTagCount : 'responsive'\"\n :mode=\"field.mode\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :show-search=\"!!field.show_search\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <a-select-option\n v-for=\"(option, index) in options\"\n :key=\"index\"\n :value=\"option[field.valueKey ? field.valueKey : 'value']\"\n >\n {{ option[field.labelKey ? field.labelKey : 'label'] }}\n </a-select-option>\n </a-select>\n </template>\n <template v-if=\"field.type === 'groupselect'\">\n <a-select\n v-if=\"field.mode === 'default'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :dropdownMatchSelectWidth=\"false\"\n :getPopupContainer=\"field.getPopupContainer == undefined ? null : field.getPopupContainer\"\n :labelInValue=\"field.labelInValue === true\"\n :maxTagCount=\"field.maxTagCount ? field.maxTagCount : 'responsive'\"\n :options=\"options\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :show-search=\"!!field.show_search\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n ></a-select>\n <a-select\n v-else\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :dropdownMatchSelectWidth=\"false\"\n :getPopupContainer=\"field.getPopupContainer == undefined ? null : field.getPopupContainer\"\n :labelInValue=\"field.labelInValue === true\"\n :maxTagCount=\"field.maxTagCount ? field.maxTagCount : 'responsive'\"\n :mode=\"field.mode\"\n :options=\"options\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :show-search=\"!!field.show_search\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n ></a-select>\n </template>\n\n <a-cascader\n v-if=\"field.type === 'cascader'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :multiple=\"field.multiple\"\n :show-search=\"field.show_search\"\n :changeOnSelect=\"field.changeOnSelect ? field.changeOnSelect : false\"\n :options=\"field.getOptionsData ? field.getOptionsData(options, model) : options\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n\n <remote-cascader\n v-if=\"field.type === 'remotecascader'\"\n v-model:value=\"model\"\n v-model:label=\"labelModel\"\n :field=\"field\"\n :formModel=\"formModel\"\n :get-data=\"field.getData\"\n :label-key=\"field.labelKey\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-cascader-pro\n v-if=\"field.type === 'remotecascaderpro'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :field=\"field\"\n :formModel=\"formModel\"\n :outModel=\"outModel\"\n :get-data=\"field.getData\"\n :multiple=\"field.multiple\"\n :maxTagCount=\"field.maxTagCount ? field.maxTagCount : 'responsive'\"\n :show_search=\"field.show_search\"\n :label-key-type=\"field.labelKeyType\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :label-key=\"field.labelKey\"\n :value-key=\"field.valueKey\"\n :init_model=\"field.init_model\"\n :init_watch=\"field.init_watch\"\n :is_form_design=\"is_form_design\"\n :placeholder=\"\n field.placeholder_i18n == undefined\n ? field.placeholder\n ? field.placeholder\n : t('请选择') + field.label\n : t(field.placeholder_i18n)\n \"\n :style=\"`width: ${field_width}px`\"\n />\n\n <month-picker\n v-if=\"field.type === 'monthpicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n size=\"small\"\n :is_range=\"field.is_range\"\n :value_has_time=\"field.value_has_time\"\n :start_offset_day=\"field.start_offset_day\"\n :end_offset_day=\"field.end_offset_day\"\n :fix_day=\"field.fix_day\"\n :style=\"`width: ${field_width}px`\"\n />\n <a-date-picker\n v-if=\"field.type === 'datepicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :format=\"field.format\"\n :picker=\"field.picker\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :show-time=\"field.showTime\"\n :value-format=\"field.valueFormat\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n\n <a-range-picker\n v-if=\"field.type === 'rangepicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue || []\"\n :disabled=\"field.disabled\"\n :format=\"field.format\"\n :placeholder=\"\n field.placeholder && isArray(field.placeholder) && field.placeholder.length > 0\n ? field.placeholder\n : [$t('开始时间'), $t('结束时间')]\n \"\n :show-time=\"field.showTime\"\n :value-format=\"field.valueFormat\"\n :picker=\"field.picker ? field.picker : 'date'\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n\n <month-range-picker\n v-if=\"field.type === 'monthrangepicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue || []\"\n :disabled=\"field.disabled\"\n :placeholder=\"field.placeholder\"\n size=\"small\"\n :is_range=\"field.is_range\"\n :value_has_time=\"field.value_has_time\"\n :start_offset_day=\"field.start_offset_day\"\n :end_offset_day=\"field.end_offset_day\"\n :fix_day=\"field.fix_day\"\n :style=\"`width: ${field_width}px`\"\n />\n\n <a-time-picker\n v-if=\"field.type === 'timepicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :format=\"field.format ? field.format : 'HH:mm'\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :value-format=\"field.valueFormat ? field.valueFormat : 'HH:mm'\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n <a-time-range-picker\n v-if=\"field.type === 'timerangepicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :format=\"field.format ? field.format : 'HH:mm'\"\n :placeholder=\"\n field.placeholder && isArray(field.placeholder) && field.placeholder.length > 0\n ? field.placeholder\n : [$t('开始时间'), $t('结束时间')]\n \"\n :value-format=\"field.valueFormat ? field.valueFormat : 'HH:mm'\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n <a-radio-group\n v-if=\"field.type === 'radio'\"\n v-model:value=\"model\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <a-radio\n v-for=\"option in options\"\n :key=\"option[field.valueKey ? field.valueKey : 'value']\"\n :disabled=\"option.disabled\"\n :value=\"option[field.valueKey ? field.valueKey : 'value']\"\n >\n {{ option[field.labelKey ? field.labelKey : 'label'] }}\n </a-radio>\n </a-radio-group>\n\n <a-checkbox-group\n v-if=\"field.type === 'checkbox'\"\n v-model:value=\"model\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <a-checkbox\n v-for=\"option in options\"\n :key=\"option[field.valueKey ? field.valueKey : 'value']\"\n :disabled=\"option.disabled\"\n :value=\"option[field.valueKey ? field.valueKey : 'value']\"\n >\n {{ option[field.labelKey ? field.labelKey : 'label'] }}\n </a-checkbox>\n </a-checkbox-group>\n\n <a-tree-select\n v-if=\"field.type === 'treeselect'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :dropdownMatchSelectWidth=\"false\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :multiple=\"field.multiple\"\n :tree-checkable=\"field.treeCheckable\"\n :tree-data=\"options\"\n :tree-label-prop=\"field.labelKey\"\n :tree-node-filter-prop=\"field.valueKey\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-filter-select\n v-if=\"field.type === 'remotefilterselect'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :field=\"field\"\n :formModel=\"formModel\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :label-key=\"field.labelKey\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-select\n v-if=\"field.type === 'remoteselect'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :field=\"field\"\n :formModel=\"formModel\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :label-key=\"field.labelKey\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-select-pro\n v-if=\"field.type === 'remoteselectpro'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :field=\"field\"\n :formModel=\"formModel\"\n :outModel=\"outModel\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :init_watch=\"field.init_watch\"\n :label-key=\"field.labelKey\"\n :label-key-type=\"field.labelKeyType\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :is_input=\"field.is_input\"\n :is_form_design=\"is_form_design\"\n :placeholder=\"\n field.placeholder_i18n == undefined\n ? field.placeholder\n ? field.placeholder\n : $t('请选择') + field.label\n : t(field.placeholder_i18n)\n \"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-complete\n v-if=\"field.type === 'remotecomplete'\"\n v-model:value=\"model\"\n :field=\"field\"\n :formModel=\"formModel\"\n :outModel=\"outModel\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :init_watch=\"field.init_watch\"\n :label-key=\"field.labelKey\"\n :label-key-type=\"field.labelKeyType\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :maxlength=\"field.maxlength\"\n :is_input=\"field.is_input\"\n :is_form_design=\"is_form_design\"\n :placeholder=\"\n field.placeholder_i18n == undefined\n ? field.placeholder\n ? field.placeholder\n : $t('请选择') + field.label\n : t(field.placeholder_i18n)\n \"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-tree-select\n v-if=\"field.type === 'remotetreeselect'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :field=\"field\"\n :formModel=\"formModel\"\n :get-data=\"field.getData\"\n :label-key=\"field.labelKey\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-tree-select-pro\n v-if=\"field.type === 'remotetreeselectpro'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :field=\"field\"\n :formModel=\"formModel\"\n :outModel=\"outModel\"\n :get-data=\"field.getData\"\n :multiple=\"field.multiple\"\n :search_config=\"field.search_config\"\n :label-key-type=\"field.labelKeyType\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :label-key=\"field.labelKey\"\n :value-key=\"field.valueKey\"\n :init_model=\"field.init_model\"\n :init_watch=\"field.init_watch\"\n :is_form_design=\"is_form_design\"\n :placeholder=\"\n field.placeholder_i18n == undefined\n ? field.placeholder\n ? field.placeholder\n : $t('请选择') + field.label\n : t(field.placeholder_i18n)\n \"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-modal\n v-if=\"field.type === 'remotemodal'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :columns=\"field.columns\"\n :field=\"field\"\n :field_status=\"field.field_status\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :modalType=\"field.modalType\"\n :search_config=\"field.search_config\"\n :watch=\"field.watch\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-table\n v-if=\"field.type === 'remotetable'\"\n v-model:value=\"model\"\n :columns=\"field.columns\"\n :formModel=\"formModel\"\n :field=\"field\"\n :field_status=\"field.field_status\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :modalType=\"field.modalType\"\n :search_config=\"field.search_config\"\n :watch=\"field.watch\"\n :style=\"`width: ${field_width}px`\"\n />\n\n <remote-text\n v-if=\"field.type === 'remotetext'\"\n v-model:value=\"model\"\n :columns=\"field.columns\"\n :formModel=\"formModel\"\n :field=\"field\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :modalType=\"field.modalType\"\n :search_config=\"field.search_config\"\n :watch=\"field.watch\"\n />\n\n <a-rate\n v-if=\"field.type === 'rate'\"\n v-model:value=\"model\"\n :count=\"field.count ? field.count : 5\"\n :allow-half=\"field.allowHalf\"\n :style=\"`width: ${field_width}px`\"\n />\n <a-radio-group\n v-if=\"field.type === 'radio-color'\"\n v-model:value=\"model\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <a-radio\n v-for=\"option in options\"\n :key=\"option[field.valueKey ? field.valueKey : 'value']\"\n :disabled=\"option.disabled\"\n :value=\"option[field.valueKey ? field.valueKey : 'value']\"\n >\n <div\n :style=\"{\n width: '20px',\n height: '20px',\n backgroundColor: option[field.valueKey ? field.valueKey : 'value'],\n }\"\n ></div>\n </a-radio>\n </a-radio-group>\n </template>\n\n <a-divider\n v-if=\"field.type === 'divider'\"\n :orientation=\"field.orientation\"\n >\n {{ field.label }}\n </a-divider>\n</template>\n<script lang=\"ts\">\nimport RemoteSelect from 'liyu-pc-base/components/FormRender/RemoteSelect/RemoteSelect.vue';\nimport RemoteCascader from 'liyu-pc-base/components/FormRender/RemoteCascader/RemoteCascader.vue';\nimport RemoteModal from 'liyu-pc-base/components/FormRender/RemoteModal/RemoteModal.vue';\nimport RemoteTreeSelect from 'liyu-pc-base/components/FormRender/RemoteTreeSelect/RemoteTreeSelect.vue';\nimport RemoteTable from 'liyu-pc-base/components/FormRender/RemoteTable/RemoteTable.vue';\nimport { defineComponent, watch, onMounted, ref } from 'vue';\nimport RemoteFilterSelect from 'liyu-pc-base/components/FormRender/RemoteFilterSelect/RemoteFilterSelect.vue';\nimport AttributeNomTable from 'liyu-pc-base/components/FormRender/AttributeNomTable/index.vue';\nimport AttributeTable from 'liyu-pc-base/components/FormRender/AttributeTable/index.vue';\nimport JsonStr from 'liyu-pc-base/components/FormRender/JsonStr/index.vue';\nimport JsonObj from 'liyu-pc-base/components/FormRender/JsonObj/index.vue';\nimport RemoteText from 'liyu-pc-base/components/FormRender/RemoteText/RemoteText.vue';\nimport RemoteTablePro from 'liyu-pc-base/components/FormRender/RemoteTablePro/RemoteTablePro.vue';\nimport { debounce, isArray, isEqual } from 'lodash-es';\nimport moment from 'moment';\nimport { isEmpty, isNotEmpty } from 'liyu-pc-base/utils/function';\nimport { PlusOutlined } from '@ant-design/icons-vue';\nimport RemoteSelectPro from 'liyu-pc-base/components/FormRender/RemoteSelectPro/RemoteSelectPro.vue';\nimport RemoteComplete from 'liyu-pc-base/components/FormRender/RemoteComplete/RemoteComplete.vue';\nimport RemoteTreeSelectPro from 'liyu-pc-base/components/FormRender/RemoteTreeSelectPro/RemoteTreeSelectPro.vue';\nimport RemoteCascaderPro from 'liyu-pc-base/components/FormRender/RemoteCascaderPro/RemoteCascaderPro.vue';\nimport Upload from 'liyu-pc-base/components/FormRender/Upload/upload.vue';\nimport RichTextEditor from 'liyu-pc-base/components/FormRender/RichTextEditor/index.vue';\nimport { useI18n } from 'vue-i18n';\nimport IconSelect from 'liyu-pc-base/components/FormRender/iconSelect/index.vue';\nimport MonthPicker from 'liyu-pc-base/components/FormRender/MonthPicker/index.vue';\nimport MonthRangePicker from 'liyu-pc-base/components/FormRender/MonthRangePicker/index.vue';\nimport CodeEditor from 'liyu-pc-base/components/code/CodeEditor.vue';\nimport TinymceEditor from 'liyu-pc-base/components/tinymce/TinymceEditor.vue';\n\nconst isValidDate = (dateString, format = 'YYYY-MM-DD') => {\n const date = moment(dateString, format, true);\n return date.isValid();\n};\nconst isValidDateTime = (dateString, format = 'YYYY-MM-DD HH:mm:ss') => {\n const date = moment(dateString, format, true);\n return date.isValid();\n};\nconst isValidTime = (dateString, format = 'HH:mm:ss') => {\n const date = moment(dateString, format, true);\n return date.isValid();\n};\nexport default defineComponent({\n name: 'FieldRender2',\n methods: { isArray },\n props: {\n field: {\n type: Object,\n required: true,\n },\n value: {\n required: true,\n },\n label: {\n required: false,\n },\n options: {\n type: Array,\n default: () => [],\n },\n validateInfos: {\n type: Object,\n default: () => {},\n },\n formModel: {\n type: Object,\n default: () => {},\n },\n outModel: {\n type: Object,\n default: () => {},\n },\n field_render_show: {\n type: Boolean,\n default: true,\n },\n is_show_label: {\n type: Boolean,\n default: true,\n },\n isUseConditions: {\n type: Boolean,\n default: true,\n },\n is_show_field: {\n type: Boolean,\n default: true,\n },\n is_edit: {\n type: Boolean,\n default: true,\n },\n conditionsVisibleNum: {\n type: Number,\n default: 0,\n },\n is_form_design: {\n type: Boolean,\n default: false,\n },\n field_width: {\n type: Number,\n default: 150,\n },\n },\n emits: [\n 'add',\n 'update:value',\n 'update:label',\n 'update_model',\n 'update:is_show_field',\n 'update:is_edit',\n 'update_name2',\n ],\n setup(props, { emit }) {\n const newModel = ref({ ...props.formModel });\n const rangeDate = (v: any) => {\n if (typeof v == 'string' && v.indexOf(',') >= 0) {\n return v.split(',');\n }\n return v;\n };\n const convertValueByClassName = (value, class_name) => {\n //class_name 'int','float',str','bool','date','datetime','time'\n let new_value;\n if (class_name == 'int') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isNotEmpty(item) && typeof item === 'string') {\n new_value.push(Number(item));\n } else {\n new_value.push(item);\n }\n });\n } else if (isNotEmpty(value) && typeof value === 'string') {\n new_value = Number(value);\n } else {\n new_value = value;\n }\n } else if (class_name == 'str') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isNotEmpty(item) && typeof item === 'number') {\n new_value.push(item.toString());\n } else {\n new_value.push(item);\n }\n });\n } else if (isNotEmpty(value) && typeof value === 'number') {\n new_value = value.toString();\n } else {\n new_value = value;\n }\n } else if (class_name == 'date') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isValidDate(item) && typeof item === 'string') {\n new_value.push(moment(item, 'YYYY-MM-DD'));\n } else {\n new_value.push(item);\n }\n });\n } else if (isValidDate(value) && typeof value === 'string') {\n new_value = value.toString();\n } else {\n new_value = value;\n }\n } else if (class_name == 'datetime') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isValidDateTime(item) && typeof item === 'string') {\n new_value.push(moment(item, 'YYYY-MM-DD HH:mm:ss'));\n } else {\n new_value.push(item);\n }\n });\n } else if (isValidDateTime(value) && typeof value === 'string') {\n new_value = moment(value, 'YYYY-MM-DD HH:mm:ss');\n } else {\n new_value = value;\n }\n } else if (class_name == 'time') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isValidTime(item) && typeof item === 'string') {\n new_value.push(moment(item, 'HH:mm:ss'));\n } else {\n new_value.push(item);\n }\n });\n } else if (isValidTime(value) && typeof value === 'string') {\n new_value = moment(value, 'HH:mm:ss');\n } else {\n new_value = value;\n }\n } else if (class_name == 'float') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isNotEmpty(item) && typeof item === 'string') {\n new_value.push(Number(item));\n } else {\n new_value.push(item);\n }\n });\n } else if (isNotEmpty(value) && typeof value === 'string') {\n new_value = Number(value);\n } else {\n new_value = value;\n }\n } else if (class_name == 'bool') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isNotEmpty(item) && typeof item === 'string') {\n new_value.push(Boolean(item));\n } else {\n new_value.push(item);\n }\n });\n } else if (isNotEmpty(value) && typeof value === 'string') {\n new_value = Boolean(value);\n } else {\n new_value = value;\n }\n }\n return new_value;\n };\n const is_show_field = ref(props.is_show_field);\n const is_edit = ref(false);\n const handleToggleEdit = () => {\n emit('update:is_edit', is_edit.value);\n };\n const handleAdd = () => {\n emit('add');\n };\n const check_visible_field_fun = debounce(() => {\n const old_is_show_field = is_show_field.value;\n const condition_result_list: any = [];\n for (const i in props.field?.conditions) {\n const group_list = props.field?.conditions[i];\n const group_results = [];\n for (const j in group_list) {\n const item = group_list[j];\n const value = props.formModel[item.watchKey];\n let new_value;\n if (item.class_name) {\n new_value = convertValueByClassName(item.value, item.class_name);\n } else {\n new_value = item.value;\n }\n let first, second;\n if (new_value instanceof Array) {\n [first, second] = new_value;\n }\n if (item.operator == 'lt') {\n if (typeof first === 'number') {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value < first) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (moment(value).isBefore(moment(first))) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'lte') {\n if (typeof first === 'number') {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value <= first) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (\n moment(value).isBefore(moment(first)) ||\n moment(value).isSame(moment(first))\n ) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'gt') {\n if (typeof first === 'number') {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value > first) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (moment(value).isAfter(moment(first))) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'gte') {\n if (typeof first === 'number') {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value >= first) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (\n moment(value).isAfter(moment(first)) ||\n moment(value).isSame(moment(first))\n ) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'between') {\n if (typeof first === 'number' && typeof second === 'number' && first && second) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value >= first && value <= second) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (\n (moment(value).isAfter(moment(first)) || moment(value).isSame(moment(first))) &&\n (moment(value).isBefore(moment(second)) || moment(value).isSame(moment(second)))\n ) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'notbetween') {\n if (typeof first === 'number' && typeof second === 'number' && first && second) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value < first || value > second) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (\n moment(value).isBefore(moment(first)) ||\n moment(value).isAfter(moment(second))\n ) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'in') {\n if (value instanceof Array) {\n const f_list = new_value.filter(x => {\n return value.includes(x);\n });\n if (f_list.length > 0) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (typeof value == 'string' || typeof value == 'number' || isEmpty(value)) {\n // 数字 字符串 空\n const f = new_value.find(x => {\n return value == x;\n });\n if (f) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'eq') {\n if (value === first) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'contains') {\n if (value.toString().indexOf(first) > -1) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'startswith') {\n if (value.toString().startsWith(first)) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'notin') {\n if (value instanceof Array) {\n const f_list = new_value.filter(x => {\n return value.includes(x);\n });\n if (f_list.length > 0) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (typeof value == 'string' || typeof value == 'number' || isEmpty(value)) {\n // 数字 字符串 空\n const f = new_value.find(x => {\n return value == x;\n });\n if (!f) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'notcontains') {\n if (value.toString().indexOf(first) == -1) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == '_eq') {\n //todo\n } else if (item.operator == 'json_list_not_blank_not_null') {\n // 非空\n if (value) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'json_list_is_blank_is_null') {\n //为空\n if (!value) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'not_eq') {\n //为空\n if (!value) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'not_blank_not_null') {\n // 非空\n if (value) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n }\n condition_result_list.push(group_results);\n }\n const con_list = [];\n condition_result_list.forEach(item => {\n const find_false_list = item.filter(x => x === false);\n if (find_false_list && find_false_list.length > 0) {\n con_list.push(false);\n } else {\n con_list.push(true);\n }\n });\n\n const find_true_list = con_list.filter(x => x === true);\n if (find_true_list && find_true_list.length > 0) {\n is_show_field.value = true;\n emit('update:is_show_field', is_show_field.value);\n } else {\n is_show_field.value = false;\n emit('update:is_show_field', is_show_field.value);\n }\n if (is_show_field.value !== old_is_show_field) {\n if (is_show_field.value) {\n newModel.value[props.field.name] = null;\n emit('update_model', {\n add_key: props.field.name,\n value: null,\n });\n } else {\n delete newModel.value[props.field.name];\n emit('update_model', {\n remove_key: props.field.name,\n });\n }\n }\n }, 300);\n const model = ref<any>('');\n const labelModel = ref(props.label);\n watch(\n () => model.value,\n (newValue, oldValue) => {\n if (isEqual(newValue, oldValue)) {\n return;\n }\n emit('update:value', newValue);\n if (props.field.name2) {\n let label: any;\n if (props.field.type === 'radio') {\n const obj = props.options.find(\n (item: any) =>\n item[props.field.valueKey ? props.field.valueKey : 'value'] == newValue,\n );\n label = obj?.[props.field.labelKey ? props.field.labelKey : 'label'];\n } else if (props.field.type === 'checkbox' && newValue && newValue.length >= 0) {\n const list = [];\n props.options.forEach((item: any) => {\n newValue.forEach((item1: any) => {\n if (item1 == item?.[props.field.valueKey ? props.field.valueKey : 'value']) {\n list.push(item?.[props.field.labelKey ? props.field.labelKey : 'label']);\n }\n });\n });\n label = list.toString();\n } else if (props.field.type === 'select') {\n if (isArray(newValue)) {\n const list = [];\n props.options.forEach((item: any) => {\n newValue.forEach((item1: any) => {\n if (item1 == item?.[props.field.valueKey ? props.field.valueKey : 'value']) {\n list.push(item?.[props.field.labelKey ? props.field.labelKey : 'label']);\n }\n });\n });\n label = list.toString();\n } else {\n const obj = props.options.find(\n (item: any) =>\n item[props.field.valueKey ? props.field.valueKey : 'value'] == newValue,\n );\n label = obj?.[props.field.labelKey ? props.field.labelKey : 'label'];\n }\n }\n emit('update_name2', {\n key: props.field.name2,\n value: label,\n });\n }\n },\n { deep: true },\n );\n watch(\n () => props.value,\n newValue => {\n let value = newValue;\n if (props.field.type === 'rangepicker' && value) {\n value = rangeDate(value);\n } else if (props.field.type === 'input' && value) {\n value = value.toString().replace(/(^\\s*)|(\\s*$)/g, '');\n }\n if (is_show_field.value) {\n //当该表单项显示时,才做向上的数据绑定,避免把undefined向上传递,影响rules字段的有效过滤\n model.value = value;\n }\n },\n { immediate: true },\n );\n watch(\n () => labelModel.value,\n newValue => {\n emit('update:label', newValue);\n if ('name2' in props.field) {\n emit('update_name2', { key: props.field.name2, value: newValue.toString() });\n }\n },\n { deep: true },\n );\n watch(\n () => props.label,\n newValue => {\n labelModel.value = newValue;\n },\n );\n watch(\n () => props.formModel,\n newValue => {\n newModel.value = { ...newValue };\n },\n { deep: true },\n );\n watch(\n () => newModel.value,\n (newValue, oldValue) => {\n if (props.field?.conditions) {\n props.field?.conditions.forEach(condition_list => {\n condition_list.forEach(item => {\n if (oldValue[item.watchKey] != newValue[item.watchKey]) {\n check_visible_field_fun();\n }\n });\n });\n }\n },\n { deep: true },\n );\n watch(\n () => [props.conditionsVisibleNum, props.isUseConditions],\n () => {\n if (props.field?.conditions) {\n if (props.isUseConditions) {\n check_visible_field_fun();\n } else {\n is_show_field.value = true;\n emit('update:is_show_field', is_show_field.value);\n }\n } else {\n is_show_field.value = true;\n emit('update:is_show_field', is_show_field.value);\n }\n },\n );\n onMounted(() => {\n if (props.field?.conditions instanceof Array && props.field?.conditions.length > 0) {\n check_visible_field_fun();\n } else {\n is_show_field.value = true;\n emit('update:is_show_field', is_show_field.value);\n }\n if (!is_show_field.value) {\n // 表单项所见即所得,如果有隐藏的字段,那么model的key也要清除\n delete newModel.value[props.field.name];\n emit('update_model', {\n remove_key: props.field.name,\n });\n }\n });\n const { t } = useI18n();\n return {\n t,\n is_show_field,\n is_edit,\n handleToggleEdit,\n rangeDate,\n handleAdd,\n model,\n labelModel,\n };\n },\n components: {\n IconSelect,\n RichTextEditor,\n Upload,\n RemoteCascaderPro,\n RemoteTreeSelectPro,\n RemoteSelectPro,\n RemoteComplete,\n AttributeTable,\n AttributeNomTable,\n RemoteFilterSelect,\n RemoteModal,\n RemoteSelect,\n RemoteCascader,\n RemoteTreeSelect,\n RemoteTable,\n JsonStr,\n JsonObj,\n RemoteText,\n RemoteTablePro,\n PlusOutlined,\n MonthPicker,\n MonthRangePicker,\n CodeEditor,\n TinymceEditor,\n },\n});\n</script>\n\n<style scoped>\n.ant-calendar-picker {\n width: 100% !important;\n}\n</style>\n","<template>\n <template\n v-if=\"field.type !== 'divider' && (field?.is_search_show !== false || field_render_show)\"\n >\n <slot />\n <div\n v-if=\"field.type === 'kong'\"\n style=\"height: 62px; width: 200px\"\n ></div>\n <!-- 展示内容-->\n <div v-if=\"field.type === 'tag'\">\n <a-tag\n :color=\"field.color ? field.color(field, model) : 'green'\"\n :style=\"field.style\"\n v-if=\"(field.content && field.content(field, model)) || model\"\n @click=\"field.cb ? field.cb(field, model) : ''\"\n >\n <span v-if=\"field.content\">\n {{ field.content(field, model) }}\n </span>\n <span v-else>{{ model }}</span>\n </a-tag>\n </div>\n <!-- 表单占位组件-->\n <!-- 默认 【表单空位 高62px; 名称空位 高30px;】 如遇个别特殊表单,根据实际情况自行调节 高度-->\n <!-- height 属性必填-->\n <div\n v-if=\"field.type === 'kong_title'\"\n :style=\"'height: ' + field.height + 'px'\"\n ></div>\n <div\n v-if=\"field.type === 'title'\"\n style=\"height: 30px; position: relative\"\n >\n <span\n style=\"\n position: absolute;\n bottom: 0;\n padding: 0;\n margin: 0;\n font-weight: bolder;\n font-size: 17px;\n \"\n >\n {{ field.name }}\n </span>\n </div>\n <a-rate\n v-if=\"field.type === 'rate'\"\n v-model:value=\"model\"\n :disabled=\"field.disabled\"\n allow-half\n :style=\"`width: ${field_width}px`\"\n />\n <a-input\n v-if=\"field.type === 'input'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear == undefined ? true : field.allowClear\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :maxlength=\"field.maxlength\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请输入') + field.label\"\n :type=\"field.inputType ? field.inputType : 'text'\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <template\n v-if=\"field?.prefix || field?.prefixIcon\"\n #prefix\n >\n <span v-if=\"field?.prefix\">{{ field.prefix }}</span>\n <component\n v-if=\"field?.prefixIcon\"\n :is=\"field?.prefixIcon\"\n />\n </template>\n <template\n v-if=\"field?.suffix || field?.suffixIcon\"\n #suffix\n >\n <span v-if=\"field?.suffix\">{{ field.suffix }}</span>\n <component\n v-if=\"field?.suffixIcon\"\n :is=\"field?.suffixIcon\"\n />\n </template>\n <template\n v-if=\"field?.addonBefore || field?.addonBeforeIcon\"\n #addonBefore\n >\n <span v-if=\"field?.addonBefore\">{{ field.addonBefore }}</span>\n <component\n v-if=\"field?.addonBeforeIcon\"\n :is=\"field?.addonBeforeIcon\"\n />\n </template>\n <template\n v-if=\"field?.addonAfter || field?.addonAfterIcon\"\n #addonAfter\n >\n <span v-if=\"field?.addonAfter\">{{ field.addonAfter }}</span>\n <component\n v-if=\"field?.addonAfterIcon\"\n :is=\"field?.addonAfterIcon\"\n />\n </template>\n </a-input>\n\n <a-input-number\n v-if=\"field.type === 'money'\"\n size=\"small\"\n v-model:value=\"model\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :disabled=\"field.disabled\"\n :default-value=\"field.defaultValue\"\n :min=\"field.min\"\n :max=\"field.max\"\n :formatter=\"value => `${value}`.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\"\n :precision=\"field.precision\"\n :step=\"field.step\"\n :placeholder=\"\n field.placeholder_i18n == undefined ? field.placeholder : t(field.placeholder_i18n)\n \"\n :style=\"`width: ${field_width}px`\"\n />\n <a-input-number\n v-if=\"field.type === 'number'\"\n v-model:value=\"model\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :formatter=\"field.formatter\"\n :max=\"field.max\"\n :min=\"field.min\"\n :placeholder=\"field.placeholder ? field.placeholder : '请输入' + field.label\"\n :precision=\"field.precision\"\n :step=\"field.step\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <template\n v-if=\"field?.prefix || field?.prefixIcon\"\n #prefix\n >\n <span v-if=\"field?.prefix\">{{ field.prefix }}</span>\n <component\n v-if=\"field?.prefixIcon\"\n :is=\"field?.prefixIcon\"\n />\n </template>\n <template\n v-if=\"field?.suffix || field?.suffixIcon\"\n #suffix\n >\n <span v-if=\"field?.suffix\">{{ field.suffix }}</span>\n <component\n v-if=\"field?.suffixIcon\"\n :is=\"field?.suffixIcon\"\n />\n </template>\n <template\n v-if=\"field?.addonBefore || field?.addonBeforeIcon\"\n #addonBefore\n >\n <span v-if=\"field?.addonBefore\">{{ field.addonBefore }}</span>\n <component\n v-if=\"field?.addonBeforeIcon\"\n :is=\"field?.addonBeforeIcon\"\n />\n </template>\n <template\n v-if=\"field?.addonAfter || field?.addonAfterIcon\"\n #addonAfter\n >\n <span v-if=\"field?.addonAfter\">{{ field.addonAfter }}</span>\n <component\n v-if=\"field?.addonAfterIcon\"\n :is=\"field?.addonAfterIcon\"\n />\n </template>\n </a-input-number>\n\n <template v-if=\"field.type === 'select'\">\n <a-select\n v-if=\"field.mode === 'default'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :dropdownMatchSelectWidth=\"false\"\n :maxTagCount=\"field.maxTagCount ? field.maxTagCount : 'responsive'\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :show-search=\"!!field.show_search\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <a-select-option\n v-for=\"option in options\"\n :key=\"option[field.valueKey ? field.valueKey : 'value']\"\n :value=\"option[field.valueKey ? field.valueKey : 'value']\"\n >\n {{ option[field.labelKey ? field.labelKey : 'label'] }}\n </a-select-option>\n </a-select>\n <a-select\n v-else\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :dropdownMatchSelectWidth=\"false\"\n :maxTagCount=\"field.maxTagCount ? field.maxTagCount : 'responsive'\"\n :mode=\"field.mode\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :show-search=\"!!field.show_search\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <a-select-option\n v-for=\"(option, index) in options\"\n :key=\"index\"\n :value=\"option[field.valueKey ? field.valueKey : 'value']\"\n >\n {{ option[field.labelKey ? field.labelKey : 'label'] }}\n </a-select-option>\n </a-select>\n </template>\n <template v-if=\"field.type === 'groupselect'\">\n <a-select\n v-if=\"field.mode === 'default'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :dropdownMatchSelectWidth=\"false\"\n :getPopupContainer=\"field.getPopupContainer == undefined ? null : field.getPopupContainer\"\n :labelInValue=\"field.labelInValue === true\"\n :maxTagCount=\"field.maxTagCount ? field.maxTagCount : 'responsive'\"\n :options=\"options\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :show-search=\"!!field.show_search\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n ></a-select>\n <a-select\n v-else\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :dropdownMatchSelectWidth=\"false\"\n :getPopupContainer=\"field.getPopupContainer == undefined ? null : field.getPopupContainer\"\n :labelInValue=\"field.labelInValue === true\"\n :maxTagCount=\"field.maxTagCount ? field.maxTagCount : 'responsive'\"\n :mode=\"field.mode\"\n :options=\"options\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :show-search=\"!!field.show_search\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n ></a-select>\n </template>\n\n <a-cascader\n v-if=\"field.type === 'cascader'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :multiple=\"field.multiple\"\n :show-search=\"field.show_search\"\n :changeOnSelect=\"field.changeOnSelect ? field.changeOnSelect : false\"\n :options=\"field.getOptionsData ? field.getOptionsData(options, model) : options\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n\n <remote-cascader\n v-if=\"field.type === 'remotecascader'\"\n v-model:value=\"model\"\n v-model:label=\"labelModel\"\n :field=\"field\"\n :formModel=\"formModel\"\n :get-data=\"field.getData\"\n :label-key=\"field.labelKey\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-cascader-pro\n v-if=\"field.type === 'remotecascaderpro'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :field=\"field\"\n :formModel=\"formModel\"\n :outModel=\"outModel\"\n :get-data=\"field.getData\"\n :multiple=\"field.multiple\"\n :maxTagCount=\"field.maxTagCount ? field.maxTagCount : 'responsive'\"\n :show_search=\"field.show_search\"\n :label-key-type=\"field.labelKeyType\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :label-key=\"field.labelKey\"\n :value-key=\"field.valueKey\"\n :init_model=\"field.init_model\"\n :init_watch=\"field.init_watch\"\n :is_form_design=\"is_form_design\"\n :placeholder=\"\n field.placeholder_i18n == undefined\n ? field.placeholder\n ? field.placeholder\n : t('请选择') + field.label\n : t(field.placeholder_i18n)\n \"\n :style=\"`width: ${field_width}px`\"\n />\n\n <month-picker\n v-if=\"field.type === 'monthpicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n size=\"small\"\n :is_range=\"field.is_range\"\n :value_has_time=\"field.value_has_time\"\n :start_offset_day=\"field.start_offset_day\"\n :end_offset_day=\"field.end_offset_day\"\n :fix_day=\"field.fix_day\"\n :style=\"`width: ${field_width}px`\"\n />\n <a-date-picker\n v-if=\"field.type === 'datepicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :format=\"field.format\"\n :picker=\"field.picker\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :show-time=\"field.showTime\"\n :value-format=\"field.valueFormat\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n\n <a-range-picker\n v-if=\"field.type === 'rangepicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue || []\"\n :disabled=\"field.disabled\"\n :format=\"field.format\"\n :placeholder=\"\n field.placeholder && isArray(field.placeholder) && field.placeholder.length > 0\n ? field.placeholder\n : [$t('开始时间'), $t('结束时间')]\n \"\n :show-time=\"field.showTime\"\n :value-format=\"field.valueFormat\"\n :picker=\"field.picker ? field.picker : 'date'\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n\n <month-range-picker\n v-if=\"field.type === 'monthrangepicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue || []\"\n :disabled=\"field.disabled\"\n :placeholder=\"field.placeholder\"\n size=\"small\"\n :is_range=\"field.is_range\"\n :value_has_time=\"field.value_has_time\"\n :start_offset_day=\"field.start_offset_day\"\n :end_offset_day=\"field.end_offset_day\"\n :fix_day=\"field.fix_day\"\n :style=\"`width: ${field_width}px`\"\n />\n\n <a-time-picker\n v-if=\"field.type === 'timepicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :format=\"field.format ? field.format : 'HH:mm'\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :value-format=\"field.valueFormat ? field.valueFormat : 'HH:mm'\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n <a-time-range-picker\n v-if=\"field.type === 'timerangepicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :format=\"field.format ? field.format : 'HH:mm'\"\n :placeholder=\"\n field.placeholder && isArray(field.placeholder) && field.placeholder.length > 0\n ? field.placeholder\n : [$t('开始时间'), $t('结束时间')]\n \"\n :value-format=\"field.valueFormat ? field.valueFormat : 'HH:mm'\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n <a-radio-group\n v-if=\"field.type === 'radio'\"\n v-model:value=\"model\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <a-radio\n v-for=\"option in options\"\n :key=\"option[field.valueKey ? field.valueKey : 'value']\"\n :disabled=\"option.disabled\"\n :value=\"option[field.valueKey ? field.valueKey : 'value']\"\n >\n {{ option[field.labelKey ? field.labelKey : 'label'] }}\n </a-radio>\n </a-radio-group>\n\n <a-checkbox-group\n v-if=\"field.type === 'checkbox'\"\n v-model:value=\"model\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <a-checkbox\n v-for=\"option in options\"\n :key=\"option[field.valueKey ? field.valueKey : 'value']\"\n :disabled=\"option.disabled\"\n :value=\"option[field.valueKey ? field.valueKey : 'value']\"\n >\n {{ option[field.labelKey ? field.labelKey : 'label'] }}\n </a-checkbox>\n </a-checkbox-group>\n\n <a-tree-select\n v-if=\"field.type === 'treeselect'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :dropdownMatchSelectWidth=\"false\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :multiple=\"field.multiple\"\n :tree-checkable=\"field.treeCheckable\"\n :tree-data=\"options\"\n :tree-label-prop=\"field.labelKey\"\n :tree-node-filter-prop=\"field.valueKey\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-filter-select\n v-if=\"field.type === 'remotefilterselect'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :field=\"field\"\n :formModel=\"formModel\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :label-key=\"field.labelKey\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-select\n v-if=\"field.type === 'remoteselect'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :field=\"field\"\n :formModel=\"formModel\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :label-key=\"field.labelKey\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-select-pro\n v-if=\"field.type === 'remoteselectpro'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :field=\"field\"\n :formModel=\"formModel\"\n :outModel=\"outModel\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :init_watch=\"field.init_watch\"\n :label-key=\"field.labelKey\"\n :label-key-type=\"field.labelKeyType\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :is_input=\"field.is_input\"\n :is_form_design=\"is_form_design\"\n :placeholder=\"\n field.placeholder_i18n == undefined\n ? field.placeholder\n ? field.placeholder\n : $t('请选择') + field.label\n : t(field.placeholder_i18n)\n \"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-complete\n v-if=\"field.type === 'remotecomplete'\"\n v-model:value=\"model\"\n :field=\"field\"\n :formModel=\"formModel\"\n :outModel=\"outModel\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :init_watch=\"field.init_watch\"\n :label-key=\"field.labelKey\"\n :label-key-type=\"field.labelKeyType\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :maxlength=\"field.maxlength\"\n :is_input=\"field.is_input\"\n :is_form_design=\"is_form_design\"\n :placeholder=\"\n field.placeholder_i18n == undefined\n ? field.placeholder\n ? field.placeholder\n : $t('请选择') + field.label\n : t(field.placeholder_i18n)\n \"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-tree-select\n v-if=\"field.type === 'remotetreeselect'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :field=\"field\"\n :formModel=\"formModel\"\n :get-data=\"field.getData\"\n :label-key=\"field.labelKey\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-tree-select-pro\n v-if=\"field.type === 'remotetreeselectpro'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :field=\"field\"\n :formModel=\"formModel\"\n :outModel=\"outModel\"\n :get-data=\"field.getData\"\n :multiple=\"field.multiple\"\n :search_config=\"field.search_config\"\n :label-key-type=\"field.labelKeyType\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :label-key=\"field.labelKey\"\n :value-key=\"field.valueKey\"\n :init_model=\"field.init_model\"\n :init_watch=\"field.init_watch\"\n :is_form_design=\"is_form_design\"\n :placeholder=\"\n field.placeholder_i18n == undefined\n ? field.placeholder\n ? field.placeholder\n : $t('请选择') + field.label\n : t(field.placeholder_i18n)\n \"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-modal\n v-if=\"field.type === 'remotemodal'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :columns=\"field.columns\"\n :field=\"field\"\n :field_status=\"field.field_status\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :modalType=\"field.modalType\"\n :search_config=\"field.search_config\"\n :watch=\"field.watch\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-table\n v-if=\"field.type === 'remotetable'\"\n v-model:value=\"model\"\n :columns=\"field.columns\"\n :formModel=\"formModel\"\n :field=\"field\"\n :field_status=\"field.field_status\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :modalType=\"field.modalType\"\n :search_config=\"field.search_config\"\n :watch=\"field.watch\"\n :style=\"`width: ${field_width}px`\"\n />\n\n <remote-text\n v-if=\"field.type === 'remotetext'\"\n v-model:value=\"model\"\n :columns=\"field.columns\"\n :formModel=\"formModel\"\n :field=\"field\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :modalType=\"field.modalType\"\n :search_config=\"field.search_config\"\n :watch=\"field.watch\"\n />\n\n <a-rate\n v-if=\"field.type === 'rate'\"\n v-model:value=\"model\"\n :count=\"field.count ? field.count : 5\"\n :allow-half=\"field.allowHalf\"\n :style=\"`width: ${field_width}px`\"\n />\n <a-radio-group\n v-if=\"field.type === 'radio-color'\"\n v-model:value=\"model\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <a-radio\n v-for=\"option in options\"\n :key=\"option[field.valueKey ? field.valueKey : 'value']\"\n :disabled=\"option.disabled\"\n :value=\"option[field.valueKey ? field.valueKey : 'value']\"\n >\n <div\n :style=\"{\n width: '20px',\n height: '20px',\n backgroundColor: option[field.valueKey ? field.valueKey : 'value'],\n }\"\n ></div>\n </a-radio>\n </a-radio-group>\n </template>\n\n <a-divider\n v-if=\"field.type === 'divider'\"\n :orientation=\"field.orientation\"\n >\n {{ field.label }}\n </a-divider>\n</template>\n<script lang=\"ts\">\nimport RemoteSelect from 'liyu-pc-base/components/FormRender/RemoteSelect/RemoteSelect.vue';\nimport RemoteCascader from 'liyu-pc-base/components/FormRender/RemoteCascader/RemoteCascader.vue';\nimport RemoteModal from 'liyu-pc-base/components/FormRender/RemoteModal/RemoteModal.vue';\nimport RemoteTreeSelect from 'liyu-pc-base/components/FormRender/RemoteTreeSelect/RemoteTreeSelect.vue';\nimport RemoteTable from 'liyu-pc-base/components/FormRender/RemoteTable/RemoteTable.vue';\nimport { defineComponent, watch, onMounted, ref } from 'vue';\nimport RemoteFilterSelect from 'liyu-pc-base/components/FormRender/RemoteFilterSelect/RemoteFilterSelect.vue';\nimport AttributeNomTable from 'liyu-pc-base/components/FormRender/AttributeNomTable/index.vue';\nimport AttributeTable from 'liyu-pc-base/components/FormRender/AttributeTable/index.vue';\nimport JsonStr from 'liyu-pc-base/components/FormRender/JsonStr/index.vue';\nimport JsonObj from 'liyu-pc-base/components/FormRender/JsonObj/index.vue';\nimport RemoteText from 'liyu-pc-base/components/FormRender/RemoteText/RemoteText.vue';\nimport RemoteTablePro from 'liyu-pc-base/components/FormRender/RemoteTablePro/RemoteTablePro.vue';\nimport { debounce, isArray, isEqual } from 'lodash-es';\nimport moment from 'moment';\nimport { isEmpty, isNotEmpty } from 'liyu-pc-base/utils/function';\nimport { PlusOutlined } from '@ant-design/icons-vue';\nimport RemoteSelectPro from 'liyu-pc-base/components/FormRender/RemoteSelectPro/RemoteSelectPro.vue';\nimport RemoteComplete from 'liyu-pc-base/components/FormRender/RemoteComplete/RemoteComplete.vue';\nimport RemoteTreeSelectPro from 'liyu-pc-base/components/FormRender/RemoteTreeSelectPro/RemoteTreeSelectPro.vue';\nimport RemoteCascaderPro from 'liyu-pc-base/components/FormRender/RemoteCascaderPro/RemoteCascaderPro.vue';\nimport Upload from 'liyu-pc-base/components/FormRender/Upload/upload.vue';\nimport RichTextEditor from 'liyu-pc-base/components/FormRender/RichTextEditor/index.vue';\nimport { useI18n } from 'vue-i18n';\nimport IconSelect from 'liyu-pc-base/components/FormRender/iconSelect/index.vue';\nimport MonthPicker from 'liyu-pc-base/components/FormRender/MonthPicker/index.vue';\nimport MonthRangePicker from 'liyu-pc-base/components/FormRender/MonthRangePicker/index.vue';\nimport CodeEditor from 'liyu-pc-base/components/code/CodeEditor.vue';\nimport TinymceEditor from 'liyu-pc-base/components/tinymce/TinymceEditor.vue';\n\nconst isValidDate = (dateString, format = 'YYYY-MM-DD') => {\n const date = moment(dateString, format, true);\n return date.isValid();\n};\nconst isValidDateTime = (dateString, format = 'YYYY-MM-DD HH:mm:ss') => {\n const date = moment(dateString, format, true);\n return date.isValid();\n};\nconst isValidTime = (dateString, format = 'HH:mm:ss') => {\n const date = moment(dateString, format, true);\n return date.isValid();\n};\nexport default defineComponent({\n name: 'FieldRender2',\n methods: { isArray },\n props: {\n field: {\n type: Object,\n required: true,\n },\n value: {\n required: true,\n },\n label: {\n required: false,\n },\n options: {\n type: Array,\n default: () => [],\n },\n validateInfos: {\n type: Object,\n default: () => {},\n },\n formModel: {\n type: Object,\n default: () => {},\n },\n outModel: {\n type: Object,\n default: () => {},\n },\n field_render_show: {\n type: Boolean,\n default: true,\n },\n is_show_label: {\n type: Boolean,\n default: true,\n },\n isUseConditions: {\n type: Boolean,\n default: true,\n },\n is_show_field: {\n type: Boolean,\n default: true,\n },\n is_edit: {\n type: Boolean,\n default: true,\n },\n conditionsVisibleNum: {\n type: Number,\n default: 0,\n },\n is_form_design: {\n type: Boolean,\n default: false,\n },\n field_width: {\n type: Number,\n default: 150,\n },\n },\n emits: [\n 'add',\n 'update:value',\n 'update:label',\n 'update_model',\n 'update:is_show_field',\n 'update:is_edit',\n 'update_name2',\n ],\n setup(props, { emit }) {\n const newModel = ref({ ...props.formModel });\n const rangeDate = (v: any) => {\n if (typeof v == 'string' && v.indexOf(',') >= 0) {\n return v.split(',');\n }\n return v;\n };\n const convertValueByClassName = (value, class_name) => {\n //class_name 'int','float',str','bool','date','datetime','time'\n let new_value;\n if (class_name == 'int') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isNotEmpty(item) && typeof item === 'string') {\n new_value.push(Number(item));\n } else {\n new_value.push(item);\n }\n });\n } else if (isNotEmpty(value) && typeof value === 'string') {\n new_value = Number(value);\n } else {\n new_value = value;\n }\n } else if (class_name == 'str') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isNotEmpty(item) && typeof item === 'number') {\n new_value.push(item.toString());\n } else {\n new_value.push(item);\n }\n });\n } else if (isNotEmpty(value) && typeof value === 'number') {\n new_value = value.toString();\n } else {\n new_value = value;\n }\n } else if (class_name == 'date') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isValidDate(item) && typeof item === 'string') {\n new_value.push(moment(item, 'YYYY-MM-DD'));\n } else {\n new_value.push(item);\n }\n });\n } else if (isValidDate(value) && typeof value === 'string') {\n new_value = value.toString();\n } else {\n new_value = value;\n }\n } else if (class_name == 'datetime') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isValidDateTime(item) && typeof item === 'string') {\n new_value.push(moment(item, 'YYYY-MM-DD HH:mm:ss'));\n } else {\n new_value.push(item);\n }\n });\n } else if (isValidDateTime(value) && typeof value === 'string') {\n new_value = moment(value, 'YYYY-MM-DD HH:mm:ss');\n } else {\n new_value = value;\n }\n } else if (class_name == 'time') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isValidTime(item) && typeof item === 'string') {\n new_value.push(moment(item, 'HH:mm:ss'));\n } else {\n new_value.push(item);\n }\n });\n } else if (isValidTime(value) && typeof value === 'string') {\n new_value = moment(value, 'HH:mm:ss');\n } else {\n new_value = value;\n }\n } else if (class_name == 'float') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isNotEmpty(item) && typeof item === 'string') {\n new_value.push(Number(item));\n } else {\n new_value.push(item);\n }\n });\n } else if (isNotEmpty(value) && typeof value === 'string') {\n new_value = Number(value);\n } else {\n new_value = value;\n }\n } else if (class_name == 'bool') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isNotEmpty(item) && typeof item === 'string') {\n new_value.push(Boolean(item));\n } else {\n new_value.push(item);\n }\n });\n } else if (isNotEmpty(value) && typeof value === 'string') {\n new_value = Boolean(value);\n } else {\n new_value = value;\n }\n }\n return new_value;\n };\n const is_show_field = ref(props.is_show_field);\n const is_edit = ref(false);\n const handleToggleEdit = () => {\n emit('update:is_edit', is_edit.value);\n };\n const handleAdd = () => {\n emit('add');\n };\n const check_visible_field_fun = debounce(() => {\n const old_is_show_field = is_show_field.value;\n const condition_result_list: any = [];\n for (const i in props.field?.conditions) {\n const group_list = props.field?.conditions[i];\n const group_results = [];\n for (const j in group_list) {\n const item = group_list[j];\n const value = props.formModel[item.watchKey];\n let new_value;\n if (item.class_name) {\n new_value = convertValueByClassName(item.value, item.class_name);\n } else {\n new_value = item.value;\n }\n let first, second;\n if (new_value instanceof Array) {\n [first, second] = new_value;\n }\n if (item.operator == 'lt') {\n if (typeof first === 'number') {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value < first) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (moment(value).isBefore(moment(first))) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'lte') {\n if (typeof first === 'number') {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value <= first) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (\n moment(value).isBefore(moment(first)) ||\n moment(value).isSame(moment(first))\n ) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'gt') {\n if (typeof first === 'number') {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value > first) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (moment(value).isAfter(moment(first))) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'gte') {\n if (typeof first === 'number') {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value >= first) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (\n moment(value).isAfter(moment(first)) ||\n moment(value).isSame(moment(first))\n ) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'between') {\n if (typeof first === 'number' && typeof second === 'number' && first && second) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value >= first && value <= second) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (\n (moment(value).isAfter(moment(first)) || moment(value).isSame(moment(first))) &&\n (moment(value).isBefore(moment(second)) || moment(value).isSame(moment(second)))\n ) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'notbetween') {\n if (typeof first === 'number' && typeof second === 'number' && first && second) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value < first || value > second) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (\n moment(value).isBefore(moment(first)) ||\n moment(value).isAfter(moment(second))\n ) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'in') {\n if (value instanceof Array) {\n const f_list = new_value.filter(x => {\n return value.includes(x);\n });\n if (f_list.length > 0) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (typeof value == 'string' || typeof value == 'number' || isEmpty(value)) {\n // 数字 字符串 空\n const f = new_value.find(x => {\n return value == x;\n });\n if (f) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'eq') {\n if (value === first) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'contains') {\n if (value.toString().indexOf(first) > -1) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'startswith') {\n if (value.toString().startsWith(first)) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'notin') {\n if (value instanceof Array) {\n const f_list = new_value.filter(x => {\n return value.includes(x);\n });\n if (f_list.length > 0) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (typeof value == 'string' || typeof value == 'number' || isEmpty(value)) {\n // 数字 字符串 空\n const f = new_value.find(x => {\n return value == x;\n });\n if (!f) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'notcontains') {\n if (value.toString().indexOf(first) == -1) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == '_eq') {\n //todo\n } else if (item.operator == 'json_list_not_blank_not_null') {\n // 非空\n if (value) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'json_list_is_blank_is_null') {\n //为空\n if (!value) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'not_eq') {\n //为空\n if (!value) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'not_blank_not_null') {\n // 非空\n if (value) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n }\n condition_result_list.push(group_results);\n }\n const con_list = [];\n condition_result_list.forEach(item => {\n const find_false_list = item.filter(x => x === false);\n if (find_false_list && find_false_list.length > 0) {\n con_list.push(false);\n } else {\n con_list.push(true);\n }\n });\n\n const find_true_list = con_list.filter(x => x === true);\n if (find_true_list && find_true_list.length > 0) {\n is_show_field.value = true;\n emit('update:is_show_field', is_show_field.value);\n } else {\n is_show_field.value = false;\n emit('update:is_show_field', is_show_field.value);\n }\n if (is_show_field.value !== old_is_show_field) {\n if (is_show_field.value) {\n newModel.value[props.field.name] = null;\n emit('update_model', {\n add_key: props.field.name,\n value: null,\n });\n } else {\n delete newModel.value[props.field.name];\n emit('update_model', {\n remove_key: props.field.name,\n });\n }\n }\n }, 300);\n const model = ref<any>('');\n const labelModel = ref(props.label);\n watch(\n () => model.value,\n (newValue, oldValue) => {\n if (isEqual(newValue, oldValue)) {\n return;\n }\n emit('update:value', newValue);\n if (props.field.name2) {\n let label: any;\n if (props.field.type === 'radio') {\n const obj = props.options.find(\n (item: any) =>\n item[props.field.valueKey ? props.field.valueKey : 'value'] == newValue,\n );\n label = obj?.[props.field.labelKey ? props.field.labelKey : 'label'];\n } else if (props.field.type === 'checkbox' && newValue && newValue.length >= 0) {\n const list = [];\n props.options.forEach((item: any) => {\n newValue.forEach((item1: any) => {\n if (item1 == item?.[props.field.valueKey ? props.field.valueKey : 'value']) {\n list.push(item?.[props.field.labelKey ? props.field.labelKey : 'label']);\n }\n });\n });\n label = list.toString();\n } else if (props.field.type === 'select') {\n if (isArray(newValue)) {\n const list = [];\n props.options.forEach((item: any) => {\n newValue.forEach((item1: any) => {\n if (item1 == item?.[props.field.valueKey ? props.field.valueKey : 'value']) {\n list.push(item?.[props.field.labelKey ? props.field.labelKey : 'label']);\n }\n });\n });\n label = list.toString();\n } else {\n const obj = props.options.find(\n (item: any) =>\n item[props.field.valueKey ? props.field.valueKey : 'value'] == newValue,\n );\n label = obj?.[props.field.labelKey ? props.field.labelKey : 'label'];\n }\n }\n emit('update_name2', {\n key: props.field.name2,\n value: label,\n });\n }\n },\n { deep: true },\n );\n watch(\n () => props.value,\n newValue => {\n let value = newValue;\n if (props.field.type === 'rangepicker' && value) {\n value = rangeDate(value);\n } else if (props.field.type === 'input' && value) {\n value = value.toString().replace(/(^\\s*)|(\\s*$)/g, '');\n }\n if (is_show_field.value) {\n //当该表单项显示时,才做向上的数据绑定,避免把undefined向上传递,影响rules字段的有效过滤\n model.value = value;\n }\n },\n { immediate: true },\n );\n watch(\n () => labelModel.value,\n newValue => {\n emit('update:label', newValue);\n if ('name2' in props.field) {\n emit('update_name2', { key: props.field.name2, value: newValue.toString() });\n }\n },\n { deep: true },\n );\n watch(\n () => props.label,\n newValue => {\n labelModel.value = newValue;\n },\n );\n watch(\n () => props.formModel,\n newValue => {\n newModel.value = { ...newValue };\n },\n { deep: true },\n );\n watch(\n () => newModel.value,\n (newValue, oldValue) => {\n if (props.field?.conditions) {\n props.field?.conditions.forEach(condition_list => {\n condition_list.forEach(item => {\n if (oldValue[item.watchKey] != newValue[item.watchKey]) {\n check_visible_field_fun();\n }\n });\n });\n }\n },\n { deep: true },\n );\n watch(\n () => [props.conditionsVisibleNum, props.isUseConditions],\n () => {\n if (props.field?.conditions) {\n if (props.isUseConditions) {\n check_visible_field_fun();\n } else {\n is_show_field.value = true;\n emit('update:is_show_field', is_show_field.value);\n }\n } else {\n is_show_field.value = true;\n emit('update:is_show_field', is_show_field.value);\n }\n },\n );\n onMounted(() => {\n if (props.field?.conditions instanceof Array && props.field?.conditions.length > 0) {\n check_visible_field_fun();\n } else {\n is_show_field.value = true;\n emit('update:is_show_field', is_show_field.value);\n }\n if (!is_show_field.value) {\n // 表单项所见即所得,如果有隐藏的字段,那么model的key也要清除\n delete newModel.value[props.field.name];\n emit('update_model', {\n remove_key: props.field.name,\n });\n }\n });\n const { t } = useI18n();\n return {\n t,\n is_show_field,\n is_edit,\n handleToggleEdit,\n rangeDate,\n handleAdd,\n model,\n labelModel,\n };\n },\n components: {\n IconSelect,\n RichTextEditor,\n Upload,\n RemoteCascaderPro,\n RemoteTreeSelectPro,\n RemoteSelectPro,\n RemoteComplete,\n AttributeTable,\n AttributeNomTable,\n RemoteFilterSelect,\n RemoteModal,\n RemoteSelect,\n RemoteCascader,\n RemoteTreeSelect,\n RemoteTable,\n JsonStr,\n JsonObj,\n RemoteText,\n RemoteTablePro,\n PlusOutlined,\n MonthPicker,\n MonthRangePicker,\n CodeEditor,\n TinymceEditor,\n },\n});\n</script>\n\n<style scoped>\n.ant-calendar-picker {\n width: 100% !important;\n}\n</style>\n","import { useRequest } from 'liyu-pc-base/init-plugin';\nimport type { PageResult } from 'liyu-pc-base/api/typing';\n\nexport async function create_view_settings(params: Record<string, any>) {\n return useRequest().post('/view/create_view_settings', params);\n}\n\nexport async function update_view_settings(params: Record<string, any>) {\n return useRequest().post('/view/update_view_settings', params);\n}\n\nexport async function refresh_view_settings_cache(params: Record<string, any>) {\n return useRequest().post('/view/refresh_view_settings_cache', params);\n}\n\nexport async function set_view_settings_default(params: Record<string, any>) {\n return useRequest().post('/view/set_view_settings_default', params);\n}\n\nexport async function delete_view_settings(params: Record<string, any>) {\n return useRequest().post('/view/delete_view_settings', params);\n}\n\nexport async function recover_view_settings(params: Record<string, any>) {\n return useRequest().post('/view/recover_view_settings', params);\n}\n\nexport async function get_view_settings(params: Record<string, any>) {\n return useRequest().post('/view/get_view_settings', params);\n}\n\nexport async function create_user_view(params: Record<string, any>) {\n return useRequest().post('/view/create_user_view', params);\n}\n\nexport async function update_user_view(params: Record<string, any>) {\n return useRequest().post('/view/update_user_view', params);\n}\n\nexport async function delete_user_view(params: Record<string, any>) {\n return useRequest().post('/view/delete_user_view', params);\n}\n\nexport async function recover_user_view(params: Record<string, any>) {\n return useRequest().post('/view/recover_user_view', params);\n}\n\nexport async function get_user_view(params: Record<string, any>) {\n return useRequest().post('/view/get_user_view', params);\n}\n\nexport async function get_view_settings_for_user(params: Record<string, any>) {\n return useRequest().post('/view/get_view_settings_for_user', params);\n}\n\nexport async function change_view_settings_sort(params: Record<string, any>) {\n return useRequest().post('/view/change_view_settings_sort', params);\n}\n\nexport async function query_view_settings_list(params?: {\n [key: string]: any;\n}): Promise<PageResult> {\n return useRequest().post('/view/query_view_settings_list', params);\n}\n\nexport async function query_user_view_list(params?: { [key: string]: any }): Promise<PageResult> {\n return useRequest().post('/view/query_user_view_list', params);\n}\n","import type { Ref, ComponentPublicInstance } from 'vue';\n\nexport type BasicTarget<T = HTMLElement> = (() => T | null) | T | null | Ref<T | null | undefined>;\n\nexport type TargetElement = ComponentPublicInstance | HTMLElement | Element | Document | Window;\n\nexport function getTargetElement(\n target?: BasicTarget<TargetElement>,\n defaultElement?: TargetElement,\n): TargetElement | undefined | null {\n if (!target) {\n return defaultElement;\n }\n\n let targetElement: TargetElement | undefined | null;\n\n if (typeof target === 'function') {\n targetElement = target();\n } else if ('value' in target) {\n targetElement = (target.value as ComponentPublicInstance)?.$el;\n } else {\n targetElement = target;\n }\n\n return targetElement;\n}\n","import type { Ref, ComponentPublicInstance } from 'vue';\nimport { ref, onUnmounted } from 'vue';\nimport { getTargetElement } from 'liyu-pc-base/utils/dom';\nimport { default as screenfull } from 'screenfull';\n\nexport interface Options {\n onExitFull?: () => void;\n onFull?: () => void;\n}\n\nexport type UseFullscreen = readonly [\n Ref<ComponentPublicInstance | null>,\n Ref<boolean>,\n {\n setFull: () => void;\n exitFull: () => void;\n toggleFull: () => void;\n },\n];\n\nexport const useFullscreen = (options?: Options): UseFullscreen => {\n const { onExitFull, onFull } = options || {};\n const elRef = ref<ComponentPublicInstance | null>(null);\n const onExitFullRef = ref(onExitFull);\n const onFullRef = ref(onFull);\n\n const state = ref(false);\n\n const onChange = () => {\n if (screenfull.isEnabled) {\n const { isFullscreen } = screenfull;\n if (isFullscreen) {\n onFullRef.value && onFullRef.value();\n } else {\n screenfull.off('change', onChange);\n onExitFullRef.value && onExitFullRef.value();\n }\n state.value = isFullscreen;\n }\n };\n\n const setFull = () => {\n const el = getTargetElement(elRef);\n if (!el) {\n return;\n }\n if (screenfull.isEnabled) {\n screenfull.request(el as HTMLElement);\n screenfull.on('change', onChange);\n }\n };\n\n const exitFull = () => {\n if (!state.value) {\n return;\n }\n if (screenfull.isEnabled) {\n screenfull.exit();\n }\n };\n\n const toggleFull = () => {\n if (state.value) {\n exitFull();\n } else {\n setFull();\n }\n };\n\n onUnmounted(() => {\n if (screenfull.isEnabled) {\n screenfull.off('change', onChange);\n }\n });\n\n return [\n elRef,\n state,\n {\n setFull,\n exitFull,\n toggleFull,\n },\n ] as const;\n};\n\n// examples\n/*\nconst [elRef, screenState, { setFull, exitFull, toggleFull } ] = useFullscreen({\n onExitFull: () => {\n console.log('exitFull callback');\n },\n onFull: () => {\n console.log('inFull callback');\n }\n});\n\n<template>\n <div ref=\"elRef\">\n <p>123</p>\n <p>current fullscreen state: {{ screenState }}</p>\n <a-button @click=\"toggleFull\">Toggle</a-button>\n <a-button v-if=\"!screenState\" @click=\"setFull\">fullScreen</a-button>\n <a-button v-else @click=\"exitFull\">exitFullScreen</a-button>\n </div>\n</template>\n*/\n","import { isEmpty } from 'liyu-pc-base/utils/function';\nimport { getApiData } from 'liyu-pc-base/api/api-model';\nimport { ConditionOperatorMap } from 'liyu-pc-base/api/typing';\nimport { inject } from 'vue';\nimport type { TableProState } from './typing';\nimport { get_view_settings_for_user } from 'liyu-pc-base/api/view-model';\nimport { useUserStore, useEnv } from 'liyu-pc-base/init-plugin';\nexport function removeNestedDuplicates(nodes, seenIds = new Set(), parentPath = []) {\n const result = [];\n\n nodes.forEach((node, index) => {\n const currentPath = [...parentPath, index]; // 记录当前节点的路径\n const nodeId = node.name;\n\n if (!seenIds.has(nodeId)) {\n seenIds.add(nodeId);\n const newNode = { ...node };\n\n if (newNode.children && Array.isArray(newNode.children)) {\n newNode.children = removeNestedDuplicates(newNode.children, seenIds, currentPath);\n }\n\n result.push(newNode);\n } else {\n // 如果需要处理子对象(即使父对象被忽略了),则递归调用\n if (node.children && Array.isArray(node.children)) {\n // 注意:这里我们不将子对象添加到结果数组中,只是处理它们以避免丢失新的 id\n removeNestedDuplicates(node.children, seenIds, currentPath);\n }\n }\n });\n\n return result;\n}\nexport const operator_type_map = ConditionOperatorMap;\n\nexport const options_for_date_eq = [\n { value: '上月', label: '上月' },\n { value: '本月', label: '本月' },\n { value: '今日', label: '今日' },\n { value: '昨日', label: '昨日' },\n { value: '期初', label: '期初' },\n];\n\nconst operator_params_count = {\n between: 2,\n gt: 1,\n lt: 1,\n gte: 1,\n lte: 1,\n in: 0,\n eq: 1,\n _eq: 1,\n contains: 1,\n icontains: 1,\n startswith: 1,\n notbetween: 2,\n notin: 0,\n notcontains: 1,\n not_eq: 1,\n not_blank_not_null: 1,\n json_list_not_blank_not_null: 1,\n json_list_is_blank_is_null: 1,\n is_or_not_blank_or_null: 1,\n is_or_not_null: 1,\n};\n\nexport const getParamsCount = (operator, configItem) => {\n return operator_params_count[operator];\n};\n\nexport const filterConditions = conditions => {\n if (!conditions) {\n return [];\n }\n const res = conditions.filter(item => {\n return (\n item.value instanceof Array &&\n item.value.length > 0 &&\n !item.value.some(item => isEmpty(item))\n );\n });\n return res;\n};\n\nconst processColumnDataSource = (res_data: any, name_map: object) => {\n res_data.forEach((item: any) => {\n name_map[item.name] = item.verbose_name;\n if (item.children) {\n processColumnDataSource(item.children, name_map);\n }\n });\n};\n\nexport const getColumnNameList = async (modelType: string): Promise<any[]> => {\n if (!modelType) {\n return [];\n }\n const url = modelType.split('-')[0] + '/obtain_' + modelType.split('-')[1] + '_column_data';\n const res = await getApiData({}, url, false, { skip_error: true });\n const name_map = {};\n let res_data = removeNestedDuplicates(res || []);\n processColumnDataSource(res_data, name_map);\n if (!('id' in name_map)) {\n name_map['id'] = 'ID';\n }\n return Object.keys(name_map).map((item: any) => ({\n value: item,\n label: name_map[item],\n }));\n};\nexport const genID = (): string => {\n const array = new Uint8Array(16); // 16 字节 = 128 位\n window.crypto.getRandomValues(array);\n return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');\n};\n\nexport const tableProStateSymbol = Symbol('tableProState');\n\nexport const useTableProState = (): TableProState => {\n const state = inject<TableProState>(tableProStateSymbol);\n return state;\n};\nexport const fetchViewsData = async view_key => {\n const userStore = useUserStore();\n const userid = userStore.userid;\n const env = useEnv();\n const res = await get_view_settings_for_user({\n user_id: userid,\n view_project__flag: env.VITE_APP_VIEW_PROJECT_FLAG,\n view_menu__flag: view_key,\n sort_fields: ['sort', 'create_time'],\n is_cache: false,\n });\n\n let list: any = [];\n if (res.system_user_datas) list = list.concat(res.system_user_datas);\n if (res.system_public_datas) list = list.concat(res.system_public_datas);\n if (res.public_datas) list = list.concat(res.public_datas);\n if (res.user_datas) list = list.concat(res.user_datas);\n\n return list.map((item: any) => {\n let data = item.data;\n if (typeof data === 'string') {\n try {\n data = JSON.parse(data);\n } catch (e) {}\n }\n return { ...item, data };\n });\n};\n","<template>\n <span class=\"search-summary\">\n <a-tag\n v-for=\"item in dataSource\"\n :key=\"item.field_name\"\n color=\"green\"\n closable\n @close=\"handleClose(item.field_name)\"\n >\n {{ item.summary }}\n </a-tag>\n <a-button\n size=\"small\"\n type=\"text\"\n @click=\"handleRefresh\"\n >\n <RedoOutlined />\n </a-button>\n </span>\n</template>\n\n<script lang=\"ts\">\nimport { isEmpty } from 'liyu-pc-base/utils/function';\nimport moment from 'moment';\nimport { computed, defineComponent } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport { Condition, SearchConfig, SearchType } from './typing';\nimport { operator_type_map } from './utils';\nexport default defineComponent({\n name: 'searchSummary',\n props: {\n searchConfig: {\n type: Array<SearchConfig>,\n required: true,\n },\n searchConditions: {\n type: Array<Condition>,\n required: true,\n },\n eventBus: {\n type: Object as any,\n required: false,\n },\n searchType: {\n type: String as () => SearchType,\n default: 'advanced',\n },\n },\n emits: ['update:searchConditions'],\n\n setup(props, { emit }) {\n const { t } = useI18n();\n const transferValue = (configItem, operator, value) => {\n const str_list: any = [];\n let transfer_value;\n if (operator === 'is_or_not_blank_or_null' || operator === 'is_or_not_null') {\n if (value === 'yes') {\n return t('is_or_not_blank_or_null.yes');\n } else {\n return t('is_or_not_blank_or_null.no');\n }\n } else if (operator === '_eq') {\n if (['上月', '本月', '今日', '昨日', '期初'].includes(value[0])) {\n return t(value[0]);\n }\n } else if (configItem.options instanceof Array) {\n if (value instanceof Array) {\n value.forEach(item => {\n configItem.options.forEach(i => {\n if (item == i.value) {\n str_list.push(i.label);\n }\n });\n });\n if (props.searchType === 'advanced') {\n return `${operator_type_map[operator]} ${str_list.join(',')}`;\n } else {\n return str_list.join(',');\n }\n } else {\n configItem.options.forEach(i => {\n if (value == i.value) {\n transfer_value = i.label;\n }\n });\n if (props.searchType === 'advanced') {\n return `${operator_type_map[operator]} ${transfer_value}`;\n } else {\n return transfer_value;\n }\n }\n } else if (configItem.type == 'monthpicker' && configItem.dateFormat) {\n if (value instanceof Array) {\n const str_list = [];\n value.forEach(i => {\n if (i) {\n str_list.push(moment(i).format(configItem.dateFormat));\n } else {\n str_list.push(i);\n }\n });\n transfer_value = str_list.join(',');\n } else {\n transfer_value = moment(value).format(configItem.dateFormat);\n }\n if (props.searchType === 'advanced') {\n return `${operator_type_map[operator]} ${transfer_value}`;\n } else {\n return transfer_value;\n }\n } else {\n if (props.searchType === 'advanced') {\n return `${operator_type_map[operator]} ${value}`;\n } else {\n return value;\n }\n }\n };\n const dataSource = computed(() => {\n const searchConditionsMap = {};\n for (const condition of props.searchConditions) {\n searchConditionsMap[condition.field_name] = {\n value: condition.value,\n operator: condition.operator,\n };\n }\n return props.searchConfig\n ?.map(configItem => {\n const data = searchConditionsMap[configItem.field_name] || {\n operator: configItem.default_operator || 'eq',\n value: null,\n };\n let summary = null;\n if (\n data.value instanceof Array &&\n data.value.length > 0 &&\n !data.value.some(item => isEmpty(item))\n ) {\n summary = `${configItem.label}: ${transferValue(\n configItem,\n data.operator,\n data.value,\n )}`;\n }\n return {\n field_name: configItem.field_name,\n summary,\n };\n })\n .filter(item => item.summary);\n });\n const handleClose = (fieldName: string) => {\n emit(\n 'update:searchConditions',\n props.searchConditions.filter(item => item.field_name !== fieldName),\n );\n props.eventBus.emit('refresh');\n };\n const handleRefresh = () => {\n props.eventBus.emit('refresh');\n };\n\n return { dataSource, handleClose, handleRefresh };\n },\n components: {},\n});\n</script>\n<style lang=\"less\" scoped>\n.search-summary {\n display: inline-block;\n padding: 4px 2px;\n}\n</style>\n","<template>\n <span class=\"search-summary\">\n <a-tag\n v-for=\"item in dataSource\"\n :key=\"item.field_name\"\n color=\"green\"\n closable\n @close=\"handleClose(item.field_name)\"\n >\n {{ item.summary }}\n </a-tag>\n <a-button\n size=\"small\"\n type=\"text\"\n @click=\"handleRefresh\"\n >\n <RedoOutlined />\n </a-button>\n </span>\n</template>\n\n<script lang=\"ts\">\nimport { isEmpty } from 'liyu-pc-base/utils/function';\nimport moment from 'moment';\nimport { computed, defineComponent } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport { Condition, SearchConfig, SearchType } from './typing';\nimport { operator_type_map } from './utils';\nexport default defineComponent({\n name: 'searchSummary',\n props: {\n searchConfig: {\n type: Array<SearchConfig>,\n required: true,\n },\n searchConditions: {\n type: Array<Condition>,\n required: true,\n },\n eventBus: {\n type: Object as any,\n required: false,\n },\n searchType: {\n type: String as () => SearchType,\n default: 'advanced',\n },\n },\n emits: ['update:searchConditions'],\n\n setup(props, { emit }) {\n const { t } = useI18n();\n const transferValue = (configItem, operator, value) => {\n const str_list: any = [];\n let transfer_value;\n if (operator === 'is_or_not_blank_or_null' || operator === 'is_or_not_null') {\n if (value === 'yes') {\n return t('is_or_not_blank_or_null.yes');\n } else {\n return t('is_or_not_blank_or_null.no');\n }\n } else if (operator === '_eq') {\n if (['上月', '本月', '今日', '昨日', '期初'].includes(value[0])) {\n return t(value[0]);\n }\n } else if (configItem.options instanceof Array) {\n if (value instanceof Array) {\n value.forEach(item => {\n configItem.options.forEach(i => {\n if (item == i.value) {\n str_list.push(i.label);\n }\n });\n });\n if (props.searchType === 'advanced') {\n return `${operator_type_map[operator]} ${str_list.join(',')}`;\n } else {\n return str_list.join(',');\n }\n } else {\n configItem.options.forEach(i => {\n if (value == i.value) {\n transfer_value = i.label;\n }\n });\n if (props.searchType === 'advanced') {\n return `${operator_type_map[operator]} ${transfer_value}`;\n } else {\n return transfer_value;\n }\n }\n } else if (configItem.type == 'monthpicker' && configItem.dateFormat) {\n if (value instanceof Array) {\n const str_list = [];\n value.forEach(i => {\n if (i) {\n str_list.push(moment(i).format(configItem.dateFormat));\n } else {\n str_list.push(i);\n }\n });\n transfer_value = str_list.join(',');\n } else {\n transfer_value = moment(value).format(configItem.dateFormat);\n }\n if (props.searchType === 'advanced') {\n return `${operator_type_map[operator]} ${transfer_value}`;\n } else {\n return transfer_value;\n }\n } else {\n if (props.searchType === 'advanced') {\n return `${operator_type_map[operator]} ${value}`;\n } else {\n return value;\n }\n }\n };\n const dataSource = computed(() => {\n const searchConditionsMap = {};\n for (const condition of props.searchConditions) {\n searchConditionsMap[condition.field_name] = {\n value: condition.value,\n operator: condition.operator,\n };\n }\n return props.searchConfig\n ?.map(configItem => {\n const data = searchConditionsMap[configItem.field_name] || {\n operator: configItem.default_operator || 'eq',\n value: null,\n };\n let summary = null;\n if (\n data.value instanceof Array &&\n data.value.length > 0 &&\n !data.value.some(item => isEmpty(item))\n ) {\n summary = `${configItem.label}: ${transferValue(\n configItem,\n data.operator,\n data.value,\n )}`;\n }\n return {\n field_name: configItem.field_name,\n summary,\n };\n })\n .filter(item => item.summary);\n });\n const handleClose = (fieldName: string) => {\n emit(\n 'update:searchConditions',\n props.searchConditions.filter(item => item.field_name !== fieldName),\n );\n props.eventBus.emit('refresh');\n };\n const handleRefresh = () => {\n props.eventBus.emit('refresh');\n };\n\n return { dataSource, handleClose, handleRefresh };\n },\n components: {},\n});\n</script>\n<style lang=\"less\" scoped>\n.search-summary {\n display: inline-block;\n padding: 4px 2px;\n}\n</style>\n","<template>\n <a-modal\n :title=\"$t('设置搜索字段')\"\n v-model:open=\"visible\"\n width=\"1000px\"\n @ok=\"handleOk\"\n @cancel=\"handleCancel\"\n >\n <div class=\"search-config-container\">\n <div class=\"table-wrapper left-table\">\n <div class=\"table-title\">\n {{ $t('所有字段') }}\n <a-input\n v-model:value=\"leftSearch\"\n size=\"small\"\n :placeholder=\"$t('搜索标签/字段名')\"\n style=\"margin-top: 8px\"\n allow-clear\n />\n </div>\n <s-table\n :columns=\"leftColumns\"\n :data-source=\"filteredLeftData\"\n :pagination=\"false\"\n :row-selection=\"leftRowSelection\"\n v-model:selectedRowKeys=\"leftSelectedRowKeys\"\n row-key=\"field_name\"\n size=\"small\"\n :row-class-name=\"record => (record.is_selected ? 'row-selected' : '')\"\n expand-row-by-click\n >\n <template #bodyCell=\"{ column, record }\">\n <template v-if=\"column.dataIndex === 'label'\">\n <span\n :style=\"{\n color: record.is_selected ? '#ccc' : 'inherit',\n }\"\n >\n {{ record.label }}\n </span>\n </template>\n </template>\n </s-table>\n </div>\n\n <div class=\"middle-btns\">\n <a-button\n type=\"primary\"\n shape=\"circle\"\n :disabled=\"leftSelectedRowKeys.length === 0\"\n @click=\"moveToRight\"\n >\n <template #icon><RightOutlined /></template>\n </a-button>\n <a-button\n type=\"primary\"\n shape=\"circle\"\n :disabled=\"rightSelectedRowKeys.length === 0\"\n @click=\"moveToLeft\"\n >\n <template #icon><LeftOutlined /></template>\n </a-button>\n </div>\n\n <div class=\"table-wrapper right-table\">\n <div class=\"table-title\">\n {{ $t('已选字段') }}\n <a-input\n v-model:value=\"rightSearch\"\n size=\"small\"\n :placeholder=\"$t('搜索标签/字段名')\"\n style=\"margin-top: 8px\"\n allow-clear\n />\n </div>\n <s-table\n :columns=\"rightColumns\"\n :data-source=\"filteredRightData\"\n :pagination=\"false\"\n :row-selection=\"rightRowSelection\"\n v-model:selectedRowKeys=\"rightSelectedRowKeys\"\n row-key=\"field_name\"\n size=\"small\"\n @row-drag-end=\"onRowDragEnd\"\n />\n </div>\n </div>\n </a-modal>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, PropType } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport { RightOutlined, LeftOutlined } from '@ant-design/icons-vue';\nimport { SearchConfig, ViewSearchItem } from '../typing';\nimport { cloneDeep } from 'lodash';\n\nconst props = defineProps({\n open: {\n type: Boolean,\n default: false,\n },\n searchConfig: {\n type: Array as PropType<SearchConfig[]>,\n default: () => [],\n },\n viewSearchConfig: {\n type: Object as PropType<Record<string, ViewSearchItem>>,\n default: () => ({}),\n },\n});\n\nconst emit = defineEmits(['update:open', 'change']);\n\nconst { t } = useI18n();\n\nconst visible = ref(false);\nconst leftSearch = ref('');\nconst rightSearch = ref('');\nconst leftSelectedRowKeys = ref<string[]>([]);\nconst rightSelectedRowKeys = ref<string[]>([]);\nconst rightData = ref<SearchConfig[]>([]);\n\nconst leftColumns = [\n {\n title: t('字段名称'),\n dataIndex: 'label',\n key: 'label',\n width: 250,\n ellipsis: true,\n },\n];\n\nconst rightColumns = computed(() => {\n const columns: any = [\n {\n title: t('字段名称'),\n dataIndex: 'label',\n key: 'label',\n rowDrag: true,\n width: 150,\n ellipsis: true,\n },\n ];\n if (filteredRightData.value.length > 0) {\n if (filteredRightData.value.some(item => item.group_name)) {\n columns.push({\n title: t('分组'),\n dataIndex: 'group_name',\n key: 'group_name',\n width: 150,\n ellipsis: true,\n });\n }\n }\n return columns;\n});\n\nwatch(\n () => props.open,\n val => {\n visible.value = val;\n if (val) {\n leftSearch.value = '';\n rightSearch.value = '';\n initData();\n }\n },\n);\n\nwatch(visible, val => {\n emit('update:open', val);\n});\n\nconst initData = () => {\n // 根据 viewSearchConfig 和 searchConfig 初始化右侧数据\n const configMap = new Map();\n props.searchConfig.forEach(item => {\n configMap.set(item.field_name, item);\n });\n\n const selectedFields: SearchConfig[] = [];\n\n if (props.viewSearchConfig && Object.keys(props.viewSearchConfig).length > 0) {\n // 先处理 viewSearchConfig 中已有的配置\n Object.keys(props.viewSearchConfig).forEach(fieldName => {\n const viewItem = props.viewSearchConfig[fieldName];\n if (viewItem.checked && configMap.has(fieldName)) {\n selectedFields.push({\n ...configMap.get(fieldName),\n order: viewItem.order ?? 0,\n });\n }\n });\n // 排序\n selectedFields.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n } else {\n // 当 viewSearchConfig 为空时,所有 item.checked !== false 的字段都是选中字段\n props.searchConfig.forEach((item, index) => {\n if (item.checked !== false) {\n selectedFields.push({\n ...item,\n order: index + 1,\n });\n }\n });\n }\n\n rightData.value = cloneDeep(selectedFields);\n\n leftSelectedRowKeys.value = [];\n rightSelectedRowKeys.value = [];\n};\n\nconst leftData = computed(() => {\n const selectedKeys = new Set(rightData.value.map(item => item.field_name));\n const groups: Record<string, any[]> = {};\n const noGroup: any[] = [];\n\n props.searchConfig.forEach(item => {\n const itemData = {\n ...item,\n is_selected: selectedKeys.has(item.field_name),\n };\n if (item.group_name) {\n if (!groups[item.group_name]) {\n groups[item.group_name] = [];\n }\n groups[item.group_name].push(itemData);\n } else {\n noGroup.push(itemData);\n }\n });\n\n const result: any[] = [];\n Object.keys(groups).forEach(groupName => {\n result.push({\n field_name: `group_${groupName}`,\n label: groupName,\n is_group: true,\n children: groups[groupName],\n });\n });\n\n return [...result, ...noGroup];\n});\n\nconst filteredLeftData = computed(() => {\n if (!leftSearch.value) return leftData.value;\n const search = leftSearch.value.toLowerCase();\n\n const filterNode = (nodes: any[]) => {\n return nodes.reduce((acc: any[], node: any) => {\n const matchSelf =\n node.label?.toLowerCase().includes(search) ||\n node.field_name?.toLowerCase().includes(search);\n\n if (node.children) {\n const filteredChildren = filterNode(node.children);\n if (filteredChildren.length > 0) {\n acc.push({ ...node, children: filteredChildren });\n } else if (matchSelf) {\n acc.push({ ...node, children: [] });\n }\n } else if (matchSelf) {\n acc.push(node);\n }\n return acc;\n }, []);\n };\n\n return filterNode(leftData.value);\n});\n\nconst filteredRightData = computed(() => {\n if (!rightSearch.value) return rightData.value;\n const search = rightSearch.value.toLowerCase();\n return rightData.value.filter(\n item =>\n item.label?.toLowerCase().includes(search) || item.field_name?.toLowerCase().includes(search),\n );\n});\n\nconst leftRowSelection = {\n onChange: (selectedRowKeys: string[]) => {\n leftSelectedRowKeys.value = selectedRowKeys;\n },\n getCheckboxProps: (record: any) => ({\n disabled: record.is_group || record.is_selected,\n }),\n};\n\nconst rightRowSelection = {\n onChange: (selectedRowKeys: string[]) => {\n rightSelectedRowKeys.value = selectedRowKeys;\n },\n};\n\nconst moveToRight = () => {\n const selectedKeys = new Set(leftSelectedRowKeys.value);\n const toMove: SearchConfig[] = [];\n\n // 遍历所有 searchConfig,按原始顺序找到匹配项\n props.searchConfig.forEach(item => {\n if (selectedKeys.has(item.field_name)) {\n toMove.push(item);\n }\n });\n\n if (toMove.length > 0) {\n rightData.value = [...rightData.value, ...cloneDeep(toMove)];\n }\n leftSelectedRowKeys.value = [];\n};\n\nconst moveToLeft = () => {\n rightData.value = rightData.value.filter(\n item => !rightSelectedRowKeys.value.includes(item.field_name),\n );\n rightSelectedRowKeys.value = [];\n};\n\nconst onRowDragEnd = ({ oldIndex, newIndex }) => {\n const target = rightData.value.splice(oldIndex, 1)[0];\n rightData.value.splice(newIndex, 0, target);\n};\n\nconst handleOk = () => {\n const result: Record<string, ViewSearchItem> = {};\n\n // 处理所有字段,默认为未选中\n props.searchConfig.forEach(item => {\n result[item.field_name] = {\n checked: false,\n order: 0,\n };\n });\n\n // 更新已选中的字段\n rightData.value.forEach((item, index) => {\n result[item.field_name] = {\n checked: true,\n order: index + 1,\n };\n });\n\n emit('change', result);\n visible.value = false;\n};\n\nconst handleCancel = () => {\n visible.value = false;\n};\n</script>\n\n<style lang=\"less\" scoped>\n.search-config-container {\n display: flex;\n align-items: center;\n gap: 16px;\n height: 70vh;\n .table-wrapper {\n width: 450px;\n border: 1px solid #f0f0f0;\n border-radius: 4px;\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: auto;\n\n .table-title {\n padding: 8px 12px;\n background: #fafafa;\n border-bottom: 1px solid #f0f0f0;\n font-weight: bold;\n }\n }\n\n .middle-btns {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n}\n</style>\n","<template>\n <a-modal\n :title=\"$t('设置搜索字段')\"\n v-model:open=\"visible\"\n width=\"1000px\"\n @ok=\"handleOk\"\n @cancel=\"handleCancel\"\n >\n <div class=\"search-config-container\">\n <div class=\"table-wrapper left-table\">\n <div class=\"table-title\">\n {{ $t('所有字段') }}\n <a-input\n v-model:value=\"leftSearch\"\n size=\"small\"\n :placeholder=\"$t('搜索标签/字段名')\"\n style=\"margin-top: 8px\"\n allow-clear\n />\n </div>\n <s-table\n :columns=\"leftColumns\"\n :data-source=\"filteredLeftData\"\n :pagination=\"false\"\n :row-selection=\"leftRowSelection\"\n v-model:selectedRowKeys=\"leftSelectedRowKeys\"\n row-key=\"field_name\"\n size=\"small\"\n :row-class-name=\"record => (record.is_selected ? 'row-selected' : '')\"\n expand-row-by-click\n >\n <template #bodyCell=\"{ column, record }\">\n <template v-if=\"column.dataIndex === 'label'\">\n <span\n :style=\"{\n color: record.is_selected ? '#ccc' : 'inherit',\n }\"\n >\n {{ record.label }}\n </span>\n </template>\n </template>\n </s-table>\n </div>\n\n <div class=\"middle-btns\">\n <a-button\n type=\"primary\"\n shape=\"circle\"\n :disabled=\"leftSelectedRowKeys.length === 0\"\n @click=\"moveToRight\"\n >\n <template #icon><RightOutlined /></template>\n </a-button>\n <a-button\n type=\"primary\"\n shape=\"circle\"\n :disabled=\"rightSelectedRowKeys.length === 0\"\n @click=\"moveToLeft\"\n >\n <template #icon><LeftOutlined /></template>\n </a-button>\n </div>\n\n <div class=\"table-wrapper right-table\">\n <div class=\"table-title\">\n {{ $t('已选字段') }}\n <a-input\n v-model:value=\"rightSearch\"\n size=\"small\"\n :placeholder=\"$t('搜索标签/字段名')\"\n style=\"margin-top: 8px\"\n allow-clear\n />\n </div>\n <s-table\n :columns=\"rightColumns\"\n :data-source=\"filteredRightData\"\n :pagination=\"false\"\n :row-selection=\"rightRowSelection\"\n v-model:selectedRowKeys=\"rightSelectedRowKeys\"\n row-key=\"field_name\"\n size=\"small\"\n @row-drag-end=\"onRowDragEnd\"\n />\n </div>\n </div>\n </a-modal>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, PropType } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport { RightOutlined, LeftOutlined } from '@ant-design/icons-vue';\nimport { SearchConfig, ViewSearchItem } from '../typing';\nimport { cloneDeep } from 'lodash';\n\nconst props = defineProps({\n open: {\n type: Boolean,\n default: false,\n },\n searchConfig: {\n type: Array as PropType<SearchConfig[]>,\n default: () => [],\n },\n viewSearchConfig: {\n type: Object as PropType<Record<string, ViewSearchItem>>,\n default: () => ({}),\n },\n});\n\nconst emit = defineEmits(['update:open', 'change']);\n\nconst { t } = useI18n();\n\nconst visible = ref(false);\nconst leftSearch = ref('');\nconst rightSearch = ref('');\nconst leftSelectedRowKeys = ref<string[]>([]);\nconst rightSelectedRowKeys = ref<string[]>([]);\nconst rightData = ref<SearchConfig[]>([]);\n\nconst leftColumns = [\n {\n title: t('字段名称'),\n dataIndex: 'label',\n key: 'label',\n width: 250,\n ellipsis: true,\n },\n];\n\nconst rightColumns = computed(() => {\n const columns: any = [\n {\n title: t('字段名称'),\n dataIndex: 'label',\n key: 'label',\n rowDrag: true,\n width: 150,\n ellipsis: true,\n },\n ];\n if (filteredRightData.value.length > 0) {\n if (filteredRightData.value.some(item => item.group_name)) {\n columns.push({\n title: t('分组'),\n dataIndex: 'group_name',\n key: 'group_name',\n width: 150,\n ellipsis: true,\n });\n }\n }\n return columns;\n});\n\nwatch(\n () => props.open,\n val => {\n visible.value = val;\n if (val) {\n leftSearch.value = '';\n rightSearch.value = '';\n initData();\n }\n },\n);\n\nwatch(visible, val => {\n emit('update:open', val);\n});\n\nconst initData = () => {\n // 根据 viewSearchConfig 和 searchConfig 初始化右侧数据\n const configMap = new Map();\n props.searchConfig.forEach(item => {\n configMap.set(item.field_name, item);\n });\n\n const selectedFields: SearchConfig[] = [];\n\n if (props.viewSearchConfig && Object.keys(props.viewSearchConfig).length > 0) {\n // 先处理 viewSearchConfig 中已有的配置\n Object.keys(props.viewSearchConfig).forEach(fieldName => {\n const viewItem = props.viewSearchConfig[fieldName];\n if (viewItem.checked && configMap.has(fieldName)) {\n selectedFields.push({\n ...configMap.get(fieldName),\n order: viewItem.order ?? 0,\n });\n }\n });\n // 排序\n selectedFields.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n } else {\n // 当 viewSearchConfig 为空时,所有 item.checked !== false 的字段都是选中字段\n props.searchConfig.forEach((item, index) => {\n if (item.checked !== false) {\n selectedFields.push({\n ...item,\n order: index + 1,\n });\n }\n });\n }\n\n rightData.value = cloneDeep(selectedFields);\n\n leftSelectedRowKeys.value = [];\n rightSelectedRowKeys.value = [];\n};\n\nconst leftData = computed(() => {\n const selectedKeys = new Set(rightData.value.map(item => item.field_name));\n const groups: Record<string, any[]> = {};\n const noGroup: any[] = [];\n\n props.searchConfig.forEach(item => {\n const itemData = {\n ...item,\n is_selected: selectedKeys.has(item.field_name),\n };\n if (item.group_name) {\n if (!groups[item.group_name]) {\n groups[item.group_name] = [];\n }\n groups[item.group_name].push(itemData);\n } else {\n noGroup.push(itemData);\n }\n });\n\n const result: any[] = [];\n Object.keys(groups).forEach(groupName => {\n result.push({\n field_name: `group_${groupName}`,\n label: groupName,\n is_group: true,\n children: groups[groupName],\n });\n });\n\n return [...result, ...noGroup];\n});\n\nconst filteredLeftData = computed(() => {\n if (!leftSearch.value) return leftData.value;\n const search = leftSearch.value.toLowerCase();\n\n const filterNode = (nodes: any[]) => {\n return nodes.reduce((acc: any[], node: any) => {\n const matchSelf =\n node.label?.toLowerCase().includes(search) ||\n node.field_name?.toLowerCase().includes(search);\n\n if (node.children) {\n const filteredChildren = filterNode(node.children);\n if (filteredChildren.length > 0) {\n acc.push({ ...node, children: filteredChildren });\n } else if (matchSelf) {\n acc.push({ ...node, children: [] });\n }\n } else if (matchSelf) {\n acc.push(node);\n }\n return acc;\n }, []);\n };\n\n return filterNode(leftData.value);\n});\n\nconst filteredRightData = computed(() => {\n if (!rightSearch.value) return rightData.value;\n const search = rightSearch.value.toLowerCase();\n return rightData.value.filter(\n item =>\n item.label?.toLowerCase().includes(search) || item.field_name?.toLowerCase().includes(search),\n );\n});\n\nconst leftRowSelection = {\n onChange: (selectedRowKeys: string[]) => {\n leftSelectedRowKeys.value = selectedRowKeys;\n },\n getCheckboxProps: (record: any) => ({\n disabled: record.is_group || record.is_selected,\n }),\n};\n\nconst rightRowSelection = {\n onChange: (selectedRowKeys: string[]) => {\n rightSelectedRowKeys.value = selectedRowKeys;\n },\n};\n\nconst moveToRight = () => {\n const selectedKeys = new Set(leftSelectedRowKeys.value);\n const toMove: SearchConfig[] = [];\n\n // 遍历所有 searchConfig,按原始顺序找到匹配项\n props.searchConfig.forEach(item => {\n if (selectedKeys.has(item.field_name)) {\n toMove.push(item);\n }\n });\n\n if (toMove.length > 0) {\n rightData.value = [...rightData.value, ...cloneDeep(toMove)];\n }\n leftSelectedRowKeys.value = [];\n};\n\nconst moveToLeft = () => {\n rightData.value = rightData.value.filter(\n item => !rightSelectedRowKeys.value.includes(item.field_name),\n );\n rightSelectedRowKeys.value = [];\n};\n\nconst onRowDragEnd = ({ oldIndex, newIndex }) => {\n const target = rightData.value.splice(oldIndex, 1)[0];\n rightData.value.splice(newIndex, 0, target);\n};\n\nconst handleOk = () => {\n const result: Record<string, ViewSearchItem> = {};\n\n // 处理所有字段,默认为未选中\n props.searchConfig.forEach(item => {\n result[item.field_name] = {\n checked: false,\n order: 0,\n };\n });\n\n // 更新已选中的字段\n rightData.value.forEach((item, index) => {\n result[item.field_name] = {\n checked: true,\n order: index + 1,\n };\n });\n\n emit('change', result);\n visible.value = false;\n};\n\nconst handleCancel = () => {\n visible.value = false;\n};\n</script>\n\n<style lang=\"less\" scoped>\n.search-config-container {\n display: flex;\n align-items: center;\n gap: 16px;\n height: 70vh;\n .table-wrapper {\n width: 450px;\n border: 1px solid #f0f0f0;\n border-radius: 4px;\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: auto;\n\n .table-title {\n padding: 8px 12px;\n background: #fafafa;\n border-bottom: 1px solid #f0f0f0;\n font-weight: bold;\n }\n }\n\n .middle-btns {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n}\n</style>\n","<template>\n <span\n class=\"search-switch\"\n v-if=\"search_display_type !== 'show_no_hide'\"\n >\n <a-button\n v-if=\"!isShowForm\"\n type=\"link\"\n size=\"small\"\n @click=\"isShowForm = true\"\n >\n <span class=\"expand-btn\">{{ $t('展开') }}</span>\n </a-button>\n <div v-else>\n <a-button\n type=\"link\"\n size=\"small\"\n @click=\"isShowForm = false\"\n >\n {{ $t('隐藏') }}\n </a-button>\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"searchConfigVisible = true\"\n v-if=\"config?.sys_btn?.search_field_config !== false\"\n >\n <a-tooltip :title=\"$t('设置搜索字段')\">\n <SettingOutlined />\n </a-tooltip>\n </a-button>\n </div>\n </span>\n <search-config-modal\n v-model:open=\"searchConfigVisible\"\n :search-config=\"searchConfig\"\n :view-search-config=\"viewSearchConfig\"\n @change=\"handleSearchConfigChange\"\n />\n <search-summary\n v-if=\"!isShowForm\"\n :search-conditions=\"searchConditions\"\n :search-config=\"searchConfig\"\n :event-bus=\"eventBus\"\n :searchType=\"searchType\"\n @update:searchConditions=\"handleUpdateSearchConditions\"\n />\n <div\n v-if=\"isShowForm\"\n class=\"search-form-wraper\"\n :class=\"{ 'search-form-grid': searchColumnCount > 0 }\"\n :style=\"{\n '--column-count': searchColumnCount || 0,\n }\"\n >\n <a-form\n :layout=\"searchColumnCount > 0 ? 'horizontal' : 'inline'\"\n :class=\"{ 'search-form-grid-inner': searchColumnCount > 0 }\"\n >\n <template\n v-for=\"(condition, k) in dataSource\"\n :key=\"condition.field_name\"\n >\n <div\n v-if=\"condition.is_group\"\n class=\"search-group-title\"\n >\n {{ condition.label }}\n </div>\n <a-form-item v-else>\n <template #label>\n <span\n :title=\"condition.label\"\n class=\"search-item-label-text\"\n >\n {{ condition.label }}\n </span>\n </template>\n <a-input-group\n compact\n size=\"small\"\n >\n <a-select\n v-if=\"condition.operator_list.length > 0 && searchType === 'advanced'\"\n :dropdownMatchSelectWidth=\"false\"\n :value=\"condition.operator\"\n @change=\"onChange(condition.field_name, 'operator', $event)\"\n size=\"small\"\n >\n <a-select-option\n v-for=\"item in condition.operator_list\"\n :value=\"item\"\n :key=\"item\"\n >\n {{ operator_type_map[item] }}\n </a-select-option>\n </a-select>\n <template\n v-if=\"['is_or_not_blank_or_null', 'is_or_not_null'].includes(condition.operator)\"\n >\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{\n ...condition,\n type: 'select',\n mode: 'default',\n format: 'choices',\n class_name: 'str',\n placeholder: '',\n }\"\n :formModel=\"formModel\"\n :options=\"is_or_not_blank_or_null_options\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n :field_width=\"condition.field_width || 155\"\n />\n </template>\n <template\n v-if=\"condition.operator === 'between' || condition.operator === 'notbetween'\"\n >\n <template v-if=\"condition.type === 'datepicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{ ...condition, type: 'rangepicker', format: condition.dateFormat }\"\n :formModel=\"formModel\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width ? condition.field_width * 2 : 320\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template v-else-if=\"condition.type === 'monthpicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{\n ...condition,\n type: 'monthrangepicker',\n }\"\n :formModel=\"formModel\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width ? condition.field_width * 2 : 320\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template v-else>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"condition.value?.[0]\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 165\"\n @update:value=\"onChange(condition.field_name, 'value', $event, 0)\"\n />\n <span class=\"range\">~</span>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"condition.value?.[1]\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 165\"\n @update:value=\"onChange(condition.field_name, 'value', $event, 1)\"\n />\n </template>\n </template>\n <template v-else-if=\"condition.operator === '_eq'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{\n ...condition,\n type: 'select',\n mode: 'default',\n format: 'choices',\n class_name: 'str',\n placeholder: '',\n }\"\n :formModel=\"formModel\"\n :options=\"options_for_date_eq\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 165\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template\n v-else-if=\"condition.type === 'datepicker' || condition.type === 'monthpicker'\"\n >\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{ ...condition, format: condition.dateFormat }\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 165\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template v-else>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{ ...condition, name: condition?.field_name }\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 165\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n </a-input-group>\n </a-form-item>\n </template>\n <div\n class=\"btn-content\"\n v-if=\"!searchColumnCount && !autoRefreshOnSearchChange\"\n >\n <a-button\n size=\"small\"\n type=\"primary\"\n @click=\"handleRefresh\"\n >\n 查询\n </a-button>\n </div>\n </a-form>\n </div>\n <div\n class=\"bottom-content\"\n v-if=\"searchColumnCount && isShowForm && !autoRefreshOnSearchChange\"\n >\n <a-button\n size=\"small\"\n type=\"primary\"\n @click=\"handleRefresh\"\n >\n 查询\n </a-button>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { cloneDeep, debounce } from 'lodash';\nimport { computed, onMounted, PropType, ref } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport searchSummary from './searchSummary.vue';\nimport SearchConfigModal from './tableConfig/searchConfig.vue';\nimport { Condition, SearchConfig, SearchDisplayType, SearchType, ViewSearchItem } from './typing';\nimport SmallTableSerarchField from 'liyu-pc-base/components/FormRender/SmallTableSerarchField.vue';\nimport { getParamsCount, operator_type_map, options_for_date_eq, useTableProState } from './utils';\nimport { isEmpty, isNotEmpty } from 'liyu-pc-base/utils/function';\n\ndefineOptions({\n name: 'Search',\n});\n\nconst props = defineProps({\n searchConfig: {\n type: Array as PropType<SearchConfig[]>,\n required: true,\n },\n searchConditions: {\n type: Array<Condition>,\n required: true,\n },\n eventBus: {\n type: Object as any,\n required: false,\n },\n searchType: {\n type: String as () => SearchType,\n default: 'advanced',\n },\n searchDisplayType: {\n type: String as () => SearchDisplayType,\n default: 'hide',\n },\n searchColumnCount: {\n type: Number,\n default: 0,\n },\n viewSearchConfig: {\n type: Object as PropType<Record<string, ViewSearchItem>>,\n default: () => ({}),\n },\n autoRefreshOnSearchChange: {\n type: Boolean,\n default: false,\n },\n});\n\nconst emit = defineEmits(['update:searchConditions', 'viewSearchConfigChange', 'change']);\n\nconst { t } = useI18n();\nconst isShowForm = ref(false);\nconst searchConfigVisible = ref(false);\nconst formModel = ref<Record<string, any>>({});\nconst validateInfos = ref({});\nconst { config } = useTableProState();\n\nconst is_or_not_blank_or_null_options = ref([\n { value: 'yes', label: t('is_or_not_blank_or_null.yes') },\n { value: 'no', label: t('is_or_not_blank_or_null.no') },\n]);\n\nconst dataSource = computed(() => {\n const searchConditionsMap: Record<string, any> = {};\n for (const condition of props.searchConditions) {\n searchConditionsMap[condition.field_name] = {\n value: condition.value,\n operator: condition.operator,\n };\n }\n\n // 1. 过滤并处理基础字段数据\n const flatData = props.searchConfig\n ?.filter(item => {\n if (props.viewSearchConfig[item.field_name]) {\n return props.viewSearchConfig[item.field_name].checked !== false;\n } else {\n return item.checked !== false;\n }\n })\n ?.map(configItem => {\n const data = searchConditionsMap[configItem.field_name] || {\n operator: configItem.default_operator || 'eq',\n value: undefined,\n };\n let formValue = data.value;\n if (isNotEmpty(data.value)) {\n const paramsCount = getParamsCount(data.operator, configItem);\n if (paramsCount === 1 && formValue instanceof Array) {\n formValue = formValue[0];\n }\n }\n formModel.value[configItem.field_name] = formValue;\n return {\n ...configItem,\n value: data.value,\n operator: data.operator,\n model: 'default',\n _order: props.viewSearchConfig[configItem.field_name]?.order || 0,\n };\n })\n .sort((a, b) => a._order - b._order);\n\n // 2. 仿照 searchConfig.vue 的逻辑进行分组处理\n const groups: Record<string, any[]> = {};\n const orderList: any[] = []; // 用于记录分组和无分组字段的出现顺序\n\n flatData.forEach(item => {\n if (item.group_name) {\n if (!groups[item.group_name]) {\n groups[item.group_name] = [];\n orderList.push({\n field_name: `group_${item.group_name}`,\n label: item.group_name,\n is_group: true,\n _group_key: item.group_name,\n });\n }\n groups[item.group_name].push(item);\n } else {\n orderList.push(item);\n }\n });\n\n // 3. 构造最终的扁平数组,将组成员插在标题后\n const finalResult: any[] = [];\n orderList.forEach(item => {\n if (item.is_group) {\n finalResult.push(item);\n finalResult.push(...groups[item._group_key]);\n } else {\n finalResult.push(item);\n }\n });\n\n return finalResult;\n});\n\nconst getValue = (configItemAndValue: any) => {\n const value_count = getParamsCount(configItemAndValue.operator, configItemAndValue);\n let value = configItemAndValue.value;\n if (value_count == 1) {\n if (value instanceof Array) {\n return value[0] || undefined;\n } else {\n return value || undefined;\n }\n } else if (value_count == 2) {\n if (value instanceof Array) {\n const [first, seconds] = value;\n return [first, seconds];\n } else if (value) {\n const first = value;\n return [first, null];\n } else {\n return [null, null];\n }\n } else {\n return value;\n }\n};\nconst delayRefresh = debounce(() => {\n props.eventBus.emit('refresh');\n}, 500);\n\nconst onChange = (\n field_name: string,\n type: 'value' | 'operator',\n newValue: any,\n array_index: number | undefined = undefined,\n) => {\n const conditions = cloneDeep(props.searchConditions);\n const configItem = props.searchConfig.find(item => item.field_name === field_name);\n let value: any;\n let operator: string;\n let condition = conditions.find(item => item.field_name === field_name);\n if (type === 'value') {\n if (condition) {\n operator = condition.operator;\n } else {\n operator = configItem?.default_operator || 'eq';\n }\n if (array_index !== undefined) {\n const value_count = getParamsCount(newValue, configItem);\n if (condition) {\n value = condition.value;\n if (isEmpty(value) || !(value instanceof Array)) {\n value = [];\n for (let i = 0; i < value_count; i++) {\n value.push(null);\n }\n }\n value[array_index] = newValue;\n } else {\n value = [];\n for (let i = 0; i < value_count; i++) {\n value.push(null);\n }\n value[array_index] = newValue;\n }\n } else {\n if (isNotEmpty(newValue) && !(newValue instanceof Array)) {\n newValue = [newValue];\n }\n value = newValue;\n }\n } else if (type === 'operator') {\n operator = newValue;\n const value_count = getParamsCount(newValue, configItem);\n if (value_count) {\n value = [];\n for (let i = 0; i < value_count; i++) {\n value.push(null);\n }\n } else {\n value = undefined;\n }\n }\n if (condition) {\n condition.operator = operator!;\n condition.value = value;\n } else {\n let format = 'input';\n let class_name = 'str';\n if (configItem) {\n format = configItem.format || 'input';\n class_name = configItem.class_name || 'str';\n }\n condition = {\n field_name: field_name,\n value,\n operator: operator!,\n format,\n class_name,\n };\n conditions.push(condition);\n }\n emit('update:searchConditions', conditions);\n emit('change', conditions);\n if (props.autoRefreshOnSearchChange) {\n delayRefresh();\n }\n};\n\nconst handleUpdateSearchConditions = (newConditions: Condition[]) => {\n emit('update:searchConditions', newConditions);\n};\n\nconst handleRefresh = () => {\n props.eventBus.emit('refresh');\n};\n\nconst handleSearchConfigChange = (data: any) => {\n emit('viewSearchConfigChange', data);\n};\n\nconst search_display_type = computed(() => {\n return props.searchDisplayType || 'hide';\n});\n\nonMounted(() => {\n if (['show', 'show_no_hide'].includes(search_display_type.value)) {\n isShowForm.value = true;\n }\n});\n</script>\n\n<style lang=\"less\" scoped>\n.card {\n overflow: auto;\n max-height: 300px;\n background: #f2f5f7;\n}\n\n.condition-group {\n padding: 5px;\n}\n\n.close-icon {\n width: 15px;\n margin-top: 5px;\n margin-left: 5px;\n color: red;\n}\n\n.search-bar {\n background: #f2f5f7;\n text-align: right;\n}\n\n:deep(.divider .ant-divider) {\n margin: 0;\n}\n.search-form-wraper {\n padding-left: 2px;\n padding-right: 2px;\n max-height: 300px;\n overflow-y: auto;\n}\n.search-group-title {\n grid-column: span calc(var(--column-count) * 2);\n font-weight: bold;\n padding: 8px 4px 4px 4px;\n margin-bottom: 4px;\n border-bottom: 1px solid #f0f0f0;\n color: var(--primary-color, #1890ff);\n display: flex;\n align-items: center;\n width: 100%;\n flex-basis: 100%;\n &:not(:first-child) {\n margin-top: 8px;\n }\n}\n.search-form-grid {\n .search-form-grid-inner {\n display: grid;\n grid-template-columns: repeat(var(--column-count), max-content 1fr);\n gap: 2px 8px;\n align-items: center;\n .search-group-title {\n grid-column: span calc(var(--column-count) * 2);\n &:not(:first-child) {\n margin-top: 8px;\n }\n }\n :deep(.ant-form-item) {\n display: contents;\n margin-right: 0;\n margin-bottom: 2px;\n .ant-form-item-row,\n .ant-form-item-label,\n .ant-form-item-control,\n .ant-form-item-control-input,\n .ant-form-item-control-input-content {\n display: contents;\n }\n }\n .btn-content {\n grid-column: span calc(var(--column-count) * 2);\n }\n :deep(.ant-form-item-label) {\n justify-self: end;\n display: flex !important;\n align-items: center;\n max-width: 150px;\n .search-item-label-text {\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n padding-right: 8px;\n text-align: right;\n }\n }\n :deep(.ant-input-group) {\n display: flex !important;\n width: 100%;\n }\n }\n}\n.btn-content {\n padding: 4px;\n margin-left: auto;\n}\n.search-switch {\n display: inline-block;\n line-height: 32px;\n height: 32px;\n}\n:deep(.ant-select-selection-placeholder) {\n overflow: hidden;\n width: 100%;\n}\n.bottom-content {\n display: flex;\n justify-content: flex-end;\n padding: 8px 26px 8px 8px;\n}\n</style>\n","<template>\n <span\n class=\"search-switch\"\n v-if=\"search_display_type !== 'show_no_hide'\"\n >\n <a-button\n v-if=\"!isShowForm\"\n type=\"link\"\n size=\"small\"\n @click=\"isShowForm = true\"\n >\n <span class=\"expand-btn\">{{ $t('展开') }}</span>\n </a-button>\n <div v-else>\n <a-button\n type=\"link\"\n size=\"small\"\n @click=\"isShowForm = false\"\n >\n {{ $t('隐藏') }}\n </a-button>\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"searchConfigVisible = true\"\n v-if=\"config?.sys_btn?.search_field_config !== false\"\n >\n <a-tooltip :title=\"$t('设置搜索字段')\">\n <SettingOutlined />\n </a-tooltip>\n </a-button>\n </div>\n </span>\n <search-config-modal\n v-model:open=\"searchConfigVisible\"\n :search-config=\"searchConfig\"\n :view-search-config=\"viewSearchConfig\"\n @change=\"handleSearchConfigChange\"\n />\n <search-summary\n v-if=\"!isShowForm\"\n :search-conditions=\"searchConditions\"\n :search-config=\"searchConfig\"\n :event-bus=\"eventBus\"\n :searchType=\"searchType\"\n @update:searchConditions=\"handleUpdateSearchConditions\"\n />\n <div\n v-if=\"isShowForm\"\n class=\"search-form-wraper\"\n :class=\"{ 'search-form-grid': searchColumnCount > 0 }\"\n :style=\"{\n '--column-count': searchColumnCount || 0,\n }\"\n >\n <a-form\n :layout=\"searchColumnCount > 0 ? 'horizontal' : 'inline'\"\n :class=\"{ 'search-form-grid-inner': searchColumnCount > 0 }\"\n >\n <template\n v-for=\"(condition, k) in dataSource\"\n :key=\"condition.field_name\"\n >\n <div\n v-if=\"condition.is_group\"\n class=\"search-group-title\"\n >\n {{ condition.label }}\n </div>\n <a-form-item v-else>\n <template #label>\n <span\n :title=\"condition.label\"\n class=\"search-item-label-text\"\n >\n {{ condition.label }}\n </span>\n </template>\n <a-input-group\n compact\n size=\"small\"\n >\n <a-select\n v-if=\"condition.operator_list.length > 0 && searchType === 'advanced'\"\n :dropdownMatchSelectWidth=\"false\"\n :value=\"condition.operator\"\n @change=\"onChange(condition.field_name, 'operator', $event)\"\n size=\"small\"\n >\n <a-select-option\n v-for=\"item in condition.operator_list\"\n :value=\"item\"\n :key=\"item\"\n >\n {{ operator_type_map[item] }}\n </a-select-option>\n </a-select>\n <template\n v-if=\"['is_or_not_blank_or_null', 'is_or_not_null'].includes(condition.operator)\"\n >\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{\n ...condition,\n type: 'select',\n mode: 'default',\n format: 'choices',\n class_name: 'str',\n placeholder: '',\n }\"\n :formModel=\"formModel\"\n :options=\"is_or_not_blank_or_null_options\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n :field_width=\"condition.field_width || 155\"\n />\n </template>\n <template\n v-if=\"condition.operator === 'between' || condition.operator === 'notbetween'\"\n >\n <template v-if=\"condition.type === 'datepicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{ ...condition, type: 'rangepicker', format: condition.dateFormat }\"\n :formModel=\"formModel\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width ? condition.field_width * 2 : 320\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template v-else-if=\"condition.type === 'monthpicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{\n ...condition,\n type: 'monthrangepicker',\n }\"\n :formModel=\"formModel\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width ? condition.field_width * 2 : 320\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template v-else>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"condition.value?.[0]\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 165\"\n @update:value=\"onChange(condition.field_name, 'value', $event, 0)\"\n />\n <span class=\"range\">~</span>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"condition.value?.[1]\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 165\"\n @update:value=\"onChange(condition.field_name, 'value', $event, 1)\"\n />\n </template>\n </template>\n <template v-else-if=\"condition.operator === '_eq'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{\n ...condition,\n type: 'select',\n mode: 'default',\n format: 'choices',\n class_name: 'str',\n placeholder: '',\n }\"\n :formModel=\"formModel\"\n :options=\"options_for_date_eq\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 165\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template\n v-else-if=\"condition.type === 'datepicker' || condition.type === 'monthpicker'\"\n >\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{ ...condition, format: condition.dateFormat }\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 165\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template v-else>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{ ...condition, name: condition?.field_name }\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 165\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n </a-input-group>\n </a-form-item>\n </template>\n <div\n class=\"btn-content\"\n v-if=\"!searchColumnCount && !autoRefreshOnSearchChange\"\n >\n <a-button\n size=\"small\"\n type=\"primary\"\n @click=\"handleRefresh\"\n >\n 查询\n </a-button>\n </div>\n </a-form>\n </div>\n <div\n class=\"bottom-content\"\n v-if=\"searchColumnCount && isShowForm && !autoRefreshOnSearchChange\"\n >\n <a-button\n size=\"small\"\n type=\"primary\"\n @click=\"handleRefresh\"\n >\n 查询\n </a-button>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { cloneDeep, debounce } from 'lodash';\nimport { computed, onMounted, PropType, ref } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport searchSummary from './searchSummary.vue';\nimport SearchConfigModal from './tableConfig/searchConfig.vue';\nimport { Condition, SearchConfig, SearchDisplayType, SearchType, ViewSearchItem } from './typing';\nimport SmallTableSerarchField from 'liyu-pc-base/components/FormRender/SmallTableSerarchField.vue';\nimport { getParamsCount, operator_type_map, options_for_date_eq, useTableProState } from './utils';\nimport { isEmpty, isNotEmpty } from 'liyu-pc-base/utils/function';\n\ndefineOptions({\n name: 'Search',\n});\n\nconst props = defineProps({\n searchConfig: {\n type: Array as PropType<SearchConfig[]>,\n required: true,\n },\n searchConditions: {\n type: Array<Condition>,\n required: true,\n },\n eventBus: {\n type: Object as any,\n required: false,\n },\n searchType: {\n type: String as () => SearchType,\n default: 'advanced',\n },\n searchDisplayType: {\n type: String as () => SearchDisplayType,\n default: 'hide',\n },\n searchColumnCount: {\n type: Number,\n default: 0,\n },\n viewSearchConfig: {\n type: Object as PropType<Record<string, ViewSearchItem>>,\n default: () => ({}),\n },\n autoRefreshOnSearchChange: {\n type: Boolean,\n default: false,\n },\n});\n\nconst emit = defineEmits(['update:searchConditions', 'viewSearchConfigChange', 'change']);\n\nconst { t } = useI18n();\nconst isShowForm = ref(false);\nconst searchConfigVisible = ref(false);\nconst formModel = ref<Record<string, any>>({});\nconst validateInfos = ref({});\nconst { config } = useTableProState();\n\nconst is_or_not_blank_or_null_options = ref([\n { value: 'yes', label: t('is_or_not_blank_or_null.yes') },\n { value: 'no', label: t('is_or_not_blank_or_null.no') },\n]);\n\nconst dataSource = computed(() => {\n const searchConditionsMap: Record<string, any> = {};\n for (const condition of props.searchConditions) {\n searchConditionsMap[condition.field_name] = {\n value: condition.value,\n operator: condition.operator,\n };\n }\n\n // 1. 过滤并处理基础字段数据\n const flatData = props.searchConfig\n ?.filter(item => {\n if (props.viewSearchConfig[item.field_name]) {\n return props.viewSearchConfig[item.field_name].checked !== false;\n } else {\n return item.checked !== false;\n }\n })\n ?.map(configItem => {\n const data = searchConditionsMap[configItem.field_name] || {\n operator: configItem.default_operator || 'eq',\n value: undefined,\n };\n let formValue = data.value;\n if (isNotEmpty(data.value)) {\n const paramsCount = getParamsCount(data.operator, configItem);\n if (paramsCount === 1 && formValue instanceof Array) {\n formValue = formValue[0];\n }\n }\n formModel.value[configItem.field_name] = formValue;\n return {\n ...configItem,\n value: data.value,\n operator: data.operator,\n model: 'default',\n _order: props.viewSearchConfig[configItem.field_name]?.order || 0,\n };\n })\n .sort((a, b) => a._order - b._order);\n\n // 2. 仿照 searchConfig.vue 的逻辑进行分组处理\n const groups: Record<string, any[]> = {};\n const orderList: any[] = []; // 用于记录分组和无分组字段的出现顺序\n\n flatData.forEach(item => {\n if (item.group_name) {\n if (!groups[item.group_name]) {\n groups[item.group_name] = [];\n orderList.push({\n field_name: `group_${item.group_name}`,\n label: item.group_name,\n is_group: true,\n _group_key: item.group_name,\n });\n }\n groups[item.group_name].push(item);\n } else {\n orderList.push(item);\n }\n });\n\n // 3. 构造最终的扁平数组,将组成员插在标题后\n const finalResult: any[] = [];\n orderList.forEach(item => {\n if (item.is_group) {\n finalResult.push(item);\n finalResult.push(...groups[item._group_key]);\n } else {\n finalResult.push(item);\n }\n });\n\n return finalResult;\n});\n\nconst getValue = (configItemAndValue: any) => {\n const value_count = getParamsCount(configItemAndValue.operator, configItemAndValue);\n let value = configItemAndValue.value;\n if (value_count == 1) {\n if (value instanceof Array) {\n return value[0] || undefined;\n } else {\n return value || undefined;\n }\n } else if (value_count == 2) {\n if (value instanceof Array) {\n const [first, seconds] = value;\n return [first, seconds];\n } else if (value) {\n const first = value;\n return [first, null];\n } else {\n return [null, null];\n }\n } else {\n return value;\n }\n};\nconst delayRefresh = debounce(() => {\n props.eventBus.emit('refresh');\n}, 500);\n\nconst onChange = (\n field_name: string,\n type: 'value' | 'operator',\n newValue: any,\n array_index: number | undefined = undefined,\n) => {\n const conditions = cloneDeep(props.searchConditions);\n const configItem = props.searchConfig.find(item => item.field_name === field_name);\n let value: any;\n let operator: string;\n let condition = conditions.find(item => item.field_name === field_name);\n if (type === 'value') {\n if (condition) {\n operator = condition.operator;\n } else {\n operator = configItem?.default_operator || 'eq';\n }\n if (array_index !== undefined) {\n const value_count = getParamsCount(newValue, configItem);\n if (condition) {\n value = condition.value;\n if (isEmpty(value) || !(value instanceof Array)) {\n value = [];\n for (let i = 0; i < value_count; i++) {\n value.push(null);\n }\n }\n value[array_index] = newValue;\n } else {\n value = [];\n for (let i = 0; i < value_count; i++) {\n value.push(null);\n }\n value[array_index] = newValue;\n }\n } else {\n if (isNotEmpty(newValue) && !(newValue instanceof Array)) {\n newValue = [newValue];\n }\n value = newValue;\n }\n } else if (type === 'operator') {\n operator = newValue;\n const value_count = getParamsCount(newValue, configItem);\n if (value_count) {\n value = [];\n for (let i = 0; i < value_count; i++) {\n value.push(null);\n }\n } else {\n value = undefined;\n }\n }\n if (condition) {\n condition.operator = operator!;\n condition.value = value;\n } else {\n let format = 'input';\n let class_name = 'str';\n if (configItem) {\n format = configItem.format || 'input';\n class_name = configItem.class_name || 'str';\n }\n condition = {\n field_name: field_name,\n value,\n operator: operator!,\n format,\n class_name,\n };\n conditions.push(condition);\n }\n emit('update:searchConditions', conditions);\n emit('change', conditions);\n if (props.autoRefreshOnSearchChange) {\n delayRefresh();\n }\n};\n\nconst handleUpdateSearchConditions = (newConditions: Condition[]) => {\n emit('update:searchConditions', newConditions);\n};\n\nconst handleRefresh = () => {\n props.eventBus.emit('refresh');\n};\n\nconst handleSearchConfigChange = (data: any) => {\n emit('viewSearchConfigChange', data);\n};\n\nconst search_display_type = computed(() => {\n return props.searchDisplayType || 'hide';\n});\n\nonMounted(() => {\n if (['show', 'show_no_hide'].includes(search_display_type.value)) {\n isShowForm.value = true;\n }\n});\n</script>\n\n<style lang=\"less\" scoped>\n.card {\n overflow: auto;\n max-height: 300px;\n background: #f2f5f7;\n}\n\n.condition-group {\n padding: 5px;\n}\n\n.close-icon {\n width: 15px;\n margin-top: 5px;\n margin-left: 5px;\n color: red;\n}\n\n.search-bar {\n background: #f2f5f7;\n text-align: right;\n}\n\n:deep(.divider .ant-divider) {\n margin: 0;\n}\n.search-form-wraper {\n padding-left: 2px;\n padding-right: 2px;\n max-height: 300px;\n overflow-y: auto;\n}\n.search-group-title {\n grid-column: span calc(var(--column-count) * 2);\n font-weight: bold;\n padding: 8px 4px 4px 4px;\n margin-bottom: 4px;\n border-bottom: 1px solid #f0f0f0;\n color: var(--primary-color, #1890ff);\n display: flex;\n align-items: center;\n width: 100%;\n flex-basis: 100%;\n &:not(:first-child) {\n margin-top: 8px;\n }\n}\n.search-form-grid {\n .search-form-grid-inner {\n display: grid;\n grid-template-columns: repeat(var(--column-count), max-content 1fr);\n gap: 2px 8px;\n align-items: center;\n .search-group-title {\n grid-column: span calc(var(--column-count) * 2);\n &:not(:first-child) {\n margin-top: 8px;\n }\n }\n :deep(.ant-form-item) {\n display: contents;\n margin-right: 0;\n margin-bottom: 2px;\n .ant-form-item-row,\n .ant-form-item-label,\n .ant-form-item-control,\n .ant-form-item-control-input,\n .ant-form-item-control-input-content {\n display: contents;\n }\n }\n .btn-content {\n grid-column: span calc(var(--column-count) * 2);\n }\n :deep(.ant-form-item-label) {\n justify-self: end;\n display: flex !important;\n align-items: center;\n max-width: 150px;\n .search-item-label-text {\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n padding-right: 8px;\n text-align: right;\n }\n }\n :deep(.ant-input-group) {\n display: flex !important;\n width: 100%;\n }\n }\n}\n.btn-content {\n padding: 4px;\n margin-left: auto;\n}\n.search-switch {\n display: inline-block;\n line-height: 32px;\n height: 32px;\n}\n:deep(.ant-select-selection-placeholder) {\n overflow: hidden;\n width: 100%;\n}\n.bottom-content {\n display: flex;\n justify-content: flex-end;\n padding: 8px 26px 8px 8px;\n}\n</style>\n","<template>\n <div style=\"padding: 8px\">\n <a-input-group\n compact\n size=\"small\"\n style=\"margin-bottom: 8px; display: flex\"\n >\n <a-select\n v-if=\"condition.operator_list?.length > 0 && searchType === 'advanced'\"\n :dropdownMatchSelectWidth=\"false\"\n :value=\"condition.operator\"\n @change=\"onChange('operator', $event)\"\n size=\"small\"\n >\n <a-select-option\n v-for=\"item in condition.operator_list\"\n :value=\"item\"\n :key=\"item\"\n >\n {{ operator_type_map[item] }}\n </a-select-option>\n </a-select>\n <template v-if=\"['is_or_not_blank_or_null', 'is_or_not_null'].includes(condition.operator)\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{\n ...condition,\n type: 'select',\n mode: 'default',\n format: 'choices',\n class_name: 'str',\n placeholder: '',\n }\"\n :formModel=\"formModel\"\n :options=\"is_or_not_blank_or_null_options\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange('value', $event)\"\n :field_width=\"condition.field_width || 155\"\n />\n </template>\n <template v-else-if=\"['between', 'notbetween'].includes(condition.operator)\">\n <template v-if=\"condition.type === 'datepicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{\n ...condition,\n type: 'rangepicker',\n format: condition.dateFormat,\n }\"\n :formModel=\"formModel\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width ? condition.field_width * 2 : 320\"\n @update:value=\"onChange('value', $event)\"\n />\n </template>\n <template v-else-if=\"condition.type === 'monthpicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{\n ...condition,\n type: 'monthrangepicker',\n }\"\n :formModel=\"formModel\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width ? condition.field_width * 2 : 320\"\n @update:value=\"onChange('value', $event)\"\n />\n </template>\n <template v-else>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue?.[0]\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 155\"\n @update:value=\"onChange('value', $event, 0)\"\n />\n <span\n class=\"range\"\n style=\"padding: 0 4px; line-height: 24px\"\n >\n ~\n </span>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue?.[1]\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 155\"\n @update:value=\"onChange('value', $event, 1)\"\n />\n </template>\n </template>\n <template v-else-if=\"condition.operator === '_eq'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{\n ...condition,\n type: 'select',\n mode: 'default',\n format: 'choices',\n class_name: 'str',\n placeholder: '',\n }\"\n :formModel=\"formModel\"\n :options=\"options_for_date_eq\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 155\"\n @update:value=\"onChange('value', $event)\"\n />\n </template>\n <template v-else-if=\"condition.type === 'datepicker' || condition.type === 'monthpicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{ ...condition, format: condition.dateFormat }\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 155\"\n @update:value=\"onChange('value', $event)\"\n />\n </template>\n <template v-else>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{\n ...condition,\n name: column.dataIndex,\n }\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 155\"\n @update:value=\"onChange('value', $event)\"\n />\n </template>\n </a-input-group>\n <div style=\"display: flex; justify-content: flex-end\">\n <a-button\n type=\"primary\"\n size=\"small\"\n style=\"width: 70px; margin-right: 8px\"\n @click=\"handleSearch\"\n >\n 查询\n </a-button>\n <a-button\n size=\"small\"\n style=\"width: 70px\"\n @click=\"handleReset\"\n >\n 重置\n </a-button>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, PropType, ref } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport SmallTableSerarchField from 'liyu-pc-base/components/FormRender/SmallTableSerarchField.vue';\nimport { getParamsCount, operator_type_map, options_for_date_eq } from './utils';\nimport { Column, SearchConditionItem, SearchConfig, SearchType } from './typing';\nimport { isArray } from 'lodash';\nimport { ConditionOperator } from 'liyu-pc-base/api/typing';\n\nconst props = defineProps({\n column: {\n type: Object as PropType<Column>,\n required: true,\n },\n searchConfig: {\n type: Array as PropType<SearchConfig[]>,\n required: true,\n },\n searchConditions: {\n type: Array as PropType<SearchConditionItem[]>,\n required: true,\n },\n searchType: {\n type: String as PropType<SearchType>,\n default: 'advanced',\n },\n confirm: {\n type: Function as PropType<() => void>,\n required: true,\n },\n clearFilters: {\n type: Function as PropType<() => void>,\n required: true,\n },\n});\n\nconst emit = defineEmits(['search', 'reset', 'update:searchConditions']);\n\nconst { t } = useI18n();\nconst formModel = ref<Record<string, any>>({});\nconst validateInfos = ref({});\n\nconst is_or_not_blank_or_null_options = ref([\n { value: 'yes', label: t('is_or_not_blank_or_null.yes') },\n { value: 'no', label: t('is_or_not_blank_or_null.no') },\n]);\n\nconst condition = computed<any>(() => {\n const dataIndex = props.column.dataIndex;\n const currentCondition = props.searchConditions.find(item => item.field_name === dataIndex);\n const configItem = props.searchConfig?.find(item => item.field_name === dataIndex);\n if (currentCondition) {\n return {\n ...configItem,\n ...currentCondition,\n };\n }\n return {\n ...configItem,\n operator: configItem?.default_operator || 'eq',\n value: undefined,\n };\n});\n\nconst fieldValue = computed(() => {\n const dataIndex = props.column.dataIndex;\n const configItem = props.searchConfig?.find(item => item.field_name === dataIndex);\n if (!configItem) return undefined;\n const value_count = getParamsCount(condition.value.operator, configItem);\n let value = condition.value.value;\n if (value_count == 1) {\n if (value instanceof Array) {\n return value[0] || undefined;\n } else {\n return value || undefined;\n }\n } else if (value_count == 2) {\n if (value instanceof Array) {\n return [value[0], value[1]];\n } else if (value) {\n return [value, null];\n } else {\n return [null, null];\n }\n } else {\n return value;\n }\n});\n\nconst onChange = (type: 'value' | 'operator', newValue: any, array_index?: number) => {\n const field_name = props.column.dataIndex!;\n const conditions = [...props.searchConditions];\n const configItem = props.searchConfig.find(item => item.field_name === field_name);\n if (!configItem) return;\n let value: any;\n let operator: ConditionOperator;\n let currentCondition = conditions.find(item => item.field_name === field_name);\n\n if (type === 'value') {\n operator = currentCondition\n ? currentCondition.operator\n : (configItem?.default_operator as ConditionOperator) || 'eq';\n if (array_index !== undefined) {\n const value_count = getParamsCount(operator, configItem);\n value = currentCondition?.value;\n if (!value || !isArray(value)) {\n value = new Array(value_count).fill(null);\n } else {\n value = [...value];\n }\n value[array_index] = newValue;\n } else {\n value = isArray(newValue)\n ? newValue\n : newValue !== undefined && newValue !== null\n ? [newValue]\n : [];\n }\n } else {\n operator = newValue as ConditionOperator;\n const value_count = getParamsCount(newValue, configItem);\n value = value_count ? new Array(value_count).fill(null) : undefined;\n }\n\n if (currentCondition) {\n currentCondition.operator = operator;\n currentCondition.value = value;\n } else {\n conditions.push({\n field_name,\n value,\n operator: operator,\n format: configItem?.format || 'input',\n class_name: configItem?.class_name || 'str',\n });\n }\n\n formModel.value[field_name] = isArray(value) ? value[0] : value;\n emit('update:searchConditions', conditions);\n};\n\nconst handleSearch = () => {\n const dataIndex = props.column.dataIndex!;\n const activeCondition = props.searchConditions.find(item => item.field_name === dataIndex);\n let searchVal = '';\n if (activeCondition) {\n searchVal = isArray(activeCondition.value) ? activeCondition.value[0] : activeCondition.value;\n }\n emit('search', { confirm: props.confirm, dataIndex, value: searchVal });\n};\n\nconst handleReset = () => {\n emit('reset', { clearFilters: props.clearFilters, dataIndex: props.column.dataIndex });\n};\n</script>\n","<template>\n <div style=\"padding: 8px\">\n <a-input-group\n compact\n size=\"small\"\n style=\"margin-bottom: 8px; display: flex\"\n >\n <a-select\n v-if=\"condition.operator_list?.length > 0 && searchType === 'advanced'\"\n :dropdownMatchSelectWidth=\"false\"\n :value=\"condition.operator\"\n @change=\"onChange('operator', $event)\"\n size=\"small\"\n >\n <a-select-option\n v-for=\"item in condition.operator_list\"\n :value=\"item\"\n :key=\"item\"\n >\n {{ operator_type_map[item] }}\n </a-select-option>\n </a-select>\n <template v-if=\"['is_or_not_blank_or_null', 'is_or_not_null'].includes(condition.operator)\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{\n ...condition,\n type: 'select',\n mode: 'default',\n format: 'choices',\n class_name: 'str',\n placeholder: '',\n }\"\n :formModel=\"formModel\"\n :options=\"is_or_not_blank_or_null_options\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange('value', $event)\"\n :field_width=\"condition.field_width || 155\"\n />\n </template>\n <template v-else-if=\"['between', 'notbetween'].includes(condition.operator)\">\n <template v-if=\"condition.type === 'datepicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{\n ...condition,\n type: 'rangepicker',\n format: condition.dateFormat,\n }\"\n :formModel=\"formModel\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width ? condition.field_width * 2 : 320\"\n @update:value=\"onChange('value', $event)\"\n />\n </template>\n <template v-else-if=\"condition.type === 'monthpicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{\n ...condition,\n type: 'monthrangepicker',\n }\"\n :formModel=\"formModel\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width ? condition.field_width * 2 : 320\"\n @update:value=\"onChange('value', $event)\"\n />\n </template>\n <template v-else>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue?.[0]\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 155\"\n @update:value=\"onChange('value', $event, 0)\"\n />\n <span\n class=\"range\"\n style=\"padding: 0 4px; line-height: 24px\"\n >\n ~\n </span>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue?.[1]\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 155\"\n @update:value=\"onChange('value', $event, 1)\"\n />\n </template>\n </template>\n <template v-else-if=\"condition.operator === '_eq'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{\n ...condition,\n type: 'select',\n mode: 'default',\n format: 'choices',\n class_name: 'str',\n placeholder: '',\n }\"\n :formModel=\"formModel\"\n :options=\"options_for_date_eq\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 155\"\n @update:value=\"onChange('value', $event)\"\n />\n </template>\n <template v-else-if=\"condition.type === 'datepicker' || condition.type === 'monthpicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{ ...condition, format: condition.dateFormat }\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 155\"\n @update:value=\"onChange('value', $event)\"\n />\n </template>\n <template v-else>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{\n ...condition,\n name: column.dataIndex,\n }\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 155\"\n @update:value=\"onChange('value', $event)\"\n />\n </template>\n </a-input-group>\n <div style=\"display: flex; justify-content: flex-end\">\n <a-button\n type=\"primary\"\n size=\"small\"\n style=\"width: 70px; margin-right: 8px\"\n @click=\"handleSearch\"\n >\n 查询\n </a-button>\n <a-button\n size=\"small\"\n style=\"width: 70px\"\n @click=\"handleReset\"\n >\n 重置\n </a-button>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, PropType, ref } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport SmallTableSerarchField from 'liyu-pc-base/components/FormRender/SmallTableSerarchField.vue';\nimport { getParamsCount, operator_type_map, options_for_date_eq } from './utils';\nimport { Column, SearchConditionItem, SearchConfig, SearchType } from './typing';\nimport { isArray } from 'lodash';\nimport { ConditionOperator } from 'liyu-pc-base/api/typing';\n\nconst props = defineProps({\n column: {\n type: Object as PropType<Column>,\n required: true,\n },\n searchConfig: {\n type: Array as PropType<SearchConfig[]>,\n required: true,\n },\n searchConditions: {\n type: Array as PropType<SearchConditionItem[]>,\n required: true,\n },\n searchType: {\n type: String as PropType<SearchType>,\n default: 'advanced',\n },\n confirm: {\n type: Function as PropType<() => void>,\n required: true,\n },\n clearFilters: {\n type: Function as PropType<() => void>,\n required: true,\n },\n});\n\nconst emit = defineEmits(['search', 'reset', 'update:searchConditions']);\n\nconst { t } = useI18n();\nconst formModel = ref<Record<string, any>>({});\nconst validateInfos = ref({});\n\nconst is_or_not_blank_or_null_options = ref([\n { value: 'yes', label: t('is_or_not_blank_or_null.yes') },\n { value: 'no', label: t('is_or_not_blank_or_null.no') },\n]);\n\nconst condition = computed<any>(() => {\n const dataIndex = props.column.dataIndex;\n const currentCondition = props.searchConditions.find(item => item.field_name === dataIndex);\n const configItem = props.searchConfig?.find(item => item.field_name === dataIndex);\n if (currentCondition) {\n return {\n ...configItem,\n ...currentCondition,\n };\n }\n return {\n ...configItem,\n operator: configItem?.default_operator || 'eq',\n value: undefined,\n };\n});\n\nconst fieldValue = computed(() => {\n const dataIndex = props.column.dataIndex;\n const configItem = props.searchConfig?.find(item => item.field_name === dataIndex);\n if (!configItem) return undefined;\n const value_count = getParamsCount(condition.value.operator, configItem);\n let value = condition.value.value;\n if (value_count == 1) {\n if (value instanceof Array) {\n return value[0] || undefined;\n } else {\n return value || undefined;\n }\n } else if (value_count == 2) {\n if (value instanceof Array) {\n return [value[0], value[1]];\n } else if (value) {\n return [value, null];\n } else {\n return [null, null];\n }\n } else {\n return value;\n }\n});\n\nconst onChange = (type: 'value' | 'operator', newValue: any, array_index?: number) => {\n const field_name = props.column.dataIndex!;\n const conditions = [...props.searchConditions];\n const configItem = props.searchConfig.find(item => item.field_name === field_name);\n if (!configItem) return;\n let value: any;\n let operator: ConditionOperator;\n let currentCondition = conditions.find(item => item.field_name === field_name);\n\n if (type === 'value') {\n operator = currentCondition\n ? currentCondition.operator\n : (configItem?.default_operator as ConditionOperator) || 'eq';\n if (array_index !== undefined) {\n const value_count = getParamsCount(operator, configItem);\n value = currentCondition?.value;\n if (!value || !isArray(value)) {\n value = new Array(value_count).fill(null);\n } else {\n value = [...value];\n }\n value[array_index] = newValue;\n } else {\n value = isArray(newValue)\n ? newValue\n : newValue !== undefined && newValue !== null\n ? [newValue]\n : [];\n }\n } else {\n operator = newValue as ConditionOperator;\n const value_count = getParamsCount(newValue, configItem);\n value = value_count ? new Array(value_count).fill(null) : undefined;\n }\n\n if (currentCondition) {\n currentCondition.operator = operator;\n currentCondition.value = value;\n } else {\n conditions.push({\n field_name,\n value,\n operator: operator,\n format: configItem?.format || 'input',\n class_name: configItem?.class_name || 'str',\n });\n }\n\n formModel.value[field_name] = isArray(value) ? value[0] : value;\n emit('update:searchConditions', conditions);\n};\n\nconst handleSearch = () => {\n const dataIndex = props.column.dataIndex!;\n const activeCondition = props.searchConditions.find(item => item.field_name === dataIndex);\n let searchVal = '';\n if (activeCondition) {\n searchVal = isArray(activeCondition.value) ? activeCondition.value[0] : activeCondition.value;\n }\n emit('search', { confirm: props.confirm, dataIndex, value: searchVal });\n};\n\nconst handleReset = () => {\n emit('reset', { clearFilters: props.clearFilters, dataIndex: props.column.dataIndex });\n};\n</script>\n","<template>\n <div class=\"columns-config-wrapper\">\n <a-input\n v-model:value=\"searchText\"\n :placeholder=\"$t('搜索列名/字段名')\"\n allow-clear\n style=\"margin-bottom: 8px\"\n />\n <s-table\n :columns=\"columnsConfig\"\n :rowHeight=\"30\"\n :data-source=\"filteredDataSource\"\n :row-selection=\"rowSelection\"\n v-model:selectedRowKeys=\"selectedRowKeys\"\n expand-row-by-click\n @row-drag-end=\"onRowDragEnd\"\n :row-key=\"'key'\"\n :pagination=\"false\"\n >\n <template #bodyCell=\"{ column, index, text, record }\">\n <template v-if=\"column.dataIndex == 'fixed'\">\n <a-radio-group\n v-if=\"!record?.is_children\"\n v-model:value=\"record.fixed\"\n size=\"small\"\n @change=\"change_fixed\"\n >\n <a-radio-button value=\"left\">{{ $t('左') }}</a-radio-button>\n <a-radio-button :value=\"undefined\">{{ $t('不固定') }}</a-radio-button>\n <a-radio-button value=\"right\">{{ $t('右') }}</a-radio-button>\n </a-radio-group>\n </template>\n <template v-if=\"column.dataIndex == 'autoHeight'\">\n <a-switch\n v-if=\"!(record.children && record.children.length > 0)\"\n v-model:checked=\"record.autoHeight\"\n :checked-value=\"true\"\n :un-checked-value=\"false\"\n :checked-children=\"$t('自动')\"\n :un-checked-children=\"$t('固定')\"\n @change=\"change_autoHeight\"\n />\n </template>\n <template v-if=\"column.dataIndex == 'autoWidth'\">\n <a-switch\n v-if=\"!(record.children && record.children.length > 0) && record?.resizable\"\n v-model:checked=\"record.autoWidth\"\n :checked-value=\"true\"\n :un-checked-value=\"false\"\n :checked-children=\"$t('自动')\"\n :un-checked-children=\"$t('固定')\"\n @click=\"change_autoWidth\"\n />\n </template>\n <template v-if=\"column.dataIndex == 'ellipsis'\">\n <a-switch\n v-if=\"!(record.children && record.children.length > 0) && record?.resizable\"\n v-model:checked=\"record.ellipsis\"\n :checked-value=\"true\"\n :un-checked-value=\"false\"\n :checked-children=\"$t('开启')\"\n :un-checked-children=\"$t('关闭')\"\n @click=\"change_ellipsis(record)\"\n />\n </template>\n </template>\n </s-table>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, ref } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport { Column } from '../typing';\n\nexport default defineComponent({\n name: 'ColumnsConfig',\n props: {\n columns: {\n type: Array as () => Array<Column>,\n default: () => [],\n },\n },\n emits: ['change'],\n setup(props, { emit }) {\n const { t } = useI18n();\n const searchText = ref('');\n\n const columnsConfig = ref([\n {\n title: t('列名称'),\n dataIndex: 'title',\n key: 'title',\n rowDrag: true,\n width: 270,\n },\n {\n title: t('冻结列'),\n dataIndex: 'fixed',\n key: 'fixed',\n width: 200,\n },\n {\n title: t('行高'),\n dataIndex: 'autoHeight',\n width: 100,\n key: 'autoHeight',\n },\n {\n title: t('列宽'),\n dataIndex: 'autoWidth',\n width: 100,\n key: 'autoWidth',\n },\n {\n title: t('超宽省略'),\n dataIndex: 'ellipsis',\n width: 100,\n key: 'ellipsis',\n },\n ]);\n\n const dataSource = computed(() => {\n return props.columns.filter(item => item.key !== 'index' && item.key !== 'action');\n });\n\n const filteredDataSource = computed(() => {\n if (!searchText.value) return dataSource.value;\n const search = searchText.value.toLowerCase();\n\n const filterNode = (nodes: any[]) => {\n return nodes.reduce((acc: any[], node: any) => {\n const matchSelf =\n node.title?.toLowerCase().includes(search) ||\n node.dataIndex?.toLowerCase().includes(search) ||\n node.key?.toLowerCase().includes(search);\n\n if (node.children && node.children.length > 0) {\n const filteredChildren = filterNode(node.children);\n if (filteredChildren.length > 0) {\n acc.push({ ...node, children: filteredChildren });\n } else if (matchSelf) {\n acc.push({ ...node, children: [] });\n }\n } else if (matchSelf) {\n acc.push(node);\n }\n return acc;\n }, []);\n };\n\n return filterNode(dataSource.value);\n });\n\n const getAllKeysChecked = (children: any) => {\n let allChildrenChecked = true;\n children.forEach((item: any) => {\n if (item.children && item.children.length > 0) {\n allChildrenChecked = allChildrenChecked && getAllKeysChecked(item.children);\n } else {\n allChildrenChecked = allChildrenChecked && item?.checked !== false;\n }\n });\n return allChildrenChecked;\n };\n\n const add_selectedRowKeys = (record: any) => {\n let list = [];\n record.children.forEach((item: any) => {\n if (item.children && item.children.length > 0) {\n const allChildrenChecked = getAllKeysChecked(item.children);\n if (allChildrenChecked) {\n list.push(item.key);\n }\n list = list.concat(add_selectedRowKeys(item));\n } else {\n if (item?.checked !== false) {\n list.push(item.key);\n }\n }\n });\n return list;\n };\n\n const selectedRowKeys = computed(() => {\n if (props.columns) {\n let list = [];\n props.columns.forEach((item: any) => {\n if (item.children && item.children.length > 0) {\n const allChildrenChecked = getAllKeysChecked(item.children);\n if (allChildrenChecked) {\n list.push(item.key);\n }\n list = list.concat(add_selectedRowKeys(item));\n } else {\n if (item?.checked) {\n list.push(item.key);\n }\n }\n });\n return list;\n } else {\n return [];\n }\n });\n\n const rowSelection = ref({\n checkStrictly: false,\n hideSelectAll: true,\n onSelect: (record: any, selected: boolean) => {\n const change_selecte_children_props = (children: any) => {\n children.forEach((item: any) => {\n if (item.children && item.children.length > 0) {\n change_selecte_children_props(item.children);\n }\n item.checked = selected;\n });\n };\n\n const change_selecte_props = (obj: any, key: any, is_checked: any) => {\n obj.children.forEach((item: any) => {\n if (item.key == key) {\n if (is_checked && item.children && item.children.length > 0) {\n change_selecte_children_props(item.children);\n }\n if (selected) {\n item.checked = true;\n obj.checked = true;\n if (obj.is_children) {\n change_selecte_dataSource(obj.key, false);\n }\n } else {\n item.checked = false;\n }\n }\n if (item.children && item.children.length > 0) {\n change_selecte_props(item, key, is_checked);\n }\n });\n };\n\n const change_selecte_dataSource = (key: any, is_checked: any) => {\n dataSource.value.forEach((item: any) => {\n if (item.key == key) {\n if (item.children && item.children.length > 0) {\n change_selecte_children_props(item.children);\n }\n item.checked = selected;\n }\n if (item.children && item.children.length > 0) {\n change_selecte_props(item, key, is_checked);\n }\n });\n };\n\n change_selecte_dataSource(record.key, true);\n emit('change', dataSource.value);\n },\n });\n\n const findParent = (data: any[], childKey: any) => {\n let foundParentKey: any;\n const searchParent = (id: any, keys: any[], childKeys: any) => {\n for (const key of keys) {\n if (key.key === childKeys) {\n foundParentKey = id;\n return foundParentKey;\n } else if (key.children && key.children.length > 0) {\n foundParentKey = searchParent(key.key, key.children, childKeys);\n if (foundParentKey !== undefined) return foundParentKey;\n }\n }\n return undefined;\n };\n return searchParent(null, data, childKey);\n };\n\n const onRowDragEnd = ({ record, preTargetInfo, nextTargetInfo }) => {\n return new Promise((reslove, reject) => {\n // 获取当前拖拽节点的父节点ID\n const currentParentId = findParent(dataSource.value, record.key);\n\n if (preTargetInfo) {\n // 如果拖拽到某个节点之后,检查该目标节点的父节点是否与当前节点相同\n const targetParentId = findParent(dataSource.value, preTargetInfo.record.key);\n if (currentParentId === targetParentId) {\n reslove(true);\n } else {\n reject();\n }\n } else if (nextTargetInfo) {\n // 如果拖拽到某个节点之前,检查该目标节点的父节点是否与当前节点相同\n const targetParentId = findParent(dataSource.value, nextTargetInfo.record.key);\n if (currentParentId === targetParentId) {\n reslove(true);\n } else {\n reject();\n }\n } else {\n reject();\n }\n }).then(() => {\n setTimeout(() => {\n emit('change', dataSource.value);\n }, 200);\n });\n };\n\n const change_fixed = () => emit('change', dataSource.value);\n const change_autoHeight = () => emit('change', dataSource.value);\n const change_autoWidth = () => emit('change', dataSource.value);\n\n const recursion_change_ellipsis = (obj: any, record: any) => {\n obj.children.forEach((item: any) => {\n if (item.key == record.key) {\n item.ellipsis = record.ellipsis;\n }\n if (item.children && item.children.length > 0) {\n recursion_change_ellipsis(item, record);\n }\n });\n };\n\n const change_ellipsis = (record: any) => {\n const list = dataSource.value;\n list.forEach((item: any) => {\n if (item.key == record.key) {\n item.ellipsis = record.ellipsis;\n }\n if (item.children && item.children.length > 0) {\n recursion_change_ellipsis(item, record);\n }\n });\n emit('change', list);\n };\n\n return {\n searchText,\n columnsConfig,\n dataSource,\n filteredDataSource,\n rowSelection,\n selectedRowKeys,\n onRowDragEnd,\n change_fixed,\n change_autoHeight,\n change_autoWidth,\n change_ellipsis,\n };\n },\n});\n</script>\n\n<style lang=\"less\" scoped>\n.columns-config-wrapper {\n padding: 8px 0;\n}\n</style>\n","<template>\n <div class=\"columns-config-wrapper\">\n <a-input\n v-model:value=\"searchText\"\n :placeholder=\"$t('搜索列名/字段名')\"\n allow-clear\n style=\"margin-bottom: 8px\"\n />\n <s-table\n :columns=\"columnsConfig\"\n :rowHeight=\"30\"\n :data-source=\"filteredDataSource\"\n :row-selection=\"rowSelection\"\n v-model:selectedRowKeys=\"selectedRowKeys\"\n expand-row-by-click\n @row-drag-end=\"onRowDragEnd\"\n :row-key=\"'key'\"\n :pagination=\"false\"\n >\n <template #bodyCell=\"{ column, index, text, record }\">\n <template v-if=\"column.dataIndex == 'fixed'\">\n <a-radio-group\n v-if=\"!record?.is_children\"\n v-model:value=\"record.fixed\"\n size=\"small\"\n @change=\"change_fixed\"\n >\n <a-radio-button value=\"left\">{{ $t('左') }}</a-radio-button>\n <a-radio-button :value=\"undefined\">{{ $t('不固定') }}</a-radio-button>\n <a-radio-button value=\"right\">{{ $t('右') }}</a-radio-button>\n </a-radio-group>\n </template>\n <template v-if=\"column.dataIndex == 'autoHeight'\">\n <a-switch\n v-if=\"!(record.children && record.children.length > 0)\"\n v-model:checked=\"record.autoHeight\"\n :checked-value=\"true\"\n :un-checked-value=\"false\"\n :checked-children=\"$t('自动')\"\n :un-checked-children=\"$t('固定')\"\n @change=\"change_autoHeight\"\n />\n </template>\n <template v-if=\"column.dataIndex == 'autoWidth'\">\n <a-switch\n v-if=\"!(record.children && record.children.length > 0) && record?.resizable\"\n v-model:checked=\"record.autoWidth\"\n :checked-value=\"true\"\n :un-checked-value=\"false\"\n :checked-children=\"$t('自动')\"\n :un-checked-children=\"$t('固定')\"\n @click=\"change_autoWidth\"\n />\n </template>\n <template v-if=\"column.dataIndex == 'ellipsis'\">\n <a-switch\n v-if=\"!(record.children && record.children.length > 0) && record?.resizable\"\n v-model:checked=\"record.ellipsis\"\n :checked-value=\"true\"\n :un-checked-value=\"false\"\n :checked-children=\"$t('开启')\"\n :un-checked-children=\"$t('关闭')\"\n @click=\"change_ellipsis(record)\"\n />\n </template>\n </template>\n </s-table>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, ref } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport { Column } from '../typing';\n\nexport default defineComponent({\n name: 'ColumnsConfig',\n props: {\n columns: {\n type: Array as () => Array<Column>,\n default: () => [],\n },\n },\n emits: ['change'],\n setup(props, { emit }) {\n const { t } = useI18n();\n const searchText = ref('');\n\n const columnsConfig = ref([\n {\n title: t('列名称'),\n dataIndex: 'title',\n key: 'title',\n rowDrag: true,\n width: 270,\n },\n {\n title: t('冻结列'),\n dataIndex: 'fixed',\n key: 'fixed',\n width: 200,\n },\n {\n title: t('行高'),\n dataIndex: 'autoHeight',\n width: 100,\n key: 'autoHeight',\n },\n {\n title: t('列宽'),\n dataIndex: 'autoWidth',\n width: 100,\n key: 'autoWidth',\n },\n {\n title: t('超宽省略'),\n dataIndex: 'ellipsis',\n width: 100,\n key: 'ellipsis',\n },\n ]);\n\n const dataSource = computed(() => {\n return props.columns.filter(item => item.key !== 'index' && item.key !== 'action');\n });\n\n const filteredDataSource = computed(() => {\n if (!searchText.value) return dataSource.value;\n const search = searchText.value.toLowerCase();\n\n const filterNode = (nodes: any[]) => {\n return nodes.reduce((acc: any[], node: any) => {\n const matchSelf =\n node.title?.toLowerCase().includes(search) ||\n node.dataIndex?.toLowerCase().includes(search) ||\n node.key?.toLowerCase().includes(search);\n\n if (node.children && node.children.length > 0) {\n const filteredChildren = filterNode(node.children);\n if (filteredChildren.length > 0) {\n acc.push({ ...node, children: filteredChildren });\n } else if (matchSelf) {\n acc.push({ ...node, children: [] });\n }\n } else if (matchSelf) {\n acc.push(node);\n }\n return acc;\n }, []);\n };\n\n return filterNode(dataSource.value);\n });\n\n const getAllKeysChecked = (children: any) => {\n let allChildrenChecked = true;\n children.forEach((item: any) => {\n if (item.children && item.children.length > 0) {\n allChildrenChecked = allChildrenChecked && getAllKeysChecked(item.children);\n } else {\n allChildrenChecked = allChildrenChecked && item?.checked !== false;\n }\n });\n return allChildrenChecked;\n };\n\n const add_selectedRowKeys = (record: any) => {\n let list = [];\n record.children.forEach((item: any) => {\n if (item.children && item.children.length > 0) {\n const allChildrenChecked = getAllKeysChecked(item.children);\n if (allChildrenChecked) {\n list.push(item.key);\n }\n list = list.concat(add_selectedRowKeys(item));\n } else {\n if (item?.checked !== false) {\n list.push(item.key);\n }\n }\n });\n return list;\n };\n\n const selectedRowKeys = computed(() => {\n if (props.columns) {\n let list = [];\n props.columns.forEach((item: any) => {\n if (item.children && item.children.length > 0) {\n const allChildrenChecked = getAllKeysChecked(item.children);\n if (allChildrenChecked) {\n list.push(item.key);\n }\n list = list.concat(add_selectedRowKeys(item));\n } else {\n if (item?.checked) {\n list.push(item.key);\n }\n }\n });\n return list;\n } else {\n return [];\n }\n });\n\n const rowSelection = ref({\n checkStrictly: false,\n hideSelectAll: true,\n onSelect: (record: any, selected: boolean) => {\n const change_selecte_children_props = (children: any) => {\n children.forEach((item: any) => {\n if (item.children && item.children.length > 0) {\n change_selecte_children_props(item.children);\n }\n item.checked = selected;\n });\n };\n\n const change_selecte_props = (obj: any, key: any, is_checked: any) => {\n obj.children.forEach((item: any) => {\n if (item.key == key) {\n if (is_checked && item.children && item.children.length > 0) {\n change_selecte_children_props(item.children);\n }\n if (selected) {\n item.checked = true;\n obj.checked = true;\n if (obj.is_children) {\n change_selecte_dataSource(obj.key, false);\n }\n } else {\n item.checked = false;\n }\n }\n if (item.children && item.children.length > 0) {\n change_selecte_props(item, key, is_checked);\n }\n });\n };\n\n const change_selecte_dataSource = (key: any, is_checked: any) => {\n dataSource.value.forEach((item: any) => {\n if (item.key == key) {\n if (item.children && item.children.length > 0) {\n change_selecte_children_props(item.children);\n }\n item.checked = selected;\n }\n if (item.children && item.children.length > 0) {\n change_selecte_props(item, key, is_checked);\n }\n });\n };\n\n change_selecte_dataSource(record.key, true);\n emit('change', dataSource.value);\n },\n });\n\n const findParent = (data: any[], childKey: any) => {\n let foundParentKey: any;\n const searchParent = (id: any, keys: any[], childKeys: any) => {\n for (const key of keys) {\n if (key.key === childKeys) {\n foundParentKey = id;\n return foundParentKey;\n } else if (key.children && key.children.length > 0) {\n foundParentKey = searchParent(key.key, key.children, childKeys);\n if (foundParentKey !== undefined) return foundParentKey;\n }\n }\n return undefined;\n };\n return searchParent(null, data, childKey);\n };\n\n const onRowDragEnd = ({ record, preTargetInfo, nextTargetInfo }) => {\n return new Promise((reslove, reject) => {\n // 获取当前拖拽节点的父节点ID\n const currentParentId = findParent(dataSource.value, record.key);\n\n if (preTargetInfo) {\n // 如果拖拽到某个节点之后,检查该目标节点的父节点是否与当前节点相同\n const targetParentId = findParent(dataSource.value, preTargetInfo.record.key);\n if (currentParentId === targetParentId) {\n reslove(true);\n } else {\n reject();\n }\n } else if (nextTargetInfo) {\n // 如果拖拽到某个节点之前,检查该目标节点的父节点是否与当前节点相同\n const targetParentId = findParent(dataSource.value, nextTargetInfo.record.key);\n if (currentParentId === targetParentId) {\n reslove(true);\n } else {\n reject();\n }\n } else {\n reject();\n }\n }).then(() => {\n setTimeout(() => {\n emit('change', dataSource.value);\n }, 200);\n });\n };\n\n const change_fixed = () => emit('change', dataSource.value);\n const change_autoHeight = () => emit('change', dataSource.value);\n const change_autoWidth = () => emit('change', dataSource.value);\n\n const recursion_change_ellipsis = (obj: any, record: any) => {\n obj.children.forEach((item: any) => {\n if (item.key == record.key) {\n item.ellipsis = record.ellipsis;\n }\n if (item.children && item.children.length > 0) {\n recursion_change_ellipsis(item, record);\n }\n });\n };\n\n const change_ellipsis = (record: any) => {\n const list = dataSource.value;\n list.forEach((item: any) => {\n if (item.key == record.key) {\n item.ellipsis = record.ellipsis;\n }\n if (item.children && item.children.length > 0) {\n recursion_change_ellipsis(item, record);\n }\n });\n emit('change', list);\n };\n\n return {\n searchText,\n columnsConfig,\n dataSource,\n filteredDataSource,\n rowSelection,\n selectedRowKeys,\n onRowDragEnd,\n change_fixed,\n change_autoHeight,\n change_autoWidth,\n change_ellipsis,\n };\n },\n});\n</script>\n\n<style lang=\"less\" scoped>\n.columns-config-wrapper {\n padding: 8px 0;\n}\n</style>\n","import { ExclamationCircleOutlined } from '@ant-design/icons-vue';\nimport { message, Modal } from 'ant-design-vue';\nimport { h, reactive, Ref } from 'vue';\nimport { create_view_settings, update_view_settings } from 'liyu-pc-base/api/view-model';\nimport modalBox from 'liyu-pc-base/components/form-modal/modal-tools';\nexport interface ViewHook {\n saveView: () => void;\n addView: (view_type: string | null) => void;\n}\nexport interface ViewHookProps {\n currentView: Ref<any>;\n getViewData: () => any;\n isViewChange: Ref<boolean>;\n userid: number;\n view_project__flag: string;\n view_menu__flag: string;\n view_menu__name: string;\n fetchViews: () => void;\n is_auth: boolean;\n t: (key: string) => string;\n}\n\nexport const useView = (props: ViewHookProps): ViewHook => {\n const {\n currentView,\n getViewData,\n isViewChange,\n userid,\n view_project__flag,\n view_menu__flag,\n view_menu__name,\n fetchViews,\n is_auth,\n t,\n } = props;\n const saveView = () => {\n Modal.confirm({\n title: () => '确定覆盖视图吗?',\n content: '当前视图原有的数据会被覆盖',\n icon: () => h(ExclamationCircleOutlined),\n okText: '确定',\n async onOk() {\n currentView.value.data = getViewData();\n await update_view_settings({\n view_settings_id: currentView.value.id,\n data: currentView.value.data,\n });\n isViewChange.value = false;\n message.success('修改成功');\n },\n onCancel() {},\n });\n };\n const addView = (view_type: string | null) => {\n const tempModal = reactive({\n open: true,\n loading: false,\n title: t('新建视图'),\n form: {\n settings: { labelAlign: 'right', layout: 'vertical', col: [] },\n fields: [\n {\n type: 'input',\n name: 'name',\n label: t('视图名称'),\n disabled: false,\n allowClear: true,\n inputType: 'text',\n defaultValue: '',\n placeholder: t('请输入视图名称'),\n },\n ],\n rules: reactive({\n name: [{ required: true, message: t('请输入视图名称') }],\n }),\n model: reactive({ name: '', is_system: [false], view_type: 'personal' }),\n },\n options: {\n view_type: [\n { name: t('个人视图(仅自己可见)'), value: 'personal' },\n { name: t('公共视图(项目成员均可见)'), value: 'public' },\n ],\n is_system: [{ name: t('设为系统视图'), value: true }],\n },\n ok: async (data: any) => {\n const type = view_type || data.view_type || 'personal';\n const res = await create_view_settings({\n user_id: type === 'personal' ? userid : null,\n name: data.name,\n view_project__flag: view_project__flag,\n view_menu__flag: view_menu__flag,\n view_menu__name: view_menu__name,\n is_system: data.is_system && data.is_system[0],\n data: getViewData(),\n });\n await fetchViews();\n currentView.value = res;\n message.success(t('创建成功'));\n isViewChange.value = false;\n },\n });\n if (!view_type) {\n tempModal.form.fields.push({\n type: 'radio',\n name: 'view_type',\n label: t('视图可见范围'),\n disabled: false,\n allowClear: true,\n labelKey: 'name',\n valueKey: 'value',\n defaultValue: '',\n placeholder: '',\n } as any);\n }\n if (is_auth) {\n tempModal.form.fields.push({\n type: 'checkbox',\n name: 'is_system',\n label: '',\n disabled: false,\n allowClear: true,\n labelKey: 'name',\n valueKey: 'value',\n defaultValue: [false],\n } as any);\n }\n modalBox(tempModal);\n };\n return {\n saveView,\n addView,\n };\n};\n","<template>\n <div class=\"view-manage-container\">\n <div class=\"view-section\">\n <div class=\"section-header\">\n <span class=\"title\">{{ $t('个人视图') }}</span>\n <div class=\"header-actions\">\n <a-button\n type=\"link\"\n size=\"small\"\n @click=\"handleManageView('personal')\"\n >\n <template #icon><setting-outlined /></template>\n </a-button>\n <a-button\n type=\"link\"\n size=\"small\"\n @click=\"addView('personal')\"\n >\n <template #icon><plus-outlined /></template>\n </a-button>\n </div>\n </div>\n <s-table\n :selectedRowKeys=\"selectedRowKeys\"\n :columns=\"viewTableColumns\"\n :dataSource=\"personData\"\n :pagination=\"false\"\n size=\"small\"\n :showHeader=\"false\"\n row-key=\"id\"\n :range-selection=\"false\"\n >\n <template #bodyCell=\"{ column, record }\">\n <template v-if=\"column.dataIndex === 'name'\">\n <div class=\"view-item-row\">\n <span\n class=\"view-name\"\n @click=\"handleApplyView(record)\"\n >\n {{ record.name }}\n <a-tag\n v-if=\"record.is_default\"\n color=\"blue\"\n size=\"small\"\n style=\"margin-left: 4px\"\n >\n {{ $t('默认') }}\n </a-tag>\n <a-tag\n v-if=\"record.is_system\"\n color=\"orange\"\n size=\"small\"\n style=\"margin-left: 4px\"\n >\n {{ $t('系统') }}\n </a-tag>\n </span>\n <div\n class=\"view-actions\"\n v-if=\"!record.is_system || is_auth\"\n >\n <a-tooltip :title=\"$t('设为默认')\">\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"handleSetDefault(record)\"\n >\n <template #icon>\n <star-filled\n v-if=\"record.is_default\"\n style=\"color: #fadb14\"\n />\n <star-outlined v-else />\n </template>\n </a-button>\n </a-tooltip>\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"handleEditView(record)\"\n >\n <template #icon><edit-outlined /></template>\n </a-button>\n <a-button\n type=\"text\"\n size=\"small\"\n danger\n @click=\"handleDeleteView(record)\"\n >\n <template #icon><delete-outlined /></template>\n </a-button>\n </div>\n </div>\n </template>\n </template>\n </s-table>\n </div>\n <div class=\"view-section\">\n <div class=\"section-header\">\n <span class=\"title\">{{ $t('公共视图') }}</span>\n <div class=\"header-actions\">\n <a-button\n type=\"link\"\n size=\"small\"\n @click=\"handleManageView('public')\"\n >\n <template #icon><setting-outlined /></template>\n </a-button>\n <a-button\n type=\"link\"\n size=\"small\"\n @click=\"addView('public')\"\n >\n <template #icon><plus-outlined /></template>\n </a-button>\n </div>\n </div>\n <s-table\n :selectedRowKeys=\"selectedRowKeys\"\n :columns=\"viewTableColumns\"\n :dataSource=\"publicData\"\n :pagination=\"false\"\n size=\"small\"\n :showHeader=\"false\"\n row-key=\"id\"\n :range-selection=\"false\"\n >\n <template #bodyCell=\"{ column, record }\">\n <template v-if=\"column.dataIndex === 'name'\">\n <div class=\"view-item-row\">\n <span\n class=\"view-name\"\n @click=\"handleApplyView(record)\"\n >\n {{ record.name }}\n <a-tag\n v-if=\"record.is_default\"\n color=\"blue\"\n size=\"small\"\n style=\"margin-left: 4px\"\n >\n {{ $t('默认') }}\n </a-tag>\n <a-tag\n v-if=\"record.is_system\"\n color=\"orange\"\n size=\"small\"\n style=\"margin-left: 4px\"\n >\n {{ $t('系统') }}\n </a-tag>\n </span>\n <div\n class=\"view-actions\"\n v-if=\"!record.is_system || is_auth\"\n >\n <a-tooltip :title=\"$t('设为默认')\">\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"handleSetDefault(record)\"\n >\n <template #icon>\n <star-filled\n v-if=\"record.is_default\"\n style=\"color: #fadb14\"\n />\n <star-outlined v-else />\n </template>\n </a-button>\n </a-tooltip>\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"handleEditView(record)\"\n >\n <template #icon><edit-outlined /></template>\n </a-button>\n <a-button\n type=\"text\"\n size=\"small\"\n danger\n @click=\"handleDeleteView(record)\"\n >\n <template #icon><delete-outlined /></template>\n </a-button>\n </div>\n </div>\n </template>\n </template>\n </s-table>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, ref, onMounted, reactive, createVNode } from 'vue';\nimport {\n SettingOutlined,\n PlusOutlined,\n DeleteOutlined,\n EditOutlined,\n StarOutlined,\n StarFilled,\n ExclamationCircleOutlined,\n} from '@ant-design/icons-vue';\nimport { useI18n } from 'vue-i18n';\nimport { useUserStore, useEnv } from 'liyu-pc-base/init-plugin';\nimport {\n delete_view_settings,\n update_view_settings,\n set_view_settings_default,\n refresh_view_settings_cache,\n change_view_settings_sort,\n} from 'liyu-pc-base/api/view-model';\nimport { message, Modal } from 'ant-design-vue';\nimport modalBox from 'liyu-pc-base/components/form-modal/modal-tools';\nimport { useTableProState } from '../utils';\nimport { Column } from '../typing';\nimport { useView } from '../hooks/view';\n\nexport default defineComponent({\n name: 'ViewsConfig',\n components: {\n SettingOutlined,\n PlusOutlined,\n DeleteOutlined,\n EditOutlined,\n StarOutlined,\n StarFilled,\n },\n props: {\n columns: {\n type: Array as () => Array<Column>,\n default: () => [],\n },\n view_key: {\n type: String,\n default: '',\n },\n view_flag_name: {\n type: String,\n default: '',\n },\n is_view: {\n type: Boolean,\n default: false,\n },\n },\n setup(props) {\n const { t } = useI18n();\n const userStore = useUserStore();\n const env = useEnv();\n const current_org = userStore.currentOrg;\n const userid = userStore.userid;\n const VIEW_SYSTEM_EDIT = 'view_system_edit';\n const is_auth = ref(userStore.CHECK_AUTH(VIEW_SYSTEM_EDIT));\n\n const { setViewData, getViewData, viewDataList, fetchViews, currentView, isViewChange } =\n useTableProState();\n\n const viewTableColumns = [{ dataIndex: 'name', key: 'name' }];\n const selectedRowKeys = computed(() => {\n return [currentView.value?.id];\n });\n\n const personData = computed(() => {\n const list = viewDataList.value\n .filter((item: any) => !!item.user_id && item.is_system)\n .sort((a, b) => (a.sort == b.sort ? a.id - b.id : a.sort - b.sort));\n const list1 = viewDataList.value\n .filter((item: any) => !!item.user_id && !item.is_system)\n .sort((a, b) => (a.sort == b.sort ? a.id - b.id : a.sort - b.sort));\n return list.concat(list1);\n });\n\n const publicData = computed(() => {\n const list = viewDataList.value\n .filter((item: any) => !item.user_id && item.is_system)\n .sort((a, b) => (a.sort == b.sort ? a.id - b.id : a.sort - b.sort));\n const list1 = viewDataList.value\n .filter((item: any) => !item.user_id && !item.is_system)\n .sort((a, b) => (a.sort == b.sort ? a.id - b.id : a.sort - b.sort));\n return list.concat(list1);\n });\n\n const handleApplyView = (view: any) => {\n if (currentView.value?.id === view.id) {\n currentView.value = { id: 'no-view' };\n setViewData(null);\n message.warning(t('视图已取消'));\n } else {\n currentView.value = view;\n setViewData(view.data);\n message.success(t('已应用视图:') + view.name);\n }\n };\n\n const handleSetDefault = async (view: any) => {\n try {\n await set_view_settings_default({\n org_id: current_org.id,\n view_settings_id: view.id,\n });\n await refresh_view_settings_cache({\n org_id: current_org.id,\n view_settings_id: view.id,\n });\n message.success(t('设置默认成功'));\n fetchViews();\n } catch (e) {\n message.error(t('设置默认失败'));\n }\n };\n\n const handleDeleteView = (view: any) => {\n Modal.confirm({\n title: t('确认删除视图?'),\n content: t('视图删除后不可恢复,是否确认删除?'),\n icon: createVNode(ExclamationCircleOutlined),\n onOk: async () => {\n await delete_view_settings({\n org_id: current_org.id,\n view_settings_id: view.id,\n });\n message.success(t('删除成功'));\n fetchViews();\n },\n });\n };\n\n const handleEditView = (record: any) => {\n const tempModal = reactive({\n open: true,\n loading: false,\n title: t('编辑视图'),\n form: {\n settings: { labelAlign: 'right', layout: 'vertical', col: [] },\n fields: [\n {\n type: 'input',\n name: 'name',\n label: t('视图名称'),\n disabled: false,\n allowClear: true,\n inputType: 'text',\n defaultValue: record.name,\n placeholder: t('请输入视图名称'),\n },\n ],\n rules: reactive({\n name: [{ required: true, message: t('请输入视图名称') }],\n }),\n model: reactive({\n name: record.name,\n is_system: [record.is_system || false],\n }),\n },\n options: {\n is_system: [{ name: t('设为系统视图'), value: true }],\n },\n ok: async (data: any) => {\n await update_view_settings({\n org_id: current_org.id,\n view_settings_id: record.id,\n name: data.name,\n is_system: data.is_system && data.is_system[0],\n });\n message.success(t('修改成功'));\n fetchViews();\n },\n });\n\n if (is_auth.value) {\n tempModal.form.fields.push({\n type: 'checkbox',\n name: 'is_system',\n label: '',\n disabled: false,\n allowClear: true,\n labelKey: 'name',\n valueKey: 'value',\n defaultValue: [false],\n } as any);\n }\n modalBox(tempModal);\n };\n const { addView } = useView({\n currentView,\n getViewData,\n isViewChange,\n userid,\n view_project__flag: env.VITE_APP_VIEW_PROJECT_FLAG,\n view_menu__flag: props.view_key,\n view_menu__name: props.view_flag_name,\n fetchViews,\n is_auth,\n t,\n });\n\n const handleManageView = (view_type: string) => {\n const tempModal = reactive({\n open: true,\n component: 'ViewEditModal',\n compObj: {\n title: view_type == 'personal' ? t('个人视图管理') : t('公共视图管理'),\n data: view_type == 'personal' ? personData.value : publicData.value,\n },\n ok: (ids: any) => {\n if (ids && ids.length > 0) {\n change_view_settings_sort({\n org_id: current_org.id,\n view_settings_ids: ids,\n }).then(() => {\n message.success(t('保存成功'));\n fetchViews();\n });\n } else {\n message.success(t('保存成功'));\n fetchViews();\n }\n },\n cancel: (isEdit: any) => {\n if (isEdit) {\n fetchViews();\n }\n },\n });\n modalBox(tempModal);\n };\n\n return {\n viewTableColumns,\n personData,\n publicData,\n handleApplyView,\n handleSetDefault,\n handleDeleteView,\n handleEditView,\n addView,\n handleManageView,\n is_auth,\n fetchViews,\n selectedRowKeys,\n };\n },\n});\n</script>\n\n<style lang=\"less\" scoped>\n.view-manage-container {\n display: flex;\n gap: 16px;\n height: 400px;\n overflow-y: auto;\n\n .view-section {\n flex: 1;\n border: 1px solid #f0f0f0;\n border-radius: 4px;\n padding: 8px;\n\n .section-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n padding-bottom: 4px;\n border-bottom: 1px solid #f0f0f0;\n\n .title {\n font-weight: bold;\n }\n\n .header-actions {\n display: flex;\n align-items: center;\n }\n }\n }\n}\n\n.view-item-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n\n .view-name {\n cursor: pointer;\n flex: 1;\n padding: 4px 0;\n &:hover {\n color: #1890ff;\n }\n }\n\n .view-actions {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.2s;\n }\n\n &:hover .view-actions {\n opacity: 1;\n }\n}\n</style>\n","<template>\n <div class=\"view-manage-container\">\n <div class=\"view-section\">\n <div class=\"section-header\">\n <span class=\"title\">{{ $t('个人视图') }}</span>\n <div class=\"header-actions\">\n <a-button\n type=\"link\"\n size=\"small\"\n @click=\"handleManageView('personal')\"\n >\n <template #icon><setting-outlined /></template>\n </a-button>\n <a-button\n type=\"link\"\n size=\"small\"\n @click=\"addView('personal')\"\n >\n <template #icon><plus-outlined /></template>\n </a-button>\n </div>\n </div>\n <s-table\n :selectedRowKeys=\"selectedRowKeys\"\n :columns=\"viewTableColumns\"\n :dataSource=\"personData\"\n :pagination=\"false\"\n size=\"small\"\n :showHeader=\"false\"\n row-key=\"id\"\n :range-selection=\"false\"\n >\n <template #bodyCell=\"{ column, record }\">\n <template v-if=\"column.dataIndex === 'name'\">\n <div class=\"view-item-row\">\n <span\n class=\"view-name\"\n @click=\"handleApplyView(record)\"\n >\n {{ record.name }}\n <a-tag\n v-if=\"record.is_default\"\n color=\"blue\"\n size=\"small\"\n style=\"margin-left: 4px\"\n >\n {{ $t('默认') }}\n </a-tag>\n <a-tag\n v-if=\"record.is_system\"\n color=\"orange\"\n size=\"small\"\n style=\"margin-left: 4px\"\n >\n {{ $t('系统') }}\n </a-tag>\n </span>\n <div\n class=\"view-actions\"\n v-if=\"!record.is_system || is_auth\"\n >\n <a-tooltip :title=\"$t('设为默认')\">\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"handleSetDefault(record)\"\n >\n <template #icon>\n <star-filled\n v-if=\"record.is_default\"\n style=\"color: #fadb14\"\n />\n <star-outlined v-else />\n </template>\n </a-button>\n </a-tooltip>\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"handleEditView(record)\"\n >\n <template #icon><edit-outlined /></template>\n </a-button>\n <a-button\n type=\"text\"\n size=\"small\"\n danger\n @click=\"handleDeleteView(record)\"\n >\n <template #icon><delete-outlined /></template>\n </a-button>\n </div>\n </div>\n </template>\n </template>\n </s-table>\n </div>\n <div class=\"view-section\">\n <div class=\"section-header\">\n <span class=\"title\">{{ $t('公共视图') }}</span>\n <div class=\"header-actions\">\n <a-button\n type=\"link\"\n size=\"small\"\n @click=\"handleManageView('public')\"\n >\n <template #icon><setting-outlined /></template>\n </a-button>\n <a-button\n type=\"link\"\n size=\"small\"\n @click=\"addView('public')\"\n >\n <template #icon><plus-outlined /></template>\n </a-button>\n </div>\n </div>\n <s-table\n :selectedRowKeys=\"selectedRowKeys\"\n :columns=\"viewTableColumns\"\n :dataSource=\"publicData\"\n :pagination=\"false\"\n size=\"small\"\n :showHeader=\"false\"\n row-key=\"id\"\n :range-selection=\"false\"\n >\n <template #bodyCell=\"{ column, record }\">\n <template v-if=\"column.dataIndex === 'name'\">\n <div class=\"view-item-row\">\n <span\n class=\"view-name\"\n @click=\"handleApplyView(record)\"\n >\n {{ record.name }}\n <a-tag\n v-if=\"record.is_default\"\n color=\"blue\"\n size=\"small\"\n style=\"margin-left: 4px\"\n >\n {{ $t('默认') }}\n </a-tag>\n <a-tag\n v-if=\"record.is_system\"\n color=\"orange\"\n size=\"small\"\n style=\"margin-left: 4px\"\n >\n {{ $t('系统') }}\n </a-tag>\n </span>\n <div\n class=\"view-actions\"\n v-if=\"!record.is_system || is_auth\"\n >\n <a-tooltip :title=\"$t('设为默认')\">\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"handleSetDefault(record)\"\n >\n <template #icon>\n <star-filled\n v-if=\"record.is_default\"\n style=\"color: #fadb14\"\n />\n <star-outlined v-else />\n </template>\n </a-button>\n </a-tooltip>\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"handleEditView(record)\"\n >\n <template #icon><edit-outlined /></template>\n </a-button>\n <a-button\n type=\"text\"\n size=\"small\"\n danger\n @click=\"handleDeleteView(record)\"\n >\n <template #icon><delete-outlined /></template>\n </a-button>\n </div>\n </div>\n </template>\n </template>\n </s-table>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, ref, onMounted, reactive, createVNode } from 'vue';\nimport {\n SettingOutlined,\n PlusOutlined,\n DeleteOutlined,\n EditOutlined,\n StarOutlined,\n StarFilled,\n ExclamationCircleOutlined,\n} from '@ant-design/icons-vue';\nimport { useI18n } from 'vue-i18n';\nimport { useUserStore, useEnv } from 'liyu-pc-base/init-plugin';\nimport {\n delete_view_settings,\n update_view_settings,\n set_view_settings_default,\n refresh_view_settings_cache,\n change_view_settings_sort,\n} from 'liyu-pc-base/api/view-model';\nimport { message, Modal } from 'ant-design-vue';\nimport modalBox from 'liyu-pc-base/components/form-modal/modal-tools';\nimport { useTableProState } from '../utils';\nimport { Column } from '../typing';\nimport { useView } from '../hooks/view';\n\nexport default defineComponent({\n name: 'ViewsConfig',\n components: {\n SettingOutlined,\n PlusOutlined,\n DeleteOutlined,\n EditOutlined,\n StarOutlined,\n StarFilled,\n },\n props: {\n columns: {\n type: Array as () => Array<Column>,\n default: () => [],\n },\n view_key: {\n type: String,\n default: '',\n },\n view_flag_name: {\n type: String,\n default: '',\n },\n is_view: {\n type: Boolean,\n default: false,\n },\n },\n setup(props) {\n const { t } = useI18n();\n const userStore = useUserStore();\n const env = useEnv();\n const current_org = userStore.currentOrg;\n const userid = userStore.userid;\n const VIEW_SYSTEM_EDIT = 'view_system_edit';\n const is_auth = ref(userStore.CHECK_AUTH(VIEW_SYSTEM_EDIT));\n\n const { setViewData, getViewData, viewDataList, fetchViews, currentView, isViewChange } =\n useTableProState();\n\n const viewTableColumns = [{ dataIndex: 'name', key: 'name' }];\n const selectedRowKeys = computed(() => {\n return [currentView.value?.id];\n });\n\n const personData = computed(() => {\n const list = viewDataList.value\n .filter((item: any) => !!item.user_id && item.is_system)\n .sort((a, b) => (a.sort == b.sort ? a.id - b.id : a.sort - b.sort));\n const list1 = viewDataList.value\n .filter((item: any) => !!item.user_id && !item.is_system)\n .sort((a, b) => (a.sort == b.sort ? a.id - b.id : a.sort - b.sort));\n return list.concat(list1);\n });\n\n const publicData = computed(() => {\n const list = viewDataList.value\n .filter((item: any) => !item.user_id && item.is_system)\n .sort((a, b) => (a.sort == b.sort ? a.id - b.id : a.sort - b.sort));\n const list1 = viewDataList.value\n .filter((item: any) => !item.user_id && !item.is_system)\n .sort((a, b) => (a.sort == b.sort ? a.id - b.id : a.sort - b.sort));\n return list.concat(list1);\n });\n\n const handleApplyView = (view: any) => {\n if (currentView.value?.id === view.id) {\n currentView.value = { id: 'no-view' };\n setViewData(null);\n message.warning(t('视图已取消'));\n } else {\n currentView.value = view;\n setViewData(view.data);\n message.success(t('已应用视图:') + view.name);\n }\n };\n\n const handleSetDefault = async (view: any) => {\n try {\n await set_view_settings_default({\n org_id: current_org.id,\n view_settings_id: view.id,\n });\n await refresh_view_settings_cache({\n org_id: current_org.id,\n view_settings_id: view.id,\n });\n message.success(t('设置默认成功'));\n fetchViews();\n } catch (e) {\n message.error(t('设置默认失败'));\n }\n };\n\n const handleDeleteView = (view: any) => {\n Modal.confirm({\n title: t('确认删除视图?'),\n content: t('视图删除后不可恢复,是否确认删除?'),\n icon: createVNode(ExclamationCircleOutlined),\n onOk: async () => {\n await delete_view_settings({\n org_id: current_org.id,\n view_settings_id: view.id,\n });\n message.success(t('删除成功'));\n fetchViews();\n },\n });\n };\n\n const handleEditView = (record: any) => {\n const tempModal = reactive({\n open: true,\n loading: false,\n title: t('编辑视图'),\n form: {\n settings: { labelAlign: 'right', layout: 'vertical', col: [] },\n fields: [\n {\n type: 'input',\n name: 'name',\n label: t('视图名称'),\n disabled: false,\n allowClear: true,\n inputType: 'text',\n defaultValue: record.name,\n placeholder: t('请输入视图名称'),\n },\n ],\n rules: reactive({\n name: [{ required: true, message: t('请输入视图名称') }],\n }),\n model: reactive({\n name: record.name,\n is_system: [record.is_system || false],\n }),\n },\n options: {\n is_system: [{ name: t('设为系统视图'), value: true }],\n },\n ok: async (data: any) => {\n await update_view_settings({\n org_id: current_org.id,\n view_settings_id: record.id,\n name: data.name,\n is_system: data.is_system && data.is_system[0],\n });\n message.success(t('修改成功'));\n fetchViews();\n },\n });\n\n if (is_auth.value) {\n tempModal.form.fields.push({\n type: 'checkbox',\n name: 'is_system',\n label: '',\n disabled: false,\n allowClear: true,\n labelKey: 'name',\n valueKey: 'value',\n defaultValue: [false],\n } as any);\n }\n modalBox(tempModal);\n };\n const { addView } = useView({\n currentView,\n getViewData,\n isViewChange,\n userid,\n view_project__flag: env.VITE_APP_VIEW_PROJECT_FLAG,\n view_menu__flag: props.view_key,\n view_menu__name: props.view_flag_name,\n fetchViews,\n is_auth,\n t,\n });\n\n const handleManageView = (view_type: string) => {\n const tempModal = reactive({\n open: true,\n component: 'ViewEditModal',\n compObj: {\n title: view_type == 'personal' ? t('个人视图管理') : t('公共视图管理'),\n data: view_type == 'personal' ? personData.value : publicData.value,\n },\n ok: (ids: any) => {\n if (ids && ids.length > 0) {\n change_view_settings_sort({\n org_id: current_org.id,\n view_settings_ids: ids,\n }).then(() => {\n message.success(t('保存成功'));\n fetchViews();\n });\n } else {\n message.success(t('保存成功'));\n fetchViews();\n }\n },\n cancel: (isEdit: any) => {\n if (isEdit) {\n fetchViews();\n }\n },\n });\n modalBox(tempModal);\n };\n\n return {\n viewTableColumns,\n personData,\n publicData,\n handleApplyView,\n handleSetDefault,\n handleDeleteView,\n handleEditView,\n addView,\n handleManageView,\n is_auth,\n fetchViews,\n selectedRowKeys,\n };\n },\n});\n</script>\n\n<style lang=\"less\" scoped>\n.view-manage-container {\n display: flex;\n gap: 16px;\n height: 400px;\n overflow-y: auto;\n\n .view-section {\n flex: 1;\n border: 1px solid #f0f0f0;\n border-radius: 4px;\n padding: 8px;\n\n .section-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n padding-bottom: 4px;\n border-bottom: 1px solid #f0f0f0;\n\n .title {\n font-weight: bold;\n }\n\n .header-actions {\n display: flex;\n align-items: center;\n }\n }\n }\n}\n\n.view-item-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n\n .view-name {\n cursor: pointer;\n flex: 1;\n padding: 4px 0;\n &:hover {\n color: #1890ff;\n }\n }\n\n .view-actions {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.2s;\n }\n\n &:hover .view-actions {\n opacity: 1;\n }\n}\n</style>\n","<template>\n <div class=\"column-edit-view-wrapper\">\n <a-tabs v-model:activeKey=\"activeTab\">\n <a-tab-pane\n key=\"columns\"\n :tab=\"$t('列设置')\"\n >\n <div class=\"tab-content-scroll\">\n <columns-config\n :columns=\"columns\"\n @change=\"onColumnChange\"\n />\n </div>\n </a-tab-pane>\n <a-tab-pane\n key=\"views\"\n :tab=\"$t('视图管理')\"\n v-if=\"is_view\"\n >\n <div class=\"tab-content-scroll\">\n <views-config\n :columns=\"columns\"\n :view_key=\"view_key\"\n :view_flag_name=\"view_flag_name\"\n :is_view=\"is_view\"\n />\n </div>\n </a-tab-pane>\n </a-tabs>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, watch } from 'vue';\nimport { Column } from '../typing';\nimport ColumnsConfig from './columnsConfig.vue';\nimport ViewsConfig from './viewsConfig.vue';\nimport { useTableProState } from '../utils';\n\nexport default defineComponent({\n name: 'ColumnEditView',\n components: {\n ColumnsConfig,\n ViewsConfig,\n },\n props: {\n columns: {\n type: Array as () => Array<Column>,\n default: () => [],\n },\n view_key: {\n type: String,\n default: '',\n },\n view_flag_name: {\n type: String,\n default: '',\n },\n is_view: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['change'],\n setup(props, { emit }) {\n const activeTab = ref('columns');\n\n const onColumnChange = (data: any) => {\n emit('change', data);\n };\n const { fetchViews } = useTableProState();\n watch(\n () => activeTab.value,\n val => {\n if (val === 'views') {\n fetchViews();\n }\n },\n );\n\n return {\n activeTab,\n onColumnChange,\n };\n },\n});\n\n</script>\n\n<style lang=\"less\" scoped>\n.column-edit-view-wrapper {\n padding: 0 8px;\n}\n.tab-content-scroll {\n max-height: 60vh;\n overflow-y: auto;\n}\n</style>\n","<template>\n <div class=\"column-edit-view-wrapper\">\n <a-tabs v-model:activeKey=\"activeTab\">\n <a-tab-pane\n key=\"columns\"\n :tab=\"$t('列设置')\"\n >\n <div class=\"tab-content-scroll\">\n <columns-config\n :columns=\"columns\"\n @change=\"onColumnChange\"\n />\n </div>\n </a-tab-pane>\n <a-tab-pane\n key=\"views\"\n :tab=\"$t('视图管理')\"\n v-if=\"is_view\"\n >\n <div class=\"tab-content-scroll\">\n <views-config\n :columns=\"columns\"\n :view_key=\"view_key\"\n :view_flag_name=\"view_flag_name\"\n :is_view=\"is_view\"\n />\n </div>\n </a-tab-pane>\n </a-tabs>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, watch } from 'vue';\nimport { Column } from '../typing';\nimport ColumnsConfig from './columnsConfig.vue';\nimport ViewsConfig from './viewsConfig.vue';\nimport { useTableProState } from '../utils';\n\nexport default defineComponent({\n name: 'ColumnEditView',\n components: {\n ColumnsConfig,\n ViewsConfig,\n },\n props: {\n columns: {\n type: Array as () => Array<Column>,\n default: () => [],\n },\n view_key: {\n type: String,\n default: '',\n },\n view_flag_name: {\n type: String,\n default: '',\n },\n is_view: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['change'],\n setup(props, { emit }) {\n const activeTab = ref('columns');\n\n const onColumnChange = (data: any) => {\n emit('change', data);\n };\n const { fetchViews } = useTableProState();\n watch(\n () => activeTab.value,\n val => {\n if (val === 'views') {\n fetchViews();\n }\n },\n );\n\n return {\n activeTab,\n onColumnChange,\n };\n },\n});\n\n</script>\n\n<style lang=\"less\" scoped>\n.column-edit-view-wrapper {\n padding: 0 8px;\n}\n.tab-content-scroll {\n max-height: 60vh;\n overflow-y: auto;\n}\n</style>\n","import { ConfirmModelConfig } from 'liyu-pc-base/api/typing';\n\nimport { event_obj, useUserStore } from 'liyu-pc-base/init-plugin';\n\nimport { Modal } from 'ant-design-vue';\nimport Handlebars from 'handlebars';\nimport { HeadBtnConfig } from 'liyu-pc-base/api/typing';\nimport { useRequest } from 'liyu-pc-base/init-plugin';\nimport { getObjListBySelectedRowKeys } from 'liyu-pc-base/utils/function';\nimport { unref } from 'vue';\n\nexport const head_btn_confirm = ({\n dataSource,\n button,\n selectedRowKeys,\n}: {\n dataSource: any[];\n button: HeadBtnConfig;\n selectedRowKeys: any[];\n}) => {\n const request = useRequest();\n selectedRowKeys = unref(selectedRowKeys);\n const preProcessData = button.preProcessData;\n const model_config = button.model_config as ConfirmModelConfig;\n const init_data = model_config.init_data;\n const batch_api_fields = model_config.batch_api_fields;\n const title = model_config.title;\n const content = model_config.content;\n const ok_url = model_config.ok_url;\n const cancel_url = model_config.cancel_url;\n const method = model_config.method || 'post';\n const userStore = useUserStore();\n const current_org = userStore.currentOrg; // 当前组织org\n const org_id = current_org?.id;\n let api_data = dataSource as any;\n if (preProcessData) {\n api_data = preProcessData({ dataSource, selectedRowKeys });\n }\n if (batch_api_fields) {\n api_data = getObjListBySelectedRowKeys(batch_api_fields, dataSource, selectedRowKeys);\n }\n if (init_data) {\n api_data = { ...api_data, ...init_data };\n }\n api_data = { ...api_data, org_id };\n\n const titleTemplate = Handlebars.compile(title || '');\n const contentTemplate = Handlebars.compile(content || '');\n\n Modal.confirm({\n title: titleTemplate({ record: api_data }),\n content: contentTemplate({ record: api_data }),\n onOk() {\n if (ok_url) {\n request[method](ok_url, api_data).then(() => {\n event_obj().emit('refresh');\n });\n }\n },\n onCancel() {\n if (cancel_url) {\n request[method](cancel_url, api_data).then(() => {\n event_obj().emit('refresh');\n });\n }\n },\n });\n};\n","import { ComponentModelConfig, HeadBtnConfig } from 'liyu-pc-base/api/typing';\n\nimport { event_obj, useUserStore } from 'liyu-pc-base/init-plugin';\n\nimport Handlebars from 'handlebars';\nimport modalBox from 'liyu-pc-base/components/form-modal/modal-tools';\nimport { useRequest } from 'liyu-pc-base/init-plugin';\nimport { getObjListBySelectedRowKeys } from 'liyu-pc-base/utils/function';\nimport { reactive, unref } from 'vue';\n\nexport const head_btn_custom_component = ({\n dataSource,\n button,\n selectedRowKeys,\n}: {\n dataSource: any[];\n button: HeadBtnConfig;\n selectedRowKeys: any[];\n}) => {\n const request = useRequest();\n const preProcessData = button.preProcessData;\n const model_config = button.model_config as ComponentModelConfig;\n const title = model_config.title;\n const component = model_config.component;\n const ok_url = model_config.ok_url;\n const cancel_url = model_config.cancel_url;\n const method = model_config.method || 'post';\n const init_data = model_config.init_data;\n const batch_api_fields = model_config.batch_api_fields;\n const userStore = useUserStore();\n const current_org = userStore.currentOrg; // 当前组织org\n const org_id = current_org?.id;\n let api_data = dataSource;\n if (preProcessData) {\n api_data = preProcessData({ dataSource, selectedRowKeys });\n }\n if (init_data) {\n api_data = { ...api_data, ...init_data };\n }\n const tempModal = reactive({\n open: true,\n loading: false,\n component: component,\n record: unref(api_data),\n dataSource: dataSource,\n button: button,\n title: Handlebars.compile(title || '')({ record: api_data }),\n ok: (data: any) => {\n data = { ...data, org_id };\n if (batch_api_fields) {\n data = {\n ...data,\n ...getObjListBySelectedRowKeys(batch_api_fields, dataSource, selectedRowKeys),\n };\n }\n if (ok_url) {\n request[method](ok_url, data).then(() => {\n event_obj().emit('refresh');\n });\n }\n },\n cancel: (data: any) => {\n data = { ...data, org_id };\n if (batch_api_fields) {\n data = {\n ...data,\n ...getObjListBySelectedRowKeys(batch_api_fields, dataSource, selectedRowKeys),\n };\n }\n if (cancel_url) {\n request[method](cancel_url, data).then(() => {\n event_obj().emit('refresh');\n });\n }\n },\n });\n modalBox(tempModal);\n};\n","import { FormModelConfig, HeadBtnConfig } from 'liyu-pc-base/api/typing';\n\nimport { event_obj, useUserStore } from 'liyu-pc-base/init-plugin';\n\nimport { message } from 'ant-design-vue';\nimport Handlebars from 'handlebars';\nimport modalBox from 'liyu-pc-base/components/form-modal/modal-tools';\nimport { useRequest } from 'liyu-pc-base/init-plugin';\nimport { getObjList, getObjListBySelectedRowKeys } from 'liyu-pc-base/utils/function';\nimport { reactive } from 'vue';\nexport const head_btn_form = ({\n dataSource,\n button,\n selectedRowKeys,\n}: {\n dataSource: any[];\n button: HeadBtnConfig;\n selectedRowKeys: any[];\n}) => {\n const request = useRequest();\n const preProcessData = button.preProcessData;\n const model_config = button.model_config as FormModelConfig;\n const title = model_config.title;\n const ok_url = model_config.ok_url;\n const cancel_url = model_config.cancel_url;\n const method = model_config.method || 'post';\n const init_data = model_config.init_data;\n const api_fields = model_config.api_fields;\n const batch_api_fields = model_config.batch_api_fields;\n const form_config = model_config.form;\n const userStore = useUserStore();\n const current_org = userStore.currentOrg; // 当前组织org\n const org_id = current_org?.id;\n\n let record = null;\n if (preProcessData) {\n record = preProcessData({ dataSource, selectedRowKeys });\n } else {\n record = dataSource.find(item => selectedRowKeys.includes(item.id));\n }\n\n let model_data = {\n ...form_config.model,\n ...record,\n };\n if (api_fields) {\n model_data = {\n ...model_data,\n ...getObjList(api_fields, record),\n };\n }\n if (init_data) {\n model_data = {\n ...model_data,\n ...init_data,\n };\n }\n // 创建表单模态框配置\n const form_modal_config = reactive({\n settings: form_config.settings || {\n labelAlign: 'right',\n layout: 'vertical',\n col: [],\n },\n dynamicFieldList: form_config.dynamicFieldList || [],\n model: reactive(model_data),\n rules: form_config.rules || {},\n options: form_config.options || {},\n });\n\n // 创建模态框\n const tempModal = reactive({\n open: true,\n loading: false,\n title: Handlebars.compile(title || '')({ record: model_data }),\n form: form_modal_config,\n ok: (data: any) => {\n return new Promise(function (resolve, reject) {\n if (!ok_url) {\n resolve(null);\n return;\n }\n tempModal.loading = true;\n let submit_data = data;\n // if (api_fields) {\n // submit_data = {\n // ...submit_data,\n // ...getObjList(api_fields, data),\n // }\n // }\n if (batch_api_fields) {\n submit_data = {\n ...submit_data,\n ...getObjListBySelectedRowKeys(batch_api_fields, dataSource, selectedRowKeys),\n };\n }\n if (button.beforeCommitProcessData) {\n submit_data = button.beforeCommitProcessData({\n dataSource,\n selectedRowKeys,\n data: submit_data,\n });\n }\n submit_data.org_id = org_id;\n\n request({\n url: ok_url,\n method: method,\n data: submit_data,\n })\n .then(() => {\n message.success('操作成功');\n event_obj().emit('refresh');\n resolve(null);\n })\n .catch(error => {\n reject(error);\n })\n .finally(() => {\n tempModal.loading = false;\n });\n });\n },\n cancel: (data: any) => {\n return new Promise(function (resolve, reject) {\n if (!cancel_url) {\n resolve(null);\n return;\n }\n tempModal.loading = true;\n\n let submit_data = data;\n // if (api_fields) {\n // submit_data = {\n // ...submit_data,\n // ...getObjList(api_fields, data),\n // }\n // }\n if (batch_api_fields) {\n submit_data = {\n ...submit_data,\n ...getObjListBySelectedRowKeys(batch_api_fields, dataSource, selectedRowKeys),\n };\n }\n if (button.beforeCommitProcessData) {\n submit_data = button.beforeCommitProcessData({\n dataSource,\n selectedRowKeys,\n data: submit_data,\n });\n }\n submit_data.org_id = org_id;\n\n request({\n url: cancel_url,\n method: method,\n data: submit_data,\n })\n .then(() => {\n event_obj().emit('refresh');\n resolve(null);\n })\n .catch(error => {\n reject(error);\n })\n .finally(() => {\n tempModal.loading = false;\n });\n });\n },\n });\n\n // 显示模态框\n modalBox(tempModal);\n};\n","<template>\n <template\n v-for=\"(item, index) in children_list\"\n :key=\"index\"\n >\n <template v-if=\"item?.children && item.children.length > 0\">\n <a-sub-menu\n :key=\"index\"\n :title=\"item.name\"\n :disabled=\"item.disabled\"\n >\n <head-btn-children\n :auth_batch_update_list=\"auth_batch_update_list\"\n :children_list=\"item.children\"\n :selected-row-keys=\"selectedRowKeys\"\n :dataSource=\"dataSource\"\n :search-config=\"searchConfig\"\n :current_org=\"current_org\"\n :handleBtnClick=\"handleBtnClick\"\n />\n </a-sub-menu>\n </template>\n <template v-else>\n <a-menu-item\n :key=\"index\"\n :disabled=\"item.disabled\"\n @click=\"\n () => {\n handleBtnClick(item, {\n searchModel: searchConfig.model,\n dataSource: dataSource,\n selectedRowKeys: selectedRowKeys,\n searchConfigOptions: searchConfig.options,\n current_org: current_org,\n });\n }\n \"\n >\n {{ item.name }}\n </a-menu-item>\n </template>\n </template>\n</template>\n<script lang=\"ts\">\nimport { HeadBtnListConfig } from 'liyu-pc-base/api/typing';\nimport { defineComponent, PropType } from 'vue';\n\nexport default defineComponent({\n name: 'HeadBtnChildren',\n props: {\n children_list: {\n type: Array as PropType<HeadBtnListConfig>,\n required: true,\n },\n selectedRowKeys: {\n type: Array as PropType<any[]>,\n required: true,\n },\n dataSource: {\n type: Array as PropType<any[]>,\n required: true,\n },\n searchConfig: {\n type: Object as PropType<{ model: any; options: any }>,\n required: true,\n },\n current_org: {\n type: Object as PropType<any>,\n required: true,\n },\n handleBtnClick: {\n type: Function as PropType<any>,\n required: true,\n },\n },\n setup(props) {\n return {};\n },\n});\n</script>\n","<template>\n <template\n v-for=\"(item, index) in children_list\"\n :key=\"index\"\n >\n <template v-if=\"item?.children && item.children.length > 0\">\n <a-sub-menu\n :key=\"index\"\n :title=\"item.name\"\n :disabled=\"item.disabled\"\n >\n <head-btn-children\n :auth_batch_update_list=\"auth_batch_update_list\"\n :children_list=\"item.children\"\n :selected-row-keys=\"selectedRowKeys\"\n :dataSource=\"dataSource\"\n :search-config=\"searchConfig\"\n :current_org=\"current_org\"\n :handleBtnClick=\"handleBtnClick\"\n />\n </a-sub-menu>\n </template>\n <template v-else>\n <a-menu-item\n :key=\"index\"\n :disabled=\"item.disabled\"\n @click=\"\n () => {\n handleBtnClick(item, {\n searchModel: searchConfig.model,\n dataSource: dataSource,\n selectedRowKeys: selectedRowKeys,\n searchConfigOptions: searchConfig.options,\n current_org: current_org,\n });\n }\n \"\n >\n {{ item.name }}\n </a-menu-item>\n </template>\n </template>\n</template>\n<script lang=\"ts\">\nimport { HeadBtnListConfig } from 'liyu-pc-base/api/typing';\nimport { defineComponent, PropType } from 'vue';\n\nexport default defineComponent({\n name: 'HeadBtnChildren',\n props: {\n children_list: {\n type: Array as PropType<HeadBtnListConfig>,\n required: true,\n },\n selectedRowKeys: {\n type: Array as PropType<any[]>,\n required: true,\n },\n dataSource: {\n type: Array as PropType<any[]>,\n required: true,\n },\n searchConfig: {\n type: Object as PropType<{ model: any; options: any }>,\n required: true,\n },\n current_org: {\n type: Object as PropType<any>,\n required: true,\n },\n handleBtnClick: {\n type: Function as PropType<any>,\n required: true,\n },\n },\n setup(props) {\n return {};\n },\n});\n</script>\n","<template>\n <template\n v-for=\"(btn, index) in filter_head_btn_list\"\n :key=\"index\"\n >\n <a-button\n v-if=\"!btn.children || btn.children?.length == 0\"\n :type=\"btn.clazz\"\n size=\"small\"\n style=\"margin-right: 5px\"\n :disabled=\"btn.disabled\"\n @click=\"\n handleBtnClick(btn, {\n searchModel: searchConfig.model,\n dataSource: dataSource,\n selectedRowKeys: selectedRowKeys,\n searchConfigOptions: searchConfig.options,\n current_org: current_org,\n router: router,\n })\n \"\n >\n <plus-outlined v-if=\"btn.icon === 'plus-outlined'\" />\n {{ btn.name }}\n </a-button>\n <a-dropdown\n v-else\n v-model:open=\"isMenuOpen[index]\"\n trigger=\"click\"\n >\n <a-button\n :bordered=\"false\"\n size=\"small\"\n >\n {{ btn.name }}\n <down-outlined\n v-if=\"!isMenuOpen[index]\"\n style=\"font-size: 10px; cursor: pointer\"\n />\n <up-outlined\n v-if=\"isMenuOpen[index]\"\n style=\"font-size: 10px; cursor: pointer\"\n />\n </a-button>\n <template #overlay>\n <a-menu>\n <head-btn-children\n :children_list=\"btn.children\"\n :selected-row-keys=\"selectedRowKeys\"\n :dataSource=\"dataSource\"\n :search-config=\"searchConfig\"\n :current_org=\"current_org\"\n :handleBtnClick=\"handleBtnClick\"\n />\n </a-menu>\n </template>\n </a-dropdown>\n </template>\n</template>\n<script lang=\"ts\">\nimport { checkCondition, nested_sort_list } from 'liyu-pc-base/utils/function';\nimport { cloneDeep } from 'lodash';\nimport { computed, defineComponent, PropType, ref } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport { useRoute } from 'vue-router';\nimport { head_btn_confirm } from './head_btn_confirm';\nimport { head_btn_custom_component } from './head_btn_custom_component';\nimport { head_btn_form } from './head_btn_form';\nimport HeadBtnChildren from './headBtnChildren.vue';\nimport { HeadBtnListConfig } from './typing';\n\nexport default defineComponent({\n name: 'HeadBtn',\n props: {\n auth_batch_update_list: {\n type: Array as PropType<HeadBtnListConfig>,\n required: true,\n },\n auth_head_btn_list: {\n type: Array as PropType<HeadBtnListConfig>,\n required: true,\n },\n selectedRowKeys: {\n type: Array as PropType<any[]>,\n required: true,\n },\n dataSource: {\n type: Array as PropType<any[]>,\n required: true,\n },\n searchConfig: {\n type: Object as PropType<{ model: any; options: any }>,\n required: true,\n },\n current_org: {\n type: Object as PropType<any>,\n required: true,\n },\n router: {\n type: Object as PropType<any>,\n required: true,\n },\n field: {\n type: Object as PropType<any>,\n required: true,\n },\n event_obj: {\n type: Object as PropType<any>,\n required: true,\n },\n },\n components: {\n HeadBtnChildren,\n },\n setup(props) {\n const { t } = useI18n();\n const isMenuOpen = ref<Record<string, boolean>>({});\n const route = useRoute();\n const process_list = (\n list: any,\n {\n dataSource,\n selectedRowKeys,\n batchList,\n }: { dataSource: any[]; selectedRowKeys: any[]; batchList: any[] | null },\n ) => {\n if (batchList?.length > 0) {\n const batchGroup = list.find((item: any) => item.name === '批量操作');\n if (batchGroup) {\n if (!batchGroup.children || batchGroup.children.length == 0) {\n batchGroup.children = batchList;\n } else {\n batchGroup.children = [...batchGroup.children, ...batchList];\n }\n } else {\n list.push({\n name: '批量操作',\n order: 1000,\n children: batchList,\n });\n }\n }\n const result = list.filter((button: any) => {\n let data = dataSource;\n // if (button.preProcessData) {\n // data = button.preProcessData({ dataSource: data, selectedRowKeys });\n // }\n let isDisabled = false;\n if (typeof button.is_disabled === 'function') {\n isDisabled = button.is_disabled({ dataSource: data, selectedRowKeys: selectedRowKeys });\n }\n if (typeof button.is_disabled === 'boolean') {\n isDisabled = button.is_disabled;\n }\n if (button.disabled_condition && button.disabled_condition.length > 0) {\n isDisabled = checkCondition({\n conditions: button.disabled_condition,\n dataSource: data,\n selectedRowKeys: selectedRowKeys,\n });\n }\n button.disabled = isDisabled;\n\n if (button.show_condition && button.show_condition.length > 0) {\n return checkCondition({\n conditions: button.show_condition,\n dataSource: data,\n selectedRowKeys: selectedRowKeys,\n });\n }\n\n if (typeof button.is_show === 'function') {\n return button.is_show({ dataSource: data, selectedRowKeys: selectedRowKeys });\n }\n if (typeof button.is_show === 'boolean') {\n return button.is_show;\n }\n return true;\n });\n result.forEach((item: any) => {\n if (item.children) {\n item.children = process_list(item.children, {\n dataSource: dataSource,\n selectedRowKeys: selectedRowKeys,\n batchList: null,\n });\n }\n });\n return result;\n };\n const filter_head_btn_list = computed(() => {\n if (!props.auth_head_btn_list) return [];\n const list = process_list(cloneDeep(props.auth_head_btn_list), {\n dataSource: props.dataSource,\n selectedRowKeys: props.selectedRowKeys,\n batchList: props.auth_batch_update_list,\n });\n nested_sort_list(list);\n return list;\n });\n // 处理按钮点击事件\n const handleBtnClick = (btn: any, params: any) => {\n let action_func = null;\n let query_json = {};\n if (route.query?.query_json) {\n query_json = JSON.parse(route.query?.query_json as any);\n }\n const routeQueryParams = JSON.parse(JSON.stringify({ ...route.query, ...query_json }));\n if (!btn.model_kind) {\n action_func = btn.cb;\n } else if (btn.model_kind === 'confirm') {\n action_func = head_btn_confirm;\n } else if (btn.model_kind === 'custom_component') {\n action_func = head_btn_custom_component;\n } else if (btn.model_kind === 'form') {\n action_func = head_btn_form;\n }\n\n if (!action_func) return;\n\n action_func({\n ...params,\n button: btn,\n t: t,\n current_org: props.current_org,\n routeQueryParams: routeQueryParams,\n });\n };\n return {\n filter_head_btn_list,\n handleBtnClick,\n isMenuOpen,\n };\n },\n});\n</script>\n","<template>\n <template\n v-for=\"(btn, index) in filter_head_btn_list\"\n :key=\"index\"\n >\n <a-button\n v-if=\"!btn.children || btn.children?.length == 0\"\n :type=\"btn.clazz\"\n size=\"small\"\n style=\"margin-right: 5px\"\n :disabled=\"btn.disabled\"\n @click=\"\n handleBtnClick(btn, {\n searchModel: searchConfig.model,\n dataSource: dataSource,\n selectedRowKeys: selectedRowKeys,\n searchConfigOptions: searchConfig.options,\n current_org: current_org,\n router: router,\n })\n \"\n >\n <plus-outlined v-if=\"btn.icon === 'plus-outlined'\" />\n {{ btn.name }}\n </a-button>\n <a-dropdown\n v-else\n v-model:open=\"isMenuOpen[index]\"\n trigger=\"click\"\n >\n <a-button\n :bordered=\"false\"\n size=\"small\"\n >\n {{ btn.name }}\n <down-outlined\n v-if=\"!isMenuOpen[index]\"\n style=\"font-size: 10px; cursor: pointer\"\n />\n <up-outlined\n v-if=\"isMenuOpen[index]\"\n style=\"font-size: 10px; cursor: pointer\"\n />\n </a-button>\n <template #overlay>\n <a-menu>\n <head-btn-children\n :children_list=\"btn.children\"\n :selected-row-keys=\"selectedRowKeys\"\n :dataSource=\"dataSource\"\n :search-config=\"searchConfig\"\n :current_org=\"current_org\"\n :handleBtnClick=\"handleBtnClick\"\n />\n </a-menu>\n </template>\n </a-dropdown>\n </template>\n</template>\n<script lang=\"ts\">\nimport { checkCondition, nested_sort_list } from 'liyu-pc-base/utils/function';\nimport { cloneDeep } from 'lodash';\nimport { computed, defineComponent, PropType, ref } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport { useRoute } from 'vue-router';\nimport { head_btn_confirm } from './head_btn_confirm';\nimport { head_btn_custom_component } from './head_btn_custom_component';\nimport { head_btn_form } from './head_btn_form';\nimport HeadBtnChildren from './headBtnChildren.vue';\nimport { HeadBtnListConfig } from './typing';\n\nexport default defineComponent({\n name: 'HeadBtn',\n props: {\n auth_batch_update_list: {\n type: Array as PropType<HeadBtnListConfig>,\n required: true,\n },\n auth_head_btn_list: {\n type: Array as PropType<HeadBtnListConfig>,\n required: true,\n },\n selectedRowKeys: {\n type: Array as PropType<any[]>,\n required: true,\n },\n dataSource: {\n type: Array as PropType<any[]>,\n required: true,\n },\n searchConfig: {\n type: Object as PropType<{ model: any; options: any }>,\n required: true,\n },\n current_org: {\n type: Object as PropType<any>,\n required: true,\n },\n router: {\n type: Object as PropType<any>,\n required: true,\n },\n field: {\n type: Object as PropType<any>,\n required: true,\n },\n event_obj: {\n type: Object as PropType<any>,\n required: true,\n },\n },\n components: {\n HeadBtnChildren,\n },\n setup(props) {\n const { t } = useI18n();\n const isMenuOpen = ref<Record<string, boolean>>({});\n const route = useRoute();\n const process_list = (\n list: any,\n {\n dataSource,\n selectedRowKeys,\n batchList,\n }: { dataSource: any[]; selectedRowKeys: any[]; batchList: any[] | null },\n ) => {\n if (batchList?.length > 0) {\n const batchGroup = list.find((item: any) => item.name === '批量操作');\n if (batchGroup) {\n if (!batchGroup.children || batchGroup.children.length == 0) {\n batchGroup.children = batchList;\n } else {\n batchGroup.children = [...batchGroup.children, ...batchList];\n }\n } else {\n list.push({\n name: '批量操作',\n order: 1000,\n children: batchList,\n });\n }\n }\n const result = list.filter((button: any) => {\n let data = dataSource;\n // if (button.preProcessData) {\n // data = button.preProcessData({ dataSource: data, selectedRowKeys });\n // }\n let isDisabled = false;\n if (typeof button.is_disabled === 'function') {\n isDisabled = button.is_disabled({ dataSource: data, selectedRowKeys: selectedRowKeys });\n }\n if (typeof button.is_disabled === 'boolean') {\n isDisabled = button.is_disabled;\n }\n if (button.disabled_condition && button.disabled_condition.length > 0) {\n isDisabled = checkCondition({\n conditions: button.disabled_condition,\n dataSource: data,\n selectedRowKeys: selectedRowKeys,\n });\n }\n button.disabled = isDisabled;\n\n if (button.show_condition && button.show_condition.length > 0) {\n return checkCondition({\n conditions: button.show_condition,\n dataSource: data,\n selectedRowKeys: selectedRowKeys,\n });\n }\n\n if (typeof button.is_show === 'function') {\n return button.is_show({ dataSource: data, selectedRowKeys: selectedRowKeys });\n }\n if (typeof button.is_show === 'boolean') {\n return button.is_show;\n }\n return true;\n });\n result.forEach((item: any) => {\n if (item.children) {\n item.children = process_list(item.children, {\n dataSource: dataSource,\n selectedRowKeys: selectedRowKeys,\n batchList: null,\n });\n }\n });\n return result;\n };\n const filter_head_btn_list = computed(() => {\n if (!props.auth_head_btn_list) return [];\n const list = process_list(cloneDeep(props.auth_head_btn_list), {\n dataSource: props.dataSource,\n selectedRowKeys: props.selectedRowKeys,\n batchList: props.auth_batch_update_list,\n });\n nested_sort_list(list);\n return list;\n });\n // 处理按钮点击事件\n const handleBtnClick = (btn: any, params: any) => {\n let action_func = null;\n let query_json = {};\n if (route.query?.query_json) {\n query_json = JSON.parse(route.query?.query_json as any);\n }\n const routeQueryParams = JSON.parse(JSON.stringify({ ...route.query, ...query_json }));\n if (!btn.model_kind) {\n action_func = btn.cb;\n } else if (btn.model_kind === 'confirm') {\n action_func = head_btn_confirm;\n } else if (btn.model_kind === 'custom_component') {\n action_func = head_btn_custom_component;\n } else if (btn.model_kind === 'form') {\n action_func = head_btn_form;\n }\n\n if (!action_func) return;\n\n action_func({\n ...params,\n button: btn,\n t: t,\n current_org: props.current_org,\n routeQueryParams: routeQueryParams,\n });\n };\n return {\n filter_head_btn_list,\n handleBtnClick,\n isMenuOpen,\n };\n },\n});\n</script>\n","<template>\n <a-popover>\n <template #content>\n <a-button\n size=\"small\"\n style=\"margin: 10px 5px\"\n :type=\"refreshType === '手动' ? 'primary' : 'default'\"\n @click=\"selectRefreshType('手动')\"\n >\n {{ $t('手动刷新') }}\n </a-button>\n <a-dropdown class=\"dropdown\">\n <a-button\n size=\"small\"\n style=\"margin: 10px 5px\"\n :type=\"refreshType === '手动' ? 'default' : 'primary'\"\n >\n {{ $t('自动刷新') }}\n <span v-if=\"refreshType !== '手动'\">({{ refreshType }})</span>\n </a-button>\n <template #overlay>\n <a-menu>\n <a-menu-item>\n <a\n href=\"javascript:;\"\n @click=\"selectRefreshType('5s')\"\n >\n 5s\n </a>\n </a-menu-item>\n <a-menu-item>\n <a\n href=\"javascript:;\"\n @click=\"selectRefreshType('10s')\"\n >\n 10s\n </a>\n </a-menu-item>\n <a-menu-item>\n <a\n href=\"javascript:;\"\n @click=\"selectRefreshType('30s')\"\n >\n 30s\n </a>\n </a-menu-item>\n </a-menu>\n </template>\n </a-dropdown>\n </template>\n <reload-outlined\n v-if=\"refreshType === '手动'\"\n @click=\"refresh\"\n />\n <loading-outlined v-if=\"(countdown == -1 || loading) && refreshType !== '手动'\" />\n <span v-if=\"countdown >= 0 && !loading\">{{ countdown + 1 }}s</span>\n </a-popover>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, onActivated, onDeactivated, onUnmounted, watch } from 'vue';\nimport { LoadingOutlined, ReloadOutlined } from '@ant-design/icons-vue';\nexport default defineComponent({\n name: 'refreshTypeModal',\n props: {\n refreshType: {\n type: String,\n default: () => '手动',\n },\n loading: {\n type: Boolean,\n default: () => false,\n },\n },\n components: {\n LoadingOutlined,\n ReloadOutlined,\n },\n emits: ['refresh', 'typeChange'],\n setup(props, { emit }) {\n let init = false;\n const countdown: any = ref(0);\n const current_page: any = ref(true);\n\n // 刷新模式切换\n const selectRefreshType = (type: any) => {\n emit('typeChange', type);\n countdown.value = -1;\n if (props.refreshType == '手动') {\n emit('refresh');\n }\n };\n const timer_countdown = setInterval(() => {\n if (countdown.value < 0) {\n switch (props.refreshType) {\n case '手动':\n countdown.value = -1;\n break;\n case '5s':\n countdown.value = 4;\n break;\n case '10s':\n countdown.value = 9;\n break;\n case '30s':\n countdown.value = 29;\n }\n } else if (countdown.value == 0) {\n if (current_page.value && !props.loading && init) {\n emit('refresh', true);\n }\n countdown.value = -1;\n } else {\n countdown.value--;\n }\n }, 1000);\n\n watch(\n () => props.loading,\n () => {\n if (!props.loading) {\n countdown.value = -1;\n init = true;\n }\n },\n );\n\n onActivated(() => {\n if (!current_page.value) {\n current_page.value = true;\n }\n });\n onDeactivated(() => {\n current_page.value = false;\n });\n\n onUnmounted(() => {\n clearInterval(timer_countdown);\n });\n\n const refresh = () => {\n emit('refresh');\n };\n return {\n props,\n countdown,\n refresh,\n selectRefreshType,\n };\n },\n});\n</script>\n","<template>\n <a-popover>\n <template #content>\n <a-button\n size=\"small\"\n style=\"margin: 10px 5px\"\n :type=\"refreshType === '手动' ? 'primary' : 'default'\"\n @click=\"selectRefreshType('手动')\"\n >\n {{ $t('手动刷新') }}\n </a-button>\n <a-dropdown class=\"dropdown\">\n <a-button\n size=\"small\"\n style=\"margin: 10px 5px\"\n :type=\"refreshType === '手动' ? 'default' : 'primary'\"\n >\n {{ $t('自动刷新') }}\n <span v-if=\"refreshType !== '手动'\">({{ refreshType }})</span>\n </a-button>\n <template #overlay>\n <a-menu>\n <a-menu-item>\n <a\n href=\"javascript:;\"\n @click=\"selectRefreshType('5s')\"\n >\n 5s\n </a>\n </a-menu-item>\n <a-menu-item>\n <a\n href=\"javascript:;\"\n @click=\"selectRefreshType('10s')\"\n >\n 10s\n </a>\n </a-menu-item>\n <a-menu-item>\n <a\n href=\"javascript:;\"\n @click=\"selectRefreshType('30s')\"\n >\n 30s\n </a>\n </a-menu-item>\n </a-menu>\n </template>\n </a-dropdown>\n </template>\n <reload-outlined\n v-if=\"refreshType === '手动'\"\n @click=\"refresh\"\n />\n <loading-outlined v-if=\"(countdown == -1 || loading) && refreshType !== '手动'\" />\n <span v-if=\"countdown >= 0 && !loading\">{{ countdown + 1 }}s</span>\n </a-popover>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, onActivated, onDeactivated, onUnmounted, watch } from 'vue';\nimport { LoadingOutlined, ReloadOutlined } from '@ant-design/icons-vue';\nexport default defineComponent({\n name: 'refreshTypeModal',\n props: {\n refreshType: {\n type: String,\n default: () => '手动',\n },\n loading: {\n type: Boolean,\n default: () => false,\n },\n },\n components: {\n LoadingOutlined,\n ReloadOutlined,\n },\n emits: ['refresh', 'typeChange'],\n setup(props, { emit }) {\n let init = false;\n const countdown: any = ref(0);\n const current_page: any = ref(true);\n\n // 刷新模式切换\n const selectRefreshType = (type: any) => {\n emit('typeChange', type);\n countdown.value = -1;\n if (props.refreshType == '手动') {\n emit('refresh');\n }\n };\n const timer_countdown = setInterval(() => {\n if (countdown.value < 0) {\n switch (props.refreshType) {\n case '手动':\n countdown.value = -1;\n break;\n case '5s':\n countdown.value = 4;\n break;\n case '10s':\n countdown.value = 9;\n break;\n case '30s':\n countdown.value = 29;\n }\n } else if (countdown.value == 0) {\n if (current_page.value && !props.loading && init) {\n emit('refresh', true);\n }\n countdown.value = -1;\n } else {\n countdown.value--;\n }\n }, 1000);\n\n watch(\n () => props.loading,\n () => {\n if (!props.loading) {\n countdown.value = -1;\n init = true;\n }\n },\n );\n\n onActivated(() => {\n if (!current_page.value) {\n current_page.value = true;\n }\n });\n onDeactivated(() => {\n current_page.value = false;\n });\n\n onUnmounted(() => {\n clearInterval(timer_countdown);\n });\n\n const refresh = () => {\n emit('refresh');\n };\n return {\n props,\n countdown,\n refresh,\n selectRefreshType,\n };\n },\n});\n</script>\n","<template>\n <div\n class=\"ant-pro-table-list-toolbar\"\n v-if=\"!config?.hide_header\"\n ref=\"headerRef\"\n >\n <div class=\"ant-pro-table-list-toolbar-container\">\n <div class=\"ant-pro-table-list-toolbar-left\">\n <div class=\"ant-pro-table-list-toolbar-title\">\n <span v-if=\"config?.show_title\">{{ config?.title }}</span>\n <div v-if=\"config?.show_current_view\">\n <span>\n {{ currentView?.name }}\n </span>\n <template v-if=\"isViewChange && currentView && currentView.id !== 'no-view'\">\n <span style=\"font-size: 12px; margin-right: 5px\">(已编辑)</span>\n <a-dropdown\n v-model:open=\"isDropdown\"\n trigger=\"click\"\n >\n <a-tag\n :bordered=\"false\"\n style=\"cursor: pointer\"\n >\n {{ $t('保存') }}\n <down-outlined\n v-if=\"!isDropdown\"\n style=\"font-size: 10px; cursor: pointer\"\n />\n <up-outlined\n v-if=\"isDropdown\"\n style=\"font-size: 10px; cursor: pointer\"\n />\n </a-tag>\n <template #overlay>\n <a-menu>\n <a-menu-item>\n <span\n @click=\"\n () => {\n isDropdown = false;\n selfEventBus.emit('saveView');\n }\n \"\n >\n {{ $t('保存视图') }}\n </span>\n </a-menu-item>\n <a-menu-item>\n <span\n @click=\"\n () => {\n isDropdown = false;\n selfEventBus.emit('saveNewView');\n }\n \"\n >\n {{ $t('另存为新视图') }}\n </span>\n </a-menu-item>\n </a-menu>\n </template>\n </a-dropdown>\n <a-tag\n :bordered=\"false\"\n style=\"cursor: pointer\"\n @click=\"\n () => {\n selfEventBus.emit('reinit');\n }\n \"\n >\n {{ $t('重置') }}\n </a-tag>\n </template>\n </div>\n </div>\n </div>\n <div class=\"ant-pro-table-list-toolbar-right\">\n <a-space align=\"center\">\n <slot name=\"header_bar_before_btn\"></slot>\n <head-btn\n :auth_batch_update_list=\"auth_batch_update_list\"\n :auth_head_btn_list=\"auth_head_btn_list\"\n :selectedRowKeys=\"selectedRowKeys\"\n :dataSource=\"dataSource\"\n :searchConfig=\"config.query_params || {}\"\n :current_org=\"current_org\"\n :router=\"router\"\n :field=\"{}\"\n :event_obj=\"selfEventBus\"\n />\n <slot name=\"header_bar_after_btn\"></slot>\n </a-space>\n\n <div class=\"ant-pro-table-list-toolbar-divider\">\n <a-divider type=\"vertical\" />\n </div>\n <div\n class=\"ant-pro-table-list-toolbar-setting-item\"\n v-if=\"config?.sys_btn?.refresh !== false\"\n >\n <refresh-type-modal\n :refreshType=\"refreshType\"\n :loading=\"loading\"\n @refresh=\"$emit('refresh')\"\n @typeChange=\"$emit('refreshTypeChange', $event)\"\n />\n </div>\n <div\n class=\"ant-pro-table-list-toolbar-setting-item\"\n v-if=\"config?.sys_btn?.export !== false\"\n >\n <a-tooltip :title=\"$t('导出Excel')\">\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"$emit('export')\"\n >\n <template #icon>\n <download-outlined></download-outlined>\n </template>\n </a-button>\n </a-tooltip>\n </div>\n <div\n class=\"ant-pro-table-list-toolbar-setting-item\"\n v-if=\"config?.sys_btn?.table_size !== false\"\n >\n <a-tooltip :title=\"$t('密度')\">\n <a-dropdown\n :trigger=\"['click']\"\n placement=\"bottomRight\"\n >\n <column-height-outlined />\n <template #overlay>\n <a-menu\n :selected-keys=\"[tableSize]\"\n style=\"width: 80px\"\n @click=\"\n ({ key }) => {\n $emit('update:tableSize', key as string);\n $emit('tableSizeChange', key as string);\n }\n \"\n >\n <a-menu-item key=\"default\">\n <a href=\"javascript:\">{{ $t('默认') }}</a>\n </a-menu-item>\n <a-menu-item key=\"middle\">\n <a href=\"javascript:\">{{ $t('中等') }}</a>\n </a-menu-item>\n <a-menu-item key=\"small\">\n <a href=\"javascript:\">{{ $t('紧凑') }}</a>\n </a-menu-item>\n </a-menu>\n </template>\n </a-dropdown>\n </a-tooltip>\n </div>\n <div\n class=\"ant-pro-table-list-toolbar-setting-item\"\n v-if=\"config?.sys_btn?.column_config !== false\"\n >\n <a-tooltip :title=\"$t('设置')\">\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"settingOpen = true\"\n >\n <template #icon>\n <setting-outlined />\n </template>\n </a-button>\n </a-tooltip>\n </div>\n\n <div\n class=\"ant-pro-table-list-toolbar-setting-item\"\n v-if=\"config?.sys_btn?.full_screen !== false\"\n >\n <a-tooltip :title=\"screenState ? $t('退出全屏') : $t('全屏')\">\n <fullscreen-outlined\n v-if=\"!screenState\"\n @click=\"$emit('setFull')\"\n />\n <fullscreen-exit-outlined\n v-else\n @click=\"$emit('exitFull')\"\n />\n </a-tooltip>\n </div>\n </div>\n </div>\n </div>\n <a-modal\n :title=\"$t('设置')\"\n width=\"1000px\"\n v-model:open=\"settingOpen\"\n >\n <column-edit-view\n :columns=\"columns\"\n :is_view=\"is_view\"\n :view_key=\"view_key\"\n :view_flag_name=\"view_flag_name\"\n @change=\"$emit('columnsChange', $event)\"\n ></column-edit-view>\n <template #footer>\n <a-button @click=\"settingOpen = false\">\n {{ $t('关闭') }}\n </a-button>\n </template>\n </a-modal>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n ColumnHeightOutlined,\n FullscreenExitOutlined,\n FullscreenOutlined,\n DownloadOutlined,\n SettingOutlined,\n} from '@ant-design/icons-vue';\nimport { useResizeObserver } from '@vueuse/core';\nimport { PropType, ref } from 'vue';\nimport columnEditView from './tableConfig/index.vue';\nimport HeadBtn from './headBtn.vue';\nimport RefreshTypeModal from './refresh-type-modal/index.vue';\nimport { Column, Table } from './typing';\nimport { useTableProState } from './utils';\n\ndefineProps({\n config: {\n type: Object as PropType<Table>,\n required: true,\n },\n auth_batch_update_list: {\n type: Array,\n default: () => [],\n },\n auth_head_btn_list: {\n type: Array,\n default: () => [],\n },\n selectedRowKeys: {\n type: Array,\n default: () => [],\n },\n dataSource: {\n type: Array,\n default: () => [],\n },\n current_org: {\n type: Object,\n },\n router: {\n type: Object,\n },\n selfEventBus: {\n type: Object,\n },\n loading: {\n type: Boolean,\n default: false,\n },\n screenState: {\n type: Boolean,\n default: false,\n },\n tableSize: {\n type: String,\n default: 'small',\n },\n columns: {\n type: Array as PropType<Column[]>,\n default: () => [],\n },\n view_key: {\n type: String,\n default: '',\n },\n view_flag_name: {\n type: String,\n default: '',\n },\n is_view: {\n type: Boolean,\n default: true,\n },\n refreshType: {\n type: String,\n default: '手动',\n },\n});\n\nconst emit = defineEmits([\n 'refresh',\n 'export',\n 'setFull',\n 'exitFull',\n 'columnsChange',\n 'viewSelected',\n 'update:tableSize',\n 'heightChange',\n 'refreshTypeChange',\n 'tableSizeChange',\n]);\nconst settingOpen = ref(false);\nconst headerRef = ref(null);\nuseResizeObserver(headerRef, entries => {\n emit('heightChange', entries[0].contentRect.height);\n});\nconst { currentView, isViewChange } = useTableProState();\nconst isDropdown = ref(false);\n</script>\n\n<style lang=\"less\" scoped>\n.ant-pro-table-list-toolbar-container {\n height: 30px;\n line-height: 30px;\n}\n.ant-pro-table-list-toolbar-setting-item {\n font-size: 14px;\n}\n</style>\n","<template>\n <div\n class=\"ant-pro-table-list-toolbar\"\n v-if=\"!config?.hide_header\"\n ref=\"headerRef\"\n >\n <div class=\"ant-pro-table-list-toolbar-container\">\n <div class=\"ant-pro-table-list-toolbar-left\">\n <div class=\"ant-pro-table-list-toolbar-title\">\n <span v-if=\"config?.show_title\">{{ config?.title }}</span>\n <div v-if=\"config?.show_current_view\">\n <span>\n {{ currentView?.name }}\n </span>\n <template v-if=\"isViewChange && currentView && currentView.id !== 'no-view'\">\n <span style=\"font-size: 12px; margin-right: 5px\">(已编辑)</span>\n <a-dropdown\n v-model:open=\"isDropdown\"\n trigger=\"click\"\n >\n <a-tag\n :bordered=\"false\"\n style=\"cursor: pointer\"\n >\n {{ $t('保存') }}\n <down-outlined\n v-if=\"!isDropdown\"\n style=\"font-size: 10px; cursor: pointer\"\n />\n <up-outlined\n v-if=\"isDropdown\"\n style=\"font-size: 10px; cursor: pointer\"\n />\n </a-tag>\n <template #overlay>\n <a-menu>\n <a-menu-item>\n <span\n @click=\"\n () => {\n isDropdown = false;\n selfEventBus.emit('saveView');\n }\n \"\n >\n {{ $t('保存视图') }}\n </span>\n </a-menu-item>\n <a-menu-item>\n <span\n @click=\"\n () => {\n isDropdown = false;\n selfEventBus.emit('saveNewView');\n }\n \"\n >\n {{ $t('另存为新视图') }}\n </span>\n </a-menu-item>\n </a-menu>\n </template>\n </a-dropdown>\n <a-tag\n :bordered=\"false\"\n style=\"cursor: pointer\"\n @click=\"\n () => {\n selfEventBus.emit('reinit');\n }\n \"\n >\n {{ $t('重置') }}\n </a-tag>\n </template>\n </div>\n </div>\n </div>\n <div class=\"ant-pro-table-list-toolbar-right\">\n <a-space align=\"center\">\n <slot name=\"header_bar_before_btn\"></slot>\n <head-btn\n :auth_batch_update_list=\"auth_batch_update_list\"\n :auth_head_btn_list=\"auth_head_btn_list\"\n :selectedRowKeys=\"selectedRowKeys\"\n :dataSource=\"dataSource\"\n :searchConfig=\"config.query_params || {}\"\n :current_org=\"current_org\"\n :router=\"router\"\n :field=\"{}\"\n :event_obj=\"selfEventBus\"\n />\n <slot name=\"header_bar_after_btn\"></slot>\n </a-space>\n\n <div class=\"ant-pro-table-list-toolbar-divider\">\n <a-divider type=\"vertical\" />\n </div>\n <div\n class=\"ant-pro-table-list-toolbar-setting-item\"\n v-if=\"config?.sys_btn?.refresh !== false\"\n >\n <refresh-type-modal\n :refreshType=\"refreshType\"\n :loading=\"loading\"\n @refresh=\"$emit('refresh')\"\n @typeChange=\"$emit('refreshTypeChange', $event)\"\n />\n </div>\n <div\n class=\"ant-pro-table-list-toolbar-setting-item\"\n v-if=\"config?.sys_btn?.export !== false\"\n >\n <a-tooltip :title=\"$t('导出Excel')\">\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"$emit('export')\"\n >\n <template #icon>\n <download-outlined></download-outlined>\n </template>\n </a-button>\n </a-tooltip>\n </div>\n <div\n class=\"ant-pro-table-list-toolbar-setting-item\"\n v-if=\"config?.sys_btn?.table_size !== false\"\n >\n <a-tooltip :title=\"$t('密度')\">\n <a-dropdown\n :trigger=\"['click']\"\n placement=\"bottomRight\"\n >\n <column-height-outlined />\n <template #overlay>\n <a-menu\n :selected-keys=\"[tableSize]\"\n style=\"width: 80px\"\n @click=\"\n ({ key }) => {\n $emit('update:tableSize', key as string);\n $emit('tableSizeChange', key as string);\n }\n \"\n >\n <a-menu-item key=\"default\">\n <a href=\"javascript:\">{{ $t('默认') }}</a>\n </a-menu-item>\n <a-menu-item key=\"middle\">\n <a href=\"javascript:\">{{ $t('中等') }}</a>\n </a-menu-item>\n <a-menu-item key=\"small\">\n <a href=\"javascript:\">{{ $t('紧凑') }}</a>\n </a-menu-item>\n </a-menu>\n </template>\n </a-dropdown>\n </a-tooltip>\n </div>\n <div\n class=\"ant-pro-table-list-toolbar-setting-item\"\n v-if=\"config?.sys_btn?.column_config !== false\"\n >\n <a-tooltip :title=\"$t('设置')\">\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"settingOpen = true\"\n >\n <template #icon>\n <setting-outlined />\n </template>\n </a-button>\n </a-tooltip>\n </div>\n\n <div\n class=\"ant-pro-table-list-toolbar-setting-item\"\n v-if=\"config?.sys_btn?.full_screen !== false\"\n >\n <a-tooltip :title=\"screenState ? $t('退出全屏') : $t('全屏')\">\n <fullscreen-outlined\n v-if=\"!screenState\"\n @click=\"$emit('setFull')\"\n />\n <fullscreen-exit-outlined\n v-else\n @click=\"$emit('exitFull')\"\n />\n </a-tooltip>\n </div>\n </div>\n </div>\n </div>\n <a-modal\n :title=\"$t('设置')\"\n width=\"1000px\"\n v-model:open=\"settingOpen\"\n >\n <column-edit-view\n :columns=\"columns\"\n :is_view=\"is_view\"\n :view_key=\"view_key\"\n :view_flag_name=\"view_flag_name\"\n @change=\"$emit('columnsChange', $event)\"\n ></column-edit-view>\n <template #footer>\n <a-button @click=\"settingOpen = false\">\n {{ $t('关闭') }}\n </a-button>\n </template>\n </a-modal>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n ColumnHeightOutlined,\n FullscreenExitOutlined,\n FullscreenOutlined,\n DownloadOutlined,\n SettingOutlined,\n} from '@ant-design/icons-vue';\nimport { useResizeObserver } from '@vueuse/core';\nimport { PropType, ref } from 'vue';\nimport columnEditView from './tableConfig/index.vue';\nimport HeadBtn from './headBtn.vue';\nimport RefreshTypeModal from './refresh-type-modal/index.vue';\nimport { Column, Table } from './typing';\nimport { useTableProState } from './utils';\n\ndefineProps({\n config: {\n type: Object as PropType<Table>,\n required: true,\n },\n auth_batch_update_list: {\n type: Array,\n default: () => [],\n },\n auth_head_btn_list: {\n type: Array,\n default: () => [],\n },\n selectedRowKeys: {\n type: Array,\n default: () => [],\n },\n dataSource: {\n type: Array,\n default: () => [],\n },\n current_org: {\n type: Object,\n },\n router: {\n type: Object,\n },\n selfEventBus: {\n type: Object,\n },\n loading: {\n type: Boolean,\n default: false,\n },\n screenState: {\n type: Boolean,\n default: false,\n },\n tableSize: {\n type: String,\n default: 'small',\n },\n columns: {\n type: Array as PropType<Column[]>,\n default: () => [],\n },\n view_key: {\n type: String,\n default: '',\n },\n view_flag_name: {\n type: String,\n default: '',\n },\n is_view: {\n type: Boolean,\n default: true,\n },\n refreshType: {\n type: String,\n default: '手动',\n },\n});\n\nconst emit = defineEmits([\n 'refresh',\n 'export',\n 'setFull',\n 'exitFull',\n 'columnsChange',\n 'viewSelected',\n 'update:tableSize',\n 'heightChange',\n 'refreshTypeChange',\n 'tableSizeChange',\n]);\nconst settingOpen = ref(false);\nconst headerRef = ref(null);\nuseResizeObserver(headerRef, entries => {\n emit('heightChange', entries[0].contentRect.height);\n});\nconst { currentView, isViewChange } = useTableProState();\nconst isDropdown = ref(false);\n</script>\n\n<style lang=\"less\" scoped>\n.ant-pro-table-list-toolbar-container {\n height: 30px;\n line-height: 30px;\n}\n.ant-pro-table-list-toolbar-setting-item {\n font-size: 14px;\n}\n</style>\n","<template>\n <component\n :is=\"'CellSummary_' + item.cellSummaryComponent\"\n v-if=\"item.cellSummaryComponent\"\n :cmpObj=\"{\n item: item,\n total: total,\n }\"\n ></component>\n <span v-else>{{ item.total_content ? item.total_content(total) : total }}</span>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nconst props = defineProps({\n item: {\n type: Object,\n required: true,\n },\n summaryParams: {\n type: Object,\n required: true,\n },\n});\nconst total = computed(() => {\n let totla: any = 0;\n for (const item of props.summaryParams.pageData) {\n let itemValue = item[props.summaryParams.column.dataIndex];\n itemValue = getValue(itemValue);\n\n if (isNaN(itemValue) || itemValue == null) {\n itemValue = 0;\n }\n totla = add(totla, itemValue);\n }\n\n return totla;\n});\nfunction add(a, b) {\n const precision = Math.max(\n (a.toString().split('.')[1] || '').length,\n (b.toString().split('.')[1] || '').length,\n );\n return parseFloat((a + b).toFixed(precision));\n}\nconst getValue = (value: any) => {\n if (typeof value === 'string') {\n value = parseFloat(value);\n }\n return value;\n};\n</script>\n<style lang=\"less\" scoped></style>\n","<template>\n <component\n :is=\"'CellSummary_' + item.cellSummaryComponent\"\n v-if=\"item.cellSummaryComponent\"\n :cmpObj=\"{\n item: item,\n total: total,\n }\"\n ></component>\n <span v-else>{{ item.total_content ? item.total_content(total) : total }}</span>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nconst props = defineProps({\n item: {\n type: Object,\n required: true,\n },\n summaryParams: {\n type: Object,\n required: true,\n },\n});\nconst total = computed(() => {\n let totla: any = 0;\n for (const item of props.summaryParams.pageData) {\n let itemValue = item[props.summaryParams.column.dataIndex];\n itemValue = getValue(itemValue);\n\n if (isNaN(itemValue) || itemValue == null) {\n itemValue = 0;\n }\n totla = add(totla, itemValue);\n }\n\n return totla;\n});\nfunction add(a, b) {\n const precision = Math.max(\n (a.toString().split('.')[1] || '').length,\n (b.toString().split('.')[1] || '').length,\n );\n return parseFloat((a + b).toFixed(precision));\n}\nconst getValue = (value: any) => {\n if (typeof value === 'string') {\n value = parseFloat(value);\n }\n return value;\n};\n</script>\n<style lang=\"less\" scoped></style>\n","<template>\n <a-menu\n :items=\"menuItems\"\n size=\"small\"\n mode=\"vertical\"\n @click=\"handleClick\"\n ></a-menu>\n <a-modal\n :title=\"$t('设置')\"\n width=\"1000px\"\n v-model:open=\"settingOpen\"\n >\n <column-edit-view\n :columns=\"columns\"\n :is_view=\"is_view\"\n :view_key=\"view_key\"\n :view_flag_name=\"view_flag_name\"\n @change=\"$emit('columnsChange', $event)\"\n ></column-edit-view>\n <template #footer>\n <a-button @click=\"settingOpen = false\">\n {{ $t('关闭') }}\n </a-button>\n </template>\n </a-modal>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n CopyOutlined,\n ReloadOutlined,\n DownloadOutlined,\n SettingOutlined,\n SaveOutlined,\n AlignLeftOutlined,\n} from '@ant-design/icons-vue';\nimport { copyValue, isNotEmpty } from 'liyu-pc-base/utils/function';\nimport { computed, h, PropType, ref } from 'vue';\nimport columnEditView from './tableConfig/index.vue';\nimport { Column } from './typing';\nimport { useTableProState } from './utils';\nimport { MenuProps } from 'ant-design-vue';\n\nconst props = defineProps({\n contextmenuPopup: {\n type: Object,\n required: true,\n },\n dataSource: {\n type: Array,\n default: () => [],\n },\n columns: {\n type: Array as PropType<Column[]>,\n default: () => [],\n },\n view_key: {\n type: String,\n default: '',\n },\n view_flag_name: {\n type: String,\n default: '',\n },\n is_view: {\n type: Boolean,\n default: false,\n },\n selfEventBus: {\n type: Object,\n },\n});\n\nconst emit = defineEmits(['refresh', 'export', 'columnsChange']);\nconst settingOpen = ref(false);\nconst { currentView, isViewChange } = useTableProState();\nconst menuItems = computed(() => {\n let res: any = [\n {\n key: 'copy',\n icon: () => h(CopyOutlined),\n label: '复制',\n children: [\n {\n key: 'copy_cell',\n icon: () => h(CopyOutlined),\n label: '复制单元格',\n },\n {\n key: 'copy_record',\n icon: () => h(CopyOutlined),\n label: '复制行',\n },\n {\n key: 'copy_column',\n icon: () => h(CopyOutlined),\n label: '复制列',\n },\n ],\n },\n {\n key: 'refresh',\n icon: () => h(ReloadOutlined),\n label: '刷新',\n },\n {\n key: 'export',\n icon: () => h(DownloadOutlined),\n label: '导出',\n },\n {\n key: 'table_config',\n icon: () => h(SettingOutlined),\n label: '设置',\n },\n ];\n if (\n props.is_view &&\n isViewChange.value &&\n currentView.value &&\n currentView.value.id !== 'no-view'\n ) {\n res = [\n ...res,\n {\n key: 'view',\n icon: () => h(AlignLeftOutlined),\n label: '视图',\n children: [\n {\n key: 'save_view',\n icon: () => h(SaveOutlined),\n label: '保存视图',\n },\n {\n key: 'save_new_view',\n icon: () => h(SaveOutlined),\n label: '另存视图',\n },\n {\n key: 'reinit',\n icon: () => h(ReloadOutlined),\n label: '重置',\n },\n ],\n },\n ];\n }\n return res;\n});\n\nconst formatCopyValue = (value: any) => {\n return typeof value === 'object' ? JSON.stringify(value) : value;\n};\n\nconst copyClick = (type: 'cell' | 'column' | 'record') => {\n const { contextmenuPopup, dataSource, columns } = props;\n if (type === 'cell') {\n if (contextmenuPopup.column.key !== 'operation') {\n copyValue(formatCopyValue(contextmenuPopup.text));\n }\n } else if (type === 'column') {\n if (contextmenuPopup.column.key !== 'operation') {\n const { dataIndex } = contextmenuPopup.column;\n const value = dataSource.map((d: any) => formatCopyValue(d[dataIndex])).join('\\r\\n');\n copyValue(value);\n }\n } else if (type === 'record') {\n const record = contextmenuPopup.record;\n const value = columns\n .map((c: any) => (c.dataIndex ? formatCopyValue(record[c.dataIndex]) : ''))\n .filter(c => isNotEmpty(c))\n .join(' ');\n copyValue(value);\n }\n};\n\nconst handleClick: MenuProps['onClick'] = menuInfo => {\n if (menuInfo.key === 'copy_cell') {\n copyClick('cell');\n } else if (menuInfo.key === 'copy_record') {\n copyClick('record');\n } else if (menuInfo.key === 'copy_column') {\n copyClick('column');\n } else if (menuInfo.key === 'refresh') {\n emit('refresh');\n } else if (menuInfo.key === 'export') {\n emit('export');\n } else if (menuInfo.key === 'table_config') {\n settingOpen.value = true;\n } else if (menuInfo.key === 'save_view') {\n props.selfEventBus.emit('saveView');\n } else if (menuInfo.key === 'save_new_view') {\n props.selfEventBus.emit('saveNewView');\n } else if (menuInfo.key === 'reinit') {\n props.selfEventBus.emit('reinit');\n }\n props.contextmenuPopup.hidePopup();\n};\n</script>\n\n<style lang=\"less\" scoped>\n.popup-divider {\n :deep(.ant-divider-horizontal) {\n margin-top: 1px;\n margin-bottom: 1px;\n }\n}\n</style>\n","<template>\n <a-menu\n :items=\"menuItems\"\n size=\"small\"\n mode=\"vertical\"\n @click=\"handleClick\"\n ></a-menu>\n <a-modal\n :title=\"$t('设置')\"\n width=\"1000px\"\n v-model:open=\"settingOpen\"\n >\n <column-edit-view\n :columns=\"columns\"\n :is_view=\"is_view\"\n :view_key=\"view_key\"\n :view_flag_name=\"view_flag_name\"\n @change=\"$emit('columnsChange', $event)\"\n ></column-edit-view>\n <template #footer>\n <a-button @click=\"settingOpen = false\">\n {{ $t('关闭') }}\n </a-button>\n </template>\n </a-modal>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n CopyOutlined,\n ReloadOutlined,\n DownloadOutlined,\n SettingOutlined,\n SaveOutlined,\n AlignLeftOutlined,\n} from '@ant-design/icons-vue';\nimport { copyValue, isNotEmpty } from 'liyu-pc-base/utils/function';\nimport { computed, h, PropType, ref } from 'vue';\nimport columnEditView from './tableConfig/index.vue';\nimport { Column } from './typing';\nimport { useTableProState } from './utils';\nimport { MenuProps } from 'ant-design-vue';\n\nconst props = defineProps({\n contextmenuPopup: {\n type: Object,\n required: true,\n },\n dataSource: {\n type: Array,\n default: () => [],\n },\n columns: {\n type: Array as PropType<Column[]>,\n default: () => [],\n },\n view_key: {\n type: String,\n default: '',\n },\n view_flag_name: {\n type: String,\n default: '',\n },\n is_view: {\n type: Boolean,\n default: false,\n },\n selfEventBus: {\n type: Object,\n },\n});\n\nconst emit = defineEmits(['refresh', 'export', 'columnsChange']);\nconst settingOpen = ref(false);\nconst { currentView, isViewChange } = useTableProState();\nconst menuItems = computed(() => {\n let res: any = [\n {\n key: 'copy',\n icon: () => h(CopyOutlined),\n label: '复制',\n children: [\n {\n key: 'copy_cell',\n icon: () => h(CopyOutlined),\n label: '复制单元格',\n },\n {\n key: 'copy_record',\n icon: () => h(CopyOutlined),\n label: '复制行',\n },\n {\n key: 'copy_column',\n icon: () => h(CopyOutlined),\n label: '复制列',\n },\n ],\n },\n {\n key: 'refresh',\n icon: () => h(ReloadOutlined),\n label: '刷新',\n },\n {\n key: 'export',\n icon: () => h(DownloadOutlined),\n label: '导出',\n },\n {\n key: 'table_config',\n icon: () => h(SettingOutlined),\n label: '设置',\n },\n ];\n if (\n props.is_view &&\n isViewChange.value &&\n currentView.value &&\n currentView.value.id !== 'no-view'\n ) {\n res = [\n ...res,\n {\n key: 'view',\n icon: () => h(AlignLeftOutlined),\n label: '视图',\n children: [\n {\n key: 'save_view',\n icon: () => h(SaveOutlined),\n label: '保存视图',\n },\n {\n key: 'save_new_view',\n icon: () => h(SaveOutlined),\n label: '另存视图',\n },\n {\n key: 'reinit',\n icon: () => h(ReloadOutlined),\n label: '重置',\n },\n ],\n },\n ];\n }\n return res;\n});\n\nconst formatCopyValue = (value: any) => {\n return typeof value === 'object' ? JSON.stringify(value) : value;\n};\n\nconst copyClick = (type: 'cell' | 'column' | 'record') => {\n const { contextmenuPopup, dataSource, columns } = props;\n if (type === 'cell') {\n if (contextmenuPopup.column.key !== 'operation') {\n copyValue(formatCopyValue(contextmenuPopup.text));\n }\n } else if (type === 'column') {\n if (contextmenuPopup.column.key !== 'operation') {\n const { dataIndex } = contextmenuPopup.column;\n const value = dataSource.map((d: any) => formatCopyValue(d[dataIndex])).join('\\r\\n');\n copyValue(value);\n }\n } else if (type === 'record') {\n const record = contextmenuPopup.record;\n const value = columns\n .map((c: any) => (c.dataIndex ? formatCopyValue(record[c.dataIndex]) : ''))\n .filter(c => isNotEmpty(c))\n .join(' ');\n copyValue(value);\n }\n};\n\nconst handleClick: MenuProps['onClick'] = menuInfo => {\n if (menuInfo.key === 'copy_cell') {\n copyClick('cell');\n } else if (menuInfo.key === 'copy_record') {\n copyClick('record');\n } else if (menuInfo.key === 'copy_column') {\n copyClick('column');\n } else if (menuInfo.key === 'refresh') {\n emit('refresh');\n } else if (menuInfo.key === 'export') {\n emit('export');\n } else if (menuInfo.key === 'table_config') {\n settingOpen.value = true;\n } else if (menuInfo.key === 'save_view') {\n props.selfEventBus.emit('saveView');\n } else if (menuInfo.key === 'save_new_view') {\n props.selfEventBus.emit('saveNewView');\n } else if (menuInfo.key === 'reinit') {\n props.selfEventBus.emit('reinit');\n }\n props.contextmenuPopup.hidePopup();\n};\n</script>\n\n<style lang=\"less\" scoped>\n.popup-divider {\n :deep(.ant-divider-horizontal) {\n margin-top: 1px;\n margin-bottom: 1px;\n }\n}\n</style>\n","<template>\n <div\n class=\"table-wraper\"\n ref=\"tableWraperRef\"\n >\n <div ref=\"searchRef\">\n <Search\n v-if=\"config?.search_config && config.search_config.length > 0\"\n :searchConfig=\"config?.search_config || []\"\n :autoRefreshOnSearchChange=\"config?.auto_refresh_on_search_change\"\n v-model:searchConditions=\"searchConditions\"\n :event-bus=\"selfEventBus\"\n :searchType=\"search_type\"\n :searchDisplayType=\"config?.search_display_type\"\n :searchColumnCount=\"config?.search_column_count\"\n :viewSearchConfig=\"viewSearchConfig\"\n @viewSearchConfigChange=\"viewSearchConfigChange\"\n @change=\"handleSearchChange\"\n ></Search>\n </div>\n <a-card\n ref=\"elRef\"\n :body-style=\"{ padding: 0 }\"\n >\n <TableHeader\n :config=\"config\"\n :auth_batch_update_list=\"auth_batch_update_list\"\n :auth_head_btn_list=\"auth_head_btn_list\"\n :selectedRowKeys=\"selectedRowKeys\"\n :dataSource=\"dataSource\"\n :current_org=\"current_org\"\n :router=\"router\"\n :selfEventBus=\"selfEventBus\"\n :loading=\"loading\"\n :screenState=\"screenState\"\n v-model:tableSize=\"state.tableSize\"\n :columns=\"columns\"\n :view_key=\"view_key\"\n :view_flag_name=\"config.title\"\n :is_view=\"is_view\"\n :refreshType=\"refreshType\"\n @refresh=\"refresh\"\n @export=\"handleExport\"\n @setFull=\"setFull\"\n @exitFull=\"exitFull\"\n @columnsChange=\"onColumnsChange\"\n @heightChange=\"h => (headerHeight = h)\"\n @refreshTypeChange=\"handleRefreshTypeChange\"\n @tableSizeChange=\"handleTableSizeChange\"\n >\n <template #header_bar_before_btn>\n <slot name=\"header_bar_before_btn\"></slot>\n </template>\n <template #header_bar_after_btn>\n <slot name=\"header_bar_after_btn\"></slot>\n </template>\n </TableHeader>\n <s-table\n v-if=\"columns?.length > 0\"\n :columns=\"filtedColumns\"\n v-model:selectedRowKeys=\"selectedRowKeys\"\n :data-source=\"dataSource\"\n :bordered=\"true\"\n :size=\"state.tableSize\"\n :height=\"tableHeight\"\n :rowHeight=\"config.rowHeight || undefined\"\n :scroll=\"{\n x: tableContentWidth,\n }\"\n :loading=\"loading && !config?.disabled_table_loading\"\n :pagination=\"\n config?.is_pagination\n ? {\n current: state.current,\n pageSize: state.pageSize,\n total: state.total,\n onChange: handlePageChange,\n showSizeChanger: true,\n pageSizeOptions: pageSizeOptions,\n }\n : false\n \"\n :rowKey=\"'id'\"\n :rowSelection=\"config?.is_selection ? row_selection : null\"\n :custom-cell=\"config?.customCell\"\n :custom-header-cell=\"config?.customHeaderCell\"\n :virtual=\"true\"\n sticky\n summary-fixed\n :preserveRow=\"preserveRow\"\n :style=\"{\n '--row-heigth': `${config.rowHeight}px`,\n }\"\n :class=\"{ 'modify-row-height': !!config.rowHeight }\"\n @change=\"handleChange\"\n @cellClick=\"handleCellClick\"\n @resizeColumn=\"resizeColumn\"\n >\n <template #customFilterDropdown=\"{ confirm, clearFilters, column }\">\n <TableFilterDropdown\n :column=\"column\"\n :searchConfig=\"config.search_config || []\"\n v-model:searchConditions=\"searchConditions\"\n :searchType=\"search_type\"\n :confirm=\"confirm\"\n :clearFilters=\"clearFilters\"\n @search=\"handleSearch\"\n @reset=\"handleReset\"\n />\n </template>\n <template\n #customFilterIcon=\"{ filtered, column }\"\n v-if=\"config?.enable_custom_filter\"\n >\n <FilterFilled\n :style=\"{\n color:\n filtered ||\n filterConditions(searchConditions).some(s => s.field_name === column.dataIndex)\n ? '#108ee9'\n : undefined,\n }\"\n />\n </template>\n <template #bodyCell=\"{ column, index, text, record }\">\n <template v-if=\"column.dataIndex == 'index'\">\n {{ index + 1 + state.pageSize * (state.current - 1) }}\n </template>\n <component\n :is=\"'Cell_' + column.cellComponent\"\n v-else-if=\"column.cellComponent\"\n :cmpObj=\"{\n column: column ? column : {},\n index: index,\n text: text,\n dataSource: dataSource,\n record: record ? record : {},\n pageSize: state.pageSize ? state.pageSize : 500,\n current: state.current ? state.current : 1,\n eventBus: eventBus,\n tableHeightY: tableHeight,\n requestParams: config.query_params,\n auth_btn_list: auth_btn_list,\n event_obj: selfEventBus,\n }\"\n ></component>\n\n <template v-else>\n <span\n v-if=\"searchText && searchedColumn === column.dataIndex\"\n :style=\"column.color ? column.color({ column, index, text, record }) : null\"\n >\n <template\n v-for=\"(fragment, i) in text\n .toString()\n .split(new RegExp(`(?<=${searchText})|(?=${searchText})`, 'i'))\"\n >\n <mark\n v-if=\"fragment.toLowerCase() === searchText.toLowerCase()\"\n :key=\"i\"\n class=\"highlight\"\n >\n {{ fragment }}\n </mark>\n <template v-else>{{ fragment }}</template>\n </template>\n </span>\n <span\n v-else\n :style=\"column.color ? column.color({ column, index, text, record }) : null\"\n >\n {{ column.content ? column.content({ column, index, text, record }) : text }}\n </span>\n </template>\n </template>\n <template\n #summary\n v-if=\"summaryColumns.length > 0\"\n >\n <s-table-summary-row>\n <s-table-summary-cell :index=\"0\">合计</s-table-summary-cell>\n <s-table-summary-cell\n v-for=\"item in summaryColumns\"\n :key=\"item.key\"\n :columnKey=\"item.key\"\n >\n <template #default=\"vars\">\n <TableSummary\n :item=\"item\"\n :summaryParams=\"vars\"\n ></TableSummary>\n </template>\n </s-table-summary-cell>\n </s-table-summary-row>\n </template>\n <template #contextmenuPopup=\"contextmenuPopup\">\n <TableContextMenu\n :contextmenuPopup=\"contextmenuPopup\"\n :dataSource=\"dataSource\"\n :columns=\"columns\"\n :view_key=\"view_key\"\n :view_flag_name=\"config.title\"\n :is_view=\"is_view\"\n :self-event-bus=\"selfEventBus\"\n @refresh=\"refresh\"\n @export=\"handleExport\"\n @columnsChange=\"onColumnsChange\"\n ></TableContextMenu>\n </template>\n </s-table>\n </a-card>\n </div>\n <export-excel-modal-view\n v-if=\"exportOpen\"\n :column-list=\"exportExcelColumnList\"\n :columns=\"exportExcelColumn\"\n :current=\"state.current\"\n :datasource=\"dataSource\"\n :filename=\"filename\"\n :pageSize=\"state.pageSize\"\n :total=\"state.total\"\n :requestParams=\"getQueryParams()\"\n :queryData=\"config.list_url\"\n v-model:open=\"exportOpen\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { FilterFilled } from '@ant-design/icons-vue';\nimport { useResizeObserver } from '@vueuse/core';\nimport { TableProps } from 'ant-design-vue';\nimport dayjs from 'dayjs';\nimport { getApiData } from 'liyu-pc-base/api/api-model';\nimport { filterConditions } from 'liyu-pc-base/utils/function';\nimport { useFullscreen } from 'liyu-pc-base/utils/hooks/useFullscreen';\nimport { debounce, isArray, cloneDeep } from 'lodash';\nimport mitt from 'mitt';\nimport { computed, h, onMounted, onUnmounted, provide, reactive, ref, watch } from 'vue';\nimport { useRouter } from 'vue-router';\nimport Search from './search.vue';\nimport TableFilterDropdown from './TableFilterDropdown.vue';\nimport TableHeader from './tableHeader.vue';\nimport TableSummary from './TableSummary.vue';\n\nimport { useI18n } from 'vue-i18n';\nimport { useEnv, useUserStore } from 'liyu-pc-base/init-plugin';\nimport {\n Column,\n SearchConditionItem,\n Table,\n TableProState,\n ViewColumnItem,\n ViewData,\n Response,\n ViewSearchItem,\n} from './typing';\nimport { fetchViewsData, getParamsCount, tableProStateSymbol } from './utils';\nimport TableContextMenu from './TableContextMenu.vue';\nimport { useView } from './hooks/view';\nconst DEFAULT_PAGE_SIZE = 50;\nconst props = defineProps({\n config: {\n type: Object as () => Table,\n required: true,\n default: () => ({\n id: '',\n title: '',\n is_normal_model: true,\n modelType: null,\n list_url: '',\n columns: [],\n }),\n },\n eventBus: {\n type: Object,\n required: false,\n },\n initSelectValue: {\n type: Array,\n required: false,\n },\n initValueKey: {\n type: String,\n required: false,\n },\n});\ninterface Emits {\n (e: 'selectChange', selectdRecord: any[], unSelectdRecord: any[]): void;\n (e: 'dataChange', params: { data: any[]; current: number; total: number }): void;\n}\nconst emit = defineEmits<Emits>();\nconst { t } = useI18n();\nconst env = useEnv();\nconst userStore = useUserStore();\nconst userid = userStore.userid;\nconst current_org = userStore.currentOrg;\nconst VIEW_SYSTEM_EDIT = 'view_system_edit';\nconst is_auth = ref(userStore.CHECK_AUTH(VIEW_SYSTEM_EDIT));\nconst router = useRouter();\nconst dataSource = ref([]);\nconst selectedRowKeys = ref([]);\nconst loading = ref(false);\nconst selfEventBus = mitt();\nconst searchConditions = ref<SearchConditionItem[]>([]);\nlet loadDataId = null;\nconst tableWraperRef = ref(null);\nconst tableWraperHeight = ref(null);\nconst searchRef = ref(null);\nconst searchHeight = ref(null);\nconst headerHeight = ref(0);\nconst rowActionWidth = ref(30);\nconst sortedMap = ref({});\nconst sortedList = ref([]);\nconst auth_batch_update_list = ref([]);\nconst auth_head_btn_list = ref<any[]>([]);\nconst auth_btn_list = ref<any[]>([]);\nconst exportOpen = ref(false);\nconst searchText = ref('');\nconst searchedColumn = ref('');\nconst searchInput = ref();\nconst refreshType = ref(props.config.refreshType);\nconst getAuthBtn = () => {\n auth_btn_list.value = userStore.CHECK_AUTH_BY_BTN_LIST(props.config?.btn_list || []) || [];\n auth_head_btn_list.value =\n userStore.CHECK_AUTH_BY_BTN_LIST(props.config?.head_btn_list || []) || [];\n auth_batch_update_list.value =\n userStore.CHECK_AUTH_BY_BTN_LIST(props.config?.batch_update_list || []) || [];\n};\ngetAuthBtn();\nconst pageSizeOptions = ref([\n '10',\n '20',\n '50',\n '100',\n '200',\n '500',\n '1000',\n '3000',\n '10000',\n '50000',\n '60000',\n '70000',\n]);\nconst view_key = computed(() => {\n return `table_pro_${props.config.key}`;\n});\nconst state = reactive({\n current: 1,\n pageSize: props.config?.query_params?.pageSize || DEFAULT_PAGE_SIZE,\n total: 0,\n tableSize: 'small',\n});\nuseResizeObserver(tableWraperRef, entries => {\n tableWraperHeight.value = entries[0].contentRect.height;\n});\nuseResizeObserver(searchRef, entries => {\n searchHeight.value = entries[0].contentRect.height;\n});\n\nconst preserveRow = () => {\n return false;\n};\nconst getQueryParams = () => {\n const getColumnFields = (list: Column[]) => {\n const fields = [];\n list.forEach(item => {\n if (\n item.dataIndex &&\n item.dataIndex !== 'index' &&\n item.dataIndex !== 'action' &&\n item.checked !== false\n ) {\n fields.push(item.dataIndex);\n }\n if (item.children && item.children.length > 0) {\n fields.push(...getColumnFields(item.children));\n }\n });\n return fields;\n };\n const column_fields = getColumnFields(columns.value || []);\n if (props.config.base_column_fields) {\n column_fields.push(...props.config.base_column_fields);\n }\n const sort_fields = [];\n const used_fields = new Set();\n for (const item of sortedList.value) {\n if (item.order == 'descend') {\n sort_fields.push('-' + item.key);\n } else {\n sort_fields.push(item.key);\n }\n used_fields.add(item.key);\n }\n if (props.config.base_sort_fields) {\n for (const item of props.config.base_sort_fields) {\n const field_name = item.startsWith('-') ? item.slice(1) : item;\n if (!used_fields.has(field_name)) {\n sort_fields.push(item);\n }\n }\n }\n const params = {\n ...(props.config.query_params || {}),\n current: state.current,\n pageSize: state.pageSize,\n column_fields: column_fields,\n sort_fields,\n };\n if (search_type.value === 'advanced') {\n const conditions = [\n ...filterConditions(props.config.base_conditions),\n ...filterConditions(searchConditions.value),\n ];\n params['conditions'] = [conditions];\n } else if (search_type.value === 'simple') {\n for (const item of filterConditions(searchConditions.value)) {\n const v_count = getParamsCount(item.operator, item);\n let value = item.value;\n if (v_count === 1) {\n value = value[0];\n }\n params[item.field_name] = value;\n }\n }\n if (props.config.get_query_params_func) {\n const newParams = props.config.get_query_params_func({ params });\n if (newParams) {\n Object.assign(params, newParams);\n }\n }\n return params;\n};\nconst [elRef, screenState, { setFull, exitFull }] = useFullscreen();\nconst getData = async () => {\n if (!props.config.list_url) {\n return;\n }\n const currentLoadId = Symbol(); // 唯一值\n loadDataId = currentLoadId;\n try {\n loading.value = true;\n\n const params = getQueryParams();\n let response: Response;\n if (props.config.query_data_func) {\n response = await props.config.query_data_func(params);\n } else {\n response = await getApiData(params, props.config.list_url, false, {\n api_log: `tablePro ${props.config.key} ${props.config.title}`,\n });\n }\n if (loadDataId !== currentLoadId) {\n return;\n }\n if (props.config.process_data_func) {\n dataSource.value = props.config.process_data_func(response.data);\n } else {\n dataSource.value = response.data || [];\n }\n state.current = response.current;\n state.total = response.total;\n emit('dataChange', {\n data: dataSource.value,\n current: response.current,\n total: response.total,\n });\n syncSelectedRowKeys();\n } finally {\n if (loadDataId !== currentLoadId) {\n return;\n }\n loading.value = false;\n }\n};\nconst delayGetDate = debounce(getData, 500);\nconst handlePageChange = (page: any, pageSize: any) => {\n if (state.current == page && state.pageSize == pageSize) {\n return;\n }\n state.current = page ? page : 1;\n state.pageSize = pageSize ? pageSize : DEFAULT_PAGE_SIZE;\n getData();\n};\nconst search_type = computed(() => {\n if (props.config.search_type === 'simple') {\n return props.config.search_type;\n } else {\n return 'advanced';\n }\n});\nconst is_view = computed(() => {\n return props.config?.is_view !== false;\n});\nconst row_selection: any = computed(() => {\n const rowSelectionType = props.config.rowSelectionType || 'checkbox';\n const onChange = (selectedRowKeys, selectdRecord) => {\n const unSelectdRecord = dataSource.value.filter(item => {\n return !selectedRowKeys.includes(item.id);\n });\n emit('selectChange', selectdRecord, unSelectdRecord);\n };\n return { type: rowSelectionType, onChange };\n});\nconst viewColumnsConfig = ref<Record<string, ViewColumnItem>>({});\nconst viewSearchConfig = ref<Record<string, ViewSearchItem>>({});\nconst filtedColumns = computed(() => {\n const filterRecursive = (list: Column[]) => {\n return list\n .filter(item => item.checked !== false)\n .map(item => {\n if (item.children && item.children.length > 0) {\n const children = filterRecursive(item.children);\n if (children.length > 0) {\n return {\n ...item,\n children,\n };\n }\n return null;\n }\n return item;\n })\n .filter(Boolean);\n };\n return filterRecursive(columns.value);\n});\nconst columns = computed<Column[]>(() => {\n const filterValueMap = {};\n for (const item of searchConditions.value) {\n if (['in', 'eq'].includes(item.operator)) {\n filterValueMap[item.field_name] = item.value;\n }\n }\n const sorted = sortedMap.value || {};\n const baseColumns = [...(props.config.columns || [])];\n\n if (props.config.btn_list && props.config.btn_list.length > 0) {\n const hasAction = baseColumns.some(item => item.dataIndex === 'action');\n if (!hasAction) {\n baseColumns.push({\n title: '操作',\n dataIndex: 'action',\n cellComponent: 'action',\n width: rowActionWidth.value + 20,\n resizable: true,\n fixed: 'right',\n checked: true,\n });\n }\n }\n\n // 合并视图配置,递归合并\n const mergeRecursive = (list: Column[], isChildren = false) => {\n const merged = list\n .map(item => {\n const key = item.dataIndex || item.key || item.title;\n const viewCol = viewColumnsConfig.value[key] || {};\n const newItem = {\n ...item,\n ...viewCol,\n is_children: isChildren,\n key: key,\n };\n if (newItem.children && newItem.children.length > 0) {\n newItem.children = mergeRecursive(newItem.children, true);\n }\n return newItem;\n })\n .sort((a, b) => {\n const orderA = a.order ?? 999;\n const orderB = b.order ?? 999;\n return orderA - orderB;\n });\n\n return merged.map(item => {\n const key = item.dataIndex || item.key || item.title;\n if (item.autoWidth) {\n return {\n ...item,\n minWidth: item.width,\n width: undefined,\n filteredValue: filterValueMap[key] || null,\n sortOrder: sorted[key] || false,\n key: key,\n customFilterDropdown:\n props.config.enable_custom_filter &&\n !!props.config.search_config?.find(s => s.field_name === key),\n onFilterDropdownOpenChange: open => {\n if (open) {\n setTimeout(() => {\n searchInput.value?.focus();\n }, 100);\n }\n },\n };\n } else {\n return {\n ...item,\n width: item.width,\n minWidth: undefined,\n filteredValue: filterValueMap[key] || null,\n sortOrder: sorted[key] || false,\n key: key,\n customFilterDropdown:\n props.config.enable_custom_filter &&\n !!props.config.search_config?.find(s => s.field_name === key),\n onFilterDropdownOpenChange: open => {\n if (open) {\n setTimeout(() => {\n searchInput.value?.focus();\n }, 100);\n }\n },\n };\n }\n });\n };\n\n const res = mergeRecursive(baseColumns);\n // 序号列处理\n const hasIndex = res.some(item => item.dataIndex === 'index');\n if (!hasIndex && !props.config.hide_index_column) {\n res.unshift({\n title: '#',\n dataIndex: 'index',\n key: 'index',\n maxWidth: 50,\n fixed: 'left',\n checked: true,\n autoHeight: true,\n });\n }\n return res;\n});\nconst tableContentWidth = computed(() => {\n let width = 0;\n const processColumns = datas => {\n for (const item of datas) {\n if (item.children && item.children.length > 0) {\n processColumns(item.children);\n } else {\n width += item.width || item.minWidth || 120;\n }\n }\n };\n processColumns(columns.value);\n});\nconst filename = computed(() => {\n const title = props.config.title || 'data';\n const datetime = dayjs().format('YYYYMMDD_HHmmss');\n return `${title}_${datetime}`;\n});\nconst exportExcelColumnList = computed(() => {\n const list: any = [];\n const getLeaves = (cols: Column[]) => {\n cols.forEach(item => {\n if (item.children && item.children.length > 0) {\n getLeaves(item.children);\n } else {\n if (item.dataIndex === 'action' || item.dataIndex === 'index') {\n return;\n }\n list.push({\n checked: item.checked,\n fixed: item.fixed ? item.fixed : false,\n key: item.dataIndex,\n label: item.title,\n width: item.width,\n });\n }\n });\n };\n getLeaves(columns.value);\n return list;\n});\nconst exportExcelColumn = computed(() => {\n const list: any = [];\n const getLeaves = (cols: Column[]) => {\n cols.forEach(item => {\n if (item.children && item.children.length > 0) {\n getLeaves(item.children);\n } else {\n if (item.dataIndex === 'action' || item.dataIndex === 'index') {\n return;\n }\n list.push(item);\n }\n });\n };\n getLeaves(columns.value);\n return list;\n});\nconst handleSearch = ({ confirm, dataIndex, value }) => {\n confirm();\n searchText.value = value;\n searchedColumn.value = dataIndex;\n getData();\n isViewChange.value = true;\n};\n\nconst handleReset = ({ clearFilters, dataIndex }) => {\n clearFilters();\n searchText.value = '';\n const conditions = cloneDeep(searchConditions.value);\n const conditionIndex = conditions.findIndex(item => item.field_name === dataIndex);\n if (conditionIndex > -1) {\n conditions.splice(conditionIndex, 1);\n }\n searchConditions.value = conditions;\n getData();\n isViewChange.value = true;\n};\n\nconst refresh = async () => {\n await getData();\n};\nconst handleRefreshTypeChange = type => {\n refreshType.value = type;\n isViewChange.value = true;\n};\nconst paginationHeight = ref(64);\nconst tableHeight = computed(() => {\n if (!tableWraperHeight.value) {\n return 0;\n }\n let value = tableWraperHeight.value - searchHeight.value - headerHeight.value - 4;\n if (props.config.is_pagination) {\n value -= paginationHeight.value;\n }\n console.log('tableWraperHeight', tableWraperHeight.value);\n console.log('searchHeight', searchHeight.value);\n console.log('headerHeight', headerHeight.value);\n console.log('paginationHeight', paginationHeight.value);\n console.log('tableHeight', value);\n return value;\n});\nconst handleTableSizeChange = () => {\n isViewChange.value = true;\n};\nwatch(\n () => state.tableSize,\n () => {\n // 此处设置paginationHeight两次,为了解决切换表格密度后,高度剧烈变化问题。\n paginationHeight.value = 64;\n setTimeout(() => {\n if (state.tableSize === 'small') {\n paginationHeight.value = 56;\n } else if (state.tableSize === 'middle') {\n paginationHeight.value = 56;\n } else if (state.tableSize === 'default') {\n paginationHeight.value = 64;\n }\n }, 200);\n },\n);\nconst syncSelectedRowKeys = () => {\n if (dataSource.value?.length > 0 && props.initValueKey) {\n const valueMap = {};\n selectedRowKeys.value = dataSource.value\n .filter(item => {\n const value = item[props.initValueKey];\n if (props.initSelectValue?.includes(value) && !valueMap[value]) {\n valueMap[value] = true;\n return true;\n }\n })\n .map(item => {\n return item.id;\n });\n }\n};\nconst init = async () => {\n const defaultSortField = props.config.columns.filter(\n column => column.sorter && column.defaultSortOrder,\n );\n defaultSortField.sort((a, b) => (a.defaultSortIndex || 0) - (b.defaultSortIndex || 0));\n for (const column of defaultSortField) {\n sortedMap.value[column.dataIndex] = column.defaultSortOrder;\n sortedList.value.push({ key: column.dataIndex, order: column.defaultSortOrder });\n }\n const tmpSearchConditions = [];\n if (props.config?.search_config) {\n props.config.search_config.forEach(configItem => {\n if (configItem.default_value) {\n let value = configItem.default_value;\n if (!isArray(value)) {\n value = [value];\n }\n tmpSearchConditions.push({\n field_name: configItem.field_name,\n value: value,\n operator: configItem.default_operator || 'eq',\n format: configItem.format || 'input',\n class_name: configItem.class_name || 'str',\n });\n }\n });\n }\n searchConditions.value = tmpSearchConditions;\n if (is_view && currentView.value?.id !== 'no-view') {\n await fetchViews();\n if (viewDataList.value?.length) {\n const tmpData = [...viewDataList.value];\n // 优先级:当前选中视图,默认视图,用户视图,同级按 sort 正序\n const getSortValue = item => {\n let value = item.sort || 0;\n if (item.id !== currentView.value?.id) {\n value *= 1000000;\n }\n if (!item.is_default) {\n value *= 10000;\n }\n if (!item.user_id) {\n value *= 1000;\n }\n return value;\n };\n tmpData.sort((a, b) => getSortValue(a) - getSortValue(b));\n setViewData(tmpData[0].data);\n currentView.value = tmpData[0];\n }\n }\n await getData();\n};\nconst eventReinit = async () => {\n init();\n};\nconst eventReload = async () => {\n await getData();\n};\nconst flattenedColumns = computed(() => {\n const list = [];\n const getLeaves = (cols: Column[]) => {\n cols.forEach(col => {\n if (col.children && col.children.length > 0) {\n getLeaves(col.children);\n } else {\n list.push(col);\n }\n });\n };\n getLeaves(filtedColumns.value);\n return list;\n});\nconst summaryColumns = computed(() => {\n const list = [];\n let index = 0;\n for (const item of flattenedColumns.value) {\n let _index = index;\n if (props.config?.is_selection) {\n _index = index + 1;\n }\n if (item.summary) {\n // if (!props.config.is_selection && props.config.hide_index_column) {\n // console.error('未开启选择(is_selection)且隐藏了序号列(hide_index_column),无法展示\"合计\"');\n // return [];\n // }\n list.push({\n index: _index,\n key: item.key,\n cellSummaryComponent: item.cellSummaryComponent,\n total_content: item.total_content,\n });\n }\n index++;\n }\n return list;\n});\nconst handleChange: TableProps['onChange'] = (pagination, filters, sorter, action) => {\n if (action.action === 'paginate') {\n return;\n } else if (action.action === 'filter') {\n const searchMap = {};\n for (const item of searchConditions.value) {\n searchMap[item.field_name] = item;\n }\n for (const key of Object.keys(filters)) {\n const value = filters[key];\n const item = searchMap[key];\n if (item) {\n if (value?.length > 1) {\n item.operator = 'in';\n } else {\n if (!['in', 'eq'].includes(item.operator)) {\n item.operator = 'in';\n }\n }\n item.value = value;\n } else {\n searchMap[key] = {\n field_name: key,\n operator: 'eq',\n value: value,\n format: 'input',\n class_name: 'str',\n };\n }\n }\n searchConditions.value = Object.values(searchMap);\n getData();\n isViewChange.value = true;\n } else if (action.action === 'sort') {\n const tmpMap = {};\n const tmpList = [];\n if (!isArray(sorter)) {\n tmpMap[sorter.columnKey] = sorter.order;\n tmpList.push({ key: sorter.columnKey, order: sorter.order });\n } else {\n for (const item of sorter) {\n tmpMap[item.columnKey] = item.order;\n tmpList.push({ key: item.columnKey, order: item.order });\n }\n }\n sortedMap.value = tmpMap;\n sortedList.value = tmpList;\n getData();\n isViewChange.value = true;\n }\n};\nconst handleCellClick = (e, cell) => {\n if (!props.config?.is_click_selection) {\n return;\n }\n const rowSelectionType = props.config.rowSelectionType || 'checkbox';\n if (rowSelectionType === 'radio') {\n selectedRowKeys.value = [cell.record.id];\n } else {\n const isSelected = selectedRowKeys.value && selectedRowKeys.value.includes(cell.record.id);\n if (isSelected) {\n selectedRowKeys.value = selectedRowKeys.value.filter(id => {\n return id !== cell.record.id;\n });\n } else {\n selectedRowKeys.value.push(cell.record.id);\n }\n }\n\n const selectdRecord = dataSource.value.filter(item => {\n return selectedRowKeys.value.includes(item.id);\n });\n const unSelectdRecord = dataSource.value.filter(item => {\n return !selectedRowKeys.value.includes(item.id);\n });\n emit('selectChange', selectdRecord, unSelectdRecord);\n};\n\nonMounted(async () => {\n if (!props.config.key) {\n console.error('tablePro config 未配置 key');\n }\n if (!props.config.title) {\n console.error('tablePro config 未配置 title');\n }\n selfEventBus.on('refresh', refresh);\n selfEventBus.on('reinit', eventReinit);\n selfEventBus.on('saveView', saveView);\n selfEventBus.on('saveNewView', addView);\n if (props.eventBus) {\n props.eventBus.on('reinit', eventReinit);\n props.eventBus.on('reload_table', eventReload);\n }\n if (props.config.tableSize) {\n state.tableSize = props.config.tableSize;\n }\n await init();\n});\nconst handleExport = () => {\n exportOpen.value = true;\n};\nconst onColumnsChange = (data: any[]) => {\n if (!props.config || !props.config.columns) return;\n const configObj: Record<string, any> = {};\n\n const processRecursive = (list: any[]) => {\n list.forEach((item, index) => {\n const dataIndex = item.dataIndex || item.key || item.title;\n if (dataIndex === 'index' || dataIndex === 'action') return;\n configObj[dataIndex] = {\n checked: item.checked,\n fixed: item.fixed,\n autoHeight: item.autoHeight,\n autoWidth: item.autoWidth,\n ellipsis: item.ellipsis,\n width: item.width,\n order: index,\n };\n if (item.children && item.children.length > 0) {\n processRecursive(item.children);\n }\n });\n };\n\n processRecursive(data);\n viewColumnsConfig.value = configObj;\n isViewChange.value = true;\n};\nconst setViewData = async (viewData: ViewData) => {\n if (viewData === null) {\n await init();\n isViewChange.value = false;\n return;\n }\n if (viewData.columns) {\n viewColumnsConfig.value = viewData.columns;\n }\n if (viewData.searchConfig) {\n viewSearchConfig.value = viewData.searchConfig;\n }\n if (viewData.searchConditions) {\n searchConditions.value = viewData.searchConditions;\n }\n if (viewData.tableSize) {\n state.tableSize = viewData.tableSize;\n }\n if (viewData.refreshType) {\n refreshType.value = viewData.refreshType;\n }\n if (viewData.sortedList) {\n sortedList.value = viewData.sortedList;\n sortedMap.value = {};\n for (const item of sortedList.value) {\n sortedMap.value[item.key] = item.order;\n }\n }\n if (props.config.set_view_callback) {\n props.config.set_view_callback({ viewData });\n }\n await refresh();\n isViewChange.value = false;\n};\nconst resizeColumn = (width, column, action: 'start' | 'move' | 'end') => {\n if (action === 'end') {\n let item = viewColumnsConfig.value[column.dataIndex];\n if (!item) {\n item = {};\n viewColumnsConfig.value[column.dataIndex] = item;\n }\n item.width = width;\n isViewChange.value = true;\n }\n};\nconst viewSearchConfigChange = (config: Record<string, ViewSearchItem>) => {\n viewSearchConfig.value = config;\n isViewChange.value = true;\n};\nconst getViewData = (): ViewData => {\n const viewData = {\n columns: viewColumnsConfig.value,\n searchConditions: searchConditions.value,\n tableSize: state.tableSize,\n refreshType: refreshType.value,\n searchConfig: viewSearchConfig.value,\n sortedList: sortedList.value,\n };\n if (props.config.get_view_data_func) {\n const newViewData = props.config.get_view_data_func({ viewData });\n if (newViewData) {\n Object.assign(viewData, newViewData);\n }\n }\n return viewData;\n};\nconst viewDataList = ref([]);\nconst currentView = ref<any>(null);\nconst isViewChange = ref(false);\nconst fetchViews = async () => {\n const data = await fetchViewsData(view_key.value);\n viewDataList.value = data;\n};\nconst handleSearchChange = () => {\n isViewChange.value = true;\n};\nconst { saveView, addView } = useView({\n currentView,\n getViewData,\n isViewChange,\n userid,\n view_project__flag: env.VITE_APP_VIEW_PROJECT_FLAG,\n view_menu__flag: view_key.value,\n view_menu__name: props.config.title,\n fetchViews,\n is_auth,\n t,\n});\n\nprovide<TableProState>(tableProStateSymbol, {\n setViewData,\n getViewData,\n fetchViews,\n viewDataList,\n currentView,\n isViewChange,\n config: props.config,\n});\n\nonUnmounted(() => {\n selfEventBus.off('refresh', refresh);\n selfEventBus.off('reinit', eventReinit);\n selfEventBus.off('saveView', saveView);\n selfEventBus.off('saveNewView', addView);\n if (props.eventBus) {\n props.eventBus.off('reinit', eventReinit);\n props.eventBus.off('reload_table', eventReload);\n }\n});\nwatch(\n () => props.initSelectValue,\n () => {\n syncSelectedRowKeys();\n },\n);\nwatch(\n () => props.config.query_params,\n () => {\n delayGetDate();\n },\n {\n deep: true,\n },\n);\nwatch(\n () => props.config.base_conditions,\n () => {\n delayGetDate();\n },\n {\n deep: true,\n },\n);\n\ndefineExpose({\n getViewData,\n setViewData,\n config: props.config,\n columns,\n fetchViews,\n viewDataList,\n currentView,\n isViewChange,\n viewColumnsConfig,\n refresh,\n});\n</script>\n<style lang=\"less\" scoped>\n.btn-wraper {\n display: flex;\n justify-content: flex-end;\n}\n.table-wraper {\n height: 100%;\n overflow: hidden;\n}\n.modify-row-height {\n :deep(.surely-table-header) {\n height: var(--row-heigth) !important;\n }\n :deep(.surely-table-header-cell) {\n height: var(--row-heigth) !important;\n }\n :deep(.surely-table-summary) {\n height: var(--row-heigth) !important;\n }\n}\n.popup-divider {\n :deep(.ant-divider-horizontal) {\n margin-top: 1px;\n margin-bottom: 1px;\n }\n}\n.highlight {\n background-color: rgb(255, 192, 105);\n padding: 0px;\n}\n</style>\n","<template>\n <div\n class=\"table-wraper\"\n ref=\"tableWraperRef\"\n >\n <div ref=\"searchRef\">\n <Search\n v-if=\"config?.search_config && config.search_config.length > 0\"\n :searchConfig=\"config?.search_config || []\"\n :autoRefreshOnSearchChange=\"config?.auto_refresh_on_search_change\"\n v-model:searchConditions=\"searchConditions\"\n :event-bus=\"selfEventBus\"\n :searchType=\"search_type\"\n :searchDisplayType=\"config?.search_display_type\"\n :searchColumnCount=\"config?.search_column_count\"\n :viewSearchConfig=\"viewSearchConfig\"\n @viewSearchConfigChange=\"viewSearchConfigChange\"\n @change=\"handleSearchChange\"\n ></Search>\n </div>\n <a-card\n ref=\"elRef\"\n :body-style=\"{ padding: 0 }\"\n >\n <TableHeader\n :config=\"config\"\n :auth_batch_update_list=\"auth_batch_update_list\"\n :auth_head_btn_list=\"auth_head_btn_list\"\n :selectedRowKeys=\"selectedRowKeys\"\n :dataSource=\"dataSource\"\n :current_org=\"current_org\"\n :router=\"router\"\n :selfEventBus=\"selfEventBus\"\n :loading=\"loading\"\n :screenState=\"screenState\"\n v-model:tableSize=\"state.tableSize\"\n :columns=\"columns\"\n :view_key=\"view_key\"\n :view_flag_name=\"config.title\"\n :is_view=\"is_view\"\n :refreshType=\"refreshType\"\n @refresh=\"refresh\"\n @export=\"handleExport\"\n @setFull=\"setFull\"\n @exitFull=\"exitFull\"\n @columnsChange=\"onColumnsChange\"\n @heightChange=\"h => (headerHeight = h)\"\n @refreshTypeChange=\"handleRefreshTypeChange\"\n @tableSizeChange=\"handleTableSizeChange\"\n >\n <template #header_bar_before_btn>\n <slot name=\"header_bar_before_btn\"></slot>\n </template>\n <template #header_bar_after_btn>\n <slot name=\"header_bar_after_btn\"></slot>\n </template>\n </TableHeader>\n <s-table\n v-if=\"columns?.length > 0\"\n :columns=\"filtedColumns\"\n v-model:selectedRowKeys=\"selectedRowKeys\"\n :data-source=\"dataSource\"\n :bordered=\"true\"\n :size=\"state.tableSize\"\n :height=\"tableHeight\"\n :rowHeight=\"config.rowHeight || undefined\"\n :scroll=\"{\n x: tableContentWidth,\n }\"\n :loading=\"loading && !config?.disabled_table_loading\"\n :pagination=\"\n config?.is_pagination\n ? {\n current: state.current,\n pageSize: state.pageSize,\n total: state.total,\n onChange: handlePageChange,\n showSizeChanger: true,\n pageSizeOptions: pageSizeOptions,\n }\n : false\n \"\n :rowKey=\"'id'\"\n :rowSelection=\"config?.is_selection ? row_selection : null\"\n :custom-cell=\"config?.customCell\"\n :custom-header-cell=\"config?.customHeaderCell\"\n :virtual=\"true\"\n sticky\n summary-fixed\n :preserveRow=\"preserveRow\"\n :style=\"{\n '--row-heigth': `${config.rowHeight}px`,\n }\"\n :class=\"{ 'modify-row-height': !!config.rowHeight }\"\n @change=\"handleChange\"\n @cellClick=\"handleCellClick\"\n @resizeColumn=\"resizeColumn\"\n >\n <template #customFilterDropdown=\"{ confirm, clearFilters, column }\">\n <TableFilterDropdown\n :column=\"column\"\n :searchConfig=\"config.search_config || []\"\n v-model:searchConditions=\"searchConditions\"\n :searchType=\"search_type\"\n :confirm=\"confirm\"\n :clearFilters=\"clearFilters\"\n @search=\"handleSearch\"\n @reset=\"handleReset\"\n />\n </template>\n <template\n #customFilterIcon=\"{ filtered, column }\"\n v-if=\"config?.enable_custom_filter\"\n >\n <FilterFilled\n :style=\"{\n color:\n filtered ||\n filterConditions(searchConditions).some(s => s.field_name === column.dataIndex)\n ? '#108ee9'\n : undefined,\n }\"\n />\n </template>\n <template #bodyCell=\"{ column, index, text, record }\">\n <template v-if=\"column.dataIndex == 'index'\">\n {{ index + 1 + state.pageSize * (state.current - 1) }}\n </template>\n <component\n :is=\"'Cell_' + column.cellComponent\"\n v-else-if=\"column.cellComponent\"\n :cmpObj=\"{\n column: column ? column : {},\n index: index,\n text: text,\n dataSource: dataSource,\n record: record ? record : {},\n pageSize: state.pageSize ? state.pageSize : 500,\n current: state.current ? state.current : 1,\n eventBus: eventBus,\n tableHeightY: tableHeight,\n requestParams: config.query_params,\n auth_btn_list: auth_btn_list,\n event_obj: selfEventBus,\n }\"\n ></component>\n\n <template v-else>\n <span\n v-if=\"searchText && searchedColumn === column.dataIndex\"\n :style=\"column.color ? column.color({ column, index, text, record }) : null\"\n >\n <template\n v-for=\"(fragment, i) in text\n .toString()\n .split(new RegExp(`(?<=${searchText})|(?=${searchText})`, 'i'))\"\n >\n <mark\n v-if=\"fragment.toLowerCase() === searchText.toLowerCase()\"\n :key=\"i\"\n class=\"highlight\"\n >\n {{ fragment }}\n </mark>\n <template v-else>{{ fragment }}</template>\n </template>\n </span>\n <span\n v-else\n :style=\"column.color ? column.color({ column, index, text, record }) : null\"\n >\n {{ column.content ? column.content({ column, index, text, record }) : text }}\n </span>\n </template>\n </template>\n <template\n #summary\n v-if=\"summaryColumns.length > 0\"\n >\n <s-table-summary-row>\n <s-table-summary-cell :index=\"0\">合计</s-table-summary-cell>\n <s-table-summary-cell\n v-for=\"item in summaryColumns\"\n :key=\"item.key\"\n :columnKey=\"item.key\"\n >\n <template #default=\"vars\">\n <TableSummary\n :item=\"item\"\n :summaryParams=\"vars\"\n ></TableSummary>\n </template>\n </s-table-summary-cell>\n </s-table-summary-row>\n </template>\n <template #contextmenuPopup=\"contextmenuPopup\">\n <TableContextMenu\n :contextmenuPopup=\"contextmenuPopup\"\n :dataSource=\"dataSource\"\n :columns=\"columns\"\n :view_key=\"view_key\"\n :view_flag_name=\"config.title\"\n :is_view=\"is_view\"\n :self-event-bus=\"selfEventBus\"\n @refresh=\"refresh\"\n @export=\"handleExport\"\n @columnsChange=\"onColumnsChange\"\n ></TableContextMenu>\n </template>\n </s-table>\n </a-card>\n </div>\n <export-excel-modal-view\n v-if=\"exportOpen\"\n :column-list=\"exportExcelColumnList\"\n :columns=\"exportExcelColumn\"\n :current=\"state.current\"\n :datasource=\"dataSource\"\n :filename=\"filename\"\n :pageSize=\"state.pageSize\"\n :total=\"state.total\"\n :requestParams=\"getQueryParams()\"\n :queryData=\"config.list_url\"\n v-model:open=\"exportOpen\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { FilterFilled } from '@ant-design/icons-vue';\nimport { useResizeObserver } from '@vueuse/core';\nimport { TableProps } from 'ant-design-vue';\nimport dayjs from 'dayjs';\nimport { getApiData } from 'liyu-pc-base/api/api-model';\nimport { filterConditions } from 'liyu-pc-base/utils/function';\nimport { useFullscreen } from 'liyu-pc-base/utils/hooks/useFullscreen';\nimport { debounce, isArray, cloneDeep } from 'lodash';\nimport mitt from 'mitt';\nimport { computed, h, onMounted, onUnmounted, provide, reactive, ref, watch } from 'vue';\nimport { useRouter } from 'vue-router';\nimport Search from './search.vue';\nimport TableFilterDropdown from './TableFilterDropdown.vue';\nimport TableHeader from './tableHeader.vue';\nimport TableSummary from './TableSummary.vue';\n\nimport { useI18n } from 'vue-i18n';\nimport { useEnv, useUserStore } from 'liyu-pc-base/init-plugin';\nimport {\n Column,\n SearchConditionItem,\n Table,\n TableProState,\n ViewColumnItem,\n ViewData,\n Response,\n ViewSearchItem,\n} from './typing';\nimport { fetchViewsData, getParamsCount, tableProStateSymbol } from './utils';\nimport TableContextMenu from './TableContextMenu.vue';\nimport { useView } from './hooks/view';\nconst DEFAULT_PAGE_SIZE = 50;\nconst props = defineProps({\n config: {\n type: Object as () => Table,\n required: true,\n default: () => ({\n id: '',\n title: '',\n is_normal_model: true,\n modelType: null,\n list_url: '',\n columns: [],\n }),\n },\n eventBus: {\n type: Object,\n required: false,\n },\n initSelectValue: {\n type: Array,\n required: false,\n },\n initValueKey: {\n type: String,\n required: false,\n },\n});\ninterface Emits {\n (e: 'selectChange', selectdRecord: any[], unSelectdRecord: any[]): void;\n (e: 'dataChange', params: { data: any[]; current: number; total: number }): void;\n}\nconst emit = defineEmits<Emits>();\nconst { t } = useI18n();\nconst env = useEnv();\nconst userStore = useUserStore();\nconst userid = userStore.userid;\nconst current_org = userStore.currentOrg;\nconst VIEW_SYSTEM_EDIT = 'view_system_edit';\nconst is_auth = ref(userStore.CHECK_AUTH(VIEW_SYSTEM_EDIT));\nconst router = useRouter();\nconst dataSource = ref([]);\nconst selectedRowKeys = ref([]);\nconst loading = ref(false);\nconst selfEventBus = mitt();\nconst searchConditions = ref<SearchConditionItem[]>([]);\nlet loadDataId = null;\nconst tableWraperRef = ref(null);\nconst tableWraperHeight = ref(null);\nconst searchRef = ref(null);\nconst searchHeight = ref(null);\nconst headerHeight = ref(0);\nconst rowActionWidth = ref(30);\nconst sortedMap = ref({});\nconst sortedList = ref([]);\nconst auth_batch_update_list = ref([]);\nconst auth_head_btn_list = ref<any[]>([]);\nconst auth_btn_list = ref<any[]>([]);\nconst exportOpen = ref(false);\nconst searchText = ref('');\nconst searchedColumn = ref('');\nconst searchInput = ref();\nconst refreshType = ref(props.config.refreshType);\nconst getAuthBtn = () => {\n auth_btn_list.value = userStore.CHECK_AUTH_BY_BTN_LIST(props.config?.btn_list || []) || [];\n auth_head_btn_list.value =\n userStore.CHECK_AUTH_BY_BTN_LIST(props.config?.head_btn_list || []) || [];\n auth_batch_update_list.value =\n userStore.CHECK_AUTH_BY_BTN_LIST(props.config?.batch_update_list || []) || [];\n};\ngetAuthBtn();\nconst pageSizeOptions = ref([\n '10',\n '20',\n '50',\n '100',\n '200',\n '500',\n '1000',\n '3000',\n '10000',\n '50000',\n '60000',\n '70000',\n]);\nconst view_key = computed(() => {\n return `table_pro_${props.config.key}`;\n});\nconst state = reactive({\n current: 1,\n pageSize: props.config?.query_params?.pageSize || DEFAULT_PAGE_SIZE,\n total: 0,\n tableSize: 'small',\n});\nuseResizeObserver(tableWraperRef, entries => {\n tableWraperHeight.value = entries[0].contentRect.height;\n});\nuseResizeObserver(searchRef, entries => {\n searchHeight.value = entries[0].contentRect.height;\n});\n\nconst preserveRow = () => {\n return false;\n};\nconst getQueryParams = () => {\n const getColumnFields = (list: Column[]) => {\n const fields = [];\n list.forEach(item => {\n if (\n item.dataIndex &&\n item.dataIndex !== 'index' &&\n item.dataIndex !== 'action' &&\n item.checked !== false\n ) {\n fields.push(item.dataIndex);\n }\n if (item.children && item.children.length > 0) {\n fields.push(...getColumnFields(item.children));\n }\n });\n return fields;\n };\n const column_fields = getColumnFields(columns.value || []);\n if (props.config.base_column_fields) {\n column_fields.push(...props.config.base_column_fields);\n }\n const sort_fields = [];\n const used_fields = new Set();\n for (const item of sortedList.value) {\n if (item.order == 'descend') {\n sort_fields.push('-' + item.key);\n } else {\n sort_fields.push(item.key);\n }\n used_fields.add(item.key);\n }\n if (props.config.base_sort_fields) {\n for (const item of props.config.base_sort_fields) {\n const field_name = item.startsWith('-') ? item.slice(1) : item;\n if (!used_fields.has(field_name)) {\n sort_fields.push(item);\n }\n }\n }\n const params = {\n ...(props.config.query_params || {}),\n current: state.current,\n pageSize: state.pageSize,\n column_fields: column_fields,\n sort_fields,\n };\n if (search_type.value === 'advanced') {\n const conditions = [\n ...filterConditions(props.config.base_conditions),\n ...filterConditions(searchConditions.value),\n ];\n params['conditions'] = [conditions];\n } else if (search_type.value === 'simple') {\n for (const item of filterConditions(searchConditions.value)) {\n const v_count = getParamsCount(item.operator, item);\n let value = item.value;\n if (v_count === 1) {\n value = value[0];\n }\n params[item.field_name] = value;\n }\n }\n if (props.config.get_query_params_func) {\n const newParams = props.config.get_query_params_func({ params });\n if (newParams) {\n Object.assign(params, newParams);\n }\n }\n return params;\n};\nconst [elRef, screenState, { setFull, exitFull }] = useFullscreen();\nconst getData = async () => {\n if (!props.config.list_url) {\n return;\n }\n const currentLoadId = Symbol(); // 唯一值\n loadDataId = currentLoadId;\n try {\n loading.value = true;\n\n const params = getQueryParams();\n let response: Response;\n if (props.config.query_data_func) {\n response = await props.config.query_data_func(params);\n } else {\n response = await getApiData(params, props.config.list_url, false, {\n api_log: `tablePro ${props.config.key} ${props.config.title}`,\n });\n }\n if (loadDataId !== currentLoadId) {\n return;\n }\n if (props.config.process_data_func) {\n dataSource.value = props.config.process_data_func(response.data);\n } else {\n dataSource.value = response.data || [];\n }\n state.current = response.current;\n state.total = response.total;\n emit('dataChange', {\n data: dataSource.value,\n current: response.current,\n total: response.total,\n });\n syncSelectedRowKeys();\n } finally {\n if (loadDataId !== currentLoadId) {\n return;\n }\n loading.value = false;\n }\n};\nconst delayGetDate = debounce(getData, 500);\nconst handlePageChange = (page: any, pageSize: any) => {\n if (state.current == page && state.pageSize == pageSize) {\n return;\n }\n state.current = page ? page : 1;\n state.pageSize = pageSize ? pageSize : DEFAULT_PAGE_SIZE;\n getData();\n};\nconst search_type = computed(() => {\n if (props.config.search_type === 'simple') {\n return props.config.search_type;\n } else {\n return 'advanced';\n }\n});\nconst is_view = computed(() => {\n return props.config?.is_view !== false;\n});\nconst row_selection: any = computed(() => {\n const rowSelectionType = props.config.rowSelectionType || 'checkbox';\n const onChange = (selectedRowKeys, selectdRecord) => {\n const unSelectdRecord = dataSource.value.filter(item => {\n return !selectedRowKeys.includes(item.id);\n });\n emit('selectChange', selectdRecord, unSelectdRecord);\n };\n return { type: rowSelectionType, onChange };\n});\nconst viewColumnsConfig = ref<Record<string, ViewColumnItem>>({});\nconst viewSearchConfig = ref<Record<string, ViewSearchItem>>({});\nconst filtedColumns = computed(() => {\n const filterRecursive = (list: Column[]) => {\n return list\n .filter(item => item.checked !== false)\n .map(item => {\n if (item.children && item.children.length > 0) {\n const children = filterRecursive(item.children);\n if (children.length > 0) {\n return {\n ...item,\n children,\n };\n }\n return null;\n }\n return item;\n })\n .filter(Boolean);\n };\n return filterRecursive(columns.value);\n});\nconst columns = computed<Column[]>(() => {\n const filterValueMap = {};\n for (const item of searchConditions.value) {\n if (['in', 'eq'].includes(item.operator)) {\n filterValueMap[item.field_name] = item.value;\n }\n }\n const sorted = sortedMap.value || {};\n const baseColumns = [...(props.config.columns || [])];\n\n if (props.config.btn_list && props.config.btn_list.length > 0) {\n const hasAction = baseColumns.some(item => item.dataIndex === 'action');\n if (!hasAction) {\n baseColumns.push({\n title: '操作',\n dataIndex: 'action',\n cellComponent: 'action',\n width: rowActionWidth.value + 20,\n resizable: true,\n fixed: 'right',\n checked: true,\n });\n }\n }\n\n // 合并视图配置,递归合并\n const mergeRecursive = (list: Column[], isChildren = false) => {\n const merged = list\n .map(item => {\n const key = item.dataIndex || item.key || item.title;\n const viewCol = viewColumnsConfig.value[key] || {};\n const newItem = {\n ...item,\n ...viewCol,\n is_children: isChildren,\n key: key,\n };\n if (newItem.children && newItem.children.length > 0) {\n newItem.children = mergeRecursive(newItem.children, true);\n }\n return newItem;\n })\n .sort((a, b) => {\n const orderA = a.order ?? 999;\n const orderB = b.order ?? 999;\n return orderA - orderB;\n });\n\n return merged.map(item => {\n const key = item.dataIndex || item.key || item.title;\n if (item.autoWidth) {\n return {\n ...item,\n minWidth: item.width,\n width: undefined,\n filteredValue: filterValueMap[key] || null,\n sortOrder: sorted[key] || false,\n key: key,\n customFilterDropdown:\n props.config.enable_custom_filter &&\n !!props.config.search_config?.find(s => s.field_name === key),\n onFilterDropdownOpenChange: open => {\n if (open) {\n setTimeout(() => {\n searchInput.value?.focus();\n }, 100);\n }\n },\n };\n } else {\n return {\n ...item,\n width: item.width,\n minWidth: undefined,\n filteredValue: filterValueMap[key] || null,\n sortOrder: sorted[key] || false,\n key: key,\n customFilterDropdown:\n props.config.enable_custom_filter &&\n !!props.config.search_config?.find(s => s.field_name === key),\n onFilterDropdownOpenChange: open => {\n if (open) {\n setTimeout(() => {\n searchInput.value?.focus();\n }, 100);\n }\n },\n };\n }\n });\n };\n\n const res = mergeRecursive(baseColumns);\n // 序号列处理\n const hasIndex = res.some(item => item.dataIndex === 'index');\n if (!hasIndex && !props.config.hide_index_column) {\n res.unshift({\n title: '#',\n dataIndex: 'index',\n key: 'index',\n maxWidth: 50,\n fixed: 'left',\n checked: true,\n autoHeight: true,\n });\n }\n return res;\n});\nconst tableContentWidth = computed(() => {\n let width = 0;\n const processColumns = datas => {\n for (const item of datas) {\n if (item.children && item.children.length > 0) {\n processColumns(item.children);\n } else {\n width += item.width || item.minWidth || 120;\n }\n }\n };\n processColumns(columns.value);\n});\nconst filename = computed(() => {\n const title = props.config.title || 'data';\n const datetime = dayjs().format('YYYYMMDD_HHmmss');\n return `${title}_${datetime}`;\n});\nconst exportExcelColumnList = computed(() => {\n const list: any = [];\n const getLeaves = (cols: Column[]) => {\n cols.forEach(item => {\n if (item.children && item.children.length > 0) {\n getLeaves(item.children);\n } else {\n if (item.dataIndex === 'action' || item.dataIndex === 'index') {\n return;\n }\n list.push({\n checked: item.checked,\n fixed: item.fixed ? item.fixed : false,\n key: item.dataIndex,\n label: item.title,\n width: item.width,\n });\n }\n });\n };\n getLeaves(columns.value);\n return list;\n});\nconst exportExcelColumn = computed(() => {\n const list: any = [];\n const getLeaves = (cols: Column[]) => {\n cols.forEach(item => {\n if (item.children && item.children.length > 0) {\n getLeaves(item.children);\n } else {\n if (item.dataIndex === 'action' || item.dataIndex === 'index') {\n return;\n }\n list.push(item);\n }\n });\n };\n getLeaves(columns.value);\n return list;\n});\nconst handleSearch = ({ confirm, dataIndex, value }) => {\n confirm();\n searchText.value = value;\n searchedColumn.value = dataIndex;\n getData();\n isViewChange.value = true;\n};\n\nconst handleReset = ({ clearFilters, dataIndex }) => {\n clearFilters();\n searchText.value = '';\n const conditions = cloneDeep(searchConditions.value);\n const conditionIndex = conditions.findIndex(item => item.field_name === dataIndex);\n if (conditionIndex > -1) {\n conditions.splice(conditionIndex, 1);\n }\n searchConditions.value = conditions;\n getData();\n isViewChange.value = true;\n};\n\nconst refresh = async () => {\n await getData();\n};\nconst handleRefreshTypeChange = type => {\n refreshType.value = type;\n isViewChange.value = true;\n};\nconst paginationHeight = ref(64);\nconst tableHeight = computed(() => {\n if (!tableWraperHeight.value) {\n return 0;\n }\n let value = tableWraperHeight.value - searchHeight.value - headerHeight.value - 4;\n if (props.config.is_pagination) {\n value -= paginationHeight.value;\n }\n console.log('tableWraperHeight', tableWraperHeight.value);\n console.log('searchHeight', searchHeight.value);\n console.log('headerHeight', headerHeight.value);\n console.log('paginationHeight', paginationHeight.value);\n console.log('tableHeight', value);\n return value;\n});\nconst handleTableSizeChange = () => {\n isViewChange.value = true;\n};\nwatch(\n () => state.tableSize,\n () => {\n // 此处设置paginationHeight两次,为了解决切换表格密度后,高度剧烈变化问题。\n paginationHeight.value = 64;\n setTimeout(() => {\n if (state.tableSize === 'small') {\n paginationHeight.value = 56;\n } else if (state.tableSize === 'middle') {\n paginationHeight.value = 56;\n } else if (state.tableSize === 'default') {\n paginationHeight.value = 64;\n }\n }, 200);\n },\n);\nconst syncSelectedRowKeys = () => {\n if (dataSource.value?.length > 0 && props.initValueKey) {\n const valueMap = {};\n selectedRowKeys.value = dataSource.value\n .filter(item => {\n const value = item[props.initValueKey];\n if (props.initSelectValue?.includes(value) && !valueMap[value]) {\n valueMap[value] = true;\n return true;\n }\n })\n .map(item => {\n return item.id;\n });\n }\n};\nconst init = async () => {\n const defaultSortField = props.config.columns.filter(\n column => column.sorter && column.defaultSortOrder,\n );\n defaultSortField.sort((a, b) => (a.defaultSortIndex || 0) - (b.defaultSortIndex || 0));\n for (const column of defaultSortField) {\n sortedMap.value[column.dataIndex] = column.defaultSortOrder;\n sortedList.value.push({ key: column.dataIndex, order: column.defaultSortOrder });\n }\n const tmpSearchConditions = [];\n if (props.config?.search_config) {\n props.config.search_config.forEach(configItem => {\n if (configItem.default_value) {\n let value = configItem.default_value;\n if (!isArray(value)) {\n value = [value];\n }\n tmpSearchConditions.push({\n field_name: configItem.field_name,\n value: value,\n operator: configItem.default_operator || 'eq',\n format: configItem.format || 'input',\n class_name: configItem.class_name || 'str',\n });\n }\n });\n }\n searchConditions.value = tmpSearchConditions;\n if (is_view && currentView.value?.id !== 'no-view') {\n await fetchViews();\n if (viewDataList.value?.length) {\n const tmpData = [...viewDataList.value];\n // 优先级:当前选中视图,默认视图,用户视图,同级按 sort 正序\n const getSortValue = item => {\n let value = item.sort || 0;\n if (item.id !== currentView.value?.id) {\n value *= 1000000;\n }\n if (!item.is_default) {\n value *= 10000;\n }\n if (!item.user_id) {\n value *= 1000;\n }\n return value;\n };\n tmpData.sort((a, b) => getSortValue(a) - getSortValue(b));\n setViewData(tmpData[0].data);\n currentView.value = tmpData[0];\n }\n }\n await getData();\n};\nconst eventReinit = async () => {\n init();\n};\nconst eventReload = async () => {\n await getData();\n};\nconst flattenedColumns = computed(() => {\n const list = [];\n const getLeaves = (cols: Column[]) => {\n cols.forEach(col => {\n if (col.children && col.children.length > 0) {\n getLeaves(col.children);\n } else {\n list.push(col);\n }\n });\n };\n getLeaves(filtedColumns.value);\n return list;\n});\nconst summaryColumns = computed(() => {\n const list = [];\n let index = 0;\n for (const item of flattenedColumns.value) {\n let _index = index;\n if (props.config?.is_selection) {\n _index = index + 1;\n }\n if (item.summary) {\n // if (!props.config.is_selection && props.config.hide_index_column) {\n // console.error('未开启选择(is_selection)且隐藏了序号列(hide_index_column),无法展示\"合计\"');\n // return [];\n // }\n list.push({\n index: _index,\n key: item.key,\n cellSummaryComponent: item.cellSummaryComponent,\n total_content: item.total_content,\n });\n }\n index++;\n }\n return list;\n});\nconst handleChange: TableProps['onChange'] = (pagination, filters, sorter, action) => {\n if (action.action === 'paginate') {\n return;\n } else if (action.action === 'filter') {\n const searchMap = {};\n for (const item of searchConditions.value) {\n searchMap[item.field_name] = item;\n }\n for (const key of Object.keys(filters)) {\n const value = filters[key];\n const item = searchMap[key];\n if (item) {\n if (value?.length > 1) {\n item.operator = 'in';\n } else {\n if (!['in', 'eq'].includes(item.operator)) {\n item.operator = 'in';\n }\n }\n item.value = value;\n } else {\n searchMap[key] = {\n field_name: key,\n operator: 'eq',\n value: value,\n format: 'input',\n class_name: 'str',\n };\n }\n }\n searchConditions.value = Object.values(searchMap);\n getData();\n isViewChange.value = true;\n } else if (action.action === 'sort') {\n const tmpMap = {};\n const tmpList = [];\n if (!isArray(sorter)) {\n tmpMap[sorter.columnKey] = sorter.order;\n tmpList.push({ key: sorter.columnKey, order: sorter.order });\n } else {\n for (const item of sorter) {\n tmpMap[item.columnKey] = item.order;\n tmpList.push({ key: item.columnKey, order: item.order });\n }\n }\n sortedMap.value = tmpMap;\n sortedList.value = tmpList;\n getData();\n isViewChange.value = true;\n }\n};\nconst handleCellClick = (e, cell) => {\n if (!props.config?.is_click_selection) {\n return;\n }\n const rowSelectionType = props.config.rowSelectionType || 'checkbox';\n if (rowSelectionType === 'radio') {\n selectedRowKeys.value = [cell.record.id];\n } else {\n const isSelected = selectedRowKeys.value && selectedRowKeys.value.includes(cell.record.id);\n if (isSelected) {\n selectedRowKeys.value = selectedRowKeys.value.filter(id => {\n return id !== cell.record.id;\n });\n } else {\n selectedRowKeys.value.push(cell.record.id);\n }\n }\n\n const selectdRecord = dataSource.value.filter(item => {\n return selectedRowKeys.value.includes(item.id);\n });\n const unSelectdRecord = dataSource.value.filter(item => {\n return !selectedRowKeys.value.includes(item.id);\n });\n emit('selectChange', selectdRecord, unSelectdRecord);\n};\n\nonMounted(async () => {\n if (!props.config.key) {\n console.error('tablePro config 未配置 key');\n }\n if (!props.config.title) {\n console.error('tablePro config 未配置 title');\n }\n selfEventBus.on('refresh', refresh);\n selfEventBus.on('reinit', eventReinit);\n selfEventBus.on('saveView', saveView);\n selfEventBus.on('saveNewView', addView);\n if (props.eventBus) {\n props.eventBus.on('reinit', eventReinit);\n props.eventBus.on('reload_table', eventReload);\n }\n if (props.config.tableSize) {\n state.tableSize = props.config.tableSize;\n }\n await init();\n});\nconst handleExport = () => {\n exportOpen.value = true;\n};\nconst onColumnsChange = (data: any[]) => {\n if (!props.config || !props.config.columns) return;\n const configObj: Record<string, any> = {};\n\n const processRecursive = (list: any[]) => {\n list.forEach((item, index) => {\n const dataIndex = item.dataIndex || item.key || item.title;\n if (dataIndex === 'index' || dataIndex === 'action') return;\n configObj[dataIndex] = {\n checked: item.checked,\n fixed: item.fixed,\n autoHeight: item.autoHeight,\n autoWidth: item.autoWidth,\n ellipsis: item.ellipsis,\n width: item.width,\n order: index,\n };\n if (item.children && item.children.length > 0) {\n processRecursive(item.children);\n }\n });\n };\n\n processRecursive(data);\n viewColumnsConfig.value = configObj;\n isViewChange.value = true;\n};\nconst setViewData = async (viewData: ViewData) => {\n if (viewData === null) {\n await init();\n isViewChange.value = false;\n return;\n }\n if (viewData.columns) {\n viewColumnsConfig.value = viewData.columns;\n }\n if (viewData.searchConfig) {\n viewSearchConfig.value = viewData.searchConfig;\n }\n if (viewData.searchConditions) {\n searchConditions.value = viewData.searchConditions;\n }\n if (viewData.tableSize) {\n state.tableSize = viewData.tableSize;\n }\n if (viewData.refreshType) {\n refreshType.value = viewData.refreshType;\n }\n if (viewData.sortedList) {\n sortedList.value = viewData.sortedList;\n sortedMap.value = {};\n for (const item of sortedList.value) {\n sortedMap.value[item.key] = item.order;\n }\n }\n if (props.config.set_view_callback) {\n props.config.set_view_callback({ viewData });\n }\n await refresh();\n isViewChange.value = false;\n};\nconst resizeColumn = (width, column, action: 'start' | 'move' | 'end') => {\n if (action === 'end') {\n let item = viewColumnsConfig.value[column.dataIndex];\n if (!item) {\n item = {};\n viewColumnsConfig.value[column.dataIndex] = item;\n }\n item.width = width;\n isViewChange.value = true;\n }\n};\nconst viewSearchConfigChange = (config: Record<string, ViewSearchItem>) => {\n viewSearchConfig.value = config;\n isViewChange.value = true;\n};\nconst getViewData = (): ViewData => {\n const viewData = {\n columns: viewColumnsConfig.value,\n searchConditions: searchConditions.value,\n tableSize: state.tableSize,\n refreshType: refreshType.value,\n searchConfig: viewSearchConfig.value,\n sortedList: sortedList.value,\n };\n if (props.config.get_view_data_func) {\n const newViewData = props.config.get_view_data_func({ viewData });\n if (newViewData) {\n Object.assign(viewData, newViewData);\n }\n }\n return viewData;\n};\nconst viewDataList = ref([]);\nconst currentView = ref<any>(null);\nconst isViewChange = ref(false);\nconst fetchViews = async () => {\n const data = await fetchViewsData(view_key.value);\n viewDataList.value = data;\n};\nconst handleSearchChange = () => {\n isViewChange.value = true;\n};\nconst { saveView, addView } = useView({\n currentView,\n getViewData,\n isViewChange,\n userid,\n view_project__flag: env.VITE_APP_VIEW_PROJECT_FLAG,\n view_menu__flag: view_key.value,\n view_menu__name: props.config.title,\n fetchViews,\n is_auth,\n t,\n});\n\nprovide<TableProState>(tableProStateSymbol, {\n setViewData,\n getViewData,\n fetchViews,\n viewDataList,\n currentView,\n isViewChange,\n config: props.config,\n});\n\nonUnmounted(() => {\n selfEventBus.off('refresh', refresh);\n selfEventBus.off('reinit', eventReinit);\n selfEventBus.off('saveView', saveView);\n selfEventBus.off('saveNewView', addView);\n if (props.eventBus) {\n props.eventBus.off('reinit', eventReinit);\n props.eventBus.off('reload_table', eventReload);\n }\n});\nwatch(\n () => props.initSelectValue,\n () => {\n syncSelectedRowKeys();\n },\n);\nwatch(\n () => props.config.query_params,\n () => {\n delayGetDate();\n },\n {\n deep: true,\n },\n);\nwatch(\n () => props.config.base_conditions,\n () => {\n delayGetDate();\n },\n {\n deep: true,\n },\n);\n\ndefineExpose({\n getViewData,\n setViewData,\n config: props.config,\n columns,\n fetchViews,\n viewDataList,\n currentView,\n isViewChange,\n viewColumnsConfig,\n refresh,\n});\n</script>\n<style lang=\"less\" scoped>\n.btn-wraper {\n display: flex;\n justify-content: flex-end;\n}\n.table-wraper {\n height: 100%;\n overflow: hidden;\n}\n.modify-row-height {\n :deep(.surely-table-header) {\n height: var(--row-heigth) !important;\n }\n :deep(.surely-table-header-cell) {\n height: var(--row-heigth) !important;\n }\n :deep(.surely-table-summary) {\n height: var(--row-heigth) !important;\n }\n}\n.popup-divider {\n :deep(.ant-divider-horizontal) {\n margin-top: 1px;\n margin-bottom: 1px;\n }\n}\n.highlight {\n background-color: rgb(255, 192, 105);\n padding: 0px;\n}\n</style>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tablePro-BYIW028a.js","names":[],"sources":["../src/components/FormRender/SmallTableSerarchField.vue","../src/components/FormRender/SmallTableSerarchField.vue","../src/api/view-model.ts","../src/utils/dom.ts","../src/utils/hooks/useFullscreen.ts","../src/components/tablePro/utils.ts","../src/components/tablePro/searchSummary.vue","../src/components/tablePro/searchSummary.vue","../src/components/tablePro/tableConfig/searchConfig.vue","../src/components/tablePro/tableConfig/searchConfig.vue","../src/components/tablePro/search.vue","../src/components/tablePro/search.vue","../src/components/tablePro/TableFilterDropdown.vue","../src/components/tablePro/TableFilterDropdown.vue","../src/components/tablePro/tableConfig/columnsConfig.vue","../src/components/tablePro/tableConfig/columnsConfig.vue","../src/components/tablePro/hooks/view.ts","../src/components/tablePro/tableConfig/viewsConfig.vue","../src/components/tablePro/tableConfig/viewsConfig.vue","../src/components/tablePro/tableConfig/index.vue","../src/components/tablePro/tableConfig/index.vue","../src/components/tablePro/head_btn_confirm.ts","../src/components/tablePro/head_btn_custom_component.ts","../src/components/tablePro/head_btn_form.ts","../src/components/tablePro/headBtnChildren.vue","../src/components/tablePro/headBtnChildren.vue","../src/components/tablePro/headBtn.vue","../src/components/tablePro/headBtn.vue","../src/components/tablePro/refresh-type-modal/index.vue","../src/components/tablePro/refresh-type-modal/index.vue","../src/components/tablePro/tableHeader.vue","../src/components/tablePro/tableHeader.vue","../src/components/tablePro/TableSummary.vue","../src/components/tablePro/TableSummary.vue","../src/components/tablePro/TableContextMenu.vue","../src/components/tablePro/TableContextMenu.vue","../src/components/tablePro/tablePro.vue","../src/components/tablePro/tablePro.vue"],"sourcesContent":["<template>\n <template\n v-if=\"field.type !== 'divider' && (field?.is_search_show !== false || field_render_show)\"\n >\n <slot />\n <div\n v-if=\"field.type === 'kong'\"\n style=\"height: 62px; width: 200px\"\n ></div>\n <!-- 展示内容-->\n <div v-if=\"field.type === 'tag'\">\n <a-tag\n :color=\"field.color ? field.color(field, model) : 'green'\"\n :style=\"field.style\"\n v-if=\"(field.content && field.content(field, model)) || model\"\n @click=\"field.cb ? field.cb(field, model) : ''\"\n >\n <span v-if=\"field.content\">\n {{ field.content(field, model) }}\n </span>\n <span v-else>{{ model }}</span>\n </a-tag>\n </div>\n <!-- 表单占位组件-->\n <!-- 默认 【表单空位 高62px; 名称空位 高30px;】 如遇个别特殊表单,根据实际情况自行调节 高度-->\n <!-- height 属性必填-->\n <div\n v-if=\"field.type === 'kong_title'\"\n :style=\"'height: ' + field.height + 'px'\"\n ></div>\n <div\n v-if=\"field.type === 'title'\"\n style=\"height: 30px; position: relative\"\n >\n <span\n style=\"\n position: absolute;\n bottom: 0;\n padding: 0;\n margin: 0;\n font-weight: bolder;\n font-size: 17px;\n \"\n >\n {{ field.name }}\n </span>\n </div>\n <a-rate\n v-if=\"field.type === 'rate'\"\n v-model:value=\"model\"\n :disabled=\"field.disabled\"\n allow-half\n :style=\"`width: ${field_width}px`\"\n />\n <a-input\n v-if=\"field.type === 'input'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear == undefined ? true : field.allowClear\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :maxlength=\"field.maxlength\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请输入') + field.label\"\n :type=\"field.inputType ? field.inputType : 'text'\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <template\n v-if=\"field?.prefix || field?.prefixIcon\"\n #prefix\n >\n <span v-if=\"field?.prefix\">{{ field.prefix }}</span>\n <component\n v-if=\"field?.prefixIcon\"\n :is=\"field?.prefixIcon\"\n />\n </template>\n <template\n v-if=\"field?.suffix || field?.suffixIcon\"\n #suffix\n >\n <span v-if=\"field?.suffix\">{{ field.suffix }}</span>\n <component\n v-if=\"field?.suffixIcon\"\n :is=\"field?.suffixIcon\"\n />\n </template>\n <template\n v-if=\"field?.addonBefore || field?.addonBeforeIcon\"\n #addonBefore\n >\n <span v-if=\"field?.addonBefore\">{{ field.addonBefore }}</span>\n <component\n v-if=\"field?.addonBeforeIcon\"\n :is=\"field?.addonBeforeIcon\"\n />\n </template>\n <template\n v-if=\"field?.addonAfter || field?.addonAfterIcon\"\n #addonAfter\n >\n <span v-if=\"field?.addonAfter\">{{ field.addonAfter }}</span>\n <component\n v-if=\"field?.addonAfterIcon\"\n :is=\"field?.addonAfterIcon\"\n />\n </template>\n </a-input>\n\n <a-input-number\n v-if=\"field.type === 'money'\"\n size=\"small\"\n v-model:value=\"model\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :disabled=\"field.disabled\"\n :default-value=\"field.defaultValue\"\n :min=\"field.min\"\n :max=\"field.max\"\n :formatter=\"value => `${value}`.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\"\n :precision=\"field.precision\"\n :step=\"field.step\"\n :placeholder=\"\n field.placeholder_i18n == undefined ? field.placeholder : t(field.placeholder_i18n)\n \"\n :style=\"`width: ${field_width}px`\"\n />\n <a-input-number\n v-if=\"field.type === 'number'\"\n v-model:value=\"model\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :formatter=\"field.formatter\"\n :max=\"field.max\"\n :min=\"field.min\"\n :placeholder=\"field.placeholder ? field.placeholder : '请输入' + field.label\"\n :precision=\"field.precision\"\n :step=\"field.step\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <template\n v-if=\"field?.prefix || field?.prefixIcon\"\n #prefix\n >\n <span v-if=\"field?.prefix\">{{ field.prefix }}</span>\n <component\n v-if=\"field?.prefixIcon\"\n :is=\"field?.prefixIcon\"\n />\n </template>\n <template\n v-if=\"field?.suffix || field?.suffixIcon\"\n #suffix\n >\n <span v-if=\"field?.suffix\">{{ field.suffix }}</span>\n <component\n v-if=\"field?.suffixIcon\"\n :is=\"field?.suffixIcon\"\n />\n </template>\n <template\n v-if=\"field?.addonBefore || field?.addonBeforeIcon\"\n #addonBefore\n >\n <span v-if=\"field?.addonBefore\">{{ field.addonBefore }}</span>\n <component\n v-if=\"field?.addonBeforeIcon\"\n :is=\"field?.addonBeforeIcon\"\n />\n </template>\n <template\n v-if=\"field?.addonAfter || field?.addonAfterIcon\"\n #addonAfter\n >\n <span v-if=\"field?.addonAfter\">{{ field.addonAfter }}</span>\n <component\n v-if=\"field?.addonAfterIcon\"\n :is=\"field?.addonAfterIcon\"\n />\n </template>\n </a-input-number>\n\n <template v-if=\"field.type === 'select'\">\n <a-select\n v-if=\"field.mode === 'default'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :dropdownMatchSelectWidth=\"false\"\n :maxTagCount=\"field.maxTagCount ? field.maxTagCount : 'responsive'\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :show-search=\"!!field.show_search\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <a-select-option\n v-for=\"option in options\"\n :key=\"option[field.valueKey ? field.valueKey : 'value']\"\n :value=\"option[field.valueKey ? field.valueKey : 'value']\"\n >\n {{ option[field.labelKey ? field.labelKey : 'label'] }}\n </a-select-option>\n </a-select>\n <a-select\n v-else\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :dropdownMatchSelectWidth=\"false\"\n :maxTagCount=\"field.maxTagCount ? field.maxTagCount : 'responsive'\"\n :mode=\"field.mode\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :show-search=\"!!field.show_search\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <a-select-option\n v-for=\"(option, index) in options\"\n :key=\"index\"\n :value=\"option[field.valueKey ? field.valueKey : 'value']\"\n >\n {{ option[field.labelKey ? field.labelKey : 'label'] }}\n </a-select-option>\n </a-select>\n </template>\n <template v-if=\"field.type === 'groupselect'\">\n <a-select\n v-if=\"field.mode === 'default'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :dropdownMatchSelectWidth=\"false\"\n :getPopupContainer=\"field.getPopupContainer == undefined ? null : field.getPopupContainer\"\n :labelInValue=\"field.labelInValue === true\"\n :maxTagCount=\"field.maxTagCount ? field.maxTagCount : 'responsive'\"\n :options=\"options\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :show-search=\"!!field.show_search\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n ></a-select>\n <a-select\n v-else\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :dropdownMatchSelectWidth=\"false\"\n :getPopupContainer=\"field.getPopupContainer == undefined ? null : field.getPopupContainer\"\n :labelInValue=\"field.labelInValue === true\"\n :maxTagCount=\"field.maxTagCount ? field.maxTagCount : 'responsive'\"\n :mode=\"field.mode\"\n :options=\"options\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :show-search=\"!!field.show_search\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n ></a-select>\n </template>\n\n <a-cascader\n v-if=\"field.type === 'cascader'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :multiple=\"field.multiple\"\n :show-search=\"field.show_search\"\n :changeOnSelect=\"field.changeOnSelect ? field.changeOnSelect : false\"\n :options=\"field.getOptionsData ? field.getOptionsData(options, model) : options\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n\n <remote-cascader\n v-if=\"field.type === 'remotecascader'\"\n v-model:value=\"model\"\n v-model:label=\"labelModel\"\n :field=\"field\"\n :formModel=\"formModel\"\n :get-data=\"field.getData\"\n :label-key=\"field.labelKey\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-cascader-pro\n v-if=\"field.type === 'remotecascaderpro'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :field=\"field\"\n :formModel=\"formModel\"\n :outModel=\"outModel\"\n :get-data=\"field.getData\"\n :multiple=\"field.multiple\"\n :maxTagCount=\"field.maxTagCount ? field.maxTagCount : 'responsive'\"\n :show_search=\"field.show_search\"\n :label-key-type=\"field.labelKeyType\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :label-key=\"field.labelKey\"\n :value-key=\"field.valueKey\"\n :init_model=\"field.init_model\"\n :init_watch=\"field.init_watch\"\n :is_form_design=\"is_form_design\"\n :placeholder=\"\n field.placeholder_i18n == undefined\n ? field.placeholder\n ? field.placeholder\n : t('请选择') + field.label\n : t(field.placeholder_i18n)\n \"\n :style=\"`width: ${field_width}px`\"\n />\n\n <month-picker\n v-if=\"field.type === 'monthpicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n size=\"small\"\n :is_range=\"field.is_range\"\n :value_has_time=\"field.value_has_time\"\n :start_offset_day=\"field.start_offset_day\"\n :end_offset_day=\"field.end_offset_day\"\n :fix_day=\"field.fix_day\"\n :style=\"`width: ${field_width}px`\"\n />\n <a-date-picker\n v-if=\"field.type === 'datepicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :format=\"field.format\"\n :picker=\"field.picker\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :show-time=\"field.showTime\"\n :value-format=\"field.valueFormat\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n\n <a-range-picker\n v-if=\"field.type === 'rangepicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue || []\"\n :disabled=\"field.disabled\"\n :format=\"field.format\"\n :placeholder=\"\n field.placeholder && isArray(field.placeholder) && field.placeholder.length > 0\n ? field.placeholder\n : [$t('开始时间'), $t('结束时间')]\n \"\n :show-time=\"field.showTime\"\n :value-format=\"field.valueFormat\"\n :picker=\"field.picker ? field.picker : 'date'\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n\n <month-range-picker\n v-if=\"field.type === 'monthrangepicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue || []\"\n :disabled=\"field.disabled\"\n :placeholder=\"field.placeholder\"\n size=\"small\"\n :is_range=\"field.is_range\"\n :value_has_time=\"field.value_has_time\"\n :start_offset_day=\"field.start_offset_day\"\n :end_offset_day=\"field.end_offset_day\"\n :fix_day=\"field.fix_day\"\n :style=\"`width: ${field_width}px`\"\n />\n\n <a-time-picker\n v-if=\"field.type === 'timepicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :format=\"field.format ? field.format : 'HH:mm'\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :value-format=\"field.valueFormat ? field.valueFormat : 'HH:mm'\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n <a-time-range-picker\n v-if=\"field.type === 'timerangepicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :format=\"field.format ? field.format : 'HH:mm'\"\n :placeholder=\"\n field.placeholder && isArray(field.placeholder) && field.placeholder.length > 0\n ? field.placeholder\n : [$t('开始时间'), $t('结束时间')]\n \"\n :value-format=\"field.valueFormat ? field.valueFormat : 'HH:mm'\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n <a-radio-group\n v-if=\"field.type === 'radio'\"\n v-model:value=\"model\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <a-radio\n v-for=\"option in options\"\n :key=\"option[field.valueKey ? field.valueKey : 'value']\"\n :disabled=\"option.disabled\"\n :value=\"option[field.valueKey ? field.valueKey : 'value']\"\n >\n {{ option[field.labelKey ? field.labelKey : 'label'] }}\n </a-radio>\n </a-radio-group>\n\n <a-checkbox-group\n v-if=\"field.type === 'checkbox'\"\n v-model:value=\"model\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <a-checkbox\n v-for=\"option in options\"\n :key=\"option[field.valueKey ? field.valueKey : 'value']\"\n :disabled=\"option.disabled\"\n :value=\"option[field.valueKey ? field.valueKey : 'value']\"\n >\n {{ option[field.labelKey ? field.labelKey : 'label'] }}\n </a-checkbox>\n </a-checkbox-group>\n\n <a-tree-select\n v-if=\"field.type === 'treeselect'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :dropdownMatchSelectWidth=\"false\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :multiple=\"field.multiple\"\n :tree-checkable=\"field.treeCheckable\"\n :tree-data=\"options\"\n :tree-label-prop=\"field.labelKey\"\n :tree-node-filter-prop=\"field.valueKey\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-filter-select\n v-if=\"field.type === 'remotefilterselect'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :field=\"field\"\n :formModel=\"formModel\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :label-key=\"field.labelKey\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-select\n v-if=\"field.type === 'remoteselect'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :field=\"field\"\n :formModel=\"formModel\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :label-key=\"field.labelKey\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-select-pro\n v-if=\"field.type === 'remoteselectpro'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :field=\"field\"\n :formModel=\"formModel\"\n :outModel=\"outModel\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :init_watch=\"field.init_watch\"\n :label-key=\"field.labelKey\"\n :label-key-type=\"field.labelKeyType\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :is_input=\"field.is_input\"\n :is_form_design=\"is_form_design\"\n :placeholder=\"\n field.placeholder_i18n == undefined\n ? field.placeholder\n ? field.placeholder\n : $t('请选择') + field.label\n : t(field.placeholder_i18n)\n \"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-complete\n v-if=\"field.type === 'remotecomplete'\"\n v-model:value=\"model\"\n :field=\"field\"\n :formModel=\"formModel\"\n :outModel=\"outModel\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :init_watch=\"field.init_watch\"\n :label-key=\"field.labelKey\"\n :label-key-type=\"field.labelKeyType\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :maxlength=\"field.maxlength\"\n :is_input=\"field.is_input\"\n :is_form_design=\"is_form_design\"\n :placeholder=\"\n field.placeholder_i18n == undefined\n ? field.placeholder\n ? field.placeholder\n : $t('请选择') + field.label\n : t(field.placeholder_i18n)\n \"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-tree-select\n v-if=\"field.type === 'remotetreeselect'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :field=\"field\"\n :formModel=\"formModel\"\n :get-data=\"field.getData\"\n :label-key=\"field.labelKey\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-tree-select-pro\n v-if=\"field.type === 'remotetreeselectpro'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :field=\"field\"\n :formModel=\"formModel\"\n :outModel=\"outModel\"\n :get-data=\"field.getData\"\n :multiple=\"field.multiple\"\n :search_config=\"field.search_config\"\n :label-key-type=\"field.labelKeyType\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :label-key=\"field.labelKey\"\n :value-key=\"field.valueKey\"\n :init_model=\"field.init_model\"\n :init_watch=\"field.init_watch\"\n :is_form_design=\"is_form_design\"\n :placeholder=\"\n field.placeholder_i18n == undefined\n ? field.placeholder\n ? field.placeholder\n : $t('请选择') + field.label\n : t(field.placeholder_i18n)\n \"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-modal\n v-if=\"field.type === 'remotemodal'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :columns=\"field.columns\"\n :field=\"field\"\n :field_status=\"field.field_status\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :modalType=\"field.modalType\"\n :search_config=\"field.search_config\"\n :watch=\"field.watch\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-table\n v-if=\"field.type === 'remotetable'\"\n v-model:value=\"model\"\n :columns=\"field.columns\"\n :formModel=\"formModel\"\n :field=\"field\"\n :field_status=\"field.field_status\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :modalType=\"field.modalType\"\n :search_config=\"field.search_config\"\n :watch=\"field.watch\"\n :style=\"`width: ${field_width}px`\"\n />\n\n <remote-text\n v-if=\"field.type === 'remotetext'\"\n v-model:value=\"model\"\n :columns=\"field.columns\"\n :formModel=\"formModel\"\n :field=\"field\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :modalType=\"field.modalType\"\n :search_config=\"field.search_config\"\n :watch=\"field.watch\"\n />\n\n <a-rate\n v-if=\"field.type === 'rate'\"\n v-model:value=\"model\"\n :count=\"field.count ? field.count : 5\"\n :allow-half=\"field.allowHalf\"\n :style=\"`width: ${field_width}px`\"\n />\n <a-radio-group\n v-if=\"field.type === 'radio-color'\"\n v-model:value=\"model\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <a-radio\n v-for=\"option in options\"\n :key=\"option[field.valueKey ? field.valueKey : 'value']\"\n :disabled=\"option.disabled\"\n :value=\"option[field.valueKey ? field.valueKey : 'value']\"\n >\n <div\n :style=\"{\n width: '20px',\n height: '20px',\n backgroundColor: option[field.valueKey ? field.valueKey : 'value'],\n }\"\n ></div>\n </a-radio>\n </a-radio-group>\n </template>\n\n <a-divider\n v-if=\"field.type === 'divider'\"\n :orientation=\"field.orientation\"\n >\n {{ field.label }}\n </a-divider>\n</template>\n<script lang=\"ts\">\nimport RemoteSelect from 'liyu-pc-base/components/FormRender/RemoteSelect/RemoteSelect.vue';\nimport RemoteCascader from 'liyu-pc-base/components/FormRender/RemoteCascader/RemoteCascader.vue';\nimport RemoteModal from 'liyu-pc-base/components/FormRender/RemoteModal/RemoteModal.vue';\nimport RemoteTreeSelect from 'liyu-pc-base/components/FormRender/RemoteTreeSelect/RemoteTreeSelect.vue';\nimport RemoteTable from 'liyu-pc-base/components/FormRender/RemoteTable/RemoteTable.vue';\nimport { defineComponent, watch, onMounted, ref } from 'vue';\nimport RemoteFilterSelect from 'liyu-pc-base/components/FormRender/RemoteFilterSelect/RemoteFilterSelect.vue';\nimport AttributeNomTable from 'liyu-pc-base/components/FormRender/AttributeNomTable/index.vue';\nimport AttributeTable from 'liyu-pc-base/components/FormRender/AttributeTable/index.vue';\nimport JsonStr from 'liyu-pc-base/components/FormRender/JsonStr/index.vue';\nimport JsonObj from 'liyu-pc-base/components/FormRender/JsonObj/index.vue';\nimport RemoteText from 'liyu-pc-base/components/FormRender/RemoteText/RemoteText.vue';\nimport RemoteTablePro from 'liyu-pc-base/components/FormRender/RemoteTablePro/RemoteTablePro.vue';\nimport { debounce, isArray, isEqual } from 'lodash-es';\nimport moment from 'moment';\nimport { isEmpty, isNotEmpty } from 'liyu-pc-base/utils/function';\nimport { PlusOutlined } from '@ant-design/icons-vue';\nimport RemoteSelectPro from 'liyu-pc-base/components/FormRender/RemoteSelectPro/RemoteSelectPro.vue';\nimport RemoteComplete from 'liyu-pc-base/components/FormRender/RemoteComplete/RemoteComplete.vue';\nimport RemoteTreeSelectPro from 'liyu-pc-base/components/FormRender/RemoteTreeSelectPro/RemoteTreeSelectPro.vue';\nimport RemoteCascaderPro from 'liyu-pc-base/components/FormRender/RemoteCascaderPro/RemoteCascaderPro.vue';\nimport Upload from 'liyu-pc-base/components/FormRender/Upload/upload.vue';\nimport RichTextEditor from 'liyu-pc-base/components/FormRender/RichTextEditor/index.vue';\nimport { useI18n } from 'vue-i18n';\nimport IconSelect from 'liyu-pc-base/components/FormRender/iconSelect/index.vue';\nimport MonthPicker from 'liyu-pc-base/components/FormRender/MonthPicker/index.vue';\nimport MonthRangePicker from 'liyu-pc-base/components/FormRender/MonthRangePicker/index.vue';\nimport CodeEditor from 'liyu-pc-base/components/code/CodeEditor.vue';\nimport TinymceEditor from 'liyu-pc-base/components/tinymce/TinymceEditor.vue';\n\nconst isValidDate = (dateString, format = 'YYYY-MM-DD') => {\n const date = moment(dateString, format, true);\n return date.isValid();\n};\nconst isValidDateTime = (dateString, format = 'YYYY-MM-DD HH:mm:ss') => {\n const date = moment(dateString, format, true);\n return date.isValid();\n};\nconst isValidTime = (dateString, format = 'HH:mm:ss') => {\n const date = moment(dateString, format, true);\n return date.isValid();\n};\nexport default defineComponent({\n name: 'FieldRender2',\n methods: { isArray },\n props: {\n field: {\n type: Object,\n required: true,\n },\n value: {\n required: true,\n },\n label: {\n required: false,\n },\n options: {\n type: Array,\n default: () => [],\n },\n validateInfos: {\n type: Object,\n default: () => {},\n },\n formModel: {\n type: Object,\n default: () => {},\n },\n outModel: {\n type: Object,\n default: () => {},\n },\n field_render_show: {\n type: Boolean,\n default: true,\n },\n is_show_label: {\n type: Boolean,\n default: true,\n },\n isUseConditions: {\n type: Boolean,\n default: true,\n },\n is_show_field: {\n type: Boolean,\n default: true,\n },\n is_edit: {\n type: Boolean,\n default: true,\n },\n conditionsVisibleNum: {\n type: Number,\n default: 0,\n },\n is_form_design: {\n type: Boolean,\n default: false,\n },\n field_width: {\n type: Number,\n default: 150,\n },\n },\n emits: [\n 'add',\n 'update:value',\n 'update:label',\n 'update_model',\n 'update:is_show_field',\n 'update:is_edit',\n 'update_name2',\n ],\n setup(props, { emit }) {\n const newModel = ref({ ...props.formModel });\n const rangeDate = (v: any) => {\n if (typeof v == 'string' && v.indexOf(',') >= 0) {\n return v.split(',');\n }\n return v;\n };\n const convertValueByClassName = (value, class_name) => {\n //class_name 'int','float',str','bool','date','datetime','time'\n let new_value;\n if (class_name == 'int') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isNotEmpty(item) && typeof item === 'string') {\n new_value.push(Number(item));\n } else {\n new_value.push(item);\n }\n });\n } else if (isNotEmpty(value) && typeof value === 'string') {\n new_value = Number(value);\n } else {\n new_value = value;\n }\n } else if (class_name == 'str') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isNotEmpty(item) && typeof item === 'number') {\n new_value.push(item.toString());\n } else {\n new_value.push(item);\n }\n });\n } else if (isNotEmpty(value) && typeof value === 'number') {\n new_value = value.toString();\n } else {\n new_value = value;\n }\n } else if (class_name == 'date') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isValidDate(item) && typeof item === 'string') {\n new_value.push(moment(item, 'YYYY-MM-DD'));\n } else {\n new_value.push(item);\n }\n });\n } else if (isValidDate(value) && typeof value === 'string') {\n new_value = value.toString();\n } else {\n new_value = value;\n }\n } else if (class_name == 'datetime') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isValidDateTime(item) && typeof item === 'string') {\n new_value.push(moment(item, 'YYYY-MM-DD HH:mm:ss'));\n } else {\n new_value.push(item);\n }\n });\n } else if (isValidDateTime(value) && typeof value === 'string') {\n new_value = moment(value, 'YYYY-MM-DD HH:mm:ss');\n } else {\n new_value = value;\n }\n } else if (class_name == 'time') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isValidTime(item) && typeof item === 'string') {\n new_value.push(moment(item, 'HH:mm:ss'));\n } else {\n new_value.push(item);\n }\n });\n } else if (isValidTime(value) && typeof value === 'string') {\n new_value = moment(value, 'HH:mm:ss');\n } else {\n new_value = value;\n }\n } else if (class_name == 'float') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isNotEmpty(item) && typeof item === 'string') {\n new_value.push(Number(item));\n } else {\n new_value.push(item);\n }\n });\n } else if (isNotEmpty(value) && typeof value === 'string') {\n new_value = Number(value);\n } else {\n new_value = value;\n }\n } else if (class_name == 'bool') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isNotEmpty(item) && typeof item === 'string') {\n new_value.push(Boolean(item));\n } else {\n new_value.push(item);\n }\n });\n } else if (isNotEmpty(value) && typeof value === 'string') {\n new_value = Boolean(value);\n } else {\n new_value = value;\n }\n }\n return new_value;\n };\n const is_show_field = ref(props.is_show_field);\n const is_edit = ref(false);\n const handleToggleEdit = () => {\n emit('update:is_edit', is_edit.value);\n };\n const handleAdd = () => {\n emit('add');\n };\n const check_visible_field_fun = debounce(() => {\n const old_is_show_field = is_show_field.value;\n const condition_result_list: any = [];\n for (const i in props.field?.conditions) {\n const group_list = props.field?.conditions[i];\n const group_results = [];\n for (const j in group_list) {\n const item = group_list[j];\n const value = props.formModel[item.watchKey];\n let new_value;\n if (item.class_name) {\n new_value = convertValueByClassName(item.value, item.class_name);\n } else {\n new_value = item.value;\n }\n let first, second;\n if (new_value instanceof Array) {\n [first, second] = new_value;\n }\n if (item.operator == 'lt') {\n if (typeof first === 'number') {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value < first) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (moment(value).isBefore(moment(first))) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'lte') {\n if (typeof first === 'number') {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value <= first) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (\n moment(value).isBefore(moment(first)) ||\n moment(value).isSame(moment(first))\n ) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'gt') {\n if (typeof first === 'number') {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value > first) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (moment(value).isAfter(moment(first))) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'gte') {\n if (typeof first === 'number') {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value >= first) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (\n moment(value).isAfter(moment(first)) ||\n moment(value).isSame(moment(first))\n ) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'between') {\n if (typeof first === 'number' && typeof second === 'number' && first && second) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value >= first && value <= second) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (\n (moment(value).isAfter(moment(first)) || moment(value).isSame(moment(first))) &&\n (moment(value).isBefore(moment(second)) || moment(value).isSame(moment(second)))\n ) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'notbetween') {\n if (typeof first === 'number' && typeof second === 'number' && first && second) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value < first || value > second) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (\n moment(value).isBefore(moment(first)) ||\n moment(value).isAfter(moment(second))\n ) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'in') {\n if (value instanceof Array) {\n const f_list = new_value.filter(x => {\n return value.includes(x);\n });\n if (f_list.length > 0) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (typeof value == 'string' || typeof value == 'number' || isEmpty(value)) {\n // 数字 字符串 空\n const f = new_value.find(x => {\n return value == x;\n });\n if (f) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'eq') {\n if (value === first) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'contains') {\n if (value.toString().indexOf(first) > -1) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'startswith') {\n if (value.toString().startsWith(first)) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'notin') {\n if (value instanceof Array) {\n const f_list = new_value.filter(x => {\n return value.includes(x);\n });\n if (f_list.length > 0) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (typeof value == 'string' || typeof value == 'number' || isEmpty(value)) {\n // 数字 字符串 空\n const f = new_value.find(x => {\n return value == x;\n });\n if (!f) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'notcontains') {\n if (value.toString().indexOf(first) == -1) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == '_eq') {\n //todo\n } else if (item.operator == 'json_list_not_blank_not_null') {\n // 非空\n if (value) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'json_list_is_blank_is_null') {\n //为空\n if (!value) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'not_eq') {\n //为空\n if (!value) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'not_blank_not_null') {\n // 非空\n if (value) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n }\n condition_result_list.push(group_results);\n }\n const con_list = [];\n condition_result_list.forEach(item => {\n const find_false_list = item.filter(x => x === false);\n if (find_false_list && find_false_list.length > 0) {\n con_list.push(false);\n } else {\n con_list.push(true);\n }\n });\n\n const find_true_list = con_list.filter(x => x === true);\n if (find_true_list && find_true_list.length > 0) {\n is_show_field.value = true;\n emit('update:is_show_field', is_show_field.value);\n } else {\n is_show_field.value = false;\n emit('update:is_show_field', is_show_field.value);\n }\n if (is_show_field.value !== old_is_show_field) {\n if (is_show_field.value) {\n newModel.value[props.field.name] = null;\n emit('update_model', {\n add_key: props.field.name,\n value: null,\n });\n } else {\n delete newModel.value[props.field.name];\n emit('update_model', {\n remove_key: props.field.name,\n });\n }\n }\n }, 300);\n const model = ref<any>('');\n const labelModel = ref(props.label);\n watch(\n () => model.value,\n (newValue, oldValue) => {\n if (isEqual(newValue, oldValue)) {\n return;\n }\n emit('update:value', newValue);\n if (props.field.name2) {\n let label: any;\n if (props.field.type === 'radio') {\n const obj = props.options.find(\n (item: any) =>\n item[props.field.valueKey ? props.field.valueKey : 'value'] == newValue,\n );\n label = obj?.[props.field.labelKey ? props.field.labelKey : 'label'];\n } else if (props.field.type === 'checkbox' && newValue && newValue.length >= 0) {\n const list = [];\n props.options.forEach((item: any) => {\n newValue.forEach((item1: any) => {\n if (item1 == item?.[props.field.valueKey ? props.field.valueKey : 'value']) {\n list.push(item?.[props.field.labelKey ? props.field.labelKey : 'label']);\n }\n });\n });\n label = list.toString();\n } else if (props.field.type === 'select') {\n if (isArray(newValue)) {\n const list = [];\n props.options.forEach((item: any) => {\n newValue.forEach((item1: any) => {\n if (item1 == item?.[props.field.valueKey ? props.field.valueKey : 'value']) {\n list.push(item?.[props.field.labelKey ? props.field.labelKey : 'label']);\n }\n });\n });\n label = list.toString();\n } else {\n const obj = props.options.find(\n (item: any) =>\n item[props.field.valueKey ? props.field.valueKey : 'value'] == newValue,\n );\n label = obj?.[props.field.labelKey ? props.field.labelKey : 'label'];\n }\n }\n emit('update_name2', {\n key: props.field.name2,\n value: label,\n });\n }\n },\n { deep: true },\n );\n watch(\n () => props.value,\n newValue => {\n let value = newValue;\n if (props.field.type === 'rangepicker' && value) {\n value = rangeDate(value);\n } else if (props.field.type === 'input' && value) {\n value = value.toString().replace(/(^\\s*)|(\\s*$)/g, '');\n }\n if (is_show_field.value) {\n //当该表单项显示时,才做向上的数据绑定,避免把undefined向上传递,影响rules字段的有效过滤\n model.value = value;\n }\n },\n { immediate: true },\n );\n watch(\n () => labelModel.value,\n newValue => {\n emit('update:label', newValue);\n if ('name2' in props.field) {\n emit('update_name2', { key: props.field.name2, value: newValue.toString() });\n }\n },\n { deep: true },\n );\n watch(\n () => props.label,\n newValue => {\n labelModel.value = newValue;\n },\n );\n watch(\n () => props.formModel,\n newValue => {\n newModel.value = { ...newValue };\n },\n { deep: true },\n );\n watch(\n () => newModel.value,\n (newValue, oldValue) => {\n if (props.field?.conditions) {\n props.field?.conditions.forEach(condition_list => {\n condition_list.forEach(item => {\n if (oldValue[item.watchKey] != newValue[item.watchKey]) {\n check_visible_field_fun();\n }\n });\n });\n }\n },\n { deep: true },\n );\n watch(\n () => [props.conditionsVisibleNum, props.isUseConditions],\n () => {\n if (props.field?.conditions) {\n if (props.isUseConditions) {\n check_visible_field_fun();\n } else {\n is_show_field.value = true;\n emit('update:is_show_field', is_show_field.value);\n }\n } else {\n is_show_field.value = true;\n emit('update:is_show_field', is_show_field.value);\n }\n },\n );\n onMounted(() => {\n if (props.field?.conditions instanceof Array && props.field?.conditions.length > 0) {\n check_visible_field_fun();\n } else {\n is_show_field.value = true;\n emit('update:is_show_field', is_show_field.value);\n }\n if (!is_show_field.value) {\n // 表单项所见即所得,如果有隐藏的字段,那么model的key也要清除\n delete newModel.value[props.field.name];\n emit('update_model', {\n remove_key: props.field.name,\n });\n }\n });\n const { t } = useI18n();\n return {\n t,\n is_show_field,\n is_edit,\n handleToggleEdit,\n rangeDate,\n handleAdd,\n model,\n labelModel,\n };\n },\n components: {\n IconSelect,\n RichTextEditor,\n Upload,\n RemoteCascaderPro,\n RemoteTreeSelectPro,\n RemoteSelectPro,\n RemoteComplete,\n AttributeTable,\n AttributeNomTable,\n RemoteFilterSelect,\n RemoteModal,\n RemoteSelect,\n RemoteCascader,\n RemoteTreeSelect,\n RemoteTable,\n JsonStr,\n JsonObj,\n RemoteText,\n RemoteTablePro,\n PlusOutlined,\n MonthPicker,\n MonthRangePicker,\n CodeEditor,\n TinymceEditor,\n },\n});\n</script>\n\n<style scoped>\n.ant-calendar-picker {\n width: 100% !important;\n}\n</style>\n","<template>\n <template\n v-if=\"field.type !== 'divider' && (field?.is_search_show !== false || field_render_show)\"\n >\n <slot />\n <div\n v-if=\"field.type === 'kong'\"\n style=\"height: 62px; width: 200px\"\n ></div>\n <!-- 展示内容-->\n <div v-if=\"field.type === 'tag'\">\n <a-tag\n :color=\"field.color ? field.color(field, model) : 'green'\"\n :style=\"field.style\"\n v-if=\"(field.content && field.content(field, model)) || model\"\n @click=\"field.cb ? field.cb(field, model) : ''\"\n >\n <span v-if=\"field.content\">\n {{ field.content(field, model) }}\n </span>\n <span v-else>{{ model }}</span>\n </a-tag>\n </div>\n <!-- 表单占位组件-->\n <!-- 默认 【表单空位 高62px; 名称空位 高30px;】 如遇个别特殊表单,根据实际情况自行调节 高度-->\n <!-- height 属性必填-->\n <div\n v-if=\"field.type === 'kong_title'\"\n :style=\"'height: ' + field.height + 'px'\"\n ></div>\n <div\n v-if=\"field.type === 'title'\"\n style=\"height: 30px; position: relative\"\n >\n <span\n style=\"\n position: absolute;\n bottom: 0;\n padding: 0;\n margin: 0;\n font-weight: bolder;\n font-size: 17px;\n \"\n >\n {{ field.name }}\n </span>\n </div>\n <a-rate\n v-if=\"field.type === 'rate'\"\n v-model:value=\"model\"\n :disabled=\"field.disabled\"\n allow-half\n :style=\"`width: ${field_width}px`\"\n />\n <a-input\n v-if=\"field.type === 'input'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear == undefined ? true : field.allowClear\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :maxlength=\"field.maxlength\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请输入') + field.label\"\n :type=\"field.inputType ? field.inputType : 'text'\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <template\n v-if=\"field?.prefix || field?.prefixIcon\"\n #prefix\n >\n <span v-if=\"field?.prefix\">{{ field.prefix }}</span>\n <component\n v-if=\"field?.prefixIcon\"\n :is=\"field?.prefixIcon\"\n />\n </template>\n <template\n v-if=\"field?.suffix || field?.suffixIcon\"\n #suffix\n >\n <span v-if=\"field?.suffix\">{{ field.suffix }}</span>\n <component\n v-if=\"field?.suffixIcon\"\n :is=\"field?.suffixIcon\"\n />\n </template>\n <template\n v-if=\"field?.addonBefore || field?.addonBeforeIcon\"\n #addonBefore\n >\n <span v-if=\"field?.addonBefore\">{{ field.addonBefore }}</span>\n <component\n v-if=\"field?.addonBeforeIcon\"\n :is=\"field?.addonBeforeIcon\"\n />\n </template>\n <template\n v-if=\"field?.addonAfter || field?.addonAfterIcon\"\n #addonAfter\n >\n <span v-if=\"field?.addonAfter\">{{ field.addonAfter }}</span>\n <component\n v-if=\"field?.addonAfterIcon\"\n :is=\"field?.addonAfterIcon\"\n />\n </template>\n </a-input>\n\n <a-input-number\n v-if=\"field.type === 'money'\"\n size=\"small\"\n v-model:value=\"model\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :disabled=\"field.disabled\"\n :default-value=\"field.defaultValue\"\n :min=\"field.min\"\n :max=\"field.max\"\n :formatter=\"value => `${value}`.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\"\n :precision=\"field.precision\"\n :step=\"field.step\"\n :placeholder=\"\n field.placeholder_i18n == undefined ? field.placeholder : t(field.placeholder_i18n)\n \"\n :style=\"`width: ${field_width}px`\"\n />\n <a-input-number\n v-if=\"field.type === 'number'\"\n v-model:value=\"model\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :formatter=\"field.formatter\"\n :max=\"field.max\"\n :min=\"field.min\"\n :placeholder=\"field.placeholder ? field.placeholder : '请输入' + field.label\"\n :precision=\"field.precision\"\n :step=\"field.step\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <template\n v-if=\"field?.prefix || field?.prefixIcon\"\n #prefix\n >\n <span v-if=\"field?.prefix\">{{ field.prefix }}</span>\n <component\n v-if=\"field?.prefixIcon\"\n :is=\"field?.prefixIcon\"\n />\n </template>\n <template\n v-if=\"field?.suffix || field?.suffixIcon\"\n #suffix\n >\n <span v-if=\"field?.suffix\">{{ field.suffix }}</span>\n <component\n v-if=\"field?.suffixIcon\"\n :is=\"field?.suffixIcon\"\n />\n </template>\n <template\n v-if=\"field?.addonBefore || field?.addonBeforeIcon\"\n #addonBefore\n >\n <span v-if=\"field?.addonBefore\">{{ field.addonBefore }}</span>\n <component\n v-if=\"field?.addonBeforeIcon\"\n :is=\"field?.addonBeforeIcon\"\n />\n </template>\n <template\n v-if=\"field?.addonAfter || field?.addonAfterIcon\"\n #addonAfter\n >\n <span v-if=\"field?.addonAfter\">{{ field.addonAfter }}</span>\n <component\n v-if=\"field?.addonAfterIcon\"\n :is=\"field?.addonAfterIcon\"\n />\n </template>\n </a-input-number>\n\n <template v-if=\"field.type === 'select'\">\n <a-select\n v-if=\"field.mode === 'default'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :dropdownMatchSelectWidth=\"false\"\n :maxTagCount=\"field.maxTagCount ? field.maxTagCount : 'responsive'\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :show-search=\"!!field.show_search\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <a-select-option\n v-for=\"option in options\"\n :key=\"option[field.valueKey ? field.valueKey : 'value']\"\n :value=\"option[field.valueKey ? field.valueKey : 'value']\"\n >\n {{ option[field.labelKey ? field.labelKey : 'label'] }}\n </a-select-option>\n </a-select>\n <a-select\n v-else\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :dropdownMatchSelectWidth=\"false\"\n :maxTagCount=\"field.maxTagCount ? field.maxTagCount : 'responsive'\"\n :mode=\"field.mode\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :show-search=\"!!field.show_search\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <a-select-option\n v-for=\"(option, index) in options\"\n :key=\"index\"\n :value=\"option[field.valueKey ? field.valueKey : 'value']\"\n >\n {{ option[field.labelKey ? field.labelKey : 'label'] }}\n </a-select-option>\n </a-select>\n </template>\n <template v-if=\"field.type === 'groupselect'\">\n <a-select\n v-if=\"field.mode === 'default'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :dropdownMatchSelectWidth=\"false\"\n :getPopupContainer=\"field.getPopupContainer == undefined ? null : field.getPopupContainer\"\n :labelInValue=\"field.labelInValue === true\"\n :maxTagCount=\"field.maxTagCount ? field.maxTagCount : 'responsive'\"\n :options=\"options\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :show-search=\"!!field.show_search\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n ></a-select>\n <a-select\n v-else\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :dropdownMatchSelectWidth=\"false\"\n :getPopupContainer=\"field.getPopupContainer == undefined ? null : field.getPopupContainer\"\n :labelInValue=\"field.labelInValue === true\"\n :maxTagCount=\"field.maxTagCount ? field.maxTagCount : 'responsive'\"\n :mode=\"field.mode\"\n :options=\"options\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :show-search=\"!!field.show_search\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n ></a-select>\n </template>\n\n <a-cascader\n v-if=\"field.type === 'cascader'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :multiple=\"field.multiple\"\n :show-search=\"field.show_search\"\n :changeOnSelect=\"field.changeOnSelect ? field.changeOnSelect : false\"\n :options=\"field.getOptionsData ? field.getOptionsData(options, model) : options\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n\n <remote-cascader\n v-if=\"field.type === 'remotecascader'\"\n v-model:value=\"model\"\n v-model:label=\"labelModel\"\n :field=\"field\"\n :formModel=\"formModel\"\n :get-data=\"field.getData\"\n :label-key=\"field.labelKey\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-cascader-pro\n v-if=\"field.type === 'remotecascaderpro'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :field=\"field\"\n :formModel=\"formModel\"\n :outModel=\"outModel\"\n :get-data=\"field.getData\"\n :multiple=\"field.multiple\"\n :maxTagCount=\"field.maxTagCount ? field.maxTagCount : 'responsive'\"\n :show_search=\"field.show_search\"\n :label-key-type=\"field.labelKeyType\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :label-key=\"field.labelKey\"\n :value-key=\"field.valueKey\"\n :init_model=\"field.init_model\"\n :init_watch=\"field.init_watch\"\n :is_form_design=\"is_form_design\"\n :placeholder=\"\n field.placeholder_i18n == undefined\n ? field.placeholder\n ? field.placeholder\n : t('请选择') + field.label\n : t(field.placeholder_i18n)\n \"\n :style=\"`width: ${field_width}px`\"\n />\n\n <month-picker\n v-if=\"field.type === 'monthpicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n size=\"small\"\n :is_range=\"field.is_range\"\n :value_has_time=\"field.value_has_time\"\n :start_offset_day=\"field.start_offset_day\"\n :end_offset_day=\"field.end_offset_day\"\n :fix_day=\"field.fix_day\"\n :style=\"`width: ${field_width}px`\"\n />\n <a-date-picker\n v-if=\"field.type === 'datepicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :autocomplete=\"field.autocomplete == undefined ? 'off' : field.autocomplete\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :format=\"field.format\"\n :picker=\"field.picker\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :show-time=\"field.showTime\"\n :value-format=\"field.valueFormat\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n\n <a-range-picker\n v-if=\"field.type === 'rangepicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue || []\"\n :disabled=\"field.disabled\"\n :format=\"field.format\"\n :placeholder=\"\n field.placeholder && isArray(field.placeholder) && field.placeholder.length > 0\n ? field.placeholder\n : [$t('开始时间'), $t('结束时间')]\n \"\n :show-time=\"field.showTime\"\n :value-format=\"field.valueFormat\"\n :picker=\"field.picker ? field.picker : 'date'\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n\n <month-range-picker\n v-if=\"field.type === 'monthrangepicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue || []\"\n :disabled=\"field.disabled\"\n :placeholder=\"field.placeholder\"\n size=\"small\"\n :is_range=\"field.is_range\"\n :value_has_time=\"field.value_has_time\"\n :start_offset_day=\"field.start_offset_day\"\n :end_offset_day=\"field.end_offset_day\"\n :fix_day=\"field.fix_day\"\n :style=\"`width: ${field_width}px`\"\n />\n\n <a-time-picker\n v-if=\"field.type === 'timepicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :format=\"field.format ? field.format : 'HH:mm'\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :value-format=\"field.valueFormat ? field.valueFormat : 'HH:mm'\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n <a-time-range-picker\n v-if=\"field.type === 'timerangepicker'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :format=\"field.format ? field.format : 'HH:mm'\"\n :placeholder=\"\n field.placeholder && isArray(field.placeholder) && field.placeholder.length > 0\n ? field.placeholder\n : [$t('开始时间'), $t('结束时间')]\n \"\n :value-format=\"field.valueFormat ? field.valueFormat : 'HH:mm'\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n <a-radio-group\n v-if=\"field.type === 'radio'\"\n v-model:value=\"model\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <a-radio\n v-for=\"option in options\"\n :key=\"option[field.valueKey ? field.valueKey : 'value']\"\n :disabled=\"option.disabled\"\n :value=\"option[field.valueKey ? field.valueKey : 'value']\"\n >\n {{ option[field.labelKey ? field.labelKey : 'label'] }}\n </a-radio>\n </a-radio-group>\n\n <a-checkbox-group\n v-if=\"field.type === 'checkbox'\"\n v-model:value=\"model\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <a-checkbox\n v-for=\"option in options\"\n :key=\"option[field.valueKey ? field.valueKey : 'value']\"\n :disabled=\"option.disabled\"\n :value=\"option[field.valueKey ? field.valueKey : 'value']\"\n >\n {{ option[field.labelKey ? field.labelKey : 'label'] }}\n </a-checkbox>\n </a-checkbox-group>\n\n <a-tree-select\n v-if=\"field.type === 'treeselect'\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :dropdownMatchSelectWidth=\"false\"\n :placeholder=\"field.placeholder ? field.placeholder : $t('请选择') + field.label\"\n :multiple=\"field.multiple\"\n :tree-checkable=\"field.treeCheckable\"\n :tree-data=\"options\"\n :tree-label-prop=\"field.labelKey\"\n :tree-node-filter-prop=\"field.valueKey\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-filter-select\n v-if=\"field.type === 'remotefilterselect'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :field=\"field\"\n :formModel=\"formModel\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :label-key=\"field.labelKey\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-select\n v-if=\"field.type === 'remoteselect'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :field=\"field\"\n :formModel=\"formModel\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :label-key=\"field.labelKey\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-select-pro\n v-if=\"field.type === 'remoteselectpro'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :field=\"field\"\n :formModel=\"formModel\"\n :outModel=\"outModel\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :init_watch=\"field.init_watch\"\n :label-key=\"field.labelKey\"\n :label-key-type=\"field.labelKeyType\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :is_input=\"field.is_input\"\n :is_form_design=\"is_form_design\"\n :placeholder=\"\n field.placeholder_i18n == undefined\n ? field.placeholder\n ? field.placeholder\n : $t('请选择') + field.label\n : t(field.placeholder_i18n)\n \"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-complete\n v-if=\"field.type === 'remotecomplete'\"\n v-model:value=\"model\"\n :field=\"field\"\n :formModel=\"formModel\"\n :outModel=\"outModel\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :init_watch=\"field.init_watch\"\n :label-key=\"field.labelKey\"\n :label-key-type=\"field.labelKeyType\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :maxlength=\"field.maxlength\"\n :is_input=\"field.is_input\"\n :is_form_design=\"is_form_design\"\n :placeholder=\"\n field.placeholder_i18n == undefined\n ? field.placeholder\n ? field.placeholder\n : $t('请选择') + field.label\n : t(field.placeholder_i18n)\n \"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-tree-select\n v-if=\"field.type === 'remotetreeselect'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :field=\"field\"\n :formModel=\"formModel\"\n :get-data=\"field.getData\"\n :label-key=\"field.labelKey\"\n :search_config=\"field.search_config\"\n :value-key=\"field.valueKey\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-tree-select-pro\n v-if=\"field.type === 'remotetreeselectpro'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :allow-clear=\"field.allowClear\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n :field=\"field\"\n :formModel=\"formModel\"\n :outModel=\"outModel\"\n :get-data=\"field.getData\"\n :multiple=\"field.multiple\"\n :search_config=\"field.search_config\"\n :label-key-type=\"field.labelKeyType\"\n :label-key-list=\"field.labelKeyList\"\n :label-space=\"field.labelSpace\"\n :label-key=\"field.labelKey\"\n :value-key=\"field.valueKey\"\n :init_model=\"field.init_model\"\n :init_watch=\"field.init_watch\"\n :is_form_design=\"is_form_design\"\n :placeholder=\"\n field.placeholder_i18n == undefined\n ? field.placeholder\n ? field.placeholder\n : $t('请选择') + field.label\n : t(field.placeholder_i18n)\n \"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-modal\n v-if=\"field.type === 'remotemodal'\"\n v-model:label=\"labelModel\"\n v-model:value=\"model\"\n :columns=\"field.columns\"\n :field=\"field\"\n :field_status=\"field.field_status\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :modalType=\"field.modalType\"\n :search_config=\"field.search_config\"\n :watch=\"field.watch\"\n :style=\"`width: ${field_width}px`\"\n />\n <remote-table\n v-if=\"field.type === 'remotetable'\"\n v-model:value=\"model\"\n :columns=\"field.columns\"\n :formModel=\"formModel\"\n :field=\"field\"\n :field_status=\"field.field_status\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :modalType=\"field.modalType\"\n :search_config=\"field.search_config\"\n :watch=\"field.watch\"\n :style=\"`width: ${field_width}px`\"\n />\n\n <remote-text\n v-if=\"field.type === 'remotetext'\"\n v-model:value=\"model\"\n :columns=\"field.columns\"\n :formModel=\"formModel\"\n :field=\"field\"\n :get-data=\"field.getData\"\n :init_model=\"field.init_model\"\n :modalType=\"field.modalType\"\n :search_config=\"field.search_config\"\n :watch=\"field.watch\"\n />\n\n <a-rate\n v-if=\"field.type === 'rate'\"\n v-model:value=\"model\"\n :count=\"field.count ? field.count : 5\"\n :allow-half=\"field.allowHalf\"\n :style=\"`width: ${field_width}px`\"\n />\n <a-radio-group\n v-if=\"field.type === 'radio-color'\"\n v-model:value=\"model\"\n :default-value=\"field.defaultValue\"\n :disabled=\"field.disabled\"\n size=\"small\"\n :style=\"`width: ${field_width}px`\"\n >\n <a-radio\n v-for=\"option in options\"\n :key=\"option[field.valueKey ? field.valueKey : 'value']\"\n :disabled=\"option.disabled\"\n :value=\"option[field.valueKey ? field.valueKey : 'value']\"\n >\n <div\n :style=\"{\n width: '20px',\n height: '20px',\n backgroundColor: option[field.valueKey ? field.valueKey : 'value'],\n }\"\n ></div>\n </a-radio>\n </a-radio-group>\n </template>\n\n <a-divider\n v-if=\"field.type === 'divider'\"\n :orientation=\"field.orientation\"\n >\n {{ field.label }}\n </a-divider>\n</template>\n<script lang=\"ts\">\nimport RemoteSelect from 'liyu-pc-base/components/FormRender/RemoteSelect/RemoteSelect.vue';\nimport RemoteCascader from 'liyu-pc-base/components/FormRender/RemoteCascader/RemoteCascader.vue';\nimport RemoteModal from 'liyu-pc-base/components/FormRender/RemoteModal/RemoteModal.vue';\nimport RemoteTreeSelect from 'liyu-pc-base/components/FormRender/RemoteTreeSelect/RemoteTreeSelect.vue';\nimport RemoteTable from 'liyu-pc-base/components/FormRender/RemoteTable/RemoteTable.vue';\nimport { defineComponent, watch, onMounted, ref } from 'vue';\nimport RemoteFilterSelect from 'liyu-pc-base/components/FormRender/RemoteFilterSelect/RemoteFilterSelect.vue';\nimport AttributeNomTable from 'liyu-pc-base/components/FormRender/AttributeNomTable/index.vue';\nimport AttributeTable from 'liyu-pc-base/components/FormRender/AttributeTable/index.vue';\nimport JsonStr from 'liyu-pc-base/components/FormRender/JsonStr/index.vue';\nimport JsonObj from 'liyu-pc-base/components/FormRender/JsonObj/index.vue';\nimport RemoteText from 'liyu-pc-base/components/FormRender/RemoteText/RemoteText.vue';\nimport RemoteTablePro from 'liyu-pc-base/components/FormRender/RemoteTablePro/RemoteTablePro.vue';\nimport { debounce, isArray, isEqual } from 'lodash-es';\nimport moment from 'moment';\nimport { isEmpty, isNotEmpty } from 'liyu-pc-base/utils/function';\nimport { PlusOutlined } from '@ant-design/icons-vue';\nimport RemoteSelectPro from 'liyu-pc-base/components/FormRender/RemoteSelectPro/RemoteSelectPro.vue';\nimport RemoteComplete from 'liyu-pc-base/components/FormRender/RemoteComplete/RemoteComplete.vue';\nimport RemoteTreeSelectPro from 'liyu-pc-base/components/FormRender/RemoteTreeSelectPro/RemoteTreeSelectPro.vue';\nimport RemoteCascaderPro from 'liyu-pc-base/components/FormRender/RemoteCascaderPro/RemoteCascaderPro.vue';\nimport Upload from 'liyu-pc-base/components/FormRender/Upload/upload.vue';\nimport RichTextEditor from 'liyu-pc-base/components/FormRender/RichTextEditor/index.vue';\nimport { useI18n } from 'vue-i18n';\nimport IconSelect from 'liyu-pc-base/components/FormRender/iconSelect/index.vue';\nimport MonthPicker from 'liyu-pc-base/components/FormRender/MonthPicker/index.vue';\nimport MonthRangePicker from 'liyu-pc-base/components/FormRender/MonthRangePicker/index.vue';\nimport CodeEditor from 'liyu-pc-base/components/code/CodeEditor.vue';\nimport TinymceEditor from 'liyu-pc-base/components/tinymce/TinymceEditor.vue';\n\nconst isValidDate = (dateString, format = 'YYYY-MM-DD') => {\n const date = moment(dateString, format, true);\n return date.isValid();\n};\nconst isValidDateTime = (dateString, format = 'YYYY-MM-DD HH:mm:ss') => {\n const date = moment(dateString, format, true);\n return date.isValid();\n};\nconst isValidTime = (dateString, format = 'HH:mm:ss') => {\n const date = moment(dateString, format, true);\n return date.isValid();\n};\nexport default defineComponent({\n name: 'FieldRender2',\n methods: { isArray },\n props: {\n field: {\n type: Object,\n required: true,\n },\n value: {\n required: true,\n },\n label: {\n required: false,\n },\n options: {\n type: Array,\n default: () => [],\n },\n validateInfos: {\n type: Object,\n default: () => {},\n },\n formModel: {\n type: Object,\n default: () => {},\n },\n outModel: {\n type: Object,\n default: () => {},\n },\n field_render_show: {\n type: Boolean,\n default: true,\n },\n is_show_label: {\n type: Boolean,\n default: true,\n },\n isUseConditions: {\n type: Boolean,\n default: true,\n },\n is_show_field: {\n type: Boolean,\n default: true,\n },\n is_edit: {\n type: Boolean,\n default: true,\n },\n conditionsVisibleNum: {\n type: Number,\n default: 0,\n },\n is_form_design: {\n type: Boolean,\n default: false,\n },\n field_width: {\n type: Number,\n default: 150,\n },\n },\n emits: [\n 'add',\n 'update:value',\n 'update:label',\n 'update_model',\n 'update:is_show_field',\n 'update:is_edit',\n 'update_name2',\n ],\n setup(props, { emit }) {\n const newModel = ref({ ...props.formModel });\n const rangeDate = (v: any) => {\n if (typeof v == 'string' && v.indexOf(',') >= 0) {\n return v.split(',');\n }\n return v;\n };\n const convertValueByClassName = (value, class_name) => {\n //class_name 'int','float',str','bool','date','datetime','time'\n let new_value;\n if (class_name == 'int') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isNotEmpty(item) && typeof item === 'string') {\n new_value.push(Number(item));\n } else {\n new_value.push(item);\n }\n });\n } else if (isNotEmpty(value) && typeof value === 'string') {\n new_value = Number(value);\n } else {\n new_value = value;\n }\n } else if (class_name == 'str') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isNotEmpty(item) && typeof item === 'number') {\n new_value.push(item.toString());\n } else {\n new_value.push(item);\n }\n });\n } else if (isNotEmpty(value) && typeof value === 'number') {\n new_value = value.toString();\n } else {\n new_value = value;\n }\n } else if (class_name == 'date') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isValidDate(item) && typeof item === 'string') {\n new_value.push(moment(item, 'YYYY-MM-DD'));\n } else {\n new_value.push(item);\n }\n });\n } else if (isValidDate(value) && typeof value === 'string') {\n new_value = value.toString();\n } else {\n new_value = value;\n }\n } else if (class_name == 'datetime') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isValidDateTime(item) && typeof item === 'string') {\n new_value.push(moment(item, 'YYYY-MM-DD HH:mm:ss'));\n } else {\n new_value.push(item);\n }\n });\n } else if (isValidDateTime(value) && typeof value === 'string') {\n new_value = moment(value, 'YYYY-MM-DD HH:mm:ss');\n } else {\n new_value = value;\n }\n } else if (class_name == 'time') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isValidTime(item) && typeof item === 'string') {\n new_value.push(moment(item, 'HH:mm:ss'));\n } else {\n new_value.push(item);\n }\n });\n } else if (isValidTime(value) && typeof value === 'string') {\n new_value = moment(value, 'HH:mm:ss');\n } else {\n new_value = value;\n }\n } else if (class_name == 'float') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isNotEmpty(item) && typeof item === 'string') {\n new_value.push(Number(item));\n } else {\n new_value.push(item);\n }\n });\n } else if (isNotEmpty(value) && typeof value === 'string') {\n new_value = Number(value);\n } else {\n new_value = value;\n }\n } else if (class_name == 'bool') {\n if (isNotEmpty(value) && value instanceof Array) {\n new_value = [];\n value.forEach(item => {\n if (isNotEmpty(item) && typeof item === 'string') {\n new_value.push(Boolean(item));\n } else {\n new_value.push(item);\n }\n });\n } else if (isNotEmpty(value) && typeof value === 'string') {\n new_value = Boolean(value);\n } else {\n new_value = value;\n }\n }\n return new_value;\n };\n const is_show_field = ref(props.is_show_field);\n const is_edit = ref(false);\n const handleToggleEdit = () => {\n emit('update:is_edit', is_edit.value);\n };\n const handleAdd = () => {\n emit('add');\n };\n const check_visible_field_fun = debounce(() => {\n const old_is_show_field = is_show_field.value;\n const condition_result_list: any = [];\n for (const i in props.field?.conditions) {\n const group_list = props.field?.conditions[i];\n const group_results = [];\n for (const j in group_list) {\n const item = group_list[j];\n const value = props.formModel[item.watchKey];\n let new_value;\n if (item.class_name) {\n new_value = convertValueByClassName(item.value, item.class_name);\n } else {\n new_value = item.value;\n }\n let first, second;\n if (new_value instanceof Array) {\n [first, second] = new_value;\n }\n if (item.operator == 'lt') {\n if (typeof first === 'number') {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value < first) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (moment(value).isBefore(moment(first))) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'lte') {\n if (typeof first === 'number') {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value <= first) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (\n moment(value).isBefore(moment(first)) ||\n moment(value).isSame(moment(first))\n ) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'gt') {\n if (typeof first === 'number') {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value > first) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (moment(value).isAfter(moment(first))) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'gte') {\n if (typeof first === 'number') {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value >= first) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (\n moment(value).isAfter(moment(first)) ||\n moment(value).isSame(moment(first))\n ) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'between') {\n if (typeof first === 'number' && typeof second === 'number' && first && second) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value >= first && value <= second) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (\n (moment(value).isAfter(moment(first)) || moment(value).isSame(moment(first))) &&\n (moment(value).isBefore(moment(second)) || moment(value).isSame(moment(second)))\n ) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'notbetween') {\n if (typeof first === 'number' && typeof second === 'number' && first && second) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (value < first || value > second) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (isValidDate(first)) {\n if (isEmpty(value)) {\n group_results.push(false);\n } else if (\n moment(value).isBefore(moment(first)) ||\n moment(value).isAfter(moment(second))\n ) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'in') {\n if (value instanceof Array) {\n const f_list = new_value.filter(x => {\n return value.includes(x);\n });\n if (f_list.length > 0) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (typeof value == 'string' || typeof value == 'number' || isEmpty(value)) {\n // 数字 字符串 空\n const f = new_value.find(x => {\n return value == x;\n });\n if (f) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'eq') {\n if (value === first) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'contains') {\n if (value.toString().indexOf(first) > -1) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'startswith') {\n if (value.toString().startsWith(first)) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'notin') {\n if (value instanceof Array) {\n const f_list = new_value.filter(x => {\n return value.includes(x);\n });\n if (f_list.length > 0) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (typeof value == 'string' || typeof value == 'number' || isEmpty(value)) {\n // 数字 字符串 空\n const f = new_value.find(x => {\n return value == x;\n });\n if (!f) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n } else if (item.operator == 'notcontains') {\n if (value.toString().indexOf(first) == -1) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == '_eq') {\n //todo\n } else if (item.operator == 'json_list_not_blank_not_null') {\n // 非空\n if (value) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'json_list_is_blank_is_null') {\n //为空\n if (!value) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'not_eq') {\n //为空\n if (!value) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n } else if (item.operator == 'not_blank_not_null') {\n // 非空\n if (value) {\n group_results.push(true);\n } else {\n group_results.push(false);\n }\n }\n }\n condition_result_list.push(group_results);\n }\n const con_list = [];\n condition_result_list.forEach(item => {\n const find_false_list = item.filter(x => x === false);\n if (find_false_list && find_false_list.length > 0) {\n con_list.push(false);\n } else {\n con_list.push(true);\n }\n });\n\n const find_true_list = con_list.filter(x => x === true);\n if (find_true_list && find_true_list.length > 0) {\n is_show_field.value = true;\n emit('update:is_show_field', is_show_field.value);\n } else {\n is_show_field.value = false;\n emit('update:is_show_field', is_show_field.value);\n }\n if (is_show_field.value !== old_is_show_field) {\n if (is_show_field.value) {\n newModel.value[props.field.name] = null;\n emit('update_model', {\n add_key: props.field.name,\n value: null,\n });\n } else {\n delete newModel.value[props.field.name];\n emit('update_model', {\n remove_key: props.field.name,\n });\n }\n }\n }, 300);\n const model = ref<any>('');\n const labelModel = ref(props.label);\n watch(\n () => model.value,\n (newValue, oldValue) => {\n if (isEqual(newValue, oldValue)) {\n return;\n }\n emit('update:value', newValue);\n if (props.field.name2) {\n let label: any;\n if (props.field.type === 'radio') {\n const obj = props.options.find(\n (item: any) =>\n item[props.field.valueKey ? props.field.valueKey : 'value'] == newValue,\n );\n label = obj?.[props.field.labelKey ? props.field.labelKey : 'label'];\n } else if (props.field.type === 'checkbox' && newValue && newValue.length >= 0) {\n const list = [];\n props.options.forEach((item: any) => {\n newValue.forEach((item1: any) => {\n if (item1 == item?.[props.field.valueKey ? props.field.valueKey : 'value']) {\n list.push(item?.[props.field.labelKey ? props.field.labelKey : 'label']);\n }\n });\n });\n label = list.toString();\n } else if (props.field.type === 'select') {\n if (isArray(newValue)) {\n const list = [];\n props.options.forEach((item: any) => {\n newValue.forEach((item1: any) => {\n if (item1 == item?.[props.field.valueKey ? props.field.valueKey : 'value']) {\n list.push(item?.[props.field.labelKey ? props.field.labelKey : 'label']);\n }\n });\n });\n label = list.toString();\n } else {\n const obj = props.options.find(\n (item: any) =>\n item[props.field.valueKey ? props.field.valueKey : 'value'] == newValue,\n );\n label = obj?.[props.field.labelKey ? props.field.labelKey : 'label'];\n }\n }\n emit('update_name2', {\n key: props.field.name2,\n value: label,\n });\n }\n },\n { deep: true },\n );\n watch(\n () => props.value,\n newValue => {\n let value = newValue;\n if (props.field.type === 'rangepicker' && value) {\n value = rangeDate(value);\n } else if (props.field.type === 'input' && value) {\n value = value.toString().replace(/(^\\s*)|(\\s*$)/g, '');\n }\n if (is_show_field.value) {\n //当该表单项显示时,才做向上的数据绑定,避免把undefined向上传递,影响rules字段的有效过滤\n model.value = value;\n }\n },\n { immediate: true },\n );\n watch(\n () => labelModel.value,\n newValue => {\n emit('update:label', newValue);\n if ('name2' in props.field) {\n emit('update_name2', { key: props.field.name2, value: newValue.toString() });\n }\n },\n { deep: true },\n );\n watch(\n () => props.label,\n newValue => {\n labelModel.value = newValue;\n },\n );\n watch(\n () => props.formModel,\n newValue => {\n newModel.value = { ...newValue };\n },\n { deep: true },\n );\n watch(\n () => newModel.value,\n (newValue, oldValue) => {\n if (props.field?.conditions) {\n props.field?.conditions.forEach(condition_list => {\n condition_list.forEach(item => {\n if (oldValue[item.watchKey] != newValue[item.watchKey]) {\n check_visible_field_fun();\n }\n });\n });\n }\n },\n { deep: true },\n );\n watch(\n () => [props.conditionsVisibleNum, props.isUseConditions],\n () => {\n if (props.field?.conditions) {\n if (props.isUseConditions) {\n check_visible_field_fun();\n } else {\n is_show_field.value = true;\n emit('update:is_show_field', is_show_field.value);\n }\n } else {\n is_show_field.value = true;\n emit('update:is_show_field', is_show_field.value);\n }\n },\n );\n onMounted(() => {\n if (props.field?.conditions instanceof Array && props.field?.conditions.length > 0) {\n check_visible_field_fun();\n } else {\n is_show_field.value = true;\n emit('update:is_show_field', is_show_field.value);\n }\n if (!is_show_field.value) {\n // 表单项所见即所得,如果有隐藏的字段,那么model的key也要清除\n delete newModel.value[props.field.name];\n emit('update_model', {\n remove_key: props.field.name,\n });\n }\n });\n const { t } = useI18n();\n return {\n t,\n is_show_field,\n is_edit,\n handleToggleEdit,\n rangeDate,\n handleAdd,\n model,\n labelModel,\n };\n },\n components: {\n IconSelect,\n RichTextEditor,\n Upload,\n RemoteCascaderPro,\n RemoteTreeSelectPro,\n RemoteSelectPro,\n RemoteComplete,\n AttributeTable,\n AttributeNomTable,\n RemoteFilterSelect,\n RemoteModal,\n RemoteSelect,\n RemoteCascader,\n RemoteTreeSelect,\n RemoteTable,\n JsonStr,\n JsonObj,\n RemoteText,\n RemoteTablePro,\n PlusOutlined,\n MonthPicker,\n MonthRangePicker,\n CodeEditor,\n TinymceEditor,\n },\n});\n</script>\n\n<style scoped>\n.ant-calendar-picker {\n width: 100% !important;\n}\n</style>\n","import { useRequest } from 'liyu-pc-base/init-plugin';\nimport type { PageResult } from 'liyu-pc-base/api/typing';\n\nexport async function create_view_settings(params: Record<string, any>) {\n return useRequest().post('/view/create_view_settings', params);\n}\n\nexport async function update_view_settings(params: Record<string, any>) {\n return useRequest().post('/view/update_view_settings', params);\n}\n\nexport async function refresh_view_settings_cache(params: Record<string, any>) {\n return useRequest().post('/view/refresh_view_settings_cache', params);\n}\n\nexport async function set_view_settings_default(params: Record<string, any>) {\n return useRequest().post('/view/set_view_settings_default', params);\n}\n\nexport async function delete_view_settings(params: Record<string, any>) {\n return useRequest().post('/view/delete_view_settings', params);\n}\n\nexport async function recover_view_settings(params: Record<string, any>) {\n return useRequest().post('/view/recover_view_settings', params);\n}\n\nexport async function get_view_settings(params: Record<string, any>) {\n return useRequest().post('/view/get_view_settings', params);\n}\n\nexport async function create_user_view(params: Record<string, any>) {\n return useRequest().post('/view/create_user_view', params);\n}\n\nexport async function update_user_view(params: Record<string, any>) {\n return useRequest().post('/view/update_user_view', params);\n}\n\nexport async function delete_user_view(params: Record<string, any>) {\n return useRequest().post('/view/delete_user_view', params);\n}\n\nexport async function recover_user_view(params: Record<string, any>) {\n return useRequest().post('/view/recover_user_view', params);\n}\n\nexport async function get_user_view(params: Record<string, any>) {\n return useRequest().post('/view/get_user_view', params);\n}\n\nexport async function get_view_settings_for_user(params: Record<string, any>) {\n return useRequest().post('/view/get_view_settings_for_user', params);\n}\n\nexport async function change_view_settings_sort(params: Record<string, any>) {\n return useRequest().post('/view/change_view_settings_sort', params);\n}\n\nexport async function query_view_settings_list(params?: {\n [key: string]: any;\n}): Promise<PageResult> {\n return useRequest().post('/view/query_view_settings_list', params);\n}\n\nexport async function query_user_view_list(params?: { [key: string]: any }): Promise<PageResult> {\n return useRequest().post('/view/query_user_view_list', params);\n}\n","import type { Ref, ComponentPublicInstance } from 'vue';\n\nexport type BasicTarget<T = HTMLElement> = (() => T | null) | T | null | Ref<T | null | undefined>;\n\nexport type TargetElement = ComponentPublicInstance | HTMLElement | Element | Document | Window;\n\nexport function getTargetElement(\n target?: BasicTarget<TargetElement>,\n defaultElement?: TargetElement,\n): TargetElement | undefined | null {\n if (!target) {\n return defaultElement;\n }\n\n let targetElement: TargetElement | undefined | null;\n\n if (typeof target === 'function') {\n targetElement = target();\n } else if ('value' in target) {\n targetElement = (target.value as ComponentPublicInstance)?.$el;\n } else {\n targetElement = target;\n }\n\n return targetElement;\n}\n","import type { Ref, ComponentPublicInstance } from 'vue';\nimport { ref, onUnmounted } from 'vue';\nimport { getTargetElement } from 'liyu-pc-base/utils/dom';\nimport { default as screenfull } from 'screenfull';\n\nexport interface Options {\n onExitFull?: () => void;\n onFull?: () => void;\n}\n\nexport type UseFullscreen = readonly [\n Ref<ComponentPublicInstance | null>,\n Ref<boolean>,\n {\n setFull: () => void;\n exitFull: () => void;\n toggleFull: () => void;\n },\n];\n\nexport const useFullscreen = (options?: Options): UseFullscreen => {\n const { onExitFull, onFull } = options || {};\n const elRef = ref<ComponentPublicInstance | null>(null);\n const onExitFullRef = ref(onExitFull);\n const onFullRef = ref(onFull);\n\n const state = ref(false);\n\n const onChange = () => {\n if (screenfull.isEnabled) {\n const { isFullscreen } = screenfull;\n if (isFullscreen) {\n onFullRef.value && onFullRef.value();\n } else {\n screenfull.off('change', onChange);\n onExitFullRef.value && onExitFullRef.value();\n }\n state.value = isFullscreen;\n }\n };\n\n const setFull = () => {\n const el = getTargetElement(elRef);\n if (!el) {\n return;\n }\n if (screenfull.isEnabled) {\n screenfull.request(el as HTMLElement);\n screenfull.on('change', onChange);\n }\n };\n\n const exitFull = () => {\n if (!state.value) {\n return;\n }\n if (screenfull.isEnabled) {\n screenfull.exit();\n }\n };\n\n const toggleFull = () => {\n if (state.value) {\n exitFull();\n } else {\n setFull();\n }\n };\n\n onUnmounted(() => {\n if (screenfull.isEnabled) {\n screenfull.off('change', onChange);\n }\n });\n\n return [\n elRef,\n state,\n {\n setFull,\n exitFull,\n toggleFull,\n },\n ] as const;\n};\n\n// examples\n/*\nconst [elRef, screenState, { setFull, exitFull, toggleFull } ] = useFullscreen({\n onExitFull: () => {\n console.log('exitFull callback');\n },\n onFull: () => {\n console.log('inFull callback');\n }\n});\n\n<template>\n <div ref=\"elRef\">\n <p>123</p>\n <p>current fullscreen state: {{ screenState }}</p>\n <a-button @click=\"toggleFull\">Toggle</a-button>\n <a-button v-if=\"!screenState\" @click=\"setFull\">fullScreen</a-button>\n <a-button v-else @click=\"exitFull\">exitFullScreen</a-button>\n </div>\n</template>\n*/\n","import { isEmpty } from 'liyu-pc-base/utils/function';\nimport { getApiData } from 'liyu-pc-base/api/api-model';\nimport { ConditionOperatorMap } from 'liyu-pc-base/api/typing';\nimport { inject } from 'vue';\nimport type { TableProState } from './typing';\nimport { get_view_settings_for_user } from 'liyu-pc-base/api/view-model';\nimport { useUserStore, useEnv } from 'liyu-pc-base/init-plugin';\nexport function removeNestedDuplicates(nodes, seenIds = new Set(), parentPath = []) {\n const result = [];\n\n nodes.forEach((node, index) => {\n const currentPath = [...parentPath, index]; // 记录当前节点的路径\n const nodeId = node.name;\n\n if (!seenIds.has(nodeId)) {\n seenIds.add(nodeId);\n const newNode = { ...node };\n\n if (newNode.children && Array.isArray(newNode.children)) {\n newNode.children = removeNestedDuplicates(newNode.children, seenIds, currentPath);\n }\n\n result.push(newNode);\n } else {\n // 如果需要处理子对象(即使父对象被忽略了),则递归调用\n if (node.children && Array.isArray(node.children)) {\n // 注意:这里我们不将子对象添加到结果数组中,只是处理它们以避免丢失新的 id\n removeNestedDuplicates(node.children, seenIds, currentPath);\n }\n }\n });\n\n return result;\n}\nexport const operator_type_map = ConditionOperatorMap;\n\nexport const options_for_date_eq = [\n { value: '上月', label: '上月' },\n { value: '本月', label: '本月' },\n { value: '今日', label: '今日' },\n { value: '昨日', label: '昨日' },\n { value: '期初', label: '期初' },\n];\n\nconst operator_params_count = {\n between: 2,\n gt: 1,\n lt: 1,\n gte: 1,\n lte: 1,\n in: 0,\n eq: 1,\n _eq: 1,\n contains: 1,\n icontains: 1,\n startswith: 1,\n notbetween: 2,\n notin: 0,\n notcontains: 1,\n not_eq: 1,\n not_blank_not_null: 1,\n json_list_not_blank_not_null: 1,\n json_list_is_blank_is_null: 1,\n is_or_not_blank_or_null: 1,\n is_or_not_null: 1,\n};\n\nexport const getParamsCount = (operator, configItem) => {\n return operator_params_count[operator];\n};\n\nexport const filterConditions = conditions => {\n if (!conditions) {\n return [];\n }\n const res = conditions.filter(item => {\n return (\n item.value instanceof Array &&\n item.value.length > 0 &&\n !item.value.some(item => isEmpty(item))\n );\n });\n return res;\n};\n\nconst processColumnDataSource = (res_data: any, name_map: object) => {\n res_data.forEach((item: any) => {\n name_map[item.name] = item.verbose_name;\n if (item.children) {\n processColumnDataSource(item.children, name_map);\n }\n });\n};\n\nexport const getColumnNameList = async (modelType: string): Promise<any[]> => {\n if (!modelType) {\n return [];\n }\n const url = modelType.split('-')[0] + '/obtain_' + modelType.split('-')[1] + '_column_data';\n const res = await getApiData({}, url, false, { skip_error: true });\n const name_map = {};\n let res_data = removeNestedDuplicates(res || []);\n processColumnDataSource(res_data, name_map);\n if (!('id' in name_map)) {\n name_map['id'] = 'ID';\n }\n return Object.keys(name_map).map((item: any) => ({\n value: item,\n label: name_map[item],\n }));\n};\nexport const genID = (): string => {\n const array = new Uint8Array(16); // 16 字节 = 128 位\n window.crypto.getRandomValues(array);\n return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');\n};\n\nexport const tableProStateSymbol = Symbol('tableProState');\n\nexport const useTableProState = (): TableProState => {\n const state = inject<TableProState>(tableProStateSymbol);\n return state;\n};\nexport const fetchViewsData = async view_key => {\n const userStore = useUserStore();\n const userid = userStore.userid;\n const env = useEnv();\n const res = await get_view_settings_for_user({\n user_id: userid,\n view_project__flag: env.VITE_APP_VIEW_PROJECT_FLAG,\n view_menu__flag: view_key,\n sort_fields: ['sort', 'create_time'],\n is_cache: false,\n });\n\n let list: any = [];\n if (res.system_user_datas) list = list.concat(res.system_user_datas);\n if (res.system_public_datas) list = list.concat(res.system_public_datas);\n if (res.public_datas) list = list.concat(res.public_datas);\n if (res.user_datas) list = list.concat(res.user_datas);\n\n return list.map((item: any) => {\n let data = item.data;\n if (typeof data === 'string') {\n try {\n data = JSON.parse(data);\n } catch (e) {}\n }\n return { ...item, data };\n });\n};\n","<template>\n <span class=\"search-summary\">\n <a-tag\n v-for=\"item in dataSource\"\n :key=\"item.field_name\"\n color=\"green\"\n closable\n @close=\"handleClose(item.field_name)\"\n >\n {{ item.summary }}\n </a-tag>\n <a-button\n size=\"small\"\n type=\"text\"\n @click=\"handleRefresh\"\n >\n <RedoOutlined />\n </a-button>\n </span>\n</template>\n\n<script lang=\"ts\">\nimport { isEmpty } from 'liyu-pc-base/utils/function';\nimport moment from 'moment';\nimport { computed, defineComponent } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport { Condition, SearchConfig, SearchType } from './typing';\nimport { operator_type_map } from './utils';\nexport default defineComponent({\n name: 'searchSummary',\n props: {\n searchConfig: {\n type: Array<SearchConfig>,\n required: true,\n },\n searchConditions: {\n type: Array<Condition>,\n required: true,\n },\n eventBus: {\n type: Object as any,\n required: false,\n },\n searchType: {\n type: String as () => SearchType,\n default: 'advanced',\n },\n },\n emits: ['update:searchConditions'],\n\n setup(props, { emit }) {\n const { t } = useI18n();\n const transferValue = (configItem, operator, value) => {\n const str_list: any = [];\n let transfer_value;\n if (operator === 'is_or_not_blank_or_null' || operator === 'is_or_not_null') {\n if (value === 'yes') {\n return t('is_or_not_blank_or_null.yes');\n } else {\n return t('is_or_not_blank_or_null.no');\n }\n } else if (operator === '_eq') {\n if (['上月', '本月', '今日', '昨日', '期初'].includes(value[0])) {\n return t(value[0]);\n }\n } else if (configItem.options instanceof Array) {\n if (value instanceof Array) {\n value.forEach(item => {\n configItem.options.forEach(i => {\n if (item == i.value) {\n str_list.push(i.label);\n }\n });\n });\n if (props.searchType === 'advanced') {\n return `${operator_type_map[operator]} ${str_list.join(',')}`;\n } else {\n return str_list.join(',');\n }\n } else {\n configItem.options.forEach(i => {\n if (value == i.value) {\n transfer_value = i.label;\n }\n });\n if (props.searchType === 'advanced') {\n return `${operator_type_map[operator]} ${transfer_value}`;\n } else {\n return transfer_value;\n }\n }\n } else if (configItem.type == 'monthpicker' && configItem.dateFormat) {\n if (value instanceof Array) {\n const str_list = [];\n value.forEach(i => {\n if (i) {\n str_list.push(moment(i).format(configItem.dateFormat));\n } else {\n str_list.push(i);\n }\n });\n transfer_value = str_list.join(',');\n } else {\n transfer_value = moment(value).format(configItem.dateFormat);\n }\n if (props.searchType === 'advanced') {\n return `${operator_type_map[operator]} ${transfer_value}`;\n } else {\n return transfer_value;\n }\n } else {\n if (props.searchType === 'advanced') {\n return `${operator_type_map[operator]} ${value}`;\n } else {\n return value;\n }\n }\n };\n const dataSource = computed(() => {\n const searchConditionsMap = {};\n for (const condition of props.searchConditions) {\n searchConditionsMap[condition.field_name] = {\n value: condition.value,\n operator: condition.operator,\n };\n }\n return props.searchConfig\n ?.map(configItem => {\n const data = searchConditionsMap[configItem.field_name] || {\n operator: configItem.default_operator || 'eq',\n value: null,\n };\n let summary = null;\n if (\n data.value instanceof Array &&\n data.value.length > 0 &&\n !data.value.some(item => isEmpty(item))\n ) {\n summary = `${configItem.label}: ${transferValue(\n configItem,\n data.operator,\n data.value,\n )}`;\n }\n return {\n field_name: configItem.field_name,\n summary,\n };\n })\n .filter(item => item.summary);\n });\n const handleClose = (fieldName: string) => {\n emit(\n 'update:searchConditions',\n props.searchConditions.filter(item => item.field_name !== fieldName),\n );\n props.eventBus.emit('refresh');\n };\n const handleRefresh = () => {\n props.eventBus.emit('refresh');\n };\n\n return { dataSource, handleClose, handleRefresh };\n },\n components: {},\n});\n</script>\n<style lang=\"less\" scoped>\n.search-summary {\n display: inline-block;\n padding: 4px 2px;\n}\n</style>\n","<template>\n <span class=\"search-summary\">\n <a-tag\n v-for=\"item in dataSource\"\n :key=\"item.field_name\"\n color=\"green\"\n closable\n @close=\"handleClose(item.field_name)\"\n >\n {{ item.summary }}\n </a-tag>\n <a-button\n size=\"small\"\n type=\"text\"\n @click=\"handleRefresh\"\n >\n <RedoOutlined />\n </a-button>\n </span>\n</template>\n\n<script lang=\"ts\">\nimport { isEmpty } from 'liyu-pc-base/utils/function';\nimport moment from 'moment';\nimport { computed, defineComponent } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport { Condition, SearchConfig, SearchType } from './typing';\nimport { operator_type_map } from './utils';\nexport default defineComponent({\n name: 'searchSummary',\n props: {\n searchConfig: {\n type: Array<SearchConfig>,\n required: true,\n },\n searchConditions: {\n type: Array<Condition>,\n required: true,\n },\n eventBus: {\n type: Object as any,\n required: false,\n },\n searchType: {\n type: String as () => SearchType,\n default: 'advanced',\n },\n },\n emits: ['update:searchConditions'],\n\n setup(props, { emit }) {\n const { t } = useI18n();\n const transferValue = (configItem, operator, value) => {\n const str_list: any = [];\n let transfer_value;\n if (operator === 'is_or_not_blank_or_null' || operator === 'is_or_not_null') {\n if (value === 'yes') {\n return t('is_or_not_blank_or_null.yes');\n } else {\n return t('is_or_not_blank_or_null.no');\n }\n } else if (operator === '_eq') {\n if (['上月', '本月', '今日', '昨日', '期初'].includes(value[0])) {\n return t(value[0]);\n }\n } else if (configItem.options instanceof Array) {\n if (value instanceof Array) {\n value.forEach(item => {\n configItem.options.forEach(i => {\n if (item == i.value) {\n str_list.push(i.label);\n }\n });\n });\n if (props.searchType === 'advanced') {\n return `${operator_type_map[operator]} ${str_list.join(',')}`;\n } else {\n return str_list.join(',');\n }\n } else {\n configItem.options.forEach(i => {\n if (value == i.value) {\n transfer_value = i.label;\n }\n });\n if (props.searchType === 'advanced') {\n return `${operator_type_map[operator]} ${transfer_value}`;\n } else {\n return transfer_value;\n }\n }\n } else if (configItem.type == 'monthpicker' && configItem.dateFormat) {\n if (value instanceof Array) {\n const str_list = [];\n value.forEach(i => {\n if (i) {\n str_list.push(moment(i).format(configItem.dateFormat));\n } else {\n str_list.push(i);\n }\n });\n transfer_value = str_list.join(',');\n } else {\n transfer_value = moment(value).format(configItem.dateFormat);\n }\n if (props.searchType === 'advanced') {\n return `${operator_type_map[operator]} ${transfer_value}`;\n } else {\n return transfer_value;\n }\n } else {\n if (props.searchType === 'advanced') {\n return `${operator_type_map[operator]} ${value}`;\n } else {\n return value;\n }\n }\n };\n const dataSource = computed(() => {\n const searchConditionsMap = {};\n for (const condition of props.searchConditions) {\n searchConditionsMap[condition.field_name] = {\n value: condition.value,\n operator: condition.operator,\n };\n }\n return props.searchConfig\n ?.map(configItem => {\n const data = searchConditionsMap[configItem.field_name] || {\n operator: configItem.default_operator || 'eq',\n value: null,\n };\n let summary = null;\n if (\n data.value instanceof Array &&\n data.value.length > 0 &&\n !data.value.some(item => isEmpty(item))\n ) {\n summary = `${configItem.label}: ${transferValue(\n configItem,\n data.operator,\n data.value,\n )}`;\n }\n return {\n field_name: configItem.field_name,\n summary,\n };\n })\n .filter(item => item.summary);\n });\n const handleClose = (fieldName: string) => {\n emit(\n 'update:searchConditions',\n props.searchConditions.filter(item => item.field_name !== fieldName),\n );\n props.eventBus.emit('refresh');\n };\n const handleRefresh = () => {\n props.eventBus.emit('refresh');\n };\n\n return { dataSource, handleClose, handleRefresh };\n },\n components: {},\n});\n</script>\n<style lang=\"less\" scoped>\n.search-summary {\n display: inline-block;\n padding: 4px 2px;\n}\n</style>\n","<template>\n <a-modal\n :title=\"$t('设置搜索字段')\"\n v-model:open=\"visible\"\n width=\"1000px\"\n @ok=\"handleOk\"\n @cancel=\"handleCancel\"\n >\n <div class=\"search-config-container\">\n <div class=\"table-wrapper left-table\">\n <div class=\"table-title\">\n {{ $t('所有字段') }}\n <a-input\n v-model:value=\"leftSearch\"\n size=\"small\"\n :placeholder=\"$t('搜索标签/字段名')\"\n style=\"margin-top: 8px\"\n allow-clear\n />\n </div>\n <s-table\n :columns=\"leftColumns\"\n :data-source=\"filteredLeftData\"\n :pagination=\"false\"\n :row-selection=\"leftRowSelection\"\n v-model:selectedRowKeys=\"leftSelectedRowKeys\"\n row-key=\"field_name\"\n size=\"small\"\n :row-class-name=\"record => (record.is_selected ? 'row-selected' : '')\"\n expand-row-by-click\n >\n <template #bodyCell=\"{ column, record }\">\n <template v-if=\"column.dataIndex === 'label'\">\n <span\n :style=\"{\n color: record.is_selected ? '#ccc' : 'inherit',\n }\"\n >\n {{ record.label }}\n </span>\n </template>\n </template>\n </s-table>\n </div>\n\n <div class=\"middle-btns\">\n <a-button\n type=\"primary\"\n shape=\"circle\"\n :disabled=\"leftSelectedRowKeys.length === 0\"\n @click=\"moveToRight\"\n >\n <template #icon><RightOutlined /></template>\n </a-button>\n <a-button\n type=\"primary\"\n shape=\"circle\"\n :disabled=\"rightSelectedRowKeys.length === 0\"\n @click=\"moveToLeft\"\n >\n <template #icon><LeftOutlined /></template>\n </a-button>\n </div>\n\n <div class=\"table-wrapper right-table\">\n <div class=\"table-title\">\n {{ $t('已选字段') }}\n <a-input\n v-model:value=\"rightSearch\"\n size=\"small\"\n :placeholder=\"$t('搜索标签/字段名')\"\n style=\"margin-top: 8px\"\n allow-clear\n />\n </div>\n <s-table\n :columns=\"rightColumns\"\n :data-source=\"filteredRightData\"\n :pagination=\"false\"\n :row-selection=\"rightRowSelection\"\n v-model:selectedRowKeys=\"rightSelectedRowKeys\"\n row-key=\"field_name\"\n size=\"small\"\n @row-drag-end=\"onRowDragEnd\"\n />\n </div>\n </div>\n </a-modal>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, PropType } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport { RightOutlined, LeftOutlined } from '@ant-design/icons-vue';\nimport { SearchConfig, ViewSearchItem } from '../typing';\nimport { cloneDeep } from 'lodash';\n\nconst props = defineProps({\n open: {\n type: Boolean,\n default: false,\n },\n searchConfig: {\n type: Array as PropType<SearchConfig[]>,\n default: () => [],\n },\n viewSearchConfig: {\n type: Object as PropType<Record<string, ViewSearchItem>>,\n default: () => ({}),\n },\n});\n\nconst emit = defineEmits(['update:open', 'change']);\n\nconst { t } = useI18n();\n\nconst visible = ref(false);\nconst leftSearch = ref('');\nconst rightSearch = ref('');\nconst leftSelectedRowKeys = ref<string[]>([]);\nconst rightSelectedRowKeys = ref<string[]>([]);\nconst rightData = ref<SearchConfig[]>([]);\n\nconst leftColumns = [\n {\n title: t('字段名称'),\n dataIndex: 'label',\n key: 'label',\n width: 250,\n ellipsis: true,\n },\n];\n\nconst rightColumns = computed(() => {\n const columns: any = [\n {\n title: t('字段名称'),\n dataIndex: 'label',\n key: 'label',\n rowDrag: true,\n width: 150,\n ellipsis: true,\n },\n ];\n if (filteredRightData.value.length > 0) {\n if (filteredRightData.value.some(item => item.group_name)) {\n columns.push({\n title: t('分组'),\n dataIndex: 'group_name',\n key: 'group_name',\n width: 150,\n ellipsis: true,\n });\n }\n }\n return columns;\n});\n\nwatch(\n () => props.open,\n val => {\n visible.value = val;\n if (val) {\n leftSearch.value = '';\n rightSearch.value = '';\n initData();\n }\n },\n);\n\nwatch(visible, val => {\n emit('update:open', val);\n});\n\nconst initData = () => {\n // 根据 viewSearchConfig 和 searchConfig 初始化右侧数据\n const configMap = new Map();\n props.searchConfig.forEach(item => {\n configMap.set(item.field_name, item);\n });\n\n const selectedFields: SearchConfig[] = [];\n\n if (props.viewSearchConfig && Object.keys(props.viewSearchConfig).length > 0) {\n // 先处理 viewSearchConfig 中已有的配置\n Object.keys(props.viewSearchConfig).forEach(fieldName => {\n const viewItem = props.viewSearchConfig[fieldName];\n if (viewItem.checked && configMap.has(fieldName)) {\n selectedFields.push({\n ...configMap.get(fieldName),\n order: viewItem.order ?? 0,\n });\n }\n });\n // 排序\n selectedFields.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n } else {\n // 当 viewSearchConfig 为空时,所有 item.checked !== false 的字段都是选中字段\n props.searchConfig.forEach((item, index) => {\n if (item.checked !== false) {\n selectedFields.push({\n ...item,\n order: index + 1,\n });\n }\n });\n }\n\n rightData.value = cloneDeep(selectedFields);\n\n leftSelectedRowKeys.value = [];\n rightSelectedRowKeys.value = [];\n};\n\nconst leftData = computed(() => {\n const selectedKeys = new Set(rightData.value.map(item => item.field_name));\n const groups: Record<string, any[]> = {};\n const noGroup: any[] = [];\n\n props.searchConfig.forEach(item => {\n const itemData = {\n ...item,\n is_selected: selectedKeys.has(item.field_name),\n };\n if (item.group_name) {\n if (!groups[item.group_name]) {\n groups[item.group_name] = [];\n }\n groups[item.group_name].push(itemData);\n } else {\n noGroup.push(itemData);\n }\n });\n\n const result: any[] = [];\n Object.keys(groups).forEach(groupName => {\n result.push({\n field_name: `group_${groupName}`,\n label: groupName,\n is_group: true,\n children: groups[groupName],\n });\n });\n\n return [...result, ...noGroup];\n});\n\nconst filteredLeftData = computed(() => {\n if (!leftSearch.value) return leftData.value;\n const search = leftSearch.value.toLowerCase();\n\n const filterNode = (nodes: any[]) => {\n return nodes.reduce((acc: any[], node: any) => {\n const matchSelf =\n node.label?.toLowerCase().includes(search) ||\n node.field_name?.toLowerCase().includes(search);\n\n if (node.children) {\n const filteredChildren = filterNode(node.children);\n if (filteredChildren.length > 0) {\n acc.push({ ...node, children: filteredChildren });\n } else if (matchSelf) {\n acc.push({ ...node, children: [] });\n }\n } else if (matchSelf) {\n acc.push(node);\n }\n return acc;\n }, []);\n };\n\n return filterNode(leftData.value);\n});\n\nconst filteredRightData = computed(() => {\n if (!rightSearch.value) return rightData.value;\n const search = rightSearch.value.toLowerCase();\n return rightData.value.filter(\n item =>\n item.label?.toLowerCase().includes(search) || item.field_name?.toLowerCase().includes(search),\n );\n});\n\nconst leftRowSelection = {\n onChange: (selectedRowKeys: string[]) => {\n leftSelectedRowKeys.value = selectedRowKeys;\n },\n getCheckboxProps: (record: any) => ({\n disabled: record.is_group || record.is_selected,\n }),\n};\n\nconst rightRowSelection = {\n onChange: (selectedRowKeys: string[]) => {\n rightSelectedRowKeys.value = selectedRowKeys;\n },\n};\n\nconst moveToRight = () => {\n const selectedKeys = new Set(leftSelectedRowKeys.value);\n const toMove: SearchConfig[] = [];\n\n // 遍历所有 searchConfig,按原始顺序找到匹配项\n props.searchConfig.forEach(item => {\n if (selectedKeys.has(item.field_name)) {\n toMove.push(item);\n }\n });\n\n if (toMove.length > 0) {\n rightData.value = [...rightData.value, ...cloneDeep(toMove)];\n }\n leftSelectedRowKeys.value = [];\n};\n\nconst moveToLeft = () => {\n rightData.value = rightData.value.filter(\n item => !rightSelectedRowKeys.value.includes(item.field_name),\n );\n rightSelectedRowKeys.value = [];\n};\n\nconst onRowDragEnd = ({ oldIndex, newIndex }) => {\n const target = rightData.value.splice(oldIndex, 1)[0];\n rightData.value.splice(newIndex, 0, target);\n};\n\nconst handleOk = () => {\n const result: Record<string, ViewSearchItem> = {};\n\n // 处理所有字段,默认为未选中\n props.searchConfig.forEach(item => {\n result[item.field_name] = {\n checked: false,\n order: 0,\n };\n });\n\n // 更新已选中的字段\n rightData.value.forEach((item, index) => {\n result[item.field_name] = {\n checked: true,\n order: index + 1,\n };\n });\n\n emit('change', result);\n visible.value = false;\n};\n\nconst handleCancel = () => {\n visible.value = false;\n};\n</script>\n\n<style lang=\"less\" scoped>\n.search-config-container {\n display: flex;\n align-items: center;\n gap: 16px;\n height: 70vh;\n .table-wrapper {\n width: 450px;\n border: 1px solid #f0f0f0;\n border-radius: 4px;\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: auto;\n\n .table-title {\n padding: 8px 12px;\n background: #fafafa;\n border-bottom: 1px solid #f0f0f0;\n font-weight: bold;\n }\n }\n\n .middle-btns {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n}\n</style>\n","<template>\n <a-modal\n :title=\"$t('设置搜索字段')\"\n v-model:open=\"visible\"\n width=\"1000px\"\n @ok=\"handleOk\"\n @cancel=\"handleCancel\"\n >\n <div class=\"search-config-container\">\n <div class=\"table-wrapper left-table\">\n <div class=\"table-title\">\n {{ $t('所有字段') }}\n <a-input\n v-model:value=\"leftSearch\"\n size=\"small\"\n :placeholder=\"$t('搜索标签/字段名')\"\n style=\"margin-top: 8px\"\n allow-clear\n />\n </div>\n <s-table\n :columns=\"leftColumns\"\n :data-source=\"filteredLeftData\"\n :pagination=\"false\"\n :row-selection=\"leftRowSelection\"\n v-model:selectedRowKeys=\"leftSelectedRowKeys\"\n row-key=\"field_name\"\n size=\"small\"\n :row-class-name=\"record => (record.is_selected ? 'row-selected' : '')\"\n expand-row-by-click\n >\n <template #bodyCell=\"{ column, record }\">\n <template v-if=\"column.dataIndex === 'label'\">\n <span\n :style=\"{\n color: record.is_selected ? '#ccc' : 'inherit',\n }\"\n >\n {{ record.label }}\n </span>\n </template>\n </template>\n </s-table>\n </div>\n\n <div class=\"middle-btns\">\n <a-button\n type=\"primary\"\n shape=\"circle\"\n :disabled=\"leftSelectedRowKeys.length === 0\"\n @click=\"moveToRight\"\n >\n <template #icon><RightOutlined /></template>\n </a-button>\n <a-button\n type=\"primary\"\n shape=\"circle\"\n :disabled=\"rightSelectedRowKeys.length === 0\"\n @click=\"moveToLeft\"\n >\n <template #icon><LeftOutlined /></template>\n </a-button>\n </div>\n\n <div class=\"table-wrapper right-table\">\n <div class=\"table-title\">\n {{ $t('已选字段') }}\n <a-input\n v-model:value=\"rightSearch\"\n size=\"small\"\n :placeholder=\"$t('搜索标签/字段名')\"\n style=\"margin-top: 8px\"\n allow-clear\n />\n </div>\n <s-table\n :columns=\"rightColumns\"\n :data-source=\"filteredRightData\"\n :pagination=\"false\"\n :row-selection=\"rightRowSelection\"\n v-model:selectedRowKeys=\"rightSelectedRowKeys\"\n row-key=\"field_name\"\n size=\"small\"\n @row-drag-end=\"onRowDragEnd\"\n />\n </div>\n </div>\n </a-modal>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, PropType } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport { RightOutlined, LeftOutlined } from '@ant-design/icons-vue';\nimport { SearchConfig, ViewSearchItem } from '../typing';\nimport { cloneDeep } from 'lodash';\n\nconst props = defineProps({\n open: {\n type: Boolean,\n default: false,\n },\n searchConfig: {\n type: Array as PropType<SearchConfig[]>,\n default: () => [],\n },\n viewSearchConfig: {\n type: Object as PropType<Record<string, ViewSearchItem>>,\n default: () => ({}),\n },\n});\n\nconst emit = defineEmits(['update:open', 'change']);\n\nconst { t } = useI18n();\n\nconst visible = ref(false);\nconst leftSearch = ref('');\nconst rightSearch = ref('');\nconst leftSelectedRowKeys = ref<string[]>([]);\nconst rightSelectedRowKeys = ref<string[]>([]);\nconst rightData = ref<SearchConfig[]>([]);\n\nconst leftColumns = [\n {\n title: t('字段名称'),\n dataIndex: 'label',\n key: 'label',\n width: 250,\n ellipsis: true,\n },\n];\n\nconst rightColumns = computed(() => {\n const columns: any = [\n {\n title: t('字段名称'),\n dataIndex: 'label',\n key: 'label',\n rowDrag: true,\n width: 150,\n ellipsis: true,\n },\n ];\n if (filteredRightData.value.length > 0) {\n if (filteredRightData.value.some(item => item.group_name)) {\n columns.push({\n title: t('分组'),\n dataIndex: 'group_name',\n key: 'group_name',\n width: 150,\n ellipsis: true,\n });\n }\n }\n return columns;\n});\n\nwatch(\n () => props.open,\n val => {\n visible.value = val;\n if (val) {\n leftSearch.value = '';\n rightSearch.value = '';\n initData();\n }\n },\n);\n\nwatch(visible, val => {\n emit('update:open', val);\n});\n\nconst initData = () => {\n // 根据 viewSearchConfig 和 searchConfig 初始化右侧数据\n const configMap = new Map();\n props.searchConfig.forEach(item => {\n configMap.set(item.field_name, item);\n });\n\n const selectedFields: SearchConfig[] = [];\n\n if (props.viewSearchConfig && Object.keys(props.viewSearchConfig).length > 0) {\n // 先处理 viewSearchConfig 中已有的配置\n Object.keys(props.viewSearchConfig).forEach(fieldName => {\n const viewItem = props.viewSearchConfig[fieldName];\n if (viewItem.checked && configMap.has(fieldName)) {\n selectedFields.push({\n ...configMap.get(fieldName),\n order: viewItem.order ?? 0,\n });\n }\n });\n // 排序\n selectedFields.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n } else {\n // 当 viewSearchConfig 为空时,所有 item.checked !== false 的字段都是选中字段\n props.searchConfig.forEach((item, index) => {\n if (item.checked !== false) {\n selectedFields.push({\n ...item,\n order: index + 1,\n });\n }\n });\n }\n\n rightData.value = cloneDeep(selectedFields);\n\n leftSelectedRowKeys.value = [];\n rightSelectedRowKeys.value = [];\n};\n\nconst leftData = computed(() => {\n const selectedKeys = new Set(rightData.value.map(item => item.field_name));\n const groups: Record<string, any[]> = {};\n const noGroup: any[] = [];\n\n props.searchConfig.forEach(item => {\n const itemData = {\n ...item,\n is_selected: selectedKeys.has(item.field_name),\n };\n if (item.group_name) {\n if (!groups[item.group_name]) {\n groups[item.group_name] = [];\n }\n groups[item.group_name].push(itemData);\n } else {\n noGroup.push(itemData);\n }\n });\n\n const result: any[] = [];\n Object.keys(groups).forEach(groupName => {\n result.push({\n field_name: `group_${groupName}`,\n label: groupName,\n is_group: true,\n children: groups[groupName],\n });\n });\n\n return [...result, ...noGroup];\n});\n\nconst filteredLeftData = computed(() => {\n if (!leftSearch.value) return leftData.value;\n const search = leftSearch.value.toLowerCase();\n\n const filterNode = (nodes: any[]) => {\n return nodes.reduce((acc: any[], node: any) => {\n const matchSelf =\n node.label?.toLowerCase().includes(search) ||\n node.field_name?.toLowerCase().includes(search);\n\n if (node.children) {\n const filteredChildren = filterNode(node.children);\n if (filteredChildren.length > 0) {\n acc.push({ ...node, children: filteredChildren });\n } else if (matchSelf) {\n acc.push({ ...node, children: [] });\n }\n } else if (matchSelf) {\n acc.push(node);\n }\n return acc;\n }, []);\n };\n\n return filterNode(leftData.value);\n});\n\nconst filteredRightData = computed(() => {\n if (!rightSearch.value) return rightData.value;\n const search = rightSearch.value.toLowerCase();\n return rightData.value.filter(\n item =>\n item.label?.toLowerCase().includes(search) || item.field_name?.toLowerCase().includes(search),\n );\n});\n\nconst leftRowSelection = {\n onChange: (selectedRowKeys: string[]) => {\n leftSelectedRowKeys.value = selectedRowKeys;\n },\n getCheckboxProps: (record: any) => ({\n disabled: record.is_group || record.is_selected,\n }),\n};\n\nconst rightRowSelection = {\n onChange: (selectedRowKeys: string[]) => {\n rightSelectedRowKeys.value = selectedRowKeys;\n },\n};\n\nconst moveToRight = () => {\n const selectedKeys = new Set(leftSelectedRowKeys.value);\n const toMove: SearchConfig[] = [];\n\n // 遍历所有 searchConfig,按原始顺序找到匹配项\n props.searchConfig.forEach(item => {\n if (selectedKeys.has(item.field_name)) {\n toMove.push(item);\n }\n });\n\n if (toMove.length > 0) {\n rightData.value = [...rightData.value, ...cloneDeep(toMove)];\n }\n leftSelectedRowKeys.value = [];\n};\n\nconst moveToLeft = () => {\n rightData.value = rightData.value.filter(\n item => !rightSelectedRowKeys.value.includes(item.field_name),\n );\n rightSelectedRowKeys.value = [];\n};\n\nconst onRowDragEnd = ({ oldIndex, newIndex }) => {\n const target = rightData.value.splice(oldIndex, 1)[0];\n rightData.value.splice(newIndex, 0, target);\n};\n\nconst handleOk = () => {\n const result: Record<string, ViewSearchItem> = {};\n\n // 处理所有字段,默认为未选中\n props.searchConfig.forEach(item => {\n result[item.field_name] = {\n checked: false,\n order: 0,\n };\n });\n\n // 更新已选中的字段\n rightData.value.forEach((item, index) => {\n result[item.field_name] = {\n checked: true,\n order: index + 1,\n };\n });\n\n emit('change', result);\n visible.value = false;\n};\n\nconst handleCancel = () => {\n visible.value = false;\n};\n</script>\n\n<style lang=\"less\" scoped>\n.search-config-container {\n display: flex;\n align-items: center;\n gap: 16px;\n height: 70vh;\n .table-wrapper {\n width: 450px;\n border: 1px solid #f0f0f0;\n border-radius: 4px;\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: auto;\n\n .table-title {\n padding: 8px 12px;\n background: #fafafa;\n border-bottom: 1px solid #f0f0f0;\n font-weight: bold;\n }\n }\n\n .middle-btns {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n}\n</style>\n","<template>\n <span\n class=\"search-switch\"\n v-if=\"search_display_type !== 'show_no_hide'\"\n >\n <a-button\n v-if=\"!isShowForm\"\n type=\"link\"\n size=\"small\"\n @click=\"isShowForm = true\"\n >\n <span class=\"expand-btn\">{{ $t('展开') }}</span>\n </a-button>\n <div v-else>\n <a-button\n type=\"link\"\n size=\"small\"\n @click=\"isShowForm = false\"\n >\n {{ $t('隐藏') }}\n </a-button>\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"searchConfigVisible = true\"\n v-if=\"config?.sys_btn?.search_field_config !== false\"\n >\n <a-tooltip :title=\"$t('设置搜索字段')\">\n <SettingOutlined />\n </a-tooltip>\n </a-button>\n </div>\n </span>\n <search-config-modal\n v-model:open=\"searchConfigVisible\"\n :search-config=\"searchConfig\"\n :view-search-config=\"viewSearchConfig\"\n @change=\"handleSearchConfigChange\"\n />\n <search-summary\n v-if=\"!isShowForm\"\n :search-conditions=\"searchConditions\"\n :search-config=\"searchConfig\"\n :event-bus=\"eventBus\"\n :searchType=\"searchType\"\n @update:searchConditions=\"handleUpdateSearchConditions\"\n />\n <div\n v-if=\"isShowForm\"\n class=\"search-form-wraper\"\n :class=\"{ 'search-form-grid': searchColumnCount > 0 }\"\n :style=\"{\n '--column-count': searchColumnCount || 0,\n }\"\n >\n <a-form\n :layout=\"searchColumnCount > 0 ? 'horizontal' : 'inline'\"\n :class=\"{ 'search-form-grid-inner': searchColumnCount > 0 }\"\n >\n <template\n v-for=\"(condition, k) in dataSource\"\n :key=\"condition.field_name\"\n >\n <div\n v-if=\"condition.is_group\"\n class=\"search-group-title\"\n >\n {{ condition.label }}\n </div>\n <a-form-item v-else>\n <template #label>\n <span\n :title=\"condition.label\"\n class=\"search-item-label-text\"\n >\n {{ condition.label }}\n </span>\n </template>\n <a-input-group\n compact\n size=\"small\"\n >\n <a-select\n v-if=\"condition.operator_list.length > 0 && searchType === 'advanced'\"\n :dropdownMatchSelectWidth=\"false\"\n :value=\"condition.operator\"\n @change=\"onChange(condition.field_name, 'operator', $event)\"\n size=\"small\"\n >\n <a-select-option\n v-for=\"item in condition.operator_list\"\n :value=\"item\"\n :key=\"item\"\n >\n {{ operator_type_map[item] }}\n </a-select-option>\n </a-select>\n <template\n v-if=\"['is_or_not_blank_or_null', 'is_or_not_null'].includes(condition.operator)\"\n >\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{\n ...condition,\n type: 'select',\n mode: 'default',\n format: 'choices',\n class_name: 'str',\n placeholder: '',\n }\"\n :formModel=\"formModel\"\n :options=\"is_or_not_blank_or_null_options\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n :field_width=\"condition.field_width || 155\"\n />\n </template>\n <template\n v-if=\"condition.operator === 'between' || condition.operator === 'notbetween'\"\n >\n <template v-if=\"condition.type === 'datepicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{ ...condition, type: 'rangepicker', format: condition.dateFormat }\"\n :formModel=\"formModel\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width ? condition.field_width * 2 : 320\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template v-else-if=\"condition.type === 'monthpicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{\n ...condition,\n type: 'monthrangepicker',\n }\"\n :formModel=\"formModel\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width ? condition.field_width * 2 : 320\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template v-else>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"condition.value?.[0]\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 165\"\n @update:value=\"onChange(condition.field_name, 'value', $event, 0)\"\n />\n <span class=\"range\">~</span>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"condition.value?.[1]\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 165\"\n @update:value=\"onChange(condition.field_name, 'value', $event, 1)\"\n />\n </template>\n </template>\n <template v-else-if=\"condition.operator === '_eq'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{\n ...condition,\n type: 'select',\n mode: 'default',\n format: 'choices',\n class_name: 'str',\n placeholder: '',\n }\"\n :formModel=\"formModel\"\n :options=\"options_for_date_eq\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 165\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template\n v-else-if=\"condition.type === 'datepicker' || condition.type === 'monthpicker'\"\n >\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{ ...condition, format: condition.dateFormat }\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 165\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template v-else>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{ ...condition, name: condition?.field_name }\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 165\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n </a-input-group>\n </a-form-item>\n </template>\n <div\n class=\"btn-content\"\n v-if=\"!searchColumnCount && !autoRefreshOnSearchChange\"\n >\n <a-button\n size=\"small\"\n type=\"primary\"\n @click=\"handleRefresh\"\n >\n 查询\n </a-button>\n </div>\n </a-form>\n </div>\n <div\n class=\"bottom-content\"\n v-if=\"searchColumnCount && isShowForm && !autoRefreshOnSearchChange\"\n >\n <a-button\n size=\"small\"\n type=\"primary\"\n @click=\"handleRefresh\"\n >\n 查询\n </a-button>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { cloneDeep, debounce } from 'lodash';\nimport { computed, onMounted, PropType, ref } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport searchSummary from './searchSummary.vue';\nimport SearchConfigModal from './tableConfig/searchConfig.vue';\nimport { Condition, SearchConfig, SearchDisplayType, SearchType, ViewSearchItem } from './typing';\nimport SmallTableSerarchField from 'liyu-pc-base/components/FormRender/SmallTableSerarchField.vue';\nimport { getParamsCount, operator_type_map, options_for_date_eq, useTableProState } from './utils';\nimport { isEmpty, isNotEmpty } from 'liyu-pc-base/utils/function';\n\ndefineOptions({\n name: 'Search',\n});\n\nconst props = defineProps({\n searchConfig: {\n type: Array as PropType<SearchConfig[]>,\n required: true,\n },\n searchConditions: {\n type: Array<Condition>,\n required: true,\n },\n eventBus: {\n type: Object as any,\n required: false,\n },\n searchType: {\n type: String as () => SearchType,\n default: 'advanced',\n },\n searchDisplayType: {\n type: String as () => SearchDisplayType,\n default: 'hide',\n },\n searchColumnCount: {\n type: Number,\n default: 0,\n },\n viewSearchConfig: {\n type: Object as PropType<Record<string, ViewSearchItem>>,\n default: () => ({}),\n },\n autoRefreshOnSearchChange: {\n type: Boolean,\n default: false,\n },\n});\n\nconst emit = defineEmits(['update:searchConditions', 'viewSearchConfigChange', 'change']);\n\nconst { t } = useI18n();\nconst isShowForm = ref(false);\nconst searchConfigVisible = ref(false);\nconst formModel = ref<Record<string, any>>({});\nconst validateInfos = ref({});\nconst { config } = useTableProState();\n\nconst is_or_not_blank_or_null_options = ref([\n { value: 'yes', label: t('is_or_not_blank_or_null.yes') },\n { value: 'no', label: t('is_or_not_blank_or_null.no') },\n]);\n\nconst dataSource = computed(() => {\n const searchConditionsMap: Record<string, any> = {};\n for (const condition of props.searchConditions) {\n searchConditionsMap[condition.field_name] = {\n value: condition.value,\n operator: condition.operator,\n };\n }\n\n // 1. 过滤并处理基础字段数据\n const flatData = props.searchConfig\n ?.filter(item => {\n if (props.viewSearchConfig[item.field_name]) {\n return props.viewSearchConfig[item.field_name].checked !== false;\n } else {\n return item.checked !== false;\n }\n })\n ?.map(configItem => {\n const data = searchConditionsMap[configItem.field_name] || {\n operator: configItem.default_operator || 'eq',\n value: undefined,\n };\n let formValue = data.value;\n if (isNotEmpty(data.value)) {\n const paramsCount = getParamsCount(data.operator, configItem);\n if (paramsCount === 1 && formValue instanceof Array) {\n formValue = formValue[0];\n }\n }\n formModel.value[configItem.field_name] = formValue;\n return {\n ...configItem,\n value: data.value,\n operator: data.operator,\n model: 'default',\n _order: props.viewSearchConfig[configItem.field_name]?.order || 0,\n };\n })\n .sort((a, b) => a._order - b._order);\n\n // 2. 仿照 searchConfig.vue 的逻辑进行分组处理\n const groups: Record<string, any[]> = {};\n const orderList: any[] = []; // 用于记录分组和无分组字段的出现顺序\n\n flatData.forEach(item => {\n if (item.group_name) {\n if (!groups[item.group_name]) {\n groups[item.group_name] = [];\n orderList.push({\n field_name: `group_${item.group_name}`,\n label: item.group_name,\n is_group: true,\n _group_key: item.group_name,\n });\n }\n groups[item.group_name].push(item);\n } else {\n orderList.push(item);\n }\n });\n\n // 3. 构造最终的扁平数组,将组成员插在标题后\n const finalResult: any[] = [];\n orderList.forEach(item => {\n if (item.is_group) {\n finalResult.push(item);\n finalResult.push(...groups[item._group_key]);\n } else {\n finalResult.push(item);\n }\n });\n\n return finalResult;\n});\n\nconst getValue = (configItemAndValue: any) => {\n const value_count = getParamsCount(configItemAndValue.operator, configItemAndValue);\n let value = configItemAndValue.value;\n if (value_count == 1) {\n if (value instanceof Array) {\n return value[0] || undefined;\n } else {\n return value || undefined;\n }\n } else if (value_count == 2) {\n if (value instanceof Array) {\n const [first, seconds] = value;\n return [first, seconds];\n } else if (value) {\n const first = value;\n return [first, null];\n } else {\n return [null, null];\n }\n } else {\n return value;\n }\n};\nconst delayRefresh = debounce(() => {\n props.eventBus.emit('refresh');\n}, 500);\n\nconst onChange = (\n field_name: string,\n type: 'value' | 'operator',\n newValue: any,\n array_index: number | undefined = undefined,\n) => {\n const conditions = cloneDeep(props.searchConditions);\n const configItem = props.searchConfig.find(item => item.field_name === field_name);\n let value: any;\n let operator: string;\n let condition = conditions.find(item => item.field_name === field_name);\n if (type === 'value') {\n if (condition) {\n operator = condition.operator;\n } else {\n operator = configItem?.default_operator || 'eq';\n }\n if (array_index !== undefined) {\n const value_count = getParamsCount(newValue, configItem);\n if (condition) {\n value = condition.value;\n if (isEmpty(value) || !(value instanceof Array)) {\n value = [];\n for (let i = 0; i < value_count; i++) {\n value.push(null);\n }\n }\n value[array_index] = newValue;\n } else {\n value = [];\n for (let i = 0; i < value_count; i++) {\n value.push(null);\n }\n value[array_index] = newValue;\n }\n } else {\n if (isNotEmpty(newValue) && !(newValue instanceof Array)) {\n newValue = [newValue];\n }\n value = newValue;\n }\n } else if (type === 'operator') {\n operator = newValue;\n const value_count = getParamsCount(newValue, configItem);\n if (value_count) {\n value = [];\n for (let i = 0; i < value_count; i++) {\n value.push(null);\n }\n } else {\n value = undefined;\n }\n }\n if (condition) {\n condition.operator = operator!;\n condition.value = value;\n } else {\n let format = 'input';\n let class_name = 'str';\n if (configItem) {\n format = configItem.format || 'input';\n class_name = configItem.class_name || 'str';\n }\n condition = {\n field_name: field_name,\n value,\n operator: operator!,\n format,\n class_name,\n };\n conditions.push(condition);\n }\n emit('update:searchConditions', conditions);\n emit('change', conditions);\n if (props.autoRefreshOnSearchChange) {\n delayRefresh();\n }\n};\n\nconst handleUpdateSearchConditions = (newConditions: Condition[]) => {\n emit('update:searchConditions', newConditions);\n};\n\nconst handleRefresh = () => {\n props.eventBus.emit('refresh');\n};\n\nconst handleSearchConfigChange = (data: any) => {\n emit('viewSearchConfigChange', data);\n};\n\nconst search_display_type = computed(() => {\n return props.searchDisplayType || 'hide';\n});\n\nonMounted(() => {\n if (['show', 'show_no_hide'].includes(search_display_type.value)) {\n isShowForm.value = true;\n }\n});\n</script>\n\n<style lang=\"less\" scoped>\n.card {\n overflow: auto;\n max-height: 300px;\n background: #f2f5f7;\n}\n\n.condition-group {\n padding: 5px;\n}\n\n.close-icon {\n width: 15px;\n margin-top: 5px;\n margin-left: 5px;\n color: red;\n}\n\n.search-bar {\n background: #f2f5f7;\n text-align: right;\n}\n\n:deep(.divider .ant-divider) {\n margin: 0;\n}\n.search-form-wraper {\n padding-left: 2px;\n padding-right: 2px;\n max-height: 300px;\n overflow-y: auto;\n}\n.search-group-title {\n grid-column: span calc(var(--column-count) * 2);\n font-weight: bold;\n padding: 8px 4px 4px 4px;\n margin-bottom: 4px;\n border-bottom: 1px solid #f0f0f0;\n color: var(--primary-color, #1890ff);\n display: flex;\n align-items: center;\n width: 100%;\n flex-basis: 100%;\n &:not(:first-child) {\n margin-top: 8px;\n }\n}\n.search-form-grid {\n .search-form-grid-inner {\n display: grid;\n grid-template-columns: repeat(var(--column-count), max-content 1fr);\n gap: 2px 8px;\n align-items: center;\n .search-group-title {\n grid-column: span calc(var(--column-count) * 2);\n &:not(:first-child) {\n margin-top: 8px;\n }\n }\n :deep(.ant-form-item) {\n display: contents;\n margin-right: 0;\n margin-bottom: 2px;\n .ant-form-item-row,\n .ant-form-item-label,\n .ant-form-item-control,\n .ant-form-item-control-input,\n .ant-form-item-control-input-content {\n display: contents;\n }\n }\n .btn-content {\n grid-column: span calc(var(--column-count) * 2);\n }\n :deep(.ant-form-item-label) {\n justify-self: end;\n display: flex !important;\n align-items: center;\n max-width: 150px;\n .search-item-label-text {\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n padding-right: 8px;\n text-align: right;\n }\n }\n :deep(.ant-input-group) {\n display: flex !important;\n width: 100%;\n }\n }\n}\n.btn-content {\n padding: 4px;\n margin-left: auto;\n}\n.search-switch {\n display: inline-block;\n line-height: 32px;\n height: 32px;\n}\n:deep(.ant-select-selection-placeholder) {\n overflow: hidden;\n width: 100%;\n}\n.bottom-content {\n display: flex;\n justify-content: flex-end;\n padding: 8px 26px 8px 8px;\n}\n</style>\n","<template>\n <span\n class=\"search-switch\"\n v-if=\"search_display_type !== 'show_no_hide'\"\n >\n <a-button\n v-if=\"!isShowForm\"\n type=\"link\"\n size=\"small\"\n @click=\"isShowForm = true\"\n >\n <span class=\"expand-btn\">{{ $t('展开') }}</span>\n </a-button>\n <div v-else>\n <a-button\n type=\"link\"\n size=\"small\"\n @click=\"isShowForm = false\"\n >\n {{ $t('隐藏') }}\n </a-button>\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"searchConfigVisible = true\"\n v-if=\"config?.sys_btn?.search_field_config !== false\"\n >\n <a-tooltip :title=\"$t('设置搜索字段')\">\n <SettingOutlined />\n </a-tooltip>\n </a-button>\n </div>\n </span>\n <search-config-modal\n v-model:open=\"searchConfigVisible\"\n :search-config=\"searchConfig\"\n :view-search-config=\"viewSearchConfig\"\n @change=\"handleSearchConfigChange\"\n />\n <search-summary\n v-if=\"!isShowForm\"\n :search-conditions=\"searchConditions\"\n :search-config=\"searchConfig\"\n :event-bus=\"eventBus\"\n :searchType=\"searchType\"\n @update:searchConditions=\"handleUpdateSearchConditions\"\n />\n <div\n v-if=\"isShowForm\"\n class=\"search-form-wraper\"\n :class=\"{ 'search-form-grid': searchColumnCount > 0 }\"\n :style=\"{\n '--column-count': searchColumnCount || 0,\n }\"\n >\n <a-form\n :layout=\"searchColumnCount > 0 ? 'horizontal' : 'inline'\"\n :class=\"{ 'search-form-grid-inner': searchColumnCount > 0 }\"\n >\n <template\n v-for=\"(condition, k) in dataSource\"\n :key=\"condition.field_name\"\n >\n <div\n v-if=\"condition.is_group\"\n class=\"search-group-title\"\n >\n {{ condition.label }}\n </div>\n <a-form-item v-else>\n <template #label>\n <span\n :title=\"condition.label\"\n class=\"search-item-label-text\"\n >\n {{ condition.label }}\n </span>\n </template>\n <a-input-group\n compact\n size=\"small\"\n >\n <a-select\n v-if=\"condition.operator_list.length > 0 && searchType === 'advanced'\"\n :dropdownMatchSelectWidth=\"false\"\n :value=\"condition.operator\"\n @change=\"onChange(condition.field_name, 'operator', $event)\"\n size=\"small\"\n >\n <a-select-option\n v-for=\"item in condition.operator_list\"\n :value=\"item\"\n :key=\"item\"\n >\n {{ operator_type_map[item] }}\n </a-select-option>\n </a-select>\n <template\n v-if=\"['is_or_not_blank_or_null', 'is_or_not_null'].includes(condition.operator)\"\n >\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{\n ...condition,\n type: 'select',\n mode: 'default',\n format: 'choices',\n class_name: 'str',\n placeholder: '',\n }\"\n :formModel=\"formModel\"\n :options=\"is_or_not_blank_or_null_options\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n :field_width=\"condition.field_width || 155\"\n />\n </template>\n <template\n v-if=\"condition.operator === 'between' || condition.operator === 'notbetween'\"\n >\n <template v-if=\"condition.type === 'datepicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{ ...condition, type: 'rangepicker', format: condition.dateFormat }\"\n :formModel=\"formModel\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width ? condition.field_width * 2 : 320\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template v-else-if=\"condition.type === 'monthpicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{\n ...condition,\n type: 'monthrangepicker',\n }\"\n :formModel=\"formModel\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width ? condition.field_width * 2 : 320\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template v-else>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"condition.value?.[0]\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 165\"\n @update:value=\"onChange(condition.field_name, 'value', $event, 0)\"\n />\n <span class=\"range\">~</span>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"condition.value?.[1]\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 165\"\n @update:value=\"onChange(condition.field_name, 'value', $event, 1)\"\n />\n </template>\n </template>\n <template v-else-if=\"condition.operator === '_eq'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{\n ...condition,\n type: 'select',\n mode: 'default',\n format: 'choices',\n class_name: 'str',\n placeholder: '',\n }\"\n :formModel=\"formModel\"\n :options=\"options_for_date_eq\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 165\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template\n v-else-if=\"condition.type === 'datepicker' || condition.type === 'monthpicker'\"\n >\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{ ...condition, format: condition.dateFormat }\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 165\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n <template v-else>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"condition.field_name\"\n :value=\"getValue(condition)\"\n :field=\"{ ...condition, name: condition?.field_name }\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 165\"\n @update:value=\"onChange(condition.field_name, 'value', $event)\"\n />\n </template>\n </a-input-group>\n </a-form-item>\n </template>\n <div\n class=\"btn-content\"\n v-if=\"!searchColumnCount && !autoRefreshOnSearchChange\"\n >\n <a-button\n size=\"small\"\n type=\"primary\"\n @click=\"handleRefresh\"\n >\n 查询\n </a-button>\n </div>\n </a-form>\n </div>\n <div\n class=\"bottom-content\"\n v-if=\"searchColumnCount && isShowForm && !autoRefreshOnSearchChange\"\n >\n <a-button\n size=\"small\"\n type=\"primary\"\n @click=\"handleRefresh\"\n >\n 查询\n </a-button>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { cloneDeep, debounce } from 'lodash';\nimport { computed, onMounted, PropType, ref } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport searchSummary from './searchSummary.vue';\nimport SearchConfigModal from './tableConfig/searchConfig.vue';\nimport { Condition, SearchConfig, SearchDisplayType, SearchType, ViewSearchItem } from './typing';\nimport SmallTableSerarchField from 'liyu-pc-base/components/FormRender/SmallTableSerarchField.vue';\nimport { getParamsCount, operator_type_map, options_for_date_eq, useTableProState } from './utils';\nimport { isEmpty, isNotEmpty } from 'liyu-pc-base/utils/function';\n\ndefineOptions({\n name: 'Search',\n});\n\nconst props = defineProps({\n searchConfig: {\n type: Array as PropType<SearchConfig[]>,\n required: true,\n },\n searchConditions: {\n type: Array<Condition>,\n required: true,\n },\n eventBus: {\n type: Object as any,\n required: false,\n },\n searchType: {\n type: String as () => SearchType,\n default: 'advanced',\n },\n searchDisplayType: {\n type: String as () => SearchDisplayType,\n default: 'hide',\n },\n searchColumnCount: {\n type: Number,\n default: 0,\n },\n viewSearchConfig: {\n type: Object as PropType<Record<string, ViewSearchItem>>,\n default: () => ({}),\n },\n autoRefreshOnSearchChange: {\n type: Boolean,\n default: false,\n },\n});\n\nconst emit = defineEmits(['update:searchConditions', 'viewSearchConfigChange', 'change']);\n\nconst { t } = useI18n();\nconst isShowForm = ref(false);\nconst searchConfigVisible = ref(false);\nconst formModel = ref<Record<string, any>>({});\nconst validateInfos = ref({});\nconst { config } = useTableProState();\n\nconst is_or_not_blank_or_null_options = ref([\n { value: 'yes', label: t('is_or_not_blank_or_null.yes') },\n { value: 'no', label: t('is_or_not_blank_or_null.no') },\n]);\n\nconst dataSource = computed(() => {\n const searchConditionsMap: Record<string, any> = {};\n for (const condition of props.searchConditions) {\n searchConditionsMap[condition.field_name] = {\n value: condition.value,\n operator: condition.operator,\n };\n }\n\n // 1. 过滤并处理基础字段数据\n const flatData = props.searchConfig\n ?.filter(item => {\n if (props.viewSearchConfig[item.field_name]) {\n return props.viewSearchConfig[item.field_name].checked !== false;\n } else {\n return item.checked !== false;\n }\n })\n ?.map(configItem => {\n const data = searchConditionsMap[configItem.field_name] || {\n operator: configItem.default_operator || 'eq',\n value: undefined,\n };\n let formValue = data.value;\n if (isNotEmpty(data.value)) {\n const paramsCount = getParamsCount(data.operator, configItem);\n if (paramsCount === 1 && formValue instanceof Array) {\n formValue = formValue[0];\n }\n }\n formModel.value[configItem.field_name] = formValue;\n return {\n ...configItem,\n value: data.value,\n operator: data.operator,\n model: 'default',\n _order: props.viewSearchConfig[configItem.field_name]?.order || 0,\n };\n })\n .sort((a, b) => a._order - b._order);\n\n // 2. 仿照 searchConfig.vue 的逻辑进行分组处理\n const groups: Record<string, any[]> = {};\n const orderList: any[] = []; // 用于记录分组和无分组字段的出现顺序\n\n flatData.forEach(item => {\n if (item.group_name) {\n if (!groups[item.group_name]) {\n groups[item.group_name] = [];\n orderList.push({\n field_name: `group_${item.group_name}`,\n label: item.group_name,\n is_group: true,\n _group_key: item.group_name,\n });\n }\n groups[item.group_name].push(item);\n } else {\n orderList.push(item);\n }\n });\n\n // 3. 构造最终的扁平数组,将组成员插在标题后\n const finalResult: any[] = [];\n orderList.forEach(item => {\n if (item.is_group) {\n finalResult.push(item);\n finalResult.push(...groups[item._group_key]);\n } else {\n finalResult.push(item);\n }\n });\n\n return finalResult;\n});\n\nconst getValue = (configItemAndValue: any) => {\n const value_count = getParamsCount(configItemAndValue.operator, configItemAndValue);\n let value = configItemAndValue.value;\n if (value_count == 1) {\n if (value instanceof Array) {\n return value[0] || undefined;\n } else {\n return value || undefined;\n }\n } else if (value_count == 2) {\n if (value instanceof Array) {\n const [first, seconds] = value;\n return [first, seconds];\n } else if (value) {\n const first = value;\n return [first, null];\n } else {\n return [null, null];\n }\n } else {\n return value;\n }\n};\nconst delayRefresh = debounce(() => {\n props.eventBus.emit('refresh');\n}, 500);\n\nconst onChange = (\n field_name: string,\n type: 'value' | 'operator',\n newValue: any,\n array_index: number | undefined = undefined,\n) => {\n const conditions = cloneDeep(props.searchConditions);\n const configItem = props.searchConfig.find(item => item.field_name === field_name);\n let value: any;\n let operator: string;\n let condition = conditions.find(item => item.field_name === field_name);\n if (type === 'value') {\n if (condition) {\n operator = condition.operator;\n } else {\n operator = configItem?.default_operator || 'eq';\n }\n if (array_index !== undefined) {\n const value_count = getParamsCount(newValue, configItem);\n if (condition) {\n value = condition.value;\n if (isEmpty(value) || !(value instanceof Array)) {\n value = [];\n for (let i = 0; i < value_count; i++) {\n value.push(null);\n }\n }\n value[array_index] = newValue;\n } else {\n value = [];\n for (let i = 0; i < value_count; i++) {\n value.push(null);\n }\n value[array_index] = newValue;\n }\n } else {\n if (isNotEmpty(newValue) && !(newValue instanceof Array)) {\n newValue = [newValue];\n }\n value = newValue;\n }\n } else if (type === 'operator') {\n operator = newValue;\n const value_count = getParamsCount(newValue, configItem);\n if (value_count) {\n value = [];\n for (let i = 0; i < value_count; i++) {\n value.push(null);\n }\n } else {\n value = undefined;\n }\n }\n if (condition) {\n condition.operator = operator!;\n condition.value = value;\n } else {\n let format = 'input';\n let class_name = 'str';\n if (configItem) {\n format = configItem.format || 'input';\n class_name = configItem.class_name || 'str';\n }\n condition = {\n field_name: field_name,\n value,\n operator: operator!,\n format,\n class_name,\n };\n conditions.push(condition);\n }\n emit('update:searchConditions', conditions);\n emit('change', conditions);\n if (props.autoRefreshOnSearchChange) {\n delayRefresh();\n }\n};\n\nconst handleUpdateSearchConditions = (newConditions: Condition[]) => {\n emit('update:searchConditions', newConditions);\n};\n\nconst handleRefresh = () => {\n props.eventBus.emit('refresh');\n};\n\nconst handleSearchConfigChange = (data: any) => {\n emit('viewSearchConfigChange', data);\n};\n\nconst search_display_type = computed(() => {\n return props.searchDisplayType || 'hide';\n});\n\nonMounted(() => {\n if (['show', 'show_no_hide'].includes(search_display_type.value)) {\n isShowForm.value = true;\n }\n});\n</script>\n\n<style lang=\"less\" scoped>\n.card {\n overflow: auto;\n max-height: 300px;\n background: #f2f5f7;\n}\n\n.condition-group {\n padding: 5px;\n}\n\n.close-icon {\n width: 15px;\n margin-top: 5px;\n margin-left: 5px;\n color: red;\n}\n\n.search-bar {\n background: #f2f5f7;\n text-align: right;\n}\n\n:deep(.divider .ant-divider) {\n margin: 0;\n}\n.search-form-wraper {\n padding-left: 2px;\n padding-right: 2px;\n max-height: 300px;\n overflow-y: auto;\n}\n.search-group-title {\n grid-column: span calc(var(--column-count) * 2);\n font-weight: bold;\n padding: 8px 4px 4px 4px;\n margin-bottom: 4px;\n border-bottom: 1px solid #f0f0f0;\n color: var(--primary-color, #1890ff);\n display: flex;\n align-items: center;\n width: 100%;\n flex-basis: 100%;\n &:not(:first-child) {\n margin-top: 8px;\n }\n}\n.search-form-grid {\n .search-form-grid-inner {\n display: grid;\n grid-template-columns: repeat(var(--column-count), max-content 1fr);\n gap: 2px 8px;\n align-items: center;\n .search-group-title {\n grid-column: span calc(var(--column-count) * 2);\n &:not(:first-child) {\n margin-top: 8px;\n }\n }\n :deep(.ant-form-item) {\n display: contents;\n margin-right: 0;\n margin-bottom: 2px;\n .ant-form-item-row,\n .ant-form-item-label,\n .ant-form-item-control,\n .ant-form-item-control-input,\n .ant-form-item-control-input-content {\n display: contents;\n }\n }\n .btn-content {\n grid-column: span calc(var(--column-count) * 2);\n }\n :deep(.ant-form-item-label) {\n justify-self: end;\n display: flex !important;\n align-items: center;\n max-width: 150px;\n .search-item-label-text {\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n padding-right: 8px;\n text-align: right;\n }\n }\n :deep(.ant-input-group) {\n display: flex !important;\n width: 100%;\n }\n }\n}\n.btn-content {\n padding: 4px;\n margin-left: auto;\n}\n.search-switch {\n display: inline-block;\n line-height: 32px;\n height: 32px;\n}\n:deep(.ant-select-selection-placeholder) {\n overflow: hidden;\n width: 100%;\n}\n.bottom-content {\n display: flex;\n justify-content: flex-end;\n padding: 8px 26px 8px 8px;\n}\n</style>\n","<template>\n <div style=\"padding: 8px\">\n <a-input-group\n compact\n size=\"small\"\n style=\"margin-bottom: 8px; display: flex\"\n >\n <a-select\n v-if=\"condition.operator_list?.length > 0 && searchType === 'advanced'\"\n :dropdownMatchSelectWidth=\"false\"\n :value=\"condition.operator\"\n @change=\"onChange('operator', $event)\"\n size=\"small\"\n >\n <a-select-option\n v-for=\"item in condition.operator_list\"\n :value=\"item\"\n :key=\"item\"\n >\n {{ operator_type_map[item] }}\n </a-select-option>\n </a-select>\n <template v-if=\"['is_or_not_blank_or_null', 'is_or_not_null'].includes(condition.operator)\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{\n ...condition,\n type: 'select',\n mode: 'default',\n format: 'choices',\n class_name: 'str',\n placeholder: '',\n }\"\n :formModel=\"formModel\"\n :options=\"is_or_not_blank_or_null_options\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange('value', $event)\"\n :field_width=\"condition.field_width || 155\"\n />\n </template>\n <template v-else-if=\"['between', 'notbetween'].includes(condition.operator)\">\n <template v-if=\"condition.type === 'datepicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{\n ...condition,\n type: 'rangepicker',\n format: condition.dateFormat,\n }\"\n :formModel=\"formModel\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width ? condition.field_width * 2 : 320\"\n @update:value=\"onChange('value', $event)\"\n />\n </template>\n <template v-else-if=\"condition.type === 'monthpicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{\n ...condition,\n type: 'monthrangepicker',\n }\"\n :formModel=\"formModel\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width ? condition.field_width * 2 : 320\"\n @update:value=\"onChange('value', $event)\"\n />\n </template>\n <template v-else>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue?.[0]\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 155\"\n @update:value=\"onChange('value', $event, 0)\"\n />\n <span\n class=\"range\"\n style=\"padding: 0 4px; line-height: 24px\"\n >\n ~\n </span>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue?.[1]\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 155\"\n @update:value=\"onChange('value', $event, 1)\"\n />\n </template>\n </template>\n <template v-else-if=\"condition.operator === '_eq'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{\n ...condition,\n type: 'select',\n mode: 'default',\n format: 'choices',\n class_name: 'str',\n placeholder: '',\n }\"\n :formModel=\"formModel\"\n :options=\"options_for_date_eq\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 155\"\n @update:value=\"onChange('value', $event)\"\n />\n </template>\n <template v-else-if=\"condition.type === 'datepicker' || condition.type === 'monthpicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{ ...condition, format: condition.dateFormat }\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 155\"\n @update:value=\"onChange('value', $event)\"\n />\n </template>\n <template v-else>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{\n ...condition,\n name: column.dataIndex,\n }\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 155\"\n @update:value=\"onChange('value', $event)\"\n />\n </template>\n </a-input-group>\n <div style=\"display: flex; justify-content: flex-end\">\n <a-button\n type=\"primary\"\n size=\"small\"\n style=\"width: 70px; margin-right: 8px\"\n @click=\"handleSearch\"\n >\n 查询\n </a-button>\n <a-button\n size=\"small\"\n style=\"width: 70px\"\n @click=\"handleReset\"\n >\n 重置\n </a-button>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, PropType, ref } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport SmallTableSerarchField from 'liyu-pc-base/components/FormRender/SmallTableSerarchField.vue';\nimport { getParamsCount, operator_type_map, options_for_date_eq } from './utils';\nimport { Column, SearchConditionItem, SearchConfig, SearchType } from './typing';\nimport { isArray } from 'lodash';\nimport { ConditionOperator } from 'liyu-pc-base/api/typing';\n\nconst props = defineProps({\n column: {\n type: Object as PropType<Column>,\n required: true,\n },\n searchConfig: {\n type: Array as PropType<SearchConfig[]>,\n required: true,\n },\n searchConditions: {\n type: Array as PropType<SearchConditionItem[]>,\n required: true,\n },\n searchType: {\n type: String as PropType<SearchType>,\n default: 'advanced',\n },\n confirm: {\n type: Function as PropType<() => void>,\n required: true,\n },\n clearFilters: {\n type: Function as PropType<() => void>,\n required: true,\n },\n});\n\nconst emit = defineEmits(['search', 'reset', 'update:searchConditions']);\n\nconst { t } = useI18n();\nconst formModel = ref<Record<string, any>>({});\nconst validateInfos = ref({});\n\nconst is_or_not_blank_or_null_options = ref([\n { value: 'yes', label: t('is_or_not_blank_or_null.yes') },\n { value: 'no', label: t('is_or_not_blank_or_null.no') },\n]);\n\nconst condition = computed<any>(() => {\n const dataIndex = props.column.dataIndex;\n const currentCondition = props.searchConditions.find(item => item.field_name === dataIndex);\n const configItem = props.searchConfig?.find(item => item.field_name === dataIndex);\n if (currentCondition) {\n return {\n ...configItem,\n ...currentCondition,\n };\n }\n return {\n ...configItem,\n operator: configItem?.default_operator || 'eq',\n value: undefined,\n };\n});\n\nconst fieldValue = computed(() => {\n const dataIndex = props.column.dataIndex;\n const configItem = props.searchConfig?.find(item => item.field_name === dataIndex);\n if (!configItem) return undefined;\n const value_count = getParamsCount(condition.value.operator, configItem);\n let value = condition.value.value;\n if (value_count == 1) {\n if (value instanceof Array) {\n return value[0] || undefined;\n } else {\n return value || undefined;\n }\n } else if (value_count == 2) {\n if (value instanceof Array) {\n return [value[0], value[1]];\n } else if (value) {\n return [value, null];\n } else {\n return [null, null];\n }\n } else {\n return value;\n }\n});\n\nconst onChange = (type: 'value' | 'operator', newValue: any, array_index?: number) => {\n const field_name = props.column.dataIndex!;\n const conditions = [...props.searchConditions];\n const configItem = props.searchConfig.find(item => item.field_name === field_name);\n if (!configItem) return;\n let value: any;\n let operator: ConditionOperator;\n let currentCondition = conditions.find(item => item.field_name === field_name);\n\n if (type === 'value') {\n operator = currentCondition\n ? currentCondition.operator\n : (configItem?.default_operator as ConditionOperator) || 'eq';\n if (array_index !== undefined) {\n const value_count = getParamsCount(operator, configItem);\n value = currentCondition?.value;\n if (!value || !isArray(value)) {\n value = new Array(value_count).fill(null);\n } else {\n value = [...value];\n }\n value[array_index] = newValue;\n } else {\n value = isArray(newValue)\n ? newValue\n : newValue !== undefined && newValue !== null\n ? [newValue]\n : [];\n }\n } else {\n operator = newValue as ConditionOperator;\n const value_count = getParamsCount(newValue, configItem);\n value = value_count ? new Array(value_count).fill(null) : undefined;\n }\n\n if (currentCondition) {\n currentCondition.operator = operator;\n currentCondition.value = value;\n } else {\n conditions.push({\n field_name,\n value,\n operator: operator,\n format: configItem?.format || 'input',\n class_name: configItem?.class_name || 'str',\n });\n }\n\n formModel.value[field_name] = isArray(value) ? value[0] : value;\n emit('update:searchConditions', conditions);\n};\n\nconst handleSearch = () => {\n const dataIndex = props.column.dataIndex!;\n const activeCondition = props.searchConditions.find(item => item.field_name === dataIndex);\n let searchVal = '';\n if (activeCondition) {\n searchVal = isArray(activeCondition.value) ? activeCondition.value[0] : activeCondition.value;\n }\n emit('search', { confirm: props.confirm, dataIndex, value: searchVal });\n};\n\nconst handleReset = () => {\n emit('reset', { clearFilters: props.clearFilters, dataIndex: props.column.dataIndex });\n};\n</script>\n","<template>\n <div style=\"padding: 8px\">\n <a-input-group\n compact\n size=\"small\"\n style=\"margin-bottom: 8px; display: flex\"\n >\n <a-select\n v-if=\"condition.operator_list?.length > 0 && searchType === 'advanced'\"\n :dropdownMatchSelectWidth=\"false\"\n :value=\"condition.operator\"\n @change=\"onChange('operator', $event)\"\n size=\"small\"\n >\n <a-select-option\n v-for=\"item in condition.operator_list\"\n :value=\"item\"\n :key=\"item\"\n >\n {{ operator_type_map[item] }}\n </a-select-option>\n </a-select>\n <template v-if=\"['is_or_not_blank_or_null', 'is_or_not_null'].includes(condition.operator)\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{\n ...condition,\n type: 'select',\n mode: 'default',\n format: 'choices',\n class_name: 'str',\n placeholder: '',\n }\"\n :formModel=\"formModel\"\n :options=\"is_or_not_blank_or_null_options\"\n :validateInfos=\"validateInfos\"\n @update:value=\"onChange('value', $event)\"\n :field_width=\"condition.field_width || 155\"\n />\n </template>\n <template v-else-if=\"['between', 'notbetween'].includes(condition.operator)\">\n <template v-if=\"condition.type === 'datepicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{\n ...condition,\n type: 'rangepicker',\n format: condition.dateFormat,\n }\"\n :formModel=\"formModel\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width ? condition.field_width * 2 : 320\"\n @update:value=\"onChange('value', $event)\"\n />\n </template>\n <template v-else-if=\"condition.type === 'monthpicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{\n ...condition,\n type: 'monthrangepicker',\n }\"\n :formModel=\"formModel\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width ? condition.field_width * 2 : 320\"\n @update:value=\"onChange('value', $event)\"\n />\n </template>\n <template v-else>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue?.[0]\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 155\"\n @update:value=\"onChange('value', $event, 0)\"\n />\n <span\n class=\"range\"\n style=\"padding: 0 4px; line-height: 24px\"\n >\n ~\n </span>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue?.[1]\"\n :field=\"condition\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 155\"\n @update:value=\"onChange('value', $event, 1)\"\n />\n </template>\n </template>\n <template v-else-if=\"condition.operator === '_eq'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{\n ...condition,\n type: 'select',\n mode: 'default',\n format: 'choices',\n class_name: 'str',\n placeholder: '',\n }\"\n :formModel=\"formModel\"\n :options=\"options_for_date_eq\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 155\"\n @update:value=\"onChange('value', $event)\"\n />\n </template>\n <template v-else-if=\"condition.type === 'datepicker' || condition.type === 'monthpicker'\">\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{ ...condition, format: condition.dateFormat }\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 155\"\n @update:value=\"onChange('value', $event)\"\n />\n </template>\n <template v-else>\n <SmallTableSerarchField\n :is_show_label=\"false\"\n :label=\"column.dataIndex\"\n :value=\"fieldValue\"\n :field=\"{\n ...condition,\n name: column.dataIndex,\n }\"\n :formModel=\"formModel\"\n :options=\"condition.options\"\n :validateInfos=\"validateInfos\"\n :field_width=\"condition.field_width || 155\"\n @update:value=\"onChange('value', $event)\"\n />\n </template>\n </a-input-group>\n <div style=\"display: flex; justify-content: flex-end\">\n <a-button\n type=\"primary\"\n size=\"small\"\n style=\"width: 70px; margin-right: 8px\"\n @click=\"handleSearch\"\n >\n 查询\n </a-button>\n <a-button\n size=\"small\"\n style=\"width: 70px\"\n @click=\"handleReset\"\n >\n 重置\n </a-button>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, PropType, ref } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport SmallTableSerarchField from 'liyu-pc-base/components/FormRender/SmallTableSerarchField.vue';\nimport { getParamsCount, operator_type_map, options_for_date_eq } from './utils';\nimport { Column, SearchConditionItem, SearchConfig, SearchType } from './typing';\nimport { isArray } from 'lodash';\nimport { ConditionOperator } from 'liyu-pc-base/api/typing';\n\nconst props = defineProps({\n column: {\n type: Object as PropType<Column>,\n required: true,\n },\n searchConfig: {\n type: Array as PropType<SearchConfig[]>,\n required: true,\n },\n searchConditions: {\n type: Array as PropType<SearchConditionItem[]>,\n required: true,\n },\n searchType: {\n type: String as PropType<SearchType>,\n default: 'advanced',\n },\n confirm: {\n type: Function as PropType<() => void>,\n required: true,\n },\n clearFilters: {\n type: Function as PropType<() => void>,\n required: true,\n },\n});\n\nconst emit = defineEmits(['search', 'reset', 'update:searchConditions']);\n\nconst { t } = useI18n();\nconst formModel = ref<Record<string, any>>({});\nconst validateInfos = ref({});\n\nconst is_or_not_blank_or_null_options = ref([\n { value: 'yes', label: t('is_or_not_blank_or_null.yes') },\n { value: 'no', label: t('is_or_not_blank_or_null.no') },\n]);\n\nconst condition = computed<any>(() => {\n const dataIndex = props.column.dataIndex;\n const currentCondition = props.searchConditions.find(item => item.field_name === dataIndex);\n const configItem = props.searchConfig?.find(item => item.field_name === dataIndex);\n if (currentCondition) {\n return {\n ...configItem,\n ...currentCondition,\n };\n }\n return {\n ...configItem,\n operator: configItem?.default_operator || 'eq',\n value: undefined,\n };\n});\n\nconst fieldValue = computed(() => {\n const dataIndex = props.column.dataIndex;\n const configItem = props.searchConfig?.find(item => item.field_name === dataIndex);\n if (!configItem) return undefined;\n const value_count = getParamsCount(condition.value.operator, configItem);\n let value = condition.value.value;\n if (value_count == 1) {\n if (value instanceof Array) {\n return value[0] || undefined;\n } else {\n return value || undefined;\n }\n } else if (value_count == 2) {\n if (value instanceof Array) {\n return [value[0], value[1]];\n } else if (value) {\n return [value, null];\n } else {\n return [null, null];\n }\n } else {\n return value;\n }\n});\n\nconst onChange = (type: 'value' | 'operator', newValue: any, array_index?: number) => {\n const field_name = props.column.dataIndex!;\n const conditions = [...props.searchConditions];\n const configItem = props.searchConfig.find(item => item.field_name === field_name);\n if (!configItem) return;\n let value: any;\n let operator: ConditionOperator;\n let currentCondition = conditions.find(item => item.field_name === field_name);\n\n if (type === 'value') {\n operator = currentCondition\n ? currentCondition.operator\n : (configItem?.default_operator as ConditionOperator) || 'eq';\n if (array_index !== undefined) {\n const value_count = getParamsCount(operator, configItem);\n value = currentCondition?.value;\n if (!value || !isArray(value)) {\n value = new Array(value_count).fill(null);\n } else {\n value = [...value];\n }\n value[array_index] = newValue;\n } else {\n value = isArray(newValue)\n ? newValue\n : newValue !== undefined && newValue !== null\n ? [newValue]\n : [];\n }\n } else {\n operator = newValue as ConditionOperator;\n const value_count = getParamsCount(newValue, configItem);\n value = value_count ? new Array(value_count).fill(null) : undefined;\n }\n\n if (currentCondition) {\n currentCondition.operator = operator;\n currentCondition.value = value;\n } else {\n conditions.push({\n field_name,\n value,\n operator: operator,\n format: configItem?.format || 'input',\n class_name: configItem?.class_name || 'str',\n });\n }\n\n formModel.value[field_name] = isArray(value) ? value[0] : value;\n emit('update:searchConditions', conditions);\n};\n\nconst handleSearch = () => {\n const dataIndex = props.column.dataIndex!;\n const activeCondition = props.searchConditions.find(item => item.field_name === dataIndex);\n let searchVal = '';\n if (activeCondition) {\n searchVal = isArray(activeCondition.value) ? activeCondition.value[0] : activeCondition.value;\n }\n emit('search', { confirm: props.confirm, dataIndex, value: searchVal });\n};\n\nconst handleReset = () => {\n emit('reset', { clearFilters: props.clearFilters, dataIndex: props.column.dataIndex });\n};\n</script>\n","<template>\n <div class=\"columns-config-wrapper\">\n <a-input\n v-model:value=\"searchText\"\n :placeholder=\"$t('搜索列名/字段名')\"\n allow-clear\n style=\"margin-bottom: 8px\"\n />\n <s-table\n :columns=\"columnsConfig\"\n :rowHeight=\"30\"\n :data-source=\"filteredDataSource\"\n :row-selection=\"rowSelection\"\n v-model:selectedRowKeys=\"selectedRowKeys\"\n expand-row-by-click\n @row-drag-end=\"onRowDragEnd\"\n :row-key=\"'key'\"\n :pagination=\"false\"\n >\n <template #bodyCell=\"{ column, index, text, record }\">\n <template v-if=\"column.dataIndex == 'fixed'\">\n <a-radio-group\n v-if=\"!record?.is_children\"\n v-model:value=\"record.fixed\"\n size=\"small\"\n @change=\"change_fixed\"\n >\n <a-radio-button value=\"left\">{{ $t('左') }}</a-radio-button>\n <a-radio-button :value=\"undefined\">{{ $t('不固定') }}</a-radio-button>\n <a-radio-button value=\"right\">{{ $t('右') }}</a-radio-button>\n </a-radio-group>\n </template>\n <template v-if=\"column.dataIndex == 'autoHeight'\">\n <a-switch\n v-if=\"!(record.children && record.children.length > 0)\"\n v-model:checked=\"record.autoHeight\"\n :checked-value=\"true\"\n :un-checked-value=\"false\"\n :checked-children=\"$t('自动')\"\n :un-checked-children=\"$t('固定')\"\n @change=\"change_autoHeight\"\n />\n </template>\n <template v-if=\"column.dataIndex == 'autoWidth'\">\n <a-switch\n v-if=\"!(record.children && record.children.length > 0) && record?.resizable\"\n v-model:checked=\"record.autoWidth\"\n :checked-value=\"true\"\n :un-checked-value=\"false\"\n :checked-children=\"$t('自动')\"\n :un-checked-children=\"$t('固定')\"\n @click=\"change_autoWidth\"\n />\n </template>\n <template v-if=\"column.dataIndex == 'ellipsis'\">\n <a-switch\n v-if=\"!(record.children && record.children.length > 0) && record?.resizable\"\n v-model:checked=\"record.ellipsis\"\n :checked-value=\"true\"\n :un-checked-value=\"false\"\n :checked-children=\"$t('开启')\"\n :un-checked-children=\"$t('关闭')\"\n @click=\"change_ellipsis(record)\"\n />\n </template>\n </template>\n </s-table>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, ref } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport { Column } from '../typing';\n\nexport default defineComponent({\n name: 'ColumnsConfig',\n props: {\n columns: {\n type: Array as () => Array<Column>,\n default: () => [],\n },\n },\n emits: ['change'],\n setup(props, { emit }) {\n const { t } = useI18n();\n const searchText = ref('');\n\n const columnsConfig = ref([\n {\n title: t('列名称'),\n dataIndex: 'title',\n key: 'title',\n rowDrag: true,\n width: 270,\n },\n {\n title: t('冻结列'),\n dataIndex: 'fixed',\n key: 'fixed',\n width: 200,\n },\n {\n title: t('行高'),\n dataIndex: 'autoHeight',\n width: 100,\n key: 'autoHeight',\n },\n {\n title: t('列宽'),\n dataIndex: 'autoWidth',\n width: 100,\n key: 'autoWidth',\n },\n {\n title: t('超宽省略'),\n dataIndex: 'ellipsis',\n width: 100,\n key: 'ellipsis',\n },\n ]);\n\n const dataSource = computed(() => {\n return props.columns.filter(item => item.key !== 'index' && item.key !== 'action');\n });\n\n const filteredDataSource = computed(() => {\n if (!searchText.value) return dataSource.value;\n const search = searchText.value.toLowerCase();\n\n const filterNode = (nodes: any[]) => {\n return nodes.reduce((acc: any[], node: any) => {\n const matchSelf =\n node.title?.toLowerCase().includes(search) ||\n node.dataIndex?.toLowerCase().includes(search) ||\n node.key?.toLowerCase().includes(search);\n\n if (node.children && node.children.length > 0) {\n const filteredChildren = filterNode(node.children);\n if (filteredChildren.length > 0) {\n acc.push({ ...node, children: filteredChildren });\n } else if (matchSelf) {\n acc.push({ ...node, children: [] });\n }\n } else if (matchSelf) {\n acc.push(node);\n }\n return acc;\n }, []);\n };\n\n return filterNode(dataSource.value);\n });\n\n const getAllKeysChecked = (children: any) => {\n let allChildrenChecked = true;\n children.forEach((item: any) => {\n if (item.children && item.children.length > 0) {\n allChildrenChecked = allChildrenChecked && getAllKeysChecked(item.children);\n } else {\n allChildrenChecked = allChildrenChecked && item?.checked !== false;\n }\n });\n return allChildrenChecked;\n };\n\n const add_selectedRowKeys = (record: any) => {\n let list = [];\n record.children.forEach((item: any) => {\n if (item.children && item.children.length > 0) {\n const allChildrenChecked = getAllKeysChecked(item.children);\n if (allChildrenChecked) {\n list.push(item.key);\n }\n list = list.concat(add_selectedRowKeys(item));\n } else {\n if (item?.checked !== false) {\n list.push(item.key);\n }\n }\n });\n return list;\n };\n\n const selectedRowKeys = computed(() => {\n if (props.columns) {\n let list = [];\n props.columns.forEach((item: any) => {\n if (item.children && item.children.length > 0) {\n const allChildrenChecked = getAllKeysChecked(item.children);\n if (allChildrenChecked) {\n list.push(item.key);\n }\n list = list.concat(add_selectedRowKeys(item));\n } else {\n if (item?.checked) {\n list.push(item.key);\n }\n }\n });\n return list;\n } else {\n return [];\n }\n });\n\n const rowSelection = ref({\n checkStrictly: false,\n hideSelectAll: true,\n onSelect: (record: any, selected: boolean) => {\n const change_selecte_children_props = (children: any) => {\n children.forEach((item: any) => {\n if (item.children && item.children.length > 0) {\n change_selecte_children_props(item.children);\n }\n item.checked = selected;\n });\n };\n\n const change_selecte_props = (obj: any, key: any, is_checked: any) => {\n obj.children.forEach((item: any) => {\n if (item.key == key) {\n if (is_checked && item.children && item.children.length > 0) {\n change_selecte_children_props(item.children);\n }\n if (selected) {\n item.checked = true;\n obj.checked = true;\n if (obj.is_children) {\n change_selecte_dataSource(obj.key, false);\n }\n } else {\n item.checked = false;\n }\n }\n if (item.children && item.children.length > 0) {\n change_selecte_props(item, key, is_checked);\n }\n });\n };\n\n const change_selecte_dataSource = (key: any, is_checked: any) => {\n dataSource.value.forEach((item: any) => {\n if (item.key == key) {\n if (item.children && item.children.length > 0) {\n change_selecte_children_props(item.children);\n }\n item.checked = selected;\n }\n if (item.children && item.children.length > 0) {\n change_selecte_props(item, key, is_checked);\n }\n });\n };\n\n change_selecte_dataSource(record.key, true);\n emit('change', dataSource.value);\n },\n });\n\n const findParent = (data: any[], childKey: any) => {\n let foundParentKey: any;\n const searchParent = (id: any, keys: any[], childKeys: any) => {\n for (const key of keys) {\n if (key.key === childKeys) {\n foundParentKey = id;\n return foundParentKey;\n } else if (key.children && key.children.length > 0) {\n foundParentKey = searchParent(key.key, key.children, childKeys);\n if (foundParentKey !== undefined) return foundParentKey;\n }\n }\n return undefined;\n };\n return searchParent(null, data, childKey);\n };\n\n const onRowDragEnd = ({ record, preTargetInfo, nextTargetInfo }) => {\n return new Promise((reslove, reject) => {\n // 获取当前拖拽节点的父节点ID\n const currentParentId = findParent(dataSource.value, record.key);\n\n if (preTargetInfo) {\n // 如果拖拽到某个节点之后,检查该目标节点的父节点是否与当前节点相同\n const targetParentId = findParent(dataSource.value, preTargetInfo.record.key);\n if (currentParentId === targetParentId) {\n reslove(true);\n } else {\n reject();\n }\n } else if (nextTargetInfo) {\n // 如果拖拽到某个节点之前,检查该目标节点的父节点是否与当前节点相同\n const targetParentId = findParent(dataSource.value, nextTargetInfo.record.key);\n if (currentParentId === targetParentId) {\n reslove(true);\n } else {\n reject();\n }\n } else {\n reject();\n }\n }).then(() => {\n setTimeout(() => {\n emit('change', dataSource.value);\n }, 200);\n });\n };\n\n const change_fixed = () => emit('change', dataSource.value);\n const change_autoHeight = () => emit('change', dataSource.value);\n const change_autoWidth = () => emit('change', dataSource.value);\n\n const recursion_change_ellipsis = (obj: any, record: any) => {\n obj.children.forEach((item: any) => {\n if (item.key == record.key) {\n item.ellipsis = record.ellipsis;\n }\n if (item.children && item.children.length > 0) {\n recursion_change_ellipsis(item, record);\n }\n });\n };\n\n const change_ellipsis = (record: any) => {\n const list = dataSource.value;\n list.forEach((item: any) => {\n if (item.key == record.key) {\n item.ellipsis = record.ellipsis;\n }\n if (item.children && item.children.length > 0) {\n recursion_change_ellipsis(item, record);\n }\n });\n emit('change', list);\n };\n\n return {\n searchText,\n columnsConfig,\n dataSource,\n filteredDataSource,\n rowSelection,\n selectedRowKeys,\n onRowDragEnd,\n change_fixed,\n change_autoHeight,\n change_autoWidth,\n change_ellipsis,\n };\n },\n});\n</script>\n\n<style lang=\"less\" scoped>\n.columns-config-wrapper {\n padding: 8px 0;\n}\n</style>\n","<template>\n <div class=\"columns-config-wrapper\">\n <a-input\n v-model:value=\"searchText\"\n :placeholder=\"$t('搜索列名/字段名')\"\n allow-clear\n style=\"margin-bottom: 8px\"\n />\n <s-table\n :columns=\"columnsConfig\"\n :rowHeight=\"30\"\n :data-source=\"filteredDataSource\"\n :row-selection=\"rowSelection\"\n v-model:selectedRowKeys=\"selectedRowKeys\"\n expand-row-by-click\n @row-drag-end=\"onRowDragEnd\"\n :row-key=\"'key'\"\n :pagination=\"false\"\n >\n <template #bodyCell=\"{ column, index, text, record }\">\n <template v-if=\"column.dataIndex == 'fixed'\">\n <a-radio-group\n v-if=\"!record?.is_children\"\n v-model:value=\"record.fixed\"\n size=\"small\"\n @change=\"change_fixed\"\n >\n <a-radio-button value=\"left\">{{ $t('左') }}</a-radio-button>\n <a-radio-button :value=\"undefined\">{{ $t('不固定') }}</a-radio-button>\n <a-radio-button value=\"right\">{{ $t('右') }}</a-radio-button>\n </a-radio-group>\n </template>\n <template v-if=\"column.dataIndex == 'autoHeight'\">\n <a-switch\n v-if=\"!(record.children && record.children.length > 0)\"\n v-model:checked=\"record.autoHeight\"\n :checked-value=\"true\"\n :un-checked-value=\"false\"\n :checked-children=\"$t('自动')\"\n :un-checked-children=\"$t('固定')\"\n @change=\"change_autoHeight\"\n />\n </template>\n <template v-if=\"column.dataIndex == 'autoWidth'\">\n <a-switch\n v-if=\"!(record.children && record.children.length > 0) && record?.resizable\"\n v-model:checked=\"record.autoWidth\"\n :checked-value=\"true\"\n :un-checked-value=\"false\"\n :checked-children=\"$t('自动')\"\n :un-checked-children=\"$t('固定')\"\n @click=\"change_autoWidth\"\n />\n </template>\n <template v-if=\"column.dataIndex == 'ellipsis'\">\n <a-switch\n v-if=\"!(record.children && record.children.length > 0) && record?.resizable\"\n v-model:checked=\"record.ellipsis\"\n :checked-value=\"true\"\n :un-checked-value=\"false\"\n :checked-children=\"$t('开启')\"\n :un-checked-children=\"$t('关闭')\"\n @click=\"change_ellipsis(record)\"\n />\n </template>\n </template>\n </s-table>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, ref } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport { Column } from '../typing';\n\nexport default defineComponent({\n name: 'ColumnsConfig',\n props: {\n columns: {\n type: Array as () => Array<Column>,\n default: () => [],\n },\n },\n emits: ['change'],\n setup(props, { emit }) {\n const { t } = useI18n();\n const searchText = ref('');\n\n const columnsConfig = ref([\n {\n title: t('列名称'),\n dataIndex: 'title',\n key: 'title',\n rowDrag: true,\n width: 270,\n },\n {\n title: t('冻结列'),\n dataIndex: 'fixed',\n key: 'fixed',\n width: 200,\n },\n {\n title: t('行高'),\n dataIndex: 'autoHeight',\n width: 100,\n key: 'autoHeight',\n },\n {\n title: t('列宽'),\n dataIndex: 'autoWidth',\n width: 100,\n key: 'autoWidth',\n },\n {\n title: t('超宽省略'),\n dataIndex: 'ellipsis',\n width: 100,\n key: 'ellipsis',\n },\n ]);\n\n const dataSource = computed(() => {\n return props.columns.filter(item => item.key !== 'index' && item.key !== 'action');\n });\n\n const filteredDataSource = computed(() => {\n if (!searchText.value) return dataSource.value;\n const search = searchText.value.toLowerCase();\n\n const filterNode = (nodes: any[]) => {\n return nodes.reduce((acc: any[], node: any) => {\n const matchSelf =\n node.title?.toLowerCase().includes(search) ||\n node.dataIndex?.toLowerCase().includes(search) ||\n node.key?.toLowerCase().includes(search);\n\n if (node.children && node.children.length > 0) {\n const filteredChildren = filterNode(node.children);\n if (filteredChildren.length > 0) {\n acc.push({ ...node, children: filteredChildren });\n } else if (matchSelf) {\n acc.push({ ...node, children: [] });\n }\n } else if (matchSelf) {\n acc.push(node);\n }\n return acc;\n }, []);\n };\n\n return filterNode(dataSource.value);\n });\n\n const getAllKeysChecked = (children: any) => {\n let allChildrenChecked = true;\n children.forEach((item: any) => {\n if (item.children && item.children.length > 0) {\n allChildrenChecked = allChildrenChecked && getAllKeysChecked(item.children);\n } else {\n allChildrenChecked = allChildrenChecked && item?.checked !== false;\n }\n });\n return allChildrenChecked;\n };\n\n const add_selectedRowKeys = (record: any) => {\n let list = [];\n record.children.forEach((item: any) => {\n if (item.children && item.children.length > 0) {\n const allChildrenChecked = getAllKeysChecked(item.children);\n if (allChildrenChecked) {\n list.push(item.key);\n }\n list = list.concat(add_selectedRowKeys(item));\n } else {\n if (item?.checked !== false) {\n list.push(item.key);\n }\n }\n });\n return list;\n };\n\n const selectedRowKeys = computed(() => {\n if (props.columns) {\n let list = [];\n props.columns.forEach((item: any) => {\n if (item.children && item.children.length > 0) {\n const allChildrenChecked = getAllKeysChecked(item.children);\n if (allChildrenChecked) {\n list.push(item.key);\n }\n list = list.concat(add_selectedRowKeys(item));\n } else {\n if (item?.checked) {\n list.push(item.key);\n }\n }\n });\n return list;\n } else {\n return [];\n }\n });\n\n const rowSelection = ref({\n checkStrictly: false,\n hideSelectAll: true,\n onSelect: (record: any, selected: boolean) => {\n const change_selecte_children_props = (children: any) => {\n children.forEach((item: any) => {\n if (item.children && item.children.length > 0) {\n change_selecte_children_props(item.children);\n }\n item.checked = selected;\n });\n };\n\n const change_selecte_props = (obj: any, key: any, is_checked: any) => {\n obj.children.forEach((item: any) => {\n if (item.key == key) {\n if (is_checked && item.children && item.children.length > 0) {\n change_selecte_children_props(item.children);\n }\n if (selected) {\n item.checked = true;\n obj.checked = true;\n if (obj.is_children) {\n change_selecte_dataSource(obj.key, false);\n }\n } else {\n item.checked = false;\n }\n }\n if (item.children && item.children.length > 0) {\n change_selecte_props(item, key, is_checked);\n }\n });\n };\n\n const change_selecte_dataSource = (key: any, is_checked: any) => {\n dataSource.value.forEach((item: any) => {\n if (item.key == key) {\n if (item.children && item.children.length > 0) {\n change_selecte_children_props(item.children);\n }\n item.checked = selected;\n }\n if (item.children && item.children.length > 0) {\n change_selecte_props(item, key, is_checked);\n }\n });\n };\n\n change_selecte_dataSource(record.key, true);\n emit('change', dataSource.value);\n },\n });\n\n const findParent = (data: any[], childKey: any) => {\n let foundParentKey: any;\n const searchParent = (id: any, keys: any[], childKeys: any) => {\n for (const key of keys) {\n if (key.key === childKeys) {\n foundParentKey = id;\n return foundParentKey;\n } else if (key.children && key.children.length > 0) {\n foundParentKey = searchParent(key.key, key.children, childKeys);\n if (foundParentKey !== undefined) return foundParentKey;\n }\n }\n return undefined;\n };\n return searchParent(null, data, childKey);\n };\n\n const onRowDragEnd = ({ record, preTargetInfo, nextTargetInfo }) => {\n return new Promise((reslove, reject) => {\n // 获取当前拖拽节点的父节点ID\n const currentParentId = findParent(dataSource.value, record.key);\n\n if (preTargetInfo) {\n // 如果拖拽到某个节点之后,检查该目标节点的父节点是否与当前节点相同\n const targetParentId = findParent(dataSource.value, preTargetInfo.record.key);\n if (currentParentId === targetParentId) {\n reslove(true);\n } else {\n reject();\n }\n } else if (nextTargetInfo) {\n // 如果拖拽到某个节点之前,检查该目标节点的父节点是否与当前节点相同\n const targetParentId = findParent(dataSource.value, nextTargetInfo.record.key);\n if (currentParentId === targetParentId) {\n reslove(true);\n } else {\n reject();\n }\n } else {\n reject();\n }\n }).then(() => {\n setTimeout(() => {\n emit('change', dataSource.value);\n }, 200);\n });\n };\n\n const change_fixed = () => emit('change', dataSource.value);\n const change_autoHeight = () => emit('change', dataSource.value);\n const change_autoWidth = () => emit('change', dataSource.value);\n\n const recursion_change_ellipsis = (obj: any, record: any) => {\n obj.children.forEach((item: any) => {\n if (item.key == record.key) {\n item.ellipsis = record.ellipsis;\n }\n if (item.children && item.children.length > 0) {\n recursion_change_ellipsis(item, record);\n }\n });\n };\n\n const change_ellipsis = (record: any) => {\n const list = dataSource.value;\n list.forEach((item: any) => {\n if (item.key == record.key) {\n item.ellipsis = record.ellipsis;\n }\n if (item.children && item.children.length > 0) {\n recursion_change_ellipsis(item, record);\n }\n });\n emit('change', list);\n };\n\n return {\n searchText,\n columnsConfig,\n dataSource,\n filteredDataSource,\n rowSelection,\n selectedRowKeys,\n onRowDragEnd,\n change_fixed,\n change_autoHeight,\n change_autoWidth,\n change_ellipsis,\n };\n },\n});\n</script>\n\n<style lang=\"less\" scoped>\n.columns-config-wrapper {\n padding: 8px 0;\n}\n</style>\n","import { ExclamationCircleOutlined } from '@ant-design/icons-vue';\nimport { message, Modal } from 'ant-design-vue';\nimport { h, reactive, Ref } from 'vue';\nimport { create_view_settings, update_view_settings } from 'liyu-pc-base/api/view-model';\nimport modalBox from 'liyu-pc-base/components/form-modal/modal-tools';\nexport interface ViewHook {\n saveView: () => void;\n addView: (view_type: string | null) => void;\n}\nexport interface ViewHookProps {\n currentView: Ref<any>;\n getViewData: () => any;\n isViewChange: Ref<boolean>;\n userid: number;\n view_project__flag: string;\n view_menu__flag: string;\n view_menu__name: string;\n fetchViews: () => void;\n is_auth: boolean;\n t: (key: string) => string;\n}\n\nexport const useView = (props: ViewHookProps): ViewHook => {\n const {\n currentView,\n getViewData,\n isViewChange,\n userid,\n view_project__flag,\n view_menu__flag,\n view_menu__name,\n fetchViews,\n is_auth,\n t,\n } = props;\n const saveView = () => {\n Modal.confirm({\n title: () => '确定覆盖视图吗?',\n content: '当前视图原有的数据会被覆盖',\n icon: () => h(ExclamationCircleOutlined),\n okText: '确定',\n async onOk() {\n currentView.value.data = getViewData();\n await update_view_settings({\n view_settings_id: currentView.value.id,\n data: currentView.value.data,\n });\n isViewChange.value = false;\n message.success('修改成功');\n },\n onCancel() {},\n });\n };\n const addView = (view_type: string | null) => {\n const tempModal = reactive({\n open: true,\n loading: false,\n title: t('新建视图'),\n form: {\n settings: { labelAlign: 'right', layout: 'vertical', col: [] },\n fields: [\n {\n type: 'input',\n name: 'name',\n label: t('视图名称'),\n disabled: false,\n allowClear: true,\n inputType: 'text',\n defaultValue: '',\n placeholder: t('请输入视图名称'),\n },\n ],\n rules: reactive({\n name: [{ required: true, message: t('请输入视图名称') }],\n }),\n model: reactive({ name: '', is_system: [false], view_type: 'personal' }),\n },\n options: {\n view_type: [\n { name: t('个人视图(仅自己可见)'), value: 'personal' },\n { name: t('公共视图(项目成员均可见)'), value: 'public' },\n ],\n is_system: [{ name: t('设为系统视图'), value: true }],\n },\n ok: async (data: any) => {\n const type = view_type || data.view_type || 'personal';\n const res = await create_view_settings({\n user_id: type === 'personal' ? userid : null,\n name: data.name,\n view_project__flag: view_project__flag,\n view_menu__flag: view_menu__flag,\n view_menu__name: view_menu__name,\n is_system: data.is_system && data.is_system[0],\n data: getViewData(),\n });\n await fetchViews();\n currentView.value = res;\n message.success(t('创建成功'));\n isViewChange.value = false;\n },\n });\n if (!view_type) {\n tempModal.form.fields.push({\n type: 'radio',\n name: 'view_type',\n label: t('视图可见范围'),\n disabled: false,\n allowClear: true,\n labelKey: 'name',\n valueKey: 'value',\n defaultValue: '',\n placeholder: '',\n } as any);\n }\n if (is_auth) {\n tempModal.form.fields.push({\n type: 'checkbox',\n name: 'is_system',\n label: '',\n disabled: false,\n allowClear: true,\n labelKey: 'name',\n valueKey: 'value',\n defaultValue: [false],\n } as any);\n }\n modalBox(tempModal);\n };\n return {\n saveView,\n addView,\n };\n};\n","<template>\n <div class=\"view-manage-container\">\n <div class=\"view-section\">\n <div class=\"section-header\">\n <span class=\"title\">{{ $t('个人视图') }}</span>\n <div class=\"header-actions\">\n <a-button\n type=\"link\"\n size=\"small\"\n @click=\"handleManageView('personal')\"\n >\n <template #icon><setting-outlined /></template>\n </a-button>\n <a-button\n type=\"link\"\n size=\"small\"\n @click=\"addView('personal')\"\n >\n <template #icon><plus-outlined /></template>\n </a-button>\n </div>\n </div>\n <s-table\n :selectedRowKeys=\"selectedRowKeys\"\n :columns=\"viewTableColumns\"\n :dataSource=\"personData\"\n :pagination=\"false\"\n size=\"small\"\n :showHeader=\"false\"\n row-key=\"id\"\n :range-selection=\"false\"\n >\n <template #bodyCell=\"{ column, record }\">\n <template v-if=\"column.dataIndex === 'name'\">\n <div class=\"view-item-row\">\n <span\n class=\"view-name\"\n @click=\"handleApplyView(record)\"\n >\n {{ record.name }}\n <a-tag\n v-if=\"record.is_default\"\n color=\"blue\"\n size=\"small\"\n style=\"margin-left: 4px\"\n >\n {{ $t('默认') }}\n </a-tag>\n <a-tag\n v-if=\"record.is_system\"\n color=\"orange\"\n size=\"small\"\n style=\"margin-left: 4px\"\n >\n {{ $t('系统') }}\n </a-tag>\n </span>\n <div\n class=\"view-actions\"\n v-if=\"!record.is_system || is_auth\"\n >\n <a-tooltip :title=\"$t('设为默认')\">\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"handleSetDefault(record)\"\n >\n <template #icon>\n <star-filled\n v-if=\"record.is_default\"\n style=\"color: #fadb14\"\n />\n <star-outlined v-else />\n </template>\n </a-button>\n </a-tooltip>\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"handleEditView(record)\"\n >\n <template #icon><edit-outlined /></template>\n </a-button>\n <a-button\n type=\"text\"\n size=\"small\"\n danger\n @click=\"handleDeleteView(record)\"\n >\n <template #icon><delete-outlined /></template>\n </a-button>\n </div>\n </div>\n </template>\n </template>\n </s-table>\n </div>\n <div class=\"view-section\">\n <div class=\"section-header\">\n <span class=\"title\">{{ $t('公共视图') }}</span>\n <div class=\"header-actions\">\n <a-button\n type=\"link\"\n size=\"small\"\n @click=\"handleManageView('public')\"\n >\n <template #icon><setting-outlined /></template>\n </a-button>\n <a-button\n type=\"link\"\n size=\"small\"\n @click=\"addView('public')\"\n >\n <template #icon><plus-outlined /></template>\n </a-button>\n </div>\n </div>\n <s-table\n :selectedRowKeys=\"selectedRowKeys\"\n :columns=\"viewTableColumns\"\n :dataSource=\"publicData\"\n :pagination=\"false\"\n size=\"small\"\n :showHeader=\"false\"\n row-key=\"id\"\n :range-selection=\"false\"\n >\n <template #bodyCell=\"{ column, record }\">\n <template v-if=\"column.dataIndex === 'name'\">\n <div class=\"view-item-row\">\n <span\n class=\"view-name\"\n @click=\"handleApplyView(record)\"\n >\n {{ record.name }}\n <a-tag\n v-if=\"record.is_default\"\n color=\"blue\"\n size=\"small\"\n style=\"margin-left: 4px\"\n >\n {{ $t('默认') }}\n </a-tag>\n <a-tag\n v-if=\"record.is_system\"\n color=\"orange\"\n size=\"small\"\n style=\"margin-left: 4px\"\n >\n {{ $t('系统') }}\n </a-tag>\n </span>\n <div\n class=\"view-actions\"\n v-if=\"!record.is_system || is_auth\"\n >\n <a-tooltip :title=\"$t('设为默认')\">\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"handleSetDefault(record)\"\n >\n <template #icon>\n <star-filled\n v-if=\"record.is_default\"\n style=\"color: #fadb14\"\n />\n <star-outlined v-else />\n </template>\n </a-button>\n </a-tooltip>\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"handleEditView(record)\"\n >\n <template #icon><edit-outlined /></template>\n </a-button>\n <a-button\n type=\"text\"\n size=\"small\"\n danger\n @click=\"handleDeleteView(record)\"\n >\n <template #icon><delete-outlined /></template>\n </a-button>\n </div>\n </div>\n </template>\n </template>\n </s-table>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, ref, onMounted, reactive, createVNode } from 'vue';\nimport {\n SettingOutlined,\n PlusOutlined,\n DeleteOutlined,\n EditOutlined,\n StarOutlined,\n StarFilled,\n ExclamationCircleOutlined,\n} from '@ant-design/icons-vue';\nimport { useI18n } from 'vue-i18n';\nimport { useUserStore, useEnv } from 'liyu-pc-base/init-plugin';\nimport {\n delete_view_settings,\n update_view_settings,\n set_view_settings_default,\n refresh_view_settings_cache,\n change_view_settings_sort,\n} from 'liyu-pc-base/api/view-model';\nimport { message, Modal } from 'ant-design-vue';\nimport modalBox from 'liyu-pc-base/components/form-modal/modal-tools';\nimport { useTableProState } from '../utils';\nimport { Column } from '../typing';\nimport { useView } from '../hooks/view';\n\nexport default defineComponent({\n name: 'ViewsConfig',\n components: {\n SettingOutlined,\n PlusOutlined,\n DeleteOutlined,\n EditOutlined,\n StarOutlined,\n StarFilled,\n },\n props: {\n columns: {\n type: Array as () => Array<Column>,\n default: () => [],\n },\n view_key: {\n type: String,\n default: '',\n },\n view_flag_name: {\n type: String,\n default: '',\n },\n is_view: {\n type: Boolean,\n default: false,\n },\n },\n setup(props) {\n const { t } = useI18n();\n const userStore = useUserStore();\n const env = useEnv();\n const current_org = userStore.currentOrg;\n const userid = userStore.userid;\n const VIEW_SYSTEM_EDIT = 'view_system_edit';\n const is_auth = ref(userStore.CHECK_AUTH(VIEW_SYSTEM_EDIT));\n\n const { setViewData, getViewData, viewDataList, fetchViews, currentView, isViewChange } =\n useTableProState();\n\n const viewTableColumns = [{ dataIndex: 'name', key: 'name' }];\n const selectedRowKeys = computed(() => {\n return [currentView.value?.id];\n });\n\n const personData = computed(() => {\n const list = viewDataList.value\n .filter((item: any) => !!item.user_id && item.is_system)\n .sort((a, b) => (a.sort == b.sort ? a.id - b.id : a.sort - b.sort));\n const list1 = viewDataList.value\n .filter((item: any) => !!item.user_id && !item.is_system)\n .sort((a, b) => (a.sort == b.sort ? a.id - b.id : a.sort - b.sort));\n return list.concat(list1);\n });\n\n const publicData = computed(() => {\n const list = viewDataList.value\n .filter((item: any) => !item.user_id && item.is_system)\n .sort((a, b) => (a.sort == b.sort ? a.id - b.id : a.sort - b.sort));\n const list1 = viewDataList.value\n .filter((item: any) => !item.user_id && !item.is_system)\n .sort((a, b) => (a.sort == b.sort ? a.id - b.id : a.sort - b.sort));\n return list.concat(list1);\n });\n\n const handleApplyView = (view: any) => {\n if (currentView.value?.id === view.id) {\n currentView.value = { id: 'no-view' };\n setViewData(null);\n message.warning(t('视图已取消'));\n } else {\n currentView.value = view;\n setViewData(view.data);\n message.success(t('已应用视图:') + view.name);\n }\n };\n\n const handleSetDefault = async (view: any) => {\n try {\n await set_view_settings_default({\n org_id: current_org.id,\n view_settings_id: view.id,\n });\n await refresh_view_settings_cache({\n org_id: current_org.id,\n view_settings_id: view.id,\n });\n message.success(t('设置默认成功'));\n fetchViews();\n } catch (e) {\n message.error(t('设置默认失败'));\n }\n };\n\n const handleDeleteView = (view: any) => {\n Modal.confirm({\n title: t('确认删除视图?'),\n content: t('视图删除后不可恢复,是否确认删除?'),\n icon: createVNode(ExclamationCircleOutlined),\n onOk: async () => {\n await delete_view_settings({\n org_id: current_org.id,\n view_settings_id: view.id,\n });\n message.success(t('删除成功'));\n fetchViews();\n },\n });\n };\n\n const handleEditView = (record: any) => {\n const tempModal = reactive({\n open: true,\n loading: false,\n title: t('编辑视图'),\n form: {\n settings: { labelAlign: 'right', layout: 'vertical', col: [] },\n fields: [\n {\n type: 'input',\n name: 'name',\n label: t('视图名称'),\n disabled: false,\n allowClear: true,\n inputType: 'text',\n defaultValue: record.name,\n placeholder: t('请输入视图名称'),\n },\n ],\n rules: reactive({\n name: [{ required: true, message: t('请输入视图名称') }],\n }),\n model: reactive({\n name: record.name,\n is_system: [record.is_system || false],\n }),\n },\n options: {\n is_system: [{ name: t('设为系统视图'), value: true }],\n },\n ok: async (data: any) => {\n await update_view_settings({\n org_id: current_org.id,\n view_settings_id: record.id,\n name: data.name,\n is_system: data.is_system && data.is_system[0],\n });\n message.success(t('修改成功'));\n fetchViews();\n },\n });\n\n if (is_auth.value) {\n tempModal.form.fields.push({\n type: 'checkbox',\n name: 'is_system',\n label: '',\n disabled: false,\n allowClear: true,\n labelKey: 'name',\n valueKey: 'value',\n defaultValue: [false],\n } as any);\n }\n modalBox(tempModal);\n };\n const { addView } = useView({\n currentView,\n getViewData,\n isViewChange,\n userid,\n view_project__flag: env.VITE_APP_VIEW_PROJECT_FLAG,\n view_menu__flag: props.view_key,\n view_menu__name: props.view_flag_name,\n fetchViews,\n is_auth,\n t,\n });\n\n const handleManageView = (view_type: string) => {\n const tempModal = reactive({\n open: true,\n component: 'ViewEditModal',\n compObj: {\n title: view_type == 'personal' ? t('个人视图管理') : t('公共视图管理'),\n data: view_type == 'personal' ? personData.value : publicData.value,\n },\n ok: (ids: any) => {\n if (ids && ids.length > 0) {\n change_view_settings_sort({\n org_id: current_org.id,\n view_settings_ids: ids,\n }).then(() => {\n message.success(t('保存成功'));\n fetchViews();\n });\n } else {\n message.success(t('保存成功'));\n fetchViews();\n }\n },\n cancel: (isEdit: any) => {\n if (isEdit) {\n fetchViews();\n }\n },\n });\n modalBox(tempModal);\n };\n\n return {\n viewTableColumns,\n personData,\n publicData,\n handleApplyView,\n handleSetDefault,\n handleDeleteView,\n handleEditView,\n addView,\n handleManageView,\n is_auth,\n fetchViews,\n selectedRowKeys,\n };\n },\n});\n</script>\n\n<style lang=\"less\" scoped>\n.view-manage-container {\n display: flex;\n gap: 16px;\n height: 400px;\n overflow-y: auto;\n\n .view-section {\n flex: 1;\n border: 1px solid #f0f0f0;\n border-radius: 4px;\n padding: 8px;\n\n .section-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n padding-bottom: 4px;\n border-bottom: 1px solid #f0f0f0;\n\n .title {\n font-weight: bold;\n }\n\n .header-actions {\n display: flex;\n align-items: center;\n }\n }\n }\n}\n\n.view-item-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n\n .view-name {\n cursor: pointer;\n flex: 1;\n padding: 4px 0;\n &:hover {\n color: #1890ff;\n }\n }\n\n .view-actions {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.2s;\n }\n\n &:hover .view-actions {\n opacity: 1;\n }\n}\n</style>\n","<template>\n <div class=\"view-manage-container\">\n <div class=\"view-section\">\n <div class=\"section-header\">\n <span class=\"title\">{{ $t('个人视图') }}</span>\n <div class=\"header-actions\">\n <a-button\n type=\"link\"\n size=\"small\"\n @click=\"handleManageView('personal')\"\n >\n <template #icon><setting-outlined /></template>\n </a-button>\n <a-button\n type=\"link\"\n size=\"small\"\n @click=\"addView('personal')\"\n >\n <template #icon><plus-outlined /></template>\n </a-button>\n </div>\n </div>\n <s-table\n :selectedRowKeys=\"selectedRowKeys\"\n :columns=\"viewTableColumns\"\n :dataSource=\"personData\"\n :pagination=\"false\"\n size=\"small\"\n :showHeader=\"false\"\n row-key=\"id\"\n :range-selection=\"false\"\n >\n <template #bodyCell=\"{ column, record }\">\n <template v-if=\"column.dataIndex === 'name'\">\n <div class=\"view-item-row\">\n <span\n class=\"view-name\"\n @click=\"handleApplyView(record)\"\n >\n {{ record.name }}\n <a-tag\n v-if=\"record.is_default\"\n color=\"blue\"\n size=\"small\"\n style=\"margin-left: 4px\"\n >\n {{ $t('默认') }}\n </a-tag>\n <a-tag\n v-if=\"record.is_system\"\n color=\"orange\"\n size=\"small\"\n style=\"margin-left: 4px\"\n >\n {{ $t('系统') }}\n </a-tag>\n </span>\n <div\n class=\"view-actions\"\n v-if=\"!record.is_system || is_auth\"\n >\n <a-tooltip :title=\"$t('设为默认')\">\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"handleSetDefault(record)\"\n >\n <template #icon>\n <star-filled\n v-if=\"record.is_default\"\n style=\"color: #fadb14\"\n />\n <star-outlined v-else />\n </template>\n </a-button>\n </a-tooltip>\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"handleEditView(record)\"\n >\n <template #icon><edit-outlined /></template>\n </a-button>\n <a-button\n type=\"text\"\n size=\"small\"\n danger\n @click=\"handleDeleteView(record)\"\n >\n <template #icon><delete-outlined /></template>\n </a-button>\n </div>\n </div>\n </template>\n </template>\n </s-table>\n </div>\n <div class=\"view-section\">\n <div class=\"section-header\">\n <span class=\"title\">{{ $t('公共视图') }}</span>\n <div class=\"header-actions\">\n <a-button\n type=\"link\"\n size=\"small\"\n @click=\"handleManageView('public')\"\n >\n <template #icon><setting-outlined /></template>\n </a-button>\n <a-button\n type=\"link\"\n size=\"small\"\n @click=\"addView('public')\"\n >\n <template #icon><plus-outlined /></template>\n </a-button>\n </div>\n </div>\n <s-table\n :selectedRowKeys=\"selectedRowKeys\"\n :columns=\"viewTableColumns\"\n :dataSource=\"publicData\"\n :pagination=\"false\"\n size=\"small\"\n :showHeader=\"false\"\n row-key=\"id\"\n :range-selection=\"false\"\n >\n <template #bodyCell=\"{ column, record }\">\n <template v-if=\"column.dataIndex === 'name'\">\n <div class=\"view-item-row\">\n <span\n class=\"view-name\"\n @click=\"handleApplyView(record)\"\n >\n {{ record.name }}\n <a-tag\n v-if=\"record.is_default\"\n color=\"blue\"\n size=\"small\"\n style=\"margin-left: 4px\"\n >\n {{ $t('默认') }}\n </a-tag>\n <a-tag\n v-if=\"record.is_system\"\n color=\"orange\"\n size=\"small\"\n style=\"margin-left: 4px\"\n >\n {{ $t('系统') }}\n </a-tag>\n </span>\n <div\n class=\"view-actions\"\n v-if=\"!record.is_system || is_auth\"\n >\n <a-tooltip :title=\"$t('设为默认')\">\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"handleSetDefault(record)\"\n >\n <template #icon>\n <star-filled\n v-if=\"record.is_default\"\n style=\"color: #fadb14\"\n />\n <star-outlined v-else />\n </template>\n </a-button>\n </a-tooltip>\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"handleEditView(record)\"\n >\n <template #icon><edit-outlined /></template>\n </a-button>\n <a-button\n type=\"text\"\n size=\"small\"\n danger\n @click=\"handleDeleteView(record)\"\n >\n <template #icon><delete-outlined /></template>\n </a-button>\n </div>\n </div>\n </template>\n </template>\n </s-table>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, ref, onMounted, reactive, createVNode } from 'vue';\nimport {\n SettingOutlined,\n PlusOutlined,\n DeleteOutlined,\n EditOutlined,\n StarOutlined,\n StarFilled,\n ExclamationCircleOutlined,\n} from '@ant-design/icons-vue';\nimport { useI18n } from 'vue-i18n';\nimport { useUserStore, useEnv } from 'liyu-pc-base/init-plugin';\nimport {\n delete_view_settings,\n update_view_settings,\n set_view_settings_default,\n refresh_view_settings_cache,\n change_view_settings_sort,\n} from 'liyu-pc-base/api/view-model';\nimport { message, Modal } from 'ant-design-vue';\nimport modalBox from 'liyu-pc-base/components/form-modal/modal-tools';\nimport { useTableProState } from '../utils';\nimport { Column } from '../typing';\nimport { useView } from '../hooks/view';\n\nexport default defineComponent({\n name: 'ViewsConfig',\n components: {\n SettingOutlined,\n PlusOutlined,\n DeleteOutlined,\n EditOutlined,\n StarOutlined,\n StarFilled,\n },\n props: {\n columns: {\n type: Array as () => Array<Column>,\n default: () => [],\n },\n view_key: {\n type: String,\n default: '',\n },\n view_flag_name: {\n type: String,\n default: '',\n },\n is_view: {\n type: Boolean,\n default: false,\n },\n },\n setup(props) {\n const { t } = useI18n();\n const userStore = useUserStore();\n const env = useEnv();\n const current_org = userStore.currentOrg;\n const userid = userStore.userid;\n const VIEW_SYSTEM_EDIT = 'view_system_edit';\n const is_auth = ref(userStore.CHECK_AUTH(VIEW_SYSTEM_EDIT));\n\n const { setViewData, getViewData, viewDataList, fetchViews, currentView, isViewChange } =\n useTableProState();\n\n const viewTableColumns = [{ dataIndex: 'name', key: 'name' }];\n const selectedRowKeys = computed(() => {\n return [currentView.value?.id];\n });\n\n const personData = computed(() => {\n const list = viewDataList.value\n .filter((item: any) => !!item.user_id && item.is_system)\n .sort((a, b) => (a.sort == b.sort ? a.id - b.id : a.sort - b.sort));\n const list1 = viewDataList.value\n .filter((item: any) => !!item.user_id && !item.is_system)\n .sort((a, b) => (a.sort == b.sort ? a.id - b.id : a.sort - b.sort));\n return list.concat(list1);\n });\n\n const publicData = computed(() => {\n const list = viewDataList.value\n .filter((item: any) => !item.user_id && item.is_system)\n .sort((a, b) => (a.sort == b.sort ? a.id - b.id : a.sort - b.sort));\n const list1 = viewDataList.value\n .filter((item: any) => !item.user_id && !item.is_system)\n .sort((a, b) => (a.sort == b.sort ? a.id - b.id : a.sort - b.sort));\n return list.concat(list1);\n });\n\n const handleApplyView = (view: any) => {\n if (currentView.value?.id === view.id) {\n currentView.value = { id: 'no-view' };\n setViewData(null);\n message.warning(t('视图已取消'));\n } else {\n currentView.value = view;\n setViewData(view.data);\n message.success(t('已应用视图:') + view.name);\n }\n };\n\n const handleSetDefault = async (view: any) => {\n try {\n await set_view_settings_default({\n org_id: current_org.id,\n view_settings_id: view.id,\n });\n await refresh_view_settings_cache({\n org_id: current_org.id,\n view_settings_id: view.id,\n });\n message.success(t('设置默认成功'));\n fetchViews();\n } catch (e) {\n message.error(t('设置默认失败'));\n }\n };\n\n const handleDeleteView = (view: any) => {\n Modal.confirm({\n title: t('确认删除视图?'),\n content: t('视图删除后不可恢复,是否确认删除?'),\n icon: createVNode(ExclamationCircleOutlined),\n onOk: async () => {\n await delete_view_settings({\n org_id: current_org.id,\n view_settings_id: view.id,\n });\n message.success(t('删除成功'));\n fetchViews();\n },\n });\n };\n\n const handleEditView = (record: any) => {\n const tempModal = reactive({\n open: true,\n loading: false,\n title: t('编辑视图'),\n form: {\n settings: { labelAlign: 'right', layout: 'vertical', col: [] },\n fields: [\n {\n type: 'input',\n name: 'name',\n label: t('视图名称'),\n disabled: false,\n allowClear: true,\n inputType: 'text',\n defaultValue: record.name,\n placeholder: t('请输入视图名称'),\n },\n ],\n rules: reactive({\n name: [{ required: true, message: t('请输入视图名称') }],\n }),\n model: reactive({\n name: record.name,\n is_system: [record.is_system || false],\n }),\n },\n options: {\n is_system: [{ name: t('设为系统视图'), value: true }],\n },\n ok: async (data: any) => {\n await update_view_settings({\n org_id: current_org.id,\n view_settings_id: record.id,\n name: data.name,\n is_system: data.is_system && data.is_system[0],\n });\n message.success(t('修改成功'));\n fetchViews();\n },\n });\n\n if (is_auth.value) {\n tempModal.form.fields.push({\n type: 'checkbox',\n name: 'is_system',\n label: '',\n disabled: false,\n allowClear: true,\n labelKey: 'name',\n valueKey: 'value',\n defaultValue: [false],\n } as any);\n }\n modalBox(tempModal);\n };\n const { addView } = useView({\n currentView,\n getViewData,\n isViewChange,\n userid,\n view_project__flag: env.VITE_APP_VIEW_PROJECT_FLAG,\n view_menu__flag: props.view_key,\n view_menu__name: props.view_flag_name,\n fetchViews,\n is_auth,\n t,\n });\n\n const handleManageView = (view_type: string) => {\n const tempModal = reactive({\n open: true,\n component: 'ViewEditModal',\n compObj: {\n title: view_type == 'personal' ? t('个人视图管理') : t('公共视图管理'),\n data: view_type == 'personal' ? personData.value : publicData.value,\n },\n ok: (ids: any) => {\n if (ids && ids.length > 0) {\n change_view_settings_sort({\n org_id: current_org.id,\n view_settings_ids: ids,\n }).then(() => {\n message.success(t('保存成功'));\n fetchViews();\n });\n } else {\n message.success(t('保存成功'));\n fetchViews();\n }\n },\n cancel: (isEdit: any) => {\n if (isEdit) {\n fetchViews();\n }\n },\n });\n modalBox(tempModal);\n };\n\n return {\n viewTableColumns,\n personData,\n publicData,\n handleApplyView,\n handleSetDefault,\n handleDeleteView,\n handleEditView,\n addView,\n handleManageView,\n is_auth,\n fetchViews,\n selectedRowKeys,\n };\n },\n});\n</script>\n\n<style lang=\"less\" scoped>\n.view-manage-container {\n display: flex;\n gap: 16px;\n height: 400px;\n overflow-y: auto;\n\n .view-section {\n flex: 1;\n border: 1px solid #f0f0f0;\n border-radius: 4px;\n padding: 8px;\n\n .section-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n padding-bottom: 4px;\n border-bottom: 1px solid #f0f0f0;\n\n .title {\n font-weight: bold;\n }\n\n .header-actions {\n display: flex;\n align-items: center;\n }\n }\n }\n}\n\n.view-item-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n\n .view-name {\n cursor: pointer;\n flex: 1;\n padding: 4px 0;\n &:hover {\n color: #1890ff;\n }\n }\n\n .view-actions {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.2s;\n }\n\n &:hover .view-actions {\n opacity: 1;\n }\n}\n</style>\n","<template>\n <div class=\"column-edit-view-wrapper\">\n <a-tabs v-model:activeKey=\"activeTab\">\n <a-tab-pane\n key=\"columns\"\n :tab=\"$t('列设置')\"\n >\n <div class=\"tab-content-scroll\">\n <columns-config\n :columns=\"columns\"\n @change=\"onColumnChange\"\n />\n </div>\n </a-tab-pane>\n <a-tab-pane\n key=\"views\"\n :tab=\"$t('视图管理')\"\n v-if=\"is_view\"\n >\n <div class=\"tab-content-scroll\">\n <views-config\n :columns=\"columns\"\n :view_key=\"view_key\"\n :view_flag_name=\"view_flag_name\"\n :is_view=\"is_view\"\n />\n </div>\n </a-tab-pane>\n </a-tabs>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, watch } from 'vue';\nimport { Column } from '../typing';\nimport ColumnsConfig from './columnsConfig.vue';\nimport ViewsConfig from './viewsConfig.vue';\nimport { useTableProState } from '../utils';\n\nexport default defineComponent({\n name: 'ColumnEditView',\n components: {\n ColumnsConfig,\n ViewsConfig,\n },\n props: {\n columns: {\n type: Array as () => Array<Column>,\n default: () => [],\n },\n view_key: {\n type: String,\n default: '',\n },\n view_flag_name: {\n type: String,\n default: '',\n },\n is_view: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['change'],\n setup(props, { emit }) {\n const activeTab = ref('columns');\n\n const onColumnChange = (data: any) => {\n emit('change', data);\n };\n const { fetchViews } = useTableProState();\n watch(\n () => activeTab.value,\n val => {\n if (val === 'views') {\n fetchViews();\n }\n },\n );\n\n return {\n activeTab,\n onColumnChange,\n };\n },\n});\n\n</script>\n\n<style lang=\"less\" scoped>\n.column-edit-view-wrapper {\n padding: 0 8px;\n}\n.tab-content-scroll {\n max-height: 60vh;\n overflow-y: auto;\n}\n</style>\n","<template>\n <div class=\"column-edit-view-wrapper\">\n <a-tabs v-model:activeKey=\"activeTab\">\n <a-tab-pane\n key=\"columns\"\n :tab=\"$t('列设置')\"\n >\n <div class=\"tab-content-scroll\">\n <columns-config\n :columns=\"columns\"\n @change=\"onColumnChange\"\n />\n </div>\n </a-tab-pane>\n <a-tab-pane\n key=\"views\"\n :tab=\"$t('视图管理')\"\n v-if=\"is_view\"\n >\n <div class=\"tab-content-scroll\">\n <views-config\n :columns=\"columns\"\n :view_key=\"view_key\"\n :view_flag_name=\"view_flag_name\"\n :is_view=\"is_view\"\n />\n </div>\n </a-tab-pane>\n </a-tabs>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, watch } from 'vue';\nimport { Column } from '../typing';\nimport ColumnsConfig from './columnsConfig.vue';\nimport ViewsConfig from './viewsConfig.vue';\nimport { useTableProState } from '../utils';\n\nexport default defineComponent({\n name: 'ColumnEditView',\n components: {\n ColumnsConfig,\n ViewsConfig,\n },\n props: {\n columns: {\n type: Array as () => Array<Column>,\n default: () => [],\n },\n view_key: {\n type: String,\n default: '',\n },\n view_flag_name: {\n type: String,\n default: '',\n },\n is_view: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['change'],\n setup(props, { emit }) {\n const activeTab = ref('columns');\n\n const onColumnChange = (data: any) => {\n emit('change', data);\n };\n const { fetchViews } = useTableProState();\n watch(\n () => activeTab.value,\n val => {\n if (val === 'views') {\n fetchViews();\n }\n },\n );\n\n return {\n activeTab,\n onColumnChange,\n };\n },\n});\n\n</script>\n\n<style lang=\"less\" scoped>\n.column-edit-view-wrapper {\n padding: 0 8px;\n}\n.tab-content-scroll {\n max-height: 60vh;\n overflow-y: auto;\n}\n</style>\n","import { ConfirmModelConfig } from 'liyu-pc-base/api/typing';\n\nimport { event_obj, useUserStore } from 'liyu-pc-base/init-plugin';\n\nimport { Modal } from 'ant-design-vue';\nimport Handlebars from 'handlebars';\nimport { HeadBtnConfig } from 'liyu-pc-base/api/typing';\nimport { useRequest } from 'liyu-pc-base/init-plugin';\nimport { getObjListBySelectedRowKeys } from 'liyu-pc-base/utils/function';\nimport { unref } from 'vue';\n\nexport const head_btn_confirm = ({\n dataSource,\n button,\n selectedRowKeys,\n}: {\n dataSource: any[];\n button: HeadBtnConfig;\n selectedRowKeys: any[];\n}) => {\n const request = useRequest();\n selectedRowKeys = unref(selectedRowKeys);\n const preProcessData = button.preProcessData;\n const model_config = button.model_config as ConfirmModelConfig;\n const init_data = model_config.init_data;\n const batch_api_fields = model_config.batch_api_fields;\n const title = model_config.title;\n const content = model_config.content;\n const ok_url = model_config.ok_url;\n const cancel_url = model_config.cancel_url;\n const method = model_config.method || 'post';\n const userStore = useUserStore();\n const current_org = userStore.currentOrg; // 当前组织org\n const org_id = current_org?.id;\n let api_data = dataSource as any;\n if (preProcessData) {\n api_data = preProcessData({ dataSource, selectedRowKeys });\n }\n if (batch_api_fields) {\n api_data = getObjListBySelectedRowKeys(batch_api_fields, dataSource, selectedRowKeys);\n }\n if (init_data) {\n api_data = { ...api_data, ...init_data };\n }\n api_data = { ...api_data, org_id };\n\n const titleTemplate = Handlebars.compile(title || '');\n const contentTemplate = Handlebars.compile(content || '');\n\n Modal.confirm({\n title: titleTemplate({ record: api_data }),\n content: contentTemplate({ record: api_data }),\n onOk() {\n if (ok_url) {\n request[method](ok_url, api_data).then(() => {\n event_obj().emit('refresh');\n });\n }\n },\n onCancel() {\n if (cancel_url) {\n request[method](cancel_url, api_data).then(() => {\n event_obj().emit('refresh');\n });\n }\n },\n });\n};\n","import { ComponentModelConfig, HeadBtnConfig } from 'liyu-pc-base/api/typing';\n\nimport { event_obj, useUserStore } from 'liyu-pc-base/init-plugin';\n\nimport Handlebars from 'handlebars';\nimport modalBox from 'liyu-pc-base/components/form-modal/modal-tools';\nimport { useRequest } from 'liyu-pc-base/init-plugin';\nimport { getObjListBySelectedRowKeys } from 'liyu-pc-base/utils/function';\nimport { reactive, unref } from 'vue';\n\nexport const head_btn_custom_component = ({\n dataSource,\n button,\n selectedRowKeys,\n}: {\n dataSource: any[];\n button: HeadBtnConfig;\n selectedRowKeys: any[];\n}) => {\n const request = useRequest();\n const preProcessData = button.preProcessData;\n const model_config = button.model_config as ComponentModelConfig;\n const title = model_config.title;\n const component = model_config.component;\n const ok_url = model_config.ok_url;\n const cancel_url = model_config.cancel_url;\n const method = model_config.method || 'post';\n const init_data = model_config.init_data;\n const batch_api_fields = model_config.batch_api_fields;\n const userStore = useUserStore();\n const current_org = userStore.currentOrg; // 当前组织org\n const org_id = current_org?.id;\n let api_data = dataSource;\n if (preProcessData) {\n api_data = preProcessData({ dataSource, selectedRowKeys });\n }\n if (init_data) {\n api_data = { ...api_data, ...init_data };\n }\n const tempModal = reactive({\n open: true,\n loading: false,\n component: component,\n record: unref(api_data),\n dataSource: dataSource,\n button: button,\n title: Handlebars.compile(title || '')({ record: api_data }),\n ok: (data: any) => {\n data = { ...data, org_id };\n if (batch_api_fields) {\n data = {\n ...data,\n ...getObjListBySelectedRowKeys(batch_api_fields, dataSource, selectedRowKeys),\n };\n }\n if (ok_url) {\n request[method](ok_url, data).then(() => {\n event_obj().emit('refresh');\n });\n }\n },\n cancel: (data: any) => {\n data = { ...data, org_id };\n if (batch_api_fields) {\n data = {\n ...data,\n ...getObjListBySelectedRowKeys(batch_api_fields, dataSource, selectedRowKeys),\n };\n }\n if (cancel_url) {\n request[method](cancel_url, data).then(() => {\n event_obj().emit('refresh');\n });\n }\n },\n });\n modalBox(tempModal);\n};\n","import { FormModelConfig, HeadBtnConfig } from 'liyu-pc-base/api/typing';\n\nimport { event_obj, useUserStore } from 'liyu-pc-base/init-plugin';\n\nimport { message } from 'ant-design-vue';\nimport Handlebars from 'handlebars';\nimport modalBox from 'liyu-pc-base/components/form-modal/modal-tools';\nimport { useRequest } from 'liyu-pc-base/init-plugin';\nimport { getObjList, getObjListBySelectedRowKeys } from 'liyu-pc-base/utils/function';\nimport { reactive } from 'vue';\nexport const head_btn_form = ({\n dataSource,\n button,\n selectedRowKeys,\n}: {\n dataSource: any[];\n button: HeadBtnConfig;\n selectedRowKeys: any[];\n}) => {\n const request = useRequest();\n const preProcessData = button.preProcessData;\n const model_config = button.model_config as FormModelConfig;\n const title = model_config.title;\n const ok_url = model_config.ok_url;\n const cancel_url = model_config.cancel_url;\n const method = model_config.method || 'post';\n const init_data = model_config.init_data;\n const api_fields = model_config.api_fields;\n const batch_api_fields = model_config.batch_api_fields;\n const form_config = model_config.form;\n const userStore = useUserStore();\n const current_org = userStore.currentOrg; // 当前组织org\n const org_id = current_org?.id;\n\n let record = null;\n if (preProcessData) {\n record = preProcessData({ dataSource, selectedRowKeys });\n } else {\n record = dataSource.find(item => selectedRowKeys.includes(item.id));\n }\n\n let model_data = {\n ...form_config.model,\n ...record,\n };\n if (api_fields) {\n model_data = {\n ...model_data,\n ...getObjList(api_fields, record),\n };\n }\n if (init_data) {\n model_data = {\n ...model_data,\n ...init_data,\n };\n }\n // 创建表单模态框配置\n const form_modal_config = reactive({\n settings: form_config.settings || {\n labelAlign: 'right',\n layout: 'vertical',\n col: [],\n },\n dynamicFieldList: form_config.dynamicFieldList || [],\n model: reactive(model_data),\n rules: form_config.rules || {},\n options: form_config.options || {},\n });\n\n // 创建模态框\n const tempModal = reactive({\n open: true,\n loading: false,\n title: Handlebars.compile(title || '')({ record: model_data }),\n form: form_modal_config,\n ok: (data: any) => {\n return new Promise(function (resolve, reject) {\n if (!ok_url) {\n resolve(null);\n return;\n }\n tempModal.loading = true;\n let submit_data = data;\n // if (api_fields) {\n // submit_data = {\n // ...submit_data,\n // ...getObjList(api_fields, data),\n // }\n // }\n if (batch_api_fields) {\n submit_data = {\n ...submit_data,\n ...getObjListBySelectedRowKeys(batch_api_fields, dataSource, selectedRowKeys),\n };\n }\n if (button.beforeCommitProcessData) {\n submit_data = button.beforeCommitProcessData({\n dataSource,\n selectedRowKeys,\n data: submit_data,\n });\n }\n submit_data.org_id = org_id;\n\n request({\n url: ok_url,\n method: method,\n data: submit_data,\n })\n .then(() => {\n message.success('操作成功');\n event_obj().emit('refresh');\n resolve(null);\n })\n .catch(error => {\n reject(error);\n })\n .finally(() => {\n tempModal.loading = false;\n });\n });\n },\n cancel: (data: any) => {\n return new Promise(function (resolve, reject) {\n if (!cancel_url) {\n resolve(null);\n return;\n }\n tempModal.loading = true;\n\n let submit_data = data;\n // if (api_fields) {\n // submit_data = {\n // ...submit_data,\n // ...getObjList(api_fields, data),\n // }\n // }\n if (batch_api_fields) {\n submit_data = {\n ...submit_data,\n ...getObjListBySelectedRowKeys(batch_api_fields, dataSource, selectedRowKeys),\n };\n }\n if (button.beforeCommitProcessData) {\n submit_data = button.beforeCommitProcessData({\n dataSource,\n selectedRowKeys,\n data: submit_data,\n });\n }\n submit_data.org_id = org_id;\n\n request({\n url: cancel_url,\n method: method,\n data: submit_data,\n })\n .then(() => {\n event_obj().emit('refresh');\n resolve(null);\n })\n .catch(error => {\n reject(error);\n })\n .finally(() => {\n tempModal.loading = false;\n });\n });\n },\n });\n\n // 显示模态框\n modalBox(tempModal);\n};\n","<template>\n <template\n v-for=\"(item, index) in children_list\"\n :key=\"index\"\n >\n <template v-if=\"item?.children && item.children.length > 0\">\n <a-sub-menu\n :key=\"index\"\n :title=\"item.name\"\n :disabled=\"item.disabled\"\n >\n <head-btn-children\n :auth_batch_update_list=\"auth_batch_update_list\"\n :children_list=\"item.children\"\n :selected-row-keys=\"selectedRowKeys\"\n :dataSource=\"dataSource\"\n :search-config=\"searchConfig\"\n :current_org=\"current_org\"\n :handleBtnClick=\"handleBtnClick\"\n />\n </a-sub-menu>\n </template>\n <template v-else>\n <a-menu-item\n :key=\"index\"\n :disabled=\"item.disabled\"\n @click=\"\n () => {\n handleBtnClick(item, {\n searchModel: searchConfig.model,\n dataSource: dataSource,\n selectedRowKeys: selectedRowKeys,\n searchConfigOptions: searchConfig.options,\n current_org: current_org,\n });\n }\n \"\n >\n {{ item.name }}\n </a-menu-item>\n </template>\n </template>\n</template>\n<script lang=\"ts\">\nimport { HeadBtnListConfig } from 'liyu-pc-base/api/typing';\nimport { defineComponent, PropType } from 'vue';\n\nexport default defineComponent({\n name: 'HeadBtnChildren',\n props: {\n children_list: {\n type: Array as PropType<HeadBtnListConfig>,\n required: true,\n },\n selectedRowKeys: {\n type: Array as PropType<any[]>,\n required: true,\n },\n dataSource: {\n type: Array as PropType<any[]>,\n required: true,\n },\n searchConfig: {\n type: Object as PropType<{ model: any; options: any }>,\n required: true,\n },\n current_org: {\n type: Object as PropType<any>,\n required: true,\n },\n handleBtnClick: {\n type: Function as PropType<any>,\n required: true,\n },\n },\n setup(props) {\n return {};\n },\n});\n</script>\n","<template>\n <template\n v-for=\"(item, index) in children_list\"\n :key=\"index\"\n >\n <template v-if=\"item?.children && item.children.length > 0\">\n <a-sub-menu\n :key=\"index\"\n :title=\"item.name\"\n :disabled=\"item.disabled\"\n >\n <head-btn-children\n :auth_batch_update_list=\"auth_batch_update_list\"\n :children_list=\"item.children\"\n :selected-row-keys=\"selectedRowKeys\"\n :dataSource=\"dataSource\"\n :search-config=\"searchConfig\"\n :current_org=\"current_org\"\n :handleBtnClick=\"handleBtnClick\"\n />\n </a-sub-menu>\n </template>\n <template v-else>\n <a-menu-item\n :key=\"index\"\n :disabled=\"item.disabled\"\n @click=\"\n () => {\n handleBtnClick(item, {\n searchModel: searchConfig.model,\n dataSource: dataSource,\n selectedRowKeys: selectedRowKeys,\n searchConfigOptions: searchConfig.options,\n current_org: current_org,\n });\n }\n \"\n >\n {{ item.name }}\n </a-menu-item>\n </template>\n </template>\n</template>\n<script lang=\"ts\">\nimport { HeadBtnListConfig } from 'liyu-pc-base/api/typing';\nimport { defineComponent, PropType } from 'vue';\n\nexport default defineComponent({\n name: 'HeadBtnChildren',\n props: {\n children_list: {\n type: Array as PropType<HeadBtnListConfig>,\n required: true,\n },\n selectedRowKeys: {\n type: Array as PropType<any[]>,\n required: true,\n },\n dataSource: {\n type: Array as PropType<any[]>,\n required: true,\n },\n searchConfig: {\n type: Object as PropType<{ model: any; options: any }>,\n required: true,\n },\n current_org: {\n type: Object as PropType<any>,\n required: true,\n },\n handleBtnClick: {\n type: Function as PropType<any>,\n required: true,\n },\n },\n setup(props) {\n return {};\n },\n});\n</script>\n","<template>\n <template\n v-for=\"(btn, index) in filter_head_btn_list\"\n :key=\"index\"\n >\n <a-button\n v-if=\"!btn.children || btn.children?.length == 0\"\n :type=\"btn.clazz\"\n size=\"small\"\n style=\"margin-right: 5px\"\n :disabled=\"btn.disabled\"\n @click=\"\n handleBtnClick(btn, {\n searchModel: searchConfig.model,\n dataSource: dataSource,\n selectedRowKeys: selectedRowKeys,\n searchConfigOptions: searchConfig.options,\n current_org: current_org,\n router: router,\n })\n \"\n >\n <plus-outlined v-if=\"btn.icon === 'plus-outlined'\" />\n {{ btn.name }}\n </a-button>\n <a-dropdown\n v-else\n v-model:open=\"isMenuOpen[index]\"\n trigger=\"click\"\n >\n <a-button\n :bordered=\"false\"\n size=\"small\"\n >\n {{ btn.name }}\n <down-outlined\n v-if=\"!isMenuOpen[index]\"\n style=\"font-size: 10px; cursor: pointer\"\n />\n <up-outlined\n v-if=\"isMenuOpen[index]\"\n style=\"font-size: 10px; cursor: pointer\"\n />\n </a-button>\n <template #overlay>\n <a-menu>\n <head-btn-children\n :children_list=\"btn.children\"\n :selected-row-keys=\"selectedRowKeys\"\n :dataSource=\"dataSource\"\n :search-config=\"searchConfig\"\n :current_org=\"current_org\"\n :handleBtnClick=\"handleBtnClick\"\n />\n </a-menu>\n </template>\n </a-dropdown>\n </template>\n</template>\n<script lang=\"ts\">\nimport { checkCondition, nested_sort_list } from 'liyu-pc-base/utils/function';\nimport { cloneDeep } from 'lodash';\nimport { computed, defineComponent, PropType, ref } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport { useRoute } from 'vue-router';\nimport { head_btn_confirm } from './head_btn_confirm';\nimport { head_btn_custom_component } from './head_btn_custom_component';\nimport { head_btn_form } from './head_btn_form';\nimport HeadBtnChildren from './headBtnChildren.vue';\nimport { HeadBtnListConfig } from './typing';\n\nexport default defineComponent({\n name: 'HeadBtn',\n props: {\n auth_batch_update_list: {\n type: Array as PropType<HeadBtnListConfig>,\n required: true,\n },\n auth_head_btn_list: {\n type: Array as PropType<HeadBtnListConfig>,\n required: true,\n },\n selectedRowKeys: {\n type: Array as PropType<any[]>,\n required: true,\n },\n dataSource: {\n type: Array as PropType<any[]>,\n required: true,\n },\n searchConfig: {\n type: Object as PropType<{ model: any; options: any }>,\n required: true,\n },\n current_org: {\n type: Object as PropType<any>,\n required: true,\n },\n router: {\n type: Object as PropType<any>,\n required: true,\n },\n field: {\n type: Object as PropType<any>,\n required: true,\n },\n event_obj: {\n type: Object as PropType<any>,\n required: true,\n },\n },\n components: {\n HeadBtnChildren,\n },\n setup(props) {\n const { t } = useI18n();\n const isMenuOpen = ref<Record<string, boolean>>({});\n const route = useRoute();\n const process_list = (\n list: any,\n {\n dataSource,\n selectedRowKeys,\n batchList,\n }: { dataSource: any[]; selectedRowKeys: any[]; batchList: any[] | null },\n ) => {\n if (batchList?.length > 0) {\n const batchGroup = list.find((item: any) => item.name === '批量操作');\n if (batchGroup) {\n if (!batchGroup.children || batchGroup.children.length == 0) {\n batchGroup.children = batchList;\n } else {\n batchGroup.children = [...batchGroup.children, ...batchList];\n }\n } else {\n list.push({\n name: '批量操作',\n order: 1000,\n children: batchList,\n });\n }\n }\n const result = list.filter((button: any) => {\n let data = dataSource;\n // if (button.preProcessData) {\n // data = button.preProcessData({ dataSource: data, selectedRowKeys });\n // }\n let isDisabled = false;\n if (typeof button.is_disabled === 'function') {\n isDisabled = button.is_disabled({ dataSource: data, selectedRowKeys: selectedRowKeys });\n }\n if (typeof button.is_disabled === 'boolean') {\n isDisabled = button.is_disabled;\n }\n if (button.disabled_condition && button.disabled_condition.length > 0) {\n isDisabled = checkCondition({\n conditions: button.disabled_condition,\n dataSource: data,\n selectedRowKeys: selectedRowKeys,\n });\n }\n button.disabled = isDisabled;\n\n if (button.show_condition && button.show_condition.length > 0) {\n return checkCondition({\n conditions: button.show_condition,\n dataSource: data,\n selectedRowKeys: selectedRowKeys,\n });\n }\n\n if (typeof button.is_show === 'function') {\n return button.is_show({ dataSource: data, selectedRowKeys: selectedRowKeys });\n }\n if (typeof button.is_show === 'boolean') {\n return button.is_show;\n }\n return true;\n });\n result.forEach((item: any) => {\n if (item.children) {\n item.children = process_list(item.children, {\n dataSource: dataSource,\n selectedRowKeys: selectedRowKeys,\n batchList: null,\n });\n }\n });\n return result;\n };\n const filter_head_btn_list = computed(() => {\n if (!props.auth_head_btn_list) return [];\n const list = process_list(cloneDeep(props.auth_head_btn_list), {\n dataSource: props.dataSource,\n selectedRowKeys: props.selectedRowKeys,\n batchList: props.auth_batch_update_list,\n });\n nested_sort_list(list);\n return list;\n });\n // 处理按钮点击事件\n const handleBtnClick = (btn: any, params: any) => {\n let action_func = null;\n let query_json = {};\n if (route.query?.query_json) {\n query_json = JSON.parse(route.query?.query_json as any);\n }\n const routeQueryParams = JSON.parse(JSON.stringify({ ...route.query, ...query_json }));\n if (!btn.model_kind) {\n action_func = btn.cb;\n } else if (btn.model_kind === 'confirm') {\n action_func = head_btn_confirm;\n } else if (btn.model_kind === 'custom_component') {\n action_func = head_btn_custom_component;\n } else if (btn.model_kind === 'form') {\n action_func = head_btn_form;\n }\n\n if (!action_func) return;\n\n action_func({\n ...params,\n button: btn,\n t: t,\n current_org: props.current_org,\n routeQueryParams: routeQueryParams,\n });\n };\n return {\n filter_head_btn_list,\n handleBtnClick,\n isMenuOpen,\n };\n },\n});\n</script>\n","<template>\n <template\n v-for=\"(btn, index) in filter_head_btn_list\"\n :key=\"index\"\n >\n <a-button\n v-if=\"!btn.children || btn.children?.length == 0\"\n :type=\"btn.clazz\"\n size=\"small\"\n style=\"margin-right: 5px\"\n :disabled=\"btn.disabled\"\n @click=\"\n handleBtnClick(btn, {\n searchModel: searchConfig.model,\n dataSource: dataSource,\n selectedRowKeys: selectedRowKeys,\n searchConfigOptions: searchConfig.options,\n current_org: current_org,\n router: router,\n })\n \"\n >\n <plus-outlined v-if=\"btn.icon === 'plus-outlined'\" />\n {{ btn.name }}\n </a-button>\n <a-dropdown\n v-else\n v-model:open=\"isMenuOpen[index]\"\n trigger=\"click\"\n >\n <a-button\n :bordered=\"false\"\n size=\"small\"\n >\n {{ btn.name }}\n <down-outlined\n v-if=\"!isMenuOpen[index]\"\n style=\"font-size: 10px; cursor: pointer\"\n />\n <up-outlined\n v-if=\"isMenuOpen[index]\"\n style=\"font-size: 10px; cursor: pointer\"\n />\n </a-button>\n <template #overlay>\n <a-menu>\n <head-btn-children\n :children_list=\"btn.children\"\n :selected-row-keys=\"selectedRowKeys\"\n :dataSource=\"dataSource\"\n :search-config=\"searchConfig\"\n :current_org=\"current_org\"\n :handleBtnClick=\"handleBtnClick\"\n />\n </a-menu>\n </template>\n </a-dropdown>\n </template>\n</template>\n<script lang=\"ts\">\nimport { checkCondition, nested_sort_list } from 'liyu-pc-base/utils/function';\nimport { cloneDeep } from 'lodash';\nimport { computed, defineComponent, PropType, ref } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport { useRoute } from 'vue-router';\nimport { head_btn_confirm } from './head_btn_confirm';\nimport { head_btn_custom_component } from './head_btn_custom_component';\nimport { head_btn_form } from './head_btn_form';\nimport HeadBtnChildren from './headBtnChildren.vue';\nimport { HeadBtnListConfig } from './typing';\n\nexport default defineComponent({\n name: 'HeadBtn',\n props: {\n auth_batch_update_list: {\n type: Array as PropType<HeadBtnListConfig>,\n required: true,\n },\n auth_head_btn_list: {\n type: Array as PropType<HeadBtnListConfig>,\n required: true,\n },\n selectedRowKeys: {\n type: Array as PropType<any[]>,\n required: true,\n },\n dataSource: {\n type: Array as PropType<any[]>,\n required: true,\n },\n searchConfig: {\n type: Object as PropType<{ model: any; options: any }>,\n required: true,\n },\n current_org: {\n type: Object as PropType<any>,\n required: true,\n },\n router: {\n type: Object as PropType<any>,\n required: true,\n },\n field: {\n type: Object as PropType<any>,\n required: true,\n },\n event_obj: {\n type: Object as PropType<any>,\n required: true,\n },\n },\n components: {\n HeadBtnChildren,\n },\n setup(props) {\n const { t } = useI18n();\n const isMenuOpen = ref<Record<string, boolean>>({});\n const route = useRoute();\n const process_list = (\n list: any,\n {\n dataSource,\n selectedRowKeys,\n batchList,\n }: { dataSource: any[]; selectedRowKeys: any[]; batchList: any[] | null },\n ) => {\n if (batchList?.length > 0) {\n const batchGroup = list.find((item: any) => item.name === '批量操作');\n if (batchGroup) {\n if (!batchGroup.children || batchGroup.children.length == 0) {\n batchGroup.children = batchList;\n } else {\n batchGroup.children = [...batchGroup.children, ...batchList];\n }\n } else {\n list.push({\n name: '批量操作',\n order: 1000,\n children: batchList,\n });\n }\n }\n const result = list.filter((button: any) => {\n let data = dataSource;\n // if (button.preProcessData) {\n // data = button.preProcessData({ dataSource: data, selectedRowKeys });\n // }\n let isDisabled = false;\n if (typeof button.is_disabled === 'function') {\n isDisabled = button.is_disabled({ dataSource: data, selectedRowKeys: selectedRowKeys });\n }\n if (typeof button.is_disabled === 'boolean') {\n isDisabled = button.is_disabled;\n }\n if (button.disabled_condition && button.disabled_condition.length > 0) {\n isDisabled = checkCondition({\n conditions: button.disabled_condition,\n dataSource: data,\n selectedRowKeys: selectedRowKeys,\n });\n }\n button.disabled = isDisabled;\n\n if (button.show_condition && button.show_condition.length > 0) {\n return checkCondition({\n conditions: button.show_condition,\n dataSource: data,\n selectedRowKeys: selectedRowKeys,\n });\n }\n\n if (typeof button.is_show === 'function') {\n return button.is_show({ dataSource: data, selectedRowKeys: selectedRowKeys });\n }\n if (typeof button.is_show === 'boolean') {\n return button.is_show;\n }\n return true;\n });\n result.forEach((item: any) => {\n if (item.children) {\n item.children = process_list(item.children, {\n dataSource: dataSource,\n selectedRowKeys: selectedRowKeys,\n batchList: null,\n });\n }\n });\n return result;\n };\n const filter_head_btn_list = computed(() => {\n if (!props.auth_head_btn_list) return [];\n const list = process_list(cloneDeep(props.auth_head_btn_list), {\n dataSource: props.dataSource,\n selectedRowKeys: props.selectedRowKeys,\n batchList: props.auth_batch_update_list,\n });\n nested_sort_list(list);\n return list;\n });\n // 处理按钮点击事件\n const handleBtnClick = (btn: any, params: any) => {\n let action_func = null;\n let query_json = {};\n if (route.query?.query_json) {\n query_json = JSON.parse(route.query?.query_json as any);\n }\n const routeQueryParams = JSON.parse(JSON.stringify({ ...route.query, ...query_json }));\n if (!btn.model_kind) {\n action_func = btn.cb;\n } else if (btn.model_kind === 'confirm') {\n action_func = head_btn_confirm;\n } else if (btn.model_kind === 'custom_component') {\n action_func = head_btn_custom_component;\n } else if (btn.model_kind === 'form') {\n action_func = head_btn_form;\n }\n\n if (!action_func) return;\n\n action_func({\n ...params,\n button: btn,\n t: t,\n current_org: props.current_org,\n routeQueryParams: routeQueryParams,\n });\n };\n return {\n filter_head_btn_list,\n handleBtnClick,\n isMenuOpen,\n };\n },\n});\n</script>\n","<template>\n <a-popover>\n <template #content>\n <a-button\n size=\"small\"\n style=\"margin: 10px 5px\"\n :type=\"refreshType === '手动' ? 'primary' : 'default'\"\n @click=\"selectRefreshType('手动')\"\n >\n {{ $t('手动刷新') }}\n </a-button>\n <a-dropdown class=\"dropdown\">\n <a-button\n size=\"small\"\n style=\"margin: 10px 5px\"\n :type=\"refreshType === '手动' ? 'default' : 'primary'\"\n >\n {{ $t('自动刷新') }}\n <span v-if=\"refreshType !== '手动'\">({{ refreshType }})</span>\n </a-button>\n <template #overlay>\n <a-menu>\n <a-menu-item>\n <a\n href=\"javascript:;\"\n @click=\"selectRefreshType('5s')\"\n >\n 5s\n </a>\n </a-menu-item>\n <a-menu-item>\n <a\n href=\"javascript:;\"\n @click=\"selectRefreshType('10s')\"\n >\n 10s\n </a>\n </a-menu-item>\n <a-menu-item>\n <a\n href=\"javascript:;\"\n @click=\"selectRefreshType('30s')\"\n >\n 30s\n </a>\n </a-menu-item>\n </a-menu>\n </template>\n </a-dropdown>\n </template>\n <reload-outlined\n v-if=\"refreshType === '手动'\"\n @click=\"refresh\"\n />\n <loading-outlined v-if=\"(countdown == -1 || loading) && refreshType !== '手动'\" />\n <span v-if=\"countdown >= 0 && !loading\">{{ countdown + 1 }}s</span>\n </a-popover>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, onActivated, onDeactivated, onUnmounted, watch } from 'vue';\nimport { LoadingOutlined, ReloadOutlined } from '@ant-design/icons-vue';\nexport default defineComponent({\n name: 'refreshTypeModal',\n props: {\n refreshType: {\n type: String,\n default: () => '手动',\n },\n loading: {\n type: Boolean,\n default: () => false,\n },\n },\n components: {\n LoadingOutlined,\n ReloadOutlined,\n },\n emits: ['refresh', 'typeChange'],\n setup(props, { emit }) {\n let init = false;\n const countdown: any = ref(0);\n const current_page: any = ref(true);\n\n // 刷新模式切换\n const selectRefreshType = (type: any) => {\n emit('typeChange', type);\n countdown.value = -1;\n if (props.refreshType == '手动') {\n emit('refresh');\n }\n };\n const timer_countdown = setInterval(() => {\n if (countdown.value < 0) {\n switch (props.refreshType) {\n case '手动':\n countdown.value = -1;\n break;\n case '5s':\n countdown.value = 4;\n break;\n case '10s':\n countdown.value = 9;\n break;\n case '30s':\n countdown.value = 29;\n }\n } else if (countdown.value == 0) {\n if (current_page.value && !props.loading && init) {\n emit('refresh', true);\n }\n countdown.value = -1;\n } else {\n countdown.value--;\n }\n }, 1000);\n\n watch(\n () => props.loading,\n () => {\n if (!props.loading) {\n countdown.value = -1;\n init = true;\n }\n },\n );\n\n onActivated(() => {\n if (!current_page.value) {\n current_page.value = true;\n }\n });\n onDeactivated(() => {\n current_page.value = false;\n });\n\n onUnmounted(() => {\n clearInterval(timer_countdown);\n });\n\n const refresh = () => {\n emit('refresh');\n };\n return {\n props,\n countdown,\n refresh,\n selectRefreshType,\n };\n },\n});\n</script>\n","<template>\n <a-popover>\n <template #content>\n <a-button\n size=\"small\"\n style=\"margin: 10px 5px\"\n :type=\"refreshType === '手动' ? 'primary' : 'default'\"\n @click=\"selectRefreshType('手动')\"\n >\n {{ $t('手动刷新') }}\n </a-button>\n <a-dropdown class=\"dropdown\">\n <a-button\n size=\"small\"\n style=\"margin: 10px 5px\"\n :type=\"refreshType === '手动' ? 'default' : 'primary'\"\n >\n {{ $t('自动刷新') }}\n <span v-if=\"refreshType !== '手动'\">({{ refreshType }})</span>\n </a-button>\n <template #overlay>\n <a-menu>\n <a-menu-item>\n <a\n href=\"javascript:;\"\n @click=\"selectRefreshType('5s')\"\n >\n 5s\n </a>\n </a-menu-item>\n <a-menu-item>\n <a\n href=\"javascript:;\"\n @click=\"selectRefreshType('10s')\"\n >\n 10s\n </a>\n </a-menu-item>\n <a-menu-item>\n <a\n href=\"javascript:;\"\n @click=\"selectRefreshType('30s')\"\n >\n 30s\n </a>\n </a-menu-item>\n </a-menu>\n </template>\n </a-dropdown>\n </template>\n <reload-outlined\n v-if=\"refreshType === '手动'\"\n @click=\"refresh\"\n />\n <loading-outlined v-if=\"(countdown == -1 || loading) && refreshType !== '手动'\" />\n <span v-if=\"countdown >= 0 && !loading\">{{ countdown + 1 }}s</span>\n </a-popover>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, onActivated, onDeactivated, onUnmounted, watch } from 'vue';\nimport { LoadingOutlined, ReloadOutlined } from '@ant-design/icons-vue';\nexport default defineComponent({\n name: 'refreshTypeModal',\n props: {\n refreshType: {\n type: String,\n default: () => '手动',\n },\n loading: {\n type: Boolean,\n default: () => false,\n },\n },\n components: {\n LoadingOutlined,\n ReloadOutlined,\n },\n emits: ['refresh', 'typeChange'],\n setup(props, { emit }) {\n let init = false;\n const countdown: any = ref(0);\n const current_page: any = ref(true);\n\n // 刷新模式切换\n const selectRefreshType = (type: any) => {\n emit('typeChange', type);\n countdown.value = -1;\n if (props.refreshType == '手动') {\n emit('refresh');\n }\n };\n const timer_countdown = setInterval(() => {\n if (countdown.value < 0) {\n switch (props.refreshType) {\n case '手动':\n countdown.value = -1;\n break;\n case '5s':\n countdown.value = 4;\n break;\n case '10s':\n countdown.value = 9;\n break;\n case '30s':\n countdown.value = 29;\n }\n } else if (countdown.value == 0) {\n if (current_page.value && !props.loading && init) {\n emit('refresh', true);\n }\n countdown.value = -1;\n } else {\n countdown.value--;\n }\n }, 1000);\n\n watch(\n () => props.loading,\n () => {\n if (!props.loading) {\n countdown.value = -1;\n init = true;\n }\n },\n );\n\n onActivated(() => {\n if (!current_page.value) {\n current_page.value = true;\n }\n });\n onDeactivated(() => {\n current_page.value = false;\n });\n\n onUnmounted(() => {\n clearInterval(timer_countdown);\n });\n\n const refresh = () => {\n emit('refresh');\n };\n return {\n props,\n countdown,\n refresh,\n selectRefreshType,\n };\n },\n});\n</script>\n","<template>\n <div\n class=\"ant-pro-table-list-toolbar\"\n v-if=\"!config?.hide_header\"\n ref=\"headerRef\"\n >\n <div class=\"ant-pro-table-list-toolbar-container\">\n <div class=\"ant-pro-table-list-toolbar-left\">\n <div class=\"ant-pro-table-list-toolbar-title\">\n <span v-if=\"config?.show_title\">{{ config?.title }}</span>\n <div v-if=\"config?.show_current_view\">\n <span>\n {{ currentView?.name }}\n </span>\n <template v-if=\"isViewChange && currentView && currentView.id !== 'no-view'\">\n <span style=\"font-size: 12px; margin-right: 5px\">(已编辑)</span>\n <a-dropdown\n v-model:open=\"isDropdown\"\n trigger=\"click\"\n >\n <a-tag\n :bordered=\"false\"\n style=\"cursor: pointer\"\n >\n {{ $t('保存') }}\n <down-outlined\n v-if=\"!isDropdown\"\n style=\"font-size: 10px; cursor: pointer\"\n />\n <up-outlined\n v-if=\"isDropdown\"\n style=\"font-size: 10px; cursor: pointer\"\n />\n </a-tag>\n <template #overlay>\n <a-menu>\n <a-menu-item>\n <span\n @click=\"\n () => {\n isDropdown = false;\n selfEventBus.emit('saveView');\n }\n \"\n >\n {{ $t('保存视图') }}\n </span>\n </a-menu-item>\n <a-menu-item>\n <span\n @click=\"\n () => {\n isDropdown = false;\n selfEventBus.emit('saveNewView');\n }\n \"\n >\n {{ $t('另存为新视图') }}\n </span>\n </a-menu-item>\n </a-menu>\n </template>\n </a-dropdown>\n <a-tag\n :bordered=\"false\"\n style=\"cursor: pointer\"\n @click=\"\n () => {\n selfEventBus.emit('reinit');\n }\n \"\n >\n {{ $t('重置') }}\n </a-tag>\n </template>\n </div>\n </div>\n </div>\n <div class=\"ant-pro-table-list-toolbar-right\">\n <a-space align=\"center\">\n <slot name=\"header_bar_before_btn\"></slot>\n <head-btn\n :auth_batch_update_list=\"auth_batch_update_list\"\n :auth_head_btn_list=\"auth_head_btn_list\"\n :selectedRowKeys=\"selectedRowKeys\"\n :dataSource=\"dataSource\"\n :searchConfig=\"config.query_params || {}\"\n :current_org=\"current_org\"\n :router=\"router\"\n :field=\"{}\"\n :event_obj=\"selfEventBus\"\n />\n <slot name=\"header_bar_after_btn\"></slot>\n </a-space>\n\n <div class=\"ant-pro-table-list-toolbar-divider\">\n <a-divider type=\"vertical\" />\n </div>\n <div\n class=\"ant-pro-table-list-toolbar-setting-item\"\n v-if=\"config?.sys_btn?.refresh !== false\"\n >\n <refresh-type-modal\n :refreshType=\"refreshType\"\n :loading=\"loading\"\n @refresh=\"$emit('refresh')\"\n @typeChange=\"$emit('refreshTypeChange', $event)\"\n />\n </div>\n <div\n class=\"ant-pro-table-list-toolbar-setting-item\"\n v-if=\"config?.sys_btn?.export !== false\"\n >\n <a-tooltip :title=\"$t('导出Excel')\">\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"$emit('export')\"\n >\n <template #icon>\n <download-outlined></download-outlined>\n </template>\n </a-button>\n </a-tooltip>\n </div>\n <div\n class=\"ant-pro-table-list-toolbar-setting-item\"\n v-if=\"config?.sys_btn?.table_size !== false\"\n >\n <a-tooltip :title=\"$t('密度')\">\n <a-dropdown\n :trigger=\"['click']\"\n placement=\"bottomRight\"\n >\n <column-height-outlined />\n <template #overlay>\n <a-menu\n :selected-keys=\"[tableSize]\"\n style=\"width: 80px\"\n @click=\"\n ({ key }) => {\n $emit('update:tableSize', key as string);\n $emit('tableSizeChange', key as string);\n }\n \"\n >\n <a-menu-item key=\"default\">\n <a href=\"javascript:\">{{ $t('默认') }}</a>\n </a-menu-item>\n <a-menu-item key=\"middle\">\n <a href=\"javascript:\">{{ $t('中等') }}</a>\n </a-menu-item>\n <a-menu-item key=\"small\">\n <a href=\"javascript:\">{{ $t('紧凑') }}</a>\n </a-menu-item>\n </a-menu>\n </template>\n </a-dropdown>\n </a-tooltip>\n </div>\n <div\n class=\"ant-pro-table-list-toolbar-setting-item\"\n v-if=\"config?.sys_btn?.column_config !== false\"\n >\n <a-tooltip :title=\"$t('设置')\">\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"settingOpen = true\"\n >\n <template #icon>\n <setting-outlined />\n </template>\n </a-button>\n </a-tooltip>\n </div>\n\n <div\n class=\"ant-pro-table-list-toolbar-setting-item\"\n v-if=\"config?.sys_btn?.full_screen !== false\"\n >\n <a-tooltip :title=\"screenState ? $t('退出全屏') : $t('全屏')\">\n <fullscreen-outlined\n v-if=\"!screenState\"\n @click=\"$emit('setFull')\"\n />\n <fullscreen-exit-outlined\n v-else\n @click=\"$emit('exitFull')\"\n />\n </a-tooltip>\n </div>\n </div>\n </div>\n </div>\n <a-modal\n :title=\"$t('设置')\"\n width=\"1000px\"\n v-model:open=\"settingOpen\"\n >\n <column-edit-view\n :columns=\"columns\"\n :is_view=\"is_view\"\n :view_key=\"view_key\"\n :view_flag_name=\"view_flag_name\"\n @change=\"$emit('columnsChange', $event)\"\n ></column-edit-view>\n <template #footer>\n <a-button @click=\"settingOpen = false\">\n {{ $t('关闭') }}\n </a-button>\n </template>\n </a-modal>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n ColumnHeightOutlined,\n FullscreenExitOutlined,\n FullscreenOutlined,\n DownloadOutlined,\n SettingOutlined,\n} from '@ant-design/icons-vue';\nimport { useResizeObserver } from '@vueuse/core';\nimport { PropType, ref } from 'vue';\nimport columnEditView from './tableConfig/index.vue';\nimport HeadBtn from './headBtn.vue';\nimport RefreshTypeModal from './refresh-type-modal/index.vue';\nimport { Column, Table } from './typing';\nimport { useTableProState } from './utils';\n\ndefineProps({\n config: {\n type: Object as PropType<Table>,\n required: true,\n },\n auth_batch_update_list: {\n type: Array,\n default: () => [],\n },\n auth_head_btn_list: {\n type: Array,\n default: () => [],\n },\n selectedRowKeys: {\n type: Array,\n default: () => [],\n },\n dataSource: {\n type: Array,\n default: () => [],\n },\n current_org: {\n type: Object,\n },\n router: {\n type: Object,\n },\n selfEventBus: {\n type: Object,\n },\n loading: {\n type: Boolean,\n default: false,\n },\n screenState: {\n type: Boolean,\n default: false,\n },\n tableSize: {\n type: String,\n default: 'small',\n },\n columns: {\n type: Array as PropType<Column[]>,\n default: () => [],\n },\n view_key: {\n type: String,\n default: '',\n },\n view_flag_name: {\n type: String,\n default: '',\n },\n is_view: {\n type: Boolean,\n default: true,\n },\n refreshType: {\n type: String,\n default: '手动',\n },\n});\n\nconst emit = defineEmits([\n 'refresh',\n 'export',\n 'setFull',\n 'exitFull',\n 'columnsChange',\n 'viewSelected',\n 'update:tableSize',\n 'heightChange',\n 'refreshTypeChange',\n 'tableSizeChange',\n]);\nconst settingOpen = ref(false);\nconst headerRef = ref(null);\nuseResizeObserver(headerRef, entries => {\n emit('heightChange', entries[0].contentRect.height);\n});\nconst { currentView, isViewChange } = useTableProState();\nconst isDropdown = ref(false);\n</script>\n\n<style lang=\"less\" scoped>\n.ant-pro-table-list-toolbar-container {\n height: 30px;\n line-height: 30px;\n}\n.ant-pro-table-list-toolbar-setting-item {\n font-size: 14px;\n}\n</style>\n","<template>\n <div\n class=\"ant-pro-table-list-toolbar\"\n v-if=\"!config?.hide_header\"\n ref=\"headerRef\"\n >\n <div class=\"ant-pro-table-list-toolbar-container\">\n <div class=\"ant-pro-table-list-toolbar-left\">\n <div class=\"ant-pro-table-list-toolbar-title\">\n <span v-if=\"config?.show_title\">{{ config?.title }}</span>\n <div v-if=\"config?.show_current_view\">\n <span>\n {{ currentView?.name }}\n </span>\n <template v-if=\"isViewChange && currentView && currentView.id !== 'no-view'\">\n <span style=\"font-size: 12px; margin-right: 5px\">(已编辑)</span>\n <a-dropdown\n v-model:open=\"isDropdown\"\n trigger=\"click\"\n >\n <a-tag\n :bordered=\"false\"\n style=\"cursor: pointer\"\n >\n {{ $t('保存') }}\n <down-outlined\n v-if=\"!isDropdown\"\n style=\"font-size: 10px; cursor: pointer\"\n />\n <up-outlined\n v-if=\"isDropdown\"\n style=\"font-size: 10px; cursor: pointer\"\n />\n </a-tag>\n <template #overlay>\n <a-menu>\n <a-menu-item>\n <span\n @click=\"\n () => {\n isDropdown = false;\n selfEventBus.emit('saveView');\n }\n \"\n >\n {{ $t('保存视图') }}\n </span>\n </a-menu-item>\n <a-menu-item>\n <span\n @click=\"\n () => {\n isDropdown = false;\n selfEventBus.emit('saveNewView');\n }\n \"\n >\n {{ $t('另存为新视图') }}\n </span>\n </a-menu-item>\n </a-menu>\n </template>\n </a-dropdown>\n <a-tag\n :bordered=\"false\"\n style=\"cursor: pointer\"\n @click=\"\n () => {\n selfEventBus.emit('reinit');\n }\n \"\n >\n {{ $t('重置') }}\n </a-tag>\n </template>\n </div>\n </div>\n </div>\n <div class=\"ant-pro-table-list-toolbar-right\">\n <a-space align=\"center\">\n <slot name=\"header_bar_before_btn\"></slot>\n <head-btn\n :auth_batch_update_list=\"auth_batch_update_list\"\n :auth_head_btn_list=\"auth_head_btn_list\"\n :selectedRowKeys=\"selectedRowKeys\"\n :dataSource=\"dataSource\"\n :searchConfig=\"config.query_params || {}\"\n :current_org=\"current_org\"\n :router=\"router\"\n :field=\"{}\"\n :event_obj=\"selfEventBus\"\n />\n <slot name=\"header_bar_after_btn\"></slot>\n </a-space>\n\n <div class=\"ant-pro-table-list-toolbar-divider\">\n <a-divider type=\"vertical\" />\n </div>\n <div\n class=\"ant-pro-table-list-toolbar-setting-item\"\n v-if=\"config?.sys_btn?.refresh !== false\"\n >\n <refresh-type-modal\n :refreshType=\"refreshType\"\n :loading=\"loading\"\n @refresh=\"$emit('refresh')\"\n @typeChange=\"$emit('refreshTypeChange', $event)\"\n />\n </div>\n <div\n class=\"ant-pro-table-list-toolbar-setting-item\"\n v-if=\"config?.sys_btn?.export !== false\"\n >\n <a-tooltip :title=\"$t('导出Excel')\">\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"$emit('export')\"\n >\n <template #icon>\n <download-outlined></download-outlined>\n </template>\n </a-button>\n </a-tooltip>\n </div>\n <div\n class=\"ant-pro-table-list-toolbar-setting-item\"\n v-if=\"config?.sys_btn?.table_size !== false\"\n >\n <a-tooltip :title=\"$t('密度')\">\n <a-dropdown\n :trigger=\"['click']\"\n placement=\"bottomRight\"\n >\n <column-height-outlined />\n <template #overlay>\n <a-menu\n :selected-keys=\"[tableSize]\"\n style=\"width: 80px\"\n @click=\"\n ({ key }) => {\n $emit('update:tableSize', key as string);\n $emit('tableSizeChange', key as string);\n }\n \"\n >\n <a-menu-item key=\"default\">\n <a href=\"javascript:\">{{ $t('默认') }}</a>\n </a-menu-item>\n <a-menu-item key=\"middle\">\n <a href=\"javascript:\">{{ $t('中等') }}</a>\n </a-menu-item>\n <a-menu-item key=\"small\">\n <a href=\"javascript:\">{{ $t('紧凑') }}</a>\n </a-menu-item>\n </a-menu>\n </template>\n </a-dropdown>\n </a-tooltip>\n </div>\n <div\n class=\"ant-pro-table-list-toolbar-setting-item\"\n v-if=\"config?.sys_btn?.column_config !== false\"\n >\n <a-tooltip :title=\"$t('设置')\">\n <a-button\n type=\"text\"\n size=\"small\"\n @click=\"settingOpen = true\"\n >\n <template #icon>\n <setting-outlined />\n </template>\n </a-button>\n </a-tooltip>\n </div>\n\n <div\n class=\"ant-pro-table-list-toolbar-setting-item\"\n v-if=\"config?.sys_btn?.full_screen !== false\"\n >\n <a-tooltip :title=\"screenState ? $t('退出全屏') : $t('全屏')\">\n <fullscreen-outlined\n v-if=\"!screenState\"\n @click=\"$emit('setFull')\"\n />\n <fullscreen-exit-outlined\n v-else\n @click=\"$emit('exitFull')\"\n />\n </a-tooltip>\n </div>\n </div>\n </div>\n </div>\n <a-modal\n :title=\"$t('设置')\"\n width=\"1000px\"\n v-model:open=\"settingOpen\"\n >\n <column-edit-view\n :columns=\"columns\"\n :is_view=\"is_view\"\n :view_key=\"view_key\"\n :view_flag_name=\"view_flag_name\"\n @change=\"$emit('columnsChange', $event)\"\n ></column-edit-view>\n <template #footer>\n <a-button @click=\"settingOpen = false\">\n {{ $t('关闭') }}\n </a-button>\n </template>\n </a-modal>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n ColumnHeightOutlined,\n FullscreenExitOutlined,\n FullscreenOutlined,\n DownloadOutlined,\n SettingOutlined,\n} from '@ant-design/icons-vue';\nimport { useResizeObserver } from '@vueuse/core';\nimport { PropType, ref } from 'vue';\nimport columnEditView from './tableConfig/index.vue';\nimport HeadBtn from './headBtn.vue';\nimport RefreshTypeModal from './refresh-type-modal/index.vue';\nimport { Column, Table } from './typing';\nimport { useTableProState } from './utils';\n\ndefineProps({\n config: {\n type: Object as PropType<Table>,\n required: true,\n },\n auth_batch_update_list: {\n type: Array,\n default: () => [],\n },\n auth_head_btn_list: {\n type: Array,\n default: () => [],\n },\n selectedRowKeys: {\n type: Array,\n default: () => [],\n },\n dataSource: {\n type: Array,\n default: () => [],\n },\n current_org: {\n type: Object,\n },\n router: {\n type: Object,\n },\n selfEventBus: {\n type: Object,\n },\n loading: {\n type: Boolean,\n default: false,\n },\n screenState: {\n type: Boolean,\n default: false,\n },\n tableSize: {\n type: String,\n default: 'small',\n },\n columns: {\n type: Array as PropType<Column[]>,\n default: () => [],\n },\n view_key: {\n type: String,\n default: '',\n },\n view_flag_name: {\n type: String,\n default: '',\n },\n is_view: {\n type: Boolean,\n default: true,\n },\n refreshType: {\n type: String,\n default: '手动',\n },\n});\n\nconst emit = defineEmits([\n 'refresh',\n 'export',\n 'setFull',\n 'exitFull',\n 'columnsChange',\n 'viewSelected',\n 'update:tableSize',\n 'heightChange',\n 'refreshTypeChange',\n 'tableSizeChange',\n]);\nconst settingOpen = ref(false);\nconst headerRef = ref(null);\nuseResizeObserver(headerRef, entries => {\n emit('heightChange', entries[0].contentRect.height);\n});\nconst { currentView, isViewChange } = useTableProState();\nconst isDropdown = ref(false);\n</script>\n\n<style lang=\"less\" scoped>\n.ant-pro-table-list-toolbar-container {\n height: 30px;\n line-height: 30px;\n}\n.ant-pro-table-list-toolbar-setting-item {\n font-size: 14px;\n}\n</style>\n","<template>\n <component\n :is=\"'CellSummary_' + item.cellSummaryComponent\"\n v-if=\"item.cellSummaryComponent\"\n :cmpObj=\"{\n item: item,\n total: total,\n }\"\n ></component>\n <span v-else>{{ item.total_content ? item.total_content(total) : total }}</span>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nconst props = defineProps({\n item: {\n type: Object,\n required: true,\n },\n summaryParams: {\n type: Object,\n required: true,\n },\n});\nconst total = computed(() => {\n let totla: any = 0;\n for (const item of props.summaryParams.pageData) {\n let itemValue = item[props.summaryParams.column.dataIndex];\n itemValue = getValue(itemValue);\n\n if (isNaN(itemValue) || itemValue == null) {\n itemValue = 0;\n }\n totla = add(totla, itemValue);\n }\n\n return totla;\n});\nfunction add(a, b) {\n const precision = Math.max(\n (a.toString().split('.')[1] || '').length,\n (b.toString().split('.')[1] || '').length,\n );\n return parseFloat((a + b).toFixed(precision));\n}\nconst getValue = (value: any) => {\n if (typeof value === 'string') {\n value = parseFloat(value);\n }\n return value;\n};\n</script>\n<style lang=\"less\" scoped></style>\n","<template>\n <component\n :is=\"'CellSummary_' + item.cellSummaryComponent\"\n v-if=\"item.cellSummaryComponent\"\n :cmpObj=\"{\n item: item,\n total: total,\n }\"\n ></component>\n <span v-else>{{ item.total_content ? item.total_content(total) : total }}</span>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nconst props = defineProps({\n item: {\n type: Object,\n required: true,\n },\n summaryParams: {\n type: Object,\n required: true,\n },\n});\nconst total = computed(() => {\n let totla: any = 0;\n for (const item of props.summaryParams.pageData) {\n let itemValue = item[props.summaryParams.column.dataIndex];\n itemValue = getValue(itemValue);\n\n if (isNaN(itemValue) || itemValue == null) {\n itemValue = 0;\n }\n totla = add(totla, itemValue);\n }\n\n return totla;\n});\nfunction add(a, b) {\n const precision = Math.max(\n (a.toString().split('.')[1] || '').length,\n (b.toString().split('.')[1] || '').length,\n );\n return parseFloat((a + b).toFixed(precision));\n}\nconst getValue = (value: any) => {\n if (typeof value === 'string') {\n value = parseFloat(value);\n }\n return value;\n};\n</script>\n<style lang=\"less\" scoped></style>\n","<template>\n <a-menu\n :items=\"menuItems\"\n size=\"small\"\n mode=\"vertical\"\n @click=\"handleClick\"\n ></a-menu>\n <a-modal\n :title=\"$t('设置')\"\n width=\"1000px\"\n v-model:open=\"settingOpen\"\n >\n <column-edit-view\n :columns=\"columns\"\n :is_view=\"is_view\"\n :view_key=\"view_key\"\n :view_flag_name=\"view_flag_name\"\n @change=\"$emit('columnsChange', $event)\"\n ></column-edit-view>\n <template #footer>\n <a-button @click=\"settingOpen = false\">\n {{ $t('关闭') }}\n </a-button>\n </template>\n </a-modal>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n CopyOutlined,\n ReloadOutlined,\n DownloadOutlined,\n SettingOutlined,\n SaveOutlined,\n AlignLeftOutlined,\n} from '@ant-design/icons-vue';\nimport { copyValue, isNotEmpty } from 'liyu-pc-base/utils/function';\nimport { computed, h, PropType, ref } from 'vue';\nimport columnEditView from './tableConfig/index.vue';\nimport { Column } from './typing';\nimport { useTableProState } from './utils';\nimport { MenuProps } from 'ant-design-vue';\n\nconst props = defineProps({\n contextmenuPopup: {\n type: Object,\n required: true,\n },\n dataSource: {\n type: Array,\n default: () => [],\n },\n columns: {\n type: Array as PropType<Column[]>,\n default: () => [],\n },\n view_key: {\n type: String,\n default: '',\n },\n view_flag_name: {\n type: String,\n default: '',\n },\n is_view: {\n type: Boolean,\n default: false,\n },\n selfEventBus: {\n type: Object,\n },\n});\n\nconst emit = defineEmits(['refresh', 'export', 'columnsChange']);\nconst settingOpen = ref(false);\nconst { currentView, isViewChange } = useTableProState();\nconst menuItems = computed(() => {\n let res: any = [\n {\n key: 'copy',\n icon: () => h(CopyOutlined),\n label: '复制',\n children: [\n {\n key: 'copy_cell',\n icon: () => h(CopyOutlined),\n label: '复制单元格',\n },\n {\n key: 'copy_record',\n icon: () => h(CopyOutlined),\n label: '复制行',\n },\n {\n key: 'copy_column',\n icon: () => h(CopyOutlined),\n label: '复制列',\n },\n ],\n },\n {\n key: 'refresh',\n icon: () => h(ReloadOutlined),\n label: '刷新',\n },\n {\n key: 'export',\n icon: () => h(DownloadOutlined),\n label: '导出',\n },\n {\n key: 'table_config',\n icon: () => h(SettingOutlined),\n label: '设置',\n },\n ];\n if (\n props.is_view &&\n isViewChange.value &&\n currentView.value &&\n currentView.value.id !== 'no-view'\n ) {\n res = [\n ...res,\n {\n key: 'view',\n icon: () => h(AlignLeftOutlined),\n label: '视图',\n children: [\n {\n key: 'save_view',\n icon: () => h(SaveOutlined),\n label: '保存视图',\n },\n {\n key: 'save_new_view',\n icon: () => h(SaveOutlined),\n label: '另存视图',\n },\n {\n key: 'reinit',\n icon: () => h(ReloadOutlined),\n label: '重置',\n },\n ],\n },\n ];\n }\n return res;\n});\n\nconst formatCopyValue = (value: any) => {\n return typeof value === 'object' ? JSON.stringify(value) : value;\n};\n\nconst copyClick = (type: 'cell' | 'column' | 'record') => {\n const { contextmenuPopup, dataSource, columns } = props;\n if (type === 'cell') {\n if (contextmenuPopup.column.key !== 'operation') {\n copyValue(formatCopyValue(contextmenuPopup.text));\n }\n } else if (type === 'column') {\n if (contextmenuPopup.column.key !== 'operation') {\n const { dataIndex } = contextmenuPopup.column;\n const value = dataSource.map((d: any) => formatCopyValue(d[dataIndex])).join('\\r\\n');\n copyValue(value);\n }\n } else if (type === 'record') {\n const record = contextmenuPopup.record;\n const value = columns\n .map((c: any) => (c.dataIndex ? formatCopyValue(record[c.dataIndex]) : ''))\n .filter(c => isNotEmpty(c))\n .join(' ');\n copyValue(value);\n }\n};\n\nconst handleClick: MenuProps['onClick'] = menuInfo => {\n if (menuInfo.key === 'copy_cell') {\n copyClick('cell');\n } else if (menuInfo.key === 'copy_record') {\n copyClick('record');\n } else if (menuInfo.key === 'copy_column') {\n copyClick('column');\n } else if (menuInfo.key === 'refresh') {\n emit('refresh');\n } else if (menuInfo.key === 'export') {\n emit('export');\n } else if (menuInfo.key === 'table_config') {\n settingOpen.value = true;\n } else if (menuInfo.key === 'save_view') {\n props.selfEventBus.emit('saveView');\n } else if (menuInfo.key === 'save_new_view') {\n props.selfEventBus.emit('saveNewView');\n } else if (menuInfo.key === 'reinit') {\n props.selfEventBus.emit('reinit');\n }\n props.contextmenuPopup.hidePopup();\n};\n</script>\n\n<style lang=\"less\" scoped>\n.popup-divider {\n :deep(.ant-divider-horizontal) {\n margin-top: 1px;\n margin-bottom: 1px;\n }\n}\n</style>\n","<template>\n <a-menu\n :items=\"menuItems\"\n size=\"small\"\n mode=\"vertical\"\n @click=\"handleClick\"\n ></a-menu>\n <a-modal\n :title=\"$t('设置')\"\n width=\"1000px\"\n v-model:open=\"settingOpen\"\n >\n <column-edit-view\n :columns=\"columns\"\n :is_view=\"is_view\"\n :view_key=\"view_key\"\n :view_flag_name=\"view_flag_name\"\n @change=\"$emit('columnsChange', $event)\"\n ></column-edit-view>\n <template #footer>\n <a-button @click=\"settingOpen = false\">\n {{ $t('关闭') }}\n </a-button>\n </template>\n </a-modal>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n CopyOutlined,\n ReloadOutlined,\n DownloadOutlined,\n SettingOutlined,\n SaveOutlined,\n AlignLeftOutlined,\n} from '@ant-design/icons-vue';\nimport { copyValue, isNotEmpty } from 'liyu-pc-base/utils/function';\nimport { computed, h, PropType, ref } from 'vue';\nimport columnEditView from './tableConfig/index.vue';\nimport { Column } from './typing';\nimport { useTableProState } from './utils';\nimport { MenuProps } from 'ant-design-vue';\n\nconst props = defineProps({\n contextmenuPopup: {\n type: Object,\n required: true,\n },\n dataSource: {\n type: Array,\n default: () => [],\n },\n columns: {\n type: Array as PropType<Column[]>,\n default: () => [],\n },\n view_key: {\n type: String,\n default: '',\n },\n view_flag_name: {\n type: String,\n default: '',\n },\n is_view: {\n type: Boolean,\n default: false,\n },\n selfEventBus: {\n type: Object,\n },\n});\n\nconst emit = defineEmits(['refresh', 'export', 'columnsChange']);\nconst settingOpen = ref(false);\nconst { currentView, isViewChange } = useTableProState();\nconst menuItems = computed(() => {\n let res: any = [\n {\n key: 'copy',\n icon: () => h(CopyOutlined),\n label: '复制',\n children: [\n {\n key: 'copy_cell',\n icon: () => h(CopyOutlined),\n label: '复制单元格',\n },\n {\n key: 'copy_record',\n icon: () => h(CopyOutlined),\n label: '复制行',\n },\n {\n key: 'copy_column',\n icon: () => h(CopyOutlined),\n label: '复制列',\n },\n ],\n },\n {\n key: 'refresh',\n icon: () => h(ReloadOutlined),\n label: '刷新',\n },\n {\n key: 'export',\n icon: () => h(DownloadOutlined),\n label: '导出',\n },\n {\n key: 'table_config',\n icon: () => h(SettingOutlined),\n label: '设置',\n },\n ];\n if (\n props.is_view &&\n isViewChange.value &&\n currentView.value &&\n currentView.value.id !== 'no-view'\n ) {\n res = [\n ...res,\n {\n key: 'view',\n icon: () => h(AlignLeftOutlined),\n label: '视图',\n children: [\n {\n key: 'save_view',\n icon: () => h(SaveOutlined),\n label: '保存视图',\n },\n {\n key: 'save_new_view',\n icon: () => h(SaveOutlined),\n label: '另存视图',\n },\n {\n key: 'reinit',\n icon: () => h(ReloadOutlined),\n label: '重置',\n },\n ],\n },\n ];\n }\n return res;\n});\n\nconst formatCopyValue = (value: any) => {\n return typeof value === 'object' ? JSON.stringify(value) : value;\n};\n\nconst copyClick = (type: 'cell' | 'column' | 'record') => {\n const { contextmenuPopup, dataSource, columns } = props;\n if (type === 'cell') {\n if (contextmenuPopup.column.key !== 'operation') {\n copyValue(formatCopyValue(contextmenuPopup.text));\n }\n } else if (type === 'column') {\n if (contextmenuPopup.column.key !== 'operation') {\n const { dataIndex } = contextmenuPopup.column;\n const value = dataSource.map((d: any) => formatCopyValue(d[dataIndex])).join('\\r\\n');\n copyValue(value);\n }\n } else if (type === 'record') {\n const record = contextmenuPopup.record;\n const value = columns\n .map((c: any) => (c.dataIndex ? formatCopyValue(record[c.dataIndex]) : ''))\n .filter(c => isNotEmpty(c))\n .join(' ');\n copyValue(value);\n }\n};\n\nconst handleClick: MenuProps['onClick'] = menuInfo => {\n if (menuInfo.key === 'copy_cell') {\n copyClick('cell');\n } else if (menuInfo.key === 'copy_record') {\n copyClick('record');\n } else if (menuInfo.key === 'copy_column') {\n copyClick('column');\n } else if (menuInfo.key === 'refresh') {\n emit('refresh');\n } else if (menuInfo.key === 'export') {\n emit('export');\n } else if (menuInfo.key === 'table_config') {\n settingOpen.value = true;\n } else if (menuInfo.key === 'save_view') {\n props.selfEventBus.emit('saveView');\n } else if (menuInfo.key === 'save_new_view') {\n props.selfEventBus.emit('saveNewView');\n } else if (menuInfo.key === 'reinit') {\n props.selfEventBus.emit('reinit');\n }\n props.contextmenuPopup.hidePopup();\n};\n</script>\n\n<style lang=\"less\" scoped>\n.popup-divider {\n :deep(.ant-divider-horizontal) {\n margin-top: 1px;\n margin-bottom: 1px;\n }\n}\n</style>\n","<template>\n <div\n class=\"table-wraper\"\n ref=\"tableWraperRef\"\n >\n <div ref=\"searchRef\">\n <Search\n v-if=\"config?.search_config && config.search_config.length > 0\"\n :searchConfig=\"config?.search_config || []\"\n :autoRefreshOnSearchChange=\"config?.auto_refresh_on_search_change\"\n v-model:searchConditions=\"searchConditions\"\n :event-bus=\"selfEventBus\"\n :searchType=\"search_type\"\n :searchDisplayType=\"config?.search_display_type\"\n :searchColumnCount=\"config?.search_column_count\"\n :viewSearchConfig=\"viewSearchConfig\"\n @viewSearchConfigChange=\"viewSearchConfigChange\"\n @change=\"handleSearchChange\"\n ></Search>\n </div>\n <a-card\n ref=\"elRef\"\n :body-style=\"{ padding: 0 }\"\n >\n <TableHeader\n :config=\"config\"\n :auth_batch_update_list=\"auth_batch_update_list\"\n :auth_head_btn_list=\"auth_head_btn_list\"\n :selectedRowKeys=\"selectedRowKeys\"\n :dataSource=\"dataSource\"\n :current_org=\"current_org\"\n :router=\"router\"\n :selfEventBus=\"selfEventBus\"\n :loading=\"loading\"\n :screenState=\"screenState\"\n v-model:tableSize=\"state.tableSize\"\n :columns=\"columns\"\n :view_key=\"view_key\"\n :view_flag_name=\"config.title\"\n :is_view=\"is_view\"\n :refreshType=\"refreshType\"\n @refresh=\"refresh\"\n @export=\"handleExport\"\n @setFull=\"setFull\"\n @exitFull=\"exitFull\"\n @columnsChange=\"onColumnsChange\"\n @heightChange=\"h => (headerHeight = h)\"\n @refreshTypeChange=\"handleRefreshTypeChange\"\n @tableSizeChange=\"handleTableSizeChange\"\n >\n <template #header_bar_before_btn>\n <slot name=\"header_bar_before_btn\"></slot>\n </template>\n <template #header_bar_after_btn>\n <slot name=\"header_bar_after_btn\"></slot>\n </template>\n </TableHeader>\n <s-table\n v-if=\"columns?.length > 0\"\n :columns=\"filtedColumns\"\n v-model:selectedRowKeys=\"selectedRowKeys\"\n :data-source=\"dataSource\"\n :bordered=\"true\"\n :size=\"state.tableSize\"\n :height=\"tableHeight\"\n :rowHeight=\"config.rowHeight || undefined\"\n :scroll=\"{\n x: tableContentWidth,\n }\"\n :loading=\"loading && !config?.disabled_table_loading\"\n :pagination=\"\n config?.is_pagination\n ? {\n current: state.current,\n pageSize: state.pageSize,\n total: state.total,\n onChange: handlePageChange,\n showSizeChanger: true,\n pageSizeOptions: pageSizeOptions,\n }\n : false\n \"\n :rowKey=\"'id'\"\n :rowSelection=\"config?.is_selection ? row_selection : null\"\n :custom-cell=\"config?.customCell\"\n :custom-header-cell=\"config?.customHeaderCell\"\n :virtual=\"true\"\n sticky\n summary-fixed\n :preserveRow=\"preserveRow\"\n :style=\"{\n '--row-heigth': `${config.rowHeight}px`,\n }\"\n :class=\"{ 'modify-row-height': !!config.rowHeight }\"\n @change=\"handleChange\"\n @cellClick=\"handleCellClick\"\n @resizeColumn=\"resizeColumn\"\n >\n <template #customFilterDropdown=\"{ confirm, clearFilters, column }\">\n <TableFilterDropdown\n :column=\"column\"\n :searchConfig=\"config.search_config || []\"\n v-model:searchConditions=\"searchConditions\"\n :searchType=\"search_type\"\n :confirm=\"confirm\"\n :clearFilters=\"clearFilters\"\n @search=\"handleSearch\"\n @reset=\"handleReset\"\n />\n </template>\n <template\n #customFilterIcon=\"{ filtered, column }\"\n v-if=\"config?.enable_custom_filter\"\n >\n <FilterFilled\n :style=\"{\n color:\n filtered ||\n filterConditions(searchConditions).some(s => s.field_name === column.dataIndex)\n ? '#108ee9'\n : undefined,\n }\"\n />\n </template>\n <template #bodyCell=\"{ column, index, text, record }\">\n <template v-if=\"column.dataIndex == 'index'\">\n {{ index + 1 + state.pageSize * (state.current - 1) }}\n </template>\n <component\n :is=\"'Cell_' + column.cellComponent\"\n v-else-if=\"column.cellComponent\"\n :cmpObj=\"{\n column: column ? column : {},\n index: index,\n text: text,\n dataSource: dataSource,\n record: record ? record : {},\n pageSize: state.pageSize ? state.pageSize : 500,\n current: state.current ? state.current : 1,\n eventBus: eventBus,\n tableHeightY: tableHeight,\n requestParams: config.query_params,\n auth_btn_list: auth_btn_list,\n event_obj: selfEventBus,\n }\"\n ></component>\n\n <template v-else>\n <span\n v-if=\"searchText && searchedColumn === column.dataIndex\"\n :style=\"column.color ? column.color({ column, index, text, record }) : null\"\n >\n <template\n v-for=\"(fragment, i) in text\n .toString()\n .split(new RegExp(`(?<=${searchText})|(?=${searchText})`, 'i'))\"\n >\n <mark\n v-if=\"fragment.toLowerCase() === searchText.toLowerCase()\"\n :key=\"i\"\n class=\"highlight\"\n >\n {{ fragment }}\n </mark>\n <template v-else>{{ fragment }}</template>\n </template>\n </span>\n <span\n v-else\n :style=\"column.color ? column.color({ column, index, text, record }) : null\"\n >\n {{ column.content ? column.content({ column, index, text, record }) : text }}\n </span>\n </template>\n </template>\n <template\n #summary\n v-if=\"summaryColumns.length > 0\"\n >\n <s-table-summary-row>\n <s-table-summary-cell :index=\"0\">合计</s-table-summary-cell>\n <s-table-summary-cell\n v-for=\"item in summaryColumns\"\n :key=\"item.key\"\n :columnKey=\"item.key\"\n >\n <template #default=\"vars\">\n <TableSummary\n :item=\"item\"\n :summaryParams=\"vars\"\n ></TableSummary>\n </template>\n </s-table-summary-cell>\n </s-table-summary-row>\n </template>\n <template #contextmenuPopup=\"contextmenuPopup\">\n <TableContextMenu\n :contextmenuPopup=\"contextmenuPopup\"\n :dataSource=\"dataSource\"\n :columns=\"columns\"\n :view_key=\"view_key\"\n :view_flag_name=\"config.title\"\n :is_view=\"is_view\"\n :self-event-bus=\"selfEventBus\"\n @refresh=\"refresh\"\n @export=\"handleExport\"\n @columnsChange=\"onColumnsChange\"\n ></TableContextMenu>\n </template>\n </s-table>\n </a-card>\n </div>\n <export-excel-modal-view\n v-if=\"exportOpen\"\n :column-list=\"exportExcelColumnList\"\n :columns=\"exportExcelColumn\"\n :current=\"state.current\"\n :datasource=\"dataSource\"\n :filename=\"filename\"\n :pageSize=\"state.pageSize\"\n :total=\"state.total\"\n :requestParams=\"getQueryParams()\"\n :queryData=\"config.list_url\"\n v-model:open=\"exportOpen\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { FilterFilled } from '@ant-design/icons-vue';\nimport { useResizeObserver } from '@vueuse/core';\nimport { TableProps } from 'ant-design-vue';\nimport dayjs from 'dayjs';\nimport { getApiData } from 'liyu-pc-base/api/api-model';\nimport { filterConditions } from 'liyu-pc-base/utils/function';\nimport { useFullscreen } from 'liyu-pc-base/utils/hooks/useFullscreen';\nimport { debounce, isArray, cloneDeep } from 'lodash';\nimport mitt from 'mitt';\nimport { computed, h, onMounted, onUnmounted, provide, reactive, ref, watch } from 'vue';\nimport { useRouter } from 'vue-router';\nimport Search from './search.vue';\nimport TableFilterDropdown from './TableFilterDropdown.vue';\nimport TableHeader from './tableHeader.vue';\nimport TableSummary from './TableSummary.vue';\n\nimport { useI18n } from 'vue-i18n';\nimport { useEnv, useUserStore } from 'liyu-pc-base/init-plugin';\nimport {\n Column,\n SearchConditionItem,\n Table,\n TableProState,\n ViewColumnItem,\n ViewData,\n Response,\n ViewSearchItem,\n} from './typing';\nimport { fetchViewsData, getParamsCount, tableProStateSymbol } from './utils';\nimport TableContextMenu from './TableContextMenu.vue';\nimport { useView } from './hooks/view';\nconst DEFAULT_PAGE_SIZE = 50;\nconst props = defineProps({\n config: {\n type: Object as () => Table,\n required: true,\n default: () => ({\n id: '',\n title: '',\n is_normal_model: true,\n modelType: null,\n list_url: '',\n columns: [],\n }),\n },\n eventBus: {\n type: Object,\n required: false,\n },\n initSelectValue: {\n type: Array,\n required: false,\n },\n initValueKey: {\n type: String,\n required: false,\n },\n});\ninterface Emits {\n (e: 'selectChange', selectdRecord: any[], unSelectdRecord: any[]): void;\n (e: 'dataChange', params: { data: any[]; current: number; total: number }): void;\n}\nconst emit = defineEmits<Emits>();\nconst { t } = useI18n();\nconst env = useEnv();\nconst userStore = useUserStore();\nconst userid = userStore.userid;\nconst current_org = userStore.currentOrg;\nconst VIEW_SYSTEM_EDIT = 'view_system_edit';\nconst is_auth = ref(userStore.CHECK_AUTH(VIEW_SYSTEM_EDIT));\nconst router = useRouter();\nconst dataSource = ref([]);\nconst selectedRowKeys = ref([]);\nconst loading = ref(false);\nconst selfEventBus = mitt();\nconst searchConditions = ref<SearchConditionItem[]>([]);\nlet loadDataId = null;\nconst tableWraperRef = ref(null);\nconst tableWraperHeight = ref(null);\nconst searchRef = ref(null);\nconst searchHeight = ref(null);\nconst headerHeight = ref(0);\nconst rowActionWidth = ref(30);\nconst sortedMap = ref({});\nconst sortedList = ref([]);\nconst auth_batch_update_list = ref([]);\nconst auth_head_btn_list = ref<any[]>([]);\nconst auth_btn_list = ref<any[]>([]);\nconst exportOpen = ref(false);\nconst searchText = ref('');\nconst searchedColumn = ref('');\nconst searchInput = ref();\nconst refreshType = ref(props.config.refreshType);\nconst getAuthBtn = () => {\n auth_btn_list.value = userStore.CHECK_AUTH_BY_BTN_LIST(props.config?.btn_list || []) || [];\n auth_head_btn_list.value =\n userStore.CHECK_AUTH_BY_BTN_LIST(props.config?.head_btn_list || []) || [];\n auth_batch_update_list.value =\n userStore.CHECK_AUTH_BY_BTN_LIST(props.config?.batch_update_list || []) || [];\n};\ngetAuthBtn();\nconst pageSizeOptions = ref([\n '10',\n '20',\n '50',\n '100',\n '200',\n '500',\n '1000',\n '3000',\n '10000',\n '50000',\n '60000',\n '70000',\n]);\nconst view_key = computed(() => {\n return `table_pro_${props.config.key}`;\n});\nconst state = reactive({\n current: 1,\n pageSize: props.config?.query_params?.pageSize || DEFAULT_PAGE_SIZE,\n total: 0,\n tableSize: 'small',\n});\nuseResizeObserver(tableWraperRef, entries => {\n tableWraperHeight.value = entries[0].contentRect.height;\n});\nuseResizeObserver(searchRef, entries => {\n searchHeight.value = entries[0].contentRect.height;\n});\n\nconst preserveRow = () => {\n return false;\n};\nconst getQueryParams = () => {\n const getColumnFields = (list: Column[]) => {\n const fields = [];\n list.forEach(item => {\n if (\n item.dataIndex &&\n item.dataIndex !== 'index' &&\n item.dataIndex !== 'action' &&\n item.checked !== false\n ) {\n fields.push(item.dataIndex);\n }\n if (item.children && item.children.length > 0) {\n fields.push(...getColumnFields(item.children));\n }\n });\n return fields;\n };\n const column_fields = getColumnFields(columns.value || []);\n if (props.config.base_column_fields) {\n column_fields.push(...props.config.base_column_fields);\n }\n const sort_fields = [];\n const used_fields = new Set();\n for (const item of sortedList.value) {\n if (item.order == 'descend') {\n sort_fields.push('-' + item.key);\n } else {\n sort_fields.push(item.key);\n }\n used_fields.add(item.key);\n }\n if (props.config.base_sort_fields) {\n for (const item of props.config.base_sort_fields) {\n const field_name = item.startsWith('-') ? item.slice(1) : item;\n if (!used_fields.has(field_name)) {\n sort_fields.push(item);\n }\n }\n }\n const params = {\n ...(props.config.query_params || {}),\n current: state.current,\n pageSize: state.pageSize,\n column_fields: column_fields,\n sort_fields,\n };\n if (search_type.value === 'advanced') {\n const conditions = [\n ...filterConditions(props.config.base_conditions),\n ...filterConditions(searchConditions.value),\n ];\n params['conditions'] = [conditions];\n } else if (search_type.value === 'simple') {\n for (const item of filterConditions(searchConditions.value)) {\n const v_count = getParamsCount(item.operator, item);\n let value = item.value;\n if (v_count === 1) {\n value = value[0];\n }\n params[item.field_name] = value;\n }\n }\n if (props.config.get_query_params_func) {\n const newParams = props.config.get_query_params_func({ params });\n if (newParams) {\n Object.assign(params, newParams);\n }\n }\n return params;\n};\nconst [elRef, screenState, { setFull, exitFull }] = useFullscreen();\nconst getData = async () => {\n if (!props.config.list_url) {\n return;\n }\n const currentLoadId = Symbol(); // 唯一值\n loadDataId = currentLoadId;\n try {\n loading.value = true;\n\n const params = getQueryParams();\n let response: Response;\n if (props.config.query_data_func) {\n response = await props.config.query_data_func(params);\n } else {\n response = await getApiData(params, props.config.list_url, false, {\n api_log: `tablePro ${props.config.key} ${props.config.title}`,\n });\n }\n if (loadDataId !== currentLoadId) {\n return;\n }\n if (props.config.process_data_func) {\n dataSource.value = props.config.process_data_func(response.data);\n } else {\n dataSource.value = response.data || [];\n }\n state.current = response.current;\n state.total = response.total;\n emit('dataChange', {\n data: dataSource.value,\n current: response.current,\n total: response.total,\n });\n syncSelectedRowKeys();\n } finally {\n if (loadDataId !== currentLoadId) {\n return;\n }\n loading.value = false;\n }\n};\nconst delayGetDate = debounce(getData, 500);\nconst handlePageChange = (page: any, pageSize: any) => {\n if (state.current == page && state.pageSize == pageSize) {\n return;\n }\n state.current = page ? page : 1;\n state.pageSize = pageSize ? pageSize : DEFAULT_PAGE_SIZE;\n getData();\n};\nconst search_type = computed(() => {\n if (props.config.search_type === 'simple') {\n return props.config.search_type;\n } else {\n return 'advanced';\n }\n});\nconst is_view = computed(() => {\n return props.config?.is_view !== false;\n});\nconst row_selection: any = computed(() => {\n const rowSelectionType = props.config.rowSelectionType || 'checkbox';\n const onChange = (selectedRowKeys, selectdRecord) => {\n const unSelectdRecord = dataSource.value.filter(item => {\n return !selectedRowKeys.includes(item.id);\n });\n emit('selectChange', selectdRecord, unSelectdRecord);\n };\n return { type: rowSelectionType, onChange };\n});\nconst viewColumnsConfig = ref<Record<string, ViewColumnItem>>({});\nconst viewSearchConfig = ref<Record<string, ViewSearchItem>>({});\nconst filtedColumns = computed(() => {\n const filterRecursive = (list: Column[]) => {\n return list\n .filter(item => item.checked !== false)\n .map(item => {\n if (item.children && item.children.length > 0) {\n const children = filterRecursive(item.children);\n if (children.length > 0) {\n return {\n ...item,\n children,\n };\n }\n return null;\n }\n return item;\n })\n .filter(Boolean);\n };\n return filterRecursive(columns.value);\n});\nconst columns = computed<Column[]>(() => {\n const filterValueMap = {};\n for (const item of searchConditions.value) {\n if (['in', 'eq'].includes(item.operator)) {\n filterValueMap[item.field_name] = item.value;\n }\n }\n const sorted = sortedMap.value || {};\n const baseColumns = [...(props.config.columns || [])];\n\n if (props.config.btn_list && props.config.btn_list.length > 0) {\n const hasAction = baseColumns.some(item => item.dataIndex === 'action');\n if (!hasAction) {\n baseColumns.push({\n title: '操作',\n dataIndex: 'action',\n cellComponent: 'action',\n width: rowActionWidth.value + 20,\n resizable: true,\n fixed: 'right',\n checked: true,\n });\n }\n }\n\n // 合并视图配置,递归合并\n const mergeRecursive = (list: Column[], isChildren = false) => {\n const merged = list\n .map(item => {\n const key = item.dataIndex || item.key || item.title;\n const viewCol = viewColumnsConfig.value[key] || {};\n const newItem = {\n ...item,\n ...viewCol,\n is_children: isChildren,\n key: key,\n };\n if (newItem.children && newItem.children.length > 0) {\n newItem.children = mergeRecursive(newItem.children, true);\n }\n return newItem;\n })\n .sort((a, b) => {\n const orderA = a.order ?? 999;\n const orderB = b.order ?? 999;\n return orderA - orderB;\n });\n\n return merged.map(item => {\n const key = item.dataIndex || item.key || item.title;\n if (item.autoWidth) {\n return {\n ...item,\n minWidth: item.width,\n width: undefined,\n filteredValue: filterValueMap[key] || null,\n sortOrder: sorted[key] || false,\n key: key,\n customFilterDropdown:\n props.config.enable_custom_filter &&\n !!props.config.search_config?.find(s => s.field_name === key),\n onFilterDropdownOpenChange: open => {\n if (open) {\n setTimeout(() => {\n searchInput.value?.focus();\n }, 100);\n }\n },\n };\n } else {\n return {\n ...item,\n width: item.width,\n minWidth: undefined,\n filteredValue: filterValueMap[key] || null,\n sortOrder: sorted[key] || false,\n key: key,\n customFilterDropdown:\n props.config.enable_custom_filter &&\n !!props.config.search_config?.find(s => s.field_name === key),\n onFilterDropdownOpenChange: open => {\n if (open) {\n setTimeout(() => {\n searchInput.value?.focus();\n }, 100);\n }\n },\n };\n }\n });\n };\n\n const res = mergeRecursive(baseColumns);\n // 序号列处理\n const hasIndex = res.some(item => item.dataIndex === 'index');\n if (!hasIndex && !props.config.hide_index_column) {\n res.unshift({\n title: '#',\n dataIndex: 'index',\n key: 'index',\n maxWidth: 50,\n fixed: 'left',\n checked: true,\n autoHeight: true,\n });\n }\n return res;\n});\nconst tableContentWidth = computed(() => {\n let width = 0;\n const processColumns = datas => {\n for (const item of datas) {\n if (item.children && item.children.length > 0) {\n processColumns(item.children);\n } else {\n width += item.width || item.minWidth || 120;\n }\n }\n };\n processColumns(columns.value);\n});\nconst filename = computed(() => {\n const title = props.config.title || 'data';\n const datetime = dayjs().format('YYYYMMDD_HHmmss');\n return `${title}_${datetime}`;\n});\nconst exportExcelColumnList = computed(() => {\n const list: any = [];\n const getLeaves = (cols: Column[]) => {\n cols.forEach(item => {\n if (item.children && item.children.length > 0) {\n getLeaves(item.children);\n } else {\n if (item.dataIndex === 'action' || item.dataIndex === 'index') {\n return;\n }\n list.push({\n checked: item.checked,\n fixed: item.fixed ? item.fixed : false,\n key: item.dataIndex,\n label: item.title,\n width: item.width,\n });\n }\n });\n };\n getLeaves(columns.value);\n return list;\n});\nconst exportExcelColumn = computed(() => {\n const list: any = [];\n const getLeaves = (cols: Column[]) => {\n cols.forEach(item => {\n if (item.children && item.children.length > 0) {\n getLeaves(item.children);\n } else {\n if (item.dataIndex === 'action' || item.dataIndex === 'index') {\n return;\n }\n list.push(item);\n }\n });\n };\n getLeaves(columns.value);\n return list;\n});\nconst handleSearch = ({ confirm, dataIndex, value }) => {\n confirm();\n searchText.value = value;\n searchedColumn.value = dataIndex;\n getData();\n isViewChange.value = true;\n};\n\nconst handleReset = ({ clearFilters, dataIndex }) => {\n clearFilters();\n searchText.value = '';\n const conditions = cloneDeep(searchConditions.value);\n const conditionIndex = conditions.findIndex(item => item.field_name === dataIndex);\n if (conditionIndex > -1) {\n conditions.splice(conditionIndex, 1);\n }\n searchConditions.value = conditions;\n getData();\n isViewChange.value = true;\n};\n\nconst refresh = async () => {\n await getData();\n};\nconst handleRefreshTypeChange = type => {\n refreshType.value = type;\n isViewChange.value = true;\n};\nconst paginationHeight = ref(64);\nconst tableHeight = computed(() => {\n if (!tableWraperHeight.value) {\n return 0;\n }\n let value = tableWraperHeight.value - searchHeight.value - headerHeight.value - 4;\n if (props.config.is_pagination) {\n value -= paginationHeight.value;\n }\n console.log('tableWraperHeight', tableWraperHeight.value);\n console.log('searchHeight', searchHeight.value);\n console.log('headerHeight', headerHeight.value);\n console.log('paginationHeight', paginationHeight.value);\n console.log('tableHeight', value);\n return value;\n});\nconst handleTableSizeChange = () => {\n isViewChange.value = true;\n};\nwatch(\n () => state.tableSize,\n () => {\n // 此处设置paginationHeight两次,为了解决切换表格密度后,高度剧烈变化问题。\n paginationHeight.value = 64;\n setTimeout(() => {\n if (state.tableSize === 'small') {\n paginationHeight.value = 56;\n } else if (state.tableSize === 'middle') {\n paginationHeight.value = 56;\n } else if (state.tableSize === 'default') {\n paginationHeight.value = 64;\n }\n }, 200);\n },\n);\nconst syncSelectedRowKeys = () => {\n if (dataSource.value?.length > 0 && props.initValueKey) {\n const valueMap = {};\n selectedRowKeys.value = dataSource.value\n .filter(item => {\n const value = item[props.initValueKey];\n if (props.initSelectValue?.includes(value) && !valueMap[value]) {\n valueMap[value] = true;\n return true;\n }\n })\n .map(item => {\n return item.id;\n });\n }\n};\nconst init = async () => {\n const defaultSortField = props.config.columns.filter(\n column => column.sorter && column.defaultSortOrder,\n );\n defaultSortField.sort((a, b) => (a.defaultSortIndex || 0) - (b.defaultSortIndex || 0));\n for (const column of defaultSortField) {\n sortedMap.value[column.dataIndex] = column.defaultSortOrder;\n sortedList.value.push({ key: column.dataIndex, order: column.defaultSortOrder });\n }\n const tmpSearchConditions = [];\n if (props.config?.search_config) {\n props.config.search_config.forEach(configItem => {\n if (configItem.default_value) {\n let value = configItem.default_value;\n if (!isArray(value)) {\n value = [value];\n }\n tmpSearchConditions.push({\n field_name: configItem.field_name,\n value: value,\n operator: configItem.default_operator || 'eq',\n format: configItem.format || 'input',\n class_name: configItem.class_name || 'str',\n });\n }\n });\n }\n searchConditions.value = tmpSearchConditions;\n if (is_view && currentView.value?.id !== 'no-view') {\n await fetchViews();\n if (viewDataList.value?.length) {\n const tmpData = [...viewDataList.value];\n // 优先级:当前选中视图,默认视图,用户视图,同级按 sort 正序\n const getSortValue = item => {\n let value = item.sort || 0;\n if (item.id !== currentView.value?.id) {\n value *= 1000000;\n }\n if (!item.is_default) {\n value *= 10000;\n }\n if (!item.user_id) {\n value *= 1000;\n }\n return value;\n };\n tmpData.sort((a, b) => getSortValue(a) - getSortValue(b));\n setViewData(tmpData[0].data);\n currentView.value = tmpData[0];\n }\n }\n await getData();\n};\nconst eventReinit = async () => {\n init();\n};\nconst eventReload = async () => {\n await getData();\n};\nconst flattenedColumns = computed(() => {\n const list = [];\n const getLeaves = (cols: Column[]) => {\n cols.forEach(col => {\n if (col.children && col.children.length > 0) {\n getLeaves(col.children);\n } else {\n list.push(col);\n }\n });\n };\n getLeaves(filtedColumns.value);\n return list;\n});\nconst summaryColumns = computed(() => {\n const list = [];\n let index = 0;\n for (const item of flattenedColumns.value) {\n let _index = index;\n if (props.config?.is_selection) {\n _index = index + 1;\n }\n if (item.summary) {\n // if (!props.config.is_selection && props.config.hide_index_column) {\n // console.error('未开启选择(is_selection)且隐藏了序号列(hide_index_column),无法展示\"合计\"');\n // return [];\n // }\n list.push({\n index: _index,\n key: item.key,\n cellSummaryComponent: item.cellSummaryComponent,\n total_content: item.total_content,\n });\n }\n index++;\n }\n return list;\n});\nconst handleChange: TableProps['onChange'] = (pagination, filters, sorter, action) => {\n if (action.action === 'paginate') {\n return;\n } else if (action.action === 'filter') {\n const searchMap = {};\n for (const item of searchConditions.value) {\n searchMap[item.field_name] = item;\n }\n for (const key of Object.keys(filters)) {\n const value = filters[key];\n const item = searchMap[key];\n if (item) {\n if (value?.length > 1) {\n item.operator = 'in';\n } else {\n if (!['in', 'eq'].includes(item.operator)) {\n item.operator = 'in';\n }\n }\n item.value = value;\n } else {\n searchMap[key] = {\n field_name: key,\n operator: 'eq',\n value: value,\n format: 'input',\n class_name: 'str',\n };\n }\n }\n searchConditions.value = Object.values(searchMap);\n getData();\n isViewChange.value = true;\n } else if (action.action === 'sort') {\n const tmpMap = {};\n const tmpList = [];\n if (!isArray(sorter)) {\n tmpMap[sorter.columnKey] = sorter.order;\n tmpList.push({ key: sorter.columnKey, order: sorter.order });\n } else {\n for (const item of sorter) {\n tmpMap[item.columnKey] = item.order;\n tmpList.push({ key: item.columnKey, order: item.order });\n }\n }\n sortedMap.value = tmpMap;\n sortedList.value = tmpList;\n getData();\n isViewChange.value = true;\n }\n};\nconst handleCellClick = (e, cell) => {\n if (!props.config?.is_click_selection) {\n return;\n }\n const rowSelectionType = props.config.rowSelectionType || 'checkbox';\n if (rowSelectionType === 'radio') {\n selectedRowKeys.value = [cell.record.id];\n } else {\n const isSelected = selectedRowKeys.value && selectedRowKeys.value.includes(cell.record.id);\n if (isSelected) {\n selectedRowKeys.value = selectedRowKeys.value.filter(id => {\n return id !== cell.record.id;\n });\n } else {\n selectedRowKeys.value.push(cell.record.id);\n }\n }\n\n const selectdRecord = dataSource.value.filter(item => {\n return selectedRowKeys.value.includes(item.id);\n });\n const unSelectdRecord = dataSource.value.filter(item => {\n return !selectedRowKeys.value.includes(item.id);\n });\n emit('selectChange', selectdRecord, unSelectdRecord);\n};\n\nonMounted(async () => {\n if (!props.config.key) {\n console.error('tablePro config 未配置 key');\n }\n if (!props.config.title) {\n console.error('tablePro config 未配置 title');\n }\n selfEventBus.on('refresh', refresh);\n selfEventBus.on('reinit', eventReinit);\n selfEventBus.on('saveView', saveView);\n selfEventBus.on('saveNewView', addView);\n if (props.eventBus) {\n props.eventBus.on('reinit', eventReinit);\n props.eventBus.on('reload_table', eventReload);\n }\n if (props.config.tableSize) {\n state.tableSize = props.config.tableSize;\n }\n await init();\n});\nconst handleExport = () => {\n exportOpen.value = true;\n};\nconst onColumnsChange = (data: any[]) => {\n if (!props.config || !props.config.columns) return;\n const configObj: Record<string, any> = {};\n\n const processRecursive = (list: any[]) => {\n list.forEach((item, index) => {\n const dataIndex = item.dataIndex || item.key || item.title;\n if (dataIndex === 'index' || dataIndex === 'action') return;\n configObj[dataIndex] = {\n checked: item.checked,\n fixed: item.fixed,\n autoHeight: item.autoHeight,\n autoWidth: item.autoWidth,\n ellipsis: item.ellipsis,\n width: item.width,\n order: index,\n };\n if (item.children && item.children.length > 0) {\n processRecursive(item.children);\n }\n });\n };\n\n processRecursive(data);\n viewColumnsConfig.value = configObj;\n isViewChange.value = true;\n};\nconst setViewData = async (viewData: ViewData) => {\n if (viewData === null) {\n await init();\n isViewChange.value = false;\n return;\n }\n if (viewData.columns) {\n viewColumnsConfig.value = viewData.columns;\n }\n if (viewData.searchConfig) {\n viewSearchConfig.value = viewData.searchConfig;\n }\n if (viewData.searchConditions) {\n searchConditions.value = viewData.searchConditions;\n }\n if (viewData.tableSize) {\n state.tableSize = viewData.tableSize;\n }\n if (viewData.refreshType) {\n refreshType.value = viewData.refreshType;\n }\n if (viewData.sortedList) {\n sortedList.value = viewData.sortedList;\n sortedMap.value = {};\n for (const item of sortedList.value) {\n sortedMap.value[item.key] = item.order;\n }\n }\n if (props.config.set_view_callback) {\n props.config.set_view_callback({ viewData });\n }\n await refresh();\n isViewChange.value = false;\n};\nconst resizeColumn = (width, column, action: 'start' | 'move' | 'end') => {\n if (action === 'end') {\n let item = viewColumnsConfig.value[column.dataIndex];\n if (!item) {\n item = {};\n viewColumnsConfig.value[column.dataIndex] = item;\n }\n item.width = width;\n isViewChange.value = true;\n }\n};\nconst viewSearchConfigChange = (config: Record<string, ViewSearchItem>) => {\n viewSearchConfig.value = config;\n isViewChange.value = true;\n};\nconst getViewData = (): ViewData => {\n const viewData = {\n columns: viewColumnsConfig.value,\n searchConditions: searchConditions.value,\n tableSize: state.tableSize,\n refreshType: refreshType.value,\n searchConfig: viewSearchConfig.value,\n sortedList: sortedList.value,\n };\n if (props.config.get_view_data_func) {\n const newViewData = props.config.get_view_data_func({ viewData });\n if (newViewData) {\n Object.assign(viewData, newViewData);\n }\n }\n return viewData;\n};\nconst viewDataList = ref([]);\nconst currentView = ref<any>(null);\nconst isViewChange = ref(false);\nconst fetchViews = async () => {\n const data = await fetchViewsData(view_key.value);\n viewDataList.value = data;\n};\nconst handleSearchChange = () => {\n isViewChange.value = true;\n};\nconst { saveView, addView } = useView({\n currentView,\n getViewData,\n isViewChange,\n userid,\n view_project__flag: env.VITE_APP_VIEW_PROJECT_FLAG,\n view_menu__flag: view_key.value,\n view_menu__name: props.config.title,\n fetchViews,\n is_auth,\n t,\n});\n\nprovide<TableProState>(tableProStateSymbol, {\n setViewData,\n getViewData,\n fetchViews,\n viewDataList,\n currentView,\n isViewChange,\n config: props.config,\n});\n\nonUnmounted(() => {\n selfEventBus.off('refresh', refresh);\n selfEventBus.off('reinit', eventReinit);\n selfEventBus.off('saveView', saveView);\n selfEventBus.off('saveNewView', addView);\n if (props.eventBus) {\n props.eventBus.off('reinit', eventReinit);\n props.eventBus.off('reload_table', eventReload);\n }\n});\nwatch(\n () => props.initSelectValue,\n () => {\n syncSelectedRowKeys();\n },\n);\nwatch(\n () => props.config.query_params,\n () => {\n delayGetDate();\n },\n {\n deep: true,\n },\n);\nwatch(\n () => props.config.base_conditions,\n () => {\n delayGetDate();\n },\n {\n deep: true,\n },\n);\n\ndefineExpose({\n getViewData,\n setViewData,\n config: props.config,\n columns,\n fetchViews,\n viewDataList,\n currentView,\n isViewChange,\n viewColumnsConfig,\n refresh,\n});\n</script>\n<style lang=\"less\" scoped>\n.btn-wraper {\n display: flex;\n justify-content: flex-end;\n}\n.table-wraper {\n height: 100%;\n overflow: hidden;\n}\n.modify-row-height {\n :deep(.surely-table-header) {\n height: var(--row-heigth) !important;\n }\n :deep(.surely-table-header-cell) {\n height: var(--row-heigth) !important;\n }\n :deep(.surely-table-summary) {\n height: var(--row-heigth) !important;\n }\n}\n.popup-divider {\n :deep(.ant-divider-horizontal) {\n margin-top: 1px;\n margin-bottom: 1px;\n }\n}\n.highlight {\n background-color: rgb(255, 192, 105);\n padding: 0px;\n}\n</style>\n","<template>\n <div\n class=\"table-wraper\"\n ref=\"tableWraperRef\"\n >\n <div ref=\"searchRef\">\n <Search\n v-if=\"config?.search_config && config.search_config.length > 0\"\n :searchConfig=\"config?.search_config || []\"\n :autoRefreshOnSearchChange=\"config?.auto_refresh_on_search_change\"\n v-model:searchConditions=\"searchConditions\"\n :event-bus=\"selfEventBus\"\n :searchType=\"search_type\"\n :searchDisplayType=\"config?.search_display_type\"\n :searchColumnCount=\"config?.search_column_count\"\n :viewSearchConfig=\"viewSearchConfig\"\n @viewSearchConfigChange=\"viewSearchConfigChange\"\n @change=\"handleSearchChange\"\n ></Search>\n </div>\n <a-card\n ref=\"elRef\"\n :body-style=\"{ padding: 0 }\"\n >\n <TableHeader\n :config=\"config\"\n :auth_batch_update_list=\"auth_batch_update_list\"\n :auth_head_btn_list=\"auth_head_btn_list\"\n :selectedRowKeys=\"selectedRowKeys\"\n :dataSource=\"dataSource\"\n :current_org=\"current_org\"\n :router=\"router\"\n :selfEventBus=\"selfEventBus\"\n :loading=\"loading\"\n :screenState=\"screenState\"\n v-model:tableSize=\"state.tableSize\"\n :columns=\"columns\"\n :view_key=\"view_key\"\n :view_flag_name=\"config.title\"\n :is_view=\"is_view\"\n :refreshType=\"refreshType\"\n @refresh=\"refresh\"\n @export=\"handleExport\"\n @setFull=\"setFull\"\n @exitFull=\"exitFull\"\n @columnsChange=\"onColumnsChange\"\n @heightChange=\"h => (headerHeight = h)\"\n @refreshTypeChange=\"handleRefreshTypeChange\"\n @tableSizeChange=\"handleTableSizeChange\"\n >\n <template #header_bar_before_btn>\n <slot name=\"header_bar_before_btn\"></slot>\n </template>\n <template #header_bar_after_btn>\n <slot name=\"header_bar_after_btn\"></slot>\n </template>\n </TableHeader>\n <s-table\n v-if=\"columns?.length > 0\"\n :columns=\"filtedColumns\"\n v-model:selectedRowKeys=\"selectedRowKeys\"\n :data-source=\"dataSource\"\n :bordered=\"true\"\n :size=\"state.tableSize\"\n :height=\"tableHeight\"\n :rowHeight=\"config.rowHeight || undefined\"\n :scroll=\"{\n x: tableContentWidth,\n }\"\n :loading=\"loading && !config?.disabled_table_loading\"\n :pagination=\"\n config?.is_pagination\n ? {\n current: state.current,\n pageSize: state.pageSize,\n total: state.total,\n onChange: handlePageChange,\n showSizeChanger: true,\n pageSizeOptions: pageSizeOptions,\n }\n : false\n \"\n :rowKey=\"'id'\"\n :rowSelection=\"config?.is_selection ? row_selection : null\"\n :custom-cell=\"config?.customCell\"\n :custom-header-cell=\"config?.customHeaderCell\"\n :virtual=\"true\"\n sticky\n summary-fixed\n :preserveRow=\"preserveRow\"\n :style=\"{\n '--row-heigth': `${config.rowHeight}px`,\n }\"\n :class=\"{ 'modify-row-height': !!config.rowHeight }\"\n @change=\"handleChange\"\n @cellClick=\"handleCellClick\"\n @resizeColumn=\"resizeColumn\"\n >\n <template #customFilterDropdown=\"{ confirm, clearFilters, column }\">\n <TableFilterDropdown\n :column=\"column\"\n :searchConfig=\"config.search_config || []\"\n v-model:searchConditions=\"searchConditions\"\n :searchType=\"search_type\"\n :confirm=\"confirm\"\n :clearFilters=\"clearFilters\"\n @search=\"handleSearch\"\n @reset=\"handleReset\"\n />\n </template>\n <template\n #customFilterIcon=\"{ filtered, column }\"\n v-if=\"config?.enable_custom_filter\"\n >\n <FilterFilled\n :style=\"{\n color:\n filtered ||\n filterConditions(searchConditions).some(s => s.field_name === column.dataIndex)\n ? '#108ee9'\n : undefined,\n }\"\n />\n </template>\n <template #bodyCell=\"{ column, index, text, record }\">\n <template v-if=\"column.dataIndex == 'index'\">\n {{ index + 1 + state.pageSize * (state.current - 1) }}\n </template>\n <component\n :is=\"'Cell_' + column.cellComponent\"\n v-else-if=\"column.cellComponent\"\n :cmpObj=\"{\n column: column ? column : {},\n index: index,\n text: text,\n dataSource: dataSource,\n record: record ? record : {},\n pageSize: state.pageSize ? state.pageSize : 500,\n current: state.current ? state.current : 1,\n eventBus: eventBus,\n tableHeightY: tableHeight,\n requestParams: config.query_params,\n auth_btn_list: auth_btn_list,\n event_obj: selfEventBus,\n }\"\n ></component>\n\n <template v-else>\n <span\n v-if=\"searchText && searchedColumn === column.dataIndex\"\n :style=\"column.color ? column.color({ column, index, text, record }) : null\"\n >\n <template\n v-for=\"(fragment, i) in text\n .toString()\n .split(new RegExp(`(?<=${searchText})|(?=${searchText})`, 'i'))\"\n >\n <mark\n v-if=\"fragment.toLowerCase() === searchText.toLowerCase()\"\n :key=\"i\"\n class=\"highlight\"\n >\n {{ fragment }}\n </mark>\n <template v-else>{{ fragment }}</template>\n </template>\n </span>\n <span\n v-else\n :style=\"column.color ? column.color({ column, index, text, record }) : null\"\n >\n {{ column.content ? column.content({ column, index, text, record }) : text }}\n </span>\n </template>\n </template>\n <template\n #summary\n v-if=\"summaryColumns.length > 0\"\n >\n <s-table-summary-row>\n <s-table-summary-cell :index=\"0\">合计</s-table-summary-cell>\n <s-table-summary-cell\n v-for=\"item in summaryColumns\"\n :key=\"item.key\"\n :columnKey=\"item.key\"\n >\n <template #default=\"vars\">\n <TableSummary\n :item=\"item\"\n :summaryParams=\"vars\"\n ></TableSummary>\n </template>\n </s-table-summary-cell>\n </s-table-summary-row>\n </template>\n <template #contextmenuPopup=\"contextmenuPopup\">\n <TableContextMenu\n :contextmenuPopup=\"contextmenuPopup\"\n :dataSource=\"dataSource\"\n :columns=\"columns\"\n :view_key=\"view_key\"\n :view_flag_name=\"config.title\"\n :is_view=\"is_view\"\n :self-event-bus=\"selfEventBus\"\n @refresh=\"refresh\"\n @export=\"handleExport\"\n @columnsChange=\"onColumnsChange\"\n ></TableContextMenu>\n </template>\n </s-table>\n </a-card>\n </div>\n <export-excel-modal-view\n v-if=\"exportOpen\"\n :column-list=\"exportExcelColumnList\"\n :columns=\"exportExcelColumn\"\n :current=\"state.current\"\n :datasource=\"dataSource\"\n :filename=\"filename\"\n :pageSize=\"state.pageSize\"\n :total=\"state.total\"\n :requestParams=\"getQueryParams()\"\n :queryData=\"config.list_url\"\n v-model:open=\"exportOpen\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { FilterFilled } from '@ant-design/icons-vue';\nimport { useResizeObserver } from '@vueuse/core';\nimport { TableProps } from 'ant-design-vue';\nimport dayjs from 'dayjs';\nimport { getApiData } from 'liyu-pc-base/api/api-model';\nimport { filterConditions } from 'liyu-pc-base/utils/function';\nimport { useFullscreen } from 'liyu-pc-base/utils/hooks/useFullscreen';\nimport { debounce, isArray, cloneDeep } from 'lodash';\nimport mitt from 'mitt';\nimport { computed, h, onMounted, onUnmounted, provide, reactive, ref, watch } from 'vue';\nimport { useRouter } from 'vue-router';\nimport Search from './search.vue';\nimport TableFilterDropdown from './TableFilterDropdown.vue';\nimport TableHeader from './tableHeader.vue';\nimport TableSummary from './TableSummary.vue';\n\nimport { useI18n } from 'vue-i18n';\nimport { useEnv, useUserStore } from 'liyu-pc-base/init-plugin';\nimport {\n Column,\n SearchConditionItem,\n Table,\n TableProState,\n ViewColumnItem,\n ViewData,\n Response,\n ViewSearchItem,\n} from './typing';\nimport { fetchViewsData, getParamsCount, tableProStateSymbol } from './utils';\nimport TableContextMenu from './TableContextMenu.vue';\nimport { useView } from './hooks/view';\nconst DEFAULT_PAGE_SIZE = 50;\nconst props = defineProps({\n config: {\n type: Object as () => Table,\n required: true,\n default: () => ({\n id: '',\n title: '',\n is_normal_model: true,\n modelType: null,\n list_url: '',\n columns: [],\n }),\n },\n eventBus: {\n type: Object,\n required: false,\n },\n initSelectValue: {\n type: Array,\n required: false,\n },\n initValueKey: {\n type: String,\n required: false,\n },\n});\ninterface Emits {\n (e: 'selectChange', selectdRecord: any[], unSelectdRecord: any[]): void;\n (e: 'dataChange', params: { data: any[]; current: number; total: number }): void;\n}\nconst emit = defineEmits<Emits>();\nconst { t } = useI18n();\nconst env = useEnv();\nconst userStore = useUserStore();\nconst userid = userStore.userid;\nconst current_org = userStore.currentOrg;\nconst VIEW_SYSTEM_EDIT = 'view_system_edit';\nconst is_auth = ref(userStore.CHECK_AUTH(VIEW_SYSTEM_EDIT));\nconst router = useRouter();\nconst dataSource = ref([]);\nconst selectedRowKeys = ref([]);\nconst loading = ref(false);\nconst selfEventBus = mitt();\nconst searchConditions = ref<SearchConditionItem[]>([]);\nlet loadDataId = null;\nconst tableWraperRef = ref(null);\nconst tableWraperHeight = ref(null);\nconst searchRef = ref(null);\nconst searchHeight = ref(null);\nconst headerHeight = ref(0);\nconst rowActionWidth = ref(30);\nconst sortedMap = ref({});\nconst sortedList = ref([]);\nconst auth_batch_update_list = ref([]);\nconst auth_head_btn_list = ref<any[]>([]);\nconst auth_btn_list = ref<any[]>([]);\nconst exportOpen = ref(false);\nconst searchText = ref('');\nconst searchedColumn = ref('');\nconst searchInput = ref();\nconst refreshType = ref(props.config.refreshType);\nconst getAuthBtn = () => {\n auth_btn_list.value = userStore.CHECK_AUTH_BY_BTN_LIST(props.config?.btn_list || []) || [];\n auth_head_btn_list.value =\n userStore.CHECK_AUTH_BY_BTN_LIST(props.config?.head_btn_list || []) || [];\n auth_batch_update_list.value =\n userStore.CHECK_AUTH_BY_BTN_LIST(props.config?.batch_update_list || []) || [];\n};\ngetAuthBtn();\nconst pageSizeOptions = ref([\n '10',\n '20',\n '50',\n '100',\n '200',\n '500',\n '1000',\n '3000',\n '10000',\n '50000',\n '60000',\n '70000',\n]);\nconst view_key = computed(() => {\n return `table_pro_${props.config.key}`;\n});\nconst state = reactive({\n current: 1,\n pageSize: props.config?.query_params?.pageSize || DEFAULT_PAGE_SIZE,\n total: 0,\n tableSize: 'small',\n});\nuseResizeObserver(tableWraperRef, entries => {\n tableWraperHeight.value = entries[0].contentRect.height;\n});\nuseResizeObserver(searchRef, entries => {\n searchHeight.value = entries[0].contentRect.height;\n});\n\nconst preserveRow = () => {\n return false;\n};\nconst getQueryParams = () => {\n const getColumnFields = (list: Column[]) => {\n const fields = [];\n list.forEach(item => {\n if (\n item.dataIndex &&\n item.dataIndex !== 'index' &&\n item.dataIndex !== 'action' &&\n item.checked !== false\n ) {\n fields.push(item.dataIndex);\n }\n if (item.children && item.children.length > 0) {\n fields.push(...getColumnFields(item.children));\n }\n });\n return fields;\n };\n const column_fields = getColumnFields(columns.value || []);\n if (props.config.base_column_fields) {\n column_fields.push(...props.config.base_column_fields);\n }\n const sort_fields = [];\n const used_fields = new Set();\n for (const item of sortedList.value) {\n if (item.order == 'descend') {\n sort_fields.push('-' + item.key);\n } else {\n sort_fields.push(item.key);\n }\n used_fields.add(item.key);\n }\n if (props.config.base_sort_fields) {\n for (const item of props.config.base_sort_fields) {\n const field_name = item.startsWith('-') ? item.slice(1) : item;\n if (!used_fields.has(field_name)) {\n sort_fields.push(item);\n }\n }\n }\n const params = {\n ...(props.config.query_params || {}),\n current: state.current,\n pageSize: state.pageSize,\n column_fields: column_fields,\n sort_fields,\n };\n if (search_type.value === 'advanced') {\n const conditions = [\n ...filterConditions(props.config.base_conditions),\n ...filterConditions(searchConditions.value),\n ];\n params['conditions'] = [conditions];\n } else if (search_type.value === 'simple') {\n for (const item of filterConditions(searchConditions.value)) {\n const v_count = getParamsCount(item.operator, item);\n let value = item.value;\n if (v_count === 1) {\n value = value[0];\n }\n params[item.field_name] = value;\n }\n }\n if (props.config.get_query_params_func) {\n const newParams = props.config.get_query_params_func({ params });\n if (newParams) {\n Object.assign(params, newParams);\n }\n }\n return params;\n};\nconst [elRef, screenState, { setFull, exitFull }] = useFullscreen();\nconst getData = async () => {\n if (!props.config.list_url) {\n return;\n }\n const currentLoadId = Symbol(); // 唯一值\n loadDataId = currentLoadId;\n try {\n loading.value = true;\n\n const params = getQueryParams();\n let response: Response;\n if (props.config.query_data_func) {\n response = await props.config.query_data_func(params);\n } else {\n response = await getApiData(params, props.config.list_url, false, {\n api_log: `tablePro ${props.config.key} ${props.config.title}`,\n });\n }\n if (loadDataId !== currentLoadId) {\n return;\n }\n if (props.config.process_data_func) {\n dataSource.value = props.config.process_data_func(response.data);\n } else {\n dataSource.value = response.data || [];\n }\n state.current = response.current;\n state.total = response.total;\n emit('dataChange', {\n data: dataSource.value,\n current: response.current,\n total: response.total,\n });\n syncSelectedRowKeys();\n } finally {\n if (loadDataId !== currentLoadId) {\n return;\n }\n loading.value = false;\n }\n};\nconst delayGetDate = debounce(getData, 500);\nconst handlePageChange = (page: any, pageSize: any) => {\n if (state.current == page && state.pageSize == pageSize) {\n return;\n }\n state.current = page ? page : 1;\n state.pageSize = pageSize ? pageSize : DEFAULT_PAGE_SIZE;\n getData();\n};\nconst search_type = computed(() => {\n if (props.config.search_type === 'simple') {\n return props.config.search_type;\n } else {\n return 'advanced';\n }\n});\nconst is_view = computed(() => {\n return props.config?.is_view !== false;\n});\nconst row_selection: any = computed(() => {\n const rowSelectionType = props.config.rowSelectionType || 'checkbox';\n const onChange = (selectedRowKeys, selectdRecord) => {\n const unSelectdRecord = dataSource.value.filter(item => {\n return !selectedRowKeys.includes(item.id);\n });\n emit('selectChange', selectdRecord, unSelectdRecord);\n };\n return { type: rowSelectionType, onChange };\n});\nconst viewColumnsConfig = ref<Record<string, ViewColumnItem>>({});\nconst viewSearchConfig = ref<Record<string, ViewSearchItem>>({});\nconst filtedColumns = computed(() => {\n const filterRecursive = (list: Column[]) => {\n return list\n .filter(item => item.checked !== false)\n .map(item => {\n if (item.children && item.children.length > 0) {\n const children = filterRecursive(item.children);\n if (children.length > 0) {\n return {\n ...item,\n children,\n };\n }\n return null;\n }\n return item;\n })\n .filter(Boolean);\n };\n return filterRecursive(columns.value);\n});\nconst columns = computed<Column[]>(() => {\n const filterValueMap = {};\n for (const item of searchConditions.value) {\n if (['in', 'eq'].includes(item.operator)) {\n filterValueMap[item.field_name] = item.value;\n }\n }\n const sorted = sortedMap.value || {};\n const baseColumns = [...(props.config.columns || [])];\n\n if (props.config.btn_list && props.config.btn_list.length > 0) {\n const hasAction = baseColumns.some(item => item.dataIndex === 'action');\n if (!hasAction) {\n baseColumns.push({\n title: '操作',\n dataIndex: 'action',\n cellComponent: 'action',\n width: rowActionWidth.value + 20,\n resizable: true,\n fixed: 'right',\n checked: true,\n });\n }\n }\n\n // 合并视图配置,递归合并\n const mergeRecursive = (list: Column[], isChildren = false) => {\n const merged = list\n .map(item => {\n const key = item.dataIndex || item.key || item.title;\n const viewCol = viewColumnsConfig.value[key] || {};\n const newItem = {\n ...item,\n ...viewCol,\n is_children: isChildren,\n key: key,\n };\n if (newItem.children && newItem.children.length > 0) {\n newItem.children = mergeRecursive(newItem.children, true);\n }\n return newItem;\n })\n .sort((a, b) => {\n const orderA = a.order ?? 999;\n const orderB = b.order ?? 999;\n return orderA - orderB;\n });\n\n return merged.map(item => {\n const key = item.dataIndex || item.key || item.title;\n if (item.autoWidth) {\n return {\n ...item,\n minWidth: item.width,\n width: undefined,\n filteredValue: filterValueMap[key] || null,\n sortOrder: sorted[key] || false,\n key: key,\n customFilterDropdown:\n props.config.enable_custom_filter &&\n !!props.config.search_config?.find(s => s.field_name === key),\n onFilterDropdownOpenChange: open => {\n if (open) {\n setTimeout(() => {\n searchInput.value?.focus();\n }, 100);\n }\n },\n };\n } else {\n return {\n ...item,\n width: item.width,\n minWidth: undefined,\n filteredValue: filterValueMap[key] || null,\n sortOrder: sorted[key] || false,\n key: key,\n customFilterDropdown:\n props.config.enable_custom_filter &&\n !!props.config.search_config?.find(s => s.field_name === key),\n onFilterDropdownOpenChange: open => {\n if (open) {\n setTimeout(() => {\n searchInput.value?.focus();\n }, 100);\n }\n },\n };\n }\n });\n };\n\n const res = mergeRecursive(baseColumns);\n // 序号列处理\n const hasIndex = res.some(item => item.dataIndex === 'index');\n if (!hasIndex && !props.config.hide_index_column) {\n res.unshift({\n title: '#',\n dataIndex: 'index',\n key: 'index',\n maxWidth: 50,\n fixed: 'left',\n checked: true,\n autoHeight: true,\n });\n }\n return res;\n});\nconst tableContentWidth = computed(() => {\n let width = 0;\n const processColumns = datas => {\n for (const item of datas) {\n if (item.children && item.children.length > 0) {\n processColumns(item.children);\n } else {\n width += item.width || item.minWidth || 120;\n }\n }\n };\n processColumns(columns.value);\n});\nconst filename = computed(() => {\n const title = props.config.title || 'data';\n const datetime = dayjs().format('YYYYMMDD_HHmmss');\n return `${title}_${datetime}`;\n});\nconst exportExcelColumnList = computed(() => {\n const list: any = [];\n const getLeaves = (cols: Column[]) => {\n cols.forEach(item => {\n if (item.children && item.children.length > 0) {\n getLeaves(item.children);\n } else {\n if (item.dataIndex === 'action' || item.dataIndex === 'index') {\n return;\n }\n list.push({\n checked: item.checked,\n fixed: item.fixed ? item.fixed : false,\n key: item.dataIndex,\n label: item.title,\n width: item.width,\n });\n }\n });\n };\n getLeaves(columns.value);\n return list;\n});\nconst exportExcelColumn = computed(() => {\n const list: any = [];\n const getLeaves = (cols: Column[]) => {\n cols.forEach(item => {\n if (item.children && item.children.length > 0) {\n getLeaves(item.children);\n } else {\n if (item.dataIndex === 'action' || item.dataIndex === 'index') {\n return;\n }\n list.push(item);\n }\n });\n };\n getLeaves(columns.value);\n return list;\n});\nconst handleSearch = ({ confirm, dataIndex, value }) => {\n confirm();\n searchText.value = value;\n searchedColumn.value = dataIndex;\n getData();\n isViewChange.value = true;\n};\n\nconst handleReset = ({ clearFilters, dataIndex }) => {\n clearFilters();\n searchText.value = '';\n const conditions = cloneDeep(searchConditions.value);\n const conditionIndex = conditions.findIndex(item => item.field_name === dataIndex);\n if (conditionIndex > -1) {\n conditions.splice(conditionIndex, 1);\n }\n searchConditions.value = conditions;\n getData();\n isViewChange.value = true;\n};\n\nconst refresh = async () => {\n await getData();\n};\nconst handleRefreshTypeChange = type => {\n refreshType.value = type;\n isViewChange.value = true;\n};\nconst paginationHeight = ref(64);\nconst tableHeight = computed(() => {\n if (!tableWraperHeight.value) {\n return 0;\n }\n let value = tableWraperHeight.value - searchHeight.value - headerHeight.value - 4;\n if (props.config.is_pagination) {\n value -= paginationHeight.value;\n }\n console.log('tableWraperHeight', tableWraperHeight.value);\n console.log('searchHeight', searchHeight.value);\n console.log('headerHeight', headerHeight.value);\n console.log('paginationHeight', paginationHeight.value);\n console.log('tableHeight', value);\n return value;\n});\nconst handleTableSizeChange = () => {\n isViewChange.value = true;\n};\nwatch(\n () => state.tableSize,\n () => {\n // 此处设置paginationHeight两次,为了解决切换表格密度后,高度剧烈变化问题。\n paginationHeight.value = 64;\n setTimeout(() => {\n if (state.tableSize === 'small') {\n paginationHeight.value = 56;\n } else if (state.tableSize === 'middle') {\n paginationHeight.value = 56;\n } else if (state.tableSize === 'default') {\n paginationHeight.value = 64;\n }\n }, 200);\n },\n);\nconst syncSelectedRowKeys = () => {\n if (dataSource.value?.length > 0 && props.initValueKey) {\n const valueMap = {};\n selectedRowKeys.value = dataSource.value\n .filter(item => {\n const value = item[props.initValueKey];\n if (props.initSelectValue?.includes(value) && !valueMap[value]) {\n valueMap[value] = true;\n return true;\n }\n })\n .map(item => {\n return item.id;\n });\n }\n};\nconst init = async () => {\n const defaultSortField = props.config.columns.filter(\n column => column.sorter && column.defaultSortOrder,\n );\n defaultSortField.sort((a, b) => (a.defaultSortIndex || 0) - (b.defaultSortIndex || 0));\n for (const column of defaultSortField) {\n sortedMap.value[column.dataIndex] = column.defaultSortOrder;\n sortedList.value.push({ key: column.dataIndex, order: column.defaultSortOrder });\n }\n const tmpSearchConditions = [];\n if (props.config?.search_config) {\n props.config.search_config.forEach(configItem => {\n if (configItem.default_value) {\n let value = configItem.default_value;\n if (!isArray(value)) {\n value = [value];\n }\n tmpSearchConditions.push({\n field_name: configItem.field_name,\n value: value,\n operator: configItem.default_operator || 'eq',\n format: configItem.format || 'input',\n class_name: configItem.class_name || 'str',\n });\n }\n });\n }\n searchConditions.value = tmpSearchConditions;\n if (is_view && currentView.value?.id !== 'no-view') {\n await fetchViews();\n if (viewDataList.value?.length) {\n const tmpData = [...viewDataList.value];\n // 优先级:当前选中视图,默认视图,用户视图,同级按 sort 正序\n const getSortValue = item => {\n let value = item.sort || 0;\n if (item.id !== currentView.value?.id) {\n value *= 1000000;\n }\n if (!item.is_default) {\n value *= 10000;\n }\n if (!item.user_id) {\n value *= 1000;\n }\n return value;\n };\n tmpData.sort((a, b) => getSortValue(a) - getSortValue(b));\n setViewData(tmpData[0].data);\n currentView.value = tmpData[0];\n }\n }\n await getData();\n};\nconst eventReinit = async () => {\n init();\n};\nconst eventReload = async () => {\n await getData();\n};\nconst flattenedColumns = computed(() => {\n const list = [];\n const getLeaves = (cols: Column[]) => {\n cols.forEach(col => {\n if (col.children && col.children.length > 0) {\n getLeaves(col.children);\n } else {\n list.push(col);\n }\n });\n };\n getLeaves(filtedColumns.value);\n return list;\n});\nconst summaryColumns = computed(() => {\n const list = [];\n let index = 0;\n for (const item of flattenedColumns.value) {\n let _index = index;\n if (props.config?.is_selection) {\n _index = index + 1;\n }\n if (item.summary) {\n // if (!props.config.is_selection && props.config.hide_index_column) {\n // console.error('未开启选择(is_selection)且隐藏了序号列(hide_index_column),无法展示\"合计\"');\n // return [];\n // }\n list.push({\n index: _index,\n key: item.key,\n cellSummaryComponent: item.cellSummaryComponent,\n total_content: item.total_content,\n });\n }\n index++;\n }\n return list;\n});\nconst handleChange: TableProps['onChange'] = (pagination, filters, sorter, action) => {\n if (action.action === 'paginate') {\n return;\n } else if (action.action === 'filter') {\n const searchMap = {};\n for (const item of searchConditions.value) {\n searchMap[item.field_name] = item;\n }\n for (const key of Object.keys(filters)) {\n const value = filters[key];\n const item = searchMap[key];\n if (item) {\n if (value?.length > 1) {\n item.operator = 'in';\n } else {\n if (!['in', 'eq'].includes(item.operator)) {\n item.operator = 'in';\n }\n }\n item.value = value;\n } else {\n searchMap[key] = {\n field_name: key,\n operator: 'eq',\n value: value,\n format: 'input',\n class_name: 'str',\n };\n }\n }\n searchConditions.value = Object.values(searchMap);\n getData();\n isViewChange.value = true;\n } else if (action.action === 'sort') {\n const tmpMap = {};\n const tmpList = [];\n if (!isArray(sorter)) {\n tmpMap[sorter.columnKey] = sorter.order;\n tmpList.push({ key: sorter.columnKey, order: sorter.order });\n } else {\n for (const item of sorter) {\n tmpMap[item.columnKey] = item.order;\n tmpList.push({ key: item.columnKey, order: item.order });\n }\n }\n sortedMap.value = tmpMap;\n sortedList.value = tmpList;\n getData();\n isViewChange.value = true;\n }\n};\nconst handleCellClick = (e, cell) => {\n if (!props.config?.is_click_selection) {\n return;\n }\n const rowSelectionType = props.config.rowSelectionType || 'checkbox';\n if (rowSelectionType === 'radio') {\n selectedRowKeys.value = [cell.record.id];\n } else {\n const isSelected = selectedRowKeys.value && selectedRowKeys.value.includes(cell.record.id);\n if (isSelected) {\n selectedRowKeys.value = selectedRowKeys.value.filter(id => {\n return id !== cell.record.id;\n });\n } else {\n selectedRowKeys.value.push(cell.record.id);\n }\n }\n\n const selectdRecord = dataSource.value.filter(item => {\n return selectedRowKeys.value.includes(item.id);\n });\n const unSelectdRecord = dataSource.value.filter(item => {\n return !selectedRowKeys.value.includes(item.id);\n });\n emit('selectChange', selectdRecord, unSelectdRecord);\n};\n\nonMounted(async () => {\n if (!props.config.key) {\n console.error('tablePro config 未配置 key');\n }\n if (!props.config.title) {\n console.error('tablePro config 未配置 title');\n }\n selfEventBus.on('refresh', refresh);\n selfEventBus.on('reinit', eventReinit);\n selfEventBus.on('saveView', saveView);\n selfEventBus.on('saveNewView', addView);\n if (props.eventBus) {\n props.eventBus.on('reinit', eventReinit);\n props.eventBus.on('reload_table', eventReload);\n }\n if (props.config.tableSize) {\n state.tableSize = props.config.tableSize;\n }\n await init();\n});\nconst handleExport = () => {\n exportOpen.value = true;\n};\nconst onColumnsChange = (data: any[]) => {\n if (!props.config || !props.config.columns) return;\n const configObj: Record<string, any> = {};\n\n const processRecursive = (list: any[]) => {\n list.forEach((item, index) => {\n const dataIndex = item.dataIndex || item.key || item.title;\n if (dataIndex === 'index' || dataIndex === 'action') return;\n configObj[dataIndex] = {\n checked: item.checked,\n fixed: item.fixed,\n autoHeight: item.autoHeight,\n autoWidth: item.autoWidth,\n ellipsis: item.ellipsis,\n width: item.width,\n order: index,\n };\n if (item.children && item.children.length > 0) {\n processRecursive(item.children);\n }\n });\n };\n\n processRecursive(data);\n viewColumnsConfig.value = configObj;\n isViewChange.value = true;\n};\nconst setViewData = async (viewData: ViewData) => {\n if (viewData === null) {\n await init();\n isViewChange.value = false;\n return;\n }\n if (viewData.columns) {\n viewColumnsConfig.value = viewData.columns;\n }\n if (viewData.searchConfig) {\n viewSearchConfig.value = viewData.searchConfig;\n }\n if (viewData.searchConditions) {\n searchConditions.value = viewData.searchConditions;\n }\n if (viewData.tableSize) {\n state.tableSize = viewData.tableSize;\n }\n if (viewData.refreshType) {\n refreshType.value = viewData.refreshType;\n }\n if (viewData.sortedList) {\n sortedList.value = viewData.sortedList;\n sortedMap.value = {};\n for (const item of sortedList.value) {\n sortedMap.value[item.key] = item.order;\n }\n }\n if (props.config.set_view_callback) {\n props.config.set_view_callback({ viewData });\n }\n await refresh();\n isViewChange.value = false;\n};\nconst resizeColumn = (width, column, action: 'start' | 'move' | 'end') => {\n if (action === 'end') {\n let item = viewColumnsConfig.value[column.dataIndex];\n if (!item) {\n item = {};\n viewColumnsConfig.value[column.dataIndex] = item;\n }\n item.width = width;\n isViewChange.value = true;\n }\n};\nconst viewSearchConfigChange = (config: Record<string, ViewSearchItem>) => {\n viewSearchConfig.value = config;\n isViewChange.value = true;\n};\nconst getViewData = (): ViewData => {\n const viewData = {\n columns: viewColumnsConfig.value,\n searchConditions: searchConditions.value,\n tableSize: state.tableSize,\n refreshType: refreshType.value,\n searchConfig: viewSearchConfig.value,\n sortedList: sortedList.value,\n };\n if (props.config.get_view_data_func) {\n const newViewData = props.config.get_view_data_func({ viewData });\n if (newViewData) {\n Object.assign(viewData, newViewData);\n }\n }\n return viewData;\n};\nconst viewDataList = ref([]);\nconst currentView = ref<any>(null);\nconst isViewChange = ref(false);\nconst fetchViews = async () => {\n const data = await fetchViewsData(view_key.value);\n viewDataList.value = data;\n};\nconst handleSearchChange = () => {\n isViewChange.value = true;\n};\nconst { saveView, addView } = useView({\n currentView,\n getViewData,\n isViewChange,\n userid,\n view_project__flag: env.VITE_APP_VIEW_PROJECT_FLAG,\n view_menu__flag: view_key.value,\n view_menu__name: props.config.title,\n fetchViews,\n is_auth,\n t,\n});\n\nprovide<TableProState>(tableProStateSymbol, {\n setViewData,\n getViewData,\n fetchViews,\n viewDataList,\n currentView,\n isViewChange,\n config: props.config,\n});\n\nonUnmounted(() => {\n selfEventBus.off('refresh', refresh);\n selfEventBus.off('reinit', eventReinit);\n selfEventBus.off('saveView', saveView);\n selfEventBus.off('saveNewView', addView);\n if (props.eventBus) {\n props.eventBus.off('reinit', eventReinit);\n props.eventBus.off('reload_table', eventReload);\n }\n});\nwatch(\n () => props.initSelectValue,\n () => {\n syncSelectedRowKeys();\n },\n);\nwatch(\n () => props.config.query_params,\n () => {\n delayGetDate();\n },\n {\n deep: true,\n },\n);\nwatch(\n () => props.config.base_conditions,\n () => {\n delayGetDate();\n },\n {\n deep: true,\n },\n);\n\ndefineExpose({\n getViewData,\n setViewData,\n config: props.config,\n columns,\n fetchViews,\n viewDataList,\n currentView,\n isViewChange,\n viewColumnsConfig,\n refresh,\n});\n</script>\n<style lang=\"less\" scoped>\n.btn-wraper {\n display: flex;\n justify-content: flex-end;\n}\n.table-wraper {\n height: 100%;\n overflow: hidden;\n}\n.modify-row-height {\n :deep(.surely-table-header) {\n height: var(--row-heigth) !important;\n }\n :deep(.surely-table-header-cell) {\n height: var(--row-heigth) !important;\n }\n :deep(.surely-table-summary) {\n height: var(--row-heigth) !important;\n }\n}\n.popup-divider {\n :deep(.ant-divider-horizontal) {\n margin-top: 1px;\n margin-bottom: 1px;\n }\n}\n.highlight {\n background-color: rgb(255, 192, 105);\n padding: 0px;\n}\n</style>\n"],"mappings":"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"}
|