workdesktop-ai 1.1.0 → 1.1.1
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/api-button/index.mjs +1 -1
- package/dist/auto-complete/index.mjs +1 -1
- package/dist/checkbox-list/index.mjs +1 -1
- package/dist/chunks/{ApiButton.vue_vue_type_script_setup_true_lang-CweWFfDE.mjs → ApiButton.vue_vue_type_script_setup_true_lang-KKzJxwpV.mjs} +2 -2
- package/dist/chunks/{ApiButton.vue_vue_type_script_setup_true_lang-CweWFfDE.mjs.map → ApiButton.vue_vue_type_script_setup_true_lang-KKzJxwpV.mjs.map} +1 -1
- package/dist/chunks/{AutoComplete-B_L169hU.mjs → AutoComplete-CLV_PwcZ.mjs} +2 -2
- package/dist/chunks/{AutoComplete-B_L169hU.mjs.map → AutoComplete-CLV_PwcZ.mjs.map} +1 -1
- package/dist/chunks/{CheckboxList-bPqpbd8d.mjs → CheckboxList-Bx3Ce1q5.mjs} +2 -2
- package/dist/chunks/{CheckboxList-bPqpbd8d.mjs.map → CheckboxList-Bx3Ce1q5.mjs.map} +1 -1
- package/dist/chunks/{ConfirmButton.vue_vue_type_script_setup_true_lang-DpdMPkka.mjs → ConfirmButton.vue_vue_type_script_setup_true_lang-D4w6G2Kv.mjs} +2 -2
- package/dist/chunks/{ConfirmButton.vue_vue_type_script_setup_true_lang-DpdMPkka.mjs.map → ConfirmButton.vue_vue_type_script_setup_true_lang-D4w6G2Kv.mjs.map} +1 -1
- package/dist/chunks/{DataForm-C6UW92Ds.mjs → DataForm-C5MBVdei.mjs} +2 -2
- package/dist/chunks/{DataForm-C6UW92Ds.mjs.map → DataForm-C5MBVdei.mjs.map} +1 -1
- package/dist/chunks/{DataGrid-BhgND4G_.mjs → DataGrid-HUzKWuQx.mjs} +3 -3
- package/dist/chunks/{DataGrid-BhgND4G_.mjs.map → DataGrid-HUzKWuQx.mjs.map} +1 -1
- package/dist/chunks/{EditableGrid-Cx7ScWkW.mjs → EditableGrid-C8A-nJZv.mjs} +3 -3
- package/dist/chunks/{EditableGrid-Cx7ScWkW.mjs.map → EditableGrid-C8A-nJZv.mjs.map} +1 -1
- package/dist/chunks/{ImageUpload-D3JGJjVO.mjs → ImageUpload-DGehzaYa.mjs} +2 -2
- package/dist/chunks/{ImageUpload-D3JGJjVO.mjs.map → ImageUpload-DGehzaYa.mjs.map} +1 -1
- package/dist/chunks/{Panel-d4chdlTA.mjs → Panel-CrRqBTj6.mjs} +33 -31
- package/dist/chunks/Panel-CrRqBTj6.mjs.map +1 -0
- package/dist/chunks/{PromptButton.vue_vue_type_script_setup_true_lang-BqoNAUoo.mjs → PromptButton.vue_vue_type_script_setup_true_lang-Gck1QAHc.mjs} +2 -2
- package/dist/chunks/{PromptButton.vue_vue_type_script_setup_true_lang-BqoNAUoo.mjs.map → PromptButton.vue_vue_type_script_setup_true_lang-Gck1QAHc.mjs.map} +1 -1
- package/dist/chunks/{RadioList-DT-8WSN2.mjs → RadioList-vE8JOuST.mjs} +2 -2
- package/dist/chunks/{RadioList-DT-8WSN2.mjs.map → RadioList-vE8JOuST.mjs.map} +1 -1
- package/dist/chunks/{Requester.vue_vue_type_script_setup_true_lang-5B1V-53c.mjs → Requester.vue_vue_type_script_setup_true_lang-B8TwXbYR.mjs} +2 -2
- package/dist/chunks/{Requester.vue_vue_type_script_setup_true_lang-5B1V-53c.mjs.map → Requester.vue_vue_type_script_setup_true_lang-B8TwXbYR.mjs.map} +1 -1
- package/dist/chunks/{Select-CMw-tWYm.mjs → Select-DAGZDXvI.mjs} +2 -2
- package/dist/chunks/{Select-CMw-tWYm.mjs.map → Select-DAGZDXvI.mjs.map} +1 -1
- package/dist/chunks/{Switch.vue_vue_type_script_setup_true_lang-CCU_d3jW.mjs → Switch.vue_vue_type_script_setup_true_lang-CulPqp7M.mjs} +2 -2
- package/dist/chunks/{Switch.vue_vue_type_script_setup_true_lang-CCU_d3jW.mjs.map → Switch.vue_vue_type_script_setup_true_lang-CulPqp7M.mjs.map} +1 -1
- package/dist/chunks/{Upload.vue_vue_type_script_setup_true_lang-CkxGO85H.mjs → Upload.vue_vue_type_script_setup_true_lang-D07Bhllc.mjs} +2 -2
- package/dist/chunks/{Upload.vue_vue_type_script_setup_true_lang-CkxGO85H.mjs.map → Upload.vue_vue_type_script_setup_true_lang-D07Bhllc.mjs.map} +1 -1
- package/dist/chunks/{Viewer-COLbtcgF.mjs → Viewer-iub6TjoD.mjs} +2 -2
- package/dist/chunks/{Viewer-COLbtcgF.mjs.map → Viewer-iub6TjoD.mjs.map} +1 -1
- package/dist/chunks/{http-DUPsbs2K.mjs → http-Bs-dM076.mjs} +2 -2
- package/dist/chunks/{http-DUPsbs2K.mjs.map → http-Bs-dM076.mjs.map} +1 -1
- package/dist/chunks/{useApiAction-C1CdKGjt.mjs → useApiAction-6_vvf5Fd.mjs} +2 -2
- package/dist/chunks/{useApiAction-C1CdKGjt.mjs.map → useApiAction-6_vvf5Fd.mjs.map} +1 -1
- package/dist/chunks/{useColumnSettings-BDtF5-8R.mjs → useColumnSettings-BYDQdk4o.mjs} +2 -2
- package/dist/chunks/{useColumnSettings-BDtF5-8R.mjs.map → useColumnSettings-BYDQdk4o.mjs.map} +1 -1
- package/dist/chunks/{useOptionsLoader-D0RTB_ar.mjs → useOptionsLoader-Bi8oqNbG.mjs} +2 -2
- package/dist/chunks/{useOptionsLoader-D0RTB_ar.mjs.map → useOptionsLoader-Bi8oqNbG.mjs.map} +1 -1
- package/dist/confirm-button/index.mjs +1 -1
- package/dist/data-form/index.mjs +1 -1
- package/dist/data-grid/index.mjs +1 -1
- package/dist/editable-grid/index.mjs +1 -1
- package/dist/image-upload/index.mjs +1 -1
- package/dist/index.esm.js +21 -21
- package/dist/index.umd.js +2 -2
- package/dist/index.umd.js.map +1 -1
- package/dist/panel/index.mjs +1 -1
- package/dist/panel/style.css +1 -1
- package/dist/prompt-button/index.mjs +1 -1
- package/dist/radio-list/index.mjs +1 -1
- package/dist/requester/index.mjs +1 -1
- package/dist/select/index.mjs +1 -1
- package/dist/style.css +1 -1
- package/dist/switch/index.mjs +1 -1
- package/dist/types/src/components/styles/Panel.vue.d.ts +11 -0
- package/dist/upload/index.mjs +1 -1
- package/dist/viewer/index.mjs +1 -1
- package/llms.txt +658 -0
- package/package.json +3 -2
- package/dist/chunks/Panel-d4chdlTA.mjs.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineComponent as L, useCssVars as T, ref as m, watch as j, computed as w, resolveComponent as b, openBlock as S, createElementBlock as N, normalizeClass as H, createVNode as C, mergeProps as J, withCtx as A, unref as O, toDisplayString as Q, createCommentVNode as V, createBlock as X } from "vue";
|
|
2
2
|
import { Plus as Y } from "@element-plus/icons-vue";
|
|
3
3
|
import { ElMessage as f, ElMessageBox as Z } from "element-plus";
|
|
4
|
-
import { a as _, r as p } from "./http-
|
|
4
|
+
import { a as _, r as p } from "./http-Bs-dM076.mjs";
|
|
5
5
|
import { r as D } from "./linkage-FbL1mcz3.mjs";
|
|
6
6
|
import { h as F, f as ee } from "./props-DAytpx7D.mjs";
|
|
7
7
|
import { _ as te } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
|
|
@@ -190,4 +190,4 @@ const ae = {
|
|
|
190
190
|
export {
|
|
191
191
|
de as W
|
|
192
192
|
};
|
|
193
|
-
//# sourceMappingURL=ImageUpload-
|
|
193
|
+
//# sourceMappingURL=ImageUpload-DGehzaYa.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageUpload-D3JGJjVO.mjs","sources":["../../src/components/upload/ImageUpload.vue"],"sourcesContent":["<template>\r\n <div class=\"wd-image-upload\" :class=\"{ 'is-hide-add': hideAdd }\">\r\n <el-upload\r\n ref=\"uploadRef\"\r\n :action=\"resolvedAction\"\r\n list-type=\"picture-card\"\r\n :accept=\"accept || 'image/*'\"\r\n :limit=\"maxCount\"\r\n :multiple=\"maxCount > 1\"\r\n v-model:file-list=\"innerFileList\"\r\n :before-upload=\"beforeUpload\"\r\n :before-remove=\"beforeRemove\"\r\n :on-success=\"onSuccess\"\r\n :on-error=\"onError\"\r\n :on-preview=\"onPreview\"\r\n :on-exceed=\"onExceed\"\r\n v-bind=\"$attrs\"\r\n >\r\n <el-icon><Plus /></el-icon>\r\n <template #tip>\r\n <div v-if=\"tip\" class=\"el-upload__tip\">{{ tip }}</div>\r\n </template>\r\n </el-upload>\r\n\r\n <!-- 图片大图预览:使用 el-image-viewer 组件(ElementPlus 内置) -->\r\n <el-image-viewer\r\n v-if=\"preview && viewerVisible\"\r\n :url-list=\"viewerSources\"\r\n :initial-index=\"viewerPage - 1\"\r\n @close=\"viewerVisible = false\"\r\n @switch=\"onViewerPageChange\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, watch } from 'vue'\r\nimport { Plus } from '@element-plus/icons-vue'\r\nimport type { UploadFile, UploadFiles, UploadInstance, UploadProps, UploadUserFile } from 'element-plus'\r\nimport { ElMessage, ElMessageBox } from 'element-plus'\r\nimport { request } from '../../lib/core/http'\r\nimport { getGlobalConfig } from '../../lib/core/config'\r\nimport { refreshDataGrid } from '../../lib/core/linkage'\r\nimport { filterProp, headRefreshDatagridProp } from '../common/props'\r\nimport type { PropType } from 'vue'\r\n\r\ndefineOptions({ name: 'WdImageUpload', inheritAttrs: false })\r\n\r\nconst props = defineProps({\r\n ...filterProp,\r\n ...headRefreshDatagridProp,\r\n /** 上传地址 */\r\n api: { type: String, default: '' },\r\n /** 后端删除地址 */\r\n deleteApi: { type: String, default: '' },\r\n /** 删除请求方法 */\r\n deleteMethod: {\r\n type: String as PropType<'get' | 'post' | 'put' | 'delete'>,\r\n default: 'post'\r\n },\r\n /** 删除主键字段 */\r\n primaryKey: { type: String, default: 'id' },\r\n /** 最大图片数量,超限隐藏加号 */\r\n maxCount: { type: Number, default: 8 },\r\n /** 缩略图尺寸(px,兼容属性式字符串写法) */\r\n thumbnailSize: { type: [Number, String], default: 100 },\r\n /** 是否点击缩略图大图预览 */\r\n preview: { type: Boolean, default: true },\r\n /** 接收类型,默认 image/* */\r\n accept: { type: String, default: '' },\r\n /** 单图大小限制(MB) */\r\n maxSize: { type: Number, default: 5 },\r\n /** 提示文案 */\r\n tip: { type: String, default: '' },\r\n /** v-model:已上传图片地址数组 */\r\n modelValue: { type: Array as PropType<string[]>, default: () => [] }\r\n})\r\n\r\nconst emit = defineEmits([\r\n 'update:modelValue',\r\n 'change',\r\n 'success',\r\n 'error',\r\n 'delete-success',\r\n 'preview',\r\n 'exceed',\r\n 'apiBefore',\r\n 'apiSuccess',\r\n 'apiFail',\r\n 'apiException',\r\n 'apiAfter'\r\n])\r\n\r\nconst uploadRef = ref<UploadInstance>()\r\nconst innerFileList = ref<UploadUserFile[]>(\r\n props.modelValue.map((url) => ({ name: url.split('/').pop() || 'image', url }))\r\n)\r\nconst viewerVisible = ref(false)\r\nconst viewerPage = ref(1)\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (val) => {\r\n innerFileList.value = val.map((url) => ({ name: url.split('/').pop() || 'image', url }))\r\n }\r\n)\r\n\r\n/** 仅展示成功图片的地址(用于预览轮播) */\r\nconst viewerSources = computed(() =>\r\n innerFileList.value.map((f) => f.url || (f as any).biz?.url || '').filter(Boolean)\r\n)\r\n\r\n/** 达到上限隐藏加号 */\r\nconst hideAdd = computed(() => innerFileList.value.length >= props.maxCount)\r\n\r\nconst resolvedAction = computed(() => {\r\n if (!props.api) return '#'\r\n if (/^https?:\\/\\//.test(props.api)) return props.api\r\n const prefix = getGlobalConfig().request.urlPrefix || ''\r\n return prefix ? `${prefix.replace(/\\/$/, '')}/${props.api.replace(/^\\//, '')}` : props.api\r\n})\r\n\r\nfunction syncModel() {\r\n const urls = innerFileList.value\r\n .map((f) => f.url || (f as any).biz?.url || (f as any).biz?.path || '')\r\n .filter(Boolean)\r\n emit('update:modelValue', urls)\r\n emit('change', urls)\r\n}\r\n\r\nconst beforeUpload: UploadProps['beforeUpload'] = (rawFile) => {\r\n if (!rawFile.type.startsWith('image/')) {\r\n ElMessage.error('仅支持上传图片文件')\r\n return false\r\n }\r\n if (props.maxSize && rawFile.size / 1024 / 1024 > props.maxSize) {\r\n ElMessage.error(`图片大小不能超过 ${props.maxSize}MB`)\r\n return false\r\n }\r\n emit('apiBefore', { url: props.api, file: rawFile })\r\n return true\r\n}\r\n\r\nconst onSuccess: UploadProps['onSuccess'] = (response, uploadFile, uploadFiles) => {\r\n const cfg = getGlobalConfig()\r\n const { codeName, messageName, dataName } = cfg.response.props\r\n const code = response?.[codeName]\r\n const ok = code === undefined || code === null || Number.isNaN(Number(code)) || Number(code) >= cfg.response.successCode\r\n\r\n ;(uploadFile as any).response = response\r\n if (ok && response?.[dataName]) {\r\n const bizData = response[dataName]\r\n ;(uploadFile as any).biz = bizData\r\n if (bizData && typeof bizData === 'object') {\r\n uploadFile.url = uploadFile.url || bizData.url || bizData.path\r\n } else if (typeof bizData === 'string') {\r\n uploadFile.url = bizData\r\n }\r\n }\r\n\r\n if (ok) {\r\n emit('success', { response, file: uploadFile, files: uploadFiles })\r\n emit('apiSuccess', { data: response?.[dataName], raw: response })\r\n if (props.headRefreshDatagrid) refreshDataGrid(props.headRefreshDatagrid, props.filter)\r\n } else {\r\n ElMessage.error(response?.[messageName] || '上传失败')\r\n // 失败项从列表移除\r\n innerFileList.value = innerFileList.value.filter((f) => f.uid !== uploadFile.uid)\r\n emit('error', { response, file: uploadFile })\r\n emit('apiFail', { code, message: response?.[messageName] })\r\n }\r\n emit('apiAfter', { url: props.api })\r\n syncModel()\r\n}\r\n\r\nconst onError: UploadProps['onError'] = (err, uploadFile) => {\r\n ElMessage.error('上传失败,请稍后重试')\r\n innerFileList.value = innerFileList.value.filter((f) => f.uid !== uploadFile.uid)\r\n emit('error', { error: err, file: uploadFile })\r\n emit('apiException', { error: err, message: err?.message })\r\n emit('apiAfter', { url: props.api, error: err })\r\n syncModel()\r\n}\r\n\r\nconst beforeRemove: UploadProps['beforeRemove'] = async (uploadFile) => {\r\n try {\r\n await ElMessageBox.confirm('确认删除该图片?', '提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n })\r\n } catch {\r\n return false\r\n }\r\n\r\n const biz = (uploadFile as any).biz || uploadFile\r\n const fileId = biz?.[props.primaryKey] ?? (uploadFile.response as any)?.[props.primaryKey]\r\n\r\n if (props.deleteApi && fileId !== undefined && fileId !== null) {\r\n emit('apiBefore', { url: props.deleteApi })\r\n try {\r\n const param = { [props.primaryKey]: fileId }\r\n const result =\r\n props.deleteMethod === 'get'\r\n ? await request.get(props.deleteApi, param)\r\n : props.deleteMethod === 'delete'\r\n ? await request.delete(props.deleteApi, param)\r\n : props.deleteMethod === 'put'\r\n ? await request.put(props.deleteApi, param)\r\n : await request.post(props.deleteApi, param)\r\n if (result.success) {\r\n emit('delete-success', { file: uploadFile, data: result.data })\r\n emit('apiSuccess', { data: result.data })\r\n if (props.headRefreshDatagrid) refreshDataGrid(props.headRefreshDatagrid, props.filter)\r\n } else {\r\n emit('apiFail', { code: result.code, message: result.message })\r\n return false\r\n }\r\n } catch (error: any) {\r\n emit('apiException', { error, message: error?.message })\r\n return false\r\n } finally {\r\n emit('apiAfter', { url: props.deleteApi })\r\n }\r\n } else {\r\n emit('delete-success', { file: uploadFile })\r\n }\r\n return true\r\n}\r\n\r\nconst onPreview: UploadProps['onPreview'] = (uploadFile) => {\r\n emit('preview', { file: uploadFile })\r\n if (!props.preview) return\r\n const idx = viewerSources.value.findIndex((url) => url === (uploadFile.url || (uploadFile as any).biz?.url))\r\n viewerPage.value = idx >= 0 ? idx + 1 : 1\r\n viewerVisible.value = true\r\n}\r\n\r\nfunction onViewerPageChange(index: number) {\r\n viewerPage.value = index + 1\r\n}\r\n\r\nconst onExceed: UploadProps['onExceed'] = () => {\r\n ElMessage.warning(`最多上传 ${props.maxCount} 张图片`)\r\n emit('exceed', { maxCount: props.maxCount })\r\n}\r\n\r\nfunction clearFiles() {\r\n uploadRef.value?.clearFiles()\r\n innerFileList.value = []\r\n syncModel()\r\n}\r\n\r\ndefineExpose({ clearFiles, uploadRef })\r\n</script>\r\n\r\n<style scoped>\r\n.wd-image-upload :deep(.el-upload-list--picture-card .el-upload-list__item),\r\n.wd-image-upload :deep(.el-upload--picture-card) {\r\n width: v-bind('thumbnailSize + \"px\"');\r\n height: v-bind('thumbnailSize + \"px\"');\r\n}\r\n.wd-image-upload.is-hide-add :deep(.el-upload--picture-card),\r\n.wd-image-upload :deep(.is-hide-add .el-upload--picture-card) {\r\n display: none;\r\n}\r\n</style>\r\n"],"names":["props","__props","emit","__emit","uploadRef","ref","innerFileList","url","viewerVisible","viewerPage","watch","val","viewerSources","computed","f","_a","hideAdd","resolvedAction","prefix","getGlobalConfig","syncModel","urls","_b","beforeUpload","rawFile","ElMessage","onSuccess","response","uploadFile","uploadFiles","cfg","codeName","messageName","dataName","code","ok","bizData","refreshDataGrid","onError","err","beforeRemove","ElMessageBox","biz","fileId","param","result","request","error","onPreview","idx","onViewerPageChange","index","onExceed","clearFiles","__expose","_createElementBlock","_normalizeClass","_createVNode","_component_el_upload","_mergeProps","$event","$attrs","_hoisted_1","_toDisplayString","_component_el_icon","_unref","Plus","_createBlock","_component_el_image_viewer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ImageUpload-DGehzaYa.mjs","sources":["../../src/components/upload/ImageUpload.vue"],"sourcesContent":["<template>\r\n <div class=\"wd-image-upload\" :class=\"{ 'is-hide-add': hideAdd }\">\r\n <el-upload\r\n ref=\"uploadRef\"\r\n :action=\"resolvedAction\"\r\n list-type=\"picture-card\"\r\n :accept=\"accept || 'image/*'\"\r\n :limit=\"maxCount\"\r\n :multiple=\"maxCount > 1\"\r\n v-model:file-list=\"innerFileList\"\r\n :before-upload=\"beforeUpload\"\r\n :before-remove=\"beforeRemove\"\r\n :on-success=\"onSuccess\"\r\n :on-error=\"onError\"\r\n :on-preview=\"onPreview\"\r\n :on-exceed=\"onExceed\"\r\n v-bind=\"$attrs\"\r\n >\r\n <el-icon><Plus /></el-icon>\r\n <template #tip>\r\n <div v-if=\"tip\" class=\"el-upload__tip\">{{ tip }}</div>\r\n </template>\r\n </el-upload>\r\n\r\n <!-- 图片大图预览:使用 el-image-viewer 组件(ElementPlus 内置) -->\r\n <el-image-viewer\r\n v-if=\"preview && viewerVisible\"\r\n :url-list=\"viewerSources\"\r\n :initial-index=\"viewerPage - 1\"\r\n @close=\"viewerVisible = false\"\r\n @switch=\"onViewerPageChange\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, watch } from 'vue'\r\nimport { Plus } from '@element-plus/icons-vue'\r\nimport type { UploadFile, UploadFiles, UploadInstance, UploadProps, UploadUserFile } from 'element-plus'\r\nimport { ElMessage, ElMessageBox } from 'element-plus'\r\nimport { request } from '../../lib/core/http'\r\nimport { getGlobalConfig } from '../../lib/core/config'\r\nimport { refreshDataGrid } from '../../lib/core/linkage'\r\nimport { filterProp, headRefreshDatagridProp } from '../common/props'\r\nimport type { PropType } from 'vue'\r\n\r\ndefineOptions({ name: 'WdImageUpload', inheritAttrs: false })\r\n\r\nconst props = defineProps({\r\n ...filterProp,\r\n ...headRefreshDatagridProp,\r\n /** 上传地址 */\r\n api: { type: String, default: '' },\r\n /** 后端删除地址 */\r\n deleteApi: { type: String, default: '' },\r\n /** 删除请求方法 */\r\n deleteMethod: {\r\n type: String as PropType<'get' | 'post' | 'put' | 'delete'>,\r\n default: 'post'\r\n },\r\n /** 删除主键字段 */\r\n primaryKey: { type: String, default: 'id' },\r\n /** 最大图片数量,超限隐藏加号 */\r\n maxCount: { type: Number, default: 8 },\r\n /** 缩略图尺寸(px,兼容属性式字符串写法) */\r\n thumbnailSize: { type: [Number, String], default: 100 },\r\n /** 是否点击缩略图大图预览 */\r\n preview: { type: Boolean, default: true },\r\n /** 接收类型,默认 image/* */\r\n accept: { type: String, default: '' },\r\n /** 单图大小限制(MB) */\r\n maxSize: { type: Number, default: 5 },\r\n /** 提示文案 */\r\n tip: { type: String, default: '' },\r\n /** v-model:已上传图片地址数组 */\r\n modelValue: { type: Array as PropType<string[]>, default: () => [] }\r\n})\r\n\r\nconst emit = defineEmits([\r\n 'update:modelValue',\r\n 'change',\r\n 'success',\r\n 'error',\r\n 'delete-success',\r\n 'preview',\r\n 'exceed',\r\n 'apiBefore',\r\n 'apiSuccess',\r\n 'apiFail',\r\n 'apiException',\r\n 'apiAfter'\r\n])\r\n\r\nconst uploadRef = ref<UploadInstance>()\r\nconst innerFileList = ref<UploadUserFile[]>(\r\n props.modelValue.map((url) => ({ name: url.split('/').pop() || 'image', url }))\r\n)\r\nconst viewerVisible = ref(false)\r\nconst viewerPage = ref(1)\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (val) => {\r\n innerFileList.value = val.map((url) => ({ name: url.split('/').pop() || 'image', url }))\r\n }\r\n)\r\n\r\n/** 仅展示成功图片的地址(用于预览轮播) */\r\nconst viewerSources = computed(() =>\r\n innerFileList.value.map((f) => f.url || (f as any).biz?.url || '').filter(Boolean)\r\n)\r\n\r\n/** 达到上限隐藏加号 */\r\nconst hideAdd = computed(() => innerFileList.value.length >= props.maxCount)\r\n\r\nconst resolvedAction = computed(() => {\r\n if (!props.api) return '#'\r\n if (/^https?:\\/\\//.test(props.api)) return props.api\r\n const prefix = getGlobalConfig().request.urlPrefix || ''\r\n return prefix ? `${prefix.replace(/\\/$/, '')}/${props.api.replace(/^\\//, '')}` : props.api\r\n})\r\n\r\nfunction syncModel() {\r\n const urls = innerFileList.value\r\n .map((f) => f.url || (f as any).biz?.url || (f as any).biz?.path || '')\r\n .filter(Boolean)\r\n emit('update:modelValue', urls)\r\n emit('change', urls)\r\n}\r\n\r\nconst beforeUpload: UploadProps['beforeUpload'] = (rawFile) => {\r\n if (!rawFile.type.startsWith('image/')) {\r\n ElMessage.error('仅支持上传图片文件')\r\n return false\r\n }\r\n if (props.maxSize && rawFile.size / 1024 / 1024 > props.maxSize) {\r\n ElMessage.error(`图片大小不能超过 ${props.maxSize}MB`)\r\n return false\r\n }\r\n emit('apiBefore', { url: props.api, file: rawFile })\r\n return true\r\n}\r\n\r\nconst onSuccess: UploadProps['onSuccess'] = (response, uploadFile, uploadFiles) => {\r\n const cfg = getGlobalConfig()\r\n const { codeName, messageName, dataName } = cfg.response.props\r\n const code = response?.[codeName]\r\n const ok = code === undefined || code === null || Number.isNaN(Number(code)) || Number(code) >= cfg.response.successCode\r\n\r\n ;(uploadFile as any).response = response\r\n if (ok && response?.[dataName]) {\r\n const bizData = response[dataName]\r\n ;(uploadFile as any).biz = bizData\r\n if (bizData && typeof bizData === 'object') {\r\n uploadFile.url = uploadFile.url || bizData.url || bizData.path\r\n } else if (typeof bizData === 'string') {\r\n uploadFile.url = bizData\r\n }\r\n }\r\n\r\n if (ok) {\r\n emit('success', { response, file: uploadFile, files: uploadFiles })\r\n emit('apiSuccess', { data: response?.[dataName], raw: response })\r\n if (props.headRefreshDatagrid) refreshDataGrid(props.headRefreshDatagrid, props.filter)\r\n } else {\r\n ElMessage.error(response?.[messageName] || '上传失败')\r\n // 失败项从列表移除\r\n innerFileList.value = innerFileList.value.filter((f) => f.uid !== uploadFile.uid)\r\n emit('error', { response, file: uploadFile })\r\n emit('apiFail', { code, message: response?.[messageName] })\r\n }\r\n emit('apiAfter', { url: props.api })\r\n syncModel()\r\n}\r\n\r\nconst onError: UploadProps['onError'] = (err, uploadFile) => {\r\n ElMessage.error('上传失败,请稍后重试')\r\n innerFileList.value = innerFileList.value.filter((f) => f.uid !== uploadFile.uid)\r\n emit('error', { error: err, file: uploadFile })\r\n emit('apiException', { error: err, message: err?.message })\r\n emit('apiAfter', { url: props.api, error: err })\r\n syncModel()\r\n}\r\n\r\nconst beforeRemove: UploadProps['beforeRemove'] = async (uploadFile) => {\r\n try {\r\n await ElMessageBox.confirm('确认删除该图片?', '提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n })\r\n } catch {\r\n return false\r\n }\r\n\r\n const biz = (uploadFile as any).biz || uploadFile\r\n const fileId = biz?.[props.primaryKey] ?? (uploadFile.response as any)?.[props.primaryKey]\r\n\r\n if (props.deleteApi && fileId !== undefined && fileId !== null) {\r\n emit('apiBefore', { url: props.deleteApi })\r\n try {\r\n const param = { [props.primaryKey]: fileId }\r\n const result =\r\n props.deleteMethod === 'get'\r\n ? await request.get(props.deleteApi, param)\r\n : props.deleteMethod === 'delete'\r\n ? await request.delete(props.deleteApi, param)\r\n : props.deleteMethod === 'put'\r\n ? await request.put(props.deleteApi, param)\r\n : await request.post(props.deleteApi, param)\r\n if (result.success) {\r\n emit('delete-success', { file: uploadFile, data: result.data })\r\n emit('apiSuccess', { data: result.data })\r\n if (props.headRefreshDatagrid) refreshDataGrid(props.headRefreshDatagrid, props.filter)\r\n } else {\r\n emit('apiFail', { code: result.code, message: result.message })\r\n return false\r\n }\r\n } catch (error: any) {\r\n emit('apiException', { error, message: error?.message })\r\n return false\r\n } finally {\r\n emit('apiAfter', { url: props.deleteApi })\r\n }\r\n } else {\r\n emit('delete-success', { file: uploadFile })\r\n }\r\n return true\r\n}\r\n\r\nconst onPreview: UploadProps['onPreview'] = (uploadFile) => {\r\n emit('preview', { file: uploadFile })\r\n if (!props.preview) return\r\n const idx = viewerSources.value.findIndex((url) => url === (uploadFile.url || (uploadFile as any).biz?.url))\r\n viewerPage.value = idx >= 0 ? idx + 1 : 1\r\n viewerVisible.value = true\r\n}\r\n\r\nfunction onViewerPageChange(index: number) {\r\n viewerPage.value = index + 1\r\n}\r\n\r\nconst onExceed: UploadProps['onExceed'] = () => {\r\n ElMessage.warning(`最多上传 ${props.maxCount} 张图片`)\r\n emit('exceed', { maxCount: props.maxCount })\r\n}\r\n\r\nfunction clearFiles() {\r\n uploadRef.value?.clearFiles()\r\n innerFileList.value = []\r\n syncModel()\r\n}\r\n\r\ndefineExpose({ clearFiles, uploadRef })\r\n</script>\r\n\r\n<style scoped>\r\n.wd-image-upload :deep(.el-upload-list--picture-card .el-upload-list__item),\r\n.wd-image-upload :deep(.el-upload--picture-card) {\r\n width: v-bind('thumbnailSize + \"px\"');\r\n height: v-bind('thumbnailSize + \"px\"');\r\n}\r\n.wd-image-upload.is-hide-add :deep(.el-upload--picture-card),\r\n.wd-image-upload :deep(.is-hide-add .el-upload--picture-card) {\r\n display: none;\r\n}\r\n</style>\r\n"],"names":["props","__props","emit","__emit","uploadRef","ref","innerFileList","url","viewerVisible","viewerPage","watch","val","viewerSources","computed","f","_a","hideAdd","resolvedAction","prefix","getGlobalConfig","syncModel","urls","_b","beforeUpload","rawFile","ElMessage","onSuccess","response","uploadFile","uploadFiles","cfg","codeName","messageName","dataName","code","ok","bizData","refreshDataGrid","onError","err","beforeRemove","ElMessageBox","biz","fileId","param","result","request","error","onPreview","idx","onViewerPageChange","index","onExceed","clearFiles","__expose","_createElementBlock","_normalizeClass","_createVNode","_component_el_upload","_mergeProps","$event","$attrs","_hoisted_1","_toDisplayString","_component_el_icon","_unref","Plus","_createBlock","_component_el_image_viewer"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDA,UAAMA,IAAQC,GA8BRC,IAAOC,GAePC,IAAYC,EAAA,GACZC,IAAgBD;AAAA,MACpBL,EAAM,WAAW,IAAI,CAACO,OAAS,EAAE,MAAMA,EAAI,MAAM,GAAG,EAAE,IAAA,KAAS,SAAS,KAAAA,IAAM;AAAA,IAAA,GAE1EC,IAAgBH,EAAI,EAAK,GACzBI,IAAaJ,EAAI,CAAC;AAExB,IAAAK;AAAA,MACE,MAAMV,EAAM;AAAA,MACZ,CAACW,MAAQ;AACP,QAAAL,EAAc,QAAQK,EAAI,IAAI,CAACJ,OAAS,EAAE,MAAMA,EAAI,MAAM,GAAG,EAAE,IAAA,KAAS,SAAS,KAAAA,IAAM;AAAA,MACzF;AAAA,IAAA;AAIF,UAAMK,IAAgBC;AAAA,MAAS,MAC7BP,EAAc,MAAM,IAAI,CAACQ,MAAA;;AAAM,eAAAA,EAAE,SAAQC,IAAAD,EAAU,QAAV,gBAAAC,EAAe,QAAO;AAAA,OAAE,EAAE,OAAO,OAAO;AAAA,IAAA,GAI7EC,IAAUH,EAAS,MAAMP,EAAc,MAAM,UAAUN,EAAM,QAAQ,GAErEiB,IAAiBJ,EAAS,MAAM;AACpC,UAAI,CAACb,EAAM,IAAK,QAAO;AACvB,UAAI,eAAe,KAAKA,EAAM,GAAG,UAAUA,EAAM;AACjD,YAAMkB,IAASC,EAAA,EAAkB,QAAQ,aAAa;AACtD,aAAOD,IAAS,GAAGA,EAAO,QAAQ,OAAO,EAAE,CAAC,IAAIlB,EAAM,IAAI,QAAQ,OAAO,EAAE,CAAC,KAAKA,EAAM;AAAA,IACzF,CAAC;AAED,aAASoB,IAAY;AACnB,YAAMC,IAAOf,EAAc,MACxB,IAAI,CAACQ;;AAAM,eAAAA,EAAE,SAAQC,IAAAD,EAAU,QAAV,gBAAAC,EAAe,UAAQO,IAAAR,EAAU,QAAV,gBAAAQ,EAAe,SAAQ;AAAA,OAAE,EACrE,OAAO,OAAO;AACjB,MAAApB,EAAK,qBAAqBmB,CAAI,GAC9BnB,EAAK,UAAUmB,CAAI;AAAA,IACrB;AAEA,UAAME,IAA4C,CAACC,MAC5CA,EAAQ,KAAK,WAAW,QAAQ,IAIjCxB,EAAM,WAAWwB,EAAQ,OAAO,OAAO,OAAOxB,EAAM,WACtDyB,EAAU,MAAM,YAAYzB,EAAM,OAAO,IAAI,GACtC,OAETE,EAAK,aAAa,EAAE,KAAKF,EAAM,KAAK,MAAMwB,GAAS,GAC5C,OARLC,EAAU,MAAM,WAAW,GACpB,KAULC,IAAsC,CAACC,GAAUC,GAAYC,MAAgB;AACjF,YAAMC,IAAMX,EAAA,GACN,EAAE,UAAAY,GAAU,aAAAC,GAAa,UAAAC,EAAA,IAAaH,EAAI,SAAS,OACnDI,IAAOP,KAAA,gBAAAA,EAAWI,IAClBI,IAA2BD,KAAS,QAAQ,OAAO,MAAM,OAAOA,CAAI,CAAC,KAAK,OAAOA,CAAI,KAAKJ,EAAI,SAAS;AAG7G,UADEF,EAAmB,WAAWD,GAC5BQ,MAAMR,KAAA,QAAAA,EAAWM,KAAW;AAC9B,cAAMG,IAAUT,EAASM,CAAQ;AAC/B,QAAAL,EAAmB,MAAMQ,GACvBA,KAAW,OAAOA,KAAY,WAChCR,EAAW,MAAMA,EAAW,OAAOQ,EAAQ,OAAOA,EAAQ,OACjD,OAAOA,KAAY,aAC5BR,EAAW,MAAMQ;AAAA,MAErB;AAEA,MAAID,KACFjC,EAAK,WAAW,EAAE,UAAAyB,GAAU,MAAMC,GAAY,OAAOC,GAAa,GAClE3B,EAAK,cAAc,EAAE,MAAMyB,KAAA,gBAAAA,EAAWM,IAAW,KAAKN,GAAU,GAC5D3B,EAAM,uBAAqBqC,EAAgBrC,EAAM,qBAAqBA,EAAM,MAAM,MAEtFyB,EAAU,OAAME,KAAA,gBAAAA,EAAWK,OAAgB,MAAM,GAEjD1B,EAAc,QAAQA,EAAc,MAAM,OAAO,CAACQ,MAAMA,EAAE,QAAQc,EAAW,GAAG,GAChF1B,EAAK,SAAS,EAAE,UAAAyB,GAAU,MAAMC,GAAY,GAC5C1B,EAAK,WAAW,EAAE,MAAAgC,GAAM,SAASP,KAAA,gBAAAA,EAAWK,IAAc,IAE5D9B,EAAK,YAAY,EAAE,KAAKF,EAAM,KAAK,GACnCoB,EAAA;AAAA,IACF,GAEMkB,IAAkC,CAACC,GAAKX,MAAe;AAC3D,MAAAH,EAAU,MAAM,YAAY,GAC5BnB,EAAc,QAAQA,EAAc,MAAM,OAAO,CAACQ,MAAMA,EAAE,QAAQc,EAAW,GAAG,GAChF1B,EAAK,SAAS,EAAE,OAAOqC,GAAK,MAAMX,GAAY,GAC9C1B,EAAK,gBAAgB,EAAE,OAAOqC,GAAK,SAASA,KAAA,gBAAAA,EAAK,SAAS,GAC1DrC,EAAK,YAAY,EAAE,KAAKF,EAAM,KAAK,OAAOuC,GAAK,GAC/CnB,EAAA;AAAA,IACF,GAEMoB,IAA4C,OAAOZ,MAAe;;AACtE,UAAI;AACF,cAAMa,EAAa,QAAQ,YAAY,MAAM;AAAA,UAC3C,mBAAmB;AAAA,UACnB,kBAAkB;AAAA,UAClB,MAAM;AAAA,QAAA,CACP;AAAA,MACH,QAAQ;AACN,eAAO;AAAA,MACT;AAEA,YAAMC,IAAOd,EAAmB,OAAOA,GACjCe,KAASD,KAAA,gBAAAA,EAAM1C,EAAM,kBAAgBe,IAAAa,EAAW,aAAX,gBAAAb,EAA8Bf,EAAM;AAE/E,UAAIA,EAAM,aAAa2C,MAAW,UAAaA,MAAW,MAAM;AAC9D,QAAAzC,EAAK,aAAa,EAAE,KAAKF,EAAM,WAAW;AAC1C,YAAI;AACF,gBAAM4C,IAAQ,EAAE,CAAC5C,EAAM,UAAU,GAAG2C,EAAA,GAC9BE,IACJ7C,EAAM,iBAAiB,QACnB,MAAM8C,EAAQ,IAAI9C,EAAM,WAAW4C,CAAK,IACxC5C,EAAM,iBAAiB,WACrB,MAAM8C,EAAQ,OAAO9C,EAAM,WAAW4C,CAAK,IAC3C5C,EAAM,iBAAiB,QACrB,MAAM8C,EAAQ,IAAI9C,EAAM,WAAW4C,CAAK,IACxC,MAAME,EAAQ,KAAK9C,EAAM,WAAW4C,CAAK;AACnD,cAAIC,EAAO;AACT,YAAA3C,EAAK,kBAAkB,EAAE,MAAM0B,GAAY,MAAMiB,EAAO,MAAM,GAC9D3C,EAAK,cAAc,EAAE,MAAM2C,EAAO,MAAM,GACpC7C,EAAM,uBAAqBqC,EAAgBrC,EAAM,qBAAqBA,EAAM,MAAM;AAAA;AAEtF,mBAAAE,EAAK,WAAW,EAAE,MAAM2C,EAAO,MAAM,SAASA,EAAO,SAAS,GACvD;AAAA,QAEX,SAASE,GAAY;AACnB,iBAAA7C,EAAK,gBAAgB,EAAE,OAAA6C,GAAO,SAASA,KAAA,gBAAAA,EAAO,SAAS,GAChD;AAAA,QACT,UAAA;AACE,UAAA7C,EAAK,YAAY,EAAE,KAAKF,EAAM,WAAW;AAAA,QAC3C;AAAA,MACF;AACE,QAAAE,EAAK,kBAAkB,EAAE,MAAM0B,EAAA,CAAY;AAE7C,aAAO;AAAA,IACT,GAEMoB,IAAsC,CAACpB,MAAe;AAE1D,UADA1B,EAAK,WAAW,EAAE,MAAM0B,EAAA,CAAY,GAChC,CAAC5B,EAAM,QAAS;AACpB,YAAMiD,IAAMrC,EAAc,MAAM,UAAU,CAACL,MAAA;;AAAQ,eAAAA,OAASqB,EAAW,SAAQb,IAAAa,EAAmB,QAAnB,gBAAAb,EAAwB;AAAA,OAAI;AAC3G,MAAAN,EAAW,QAAQwC,KAAO,IAAIA,IAAM,IAAI,GACxCzC,EAAc,QAAQ;AAAA,IACxB;AAEA,aAAS0C,EAAmBC,GAAe;AACzC,MAAA1C,EAAW,QAAQ0C,IAAQ;AAAA,IAC7B;AAEA,UAAMC,IAAoC,MAAM;AAC9C,MAAA3B,EAAU,QAAQ,QAAQzB,EAAM,QAAQ,MAAM,GAC9CE,EAAK,UAAU,EAAE,UAAUF,EAAM,UAAU;AAAA,IAC7C;AAEA,aAASqD,IAAa;;AACpB,OAAAtC,IAAAX,EAAU,UAAV,QAAAW,EAAiB,cACjBT,EAAc,QAAQ,CAAA,GACtBc,EAAA;AAAA,IACF;AAEA,WAAAkC,EAAa,EAAE,YAAAD,GAAY,WAAAjD,GAAW;;kBA5PpCmD,EA+BM,OAAA;AAAA,QA/BD,OAAKC,EAAA,CAAC,mBAAiB,EAAA,eAA0BxC,EAAA,OAAO,CAAA;AAAA,MAAA;QAC3DyC,EAoBYC,GApBZC,EAoBY;AAAA,mBAnBN;AAAA,UAAJ,KAAIvD;AAAA,UACH,QAAQa,EAAA;AAAA,UACT,aAAU;AAAA,UACT,QAAQhB,EAAA,UAAM;AAAA,UACd,OAAOA,EAAA;AAAA,UACP,UAAUA,EAAA,WAAQ;AAAA,UACX,aAAWK,EAAA;AAAA,sDAAAA,EAAa,QAAAsD;AAAA,UAC/B,iBAAerC;AAAA,UACf,iBAAeiB;AAAA,UACf,cAAYd;AAAA,UACZ,YAAUY;AAAA,UACV,cAAYU;AAAA,UACZ,aAAWI;AAAA,QAAA,GACJS,EAAAA,MAAM,GAAA;AAAA,UAGH,OACT,MAAsD;AAAA,YAA3C5D,EAAA,YAAXsD,EAAsD,OAAtDO,IAAsDC,EAAZ9D,EAAA,GAAG,GAAA,CAAA;;qBAF/C,MAA2B;AAAA,YAA3BwD,EAA2BO,GAAA,MAAA;AAAA,yBAAlB,MAAQ;AAAA,gBAARP,EAAQQ,EAAAC,CAAA,CAAA;AAAA,cAAA;;;;;;QAQXjE,EAAA,WAAWO,EAAA,cADnB2D,EAMEC,GAAA;AAAA;UAJC,YAAUxD,EAAA;AAAA,UACV,iBAAeH,EAAA,QAAU;AAAA,UACzB,gCAAOD,EAAA,QAAa;AAAA,UACpB,UAAQ0C;AAAA,QAAA;;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineComponent as
|
|
1
|
+
import { defineComponent as b, ref as k, watch as g, computed as C, resolveComponent as $, openBlock as o, createElementBlock as n, normalizeClass as c, withKeys as p, withModifiers as a, createElementVNode as s, renderSlot as u, toDisplayString as h, createCommentVNode as d, createBlock as B, withCtx as S, createVNode as K, unref as x } from "vue";
|
|
2
2
|
import { ArrowDown as N } from "@element-plus/icons-vue";
|
|
3
3
|
import { _ as P } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
|
|
4
4
|
const V = ["aria-expanded", "onKeydown"], W = { class: "wd-panel__header-main" }, D = { class: "wd-panel__title" }, E = {
|
|
@@ -7,7 +7,7 @@ const V = ["aria-expanded", "onKeydown"], W = { class: "wd-panel__header-main" }
|
|
|
7
7
|
}, z = { class: "wd-panel__content-inner" }, A = { class: "wd-panel__body" }, H = {
|
|
8
8
|
key: 0,
|
|
9
9
|
class: "wd-panel__footer"
|
|
10
|
-
}, I = /* @__PURE__ */
|
|
10
|
+
}, I = /* @__PURE__ */ b({
|
|
11
11
|
name: "WdPanel",
|
|
12
12
|
__name: "Panel",
|
|
13
13
|
props: {
|
|
@@ -23,46 +23,48 @@ const V = ["aria-expanded", "onKeydown"], W = { class: "wd-panel__header-main" }
|
|
|
23
23
|
shadow: {
|
|
24
24
|
type: String,
|
|
25
25
|
default: "hover"
|
|
26
|
-
}
|
|
26
|
+
},
|
|
27
|
+
/** 是否显示外边框(嵌套在卡片/弹层等容器内时可关闭) */
|
|
28
|
+
border: { type: Boolean, default: !0 }
|
|
27
29
|
},
|
|
28
30
|
emits: ["update:opened", "change"],
|
|
29
|
-
setup(t, { emit:
|
|
30
|
-
const
|
|
31
|
+
setup(t, { emit: y }) {
|
|
32
|
+
const i = t, f = y, v = k(i.opened);
|
|
31
33
|
g(
|
|
32
|
-
() =>
|
|
34
|
+
() => i.opened,
|
|
33
35
|
(e) => {
|
|
34
36
|
v.value = e;
|
|
35
37
|
}
|
|
36
38
|
);
|
|
37
39
|
const l = C(() => v.value);
|
|
38
|
-
function
|
|
39
|
-
if (!
|
|
40
|
+
function r() {
|
|
41
|
+
if (!i.collapsible) return;
|
|
40
42
|
const e = !l.value;
|
|
41
|
-
v.value = e,
|
|
43
|
+
v.value = e, f("update:opened", e), f("change", e);
|
|
42
44
|
}
|
|
43
|
-
function
|
|
44
|
-
|
|
45
|
+
function w() {
|
|
46
|
+
i.collapsible && r();
|
|
45
47
|
}
|
|
46
48
|
return (e, m) => {
|
|
47
|
-
const
|
|
49
|
+
const _ = $("el-icon");
|
|
48
50
|
return o(), n("div", {
|
|
49
|
-
class:
|
|
51
|
+
class: c(["wd-panel", [`wd-panel--shadow-${t.shadow}`, { "wd-panel--no-border": !t.border }]])
|
|
50
52
|
}, [
|
|
51
53
|
t.title || e.$slots.title ? (o(), n("div", {
|
|
52
54
|
key: 0,
|
|
53
|
-
class:
|
|
55
|
+
class: c(["wd-panel__header", { "is-collapsible": t.collapsible }]),
|
|
54
56
|
role: "heading",
|
|
55
57
|
"aria-expanded": t.collapsible ? l.value : void 0,
|
|
56
|
-
onClick:
|
|
58
|
+
onClick: w,
|
|
57
59
|
onKeydown: [
|
|
58
|
-
p(a(
|
|
59
|
-
p(a(
|
|
60
|
+
p(a(w, ["prevent"]), ["enter"]),
|
|
61
|
+
p(a(w, ["prevent"]), ["space"])
|
|
60
62
|
]
|
|
61
63
|
}, [
|
|
62
64
|
s("div", W, [
|
|
63
65
|
u(e.$slots, "title", {}, () => [
|
|
64
66
|
s("span", D, h(t.title), 1),
|
|
65
|
-
t.description ? (o(), n("span", E, h(t.description), 1)) :
|
|
67
|
+
t.description ? (o(), n("span", E, h(t.description), 1)) : d("", !0)
|
|
66
68
|
], !0)
|
|
67
69
|
]),
|
|
68
70
|
e.$slots.extra || t.collapsible ? (o(), n("div", {
|
|
@@ -72,27 +74,27 @@ const V = ["aria-expanded", "onKeydown"], W = { class: "wd-panel__header-main" }
|
|
|
72
74
|
}, ["stop"]))
|
|
73
75
|
}, [
|
|
74
76
|
u(e.$slots, "extra", {}, void 0, !0),
|
|
75
|
-
t.collapsible ? (o(),
|
|
77
|
+
t.collapsible ? (o(), B(_, {
|
|
76
78
|
key: 0,
|
|
77
|
-
class:
|
|
79
|
+
class: c(["wd-panel__collapse-icon", { "is-collapsed": !l.value }]),
|
|
78
80
|
role: "button",
|
|
79
81
|
"aria-label": l.value ? "收起" : "展开",
|
|
80
82
|
tabindex: "0",
|
|
81
|
-
onClick:
|
|
83
|
+
onClick: r,
|
|
82
84
|
onKeydown: [
|
|
83
|
-
p(a(
|
|
84
|
-
p(a(
|
|
85
|
+
p(a(r, ["prevent"]), ["enter"]),
|
|
86
|
+
p(a(r, ["prevent"]), ["space"])
|
|
85
87
|
]
|
|
86
88
|
}, {
|
|
87
|
-
default:
|
|
89
|
+
default: S(() => [
|
|
88
90
|
K(x(N))
|
|
89
91
|
]),
|
|
90
92
|
_: 1
|
|
91
|
-
}, 8, ["class", "aria-label", "onKeydown"])) :
|
|
92
|
-
])) :
|
|
93
|
-
], 42, V)) :
|
|
93
|
+
}, 8, ["class", "aria-label", "onKeydown"])) : d("", !0)
|
|
94
|
+
])) : d("", !0)
|
|
95
|
+
], 42, V)) : d("", !0),
|
|
94
96
|
s("div", {
|
|
95
|
-
class:
|
|
97
|
+
class: c(["wd-panel__content", { "is-collapsed": t.collapsible && !l.value }])
|
|
96
98
|
}, [
|
|
97
99
|
s("div", z, [
|
|
98
100
|
s("div", A, [
|
|
@@ -100,14 +102,14 @@ const V = ["aria-expanded", "onKeydown"], W = { class: "wd-panel__header-main" }
|
|
|
100
102
|
]),
|
|
101
103
|
e.$slots.footer ? (o(), n("div", H, [
|
|
102
104
|
u(e.$slots, "footer", {}, void 0, !0)
|
|
103
|
-
])) :
|
|
105
|
+
])) : d("", !0)
|
|
104
106
|
])
|
|
105
107
|
], 2)
|
|
106
108
|
], 2);
|
|
107
109
|
};
|
|
108
110
|
}
|
|
109
|
-
}), q = /* @__PURE__ */ P(I, [["__scopeId", "data-v-
|
|
111
|
+
}), q = /* @__PURE__ */ P(I, [["__scopeId", "data-v-998424ce"]]);
|
|
110
112
|
export {
|
|
111
113
|
q as W
|
|
112
114
|
};
|
|
113
|
-
//# sourceMappingURL=Panel-
|
|
115
|
+
//# sourceMappingURL=Panel-CrRqBTj6.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Panel-CrRqBTj6.mjs","sources":["../../src/components/styles/Panel.vue"],"sourcesContent":["<template>\r\n <div class=\"wd-panel\" :class=\"[`wd-panel--shadow-${shadow}`, { 'wd-panel--no-border': !border }]\">\r\n <div\r\n v-if=\"title || $slots.title\"\r\n class=\"wd-panel__header\"\r\n :class=\"{ 'is-collapsible': collapsible }\"\r\n role=\"heading\"\r\n :aria-expanded=\"collapsible ? openedState : undefined\"\r\n @click=\"onHeaderClick\"\r\n @keydown.enter.prevent=\"onHeaderClick\"\r\n @keydown.space.prevent=\"onHeaderClick\"\r\n >\r\n <div class=\"wd-panel__header-main\">\r\n <slot name=\"title\">\r\n <span class=\"wd-panel__title\">{{ title }}</span>\r\n <span v-if=\"description\" class=\"wd-panel__description\">{{ description }}</span>\r\n </slot>\r\n </div>\r\n <div v-if=\"$slots.extra || collapsible\" class=\"wd-panel__header-extra\" @click.stop>\r\n <slot name=\"extra\" />\r\n <el-icon\r\n v-if=\"collapsible\"\r\n class=\"wd-panel__collapse-icon\"\r\n :class=\"{ 'is-collapsed': !openedState }\"\r\n role=\"button\"\r\n :aria-label=\"openedState ? '收起' : '展开'\"\r\n tabindex=\"0\"\r\n @click=\"toggle\"\r\n @keydown.enter.prevent=\"toggle\"\r\n @keydown.space.prevent=\"toggle\"\r\n >\r\n <ArrowDown />\r\n </el-icon>\r\n </div>\r\n </div>\r\n <div class=\"wd-panel__content\" :class=\"{ 'is-collapsed': collapsible && !openedState }\">\r\n <div class=\"wd-panel__content-inner\">\r\n <div class=\"wd-panel__body\">\r\n <slot />\r\n </div>\r\n <div v-if=\"$slots.footer\" class=\"wd-panel__footer\">\r\n <slot name=\"footer\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, watch, type PropType } from 'vue'\r\nimport { ArrowDown } from '@element-plus/icons-vue'\r\n\r\ndefineOptions({ name: 'WdPanel' })\r\n\r\nconst props = defineProps({\r\n /** 面板标题 */\r\n title: { type: String, default: '' },\r\n /** 标题旁描述 */\r\n description: { type: String, default: '' },\r\n /** 是否可折叠(折叠时隐藏主体与底部) */\r\n collapsible: { type: Boolean, default: false },\r\n /** 展开状态(配合 collapsible 使用,支持 v-model:opened) */\r\n opened: { type: Boolean, default: true },\r\n /** 阴影策略:always=常驻阴影 / hover=悬停时显示 / never=无阴影 */\r\n shadow: {\r\n type: String as PropType<'always' | 'hover' | 'never'>,\r\n default: 'hover'\r\n },\r\n /** 是否显示外边框(嵌套在卡片/弹层等容器内时可关闭) */\r\n border: { type: Boolean, default: true }\r\n})\r\n\r\nconst emit = defineEmits<{\r\n (e: 'update:opened', value: boolean): void\r\n (e: 'change', value: boolean): void\r\n}>()\r\n\r\nconst innerOpened = ref(props.opened)\r\n// 受控(v-model:opened)时跟随外部变化,非受控时使用内部状态\r\nwatch(\r\n () => props.opened,\r\n (v) => {\r\n innerOpened.value = v\r\n }\r\n)\r\nconst openedState = computed(() => innerOpened.value)\r\n\r\nfunction toggle() {\r\n if (!props.collapsible) return\r\n const next = !openedState.value\r\n innerOpened.value = next\r\n emit('update:opened', next)\r\n emit('change', next)\r\n}\r\n\r\nfunction onHeaderClick() {\r\n if (props.collapsible) toggle()\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.wd-panel {\r\n width: 100%;\r\n margin-bottom: var(--wd-spacing-base, 12px);\r\n background: var(--wd-bg-color, #fff);\r\n border: 1px solid var(--wd-border-color-light, #e4e7ed);\r\n border-radius: var(--wd-radius-base, 4px);\r\n box-sizing: border-box;\r\n overflow: hidden;\r\n transition: box-shadow 0.25s ease, border-color 0.25s ease, transform 0.25s ease;\r\n}\r\n\r\n/* 阴影跟随可覆盖变量:在任意祖先/全局定义\r\n --wd-panel-shadow-sm / --wd-panel-shadow-md 即可换肤 */\r\n.wd-panel--shadow-always {\r\n box-shadow: var(\r\n --wd-panel-shadow-sm,\r\n 0 1px 2px rgba(16, 24, 40, 0.04),\r\n 0 1px 6px -1px rgba(16, 24, 40, 0.06)\r\n );\r\n}\r\n.wd-panel--shadow-hover:hover {\r\n border-color: var(--wd-border-color, #dcdfe6);\r\n box-shadow: var(\r\n --wd-panel-shadow-md,\r\n 0 4px 8px -2px rgba(16, 24, 40, 0.08),\r\n 0 12px 24px -4px rgba(16, 24, 40, 0.1)\r\n );\r\n transform: translateY(-1px);\r\n}\r\n/* 无边框:transparent 保持盒模型一致;:hover 提优先级防止悬停阴影重新上色 */\r\n.wd-panel--no-border,\r\n.wd-panel--no-border:hover {\r\n border-color: transparent;\r\n}\r\n\r\n.wd-panel__header {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n padding: 12px 16px 12px 18px;\r\n border-bottom: 1px solid var(--wd-border-color-light, #e4e7ed);\r\n transition: background-color 0.2s ease;\r\n}\r\n/* 品牌色标识条 */\r\n.wd-panel__header::before {\r\n content: '';\r\n position: absolute;\r\n left: 0;\r\n top: 0;\r\n bottom: 0;\r\n width: 3px;\r\n background: var(--wd-color-primary, #409eff);\r\n border-radius: 0 var(--wd-radius-small, 2px) var(--wd-radius-small, 2px) 0;\r\n}\r\n.wd-panel__header.is-collapsible {\r\n cursor: pointer;\r\n}\r\n.wd-panel__header.is-collapsible:hover {\r\n background: var(--wd-bg-color-page, #f5f7fa);\r\n}\r\n.wd-panel__header-main {\r\n display: flex;\r\n align-items: baseline;\r\n gap: 8px;\r\n min-width: 0;\r\n flex: 1;\r\n}\r\n.wd-panel__title {\r\n font-size: var(--wd-font-size-base, 14px);\r\n font-weight: 600;\r\n line-height: 22px;\r\n color: var(--wd-text-color-primary, #303133);\r\n white-space: nowrap;\r\n}\r\n.wd-panel__description {\r\n font-size: var(--wd-font-size-small, 12px);\r\n color: var(--wd-text-color-secondary, #909399);\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n.wd-panel__header-extra {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n margin-left: auto;\r\n}\r\n.wd-panel__collapse-icon {\r\n cursor: pointer;\r\n color: var(--wd-text-color-secondary, #909399);\r\n transition: transform 0.25s ease, color 0.2s ease;\r\n}\r\n.wd-panel__collapse-icon:hover {\r\n color: var(--wd-color-primary, #409eff);\r\n}\r\n.wd-panel__collapse-icon.is-collapsed {\r\n transform: rotate(-90deg);\r\n}\r\n\r\n/* 折叠动画:grid 1fr -> 0fr,无需测量高度 */\r\n.wd-panel__content {\r\n display: grid;\r\n grid-template-rows: 1fr;\r\n transition: grid-template-rows 0.28s ease;\r\n}\r\n.wd-panel__content.is-collapsed {\r\n grid-template-rows: 0fr;\r\n}\r\n.wd-panel__content-inner {\r\n overflow: hidden;\r\n min-height: 0;\r\n}\r\n.wd-panel__body {\r\n padding: 16px;\r\n}\r\n.wd-panel__footer {\r\n padding: 10px 16px;\r\n border-top: 1px solid var(--wd-border-color-light, #e4e7ed);\r\n background: var(--wd-bg-color-page, #f5f7fa);\r\n}\r\n</style>\r\n"],"names":["props","__props","emit","__emit","innerOpened","ref","watch","v","openedState","computed","toggle","next","onHeaderClick","_createElementBlock","_normalizeClass","$slots","_createElementVNode","_hoisted_2","_renderSlot","_ctx","_hoisted_3","_toDisplayString","_hoisted_4","_createBlock","_component_el_icon","_createVNode","_unref","ArrowDown","_hoisted_5","_hoisted_6","_openBlock","_hoisted_7"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsDA,UAAMA,IAAQC,GAkBRC,IAAOC,GAKPC,IAAcC,EAAIL,EAAM,MAAM;AAEpC,IAAAM;AAAA,MACE,MAAMN,EAAM;AAAA,MACZ,CAACO,MAAM;AACL,QAAAH,EAAY,QAAQG;AAAA,MACtB;AAAA,IAAA;AAEF,UAAMC,IAAcC,EAAS,MAAML,EAAY,KAAK;AAEpD,aAASM,IAAS;AAChB,UAAI,CAACV,EAAM,YAAa;AACxB,YAAMW,IAAO,CAACH,EAAY;AAC1B,MAAAJ,EAAY,QAAQO,GACpBT,EAAK,iBAAiBS,CAAI,GAC1BT,EAAK,UAAUS,CAAI;AAAA,IACrB;AAEA,aAASC,IAAgB;AACvB,MAAIZ,EAAM,eAAaU,EAAA;AAAA,IACzB;;;kBAhGEG,EA4CM,OAAA;AAAA,QA5CD,OAAKC,EAAA,CAAC,YAAU,CAAA,oBAA8Bb,EAAA,MAAM,8BAA8BA,EAAA,OAAA,CAAM,CAAA,CAAA;AAAA,MAAA;QAEnFA,EAAA,SAASc,EAAAA,OAAO,cADxBF,EAgCM,OAAA;AAAA;UA9BJ,OAAKC,EAAA,CAAC,oBAAkB,EAAA,kBACIb,EAAA,YAAA,CAAW,CAAA;AAAA,UACvC,MAAK;AAAA,UACJ,iBAAeA,EAAA,cAAcO,EAAA,QAAc;AAAA,UAC3C,SAAOI;AAAA,UACP,WAAO;AAAA,gBAAgBA,GAAa,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA;AAAA,gBACbA,GAAa,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA;AAAA,UAAA;AAAA;UAErCI,EAKM,OALNC,GAKM;AAAA,YAJJC,EAGOC,uBAHP,MAGO;AAAA,cAFLH,EAAgD,QAAhDI,GAAgDC,EAAfpB,EAAA,KAAK,GAAA,CAAA;AAAA,cAC1BA,EAAA,oBAAZY,EAA+E,QAA/ES,GAA+ED,EAArBpB,EAAA,WAAW,GAAA,CAAA;;;UAG9Dc,EAAAA,OAAO,SAASd,EAAA,oBAA3BY,EAeM,OAAA;AAAA;YAfkC,OAAM;AAAA,YAA0B,2BAAD,MAAA;AAAA,YAAA,GAAW,CAAA,MAAA,CAAA;AAAA,UAAA;YAChFK,EAAqBC,EAAA,QAAA,SAAA,CAAA,GAAA,QAAA,EAAA;AAAA,YAEblB,EAAA,oBADRsB,EAYUC,GAAA;AAAA;cAVR,OAAKV,EAAA,CAAC,2BAAyB,EAAA,gBAAA,CACJN,EAAA,MAAA,CAAW,CAAA;AAAA,cACtC,MAAK;AAAA,cACJ,cAAYA,EAAA,QAAW,OAAA;AAAA,cACxB,UAAS;AAAA,cACR,SAAOE;AAAA,cACP,WAAO;AAAA,oBAAgBA,GAAM,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA;AAAA,oBACNA,GAAM,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA;AAAA,cAAA;AAAA;yBAE9B,MAAa;AAAA,gBAAbe,EAAaC,EAAAC,CAAA,CAAA;AAAA,cAAA;;;;;QAInBX,EASM,OAAA;AAAA,UATD,OAAKF,EAAA,CAAC,qBAAmB,EAAA,gBAA2Bb,EAAA,gBAAgBO,EAAA,OAAW,CAAA;AAAA,QAAA;UAClFQ,EAOM,OAPNY,GAOM;AAAA,YANJZ,EAEM,OAFNa,GAEM;AAAA,cADJX,EAAQC,EAAA,QAAA,WAAA,CAAA,GAAA,QAAA,EAAA;AAAA,YAAA;YAECJ,EAAAA,OAAO,UAAlBe,KAAAjB,EAEM,OAFNkB,GAEM;AAAA,cADJb,EAAsBC,EAAA,QAAA,UAAA,CAAA,GAAA,QAAA,EAAA;AAAA,YAAA;;;;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineComponent as S, useSlots as k, resolveComponent as u, openBlock as m, createBlock as f, withCtx as l, createVNode as L, mergeProps as d, unref as g, renderSlot as h, createTextVNode as y, toDisplayString as P } from "vue";
|
|
2
2
|
import { ElMessageBox as n } from "element-plus";
|
|
3
|
-
import { u as w } from "./useApiAction-
|
|
3
|
+
import { u as w } from "./useApiAction-6_vvf5Fd.mjs";
|
|
4
4
|
import { t as D, b as _, a as A, h as R, f as v } from "./props-DAytpx7D.mjs";
|
|
5
5
|
const q = /* @__PURE__ */ S({
|
|
6
6
|
name: "WdPromptButton",
|
|
@@ -115,4 +115,4 @@ const q = /* @__PURE__ */ S({
|
|
|
115
115
|
export {
|
|
116
116
|
q as _
|
|
117
117
|
};
|
|
118
|
-
//# sourceMappingURL=PromptButton.vue_vue_type_script_setup_true_lang-
|
|
118
|
+
//# sourceMappingURL=PromptButton.vue_vue_type_script_setup_true_lang-Gck1QAHc.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PromptButton.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
{"version":3,"file":"PromptButton.vue_vue_type_script_setup_true_lang-Gck1QAHc.mjs","sources":["../../src/components/buttons/PromptButton.vue"],"sourcesContent":["<template>\r\n <el-tooltip\r\n v-if=\"tips\"\r\n :content=\"tips\"\r\n :effect=\"tipsType\"\r\n :placement=\"placement\"\r\n >\r\n <el-button v-bind=\"$attrs\" :loading=\"loading\" @click=\"onClick\">\r\n <slot>{{ label }}</slot>\r\n </el-button>\r\n </el-tooltip>\r\n <el-button v-else v-bind=\"$attrs\" :loading=\"loading\" @click=\"onClick\">\r\n <slot>{{ label }}</slot>\r\n </el-button>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ElMessageBox } from 'element-plus'\r\nimport { useSlots } from 'vue'\r\nimport { useApiAction } from './useApiAction'\r\nimport { filterProp, headRefreshDatagridProp, apiProps, buttonTextProp, tipsProp } from '../common/props'\r\n\r\ndefineOptions({ name: 'WdPromptButton', inheritAttrs: false })\r\n\r\nconst props = defineProps({\r\n ...filterProp,\r\n ...headRefreshDatagridProp,\r\n ...apiProps,\r\n ...buttonTextProp,\r\n ...tipsProp,\r\n /** 输入框标题 */\r\n promptTitle: { type: String, default: '请输入' },\r\n /** 输入框占位文本(默认输入框模式有效) */\r\n promptPlaceholder: { type: String, default: '请输入内容' },\r\n /** 输入值并入 apiParam 的字段名(默认输入框模式有效) */\r\n paramKey: { type: String, default: 'value' },\r\n /** 输入框默认值(默认输入框模式有效) */\r\n promptDefault: { type: String, default: '' },\r\n buttonLoading: { type: Boolean, default: true },\r\n pageLoading: { type: Boolean, default: false }\r\n})\r\n\r\nconst emit = defineEmits([\r\n 'click',\r\n 'prompt',\r\n 'cancel',\r\n 'confirm',\r\n 'apiBefore',\r\n 'apiSuccess',\r\n 'apiFail',\r\n 'apiException',\r\n 'apiAfter'\r\n])\r\n\r\nconst slots = useSlots()\r\nconst { loading, doRequest } = useApiAction({\r\n getApi: () => props.api,\r\n getMethod: () => props.apiMethod,\r\n getParam: () => props.apiParam,\r\n getFilter: () => props.filter,\r\n getHeadRefresh: () => props.headRefreshDatagrid,\r\n emit,\r\n buttonLoading: () => props.buttonLoading,\r\n getReqOptions: () => ({ showLoading: props.pageLoading })\r\n})\r\n\r\nasync function onClick(event: MouseEvent) {\r\n emit('click', event)\r\n if (slots.content) {\r\n // 自定义内容模式:弹窗内容由用户插槽 #content 提供,点击确认后请求 API\r\n try {\r\n await ElMessageBox.prompt(props.promptTitle, props.promptTitle, {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n inputPlaceholder: props.promptPlaceholder,\r\n inputValue: props.promptDefault,\r\n // 允许自定义内容:message 设为空,插槽内容会被保留\r\n dangerouslyUseHTMLString: true,\r\n message: ''\r\n })\r\n emit('confirm')\r\n const success = await doRequest({})\r\n // API 请求成功(success=true)自动关闭弹窗,失败不关闭让用户继续修改\r\n if (success) {\r\n ElMessageBox.close()\r\n }\r\n } catch {\r\n emit('cancel')\r\n }\r\n return\r\n }\r\n\r\n // 默认单输入框模式\r\n let value: string\r\n try {\r\n const res = await ElMessageBox.prompt(props.promptTitle, props.promptTitle, {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n inputPlaceholder: props.promptPlaceholder,\r\n inputValue: props.promptDefault\r\n })\r\n value = res.value\r\n } catch {\r\n emit('cancel')\r\n return\r\n }\r\n emit('prompt', value)\r\n const success = await doRequest({ [props.paramKey]: value })\r\n // 根据 API 返回 success 决定是否自动关闭:成功关闭,失败不关闭\r\n if (success) {\r\n ElMessageBox.close()\r\n }\r\n}\r\n</script>\r\n"],"names":["props","__props","emit","__emit","slots","useSlots","loading","doRequest","useApiAction","onClick","event","ElMessageBox","value","tips","_createBlock","_component_el_tooltip","tipsType","placement","_createVNode","_component_el_button","_mergeProps","_ctx","_unref","_renderSlot","label","$attrs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,UAAMA,IAAQC,GAkBRC,IAAOC,GAYPC,IAAQC,EAAA,GACR,EAAE,SAAAC,GAAS,WAAAC,EAAA,IAAcC,EAAa;AAAA,MAC1C,QAAQ,MAAMR,EAAM;AAAA,MACpB,WAAW,MAAMA,EAAM;AAAA,MACvB,UAAU,MAAMA,EAAM;AAAA,MACtB,WAAW,MAAMA,EAAM;AAAA,MACvB,gBAAgB,MAAMA,EAAM;AAAA,MAC5B,MAAAE;AAAA,MACA,eAAe,MAAMF,EAAM;AAAA,MAC3B,eAAe,OAAO,EAAE,aAAaA,EAAM,YAAA;AAAA,IAAY,CACxD;AAED,mBAAeS,EAAQC,GAAmB;AAExC,UADAR,EAAK,SAASQ,CAAK,GACfN,EAAM,SAAS;AAEjB,YAAI;AACF,gBAAMO,EAAa,OAAOX,EAAM,aAAaA,EAAM,aAAa;AAAA,YAC9D,mBAAmB;AAAA,YACnB,kBAAkB;AAAA,YAClB,kBAAkBA,EAAM;AAAA,YACxB,YAAYA,EAAM;AAAA;AAAA,YAElB,0BAA0B;AAAA,YAC1B,SAAS;AAAA,UAAA,CACV,GACDE,EAAK,SAAS,GACE,MAAMK,EAAU,EAAE,KAGhCI,EAAa,MAAA;AAAA,QAEjB,QAAQ;AACN,UAAAT,EAAK,QAAQ;AAAA,QACf;AACA;AAAA,MACF;AAGA,UAAIU;AACJ,UAAI;AAOF,QAAAA,KANY,MAAMD,EAAa,OAAOX,EAAM,aAAaA,EAAM,aAAa;AAAA,UAC1E,mBAAmB;AAAA,UACnB,kBAAkB;AAAA,UAClB,kBAAkBA,EAAM;AAAA,UACxB,YAAYA,EAAM;AAAA,QAAA,CACnB,GACW;AAAA,MACd,QAAQ;AACN,QAAAE,EAAK,QAAQ;AACb;AAAA,MACF;AACA,MAAAA,EAAK,UAAUU,CAAK,GACJ,MAAML,EAAU,EAAE,CAACP,EAAM,QAAQ,GAAGY,GAAO,KAGzDD,EAAa,MAAA;AAAA,IAEjB;;;aA9GUE,EAAAA,aADRC,EASaC,GAAA;AAAA;QAPV,SAASF,EAAAA;AAAAA,QACT,QAAQG,EAAAA;AAAAA,QACR,WAAWC,EAAAA;AAAAA,MAAAA;mBAEZ,MAEY;AAAA,UAFZC,EAEYC,GAFZC,EAEYC,EAAA,QAFa;AAAA,YAAG,SAASC,EAAAhB,CAAA;AAAA,YAAU,SAAAG;AAAA,UAAA;uBAC7C,MAAwB;AAAA,cAAxBc,EAAwBF,yBAAxB,MAAwB;AAAA,oBAAfG,EAAAA,KAAK,GAAA,CAAA;AAAA,cAAA;;;;;;yDAGlBV,EAEYK,GAFZC,EAEY,EAAA,KAAA,EAAA,GAFcK,EAAAA,QAAM;AAAA,QAAG,SAASH,EAAAhB,CAAA;AAAA,QAAU,SAAAG;AAAA,MAAA;mBACpD,MAAwB;AAAA,UAAxBc,EAAwBF,yBAAxB,MAAwB;AAAA,gBAAfG,EAAAA,KAAK,GAAA,CAAA;AAAA,UAAA;;;;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineComponent as B, toRefs as L, computed as $, resolveComponent as i, resolveDirective as C, withDirectives as R, openBlock as o, createBlock as n, mergeProps as N, withCtx as l, createElementBlock as _, Fragment as x, renderList as W, unref as g, createElementVNode as h, renderSlot as s, createTextVNode as r, toDisplayString as u } from "vue";
|
|
2
|
-
import { u as A } from "./useOptionsLoader-
|
|
2
|
+
import { u as A } from "./useOptionsLoader-Bi8oqNbG.mjs";
|
|
3
3
|
import { o as E } from "./props-DAytpx7D.mjs";
|
|
4
4
|
import { _ as F } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
|
|
5
5
|
const M = { class: "wd-option-text" }, I = { class: "wd-option-text" }, O = /* @__PURE__ */ B({
|
|
@@ -126,4 +126,4 @@ const M = { class: "wd-option-text" }, I = { class: "wd-option-text" }, O = /* @
|
|
|
126
126
|
export {
|
|
127
127
|
z as W
|
|
128
128
|
};
|
|
129
|
-
//# sourceMappingURL=RadioList-
|
|
129
|
+
//# sourceMappingURL=RadioList-vE8JOuST.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RadioList-
|
|
1
|
+
{"version":3,"file":"RadioList-vE8JOuST.mjs","sources":["../../src/components/inputs/RadioList.vue"],"sourcesContent":["<template>\n <el-radio-group\n v-model=\"inner\"\n v-loading=\"loading\"\n v-bind=\"$attrs\"\n @change=\"onChange\"\n >\n <template v-for=\"opt in options\" :key=\"String(opt.value)\">\n <el-radio-button v-if=\"buttonStyle\" :value=\"opt.value\">\n <el-tooltip\n v-if=\"opt.tips\"\n :content=\"opt.tips\"\n placement=\"top\"\n effect=\"dark\"\n :show-after=\"200\"\n >\n <span class=\"wd-option-text\">\n <slot :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </span>\n </el-tooltip>\n <slot v-else :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </el-radio-button>\n <el-radio v-else :value=\"opt.value\">\n <el-tooltip\n v-if=\"opt.tips\"\n :content=\"opt.tips\"\n placement=\"top\"\n effect=\"dark\"\n :show-after=\"200\"\n >\n <span class=\"wd-option-text\">\n <slot :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </span>\n </el-tooltip>\n <slot v-else :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </el-radio>\n </template>\n </el-radio-group>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, toRefs, type PropType } from 'vue'\nimport { useOptionsLoader } from './useOptionsLoader'\nimport { optionsProps } from '../common/props'\n\ndefineOptions({ name: 'WdRadioList', inheritAttrs: false })\n\nconst props = defineProps({\n ...optionsProps,\n modelValue: { type: [String, Number, Boolean] as PropType<any>, default: undefined },\n /** 按钮样式 */\n buttonStyle: { type: Boolean, default: false }\n})\n\nconst emit = defineEmits(['update:modelValue', 'change', 'apiBefore', 'apiSuccess', 'apiFail', 'apiAfter'])\n\nconst refs = toRefs(props)\nconst { options, loading } = useOptionsLoader({\n api: refs.api,\n apiMethod: refs.apiMethod as any,\n apiParam: refs.apiParam,\n active: refs.active,\n dataSource: refs.dataSource as any,\n textProp: refs.textProp,\n valueProp: refs.valueProp,\n tipsProp: refs.tipsProp,\n addData: refs.addData as any,\n appendData: refs.appendData as any,\n emit\n})\n\nconst inner = computed({\n get: () => props.modelValue,\n set: (val) => emit('update:modelValue', val)\n})\n\nfunction onChange(val: any) {\n emit('change', val)\n}\n</script>\n\n<style scoped>\n.wd-option-text {\n display: inline-block;\n}\n</style>\n"],"names":["props","__props","emit","__emit","refs","toRefs","options","loading","useOptionsLoader","inner","computed","val","onChange","_withDirectives","_openBlock","_createBlock","_component_el_radio_group","_mergeProps","$event","$attrs","_createElementBlock","_Fragment","_renderList","_unref","opt","_component_el_radio_button","_component_el_tooltip","_createElementVNode","_hoisted_1","_renderSlot","_ctx","_createTextVNode","_toDisplayString","_component_el_radio","_hoisted_2"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { shallowRef as g, onMounted as b, defineComponent as q, watch as C, onUnmounted as h, renderSlot as v } from "vue";
|
|
2
|
-
import { a as w, g as R, d as _, r as c } from "./http-
|
|
2
|
+
import { a as w, g as R, d as _, r as c } from "./http-Bs-dM076.mjs";
|
|
3
3
|
function O(n, s) {
|
|
4
4
|
const e = g(p(n, s));
|
|
5
5
|
return b(() => {
|
|
@@ -77,4 +77,4 @@ export {
|
|
|
77
77
|
x as a,
|
|
78
78
|
O as u
|
|
79
79
|
};
|
|
80
|
-
//# sourceMappingURL=Requester.vue_vue_type_script_setup_true_lang-
|
|
80
|
+
//# sourceMappingURL=Requester.vue_vue_type_script_setup_true_lang-B8TwXbYR.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Requester.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
{"version":3,"file":"Requester.vue_vue_type_script_setup_true_lang-B8TwXbYR.mjs","sources":["../../src/lib/composables/useConfig.ts","../../src/components/core/Requester.vue"],"sourcesContent":["import { onMounted, shallowRef } from 'vue'\nimport { getGlobalConfig, getComponentDefault } from '../core/config'\nimport { deepMerge } from '../core/utils'\nimport type { WorkDesktopConfig } from '../../types/config'\n\n/**\n * useConfig(PRD 5.3 / 5.2)\n *\n * 组件内合并三级配置:全局 componentDefault[组件名] → 本地 props。\n * 全局配置在组件 onMounted 时读取一次并缓存(运行中改配置只影响新挂载组件)。\n *\n * 返回一个响应式 ref,merge 后的组件配置对象:\n * componentDefault 的值作为默认,props 中非 undefined 的值覆盖。\n *\n * @example\n * const cfg = useConfig('WdDataGrid', props)\n * cfg.value.withPager\n */\nexport function useConfig<T extends Record<string, any> = Record<string, any>>(\n componentName?: string,\n props?: T\n) {\n const configRef = shallowRef<T>(buildComponentConfig<T>(componentName, props))\n\n onMounted(() => {\n // onMounted 时 install 已完成、window.workDesktopConfig 已就绪,再读一次\n configRef.value = buildComponentConfig<T>(componentName, props)\n })\n\n return configRef\n}\n\n/**\n * 非响应式:直接取当前全局 WorkDesktopConfig\n */\nexport function useGlobalConfig(): WorkDesktopConfig {\n return getGlobalConfig()\n}\n\nfunction buildComponentConfig<T extends Record<string, any>>(\n componentName?: string,\n props?: T\n): T {\n const componentDefaults = componentName ? getComponentDefault(componentName) : {}\n const localProps: Record<string, any> = {}\n if (props) {\n for (const [k, v] of Object.entries(props)) {\n if (v !== undefined) localProps[k] = v\n }\n }\n // 优先级:componentDefault < 本地 props\n return deepMerge<T>({} as T, componentDefaults, localProps)\n}\n","<template>\n <!-- 无默认插槽 -->\n <slot></slot>\n</template>\n\n<script setup lang=\"ts\">\n/**\n * WdRequester 请求触发组件\n *\n * 使用 v-model 控制请求触发:开关变为 true 时发起请求;请求完成后自动设置为 false,\n * 等待开发者下一次将它变为 true 再触发。所有组件都基于本库公开请求核心 RequestAPI。\n *\n * 特性:\n * 1. 封装 get/post/put/delete/request 全部请求方法;\n * 2. 全周期 emit 事件:apiBefore 触发后允许开发者手动 abort 请求;\n * 3. 支持中途发起新请求:旧请求会自动被中断;\n * 4. 请求完成(成功/失败/异常)后自动将 v-model 置为 false;\n *\n * @example\n * <template>\n * <wd-requester\n * v-model=\"trigger\"\n * url=\"/api/save\"\n * method=\"post\"\n * @api-before=\"onApiBefore\"\n * @api-success=\"onSuccess\"\n * />\n * <el-button @click=\"trigger = true\">提交</el-button>\n * </template>\n */\nimport { onUnmounted, watch } from 'vue'\nimport { request, type ApiResult } from '../../lib/core/http'\nimport type { Method } from 'axios'\nimport type { ReqOptions } from '../../types/config'\nimport { useConfig } from '../../lib/composables/useConfig'\n\ndefineOptions({ name: 'WdRequester' })\n\ninterface Props {\n /** v-model 触发开关:true 则发起请求,完成后自动变 false */\n modelValue: boolean\n /** 请求 URL */\n url: string\n /** 请求方法,默认 post(可通过全局配置 page.componentDefault.WdRequester.method 覆盖) */\n method?: Method\n /** 请求参数(get/delete 放 query,post/put 放 body) */\n params?: any\n /** 请求选项(透传给 http):showLoading/showTips/tipsConfig/axiosConfig/signal(可通过全局配置 page.componentDefault.WdRequester.reqOptions 覆盖) */\n reqOptions?: ReqOptions\n}\n\nconst props = defineProps<Props>()\n\n// 合并三级配置:默认层(default-config 的 WdRequester)→ 全局层(componentDefault)→ 本地 props\n// 注意:url/params 属业务参数,实时读 props;method/reqOptions 属配置类,走合并结果\nconst config = useConfig<Record<string, any>>('WdRequester', props)\n\ninterface Emits {\n (e: 'update:modelValue', value: boolean): void\n (e: 'api-before', abort: () => void): void\n (e: 'api-success', result: ApiResult): void\n (e: 'api-fail', result: ApiResult): void\n (e: 'api-exception', error: any): void\n (e: 'api-after'): void\n}\n\nconst emit = defineEmits<Emits>()\n\nlet currentController: AbortController | null = null\n\n/**\n * 仅中断当前进行中的请求(不清引用)。\n * 传给 apiBefore 的 abort:中断后本请求仍走 finally 收尾(api-after + 复位开关)。\n */\nfunction abortActive() {\n currentController?.abort()\n}\n\n/**\n * 中断并清引用:用于外部关闭开关 / 组件卸载,不触发收尾事件。\n */\nfunction abortAndClear() {\n if (currentController) {\n currentController.abort()\n currentController = null\n }\n}\n\nasync function doRequest() {\n // 中断并清掉上一次请求(旧请求的收尾会被跳过,不触发 api-after)\n abortAndClear()\n\n const controller = new AbortController()\n currentController = controller\n\n // 组装请求选项:全局默认(reqOptions)→ 实例 props 覆盖 → 注入 abort signal\n const reqOpts: ReqOptions = {\n ...(config.value.reqOptions || {}),\n ...(props.reqOptions || {}),\n signal: controller.signal,\n }\n\n try {\n // 触发 apiBefore,允许开发者在事件中手动调用 abort() 中断本次请求\n emit('api-before', abortActive)\n\n // 如果在 apiBefore 中被手动中断:直接走收尾(api-after + 复位开关)\n if (controller.signal.aborted) {\n return\n }\n\n let result: ApiResult\n // 请求方法优先级:实例 props.method → 全局默认 config.method → 内置兜底 'post'\n const method = (props.method ?? config.value.method ?? 'post').toLowerCase() as 'get' | 'post' | 'put' | 'delete'\n\n if (method === 'get' || method === 'delete') {\n result = await request[method](props.url, props.params, reqOpts)\n } else {\n result = await request[method](props.url, props.params, reqOpts)\n }\n\n if (controller.signal.aborted) {\n // 已被中断,无需后续处理\n return\n }\n\n if (result.success) {\n emit('api-success', result)\n } else {\n emit('api-fail', result)\n }\n } catch (e) {\n if (controller.signal.aborted) {\n return\n }\n emit('api-exception', e)\n } finally {\n if (currentController === controller) {\n currentController = null\n emit('api-after')\n // 自动关闭触发开关\n emit('update:modelValue', false)\n }\n }\n}\n\n// 监听 v-model 开关:变为 true 就发起请求\nwatch(\n () => props.modelValue,\n (newVal) => {\n if (newVal === true) {\n doRequest()\n } else {\n // 外部关闭开关:中断进行中的请求(不触发收尾事件)\n abortAndClear()\n }\n },\n { immediate: true }\n)\n\nonUnmounted(() => {\n abortAndClear()\n})\n</script>\n\n<style scoped>\n</style>\n"],"names":["useConfig","componentName","props","configRef","shallowRef","buildComponentConfig","onMounted","useGlobalConfig","getGlobalConfig","componentDefaults","getComponentDefault","localProps","k","v","deepMerge","__props","config","emit","__emit","currentController","abortActive","abortAndClear","doRequest","controller","reqOpts","result","method","request","e","watch","newVal","onUnmounted","_renderSlot","_ctx"],"mappings":";;AAkBO,SAASA,EACdC,GACAC,GACA;AACA,QAAMC,IAAYC,EAAcC,EAAwBJ,GAAeC,CAAK,CAAC;AAE7E,SAAAI,EAAU,MAAM;AAEd,IAAAH,EAAU,QAAQE,EAAwBJ,GAAeC,CAAK;AAAA,EAChE,CAAC,GAEMC;AACT;AAKO,SAASI,IAAqC;AACnD,SAAOC,EAAA;AACT;AAEA,SAASH,EACPJ,GACAC,GACG;AACH,QAAMO,IAAoBR,IAAgBS,EAAoBT,CAAa,IAAI,CAAA,GACzEU,IAAkC,CAAA;AACxC,MAAIT;AACF,eAAW,CAACU,GAAGC,CAAC,KAAK,OAAO,QAAQX,CAAK;AACvC,MAAIW,MAAM,WAAWF,EAAWC,CAAC,IAAIC;AAIzC,SAAOC,EAAa,CAAA,GAASL,GAAmBE,CAAU;AAC5D;;;;;;;;;;;;;ACDA,UAAMT,IAAQa,GAIRC,IAAShB,EAA+B,eAAeE,CAAK,GAW5De,IAAOC;AAEb,QAAIC,IAA4C;AAMhD,aAASC,IAAc;AACrB,MAAAD,KAAA,QAAAA,EAAmB;AAAA,IACrB;AAKA,aAASE,IAAgB;AACvB,MAAIF,MACFA,EAAkB,MAAA,GAClBA,IAAoB;AAAA,IAExB;AAEA,mBAAeG,IAAY;AAEzB,MAAAD,EAAA;AAEA,YAAME,IAAa,IAAI,gBAAA;AACvB,MAAAJ,IAAoBI;AAGpB,YAAMC,IAAsB;AAAA,QAC1B,GAAIR,EAAO,MAAM,cAAc,CAAA;AAAA,QAC/B,GAAId,EAAM,cAAc,CAAA;AAAA,QACxB,QAAQqB,EAAW;AAAA,MAAA;AAGrB,UAAI;AAKF,YAHAN,EAAK,cAAcG,CAAW,GAG1BG,EAAW,OAAO;AACpB;AAGF,YAAIE;AAEJ,cAAMC,KAAUxB,EAAM,UAAUc,EAAO,MAAM,UAAU,QAAQ,YAAA;AAQ/D,YANIU,MAAW,SAASA,MAAW,WACjCD,IAAS,MAAME,EAAQD,CAAM,EAAExB,EAAM,KAAKA,EAAM,QAAQsB,CAAO,IAE/DC,IAAS,MAAME,EAAQD,CAAM,EAAExB,EAAM,KAAKA,EAAM,QAAQsB,CAAO,GAG7DD,EAAW,OAAO;AAEpB;AAGF,QAAIE,EAAO,UACTR,EAAK,eAAeQ,CAAM,IAE1BR,EAAK,YAAYQ,CAAM;AAAA,MAE3B,SAASG,GAAG;AACV,YAAIL,EAAW,OAAO;AACpB;AAEF,QAAAN,EAAK,iBAAiBW,CAAC;AAAA,MACzB,UAAA;AACE,QAAIT,MAAsBI,MACxBJ,IAAoB,MACpBF,EAAK,WAAW,GAEhBA,EAAK,qBAAqB,EAAK;AAAA,MAEnC;AAAA,IACF;AAGA,WAAAY;AAAA,MACE,MAAM3B,EAAM;AAAA,MACZ,CAAC4B,MAAW;AACV,QAAIA,MAAW,KACbR,EAAA,IAGAD,EAAA;AAAA,MAEJ;AAAA,MACA,EAAE,WAAW,GAAA;AAAA,IAAK,GAGpBU,EAAY,MAAM;AAChB,MAAAV,EAAA;AAAA,IACF,CAAC,aAhKCW,EAAaC,EAAA,QAAA,SAAA;AAAA;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineComponent as b, toRefs as B, computed as D, resolveComponent as r, resolveDirective as C, withDirectives as N, openBlock as i, createBlock as d, mergeProps as A, withCtx as s, createElementBlock as F, Fragment as M, renderList as W, unref as c, createElementVNode as m, renderSlot as E, createTextVNode as K, toDisplayString as L, withModifiers as R, createVNode as f, createCommentVNode as $ } from "vue";
|
|
2
2
|
import { QuestionFilled as I } from "@element-plus/icons-vue";
|
|
3
|
-
import { u as O } from "./useOptionsLoader-
|
|
3
|
+
import { u as O } from "./useOptionsLoader-Bi8oqNbG.mjs";
|
|
4
4
|
import { o as Q } from "./props-DAytpx7D.mjs";
|
|
5
5
|
import { _ as T } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
|
|
6
6
|
const U = { class: "wd-option-row" }, j = { class: "wd-option-text" }, q = /* @__PURE__ */ b({
|
|
@@ -111,4 +111,4 @@ const U = { class: "wd-option-row" }, j = { class: "wd-option-text" }, q = /* @_
|
|
|
111
111
|
export {
|
|
112
112
|
Y as W
|
|
113
113
|
};
|
|
114
|
-
//# sourceMappingURL=Select-
|
|
114
|
+
//# sourceMappingURL=Select-DAGZDXvI.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select-
|
|
1
|
+
{"version":3,"file":"Select-DAGZDXvI.mjs","sources":["../../src/components/inputs/Select.vue"],"sourcesContent":["<template>\n <el-select\n v-model=\"inner\"\n v-loading=\"loading\"\n :multiple=\"multiple\"\n :filterable=\"remote || filterable\"\n :remote=\"remote\"\n :remote-method=\"onRemote\"\n v-bind=\"$attrs\"\n @change=\"onChange\"\n >\n <el-option\n v-for=\"opt in options\"\n :key=\"String(opt.value)\"\n :label=\"opt.text\"\n :value=\"opt.value\"\n >\n <span class=\"wd-option-row\">\n <span class=\"wd-option-text\">\n <slot :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">\n {{ opt.text }}\n </slot>\n </span>\n <el-tooltip\n v-if=\"opt.tips\"\n :content=\"opt.tips\"\n placement=\"top\"\n effect=\"dark\"\n :show-after=\"200\"\n >\n <span class=\"wd-option-tip\" tabindex=\"0\" role=\"note\" aria-label=\"帮助说明\" @click.stop>\n <el-icon><QuestionFilled /></el-icon>\n </span>\n </el-tooltip>\n </span>\n </el-option>\n </el-select>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, toRefs, type PropType } from 'vue'\nimport { QuestionFilled } from '@element-plus/icons-vue'\nimport { useOptionsLoader } from './useOptionsLoader'\nimport { optionsProps } from '../common/props'\n\ndefineOptions({ name: 'WdSelect', inheritAttrs: false })\n\nconst props = defineProps({\n ...optionsProps,\n modelValue: { type: [String, Number, Boolean, Array] as PropType<any>, default: undefined },\n multiple: { type: Boolean, default: false },\n /** 远程搜索 */\n remote: { type: Boolean, default: false },\n /** 本地可搜索 */\n filterable: { type: Boolean, default: true },\n /** 远程搜索关键字字段名 */\n keywordKey: { type: String, default: 'keyword' }\n})\n\nconst emit = defineEmits(['update:modelValue', 'change', 'apiBefore', 'apiSuccess', 'apiFail', 'apiAfter'])\n\nconst refs = toRefs(props)\nconst { options, loading, remoteSearch } = useOptionsLoader({\n api: refs.api,\n apiMethod: refs.apiMethod as any,\n apiParam: refs.apiParam,\n active: refs.active,\n dataSource: refs.dataSource as any,\n textProp: refs.textProp,\n valueProp: refs.valueProp,\n tipsProp: refs.tipsProp,\n addData: refs.addData as any,\n appendData: refs.appendData as any,\n emit\n})\n\nconst inner = computed({\n get: () => props.modelValue,\n set: (val) => emit('update:modelValue', val)\n})\n\nfunction onChange(val: any) {\n emit('change', val)\n}\n\nfunction onRemote(query: string) {\n if (props.remote) remoteSearch(query, props.keywordKey)\n}\n</script>\n\n<style scoped>\n.wd-option-row {\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n}\n.wd-option-text {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.wd-option-tip {\n flex: none;\n display: inline-flex;\n align-items: center;\n color: var(--el-text-color-secondary, #909399);\n font-size: 14px;\n cursor: help;\n}\n.wd-option-tip:focus-visible {\n outline: 1px dashed currentColor;\n outline-offset: 2px;\n}\n</style>\n"],"names":["props","__props","emit","__emit","refs","toRefs","options","loading","remoteSearch","useOptionsLoader","inner","computed","val","onChange","onRemote","query","_withDirectives","_openBlock","_createBlock","_component_el_select","_mergeProps","$event","$attrs","_createElementBlock","_Fragment","_renderList","_unref","opt","_component_el_option","_createElementVNode","_hoisted_1","_hoisted_2","_renderSlot","_ctx","_createTextVNode","_toDisplayString","_component_el_tooltip","_createVNode","_component_el_icon","QuestionFilled"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA+CA,UAAMA,IAAQC,GAYRC,IAAOC,GAEPC,IAAOC,EAAOL,CAAK,GACnB,EAAE,SAAAM,GAAS,SAAAC,GAAS,cAAAC,EAAA,IAAiBC,EAAiB;AAAA,MAC1D,KAAKL,EAAK;AAAA,MACV,WAAWA,EAAK;AAAA,MAChB,UAAUA,EAAK;AAAA,MACf,QAAQA,EAAK;AAAA,MACb,YAAYA,EAAK;AAAA,MACjB,UAAUA,EAAK;AAAA,MACf,WAAWA,EAAK;AAAA,MAChB,UAAUA,EAAK;AAAA,MACf,SAASA,EAAK;AAAA,MACd,YAAYA,EAAK;AAAA,MACjB,MAAAF;AAAA,IAAA,CACD,GAEKQ,IAAQC,EAAS;AAAA,MACrB,KAAK,MAAMX,EAAM;AAAA,MACjB,KAAK,CAACY,MAAQV,EAAK,qBAAqBU,CAAG;AAAA,IAAA,CAC5C;AAED,aAASC,EAASD,GAAU;AAC1B,MAAAV,EAAK,UAAUU,CAAG;AAAA,IACpB;AAEA,aAASE,EAASC,GAAe;AAC/B,MAAIf,EAAM,UAAQQ,EAAaO,GAAOf,EAAM,UAAU;AAAA,IACxD;;;AAtFE,aAAAgB,GAAAC,EAAA,GAAAC,EAmCYC,GAnCZC,EAmCY;AAAA,oBAlCDV,EAAA;AAAA,sDAAAA,EAAK,QAAAW;AAAA,QAEb,UAAUpB,EAAA;AAAA,QACV,YAAYA,EAAA,UAAUA,EAAA;AAAA,QACtB,QAAQA,EAAA;AAAA,QACR,iBAAea;AAAA,MAAA,GACRQ,EAAAA,QAAM,EACb,UAAAT,EAAA,CAAgB,GAAA;AAAA,mBAGf,MAAsB;AAAA,kBADxBU,EAwBYC,GAAA,MAAAC,EAvBIC,EAAApB,CAAA,GAAO,CAAdqB,YADTT,EAwBYU,GAAA;AAAA,YAtBT,KAAK,OAAOD,EAAI,KAAK;AAAA,YACrB,OAAOA,EAAI;AAAA,YACX,OAAOA,EAAI;AAAA,UAAA;uBAEZ,MAiBO;AAAA,cAjBPE,EAiBO,QAjBPC,GAiBO;AAAA,gBAhBLD,EAIO,QAJPE,GAIO;AAAA,kBAHLC,EAEOC,EAAA,QAAA,WAAA;AAAA,oBAFA,QAAQN,EAAI;AAAA,oBAAM,MAAMA,EAAI;AAAA,oBAAO,OAAOA,EAAI;AAAA,oBAAQ,MAAMA,EAAI;AAAA,kBAAA,GAAvE,MAEO;AAAA,oBADFO,EAAAC,EAAAR,EAAI,IAAI,GAAA,CAAA;AAAA,kBAAA;;gBAIPA,EAAI,aADZT,EAUakB,GAAA;AAAA;kBARV,SAAST,EAAI;AAAA,kBACd,WAAU;AAAA,kBACV,QAAO;AAAA,kBACN,cAAY;AAAA,gBAAA;6BAEb,MAEO;AAAA,oBAFPE,EAEO,QAAA;AAAA,sBAFD,OAAM;AAAA,sBAAgB,UAAS;AAAA,sBAAI,MAAK;AAAA,sBAAO,cAAW;AAAA,sBAAQ,2BAAD,MAAA;AAAA,sBAAA,GAAW,CAAA,MAAA,CAAA;AAAA,oBAAA;sBAChFQ,EAAqCC,GAAA,MAAA;AAAA,mCAA5B,MAAkB;AAAA,0BAAlBD,EAAkBX,EAAAa,CAAA,CAAA;AAAA,wBAAA;;;;;;;;;;;;;;YA5BxBb,EAAAnB,CAAA,CAAO;AAAA,MAAA;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineComponent as V, ref as h, computed as y, resolveComponent as p, openBlock as d, createBlock as m, withCtx as S, createVNode as w, mergeProps as f } from "vue";
|
|
2
|
-
import { r as v } from "./http-
|
|
2
|
+
import { r as v } from "./http-Bs-dM076.mjs";
|
|
3
3
|
import { r as B } from "./linkage-FbL1mcz3.mjs";
|
|
4
4
|
import { a as A, h as P, f as k } from "./props-DAytpx7D.mjs";
|
|
5
5
|
const x = /* @__PURE__ */ V({
|
|
@@ -68,4 +68,4 @@ const x = /* @__PURE__ */ V({
|
|
|
68
68
|
export {
|
|
69
69
|
x as _
|
|
70
70
|
};
|
|
71
|
-
//# sourceMappingURL=Switch.vue_vue_type_script_setup_true_lang-
|
|
71
|
+
//# sourceMappingURL=Switch.vue_vue_type_script_setup_true_lang-CulPqp7M.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Switch.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
{"version":3,"file":"Switch.vue_vue_type_script_setup_true_lang-CulPqp7M.mjs","sources":["../../src/components/inputs/Switch.vue"],"sourcesContent":["<template>\n <el-tooltip v-if=\"tips\" :content=\"tips\" placement=\"top\">\n <el-switch\n v-model=\"inner\"\n :active-value=\"activeValue\"\n :inactive-value=\"inactiveValue\"\n :loading=\"loading\"\n v-bind=\"$attrs\"\n @change=\"onChange\"\n />\n </el-tooltip>\n <el-switch\n v-else\n v-model=\"inner\"\n :active-value=\"activeValue\"\n :inactive-value=\"inactiveValue\"\n :loading=\"loading\"\n v-bind=\"$attrs\"\n @change=\"onChange\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport { request } from '../../lib/core/http'\nimport { refreshDataGrid } from '../../lib/core/linkage'\nimport { filterProp, headRefreshDatagridProp, apiProps } from '../common/props'\nimport type { PropType } from 'vue'\n\ndefineOptions({ name: 'WdSwitch', inheritAttrs: false })\n\nconst props = defineProps({\n ...filterProp,\n ...headRefreshDatagridProp,\n ...apiProps,\n modelValue: { type: [String, Number, Boolean] as PropType<any>, default: false },\n /** 悬停提示 */\n tips: { type: String, default: '' },\n /** 提交参数的字段名 */\n paramKey: { type: String, default: 'status' },\n activeValue: { type: [String, Number, Boolean], default: true },\n inactiveValue: { type: [String, Number, Boolean], default: false }\n})\n\nconst emit = defineEmits(['update:modelValue', 'change', 'apiBefore', 'apiSuccess', 'apiFail', 'apiException', 'apiAfter'])\n\nconst loading = ref(false)\n\nconst inner = computed({\n get: () => props.modelValue,\n set: (val) => emit('update:modelValue', val)\n})\n\nasync function onChange(val: any) {\n emit('change', val)\n if (!props.api) return\n\n // 记录旧值,失败回滚\n const oldVal = val === props.activeValue ? props.inactiveValue : props.activeValue\n loading.value = true\n emit('apiBefore', { url: props.api })\n try {\n const param = { ...props.apiParam, [props.paramKey]: val }\n const result =\n props.apiMethod === 'get'\n ? await request.get(props.api, param)\n : await request.post(props.api, param)\n if (result.success) {\n emit('apiSuccess', { data: result.data })\n if (props.headRefreshDatagrid) {\n refreshDataGrid(props.headRefreshDatagrid, props.filter)\n }\n emit('apiAfter', { data: result.data })\n } else {\n // 业务失败:回滚状态\n emit('update:modelValue', oldVal)\n emit('apiFail', { code: result.code, message: result.message })\n emit('apiAfter', { code: result.code })\n }\n } catch (error: any) {\n // 网络异常:回滚状态\n emit('update:modelValue', oldVal)\n emit('apiException', { error, message: error?.message })\n emit('apiAfter', { error })\n } finally {\n loading.value = false\n }\n}\n</script>\n"],"names":["props","__props","emit","__emit","loading","ref","inner","computed","val","onChange","oldVal","param","result","request","refreshDataGrid","error","_createBlock","_component_el_tooltip","_createVNode","_component_el_switch","_mergeProps","$event","$attrs","_openBlock"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA+BA,UAAMA,IAAQC,GAaRC,IAAOC,GAEPC,IAAUC,EAAI,EAAK,GAEnBC,IAAQC,EAAS;AAAA,MACrB,KAAK,MAAMP,EAAM;AAAA,MACjB,KAAK,CAACQ,MAAQN,EAAK,qBAAqBM,CAAG;AAAA,IAAA,CAC5C;AAED,mBAAeC,EAASD,GAAU;AAEhC,UADAN,EAAK,UAAUM,CAAG,GACd,CAACR,EAAM,IAAK;AAGhB,YAAMU,IAASF,MAAQR,EAAM,cAAcA,EAAM,gBAAgBA,EAAM;AACvE,MAAAI,EAAQ,QAAQ,IAChBF,EAAK,aAAa,EAAE,KAAKF,EAAM,KAAK;AACpC,UAAI;AACF,cAAMW,IAAQ,EAAE,GAAGX,EAAM,UAAU,CAACA,EAAM,QAAQ,GAAGQ,EAAA,GAC/CI,IACJZ,EAAM,cAAc,QAChB,MAAMa,EAAQ,IAAIb,EAAM,KAAKW,CAAK,IAClC,MAAME,EAAQ,KAAKb,EAAM,KAAKW,CAAK;AACzC,QAAIC,EAAO,WACTV,EAAK,cAAc,EAAE,MAAMU,EAAO,MAAM,GACpCZ,EAAM,uBACRc,EAAgBd,EAAM,qBAAqBA,EAAM,MAAM,GAEzDE,EAAK,YAAY,EAAE,MAAMU,EAAO,MAAM,MAGtCV,EAAK,qBAAqBQ,CAAM,GAChCR,EAAK,WAAW,EAAE,MAAMU,EAAO,MAAM,SAASA,EAAO,SAAS,GAC9DV,EAAK,YAAY,EAAE,MAAMU,EAAO,MAAM;AAAA,MAE1C,SAASG,GAAY;AAEnB,QAAAb,EAAK,qBAAqBQ,CAAM,GAChCR,EAAK,gBAAgB,EAAE,OAAAa,GAAO,SAASA,KAAA,gBAAAA,EAAO,SAAS,GACvDb,EAAK,YAAY,EAAE,OAAAa,GAAO;AAAA,MAC5B,UAAA;AACE,QAAAX,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;;;aAtFoBH,EAAA,aAAlBe,EASaC,GAAA;AAAA;QATY,SAAShB,EAAA;AAAA,QAAM,WAAU;AAAA,MAAA;mBAChD,MAOE;AAAA,UAPFiB,EAOEC,GAPFC,EAOE;AAAA,wBANSd,EAAA;AAAA,0DAAAA,EAAK,QAAAe;AAAA,YACb,gBAAcpB,EAAA;AAAA,YACd,kBAAgBA,EAAA;AAAA,YAChB,SAASG,EAAA;AAAA,UAAA,GACFkB,EAAAA,QAAM,EACb,UAAAb,GAAgB,GAAA,MAAA,IAAA,CAAA,cAAA,gBAAA,kBAAA,SAAA,CAAA;AAAA,QAAA;;6BAGrBc,EAAA,GAAAP,EAQEG,GARFC,EAQE;AAAA;oBANSd,EAAA;AAAA,sDAAAA,EAAK,QAAAe;AAAA,QACb,gBAAcpB,EAAA;AAAA,QACd,kBAAgBA,EAAA;AAAA,QAChB,SAASG,EAAA;AAAA,MAAA,GACFkB,EAAAA,QAAM,EACb,UAAAb,GAAgB,GAAA,MAAA,IAAA,CAAA,cAAA,gBAAA,kBAAA,SAAA,CAAA;AAAA;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineComponent as j, getCurrentInstance as G, ref as h, watch as H, computed as b, onMounted as O, resolveComponent as A, openBlock as W, createBlock as J, mergeProps as Q, createSlots as X, withCtx as p, renderSlot as Y, createVNode as B, createTextVNode as N, toDisplayString as M, createElementVNode as Z, withModifiers as F } from "vue";
|
|
2
2
|
import { ElMessage as m, ElMessageBox as _ } from "element-plus";
|
|
3
|
-
import { a as v, r as g } from "./http-
|
|
3
|
+
import { a as v, r as g } from "./http-Bs-dM076.mjs";
|
|
4
4
|
import { r as U } from "./linkage-FbL1mcz3.mjs";
|
|
5
5
|
import { h as ee, f as te } from "./props-DAytpx7D.mjs";
|
|
6
6
|
const ae = { class: "el-upload__tip" }, ne = /* @__PURE__ */ j({
|
|
@@ -197,4 +197,4 @@ const ae = { class: "el-upload__tip" }, ne = /* @__PURE__ */ j({
|
|
|
197
197
|
export {
|
|
198
198
|
ne as _
|
|
199
199
|
};
|
|
200
|
-
//# sourceMappingURL=Upload.vue_vue_type_script_setup_true_lang-
|
|
200
|
+
//# sourceMappingURL=Upload.vue_vue_type_script_setup_true_lang-D07Bhllc.mjs.map
|