workdesktop-ai 1.0.2 → 1.1.0
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/CHANGELOG.md +155 -93
- package/README.md +123 -25
- package/dist/api-button/index.mjs +7 -0
- package/dist/api-button/index.mjs.map +1 -0
- package/dist/assets/Select-CNzSyvlZ.css +1 -0
- package/dist/auto-complete/index.mjs +7 -0
- package/dist/auto-complete/index.mjs.map +1 -0
- package/dist/auto-complete/style.css +1 -0
- package/dist/base.css +1 -0
- package/dist/checkbox-list/index.mjs +7 -0
- package/dist/checkbox-list/index.mjs.map +1 -0
- package/dist/checkbox-list/style.css +1 -0
- package/dist/chunks/ApiButton.vue_vue_type_script_setup_true_lang-CweWFfDE.mjs +80 -0
- package/dist/chunks/ApiButton.vue_vue_type_script_setup_true_lang-CweWFfDE.mjs.map +1 -0
- package/dist/chunks/AutoComplete-B_L169hU.mjs +80 -0
- package/dist/chunks/AutoComplete-B_L169hU.mjs.map +1 -0
- package/dist/chunks/CheckboxList-bPqpbd8d.mjs +129 -0
- package/dist/chunks/CheckboxList-bPqpbd8d.mjs.map +1 -0
- package/dist/chunks/ConfirmButton.vue_vue_type_script_setup_true_lang-DpdMPkka.mjs +99 -0
- package/dist/chunks/ConfirmButton.vue_vue_type_script_setup_true_lang-DpdMPkka.mjs.map +1 -0
- package/dist/chunks/DataForm-C6UW92Ds.mjs +305 -0
- package/dist/chunks/DataForm-C6UW92Ds.mjs.map +1 -0
- package/dist/chunks/DataGrid-BhgND4G_.mjs +1124 -0
- package/dist/chunks/DataGrid-BhgND4G_.mjs.map +1 -0
- package/dist/chunks/DialogButton.vue_vue_type_script_setup_true_lang-CTXP79zc.mjs +117 -0
- package/dist/chunks/DialogButton.vue_vue_type_script_setup_true_lang-CTXP79zc.mjs.map +1 -0
- package/dist/chunks/Drawer-ucXKUecL.mjs +259 -0
- package/dist/chunks/Drawer-ucXKUecL.mjs.map +1 -0
- package/dist/chunks/DrawerButton.vue_vue_type_script_setup_true_lang-DUda4p7_.mjs +125 -0
- package/dist/chunks/DrawerButton.vue_vue_type_script_setup_true_lang-DUda4p7_.mjs.map +1 -0
- package/dist/chunks/EditableGrid-Cx7ScWkW.mjs +1783 -0
- package/dist/chunks/EditableGrid-Cx7ScWkW.mjs.map +1 -0
- package/dist/chunks/FormItem-C1q0opnk.mjs +79 -0
- package/dist/chunks/FormItem-C1q0opnk.mjs.map +1 -0
- package/dist/chunks/Iframe-CeSiMnvR.mjs +65 -0
- package/dist/chunks/Iframe-CeSiMnvR.mjs.map +1 -0
- package/dist/chunks/ImageUpload-D3JGJjVO.mjs +193 -0
- package/dist/chunks/ImageUpload-D3JGJjVO.mjs.map +1 -0
- package/dist/chunks/Panel-d4chdlTA.mjs +113 -0
- package/dist/chunks/Panel-d4chdlTA.mjs.map +1 -0
- package/dist/chunks/PromptButton.vue_vue_type_script_setup_true_lang-BqoNAUoo.mjs +118 -0
- package/dist/chunks/PromptButton.vue_vue_type_script_setup_true_lang-BqoNAUoo.mjs.map +1 -0
- package/dist/chunks/RadioList-DT-8WSN2.mjs +129 -0
- package/dist/chunks/RadioList-DT-8WSN2.mjs.map +1 -0
- package/dist/chunks/Requester.vue_vue_type_script_setup_true_lang-5B1V-53c.mjs +80 -0
- package/dist/chunks/Requester.vue_vue_type_script_setup_true_lang-5B1V-53c.mjs.map +1 -0
- package/dist/chunks/RouteButton.vue_vue_type_script_setup_true_lang-Da0D3tKA.mjs +73 -0
- package/dist/chunks/RouteButton.vue_vue_type_script_setup_true_lang-Da0D3tKA.mjs.map +1 -0
- package/dist/chunks/SearchItem-pFO57lEO.mjs +79 -0
- package/dist/chunks/SearchItem-pFO57lEO.mjs.map +1 -0
- package/dist/chunks/SearchPanel-xQ1hPaNq.mjs +158 -0
- package/dist/chunks/SearchPanel-xQ1hPaNq.mjs.map +1 -0
- package/dist/chunks/Select-CMw-tWYm.mjs +114 -0
- package/dist/chunks/Select-CMw-tWYm.mjs.map +1 -0
- package/dist/chunks/Station-BF_QlQ8c.mjs +796 -0
- package/dist/chunks/Station-BF_QlQ8c.mjs.map +1 -0
- package/dist/chunks/Switch.vue_vue_type_script_setup_true_lang-CCU_d3jW.mjs +71 -0
- package/dist/chunks/Switch.vue_vue_type_script_setup_true_lang-CCU_d3jW.mjs.map +1 -0
- package/dist/chunks/Tips-IWCZcR1K.mjs +63 -0
- package/dist/chunks/Tips-IWCZcR1K.mjs.map +1 -0
- package/dist/chunks/TipsButton.vue_vue_type_script_setup_true_lang-DvcpRSV1.mjs +51 -0
- package/dist/chunks/TipsButton.vue_vue_type_script_setup_true_lang-DvcpRSV1.mjs.map +1 -0
- package/dist/chunks/Upload.vue_vue_type_script_setup_true_lang-CkxGO85H.mjs +200 -0
- package/dist/chunks/Upload.vue_vue_type_script_setup_true_lang-CkxGO85H.mjs.map +1 -0
- package/dist/chunks/Viewer-COLbtcgF.mjs +381 -0
- package/dist/chunks/Viewer-COLbtcgF.mjs.map +1 -0
- package/dist/chunks/_plugin-vue_export-helper-CHgC5LLL.mjs +10 -0
- package/dist/chunks/_plugin-vue_export-helper-CHgC5LLL.mjs.map +1 -0
- package/dist/chunks/containerContext-BgphFDeH.mjs +13 -0
- package/dist/chunks/containerContext-BgphFDeH.mjs.map +1 -0
- package/dist/chunks/http-DUPsbs2K.mjs +2951 -0
- package/dist/chunks/http-DUPsbs2K.mjs.map +1 -0
- package/dist/chunks/linkage-FbL1mcz3.mjs +66 -0
- package/dist/chunks/linkage-FbL1mcz3.mjs.map +1 -0
- package/dist/chunks/props-DAytpx7D.mjs +65 -0
- package/dist/chunks/props-DAytpx7D.mjs.map +1 -0
- package/dist/chunks/useApiAction-C1CdKGjt.mjs +30 -0
- package/dist/chunks/useApiAction-C1CdKGjt.mjs.map +1 -0
- package/dist/chunks/useColumnSettings-BDtF5-8R.mjs +216 -0
- package/dist/chunks/useColumnSettings-BDtF5-8R.mjs.map +1 -0
- package/dist/chunks/useOptionsLoader-D0RTB_ar.mjs +64 -0
- package/dist/chunks/useOptionsLoader-D0RTB_ar.mjs.map +1 -0
- package/dist/confirm-button/index.mjs +7 -0
- package/dist/confirm-button/index.mjs.map +1 -0
- package/dist/data-form/index.mjs +7 -0
- package/dist/data-form/index.mjs.map +1 -0
- package/dist/data-form/style.css +1 -0
- package/dist/data-grid/index.mjs +7 -0
- package/dist/data-grid/index.mjs.map +1 -0
- package/dist/data-grid/style.css +1 -0
- package/dist/dialog-button/index.mjs +7 -0
- package/dist/dialog-button/index.mjs.map +1 -0
- package/dist/drawer/index.mjs +7 -0
- package/dist/drawer/index.mjs.map +1 -0
- package/dist/drawer/style.css +1 -0
- package/dist/drawer-button/index.mjs +7 -0
- package/dist/drawer-button/index.mjs.map +1 -0
- package/dist/editable-grid/index.mjs +7 -0
- package/dist/editable-grid/index.mjs.map +1 -0
- package/dist/editable-grid/style.css +1 -0
- package/dist/form-item/index.mjs +7 -0
- package/dist/form-item/index.mjs.map +1 -0
- package/dist/form-item/style.css +1 -0
- package/dist/iframe/index.mjs +7 -0
- package/dist/iframe/index.mjs.map +1 -0
- package/dist/iframe/style.css +1 -0
- package/dist/image-upload/index.mjs +7 -0
- package/dist/image-upload/index.mjs.map +1 -0
- package/dist/image-upload/style.css +1 -0
- package/dist/index.esm.js +318 -6495
- package/dist/index.esm.js.map +1 -1
- package/dist/index.umd.js +20 -9
- package/dist/index.umd.js.map +1 -1
- package/dist/panel/index.mjs +7 -0
- package/dist/panel/index.mjs.map +1 -0
- package/dist/panel/style.css +1 -0
- package/dist/prompt-button/index.mjs +7 -0
- package/dist/prompt-button/index.mjs.map +1 -0
- package/dist/radio-list/index.mjs +7 -0
- package/dist/radio-list/index.mjs.map +1 -0
- package/dist/radio-list/style.css +1 -0
- package/dist/requester/index.mjs +7 -0
- package/dist/requester/index.mjs.map +1 -0
- package/dist/route-button/index.mjs +7 -0
- package/dist/route-button/index.mjs.map +1 -0
- package/dist/search-item/index.mjs +7 -0
- package/dist/search-item/index.mjs.map +1 -0
- package/dist/search-item/style.css +1 -0
- package/dist/search-panel/index.mjs +7 -0
- package/dist/search-panel/index.mjs.map +1 -0
- package/dist/search-panel/style.css +1 -0
- package/dist/select/index.mjs +7 -0
- package/dist/select/index.mjs.map +1 -0
- package/dist/station/index.mjs +7 -0
- package/dist/station/index.mjs.map +1 -0
- package/dist/station/style.css +1 -0
- package/dist/style.css +1 -1
- package/dist/switch/index.mjs +7 -0
- package/dist/switch/index.mjs.map +1 -0
- package/dist/tips/index.mjs +7 -0
- package/dist/tips/index.mjs.map +1 -0
- package/dist/tips/style.css +1 -0
- package/dist/tips-button/index.mjs +7 -0
- package/dist/tips-button/index.mjs.map +1 -0
- package/dist/types/src/components/buttons/ApiButton.vue.d.ts +35 -6
- package/dist/types/src/components/buttons/ConfirmButton.vue.d.ts +37 -8
- package/dist/types/src/components/buttons/DialogButton.vue.d.ts +89 -29
- package/dist/types/src/components/buttons/DrawerButton.vue.d.ts +99 -31
- package/dist/types/src/components/buttons/PopconfirmButton.vue.d.ts +317 -0
- package/dist/types/src/components/buttons/PromptButton.vue.d.ts +45 -14
- package/dist/types/src/components/buttons/RouteButton.vue.d.ts +34 -5
- package/dist/types/src/components/buttons/TipsButton.vue.d.ts +8 -15
- package/dist/types/src/components/common/props.d.ts +32 -2
- package/dist/types/src/components/containers/Drawer.vue.d.ts +61 -8
- package/dist/types/src/components/containers/Iframe.vue.d.ts +39 -2
- package/dist/types/src/components/containers/containerContext.d.ts +1 -1
- package/dist/types/src/components/containers/useContainerController.d.ts +5 -0
- package/dist/types/src/components/containers/useIframeContainer.d.ts +20 -0
- package/dist/types/src/components/core/Requester.vue.d.ts +41 -0
- package/dist/types/src/components/data/datagrid/DataGrid.vue.d.ts +212 -5
- package/dist/types/src/components/data/datagrid/useColumnSettings.d.ts +14 -0
- package/dist/types/src/components/data/editable-grid/EditableGrid.vue.d.ts +586 -0
- package/dist/types/src/components/data/viewer/Viewer.vue.d.ts +187 -0
- package/dist/types/src/components/form/FormItem.vue.d.ts +62 -0
- package/dist/types/src/components/form/SearchItem.vue.d.ts +62 -0
- package/dist/types/src/components/{containers → form}/SearchPanel.vue.d.ts +17 -2
- package/dist/types/src/components/form/data-form/DataForm.vue.d.ts +6 -6
- package/dist/types/src/components/index.d.ts +10 -6
- package/dist/types/src/components/inputs/AutoComplete.vue.d.ts +10 -1
- package/dist/types/src/components/inputs/CheckboxList.vue.d.ts +28 -3
- package/dist/types/src/components/inputs/RadioList.vue.d.ts +28 -3
- package/dist/types/src/components/inputs/Select.vue.d.ts +11 -1
- package/dist/types/src/components/inputs/Switch.vue.d.ts +2 -2
- package/dist/types/src/components/inputs/useOptionsLoader.d.ts +3 -0
- package/dist/types/src/components/layout/Station.vue.d.ts +302 -0
- package/dist/types/src/components/layout/StationMenuNode.vue.d.ts +20 -0
- package/dist/types/src/components/layout/types.d.ts +54 -0
- package/dist/types/src/components/styles/Panel.vue.d.ts +47 -5
- package/dist/types/src/components/upload/ImageUpload.vue.d.ts +4 -4
- package/dist/types/src/components/upload/Upload.vue.d.ts +1 -1
- package/dist/types/src/entries/api-button.d.ts +9 -0
- package/dist/types/src/entries/auto-complete.d.ts +9 -0
- package/dist/types/src/entries/checkbox-list.d.ts +9 -0
- package/dist/types/src/entries/components-map.d.ts +8 -0
- package/dist/types/src/entries/confirm-button.d.ts +9 -0
- package/dist/types/src/entries/data-form.d.ts +9 -0
- package/dist/types/src/entries/data-grid.d.ts +9 -0
- package/dist/types/src/entries/dialog-button.d.ts +9 -0
- package/dist/types/src/entries/drawer-button.d.ts +9 -0
- package/dist/types/src/entries/drawer.d.ts +9 -0
- package/dist/types/src/entries/editable-grid.d.ts +9 -0
- package/dist/types/src/entries/form-item.d.ts +9 -0
- package/dist/types/src/entries/iframe.d.ts +9 -0
- package/dist/types/src/entries/image-upload.d.ts +9 -0
- package/dist/types/src/entries/panel.d.ts +9 -0
- package/dist/types/src/entries/prompt-button.d.ts +9 -0
- package/dist/types/src/entries/radio-list.d.ts +9 -0
- package/dist/types/src/entries/requester.d.ts +9 -0
- package/dist/types/src/entries/route-button.d.ts +9 -0
- package/dist/types/src/entries/search-item.d.ts +9 -0
- package/dist/types/src/entries/search-panel.d.ts +9 -0
- package/dist/types/src/entries/select.d.ts +9 -0
- package/dist/types/src/entries/station.d.ts +9 -0
- package/dist/types/src/entries/switch.d.ts +9 -0
- package/dist/types/src/entries/tips-button.d.ts +9 -0
- package/dist/types/src/entries/tips.d.ts +9 -0
- package/dist/types/src/entries/upload.d.ts +9 -0
- package/dist/types/src/entries/viewer.d.ts +9 -0
- package/dist/types/src/index.d.ts +2 -1
- package/dist/types/src/lib/composables/useDataGrid.d.ts +15 -0
- package/dist/types/src/lib/core/http.d.ts +21 -4
- package/dist/types/src/lib/core/station-linkage.d.ts +41 -0
- package/dist/types/src/types/config.d.ts +20 -3
- package/dist/types/vite.config.d.ts +6 -1
- package/dist/upload/index.mjs +7 -0
- package/dist/upload/index.mjs.map +1 -0
- package/dist/viewer/index.mjs +7 -0
- package/dist/viewer/index.mjs.map +1 -0
- package/dist/viewer/style.css +1 -0
- package/package.json +199 -68
- package/dist/types/src/components/containers/Dialog.vue.d.ts +0 -112
- package/dist/types/src/components/data/editable-table/EditableTable.vue.d.ts +0 -306
- package/dist/types/src/components/utils/Viewer.vue.d.ts +0 -131
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataForm-C6UW92Ds.mjs","sources":["../../src/components/form/data-form/DataForm.vue"],"sourcesContent":["<template>\r\n <div class=\"wd-data-form\">\r\n <el-form\r\n ref=\"formRef\"\r\n v-loading=\"loading\"\r\n :model=\"formModel\"\r\n :rules=\"rules\"\r\n :label-width=\"labelWidth\"\r\n :label-position=\"labelPosition\"\r\n :inline=\"inline\"\r\n :disabled=\"loading\"\r\n v-bind=\"$attrs\"\r\n @submit.prevent\r\n >\r\n <slot :model=\"formModel\" :form=\"formRef\" />\r\n\r\n <!-- 底部操作区 -->\r\n <div v-if=\"withActions\" class=\"wd-data-form__footer\">\r\n <slot name=\"footer\" :submit=\"submitForm\" :reset=\"resetForm\" :loading=\"loading\">\r\n <!-- 关闭 / 保存并继续:仅在容器(drawer/dialog)或 iframe 内显示,独立使用时隐藏 -->\r\n <el-button v-if=\"inHost\" @click=\"onClose\">{{ closeText }}</el-button>\r\n <el-button v-if=\"actionConf.showReset\" @click=\"resetForm\">{{ actionConf.resetText }}</el-button>\r\n <el-button\r\n v-if=\"inHost && isCreate && keepFormButton && actionConf.showContinue\"\r\n :loading=\"loading\"\r\n @click=\"submitForm(true)\"\r\n >\r\n {{ actionConf.continueText }}\r\n </el-button>\r\n <el-button type=\"primary\" :loading=\"loading\" @click=\"submitForm(false)\">\r\n {{ actionConf.submitText }}\r\n </el-button>\r\n </slot>\r\n </div>\r\n </el-form>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, reactive, computed, onMounted, onBeforeUnmount, watch, provide, inject, getCurrentInstance, type PropType } from 'vue'\r\nimport { ElMessage, ElMessageBox } from 'element-plus'\r\nimport { request } from '../../../lib/core/http'\r\nimport { refreshDataGrid } from '../../../lib/core/linkage'\r\nimport { deepMerge } from '../../../lib/core/utils'\r\nimport { useContainer } from '../../containers/containerContext'\r\n\r\ndefineOptions({ name: 'WdDataForm', inheritAttrs: false })\r\n\r\nconst props = defineProps({\r\n /** 模式:create 新增 / edit 编辑 */\r\n mode: { type: String as PropType<'create' | 'edit'>, default: 'create' },\r\n /** 详情数据接口(edit 模式回填) */\r\n api: { type: String, default: '' },\r\n apiMethod: { type: String as PropType<'get' | 'post'>, default: 'get' },\r\n apiParam: { type: Object as PropType<Record<string, any>>, default: () => ({}) },\r\n /** 提交接口 */\r\n submitApi: { type: String, default: '' },\r\n submitMethod: { type: String as PropType<'post' | 'put'>, default: 'post' },\r\n /** 提交字段白名单 */\r\n submitKeys: { type: [String, Array] as PropType<string | string[]>, default: undefined },\r\n /** 提交字段黑名单 */\r\n submitExcludeKeys: { type: [String, Array] as PropType<string | string[]>, default: undefined },\r\n /** 是否自动请求详情 */\r\n active: { type: Boolean, default: false },\r\n /** 有未保存修改时离开确认 */\r\n confirmLeave: { type: Boolean, default: true },\r\n /** 是否显示底部操作按钮区 */\r\n withActions: { type: Boolean, default: true },\r\n /** 底部按钮文案配置 */\r\n actionConfig: {\r\n type: Object as PropType<{\r\n resetText?: string\r\n submitText?: string\r\n continueText?: string\r\n closeText?: string\r\n showReset?: boolean\r\n showContinue?: boolean\r\n }>,\r\n default: () => ({})\r\n },\r\n /** 提交后关闭抽屉 */\r\n headCloseDrawer: { type: [Boolean, String], default: true },\r\n /** 提交后刷新表格 */\r\n headRefreshDatagrid: { type: [Boolean, String], default: false },\r\n /** 显示连续操作按钮 */\r\n keepFormButton: { type: Boolean, default: true },\r\n /** 表单规则(透传 el-form rules) */\r\n rules: { type: Object as PropType<Record<string, any>>, default: () => ({}) },\r\n labelWidth: { type: [String, Number], default: '100px' },\r\n labelPosition: { type: String as PropType<'left' | 'right' | 'top'>, default: 'right' },\r\n inline: { type: Boolean, default: false },\r\n /** 联动分组 */\r\n filter: { type: String, default: '' },\r\n /** 外部传入的初始数据(DrawerButton data 等) */\r\n data: { type: Object as PropType<Record<string, any>>, default: undefined }\r\n})\r\n\r\nconst emit = defineEmits([\r\n 'submit-success',\r\n 'submit-fail',\r\n 'load-success',\r\n 'change',\r\n 'close',\r\n 'apiBefore',\r\n 'apiAfter'\r\n])\r\n\r\nconst formRef = ref<any>(null)\r\nconst loading = ref(false)\r\nconst formModel = reactive<Record<string, any>>({})\r\n/** 初始快照,用于修改检测与 edit 重置 */\r\nconst snapshot = ref<Record<string, any>>({})\r\n\r\nconst isCreate = computed(() => props.mode !== 'edit')\r\n\r\nconst actionConf = computed(() =>\r\n deepMerge(\r\n {\r\n resetText: '重置',\r\n submitText: '保存',\r\n continueText: '保存并继续',\r\n closeText: '关闭',\r\n showReset: true,\r\n showContinue: true\r\n },\r\n props.actionConfig || {}\r\n )\r\n)\r\n\r\nconst closeText = computed(() => actionConf.value.closeText)\r\n\r\n// 通过 provide 向子组件暴露 model;HTML 场景下插槽 v-model=\"model.xxx\"\r\n// 运行于根组件模板作用域,故同时把 model 挂到 app.config.globalProperties\r\n// (根实例 proxy 查找 setupState/data 之后回退 globalProperties)\r\nconst instance = getCurrentInstance()\r\nprovide('wdDataForm', {\r\n model: formModel,\r\n formRef\r\n})\r\n\r\n/** 回填数据到表单 */\r\nfunction fillForm(data: Record<string, any> | null | undefined) {\r\n // 清空旧值\r\n Object.keys(formModel).forEach((k) => delete formModel[k])\r\n if (data && typeof data === 'object') {\r\n Object.assign(formModel, JSON.parse(JSON.stringify(data)))\r\n }\r\n snapshot.value = JSON.parse(JSON.stringify(formModel))\r\n}\r\n\r\n/** 请求详情并回填 */\r\nasync function requestApi(options?: { apiParam?: Record<string, any> }) {\r\n if (!props.api) {\r\n fillForm(props.data || {})\r\n return\r\n }\r\n loading.value = true\r\n emit('apiBefore', { type: 'load' })\r\n try {\r\n const param = { ...props.apiParam, ...(options?.apiParam || {}) }\r\n const result =\r\n props.apiMethod === 'get'\r\n ? await request.get(props.api, param)\r\n : await request.post(props.api, param)\r\n if (result.success) {\r\n fillForm(result.data || {})\r\n emit('load-success', result.data)\r\n }\r\n } finally {\r\n loading.value = false\r\n emit('apiAfter', { type: 'load' })\r\n }\r\n}\r\n\r\n/** 取当前表单值 */\r\nfunction getFormData() {\r\n return { ...formModel }\r\n}\r\n\r\n/** 按白/黑名单过滤提交字段 */\r\nfunction pickSubmitData() {\r\n const data = getFormData()\r\n const toArr = (v: string | string[] | undefined) =>\r\n v == null ? null : Array.isArray(v) ? v : String(v).split(',').map((s) => s.trim()).filter(Boolean)\r\n\r\n const whitelist = toArr(props.submitKeys)\r\n const blacklist = toArr(props.submitExcludeKeys)\r\n\r\n let result = data\r\n if (whitelist) {\r\n result = whitelist.reduce((acc: Record<string, any>, key) => {\r\n acc[key] = data[key]\r\n return acc\r\n }, {})\r\n }\r\n if (blacklist) {\r\n result = Object.keys(result).reduce((acc: Record<string, any>, key) => {\r\n if (!blacklist.includes(key)) acc[key] = result[key]\r\n return acc\r\n }, {})\r\n }\r\n return result\r\n}\r\n\r\n/** 手动校验 */\r\nasync function validate(): Promise<boolean> {\r\n if (!formRef.value) return true\r\n try {\r\n await formRef.value.validate()\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\n/** 提交 */\r\nasync function submitForm(continueNext = false) {\r\n const ok = await validate()\r\n if (!ok) {\r\n ElMessage.warning('请完善表单必填项')\r\n return\r\n }\r\n if (!props.submitApi) {\r\n // 无提交接口:仅抛出事件,交给父组件处理\r\n emit('submit-success', getFormData())\r\n afterSubmitSuccess(getFormData(), continueNext)\r\n return\r\n }\r\n\r\n loading.value = true\r\n emit('apiBefore', { type: 'submit' })\r\n try {\r\n const submitData = pickSubmitData()\r\n const result =\r\n props.submitMethod === 'put'\r\n ? await request.put(props.submitApi, submitData)\r\n : await request.post(props.submitApi, submitData)\r\n\r\n if (result.success) {\r\n emit('submit-success', result.data)\r\n afterSubmitSuccess(result.data, continueNext)\r\n } else {\r\n emit('submit-fail', result)\r\n }\r\n } finally {\r\n loading.value = false\r\n emit('apiAfter', { type: 'submit' })\r\n }\r\n}\r\n\r\n/** 提交成功后的联动处理 */\r\nfunction afterSubmitSuccess(data: any, continueNext: boolean) {\r\n // 1. 刷新目标 DataGrid(声明式联动)\r\n if (props.headRefreshDatagrid) {\r\n refreshDataGrid(props.headRefreshDatagrid, props.filter)\r\n }\r\n // 2. 关闭抽屉 / 连续操作\r\n if (continueNext && isCreate.value) {\r\n // 保存并继续:清空表单继续新增,不关闭\r\n resetForm(true)\r\n } else if (props.headCloseDrawer) {\r\n // 容器内:请求容器关闭(提交成功不再做离开确认);独立使用:emit close\r\n if (container?.requestClose) {\r\n container.requestClose('submit')\r\n } else {\r\n emit('close', { reason: 'submit' })\r\n }\r\n }\r\n // 更新快照\r\n snapshot.value = JSON.parse(JSON.stringify(formModel))\r\n}\r\n\r\n/** 重置:create 清空 / edit 回填原值 */\r\nfunction resetForm(clearOnly = false) {\r\n if (isCreate.value || clearOnly) {\r\n Object.keys(formModel).forEach((k) => delete formModel[k])\r\n formRef.value?.clearValidate?.()\r\n } else {\r\n fillForm(snapshot.value)\r\n formRef.value?.clearValidate?.()\r\n }\r\n}\r\n\r\n/** 是否有未保存修改 */\r\nfunction isDirty(): boolean {\r\n return JSON.stringify(formModel) !== JSON.stringify(snapshot.value)\r\n}\r\n\r\n/** 关闭(底部关闭按钮) */\r\nfunction onClose() {\r\n if (container?.requestClose) {\r\n // 容器内:交给容器走关闭流程(容器统一执行未保存确认,避免重复弹窗)\r\n container.requestClose('manual')\r\n return\r\n }\r\n // iframe 场景:通知父容器(wd-drawer url 模式 / wd-iframe 承载)请求关闭\r\n if (inIframe.value) {\r\n window.parent?.postMessage({ type: 'wd-container:close' }, '*')\r\n return\r\n }\r\n // 独立使用:自行确认\r\n if (props.confirmLeave && isDirty()) {\r\n ElMessageBox.confirm('有未保存的修改,确认离开?', '提示', {\r\n confirmButtonText: '确认离开',\r\n cancelButtonText: '继续编辑',\r\n type: 'warning'\r\n })\r\n .then(() => emit('close', { reason: 'manual' }))\r\n .catch(() => {})\r\n return\r\n }\r\n emit('close', { reason: 'manual' })\r\n}\r\n\r\n/** 供父组件/抽屉调用的离开检查 */\r\nasync function beforeLeave(): Promise<boolean> {\r\n if (!props.confirmLeave || !isDirty()) return true\r\n try {\r\n await ElMessageBox.confirm('有未保存的修改,确认离开?', '提示', {\r\n confirmButtonText: '确认离开',\r\n cancelButtonText: '继续编辑',\r\n type: 'warning'\r\n })\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\n// 表单变化事件(修改检测)\r\nwatch(\r\n formModel,\r\n () => {\r\n emit('change', getFormData())\r\n },\r\n { deep: true }\r\n)\r\n\r\n// 容器上下文(被 wd-drawer 承载时存在,mode=dialog 同为该组件)\r\nconst container = useContainer()\r\nlet removeBeforeClose: (() => void) | null = null\r\n// 容器携带的数据(DrawerButton data),props.data 优先\r\nconst containerData = computed(() => props.data || container?.data)\r\n\r\n// 是否处于 iframe 子页面(被 wd-drawer url 模式 / wd-iframe 承载;跨域访问 window.top 会抛错,视为 iframe)\r\nconst inIframe = computed(() => {\r\n if (typeof window === 'undefined') return false\r\n try {\r\n return window.self !== window.top\r\n } catch {\r\n return true\r\n }\r\n})\r\n// 是否处于宿主环境(drawer/dialog 容器 或 iframe)——决定底部「关闭」「保存并继续」按钮是否显示\r\nconst inHost = computed(() => !!container || inIframe.value)\r\n\r\n// 同步数据预填(首次渲染前):props.data / 容器 data 在 setup 阶段已可用,\r\n// 提前回填可避免插槽内 el-switch / el-radio 等控件首帧绑定 undefined 触发 EP 校验警告;\r\n// api 异步详情仍在 onMounted 中拉取并覆盖\r\nif (containerData.value) {\r\n fillForm(containerData.value)\r\n}\r\n\r\nonMounted(() => {\r\n // HTML 场景:把 model 暴露给根模板作用域(v-model=\"model.xxx\")\r\n const appContext = instance?.appContext\r\n if (appContext) {\r\n appContext.config.globalProperties.model = formModel\r\n const rootProxy = appContext.app?.config?.globalProperties\r\n if (rootProxy) rootProxy.model = formModel\r\n }\r\n\r\n // 注册关闭前守卫:容器关闭时先做未保存确认(确认逻辑只走这一处,避免重复弹窗)\r\n if (container?.addBeforeClose) {\r\n removeBeforeClose = container.addBeforeClose(async () => {\r\n if (!props.confirmLeave || !isDirty()) return true\r\n try {\r\n await ElMessageBox.confirm('有未保存的修改,确认离开?', '提示', {\r\n confirmButtonText: '确认离开',\r\n cancelButtonText: '继续编辑',\r\n type: 'warning'\r\n })\r\n return true\r\n } catch {\r\n return false\r\n }\r\n })\r\n }\r\n\r\n if (props.mode === 'edit') {\r\n if (containerData.value) {\r\n fillForm(containerData.value)\r\n }\r\n if (props.active && props.api) {\r\n requestApi()\r\n }\r\n } else if (containerData.value) {\r\n fillForm(containerData.value)\r\n }\r\n})\r\n\r\nonBeforeUnmount(() => {\r\n removeBeforeClose?.()\r\n // 清理全局 model(仅当仍指向本实例时)\r\n const appContext = instance?.appContext\r\n if (appContext?.config?.globalProperties?.model === formModel) {\r\n delete appContext.config.globalProperties.model\r\n }\r\n})\r\n\r\ndefineExpose({\r\n requestApi,\r\n submitForm,\r\n resetForm,\r\n validate,\r\n getFormData,\r\n isDirty,\r\n beforeLeave,\r\n fillForm,\r\n formRef\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.wd-data-form {\r\n width: 100%;\r\n}\r\n.wd-data-form__footer {\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: 8px;\r\n padding-top: var(--wd-spacing-base, 12px);\r\n border-top: 1px solid var(--wd-border-color-light, #e4e7ed);\r\n margin-top: var(--wd-spacing-base, 12px);\r\n}\r\n</style>\r\n"],"names":["props","__props","emit","__emit","formRef","ref","loading","formModel","reactive","snapshot","isCreate","computed","actionConf","deepMerge","closeText","instance","getCurrentInstance","provide","fillForm","data","k","requestApi","options","param","result","request","getFormData","pickSubmitData","toArr","v","s","whitelist","blacklist","acc","key","validate","submitForm","continueNext","ElMessage","afterSubmitSuccess","submitData","refreshDataGrid","resetForm","container","clearOnly","_b","_a","_d","_c","isDirty","onClose","inIframe","ElMessageBox","beforeLeave","watch","useContainer","removeBeforeClose","containerData","inHost","onMounted","appContext","rootProxy","onBeforeUnmount","__expose","_openBlock","_createElementBlock","_hoisted_1","_withDirectives","_createBlock","_component_el_form","_mergeProps","$attrs","_renderSlot","_ctx","_hoisted_2","_component_el_button","_createTextVNode","_toDisplayString","_createVNode"],"mappings":"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"}
|