@hotmi754/element-crud 1.0.4
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/README.md +222 -0
- package/dist/assets/element-crud.css +1 -0
- package/dist/element-crud.cjs.js +2 -0
- package/dist/element-crud.cjs.js.map +1 -0
- package/dist/element-crud.es.js +1745 -0
- package/dist/element-crud.es.js.map +1 -0
- package/dist/element-crud.umd.js +2 -0
- package/dist/element-crud.umd.js.map +1 -0
- package/dist/types/index.d.ts +290 -0
- package/package.json +47 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element-crud.es.js","sources":["../src/composables/useEventListener.js","../src/utils/is.js","../src/utils/index.js","../src/composables/useTableConfig.js","../src/components/Table/src/hooks.js","../src/components/Crud/src/hooks.js","../src/components/Crud/src/props.js","../src/components/Table/src/props.js","../src/components/Icon/index.jsx","../src/composables/useOpenDialog.js","../src/components/ColumnSettings/src/props.js","../src/components/ColumnSettings/src/ColumnSettings.jsx","../src/components/Table/src/tableItem.jsx","../src/components/Table/src/table.jsx","../src/components/Form/src/props.js","../src/components/Form/src/form.js","../src/components/Filter/src/filter.jsx","../src/utils/scroll-to.js","../src/components/Pagination/index.jsx","../src/components/Crud/src/crud.js","../src/composables/useCrud.js","../src/index.js"],"sourcesContent":["/**\r\n * useEventListener - 事件监听 Hook\r\n *\r\n * 提供带自动清理的事件监听功能\r\n */\r\nimport { ref, watch, unref } from 'vue'\r\nimport { useThrottleFn, useDebounceFn } from '@vueuse/core'\r\n\r\n/**\r\n * 事件监听 Hook\r\n * @param {Object} options - 配置项\r\n * @param {EventTarget} options.el - 监听元素\r\n * @param {string} options.name - 事件名称\r\n * @param {Function} options.listener - 监听函数\r\n * @param {boolean} [options.isDebounce=true] - 是否使用防抖\r\n * @param {number} [options.wait=80] - 防抖/节流等待时间\r\n * @param {boolean} [options.autoRemove=true] - 是否自动移除\r\n * @returns {Object} { removeEvent } 移除事件的方法\r\n */\r\nexport function useEventListener({\r\n el = window,\r\n isDebounce = true,\r\n listener,\r\n wait = 80,\r\n name,\r\n options,\r\n autoRemove = true\r\n}) {\r\n let remove\r\n const isAddRef = ref(false)\r\n\r\n if (el) {\r\n const element = ref(el)\r\n const handler = isDebounce\r\n ? useDebounceFn(listener, wait)\r\n : useThrottleFn(listener, wait)\r\n const realHandler = wait ? handler : listener\r\n\r\n const removeEventListener = e => {\r\n isAddRef.value = true\r\n e.removeEventListener(name, realHandler, options)\r\n }\r\n\r\n const addEventListener = e => e.addEventListener(name, realHandler, options)\r\n\r\n const removeWatch = watch(\r\n element,\r\n (val, oldVal, cleanUp) => {\r\n if (val) {\r\n !unref(isAddRef) && addEventListener(val)\r\n cleanUp(() => {\r\n autoRemove && removeEventListener(val)\r\n })\r\n }\r\n },\r\n {\r\n immediate: true\r\n }\r\n )\r\n\r\n remove = () => {\r\n removeEventListener(element.value)\r\n removeWatch()\r\n }\r\n\r\n return { removeEvent: remove }\r\n }\r\n}\r\n","/**\r\n * 类型判断工具函数\r\n */\r\nconst toString = Object.prototype.toString\r\n\r\nexport function is(val, type) {\r\n return toString.call(val) === `[object ${type}]`\r\n}\r\n\r\nexport function isDef(val) {\r\n return typeof val !== 'undefined'\r\n}\r\n\r\nexport function isUnDef(val) {\r\n return !isDef(val)\r\n}\r\n\r\nexport function isObject(val) {\r\n return val !== null && is(val, 'Object')\r\n}\r\n\r\nexport function isEmpty(val) {\r\n if (val === null || val === undefined) {\r\n return true\r\n }\r\n if (isArray(val) || isString(val)) {\r\n return val.length === 0\r\n }\r\n if (val instanceof Map || val instanceof Set) {\r\n return val.size === 0\r\n }\r\n if (isObject(val)) {\r\n return Object.keys(val).length === 0\r\n }\r\n return false\r\n}\r\n\r\nexport function isDate(val) {\r\n return is(val, 'Date')\r\n}\r\n\r\nexport function isNull(val) {\r\n return val === null\r\n}\r\n\r\nexport function isNullAndUnDef(val) {\r\n return isUnDef(val) && isNull(val)\r\n}\r\n\r\nexport function isNullOrUnDef(val) {\r\n return isUnDef(val) || isNull(val)\r\n}\r\n\r\nexport function isNumber(val) {\r\n return is(val, 'Number')\r\n}\r\n\r\nexport function isPromise(val) {\r\n return (\r\n is(val, 'Promise') &&\r\n isObject(val) &&\r\n isFunction(val.then) &&\r\n isFunction(val.catch)\r\n )\r\n}\r\n\r\nexport function isAsyncFunction(val) {\r\n return is(val, 'AsyncFunction')\r\n}\r\n\r\nexport function isString(val) {\r\n return is(val, 'String')\r\n}\r\n\r\nexport function isFunction(val) {\r\n return typeof val === 'function'\r\n}\r\n\r\nexport function isBoolean(val) {\r\n return is(val, 'Boolean')\r\n}\r\n\r\nexport function isRegExp(val) {\r\n return is(val, 'RegExp')\r\n}\r\n\r\nexport function isArray(val) {\r\n return val && Array.isArray(val)\r\n}\r\n\r\nexport function isWindow(val) {\r\n return typeof window !== 'undefined' && is(val, 'Window')\r\n}\r\n\r\nexport function isElement(val) {\r\n return isObject(val) && !!val.tagName\r\n}\r\n\r\nexport function isMap(val) {\r\n return is(val, 'Map')\r\n}\r\n\r\nexport const isServer = typeof window === 'undefined'\r\nexport const isClient = !isServer\r\n\r\nexport function isUrl(path) {\r\n const reg =\r\n /(((^https?:(?:\\/\\/)?)(?:[-;:&=\\+\\$,\\w]+@)?[A-Za-z0-9.-]+(?::\\d+)?|(?:www.|[-;:&=\\+\\$,\\w]+@)[A-Za-z0-9.-]+)((?:\\/[\\+~%\\/.\\w-_]*)?\\??(?:[-\\+=&;%@.\\w_]*)#?(?:[\\w]*))?)$/\r\n return reg.test(path)\r\n}\r\n","/**\r\n * 工具函数\r\n */\r\nimport { isObject, isArray, isFunction, isString, isNumber } from './is'\r\nimport { cloneDeep, merge } from 'lodash-es'\r\n\r\n/**\r\n * 深度合并\r\n */\r\nexport function deepMerge(src, target) {\r\n for (let key in target) {\r\n src[key] = isObject(src[key])\r\n ? deepMerge(src[key], target[key])\r\n : (src[key] = target[key])\r\n }\r\n return src\r\n}\r\n\r\n/**\r\n * 组件安装函数\r\n */\r\nexport const withInstallFunction = (fn, name) => {\r\n fn.install = app => {\r\n fn._context = app._context\r\n app.config.globalProperties[name] = fn\r\n }\r\n return fn\r\n}\r\n\r\nexport function withInstall(component, alias) {\r\n component.install = app => {\r\n app.component(component.name || component.__name, component)\r\n if (alias) {\r\n app.config.globalProperties[alias] = component\r\n }\r\n }\r\n return component\r\n}\r\n\r\n/**\r\n * 深度过滤\r\n * @param {Array} list - 列表\r\n * @param {string} key - 过滤的键\r\n * @param {any} value - 过滤的值\r\n * @returns {Array} 过滤后的列表\r\n */\r\nexport function deepFilter(list, key, value = true) {\r\n const _list = []\r\n for (let i = 0; i < list.length; i++) {\r\n const item = { ...list[i] }\r\n const isFilter = value ? item[key] : !item[key]\r\n if (isFilter) {\r\n if (item.children && item.children.length) {\r\n item.children = deepFilter(item.children, key, value)\r\n }\r\n _list.push(item)\r\n }\r\n }\r\n return _list\r\n}\r\n\r\nexport function filterFlat(list, key, value, reItem) {\r\n if (!isArray(list)) return []\r\n return list.reduce((prev, cur) => {\r\n const _cur = { ...cur }\r\n let _list = []\r\n if (_cur?.children?.length) {\r\n _list = filterFlat(_cur.children, key, value, reItem)\r\n _cur.children = undefined\r\n }\r\n if (Boolean(_cur[key]) === value) {\r\n _list.unshift(isFunction(reItem) ? reItem(_cur) : _cur)\r\n }\r\n return [...prev, ..._list]\r\n }, [])\r\n}\r\n\r\nexport function objectDeepMerge(obj1, obj2) {\r\n const _obj = cloneDeep(obj1)\r\n return merge(_obj, obj2)\r\n}\r\n\r\n/**\r\n * 添加单位\r\n * @param {number|string} value - 值\r\n * @param {string} defaultUnit - 默认单位\r\n * @returns {string} 带单位的字符串\r\n */\r\nexport function addUnit(value, defaultUnit = 'px') {\r\n if (!value) return ''\r\n if (isString(value)) {\r\n return value\r\n } else if (isNumber(value)) {\r\n return `${value}${defaultUnit}`\r\n }\r\n}\r\n\r\n/**\r\n * 生成 UUID\r\n */\r\nexport function getUUID() {\r\n let d = new Date().getTime()\r\n if (window.performance && typeof window.performance.now === 'function') {\r\n d += performance.now()\r\n }\r\n let uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(\r\n /[xy]/g,\r\n function (c) {\r\n let r = (d + Math.random() * 16) % 16 | 0\r\n d = Math.floor(d / 16)\r\n return (c == 'x' ? r : (r & 0x3) | 0x8).toString(16)\r\n }\r\n )\r\n return uuid\r\n}\r\n","/**\n * useTableConfig - 可插拔的表格配置系统\n *\n * 替代原项目 import.meta.glob + pinia 的方案,提供完全兼容的接口:\n * 用户通过 registerTableConfig() 注册配置,内部维护全局配置存储 + localStorage 持久化\n */\nimport { ref } from 'vue'\n\nconst SESSION_KEY = 'element_crud_table_config'\n\n// 全局配置存储\nlet globalModules = {}\n\n// 本地存储状态(prop/hide/sort)\nconst state = ref({})\n\n/**\n * 注册表配置\n * 用户调用此函数注册自己的配置,支持多次调用合并\n *\n * @param {Object} config - 配置对象,key 为表格类型名,value 为列配置数组或返回数组的函数\n * @param {Object} [config.tableWidthConfig] - 自定义宽度映射(可选)\n * @param {Object} [options] - 可选配置\n *\n * @example\n * registerTableConfig({\n * orderList: [\n * { label: '订单号', prop: 'order_no' },\n * { label: '金额', prop: 'total_amount', width: 'price' }\n * ],\n * tableWidthConfig: {\n * price: '120px',\n * normal: '150px'\n * }\n * })\n */\nexport function registerTableConfig(config, options = {}) {\n if (!config) return\n if (config.tableWidthConfig) {\n globalModules.tableWidthConfig = {\n ...(globalModules.tableWidthConfig || {}),\n ...config.tableWidthConfig,\n ...(options.tableWidthConfig || {})\n }\n }\n\n for (const key in config) {\n if (key === 'tableWidthConfig') continue\n globalModules[key] = config[key]\n }\n}\n\n/**\n * 清除所有注册的配置(用于测试或重置)\n */\nexport function clearTableConfig() {\n globalModules = {}\n state.value = {}\n}\n\n/**\n * 获取所有注册的配置模块\n */\nfunction getTableModules() {\n return globalModules\n}\n\n/**\n * 根据宽度配置解析列宽度(与原版 setWidthConfig 一致)\n * width 值为非数字字符串时视为宽度别名,去 tableWidthConfig 中查值\n */\nfunction resolveWidthConfig(columns) {\n const widthConfig = globalModules.tableWidthConfig || {}\n return columns.map(item => {\n const newItem = { ...item }\n if (newItem.width && isNaN(parseInt(newItem.width))) {\n newItem.width = widthConfig[newItem.width] || ''\n }\n if (newItem.minWidth && isNaN(parseInt(newItem.minWidth))) {\n newItem.minWidth = widthConfig[newItem.minWidth] || ''\n }\n return newItem\n })\n}\n\n/**\n * 初始化本地存储状态:把注册配置与 localStorage 中已存的 prop/hide/sort 对齐\n */\nfunction initState() {\n try {\n const localState = JSON.parse(localStorage.getItem(SESSION_KEY) || '{}')\n const _tableConfig = getTableModules()\n const currentTableConfig = {}\n\n for (const stateKey in _tableConfig) {\n if (stateKey === 'tableWidthConfig') continue\n const stateValue = _tableConfig[stateKey]\n const storageValue = localState[stateKey]\n\n // 处理函数类型的配置\n const resolvedColumns =\n typeof stateValue === 'function' ? stateValue() : stateValue\n if (!Array.isArray(resolvedColumns)) continue\n\n currentTableConfig[stateKey] = resolvedColumns.map((item, index) => {\n const current = storageValue?.find(field => field.prop === item.prop)\n return {\n prop: item.prop,\n hide: current ? Boolean(current.hide) : Boolean(item.hide),\n sort: current ? current.sort : index\n }\n })\n }\n\n state.value = currentTableConfig\n } catch (e) {\n // SSR 或无 localStorage 环境静默降级\n state.value = {}\n }\n}\n\n/**\n * useTableConfig - 表格配置管理 Hook\n *\n * 提供与原项目完全兼容的接口:\n * - getTableConfig(type) - 获取配置\n * - setTableConfig(type, data) - 设置配置\n * - resetTableConfig(type) - 重置配置\n */\nexport function useTableConfig() {\n // 初始化状态\n if (Object.keys(state.value).length === 0) {\n initState()\n }\n\n /**\n * 获取表格列配置\n * @param {string} type - 表格类型名\n * @returns {Array} 列配置数组(按 sort 排序,应用 hide 状态与宽度别名解析)\n */\n const getTableConfig = type => {\n const _tableConfig = getTableModules()\n const rawColumns = _tableConfig[type]\n\n if (!rawColumns) {\n console.warn(\n `[ElementCrud] Table config \"${type}\" not found. Did you register it via registerTableConfig()?`\n )\n return []\n }\n\n // 处理函数类型的配置,并解析宽度别名\n const columns = resolveWidthConfig(\n typeof rawColumns === 'function' ? rawColumns() : rawColumns\n )\n\n return columns\n .map(item => {\n const current = state.value[type]?.find(\n field => field.prop === item.prop\n )\n return {\n ...item,\n hide: current ? current.hide : item.hide,\n sort: current ? current.sort : 0\n }\n })\n .sort((a, b) => a.sort - b.sort)\n }\n\n /**\n * 设置表格列配置(用于 ColumnSettings 保存)\n * @param {string} type - 表格类型名\n * @param {Array} data - 新的列配置\n */\n const setTableConfig = (type, data) => {\n const newData = data.map((item, index) => ({\n prop: item.prop,\n hide: !!item.hide,\n sort: index\n }))\n state.value[type] = newData\n\n persist(localState => {\n localState[type] = newData\n })\n }\n\n /**\n * 重置表格列配置为默认值\n * @param {string} type - 表格类型名\n */\n const resetTableConfig = type => {\n const _tableConfig = getTableModules()\n const rawColumns = _tableConfig[type]\n\n if (!rawColumns) return\n\n const columns =\n typeof rawColumns === 'function' ? rawColumns() : rawColumns\n\n state.value[type] = columns.map((item, index) => ({\n prop: item.prop,\n hide: Boolean(item.hide),\n sort: index\n }))\n\n persist(localState => {\n localState[type] = state.value[type]\n })\n }\n\n return {\n getTableConfig,\n setTableConfig,\n resetTableConfig\n }\n}\n\n/** localStorage 持久化封装,异常时静默降级 */\nfunction persist(mutate) {\n try {\n const localState = JSON.parse(localStorage.getItem(SESSION_KEY) || '{}')\n mutate(localState)\n localStorage.setItem(SESSION_KEY, JSON.stringify(localState))\n } catch (e) {\n // 无 localStorage 环境(SSR/隐私模式)静默降级\n }\n}\n","/**\n * Table 组件 Hooks\n */\nimport { computed, unref, shallowRef } from 'vue'\nimport { deepFilter } from '../../../utils'\nimport { isObject, isString, isEmpty } from '../../../utils/is'\nimport { useTableConfig } from '../../../composables/useTableConfig'\n\n/**\n * 表格列配置 Hook\n * @param {Object} props - 组件 props\n * @returns {ComputedRef} 计算后的列配置\n */\nexport function useTableColumns(props) {\n const { getTableConfig } = useTableConfig()\n\n return computed(() => {\n const _columns = isString(props.columns)\n ? (() => {\n const _columns = getTableConfig(props.columns)\n return isEmpty(_columns) ? [] : _columns\n })()\n : props.columns\n return deepFilter(_columns || [], 'hide', false)\n })\n}\n\n/**\n * Table 默认绑定配置 Hook(与原版一致:表头对齐取 headerAlign)\n */\nexport function useTableDefaultBind(props) {\n return computed(() => ({\n showOverflowTooltip: props.showOverflowTooltip || false,\n align: props.align,\n headerAlign: props.headerAlign\n }))\n}\n\n/**\n * Table 属性绑定 Hook\n */\nexport function useTableBind(currentBind, defaultBind) {\n return computed(() => {\n const _currentBind = unref(currentBind)\n const _defaultBind = unref(defaultBind)\n const _option = isObject(_currentBind) ? { ..._currentBind } : undefined\n if (_option) {\n _option.slot && delete _option.slot\n _option.children && delete _option.children\n }\n return Object.assign({}, _defaultBind, _option)\n })\n}\n\n/**\n * 分页 Hook\n */\nexport function usePagination(emit) {\n function sizeChange(size) {\n emit('update:pageSize', size)\n emit('load')\n }\n\n function currentChange(current) {\n emit('update:currentPage', current)\n emit('load')\n }\n\n return {\n sizeChange,\n currentChange\n }\n}\n\n/**\n * Table 方法 Hook(原版实现:shallowRef 承接 ElTable 实例 ref)\n */\nexport function useTableMethods() {\n const table = shallowRef({})\n\n function clearSelection() {\n table.value?.clearSelection?.()\n }\n\n const getSelectionRows = () => table.value?.getSelectionRows?.()\n\n function toggleRowSelection(row, selected) {\n table.value?.toggleRowSelection?.(row, selected)\n }\n\n function toggleAllSelection() {\n table.value?.toggleAllSelection?.()\n }\n\n function toggleRowExpansion(row, expanded) {\n table.value?.toggleRowExpansion?.(row, expanded)\n }\n\n function setCurrentRow(row) {\n table.value?.setCurrentRow?.(row)\n }\n\n function clearSort() {\n table.value?.clearSort?.()\n }\n\n function clearFilter(columnKeys) {\n table.value?.clearFilter?.(columnKeys)\n }\n\n function doLayout() {\n table.value?.doLayout?.()\n }\n\n function sort(prop, order) {\n table.value?.sort?.(prop, order)\n }\n\n return {\n table,\n clearSelection,\n getSelectionRows,\n toggleRowSelection,\n toggleAllSelection,\n toggleRowExpansion,\n setCurrentRow,\n clearSort,\n clearFilter,\n doLayout,\n sort\n }\n}\n","/**\n * Crud 组件 Hooks\n */\nimport { ref, useSlots } from 'vue'\n\nexport { useTableMethods } from '../../Table/src/hooks'\n\n/**\n * Crud Slots 处理 Hook\n */\nexport function useCrudSlots() {\n const slots = useSlots()\n const tableSlots = {}\n const filterSlots = {}\n const searchSlots = {}\n\n for (const key in slots) {\n const item = slots[key]\n if (/^table-/.test(key)) {\n const _key = key.replace('table-', '')\n tableSlots[_key] = item\n }\n if (/^search-/.test(key) || /^moreSearch-/.test(key)) {\n searchSlots[key] = item\n }\n if (/^filter-/.test(key)) {\n filterSlots[key] = item\n }\n }\n\n return {\n tableSlots,\n searchSlots,\n filterSlots\n }\n}\n\n/**\n * 表格高度计算 Hook(与原版一致,通过 UUID 定位 header/footer)\n */\nexport function useTableHeight(uuid) {\n const tableHeight = ref('')\n const headerId = `#${uuid}-header`\n const footerId = `#${uuid}-footer`\n\n function calcTableHeight() {\n const footerHeight = document.querySelector(footerId)?.clientHeight || 0\n const headerHeight = document.querySelector(headerId)?.clientHeight || 0\n tableHeight.value = `calc(100% - ${footerHeight + headerHeight}px)`\n }\n\n return {\n tableHeight,\n calcTableHeight\n }\n}\n","/**\r\n * Crud 组件 Props\r\n */\r\nexport default {\r\n /**\r\n * 列表列配置项\r\n * 支持数组或字符串(字符串时从 tableConfig 获取)\r\n */\r\n tableColumns: {\r\n type: [Array, String],\r\n default: () => []\r\n },\r\n /**\r\n * 表单筛选配置\r\n */\r\n searchColumns: {\r\n type: Array,\r\n default: () => []\r\n },\r\n /**\r\n * 更多表单筛选配置\r\n */\r\n moreSearchColumns: {\r\n type: Array,\r\n default: () => []\r\n },\r\n /**\r\n * 绑定的搜索参数\r\n */\r\n search: {\r\n type: Object,\r\n default: () => ({})\r\n },\r\n /**\r\n * 请求方法\r\n * @param {{ pageInfo: { page: number, limit: number }, params: Object }} options\r\n * @returns {{ data: Array, total: number, success: boolean }}\r\n */\r\n request: {\r\n type: Function,\r\n default: () => {}\r\n },\r\n /**\r\n * 防抖时间(毫秒)\r\n */\r\n debounceTime: {\r\n type: Number,\r\n default: 500\r\n },\r\n /**\r\n * 请求后回调\r\n */\r\n afterRequest: {\r\n type: Function,\r\n default: () => {}\r\n },\r\n /**\r\n * 是否初始化时请求\r\n */\r\n init: {\r\n type: Boolean,\r\n default: true\r\n },\r\n /**\r\n * 分页每页条数\r\n */\r\n limit: {\r\n type: Number,\r\n default: 20\r\n },\r\n /**\r\n * 底部 footer 反转\r\n */\r\n footerReverse: {\r\n type: Boolean,\r\n default: false\r\n }\r\n}\r\n","/**\r\n * Table 组件配置项\r\n */\r\n\r\n/**\r\n * @typedef {Object} TableColumn\r\n * @property {string} label - 列标题\r\n * @property {string} prop - 字段名\r\n * @property {string} [width] - 列宽度\r\n * @property {string} [minWidth] - 最小宽度\r\n * @property {boolean} [hide] - 是否隐藏\r\n * @property {Function} [render] - 自定义渲染函数\r\n */\r\n\r\nexport default {\r\n /**\r\n * 是否多选表格\r\n */\r\n selection: {\r\n type: [Boolean, Object],\r\n default: false\r\n },\r\n /**\r\n * 是否展开表格\r\n */\r\n expand: {\r\n type: [Boolean, Object],\r\n default: false\r\n },\r\n /**\r\n * row 空值填充\r\n */\r\n emptyFill: {\r\n type: String,\r\n default: '--'\r\n },\r\n /**\r\n * 是否显示序号列\r\n */\r\n index: {\r\n type: [Boolean, Object],\r\n default: false\r\n },\r\n /**\r\n * 是否有操作列\r\n */\r\n action: {\r\n type: [Boolean, Object],\r\n default: false\r\n },\r\n /**\r\n * 是否有行排序列\r\n */\r\n drop: {\r\n type: [Boolean, Object],\r\n default: false\r\n },\r\n /**\r\n * 列配置项\r\n * 支持数组或字符串(字符串时从 tableConfig 获取)\r\n */\r\n columns: {\r\n type: [Array, String],\r\n default: () => []\r\n },\r\n /**\r\n * 源数据\r\n */\r\n data: {\r\n type: Array,\r\n default: () => []\r\n },\r\n /**\r\n * 表格高度\r\n */\r\n height: {\r\n type: [String, Number]\r\n },\r\n /**\r\n * 表格最大高度\r\n */\r\n maxHeight: {\r\n type: [String, Number]\r\n },\r\n /**\r\n * 同 element-plus table\r\n */\r\n fit: {\r\n type: Boolean,\r\n default: true\r\n },\r\n /**\r\n * 斑马纹\r\n */\r\n stripe: Boolean,\r\n /**\r\n * 边框\r\n */\r\n border: Boolean,\r\n /**\r\n * 行数据的 Key\r\n */\r\n rowKey: {\r\n type: [String, Function]\r\n },\r\n /**\r\n * 是否显示表头\r\n */\r\n showHeader: {\r\n type: Boolean,\r\n default: true\r\n },\r\n /**\r\n * 是否显示合计行\r\n */\r\n showSummary: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 合计计算方法\r\n */\r\n summaryMethod: {\r\n type: Function\r\n },\r\n /**\r\n * 行 className\r\n */\r\n rowClassName: {\r\n type: [String, Function]\r\n },\r\n /**\r\n * 行 style\r\n */\r\n rowStyle: {\r\n type: [Object, Function]\r\n },\r\n /**\r\n * 单元格 className\r\n */\r\n cellClassName: {\r\n type: [String, Function]\r\n },\r\n /**\r\n * 单元格 style\r\n */\r\n cellStyle: {\r\n type: [Object, Function]\r\n },\r\n headerRowClassName: [String, Function],\r\n headerRowStyle: [Object, Function],\r\n headerCellClassName: [String, Function],\r\n headerCellStyle: [Object, Function],\r\n highlightCurrentRow: Boolean,\r\n currentRowKey: [String, Number],\r\n emptyText: String,\r\n expandRowKeys: Array,\r\n defaultExpandAll: Boolean,\r\n defaultSort: Object,\r\n tooltipEffect: String,\r\n spanMethod: Function,\r\n selectOnIndeterminate: {\r\n type: Boolean,\r\n default: true\r\n },\r\n indent: {\r\n type: Number,\r\n default: 16\r\n },\r\n treeProps: {\r\n type: Object,\r\n default: () => ({\r\n hasChildren: 'hasChildren',\r\n children: 'children'\r\n })\r\n },\r\n lazy: Boolean,\r\n load: Function,\r\n style: {\r\n type: Object,\r\n default: () => ({})\r\n },\r\n className: {\r\n type: String,\r\n default: ''\r\n },\r\n /**\r\n * 是否显示溢出提示\r\n */\r\n showOverflowTooltip: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 对齐方式\r\n */\r\n align: {\r\n type: String,\r\n default: undefined\r\n },\r\n /**\r\n * 表头对齐方式\r\n */\r\n headerAlign: {\r\n type: String,\r\n default: undefined\r\n },\r\n /**\r\n * 尺寸\r\n */\r\n size: {\r\n type: String,\r\n default: undefined\r\n },\r\n /**\r\n * 自定义表格宽度配置项\r\n */\r\n widthOptions: {\r\n type: Object,\r\n default: () => ({})\r\n }\r\n}\r\n","/**\n * Icon 组件\n *\n * el- 前缀走 Element Plus 图标,其余按 svg symbol(#icon-name)渲染\n * 与原项目 src/components/Icon/index.vue 对齐\n */\nimport { defineComponent, computed } from 'vue'\nimport { ElIcon } from 'element-plus'\nimport * as ElSvg from '@element-plus/icons-vue'\nimport { upperFirst } from 'lodash-es'\nimport { addUnit } from '../../utils'\nimport { isUnDef } from '../../utils/is'\n\nexport default defineComponent({\n name: 'Icon',\n props: {\n size: {\n type: Number,\n default: 16\n },\n color: {\n type: String\n },\n name: {\n required: true,\n type: String,\n default: 'Fold'\n },\n type: {\n type: String\n }\n },\n setup(props) {\n const style = computed(() => {\n if (!props.size && !props.color && !props.type) return {}\n const color =\n props.color || !props.type\n ? props.color\n : `var(--el-color-${props.type})`\n return {\n fontSize: isUnDef(props.size) ? undefined : addUnit(props.size),\n color: color\n }\n })\n\n const colorStyle = computed(() => {\n if (props.color || !props.type) {\n return {\n color: props.color\n }\n } else {\n return {\n color: `var(--el-color-${props.type})`\n }\n }\n })\n\n const isElementIcon = computed(() => {\n return /^el-/.test(props.name)\n })\n\n const SvgName = computed(() => {\n return isElementIcon.value\n ? upperFirst(props.name.replace('el-', ''))\n : '#icon-' + props.name\n })\n\n return () => {\n if (isElementIcon.value) {\n const ElSvgIcon = ElSvg[SvgName.value]\n return (\n <ElIcon\n size={props.size}\n color={props.color}\n class=\"el-svg-icon\"\n style={colorStyle.value}>\n {ElSvgIcon ? <ElSvgIcon /> : null}\n </ElIcon>\n )\n }\n // svg symbol 分支:依赖宿主工程注入的 svg sprite(vite-plugin-svg-icons)\n return (\n <svg class=\"svg-icon\" aria-hidden=\"true\" style={style.value}>\n <use xlink:href={SvgName.value} />\n </svg>\n )\n }\n }\n})\n","/**\r\n * useOpenDialog - 弹窗控制 Hook\r\n *\r\n * 提供弹窗显示/隐藏控制\r\n */\r\nimport { ref } from 'vue'\r\n\r\n/**\r\n * 弹窗控制 Hook\r\n * @returns {Object} { visible, openDialog, closeDialog }\r\n */\r\nexport function useOpenDialog() {\r\n const visible = ref(false)\r\n\r\n const openDialog = () => {\r\n visible.value = true\r\n }\r\n\r\n const closeDialog = () => {\r\n visible.value = false\r\n }\r\n\r\n return {\r\n visible,\r\n openDialog,\r\n closeDialog\r\n }\r\n}\r\n","/**\n * ColumnSettings 组件 Props\n * 与原项目 src/components/ColumnSettings/src/props.js 一致\n */\nexport default {\n title: {\n type: String,\n default: '列表显示字段'\n },\n type: {\n type: String,\n required: true\n }\n}\n","/**\n * ColumnSettings 组件\n *\n * 列显示/排序设置抽屉,带拖拽排序与 localStorage 持久化\n * 与原项目 src/components/ColumnSettings/src/ColumnSettings.vue 对齐\n */\nimport { defineComponent, ref, h } from 'vue'\nimport { ElDrawer, ElButton, ElCheckbox } from 'element-plus'\nimport { useTableConfig } from '../../../composables/useTableConfig'\nimport { useOpenDialog } from '../../../composables/useOpenDialog'\nimport Draggable from 'vuedraggable-es'\nimport Icon from '../../Icon/index.jsx'\nimport defaultProps from './props'\n\nexport default defineComponent({\n name: 'MColumnSettings',\n props: defaultProps,\n emits: ['update:modelValue', 'submit'],\n setup(props, { emit, expose }) {\n const { setTableConfig, getTableConfig, resetTableConfig } =\n useTableConfig()\n const { visible, openDialog, closeDialog } = useOpenDialog()\n const currentValue = ref([])\n\n const init = () => {\n openDialog()\n // 拷贝一份避免直接改动注册配置;仅保留有 label 的列参与设置\n currentValue.value = JSON.parse(\n JSON.stringify(getTableConfig(props.type) || [])\n ).filter(item => item.label)\n }\n\n const onMove = e => {\n if (disabledMove(e.relatedContext.element)) return false\n return true\n }\n\n const disabledMove = el => {\n return el.fixed === 'left'\n }\n\n const onSubmit = () => {\n setTableConfig(props.type, currentValue.value)\n emit('update:modelValue', currentValue.value)\n emit('submit')\n closeDialog()\n }\n\n const onReset = () => {\n resetTableConfig(props.type)\n emit('submit')\n closeDialog()\n }\n\n const changeStatus = element => {\n element.hide = !element.hide\n }\n\n expose({ init })\n\n return () => {\n return h('div', { class: 'm-column-settings' }, [\n h(\n ElDrawer,\n {\n modelValue: visible.value,\n 'onUpdate:modelValue': val => (visible.value = val),\n size: '280px',\n direction: 'rtl',\n modal: true,\n withHeader: false,\n appendToBody: true,\n destroyOnClose: true,\n onClose: closeDialog\n },\n {\n default: () => [\n h('div', { class: 'm-drawer-title' }, [\n h('span', null, props.title),\n h(Icon, {\n class: 'cursor-pointer',\n name: 'el-close',\n size: 16,\n onClick: closeDialog\n })\n ]),\n h('div', { class: 'settings-body' }, [\n h(\n Draggable,\n {\n modelValue: currentValue.value,\n 'onUpdate:modelValue': val => (currentValue.value = val),\n draggable: '.settings-item',\n filter: '.forbid',\n itemKey: 'prop',\n move: onMove,\n handle: '.handle'\n },\n {\n item: ({ element }) =>\n h('div', { class: 'settings-item' }, [\n h(Icon, {\n class: [\n 'handle',\n 'cursor-move',\n 'mr-2',\n disabledMove(element)\n ? 'forbid cursor-not-allowed'\n : ''\n ],\n name: 'sortDot',\n size: 20\n }),\n h(\n ElCheckbox,\n {\n checked: !element.hide,\n disabled: element.disabled,\n onChange: () => changeStatus(element)\n },\n () => element.label\n )\n ])\n }\n )\n ])\n ],\n footer: () =>\n h('div', { class: 'settings-footer' }, [\n h(ElButton, { plain: true, onClick: closeDialog }, () => '取消'),\n h(\n ElButton,\n { type: 'primary', onClick: onSubmit },\n () => '保存'\n ),\n h(\n ElButton,\n { type: 'primary', plain: true, onClick: onReset },\n () => '恢复默认'\n )\n ])\n }\n )\n ])\n }\n }\n})\n","/**\n * Table Item 组件\n *\n * 递归渲染表格列(与原版 tableItem.jsx 对齐)\n */\nimport { defineComponent, h, inject, toRefs, shallowRef } from 'vue'\nimport { ElTableColumn } from 'element-plus'\nimport { useTableBind } from './hooks'\nimport { isFunction, isString } from '../../../utils/is'\nimport { get } from 'lodash-es'\nimport Icon from '../../Icon/index.jsx'\nimport MColumnSettings from '../../ColumnSettings/index.js'\n\nconst MTableItem = defineComponent({\n name: 'MTableItem',\n props: {\n item: {\n type: Object,\n required: true\n },\n size: {\n type: String,\n default: undefined\n }\n },\n setup(props, { slots }) {\n const { item } = toRefs(props)\n const defaultBind = inject('defaultBind')\n const bindColumn = useTableBind(item, defaultBind)\n const type = inject('columns')\n const emptyFill = inject('emptyFill')\n\n function createHeader(scope) {\n const columnsSettingRef = shallowRef()\n if (slots[item.value.prop + '-header']) {\n return slots[item.value.prop + '-header']({\n ...scope,\n size: props.size\n })\n } else if (item.value.isSetting) {\n const flexType = {\n right: 'flex-end',\n center: 'center',\n left: 'flex-start'\n }\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent:\n flexType[item.value['align'] || item.value['headerAlign']]\n }}>\n <span>{item.value.label}</span>\n <Icon\n name={item.value.icon || 'el-operation'}\n onClick={() => columnsSettingRef.value.init()}\n />\n {isString(type) ? (\n <MColumnSettings ref={columnsSettingRef} type={type} />\n ) : null}\n </div>\n )\n } else {\n return item.value.label\n }\n }\n\n function createDefault(scope) {\n let list = []\n if (item.value?.children?.length) {\n const child = item.value.children.map(childItem => {\n return h(MTableItem, { item: childItem, size: props.size }, slots)\n })\n list.push(child)\n } else if (slots[item.value.prop]) {\n list.push(slots[item.value.prop]({ ...scope, size: props.size }))\n } else if (item.value.render) {\n list.push(\n isFunction(item.value.render)\n ? item.value.render(scope.row, scope.$index)\n : String(item.value.render)\n )\n } else {\n list.push(get(scope.row, item.value.prop, '') ?? emptyFill)\n }\n return list\n }\n\n return () => (\n <ElTableColumn {...bindColumn.value}>\n {{\n header: scope => createHeader(scope),\n default: scope => createDefault(scope)\n }}\n </ElTableColumn>\n )\n }\n})\n\nexport default MTableItem\n","/**\n * Table 组件\n *\n * 基于 Element Plus Table 的增强组件\n * 支持通过字符串引用 tableConfig 配置\n */\nimport { defineComponent, h, mergeProps, toRefs, provide, shallowRef } from 'vue'\nimport { ElTable, ElTableColumn, useAttrs } from 'element-plus'\nimport { reactiveOmit } from '@vueuse/core'\nimport props from './props'\nimport TableItem from './tableItem'\nimport Icon from '../../Icon/index.jsx'\nimport MColumnSettings from '../../ColumnSettings/index.js'\nimport {\n useTableColumns,\n useTableDefaultBind,\n useTableBind,\n useTableMethods\n} from './hooks'\nimport { isString } from '../../../utils/is'\nimport { addUnit } from '../../../utils'\n\nexport default defineComponent({\n name: 'Table',\n props,\n setup(props, { slots, expose }) {\n const { selection, expand, index, action, height } = toRefs(props)\n // element-plus 导出的 useAttrs 返回 computed ref\n const attrs = useAttrs()\n const columns = useTableColumns(props)\n const defaultBind = useTableDefaultBind(props)\n const bindSelection = useTableBind(selection, defaultBind)\n const upBindExpand = useTableBind(expand, defaultBind)\n const bindIndex = useTableBind(index, defaultBind)\n const bindAction = useTableBind(action, defaultBind)\n\n const {\n table,\n clearSelection,\n toggleRowSelection,\n toggleAllSelection,\n toggleRowExpansion,\n setCurrentRow,\n clearSort,\n clearFilter,\n doLayout,\n sort,\n getSelectionRows\n } = useTableMethods()\n\n const tableConfig = reactiveOmit(\n props,\n 'showOverflowTooltip',\n 'align',\n 'headerAlign'\n )\n\n provide('defaultBind', defaultBind)\n provide('columns', props.columns)\n provide('emptyFill', props.emptyFill)\n\n expose({\n clearSelection,\n toggleRowSelection,\n toggleAllSelection,\n toggleRowExpansion,\n setCurrentRow,\n clearSort,\n clearFilter,\n doLayout,\n getSelectionRows,\n sort\n })\n\n function createColumn() {\n let list = []\n\n function createColumnsSetting() {\n const columnsSettingRef = shallowRef()\n const flexType = {\n right: 'flex-end',\n center: 'center',\n left: 'flex-start'\n }\n return (\n <div\n class=\"flex items-center\"\n style={{\n justifyContent:\n flexType[\n bindAction.value['align'] || bindAction.value['headerAlign']\n ]\n }}>\n <span>{bindAction.value.label}</span>\n <Icon\n name={bindAction.value.icon || 'el-operation'}\n onClick={() => columnsSettingRef.value.init()}\n />\n {isString(props.columns) ? (\n <MColumnSettings ref={columnsSettingRef} type={props.columns} />\n ) : null}\n </div>\n )\n }\n\n if (expand.value !== false && slots.expand) {\n list.push(\n <ElTableColumn {...mergeProps(bindExpand.value, { type: 'expand' })}>\n {{\n default: scope => slots.expand && slots.expand(scope)\n }}\n </ElTableColumn>\n )\n }\n\n if (selection.value) {\n list.push(\n <ElTableColumn\n {...mergeProps(bindSelection.value, { type: 'selection' })}\n />\n )\n }\n\n if (index.value) {\n list.push(\n <ElTableColumn\n {...mergeProps(bindIndex.value, { type: 'index' })}\n />\n )\n }\n\n if (columns.value) {\n const tableItem = columns.value.map(item => {\n return h(TableItem, { item, size: props.size }, slots)\n })\n list = list.concat(tableItem)\n }\n\n if (slots.default) {\n list = list.concat(slots.default())\n }\n\n if (action.value !== false && slots.action) {\n list.push(\n <ElTableColumn {...bindAction.value}>\n {{\n default: scope =>\n slots.action && slots.action({ ...scope, size: props.size }),\n header: scope =>\n slots['action-header']\n ? slots['action-header']({ ...scope, size: props.size })\n : bindAction.value.isSetting\n ? createColumnsSetting()\n : h('span', {}, bindAction.value.label)\n }}\n </ElTableColumn>\n )\n }\n\n return list\n }\n\n return () => (\n <div style={{ height: addUnit(height.value) }}>\n <ElTable\n {...mergeProps(tableConfig, attrs.value, {\n ref: table,\n height: height.value ? '100%' : null\n })}>\n {{\n default: () => createColumn(),\n append: slots.append,\n empty: slots.empty\n }}\n </ElTable>\n </div>\n )\n }\n})\n","/**\n * Form 组件 Props\n * 与原项目 Form/src/props.ts 关键项对齐;element-plus formProps 其余键\n * 由 useTableConfig 不涉及、可直接通过 attrs 透传给 ElForm\n */\nexport default {\n modelValue: {\n type: Object,\n default: () => ({})\n },\n columns: {\n type: Array,\n default: () => []\n },\n inline: {\n type: Boolean,\n default: false\n },\n labelWidth: {\n type: [String, Number],\n default: 80\n },\n labelPosition: {\n type: String,\n default: 'top'\n },\n size: {\n type: String,\n default: undefined\n },\n menu: {\n type: Object,\n default: () => ({})\n }\n}\n","/**\n * Form 组件\n *\n * 搜索/筛选表单:按 item.component 分发到 Element Plus 原生控件\n * 与原项目 Form → FormItem 分发链路的行为对齐(业务级 upload 组件不在抽取范围,\n * 通过 item.prop 同名插槽注入自定义控件)\n *\n * 支持 component: input | select | radio | checkbox | date | cascader | treeSelect | inputNumber\n */\nimport { defineComponent, h, ref, computed, toRefs } from 'vue'\nimport {\n ElForm,\n ElFormItem,\n ElInput,\n ElSelect,\n ElOption,\n ElDatePicker,\n ElCascader,\n ElTreeSelect,\n ElInputNumber,\n ElRadioGroup,\n ElRadio,\n ElCheckboxGroup,\n ElCheckbox\n} from 'element-plus'\nimport { get, set, has, omit } from 'lodash-es'\nimport { isString } from '../../../utils/is'\nimport props from './props'\n\nconst DEFAULT_VALUE_NAME = 'value'\nconst DEFAULT_LABEL_NAME = 'label'\n\n// 需要从 item 上剔除、避免透传给控件的键\nconst OMIT_KEYS = [\n 'component',\n 'prop',\n 'data',\n 'render',\n 'children',\n 'slot',\n 'class',\n 'initValue',\n 'labelName',\n 'valueName',\n 'all',\n 'placeholder',\n 'prefixIcon',\n 'size',\n 'width',\n 'type',\n 'props'\n]\n\nexport default defineComponent({\n name: 'MForm',\n props,\n emits: ['update:modelValue', 'change'],\n setup(props_, { emit, slots, expose }) {\n const { columns, modelValue, inline } = toRefs(props_)\n const formRef = ref(null)\n\n const formModel = computed({\n get: () => props_.modelValue,\n set: val => emit('update:modelValue', val)\n })\n\n function upData(prop, value) {\n const newModel = { ...formModel.value }\n set(newModel, prop, value)\n emit('update:modelValue', newModel)\n emit('change', newModel)\n }\n\n function validate(callback) {\n return formRef.value?.validate(callback)\n }\n function resetFields() {\n formRef.value?.resetFields()\n }\n function clearValidate(fieldProps) {\n formRef.value?.clearValidate(fieldProps)\n }\n function validateField(fieldProps, cb) {\n formRef.value?.validateField(fieldProps, cb)\n }\n function scrollToField(prop) {\n formRef.value?.scrollToField?.(prop)\n }\n\n expose({ validate, resetFields, clearValidate, validateField, scrollToField })\n\n // select 多选 + all 的全选状态\n const checkAllState = ref({ checked: false, indeterminate: false })\n\n /**\n * 下拉/级联数据加工:单选且配置了 all 时自动补「全部」选项(value=0)\n */\n function resolveData(item) {\n if (\n ['cascader', 'select'].includes(item.component) &&\n item.all &&\n !item.multiple\n ) {\n const data = [...(item.data ?? [])]\n const labelText = isString(item.all) ? item.all : '全部'\n const labelName = item.labelName || DEFAULT_LABEL_NAME\n if (data?.[0]?.[labelName] !== labelText) {\n data.unshift({\n [labelName]: labelText,\n [item.valueName || DEFAULT_VALUE_NAME]: 0\n })\n }\n return data\n }\n return item.data\n }\n\n function handleChange() {\n emit('change', formModel.value)\n }\n\n /** select 多选「全部」联动 */\n function onSelectChange(item, val) {\n if (item.multiple && item.all) {\n const total = resolveData(item)?.length || 0\n if (!val || val.length === 0) {\n checkAllState.value = { checked: false, indeterminate: false }\n } else if (val.length === total) {\n checkAllState.value = { checked: true, indeterminate: false }\n } else {\n checkAllState.value = { checked: false, indeterminate: true }\n }\n }\n handleChange()\n }\n\n function handleCheckAll(item, val) {\n if (val) {\n upData(\n item.prop,\n (resolveData(item) || []).map(\n i => i[item.valueName || DEFAULT_VALUE_NAME]\n )\n )\n } else {\n upData(item.prop, [])\n }\n checkAllState.value = { checked: !!val, indeterminate: false }\n }\n\n function renderFormControl(item, currentValue) {\n const bindItem = omit(item, OMIT_KEYS)\n const width =\n item.width !== undefined\n ? typeof item.width === 'number'\n ? `${item.width}px`\n : String(item.width)\n : undefined\n const style = width ? { width } : {}\n\n switch (item.component) {\n case 'select': {\n const labelName = item.labelName || DEFAULT_LABEL_NAME\n const valueName = item.valueName || DEFAULT_VALUE_NAME\n const data = resolveData(item)\n\n return h(\n ElSelect,\n {\n ...bindItem,\n modelValue: currentValue,\n 'onUpdate:modelValue': val => upData(item.prop, val),\n size: item.size,\n style,\n fitInputWidth: true,\n onChange: val => onSelectChange(item, val),\n ...(item.clearable === undefined ? { clearable: true } : {})\n },\n {\n ...(item.multiple && item.all\n ? {\n header: () =>\n h(\n ElCheckbox,\n {\n modelValue: checkAllState.value.checked,\n indeterminate: checkAllState.value.indeterminate,\n onChange: val => handleCheckAll(item, val)\n },\n () => (isString(item.all) ? item.all : '全部')\n )\n }\n : {}),\n default: () =>\n (data || []).map(i =>\n h(ElOption, {\n key: i[valueName],\n label: i[labelName],\n value: i[valueName],\n disabled: i.disabled\n })\n )\n }\n )\n }\n\n case 'radio':\n return h(\n ElRadioGroup,\n {\n ...bindItem,\n modelValue: currentValue,\n 'onUpdate:modelValue': val => upData(item.prop, val),\n size: item.size,\n onChange: handleChange\n },\n () =>\n (item.data || []).map(i =>\n h(\n ElRadio,\n {\n key: i[item.valueName || DEFAULT_VALUE_NAME],\n label: i[item.valueName || DEFAULT_VALUE_NAME],\n disabled: i.disabled\n },\n () => i[item.labelName || DEFAULT_LABEL_NAME]\n )\n )\n )\n\n case 'checkbox':\n return h(\n ElCheckboxGroup,\n {\n ...bindItem,\n modelValue: currentValue ?? [],\n 'onUpdate:modelValue': val => upData(item.prop, val),\n size: item.size,\n onChange: handleChange\n },\n () =>\n (item.data || []).map(i =>\n h(\n ElCheckbox,\n {\n key: i[item.valueName || DEFAULT_VALUE_NAME],\n label: i[item.valueName || DEFAULT_VALUE_NAME],\n disabled: i.disabled\n },\n () => i[item.labelName || DEFAULT_LABEL_NAME]\n )\n )\n )\n\n case 'cascader':\n return h(ElCascader, {\n ...bindItem,\n modelValue: currentValue,\n 'onUpdate:modelValue': val => upData(item.prop, val),\n options: resolveData(item) || [],\n props: item.props || {},\n size: item.size,\n style,\n clearable: true,\n onChange: handleChange\n })\n\n case 'treeSelect':\n return h(ElTreeSelect, {\n ...bindItem,\n modelValue: currentValue,\n 'onUpdate:modelValue': val => upData(item.prop, val),\n data: item.data || [],\n size: item.size,\n style,\n onChange: handleChange\n })\n\n case 'date':\n return h(ElDatePicker, {\n ...bindItem,\n modelValue: currentValue,\n 'onUpdate:modelValue': val => upData(item.prop, val),\n type: item.type || 'date',\n size: item.size,\n style,\n onChange: handleChange\n })\n\n case 'inputNumber':\n return h(ElInputNumber, {\n ...bindItem,\n modelValue: currentValue,\n 'onUpdate:modelValue': val => upData(item.prop, val),\n size: item.size,\n style,\n onChange: handleChange\n })\n\n case 'input':\n default:\n return h(ElInput, {\n ...bindItem,\n modelValue: currentValue,\n 'onUpdate:modelValue': val => upData(item.prop, val),\n placeholder: item.placeholder,\n size: item.size,\n style,\n clearable: item.clearable === undefined ? true : item.clearable,\n onKeydown: e => {\n if (e.key === 'Enter') handleChange()\n }\n })\n }\n }\n\n function renderFormItem(item) {\n return h(\n ElFormItem,\n {\n key: item.prop,\n label: item.label,\n prop: item.prop\n },\n {\n default: () => {\n // 渲染时实时读取 modelValue,保证父级整体替换对象(如重置)后控件跟随更新;\n // 缺失字段时回退到 initValue 展示,不反向写入(避免污染父级刚重置的对象)\n const hasField = has(formModel.value, item.prop)\n const currentValue = hasField\n ? get(formModel.value, item.prop, '')\n : item.initValue !== undefined\n ? item.initValue\n : ''\n if (slots[item.prop]) {\n return slots[item.prop]({\n item,\n value: hasField ? get(formModel.value, item.prop) : currentValue,\n setValue: val => upData(item.prop, val)\n })\n }\n return renderFormControl(item, currentValue)\n }\n }\n )\n }\n\n return () => {\n const formItems = columns.value.map((item, idx) => {\n // 数组型配置:一行多项(逐项渲染,保持与 Crud/Filter 初始化逻辑兼容)\n if (Array.isArray(item)) {\n return item.map(subItem =>\n h('div', { key: `${subItem.prop}-${idx}`, class: 'm-form-item-group' }, [\n renderFormItem(subItem)\n ])\n )\n }\n return renderFormItem(item)\n })\n\n return h(\n ElForm,\n {\n ref: formRef,\n model: formModel.value,\n inline: inline.value,\n labelWidth: props_.labelWidth,\n labelPosition: props_.labelPosition,\n size: props_.size\n },\n {\n default: () => [...formItems, slots.default && slots.default()]\n }\n )\n }\n }\n})\n","/**\n * Filter 组件\n *\n * 表单筛选组件:常驻搜索 + 更多筛选弹窗(与原项目 filter.vue 行为对齐)\n */\nimport { defineComponent, h, computed, useSlots, unref, onActivated, onDeactivated } from 'vue'\nimport { ElButton, ElDialog } from 'element-plus'\nimport Form from '../../Form/index.js'\nimport { useOpenDialog } from '../../../composables/useOpenDialog'\nimport { isArray } from '../../../utils/is'\n\n// 与原版 hooks.js 一致的路由级搜索参数缓存(keepAlive 场景)\nconst searchMap = new Map()\n\nexport default defineComponent({\n name: 'Filter',\n props: {\n searchColumns: {\n type: Array,\n default: () => []\n },\n moreSearchColumns: {\n type: Array,\n default: () => []\n },\n modelValue: {\n type: Object,\n default: () => ({})\n },\n size: {\n type: String,\n default: 'default'\n },\n labelWidth: {\n type: [String, Number],\n default: 80\n },\n width: {\n type: String,\n default: '240px'\n },\n isSearch: {\n type: Boolean,\n default: true\n },\n isMore: {\n type: Boolean,\n default: true\n },\n isReset: {\n type: Boolean,\n default: false\n }\n },\n emits: [\n 'search',\n 'update:modelValue',\n 'reset',\n 'change',\n 'more',\n 'activated'\n ],\n setup(props, { emit, expose }) {\n const slots = useSlots()\n const { visible, openDialog, closeDialog } = useOpenDialog()\n\n const currentValue = computed({\n get: () => props.modelValue,\n set: val => emit('update:modelValue', val)\n })\n\n // 与原版一致:第 3 个及以后的搜索项在小屏隐藏(windicss 响应式类名)\n const formColumns = computed(() => {\n return props.searchColumns.map((item, index) => {\n if (index > 1) {\n item.class = item.class ? item.class + ' hidden-below-2xl' : 'hidden-below-2xl'\n }\n return item\n })\n })\n\n // 处理插槽\n const searchSlots = {}\n const moreSearchSlots = {}\n\n for (const key in slots) {\n const item = slots[key]\n if (/^search-/.test(key)) {\n const _key = key.replace('search-', '')\n searchSlots[_key] = item\n }\n if (/^moreSearch-/.test(key)) {\n const _key = key.replace('moreSearch-', '')\n moreSearchSlots[_key] = item\n }\n }\n\n // 路由级缓存恢复(keepAlive)。无 vue-router 宿主时静默跳过\n let routeName\n try {\n // eslint-disable-next-line no-undef\n routeName = undefined\n } catch (e) {}\n\n onActivated(() => {\n if (routeName && searchMap.has(routeName)) {\n currentValue.value = searchMap.get(routeName)\n emit('activated')\n }\n })\n\n onDeactivated(() => {\n if (routeName) {\n searchMap.set(routeName, unref(currentValue))\n }\n })\n\n const initSearchParams = () => {\n const search = {}\n if (props.searchColumns) {\n props.searchColumns.forEach(item => {\n if (isArray(item)) {\n item.forEach(subItem => {\n search[subItem.prop] = subItem.initValue ?? ''\n })\n } else {\n search[item.prop] = item.initValue ?? ''\n }\n })\n }\n if (props.moreSearchColumns) {\n props.moreSearchColumns.forEach(item => {\n if (isArray(item)) {\n item.forEach(subItem => {\n search[subItem.prop] = subItem.initValue ?? ''\n })\n } else {\n search[item.prop] = item.initValue ?? ''\n }\n })\n }\n currentValue.value = search\n }\n\n function searchHandler() {\n emit('search')\n }\n\n function onConfirm() {\n visible.value = false\n emit('search')\n }\n\n function onReset() {\n initSearchParams()\n emit('search')\n emit('reset')\n closeDialog()\n }\n\n function _openDialog() {\n openDialog()\n emit('more')\n }\n\n function changeHandler(val) {\n emit('change', val)\n }\n\n expose({ initSearchParams })\n\n return () => {\n return h('div', { class: 'm-filter' }, [\n h(\n 'div',\n { class: 'm-filter-l' },\n [\n h(\n Form,\n {\n modelValue: currentValue.value,\n 'onUpdate:modelValue': val => (currentValue.value = val),\n columns: formColumns.value,\n inline: true,\n onChange: changeHandler\n },\n searchSlots\n ),\n slots.default?.(),\n slots['menu-left']?.() ||\n h('div', { class: 'flex items-center' }, [\n props.isSearch &&\n h(\n ElButton,\n { type: 'primary', onClick: searchHandler },\n () => '搜索'\n ),\n props.isMore &&\n props.moreSearchColumns.length > 0 &&\n h(ElButton, { onClick: _openDialog }, () => '更多筛选'),\n props.isReset && h(ElButton, { onClick: onReset }, () => '重置')\n ])\n ].filter(Boolean)\n ),\n h('div', { class: 'm-filter-r' }, [slots['menu-right']?.()]),\n props.moreSearchColumns.length > 0\n ? h(\n ElDialog,\n {\n modelValue: visible.value,\n 'onUpdate:modelValue': val => (visible.value = val),\n top: '150px',\n width: '900px',\n draggable: true\n },\n {\n header: () =>\n h('div', { class: 'flex justify-between items-center' }, [\n h('span', null, '更多筛选'),\n slots['moreSearch-title-right']?.()\n ]),\n default: () =>\n h(\n Form,\n {\n modelValue: currentValue.value,\n 'onUpdate:modelValue': val =>\n (currentValue.value = val),\n columns: props.moreSearchColumns,\n labelWidth: props.labelWidth\n },\n moreSearchSlots\n ),\n footer: () =>\n h('div', null, [\n h(\n ElButton,\n { type: 'primary', onClick: onConfirm },\n () => '确定'\n ),\n h(ElButton, { onClick: closeDialog }, () => '取消'),\n h(ElButton, { onClick: onReset }, () => '重置')\n ])\n }\n )\n : null\n ])\n }\n }\n})\n","/**\r\n * 滚动到指定位置\r\n * @param {number} to - 目标位置\r\n * @param {number} duration - 动画时长\r\n * @param {Function} callback - 完成回调\r\n */\r\nMath.easeInOutQuad = function (t, b, c, d) {\r\n t /= d / 2\r\n if (t < 1) {\r\n return (c / 2) * t * t + b\r\n }\r\n t--\r\n return (-c / 2) * (t * (t - 2) - 1) + b\r\n}\r\n\r\nlet requestAnimFrame = (function () {\r\n return (\r\n window.requestAnimationFrame ||\r\n window.webkitRequestAnimationFrame ||\r\n window.mozRequestAnimationFrame ||\r\n function (callback) {\r\n window.setTimeout(callback, 1000 / 60)\r\n }\r\n )\r\n})()\r\n\r\nfunction move(amount) {\r\n document.documentElement.scrollTop = amount\r\n document.body.parentNode.scrollTop = amount\r\n document.body.scrollTop = amount\r\n}\r\n\r\nfunction position() {\r\n return (\r\n document.documentElement.scrollTop ||\r\n document.body.parentNode.scrollTop ||\r\n document.body.scrollTop\r\n )\r\n}\r\n\r\nexport function scrollTo(to, duration, callback) {\r\n const start = position()\r\n const change = to - start\r\n const increment = 20\r\n let currentTime = 0\r\n duration = typeof duration === 'undefined' ? 500 : duration\r\n let animateScroll = function () {\r\n currentTime += increment\r\n let val = Math.easeInOutQuad(currentTime, start, change, duration)\r\n move(val)\r\n if (currentTime < duration) {\r\n requestAnimFrame(animateScroll)\r\n } else {\r\n if (callback && typeof callback === 'function') {\r\n callback()\r\n }\r\n }\r\n }\r\n animateScroll()\r\n}\r\n","/**\n * Pagination 组件\n *\n * 基于 Element Plus Pagination 的增强组件(与原项目 index.vue 行为对齐)\n */\nimport { defineComponent, computed, useAttrs } from 'vue'\n// 注意:vue 的 useAttrs 返回普通对象,element-plus 的 useAttrs 返回 computed ref\nimport { ElPagination, useAttrs as elUseAttrs, paginationProps } from 'element-plus'\nimport { pick, keys } from 'lodash-es'\nimport { scrollTo } from '../../utils/scroll-to'\n\nexport default defineComponent({\n name: 'Pagination',\n props: {\n total: {\n required: true,\n type: Number\n },\n page: {\n type: Number,\n default: 1\n },\n limit: {\n type: Number,\n default: 20\n },\n pageSizes: {\n type: Array,\n default() {\n return [10, 20, 30, 50]\n }\n },\n layout: {\n type: String,\n default: 'total, sizes, prev, pager, next, jumper'\n },\n autoScroll: {\n type: Boolean,\n default: true\n },\n hidden: {\n type: Boolean,\n default: false\n },\n background: {\n type: Boolean,\n default: true\n },\n simple: {\n type: Boolean,\n default: false\n }\n },\n emits: ['update:page', 'update:limit', 'pagination'],\n setup(props, { emit }) {\n // 与原版一致:从 element-plus 取 computed 形式的 attrs\n const attrs = elUseAttrs()\n\n const filterAttrs = computed(() => {\n return pick(attrs.value, keys(paginationProps))\n })\n\n const currentLayout = computed(() => {\n return props.simple ? 'prev, pager, next' : props.layout\n })\n\n const currentPage = computed({\n get() {\n return props.page\n },\n set(val) {\n emit('update:page', val)\n }\n })\n\n const pageSize = computed({\n get() {\n return props.limit\n },\n set(val) {\n emit('update:limit', val)\n }\n })\n\n function handleSizeChange(val) {\n emit('pagination', { page: currentPage.value, limit: val })\n if (props.autoScroll) {\n scrollTo(0, 800)\n }\n }\n\n function handleCurrentChange(val) {\n emit('pagination', { page: val, limit: pageSize.value })\n if (props.autoScroll) {\n scrollTo(0, 800)\n }\n }\n\n return () => (\n <div class=\"m-pagination\">\n <ElPagination\n {...filterAttrs.value}\n currentPage={currentPage.value}\n {...{\n 'onUpdate:currentPage': val => (currentPage.value = val)\n }}\n pageSize={pageSize.value}\n {...{\n 'onUpdate:pageSize': val => (pageSize.value = val)\n }}\n layout={currentLayout.value}\n page-sizes={props.pageSizes}\n total={props.total}\n background={props.background}\n onSizeChange={handleSizeChange}\n onCurrentChange={handleCurrentChange}\n />\n </div>\n )\n }\n})\n","/**\n * Crud 组件\n *\n * CRUD 增删改查组件,整合 Table、Filter、Pagination\n * 与原项目 src/components/Crud/src/crud.vue 行为对齐的 render 函数实现\n */\nimport {\n defineComponent,\n h,\n ref,\n shallowRef,\n toRefs,\n nextTick,\n onMounted,\n onActivated,\n withDirectives,\n useAttrs,\n useSlots,\n unref\n} from 'vue'\nimport { useDebounceFn } from '@vueuse/core'\nimport { vLoading } from 'element-plus'\nimport { useEventListener } from '../../../composables/useEventListener'\nimport { useCrudSlots, useTableHeight, useTableMethods } from './hooks'\nimport { isArray, isFunction } from '../../../utils/is'\nimport defaultProps from './props'\nimport Table from '../../Table/index.js'\nimport Filter from '../../Filter/index.js'\nimport Pagination from '../../Pagination/index.jsx'\n\nexport default defineComponent({\n name: 'Crud',\n props: defaultProps,\n emits: ['update:search', 'reset'],\n setup(props, { emit, expose }) {\n const attrs = useAttrs()\n const slots = useSlots()\n\n const selectionList = ref([])\n const { tableSlots, filterSlots, searchSlots } = useCrudSlots()\n const UUID = `a${Math.floor(Math.random() * 1000000)}`\n const { tableHeight, calcTableHeight } = useTableHeight(UUID)\n\n const loading = ref(false)\n const total = ref(0)\n const { tableColumns, searchColumns, moreSearchColumns, footerReverse } =\n toRefs(props)\n\n const data = ref([])\n const page = ref(1)\n const limit = ref(props.limit)\n const pageSizes = ref(props.pageSizes)\n const search = ref({})\n\n // 监听窗口大小变化\n useEventListener({\n el: window,\n name: 'resize',\n listener: () => {\n calcTableHeight()\n }\n })\n\n // Table 方法\n const {\n table,\n clearSelection,\n toggleRowSelection,\n toggleAllSelection,\n toggleRowExpansion,\n setCurrentRow,\n clearSort,\n clearFilter,\n doLayout,\n sort\n } = useTableMethods(emit)\n\n // 数据请求\n async function useFetch() {\n try {\n if (isFunction(props.request)) {\n loading.value = true\n const {\n data: currentData,\n success,\n total: currentTotal\n } = await props.request({\n pageInfo: { page: page.value, limit: limit.value },\n params: search.value\n })\n loading.value = false\n if (success) {\n total.value = currentTotal\n data.value = currentData\n } else {\n data.value = []\n total.value = 0\n }\n nextTick(() => {\n isFunction(props.afterRequest) && props.afterRequest?.(unref(data))\n })\n } else {\n throw new TypeError(\n \"Type of the default value for 'request' prop must be a function\"\n )\n }\n } catch (error) {\n loading.value = false\n throw error\n }\n }\n\n // 初始化搜索参数\n const initSearchParams = () => {\n if (props.searchColumns) {\n props.searchColumns.forEach(item => {\n if (isArray(item)) {\n item.forEach(subItem => {\n search.value[subItem.prop] = subItem.initValue ?? ''\n })\n } else {\n search.value[item.prop] = item.initValue ?? ''\n }\n })\n }\n if (props.moreSearchColumns) {\n props.moreSearchColumns.forEach(item => {\n if (isArray(item)) {\n item.forEach(subItem => {\n search.value[subItem.prop] = subItem.initValue ?? ''\n })\n } else {\n search.value[item.prop] = item.initValue ?? ''\n }\n })\n }\n }\n\n const useDebounceFetch = useDebounceFn(useFetch, props.debounceTime)\n\n onMounted(() => {\n initSearchParams()\n props.init && useDebounceFetch()\n nextTick(() => {\n calcTableHeight()\n })\n })\n\n let isInitialActivation = true\n onActivated(() => {\n calcTableHeight()\n if (!isInitialActivation && data.value.length === 0) {\n useDebounceFetch()\n }\n isInitialActivation = false\n })\n\n // 选择变化\n const selectSelection = selection => {\n selectionList.value = selection\n }\n\n // 搜索\n const onSearch = (isInitPage = false) => {\n if (isInitPage) {\n page.value = 1\n }\n useDebounceFetch()\n }\n\n // 重置\n const onReset = () => {\n emit('reset')\n initSearchParams()\n onSearch(true)\n }\n\n // 暴露方法\n expose({\n pageTotal: total,\n initSearchParams,\n refresh: onSearch,\n search,\n table,\n clearSelection,\n toggleRowSelection,\n toggleAllSelection,\n toggleRowExpansion,\n setCurrentRow,\n clearSort,\n clearFilter,\n doLayout,\n sort,\n data,\n calcTableHeight,\n selectionList\n })\n\n /**\n * table-* 插槽包装:与原版模板行为一致,\n * 把 ElTable 作用域 { row, $index } 转换成用户插槽的 { row, index }\n */\n const wrappedTableSlots = {}\n for (const name in tableSlots) {\n wrappedTableSlots[name] = scope =>\n tableSlots[name]({\n row: scope?.row,\n index: scope?.$index\n })\n }\n\n /**\n * 非 table- 前缀的 Table 具名插槽(action/expand/append/empty 等)直接透传,\n * 与原版 SFC 模板中 <Table> 内具名插槽自动透传的行为一致\n */\n const passThroughSlots = {}\n ;['action', 'action-header', 'expand', 'append', 'empty'].forEach(name => {\n if (slots[name]) {\n passThroughSlots[name] = scope => slots[name]({ ...(scope || {}), size: undefined })\n }\n })\n\n /**\n * search-* / moreSearch-* 插槽包装:与原版一致只回传 { params }\n */\n const wrappedSearchSlots = {}\n for (const name in searchSlots) {\n wrappedSearchSlots[name] = () => searchSlots[name]({ params: search.value })\n }\n\n return () => {\n return h('section', { class: 'm-crud' }, [\n // Header\n h('div', { id: `${UUID}-header`, class: 'm-crud-header' }, [\n slots.header?.() || [\n slots['menu-left']?.() ||\n h('div', { class: 'flex items-center' }, [\n slots['form-menu-top']?.(),\n h('div', { class: 'flex items-center' }, [\n slots['form-menu-left']?.(),\n h(\n Filter,\n {\n modelValue: search.value,\n 'onUpdate:modelValue': val => (search.value = val),\n searchColumns: searchColumns.value,\n moreSearchColumns: moreSearchColumns.value,\n ...attrs,\n onSearch: () => onSearch(true),\n onChange: () => onSearch(true),\n onActivated: () => onSearch(false),\n onReset: onReset\n },\n {\n ...wrappedSearchSlots,\n ...filterSlots,\n 'form-menu-right': () =>\n slots['form-menu-right']?.({ search: search.value }),\n 'moreSearch-title-right': () =>\n slots['moreSearch-title-right']?.()\n }\n )\n ])\n ]),\n h('div', { class: 'flex-1 flex justify-end' }, [\n slots['menu-right']?.()\n ])\n ]\n ]),\n\n // Body\n h(\n 'div',\n { class: 'm-crud-body', style: { height: `calc(100% - ${tableHeight.value || '120px'})` } },\n [\n slots.table?.({ data: data.value }) ||\n withDirectives(\n h(\n Table,\n {\n ref: table,\n height: '100%',\n columns: tableColumns.value,\n data: data.value,\n ...attrs,\n onSelectionChange: selection =>\n selectSelection(selection)\n },\n { ...passThroughSlots, ...wrappedTableSlots }\n ),\n [[vLoading, loading.value]]\n )\n ]\n ),\n\n // Footer\n h(\n 'div',\n {\n id: `${UUID}-footer`,\n class: [\n 'm-crud-footer',\n footerReverse.value ? 'flex-row-reverse' : ''\n ]\n },\n [\n slots.footer?.() || [\n h('div', {}, [slots.batch?.({ list: selectionList.value })]),\n // 与原版 v-show 行为一致:total 为 0 时隐藏但不卸载\n h(Pagination, {\n style: total.value > 0 ? undefined : { display: 'none' },\n page: page.value,\n 'onUpdate:page': val => (page.value = val),\n limit: limit.value,\n 'onUpdate:limit': val => (limit.value = val),\n pageSizes: pageSizes.value,\n 'onUpdate:pageSizes': val => (pageSizes.value = val),\n total: total.value,\n ...attrs,\n onPagination: useDebounceFetch\n })\n ]\n ]\n )\n ])\n }\n }\n})\n","/**\r\n * useCrud - Crud 组件 Hook\r\n *\r\n * 暴露 Crud 组件的私有方法和属性,供外部调用\r\n */\r\nimport { ref, computed, nextTick, unref } from 'vue'\r\n\r\n/**\r\n * useCrud - Crud 组件控制 Hook\r\n *\r\n * @returns {Object} Crud 组件的引用和方法\r\n *\r\n * @example\r\n * const { crudRef, search, refresh, data, selectionList } = useCrud()\r\n *\r\n * // 刷新列表\r\n * refresh()\r\n *\r\n * // 获取搜索参数\r\n * console.log(search.value)\r\n *\r\n * // 获取当前数据\r\n * console.log(data.value)\r\n */\r\nexport const useCrud = () => {\r\n const elementRef = ref()\r\n\r\n const search = computed({\r\n get() {\r\n return elementRef.value?.search\r\n },\r\n set(val) {\r\n elementRef.value.search = val\r\n }\r\n })\r\n\r\n const data = computed(() => {\r\n return elementRef.value?.data || []\r\n })\r\n\r\n const pageTotal = computed(() => {\r\n return elementRef.value?.pageTotal\r\n })\r\n\r\n const selectionList = computed(() => {\r\n return elementRef.value?.selectionList\r\n })\r\n\r\n const toggleAllSelection = () => {\r\n elementRef.value?.toggleAllSelection()\r\n }\r\n\r\n const toggleRowSelection = (row, state) => {\r\n elementRef.value?.toggleRowSelection(row, state)\r\n }\r\n\r\n const crudRef = val => {\r\n elementRef.value = val\r\n }\r\n\r\n const refresh = () => {\r\n elementRef.value?.refresh()\r\n }\r\n\r\n const initSearchParams = () => {\r\n elementRef.value?.initSearchParams()\r\n }\r\n\r\n const calcHeight = () => {\r\n nextTick(() => {\r\n elementRef.value?.calcTableHeight()\r\n })\r\n }\r\n\r\n const doLayout = () => {\r\n nextTick(() => {\r\n elementRef.value?.calcTableHeight()\r\n })\r\n }\r\n\r\n return {\r\n crudRef,\r\n search,\r\n doLayout,\r\n data,\r\n refresh,\r\n pageTotal,\r\n calcHeight,\r\n initSearchParams,\r\n selectionList,\r\n toggleAllSelection,\r\n toggleRowSelection\r\n }\r\n}\r\n","/**\n * @nuonuo/element-crud\n *\n * 基于 Element Plus 的 CRUD 组件库\n */\nimport { defineComponent, h } from 'vue'\n\n// 组件\nimport Crud from './components/Crud/index.js'\nimport Table from './components/Table/index.js'\nimport Filter from './components/Filter/index.js'\nimport Form from './components/Form/index.js'\nimport Pagination from './components/Pagination/index.jsx'\nimport Icon from './components/Icon/index.jsx'\nimport ColumnSettings from './components/ColumnSettings/index.js'\n\n// Composables\nimport { useCrud } from './composables/useCrud.js'\nimport {\n useTableConfig,\n registerTableConfig,\n clearTableConfig\n} from './composables/useTableConfig.js'\nimport { useEventListener } from './composables/useEventListener.js'\nimport { useOpenDialog } from './composables/useOpenDialog.js'\n\n// 样式\nimport './styles/index.scss'\n\n// 所有组件\nconst components = [Crud, Table, Filter, Form, Pagination, Icon, ColumnSettings]\n\n/**\n * 安装函数:全局注册全部组件\n * @param {import('vue').App} app\n */\nconst install = app => {\n components.forEach(component => {\n const name = component.name || component.__name\n if (name) {\n app.component(name, component)\n }\n })\n}\n\n// 导出\nexport {\n // 组件\n Crud,\n Table,\n Filter,\n Form,\n Pagination,\n Icon,\n ColumnSettings,\n\n // Composables\n useCrud,\n useTableConfig,\n registerTableConfig,\n clearTableConfig,\n useEventListener,\n useOpenDialog\n}\n\n// 默认导出(插件安装)\nexport default {\n install\n}\n"],"names":["useEventListener","el","isDebounce","listener","wait","name","options","autoRemove","remove","isAddRef","ref","element","handler","useDebounceFn","useThrottleFn","realHandler","removeEventListener","e","addEventListener","removeWatch","watch","val","oldVal","cleanUp","unref","toString","is","type","isDef","isUnDef","isObject","isEmpty","isArray","isString","isNumber","isFunction","deepFilter","list","key","value","_list","i","item","addUnit","defaultUnit","SESSION_KEY","globalModules","state","registerTableConfig","config","clearTableConfig","getTableModules","resolveWidthConfig","columns","widthConfig","newItem","initState","localState","_tableConfig","currentTableConfig","stateKey","stateValue","storageValue","resolvedColumns","index","current","field","useTableConfig","rawColumns","_a","a","b","data","newData","persist","mutate","useTableColumns","props","getTableConfig","computed","_columns","useTableDefaultBind","useTableBind","currentBind","defaultBind","_currentBind","_defaultBind","_option","useTableMethods","table","shallowRef","clearSelection","_b","getSelectionRows","toggleRowSelection","row","selected","toggleAllSelection","toggleRowExpansion","expanded","setCurrentRow","clearSort","clearFilter","columnKeys","doLayout","sort","prop","order","useCrudSlots","slots","useSlots","tableSlots","filterSlots","searchSlots","_key","useTableHeight","uuid","tableHeight","headerId","footerId","calcTableHeight","footerHeight","headerHeight","defaultProps$1","props$1","Icon","size","Number","default","color","String","required","setup","style","fontSize","undefined","colorStyle","isElementIcon","test","SvgName","upperFirst","replace","ElSvgIcon","ElSvg","_createVNode","ElIcon","useOpenDialog","visible","defaultProps","ColumnSettings","emits","emit","expose","setTableConfig","resetTableConfig","openDialog","closeDialog","currentValue","init","JSON","parse","stringify","filter","label","onMove","disabledMove","relatedContext","fixed","onSubmit","onReset","changeStatus","hide","h","class","ElDrawer","modelValue","direction","modal","withHeader","appendToBody","destroyOnClose","onClose","title","onClick","Draggable","draggable","itemKey","move","handle","ElCheckbox","checked","disabled","onChange","footer","ElButton","plain","MTableItem","defineComponent","Object","toRefs","inject","bindColumn","emptyFill","createHeader","scope","columnsSettingRef","isSetting","display","alignItems","justifyContent","right","center","left","icon","MColumnSettings","createDefault","children","length","child","map","childItem","push","render","$index","get","ElTableColumn","header","Table","selection","expand","action","height","attrs","useAttrs","bindSelection","bindIndex","bindAction","tableConfig","reactiveOmit","provide","createColumn","createColumnsSetting","mergeProps","bindExpand","tableItem","TableItem","concat","ElTable","append","empty","DEFAULT_VALUE_NAME","DEFAULT_LABEL_NAME","OMIT_KEYS","MForm","props_","inline","formRef","formModel","upData","newModel","set","validate","callback","resetFields","clearValidate","fieldProps","validateField","cb","scrollToField","checkAllState","resolveData","labelText","labelName","handleChange","onSelectChange","total","handleCheckAll","renderFormControl","bindItem","omit","width","valueName","ElSelect","ElOption","ElRadioGroup","ElRadio","ElCheckboxGroup","ElCascader","ElTreeSelect","ElDatePicker","ElInputNumber","ElInput","renderFormItem","ElFormItem","hasField","has","formItems","idx","subItem","ElForm","searchMap","Map","Filter","searchColumns","Array","moreSearchColumns","labelWidth","isSearch","Boolean","isMore","isReset","formColumns","moreSearchSlots","routeName","onActivated","onDeactivated","initSearchParams","search","forEach","initValue","searchHandler","onConfirm","_openDialog","changeHandler","Form","ElDialog","top","t","c","d","requestAnimFrame","amount","position","scrollTo","to","duration","start","change","increment","currentTime","animateScroll","Pagination","page","limit","pageSizes","layout","autoScroll","hidden","background","simple","elUseAttrs","filterAttrs","pick","keys","paginationProps","currentLayout","currentPage","pageSize","handleSizeChange","handleCurrentChange","ElPagination","_mergeProps","Crud","selectionList","UUID","loading","tableColumns","footerReverse","useFetch","currentData","success","currentTotal","nextTick","error","useDebounceFetch","onMounted","isInitialActivation","selectSelection","onSearch","isInitPage","wrappedTableSlots","passThroughSlots","wrappedSearchSlots","_c","_d","_e","_f","withDirectives","vLoading","_g","_h","useCrud","elementRef","pageTotal","components","install","app","component"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(function(V,t){typeof exports=="object"&&typeof module<"u"?t(exports,require("vue"),require("@vueuse/core"),require("element-plus"),require("lodash-es"),require("@element-plus/icons-vue"),require("vuedraggable-es")):typeof define=="function"&&define.amd?define(["exports","vue","@vueuse/core","element-plus","lodash-es","@element-plus/icons-vue","vuedraggable-es"],t):(V=typeof globalThis<"u"?globalThis:V||self,t(V.ElementCrud={},V.Vue,V.VueUse,V.ElementPlus,V._,V.ElementPlusIconsVue,V.VuedraggableEs))})(this,(function(V,t,J,y,D,ze,Fe){"use strict";function xe(e){const a=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const i in e)if(i!=="default"){const o=Object.getOwnPropertyDescriptor(e,i);Object.defineProperty(a,i,o.get?o:{enumerable:!0,get:()=>e[i]})}}return a.default=e,Object.freeze(a)}const Ae=xe(ze);function se({el:e=window,isDebounce:a=!0,listener:i,wait:o=80,name:l,options:u,autoRemove:g=!0}){let d;const h=t.ref(!1);if(e){const c=t.ref(e),C=a?J.useDebounceFn(i,o):J.useThrottleFn(i,o),s=o?C:i,r=E=>{h.value=!0,E.removeEventListener(l,s,u)},f=E=>E.addEventListener(l,s,u),N=t.watch(c,(E,w,x)=>{E&&(!t.unref(h)&&f(E),x(()=>{g&&r(E)}))},{immediate:!0});return d=()=>{r(c.value),N()},{removeEvent:d}}}const ke=Object.prototype.toString;function P(e,a){return ke.call(e)===`[object ${a}]`}function Re(e){return typeof e<"u"}function Oe(e){return!Re(e)}function de(e){return e!==null&&P(e,"Object")}function Be(e){return e==null?!0:W(e)||M(e)?e.length===0:e instanceof Map||e instanceof Set?e.size===0:de(e)?Object.keys(e).length===0:!1}function je(e){return P(e,"Number")}function M(e){return P(e,"String")}function ee(e){return typeof e=="function"}function W(e){return e&&Array.isArray(e)}function fe(e,a,i=!0){const o=[];for(let l=0;l<e.length;l++){const u={...e[l]};(i?u[a]:!u[a])&&(u.children&&u.children.length&&(u.children=fe(u.children,a,i)),o.push(u))}return o}function he(e,a="px"){if(!e)return"";if(M(e))return e;if(je(e))return`${e}${a}`}const te="element_crud_table_config";let U={};const I=t.ref({});function De(e,a={}){if(e){e.tableWidthConfig&&(U.tableWidthConfig={...U.tableWidthConfig||{},...e.tableWidthConfig,...a.tableWidthConfig||{}});for(const i in e)i!=="tableWidthConfig"&&(U[i]=e[i])}}function Ie(){U={},I.value={}}function ne(){return U}function Me(e){const a=U.tableWidthConfig||{};return e.map(i=>{const o={...i};return o.width&&isNaN(parseInt(o.width))&&(o.width=a[o.width]||""),o.minWidth&&isNaN(parseInt(o.minWidth))&&(o.minWidth=a[o.minWidth]||""),o})}function _e(){try{const e=JSON.parse(localStorage.getItem(te)||"{}"),a=ne(),i={};for(const o in a){if(o==="tableWidthConfig")continue;const l=a[o],u=e[o],g=typeof l=="function"?l():l;Array.isArray(g)&&(i[o]=g.map((d,h)=>{const c=u==null?void 0:u.find(C=>C.prop===d.prop);return{prop:d.prop,hide:c?!!c.hide:!!d.hide,sort:c?c.sort:h}}))}I.value=i}catch{I.value={}}}function ae(){return Object.keys(I.value).length===0&&_e(),{getTableConfig:o=>{const u=ne()[o];return u?Me(typeof u=="function"?u():u).map(d=>{var c;const h=(c=I.value[o])==null?void 0:c.find(C=>C.prop===d.prop);return{...d,hide:h?h.hide:d.hide,sort:h?h.sort:0}}).sort((d,h)=>d.sort-h.sort):(console.warn(`[ElementCrud] Table config "${o}" not found. Did you register it via registerTableConfig()?`),[])},setTableConfig:(o,l)=>{const u=l.map((g,d)=>({prop:g.prop,hide:!!g.hide,sort:d}));I.value[o]=u,pe(g=>{g[o]=u})},resetTableConfig:o=>{const u=ne()[o];if(!u)return;const g=typeof u=="function"?u():u;I.value[o]=g.map((d,h)=>({prop:d.prop,hide:!!d.hide,sort:h})),pe(d=>{d[o]=I.value[o]})}}}function pe(e){try{const a=JSON.parse(localStorage.getItem(te)||"{}");e(a),localStorage.setItem(te,JSON.stringify(a))}catch{}}function Ue(e){const{getTableConfig:a}=ae();return t.computed(()=>{const i=M(e.columns)?(()=>{const o=a(e.columns);return Be(o)?[]:o})():e.columns;return fe(i||[],"hide",!1)})}function qe(e){return t.computed(()=>({showOverflowTooltip:e.showOverflowTooltip||!1,align:e.align,headerAlign:e.headerAlign}))}function H(e,a){return t.computed(()=>{const i=t.unref(e),o=t.unref(a),l=de(i)?{...i}:void 0;return l&&(l.slot&&delete l.slot,l.children&&delete l.children),Object.assign({},o,l)})}function ge(){const e=t.shallowRef({});function a(){var s,r;(r=(s=e.value)==null?void 0:s.clearSelection)==null||r.call(s)}const i=()=>{var s,r;return(r=(s=e.value)==null?void 0:s.getSelectionRows)==null?void 0:r.call(s)};function o(s,r){var f,N;(N=(f=e.value)==null?void 0:f.toggleRowSelection)==null||N.call(f,s,r)}function l(){var s,r;(r=(s=e.value)==null?void 0:s.toggleAllSelection)==null||r.call(s)}function u(s,r){var f,N;(N=(f=e.value)==null?void 0:f.toggleRowExpansion)==null||N.call(f,s,r)}function g(s){var r,f;(f=(r=e.value)==null?void 0:r.setCurrentRow)==null||f.call(r,s)}function d(){var s,r;(r=(s=e.value)==null?void 0:s.clearSort)==null||r.call(s)}function h(s){var r,f;(f=(r=e.value)==null?void 0:r.clearFilter)==null||f.call(r,s)}function c(){var s,r;(r=(s=e.value)==null?void 0:s.doLayout)==null||r.call(s)}function C(s,r){var f,N;(N=(f=e.value)==null?void 0:f.sort)==null||N.call(f,s,r)}return{table:e,clearSelection:a,getSelectionRows:i,toggleRowSelection:o,toggleAllSelection:l,toggleRowExpansion:u,setCurrentRow:g,clearSort:d,clearFilter:h,doLayout:c,sort:C}}function Le(){const e=t.useSlots(),a={},i={},o={};for(const l in e){const u=e[l];if(/^table-/.test(l)){const g=l.replace("table-","");a[g]=u}(/^search-/.test(l)||/^moreSearch-/.test(l))&&(o[l]=u),/^filter-/.test(l)&&(i[l]=u)}return{tableSlots:a,searchSlots:o,filterSlots:i}}function We(e){const a=t.ref(""),i=`#${e}-header`,o=`#${e}-footer`;function l(){var d,h;const u=((d=document.querySelector(o))==null?void 0:d.clientHeight)||0,g=((h=document.querySelector(i))==null?void 0:h.clientHeight)||0;a.value=`calc(100% - ${u+g}px)`}return{tableHeight:a,calcTableHeight:l}}const He={tableColumns:{type:[Array,String],default:()=>[]},searchColumns:{type:Array,default:()=>[]},moreSearchColumns:{type:Array,default:()=>[]},search:{type:Object,default:()=>({})},request:{type:Function,default:()=>{}},debounceTime:{type:Number,default:500},afterRequest:{type:Function,default:()=>{}},init:{type:Boolean,default:!0},limit:{type:Number,default:20},footerReverse:{type:Boolean,default:!1}},$e={selection:{type:[Boolean,Object],default:!1},expand:{type:[Boolean,Object],default:!1},emptyFill:{type:String,default:"--"},index:{type:[Boolean,Object],default:!1},action:{type:[Boolean,Object],default:!1},drop:{type:[Boolean,Object],default:!1},columns:{type:[Array,String],default:()=>[]},data:{type:Array,default:()=>[]},height:{type:[String,Number]},maxHeight:{type:[String,Number]},fit:{type:Boolean,default:!0},stripe:Boolean,border:Boolean,rowKey:{type:[String,Function]},showHeader:{type:Boolean,default:!0},showSummary:{type:Boolean,default:!1},summaryMethod:{type:Function},rowClassName:{type:[String,Function]},rowStyle:{type:[Object,Function]},cellClassName:{type:[String,Function]},cellStyle:{type:[Object,Function]},headerRowClassName:[String,Function],headerRowStyle:[Object,Function],headerCellClassName:[String,Function],headerCellStyle:[Object,Function],highlightCurrentRow:Boolean,currentRowKey:[String,Number],emptyText:String,expandRowKeys:Array,defaultExpandAll:Boolean,defaultSort:Object,tooltipEffect:String,spanMethod:Function,selectOnIndeterminate:{type:Boolean,default:!0},indent:{type:Number,default:16},treeProps:{type:Object,default:()=>({hasChildren:"hasChildren",children:"children"})},lazy:Boolean,load:Function,style:{type:Object,default:()=>({})},className:{type:String,default:""},showOverflowTooltip:{type:Boolean,default:!1},align:{type:String,default:void 0},headerAlign:{type:String,default:void 0},size:{type:String,default:void 0},widthOptions:{type:Object,default:()=>({})}},q=t.defineComponent({name:"Icon",props:{size:{type:Number,default:16},color:{type:String},name:{required:!0,type:String,default:"Fold"},type:{type:String}},setup(e){const a=t.computed(()=>{if(!e.size&&!e.color&&!e.type)return{};const u=e.color||!e.type?e.color:`var(--el-color-${e.type})`;return{fontSize:Oe(e.size)?void 0:he(e.size),color:u}}),i=t.computed(()=>e.color||!e.type?{color:e.color}:{color:`var(--el-color-${e.type})`}),o=t.computed(()=>/^el-/.test(e.name)),l=t.computed(()=>o.value?D.upperFirst(e.name.replace("el-","")):"#icon-"+e.name);return()=>{if(o.value){const u=Ae[l.value];return t.createVNode(y.ElIcon,{size:e.size,color:e.color,class:"el-svg-icon",style:i.value},{default:()=>[u?t.createVNode(u,null,null):null]})}return t.createVNode("svg",{class:"svg-icon","aria-hidden":"true",style:a.value},[t.createVNode("use",{"xlink:href":l.value},null)])}}});function le(){const e=t.ref(!1);return{visible:e,openDialog:()=>{e.value=!0},closeDialog:()=>{e.value=!1}}}const Ke={title:{type:String,default:"列表显示字段"},type:{type:String,required:!0}},G=t.defineComponent({name:"MColumnSettings",props:Ke,emits:["update:modelValue","submit"],setup(e,{emit:a,expose:i}){const{setTableConfig:o,getTableConfig:l,resetTableConfig:u}=ae(),{visible:g,openDialog:d,closeDialog:h}=le(),c=t.ref([]),C=()=>{d(),c.value=JSON.parse(JSON.stringify(l(e.type)||[])).filter(w=>w.label)},s=w=>!r(w.relatedContext.element),r=w=>w.fixed==="left",f=()=>{o(e.type,c.value),a("update:modelValue",c.value),a("submit"),h()},N=()=>{u(e.type),a("submit"),h()},E=w=>{w.hide=!w.hide};return i({init:C}),()=>t.h("div",{class:"m-column-settings"},[t.h(y.ElDrawer,{modelValue:g.value,"onUpdate:modelValue":w=>g.value=w,size:"280px",direction:"rtl",modal:!0,withHeader:!1,appendToBody:!0,destroyOnClose:!0,onClose:h},{default:()=>[t.h("div",{class:"m-drawer-title"},[t.h("span",null,e.title),t.h(q,{class:"cursor-pointer",name:"el-close",size:16,onClick:h})]),t.h("div",{class:"settings-body"},[t.h(Fe,{modelValue:c.value,"onUpdate:modelValue":w=>c.value=w,draggable:".settings-item",filter:".forbid",itemKey:"prop",move:s,handle:".handle"},{item:({element:w})=>t.h("div",{class:"settings-item"},[t.h(q,{class:["handle","cursor-move","mr-2",r(w)?"forbid cursor-not-allowed":""],name:"sortDot",size:20}),t.h(y.ElCheckbox,{checked:!w.hide,disabled:w.disabled,onChange:()=>E(w)},()=>w.label)])})])],footer:()=>t.h("div",{class:"settings-footer"},[t.h(y.ElButton,{plain:!0,onClick:h},()=>"取消"),t.h(y.ElButton,{type:"primary",onClick:f},()=>"保存"),t.h(y.ElButton,{type:"primary",plain:!0,onClick:N},()=>"恢复默认")])})])}}),me=t.defineComponent({name:"MTableItem",props:{item:{type:Object,required:!0},size:{type:String,default:void 0}},setup(e,{slots:a}){const{item:i}=t.toRefs(e),o=t.inject("defaultBind"),l=H(i,o),u=t.inject("columns"),g=t.inject("emptyFill");function d(c){const C=t.shallowRef();if(a[i.value.prop+"-header"])return a[i.value.prop+"-header"]({...c,size:e.size});if(i.value.isSetting){const s={right:"flex-end",center:"center",left:"flex-start"};return t.createVNode("div",{style:{display:"flex",alignItems:"center",justifyContent:s[i.value.align||i.value.headerAlign]}},[t.createVNode("span",null,[i.value.label]),t.createVNode(q,{name:i.value.icon||"el-operation",onClick:()=>C.value.init()},null),M(u)?t.createVNode(G,{ref:C,type:u},null):null])}else return i.value.label}function h(c){var s,r;let C=[];if((r=(s=i.value)==null?void 0:s.children)!=null&&r.length){const f=i.value.children.map(N=>t.h(me,{item:N,size:e.size},a));C.push(f)}else a[i.value.prop]?C.push(a[i.value.prop]({...c,size:e.size})):i.value.render?C.push(ee(i.value.render)?i.value.render(c.row,c.$index):String(i.value.render)):C.push(D.get(c.row,i.value.prop,"")??g);return C}return()=>t.createVNode(y.ElTableColumn,l.value,{header:c=>d(c),default:c=>h(c)})}}),oe=t.defineComponent({name:"Table",props:$e,setup(e,{slots:a,expose:i}){const{selection:o,expand:l,index:u,action:g,height:d}=t.toRefs(e),h=y.useAttrs(),c=Ue(e),C=qe(e),s=H(o,C);H(l,C);const r=H(u,C),f=H(g,C),{table:N,clearSelection:E,toggleRowSelection:w,toggleAllSelection:x,toggleRowExpansion:S,setCurrentRow:T,clearSort:z,clearFilter:A,doLayout:n,sort:p,getSelectionRows:b}=ge(),k=J.reactiveOmit(e,"showOverflowTooltip","align","headerAlign");t.provide("defaultBind",C),t.provide("columns",e.columns),t.provide("emptyFill",e.emptyFill),i({clearSelection:E,toggleRowSelection:w,toggleAllSelection:x,toggleRowExpansion:S,setCurrentRow:T,clearSort:z,clearFilter:A,doLayout:n,getSelectionRows:b,sort:p});function j(){let m=[];function L(){const B=t.shallowRef(),R={right:"flex-end",center:"center",left:"flex-start"};return t.createVNode("div",{class:"flex items-center",style:{justifyContent:R[f.value.align||f.value.headerAlign]}},[t.createVNode("span",null,[f.value.label]),t.createVNode(q,{name:f.value.icon||"el-operation",onClick:()=>B.value.init()},null),M(e.columns)?t.createVNode(G,{ref:B,type:e.columns},null):null])}if(l.value!==!1&&a.expand&&m.push(t.createVNode(y.ElTableColumn,t.mergeProps(bindExpand.value,{type:"expand"}),{default:B=>a.expand&&a.expand(B)})),o.value&&m.push(t.createVNode(y.ElTableColumn,t.mergeProps(s.value,{type:"selection"}),null)),u.value&&m.push(t.createVNode(y.ElTableColumn,t.mergeProps(r.value,{type:"index"}),null)),c.value){const B=c.value.map(R=>t.h(me,{item:R,size:e.size},a));m=m.concat(B)}return a.default&&(m=m.concat(a.default())),g.value!==!1&&a.action&&m.push(t.createVNode(y.ElTableColumn,f.value,{default:B=>a.action&&a.action({...B,size:e.size}),header:B=>a["action-header"]?a["action-header"]({...B,size:e.size}):f.value.isSetting?L():t.h("span",{},f.value.label)})),m}return()=>t.createVNode("div",{style:{height:he(d.value)}},[t.createVNode(y.ElTable,t.mergeProps(k,h.value,{ref:N,height:d.value?"100%":null}),{default:()=>j(),append:a.append,empty:a.empty})])}}),Je={modelValue:{type:Object,default:()=>({})},columns:{type:Array,default:()=>[]},inline:{type:Boolean,default:!1},labelWidth:{type:[String,Number],default:80},labelPosition:{type:String,default:"top"},size:{type:String,default:void 0},menu:{type:Object,default:()=>({})}},_="value",Q="label",Ge=["component","prop","data","render","children","slot","class","initValue","labelName","valueName","all","placeholder","prefixIcon","size","width","type","props"],Y=t.defineComponent({name:"MForm",props:Je,emits:["update:modelValue","change"],setup(e,{emit:a,slots:i,expose:o}){const{columns:l,modelValue:u,inline:g}=t.toRefs(e),d=t.ref(null),h=t.computed({get:()=>e.modelValue,set:n=>a("update:modelValue",n)});function c(n,p){const b={...h.value};D.set(b,n,p),a("update:modelValue",b),a("change",b)}function C(n){var p;return(p=d.value)==null?void 0:p.validate(n)}function s(){var n;(n=d.value)==null||n.resetFields()}function r(n){var p;(p=d.value)==null||p.clearValidate(n)}function f(n,p){var b;(b=d.value)==null||b.validateField(n,p)}function N(n){var p,b;(b=(p=d.value)==null?void 0:p.scrollToField)==null||b.call(p,n)}o({validate:C,resetFields:s,clearValidate:r,validateField:f,scrollToField:N});const E=t.ref({checked:!1,indeterminate:!1});function w(n){var p;if(["cascader","select"].includes(n.component)&&n.all&&!n.multiple){const b=[...n.data??[]],k=M(n.all)?n.all:"全部",j=n.labelName||Q;return((p=b==null?void 0:b[0])==null?void 0:p[j])!==k&&b.unshift({[j]:k,[n.valueName||_]:0}),b}return n.data}function x(){a("change",h.value)}function S(n,p){var b;if(n.multiple&&n.all){const k=((b=w(n))==null?void 0:b.length)||0;!p||p.length===0?E.value={checked:!1,indeterminate:!1}:p.length===k?E.value={checked:!0,indeterminate:!1}:E.value={checked:!1,indeterminate:!0}}x()}function T(n,p){p?c(n.prop,(w(n)||[]).map(b=>b[n.valueName||_])):c(n.prop,[]),E.value={checked:!!p,indeterminate:!1}}function z(n,p){const b=D.omit(n,Ge),k=n.width!==void 0?typeof n.width=="number"?`${n.width}px`:String(n.width):void 0,j=k?{width:k}:{};switch(n.component){case"select":{const m=n.labelName||Q,L=n.valueName||_,B=w(n);return t.h(y.ElSelect,{...b,modelValue:p,"onUpdate:modelValue":R=>c(n.prop,R),size:n.size,style:j,fitInputWidth:!0,onChange:R=>S(n,R),...n.clearable===void 0?{clearable:!0}:{}},{...n.multiple&&n.all?{header:()=>t.h(y.ElCheckbox,{modelValue:E.value.checked,indeterminate:E.value.indeterminate,onChange:R=>T(n,R)},()=>M(n.all)?n.all:"全部")}:{},default:()=>(B||[]).map(R=>t.h(y.ElOption,{key:R[L],label:R[m],value:R[L],disabled:R.disabled}))})}case"radio":return t.h(y.ElRadioGroup,{...b,modelValue:p,"onUpdate:modelValue":m=>c(n.prop,m),size:n.size,onChange:x},()=>(n.data||[]).map(m=>t.h(y.ElRadio,{key:m[n.valueName||_],label:m[n.valueName||_],disabled:m.disabled},()=>m[n.labelName||Q])));case"checkbox":return t.h(y.ElCheckboxGroup,{...b,modelValue:p??[],"onUpdate:modelValue":m=>c(n.prop,m),size:n.size,onChange:x},()=>(n.data||[]).map(m=>t.h(y.ElCheckbox,{key:m[n.valueName||_],label:m[n.valueName||_],disabled:m.disabled},()=>m[n.labelName||Q])));case"cascader":return t.h(y.ElCascader,{...b,modelValue:p,"onUpdate:modelValue":m=>c(n.prop,m),options:w(n)||[],props:n.props||{},size:n.size,style:j,clearable:!0,onChange:x});case"treeSelect":return t.h(y.ElTreeSelect,{...b,modelValue:p,"onUpdate:modelValue":m=>c(n.prop,m),data:n.data||[],size:n.size,style:j,onChange:x});case"date":return t.h(y.ElDatePicker,{...b,modelValue:p,"onUpdate:modelValue":m=>c(n.prop,m),type:n.type||"date",size:n.size,style:j,onChange:x});case"inputNumber":return t.h(y.ElInputNumber,{...b,modelValue:p,"onUpdate:modelValue":m=>c(n.prop,m),size:n.size,style:j,onChange:x});case"input":default:return t.h(y.ElInput,{...b,modelValue:p,"onUpdate:modelValue":m=>c(n.prop,m),placeholder:n.placeholder,size:n.size,style:j,clearable:n.clearable===void 0?!0:n.clearable,onKeydown:m=>{m.key==="Enter"&&x()}})}}function A(n){return t.h(y.ElFormItem,{key:n.prop,label:n.label,prop:n.prop},{default:()=>{const p=D.has(h.value,n.prop),b=p?D.get(h.value,n.prop,""):n.initValue!==void 0?n.initValue:"";return i[n.prop]?i[n.prop]({item:n,value:p?D.get(h.value,n.prop):b,setValue:k=>c(n.prop,k)}):z(n,b)}})}return()=>{const n=l.value.map((p,b)=>Array.isArray(p)?p.map(k=>t.h("div",{key:`${k.prop}-${b}`,class:"m-form-item-group"},[A(k)])):A(p));return t.h(y.ElForm,{ref:d,model:h.value,inline:g.value,labelWidth:e.labelWidth,labelPosition:e.labelPosition,size:e.size},{default:()=>[...n,i.default&&i.default()]})}}}),re=new Map,ie=t.defineComponent({name:"Filter",props:{searchColumns:{type:Array,default:()=>[]},moreSearchColumns:{type:Array,default:()=>[]},modelValue:{type:Object,default:()=>({})},size:{type:String,default:"default"},labelWidth:{type:[String,Number],default:80},width:{type:String,default:"240px"},isSearch:{type:Boolean,default:!0},isMore:{type:Boolean,default:!0},isReset:{type:Boolean,default:!1}},emits:["search","update:modelValue","reset","change","more","activated"],setup(e,{emit:a,expose:i}){const o=t.useSlots(),{visible:l,openDialog:u,closeDialog:g}=le(),d=t.computed({get:()=>e.modelValue,set:S=>a("update:modelValue",S)}),h=t.computed(()=>e.searchColumns.map((S,T)=>(T>1&&(S.class=S.class?S.class+" hidden-below-2xl":"hidden-below-2xl"),S))),c={},C={};for(const S in o){const T=o[S];if(/^search-/.test(S)){const z=S.replace("search-","");c[z]=T}if(/^moreSearch-/.test(S)){const z=S.replace("moreSearch-","");C[z]=T}}let s;try{s=void 0}catch{}t.onActivated(()=>{s&&re.has(s)&&(d.value=re.get(s),a("activated"))}),t.onDeactivated(()=>{s&&re.set(s,t.unref(d))});const r=()=>{const S={};e.searchColumns&&e.searchColumns.forEach(T=>{W(T)?T.forEach(z=>{S[z.prop]=z.initValue??""}):S[T.prop]=T.initValue??""}),e.moreSearchColumns&&e.moreSearchColumns.forEach(T=>{W(T)?T.forEach(z=>{S[z.prop]=z.initValue??""}):S[T.prop]=T.initValue??""}),d.value=S};function f(){a("search")}function N(){l.value=!1,a("search")}function E(){r(),a("search"),a("reset"),g()}function w(){u(),a("more")}function x(S){a("change",S)}return i({initSearchParams:r}),()=>{var S,T,z;return t.h("div",{class:"m-filter"},[t.h("div",{class:"m-filter-l"},[t.h(Y,{modelValue:d.value,"onUpdate:modelValue":A=>d.value=A,columns:h.value,inline:!0,onChange:x},c),(S=o.default)==null?void 0:S.call(o),((T=o["menu-left"])==null?void 0:T.call(o))||t.h("div",{class:"flex items-center"},[e.isSearch&&t.h(y.ElButton,{type:"primary",onClick:f},()=>"搜索"),e.isMore&&e.moreSearchColumns.length>0&&t.h(y.ElButton,{onClick:w},()=>"更多筛选"),e.isReset&&t.h(y.ElButton,{onClick:E},()=>"重置")])].filter(Boolean)),t.h("div",{class:"m-filter-r"},[(z=o["menu-right"])==null?void 0:z.call(o)]),e.moreSearchColumns.length>0?t.h(y.ElDialog,{modelValue:l.value,"onUpdate:modelValue":A=>l.value=A,top:"150px",width:"900px",draggable:!0},{header:()=>{var A;return t.h("div",{class:"flex justify-between items-center"},[t.h("span",null,"更多筛选"),(A=o["moreSearch-title-right"])==null?void 0:A.call(o)])},default:()=>t.h(Y,{modelValue:d.value,"onUpdate:modelValue":A=>d.value=A,columns:e.moreSearchColumns,labelWidth:e.labelWidth},C),footer:()=>t.h("div",null,[t.h(y.ElButton,{type:"primary",onClick:N},()=>"确定"),t.h(y.ElButton,{onClick:g},()=>"取消"),t.h(y.ElButton,{onClick:E},()=>"重置")])}):null])}}});Math.easeInOutQuad=function(e,a,i,o){return e/=o/2,e<1?i/2*e*e+a:(e--,-i/2*(e*(e-2)-1)+a)};let Qe=(function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(e){window.setTimeout(e,1e3/60)}})();function Ye(e){document.documentElement.scrollTop=e,document.body.parentNode.scrollTop=e,document.body.scrollTop=e}function Xe(){return document.documentElement.scrollTop||document.body.parentNode.scrollTop||document.body.scrollTop}function ye(e,a,i){const o=Xe(),l=e-o,u=20;let g=0;a=typeof a>"u"?500:a;let d=function(){g+=u;let h=Math.easeInOutQuad(g,o,l,a);Ye(h),g<a&&Qe(d)};d()}const ce=t.defineComponent({name:"Pagination",props:{total:{required:!0,type:Number},page:{type:Number,default:1},limit:{type:Number,default:20},pageSizes:{type:Array,default(){return[10,20,30,50]}},layout:{type:String,default:"total, sizes, prev, pager, next, jumper"},autoScroll:{type:Boolean,default:!0},hidden:{type:Boolean,default:!1},background:{type:Boolean,default:!0},simple:{type:Boolean,default:!1}},emits:["update:page","update:limit","pagination"],setup(e,{emit:a}){const i=y.useAttrs(),o=t.computed(()=>D.pick(i.value,D.keys(y.paginationProps))),l=t.computed(()=>e.simple?"prev, pager, next":e.layout),u=t.computed({get(){return e.page},set(c){a("update:page",c)}}),g=t.computed({get(){return e.limit},set(c){a("update:limit",c)}});function d(c){a("pagination",{page:u.value,limit:c}),e.autoScroll&&ye(0,800)}function h(c){a("pagination",{page:c,limit:g.value}),e.autoScroll&&ye(0,800)}return()=>t.createVNode("div",{class:"m-pagination"},[t.createVNode(y.ElPagination,t.mergeProps(o.value,{currentPage:u.value},{"onUpdate:currentPage":c=>u.value=c},{pageSize:g.value},{"onUpdate:pageSize":c=>g.value=c},{layout:l.value,"page-sizes":e.pageSizes,total:e.total,background:e.background,onSizeChange:d,onCurrentChange:h}),null)])}}),be=t.defineComponent({name:"Crud",props:He,emits:["update:search","reset"],setup(e,{emit:a,expose:i}){const o=t.useAttrs(),l=t.useSlots(),u=t.ref([]),{tableSlots:g,filterSlots:d,searchSlots:h}=Le(),c=`a${Math.floor(Math.random()*1e6)}`,{tableHeight:C,calcTableHeight:s}=We(c),r=t.ref(!1),f=t.ref(0),{tableColumns:N,searchColumns:E,moreSearchColumns:w,footerReverse:x}=t.toRefs(e),S=t.ref([]),T=t.ref(1),z=t.ref(e.limit),A=t.ref(e.pageSizes),n=t.ref({});se({el:window,name:"resize",listener:()=>{s()}});const{table:p,clearSelection:b,toggleRowSelection:k,toggleAllSelection:j,toggleRowExpansion:m,setCurrentRow:L,clearSort:B,clearFilter:R,doLayout:tt,sort:nt}=ge();async function at(){try{if(ee(e.request)){r.value=!0;const{data:v,success:F,total:Z}=await e.request({pageInfo:{page:T.value,limit:z.value},params:n.value});r.value=!1,F?(f.value=Z,S.value=v):(S.value=[],f.value=0),t.nextTick(()=>{var K;ee(e.afterRequest)&&((K=e.afterRequest)==null||K.call(e,t.unref(S)))})}else throw new TypeError("Type of the default value for 'request' prop must be a function")}catch(v){throw r.value=!1,v}}const ue=()=>{e.searchColumns&&e.searchColumns.forEach(v=>{W(v)?v.forEach(F=>{n.value[F.prop]=F.initValue??""}):n.value[v.prop]=v.initValue??""}),e.moreSearchColumns&&e.moreSearchColumns.forEach(v=>{W(v)?v.forEach(F=>{n.value[F.prop]=F.initValue??""}):n.value[v.prop]=v.initValue??""})},X=J.useDebounceFn(at,e.debounceTime);t.onMounted(()=>{ue(),e.init&&X(),t.nextTick(()=>{s()})});let Se=!0;t.onActivated(()=>{s(),!Se&&S.value.length===0&&X(),Se=!1});const lt=v=>{u.value=v},$=(v=!1)=>{v&&(T.value=1),X()},ot=()=>{a("reset"),ue(),$(!0)};i({pageTotal:f,initSearchParams:ue,refresh:$,search:n,table:p,clearSelection:b,toggleRowSelection:k,toggleAllSelection:j,toggleRowExpansion:m,setCurrentRow:L,clearSort:B,clearFilter:R,doLayout:tt,sort:nt,data:S,calcTableHeight:s,selectionList:u});const Ce={};for(const v in g)Ce[v]=F=>g[v]({row:F==null?void 0:F.row,index:F==null?void 0:F.$index});const we={};["action","action-header","expand","append","empty"].forEach(v=>{l[v]&&(we[v]=F=>l[v]({...F||{},size:void 0}))});const ve={};for(const v in h)ve[v]=()=>h[v]({params:n.value});return()=>{var v,F,Z,K,Te,Ve,Ne,Ee;return t.h("section",{class:"m-crud"},[t.h("div",{id:`${c}-header`,class:"m-crud-header"},[((v=l.header)==null?void 0:v.call(l))||[((F=l["menu-left"])==null?void 0:F.call(l))||t.h("div",{class:"flex items-center"},[(Z=l["form-menu-top"])==null?void 0:Z.call(l),t.h("div",{class:"flex items-center"},[(K=l["form-menu-left"])==null?void 0:K.call(l),t.h(ie,{modelValue:n.value,"onUpdate:modelValue":O=>n.value=O,searchColumns:E.value,moreSearchColumns:w.value,...o,onSearch:()=>$(!0),onChange:()=>$(!0),onActivated:()=>$(!1),onReset:ot},{...ve,...d,"form-menu-right":()=>{var O;return(O=l["form-menu-right"])==null?void 0:O.call(l,{search:n.value})},"moreSearch-title-right":()=>{var O;return(O=l["moreSearch-title-right"])==null?void 0:O.call(l)}})])]),t.h("div",{class:"flex-1 flex justify-end"},[(Te=l["menu-right"])==null?void 0:Te.call(l)])]]),t.h("div",{class:"m-crud-body",style:{height:`calc(100% - ${C.value||"120px"})`}},[((Ve=l.table)==null?void 0:Ve.call(l,{data:S.value}))||t.withDirectives(t.h(oe,{ref:p,height:"100%",columns:N.value,data:S.value,...o,onSelectionChange:O=>lt(O)},{...we,...Ce}),[[y.vLoading,r.value]])]),t.h("div",{id:`${c}-footer`,class:["m-crud-footer",x.value?"flex-row-reverse":""]},[((Ne=l.footer)==null?void 0:Ne.call(l))||[t.h("div",{},[(Ee=l.batch)==null?void 0:Ee.call(l,{list:u.value})]),t.h(ce,{style:f.value>0?void 0:{display:"none"},page:T.value,"onUpdate:page":O=>T.value=O,limit:z.value,"onUpdate:limit":O=>z.value=O,pageSizes:A.value,"onUpdate:pageSizes":O=>A.value=O,total:f.value,...o,onPagination:X})]])])}}}),Ze=()=>{const e=t.ref(),a=t.computed({get(){var r;return(r=e.value)==null?void 0:r.search},set(r){e.value.search=r}}),i=t.computed(()=>{var r;return((r=e.value)==null?void 0:r.data)||[]}),o=t.computed(()=>{var r;return(r=e.value)==null?void 0:r.pageTotal}),l=t.computed(()=>{var r;return(r=e.value)==null?void 0:r.selectionList});return{crudRef:r=>{e.value=r},search:a,doLayout:()=>{t.nextTick(()=>{var r;(r=e.value)==null||r.calcTableHeight()})},data:i,refresh:()=>{var r;(r=e.value)==null||r.refresh()},pageTotal:o,calcHeight:()=>{t.nextTick(()=>{var r;(r=e.value)==null||r.calcTableHeight()})},initSearchParams:()=>{var r;(r=e.value)==null||r.initSearchParams()},selectionList:l,toggleAllSelection:()=>{var r;(r=e.value)==null||r.toggleAllSelection()},toggleRowSelection:(r,f)=>{var N;(N=e.value)==null||N.toggleRowSelection(r,f)}}},Pe=[be,oe,ie,Y,ce,q,G],et={install:e=>{Pe.forEach(a=>{const i=a.name||a.__name;i&&e.component(i,a)})}};V.ColumnSettings=G,V.Crud=be,V.Filter=ie,V.Form=Y,V.Icon=q,V.Pagination=ce,V.Table=oe,V.clearTableConfig=Ie,V.default=et,V.registerTableConfig=De,V.useCrud=Ze,V.useEventListener=se,V.useOpenDialog=le,V.useTableConfig=ae,Object.defineProperties(V,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
|
|
2
|
+
//# sourceMappingURL=element-crud.umd.js.map
|