@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.umd.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","flexType","right","center","left","display","alignItems","justifyContent","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","app","component"],"mappings":"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"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nuonuo/element-crud 类型定义
|
|
3
|
+
*/
|
|
4
|
+
import { DefineComponent, Plugin, Ref, ComputedRef } from 'vue'
|
|
5
|
+
|
|
6
|
+
// ==================== 组件类型 ====================
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Crud 组件
|
|
10
|
+
*/
|
|
11
|
+
export interface CrudProps {
|
|
12
|
+
/**
|
|
13
|
+
* 列表列配置项
|
|
14
|
+
* 支持数组或字符串(字符串时从 tableConfig 获取)
|
|
15
|
+
*/
|
|
16
|
+
tableColumns?: Array<any> | string
|
|
17
|
+
/**
|
|
18
|
+
* 表单筛选配置
|
|
19
|
+
*/
|
|
20
|
+
searchColumns?: Array<any>
|
|
21
|
+
/**
|
|
22
|
+
* 更多表单筛选配置
|
|
23
|
+
*/
|
|
24
|
+
moreSearchColumns?: Array<any>
|
|
25
|
+
/**
|
|
26
|
+
* 绑定的搜索参数
|
|
27
|
+
*/
|
|
28
|
+
search?: Record<string, any>
|
|
29
|
+
/**
|
|
30
|
+
* 请求方法
|
|
31
|
+
*/
|
|
32
|
+
request?: (options: {
|
|
33
|
+
pageInfo: { page: number; limit: number }
|
|
34
|
+
params: Record<string, any>
|
|
35
|
+
}) => Promise<{ data: Array<any>; total: number; success: boolean }>
|
|
36
|
+
/**
|
|
37
|
+
* 防抖时间(毫秒)
|
|
38
|
+
*/
|
|
39
|
+
debounceTime?: number
|
|
40
|
+
/**
|
|
41
|
+
* 请求后回调
|
|
42
|
+
*/
|
|
43
|
+
afterRequest?: (data: Array<any>) => void
|
|
44
|
+
/**
|
|
45
|
+
* 是否初始化时请求
|
|
46
|
+
*/
|
|
47
|
+
init?: boolean
|
|
48
|
+
/**
|
|
49
|
+
* 分页每页条数
|
|
50
|
+
*/
|
|
51
|
+
limit?: number
|
|
52
|
+
/**
|
|
53
|
+
* 底部 footer 反转
|
|
54
|
+
*/
|
|
55
|
+
footerReverse?: boolean
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface CrudExposed {
|
|
59
|
+
pageTotal: Ref<number>
|
|
60
|
+
initSearchParams: () => void
|
|
61
|
+
refresh: () => void
|
|
62
|
+
search: Ref<Record<string, any>>
|
|
63
|
+
data: Ref<Array<any>>
|
|
64
|
+
selectionList: Ref<Array<any>>
|
|
65
|
+
toggleAllSelection: () => void
|
|
66
|
+
toggleRowSelection: (row: any, selected: boolean) => void
|
|
67
|
+
calcTableHeight: () => void
|
|
68
|
+
clearSelection: () => void
|
|
69
|
+
toggleRowExpansion: (row: any, expanded: boolean) => void
|
|
70
|
+
setCurrentRow: (row: any) => void
|
|
71
|
+
clearSort: () => void
|
|
72
|
+
clearFilter: (columnKeys?: string[]) => void
|
|
73
|
+
doLayout: () => void
|
|
74
|
+
sort: (prop: string, order: string) => void
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export declare const Crud: DefineComponent<CrudProps>
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Table 组件
|
|
81
|
+
*/
|
|
82
|
+
export interface TableProps {
|
|
83
|
+
selection?: boolean | object
|
|
84
|
+
expand?: boolean | object
|
|
85
|
+
emptyFill?: string
|
|
86
|
+
index?: boolean | object
|
|
87
|
+
action?: boolean | object
|
|
88
|
+
columns?: Array<TableColumn> | string
|
|
89
|
+
data?: Array<any>
|
|
90
|
+
height?: string | number
|
|
91
|
+
maxHeight?: string | number
|
|
92
|
+
border?: boolean
|
|
93
|
+
stripe?: boolean
|
|
94
|
+
rowKey?: string | ((row: any) => string)
|
|
95
|
+
showHeader?: boolean
|
|
96
|
+
showSummary?: boolean
|
|
97
|
+
size?: 'large' | 'default' | 'small'
|
|
98
|
+
[key: string]: any
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface TableColumn {
|
|
102
|
+
label: string
|
|
103
|
+
prop: string
|
|
104
|
+
width?: string | number
|
|
105
|
+
minWidth?: string | number
|
|
106
|
+
hide?: boolean
|
|
107
|
+
fixed?: 'left' | 'right' | boolean
|
|
108
|
+
render?: (row: any, index: number) => any
|
|
109
|
+
children?: TableColumn[]
|
|
110
|
+
[key: string]: any
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export declare const Table: DefineComponent<TableProps>
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Filter 组件
|
|
117
|
+
*/
|
|
118
|
+
export interface FilterProps {
|
|
119
|
+
searchColumns?: Array<any>
|
|
120
|
+
moreSearchColumns?: Array<any>
|
|
121
|
+
modelValue?: Record<string, any>
|
|
122
|
+
size?: string
|
|
123
|
+
labelWidth?: string | number
|
|
124
|
+
width?: string
|
|
125
|
+
isSearch?: boolean
|
|
126
|
+
isMore?: boolean
|
|
127
|
+
isReset?: boolean
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export declare const Filter: DefineComponent<FilterProps>
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Form 组件
|
|
134
|
+
*/
|
|
135
|
+
export interface FormProps {
|
|
136
|
+
modelValue?: Record<string, any>
|
|
137
|
+
columns?: Array<FormColumn>
|
|
138
|
+
inline?: boolean
|
|
139
|
+
labelWidth?: string | number
|
|
140
|
+
labelPosition?: 'left' | 'right' | 'top'
|
|
141
|
+
[key: string]: any
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export interface FormColumn {
|
|
145
|
+
label: string
|
|
146
|
+
prop: string
|
|
147
|
+
component?: 'input' | 'select' | 'date' | 'cascader' | string
|
|
148
|
+
placeholder?: string
|
|
149
|
+
data?: Array<{ label: string; value: any }>
|
|
150
|
+
initValue?: any
|
|
151
|
+
[key: string]: any
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export declare const Form: DefineComponent<FormProps>
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Pagination 组件
|
|
158
|
+
*/
|
|
159
|
+
export interface PaginationProps {
|
|
160
|
+
total: number
|
|
161
|
+
page?: number
|
|
162
|
+
limit?: number
|
|
163
|
+
pageSizes?: number[]
|
|
164
|
+
layout?: string
|
|
165
|
+
autoScroll?: boolean
|
|
166
|
+
hidden?: boolean
|
|
167
|
+
background?: boolean
|
|
168
|
+
simple?: boolean
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export declare const Pagination: DefineComponent<PaginationProps>
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Icon 组件
|
|
175
|
+
*/
|
|
176
|
+
export interface IconProps {
|
|
177
|
+
name: string
|
|
178
|
+
size?: number
|
|
179
|
+
color?: string
|
|
180
|
+
type?: string
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export declare const Icon: DefineComponent<IconProps>
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* ColumnSettings 组件
|
|
187
|
+
*/
|
|
188
|
+
export interface ColumnSettingsProps {
|
|
189
|
+
type: string
|
|
190
|
+
title?: string
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export declare const ColumnSettings: DefineComponent<ColumnSettingsProps>
|
|
194
|
+
|
|
195
|
+
// ==================== Composable 类型 ====================
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* useCrud 返回类型
|
|
199
|
+
*/
|
|
200
|
+
export interface UseCrudReturn {
|
|
201
|
+
crudRef: (val: any) => void
|
|
202
|
+
search: ComputedRef<Record<string, any>>
|
|
203
|
+
data: ComputedRef<Array<any>>
|
|
204
|
+
pageTotal: ComputedRef<number>
|
|
205
|
+
selectionList: ComputedRef<Array<any>>
|
|
206
|
+
refresh: () => void
|
|
207
|
+
initSearchParams: () => void
|
|
208
|
+
calcHeight: () => void
|
|
209
|
+
doLayout: () => void
|
|
210
|
+
toggleAllSelection: () => void
|
|
211
|
+
toggleRowSelection: (row: any, state: boolean) => void
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* useTableConfig 返回类型
|
|
216
|
+
*/
|
|
217
|
+
export interface UseTableConfigReturn {
|
|
218
|
+
getTableConfig: (type: string) => TableColumn[]
|
|
219
|
+
setTableConfig: (type: string, data: TableColumn[]) => void
|
|
220
|
+
resetTableConfig: (type: string) => void
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* useEventListener 选项
|
|
225
|
+
*/
|
|
226
|
+
export interface UseEventListenerOptions {
|
|
227
|
+
el?: EventTarget
|
|
228
|
+
name: string
|
|
229
|
+
listener: (event: Event) => void
|
|
230
|
+
isDebounce?: boolean
|
|
231
|
+
wait?: number
|
|
232
|
+
autoRemove?: boolean
|
|
233
|
+
options?: AddEventListenerOptions
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* useOpenDialog 返回类型
|
|
238
|
+
*/
|
|
239
|
+
export interface UseOpenDialogReturn {
|
|
240
|
+
visible: Ref<boolean>
|
|
241
|
+
openDialog: () => void
|
|
242
|
+
closeDialog: () => void
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// ==================== 函数类型 ====================
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* useCrud - Crud 组件控制 Hook
|
|
249
|
+
*/
|
|
250
|
+
export declare function useCrud(): UseCrudReturn
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* useTableConfig - 表格配置管理 Hook
|
|
254
|
+
*/
|
|
255
|
+
export declare function useTableConfig(): UseTableConfigReturn
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* registerTableConfig - 注册表配置
|
|
259
|
+
*/
|
|
260
|
+
export declare function registerTableConfig(
|
|
261
|
+
config: Record<string, Array<TableColumn> | (() => TableColumn[])>,
|
|
262
|
+
options?: { tableWidthConfig?: Record<string, string> }
|
|
263
|
+
): void
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* clearTableConfig - 清除所有注册的配置
|
|
267
|
+
*/
|
|
268
|
+
export declare function clearTableConfig(): void
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* useEventListener - 事件监听 Hook
|
|
272
|
+
*/
|
|
273
|
+
export declare function useEventListener(options: UseEventListenerOptions): {
|
|
274
|
+
removeEvent: () => void
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* useOpenDialog - 弹窗控制 Hook
|
|
279
|
+
*/
|
|
280
|
+
export declare function useOpenDialog(): UseOpenDialogReturn
|
|
281
|
+
|
|
282
|
+
// ==================== 插件类型 ====================
|
|
283
|
+
|
|
284
|
+
export interface ElementCrudPlugin {
|
|
285
|
+
install: (app: any) => void
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
declare const ElementCrud: ElementCrudPlugin
|
|
289
|
+
|
|
290
|
+
export default ElementCrud
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hotmi754/element-crud",
|
|
3
|
+
"version": "1.0.4",
|
|
4
|
+
"description": "基于 Element Plus 的 CRUD 组件库",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/element-crud.cjs.js",
|
|
7
|
+
"module": "dist/element-crud.es.js",
|
|
8
|
+
"types": "dist/types/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/types/index.d.ts",
|
|
12
|
+
"import": "./dist/element-crud.es.js",
|
|
13
|
+
"require": "./dist/element-crud.cjs.js"
|
|
14
|
+
},
|
|
15
|
+
"./style.css": "./dist/assets/element-crud.css"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"sideEffects": [
|
|
21
|
+
"**/*.css"
|
|
22
|
+
],
|
|
23
|
+
"keywords": [
|
|
24
|
+
"vue3",
|
|
25
|
+
"element-plus",
|
|
26
|
+
"crud",
|
|
27
|
+
"table",
|
|
28
|
+
"component"
|
|
29
|
+
],
|
|
30
|
+
"author": "hotmi <mibin754@gmail.com>",
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"lodash-es": "^4.17.21",
|
|
34
|
+
"vuedraggable-es": "^4.1.1"
|
|
35
|
+
},
|
|
36
|
+
"peerDependencies": {
|
|
37
|
+
"vue": ">=3.3.0",
|
|
38
|
+
"element-plus": ">=2.4.0",
|
|
39
|
+
"@element-plus/icons-vue": ">=1.0.0",
|
|
40
|
+
"@vueuse/core": ">=8.0.0"
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"build": "vite build",
|
|
44
|
+
"dev": "vite build --watch",
|
|
45
|
+
"test": "vitest run"
|
|
46
|
+
}
|
|
47
|
+
}
|