@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 ADDED
@@ -0,0 +1,222 @@
1
+ # @nuonuo/element-crud
2
+
3
+ 基于 **Element Plus** 的 CRUD 列表组件库。从 `nuonuo-fresh3-manage-web` 管理后台中抽取,提供开箱即用的表格、搜索筛选、分页与列设置能力。
4
+
5
+ - 当前版本:**1.0.4**
6
+ - Peer 依赖:`vue >=3.3.0` / `element-plus >=2.4.0` / `@element-plus/icons-vue >=1.0.0` / `@vueuse/core >=8.0.0`
7
+ - 构建产物:ESM / CJS / UMD 三格式 + 完整类型声明(`dist/types/index.d.ts`)+ 样式
8
+
9
+ ## 安装
10
+
11
+ ```bash
12
+ npm install @nuonuo/element-crud
13
+ # 或
14
+ pnpm add @nuonuo/element-crud
15
+ ```
16
+
17
+ > 私有源未发布前,可用本地 tgz 安装:`npm install ./nuonuo-element-crud-1.0.4.tgz`
18
+
19
+ ## 快速上手
20
+
21
+ ### 1. 引入样式与表格列配置
22
+
23
+ ```js
24
+ // main.js
25
+ import '@nuonuo/element-crud/style.css'
26
+ import { registerTableConfig } from '@nuonuo/element-crud'
27
+
28
+ // 注册表格列配置:之后 <Crud table-columns="userList"> 直接用字符串引用
29
+ registerTableConfig({
30
+ userList: [
31
+ { label: '姓名', prop: 'name' },
32
+ { label: '邮箱', prop: 'email' },
33
+ { label: '状态', prop: 'status', width: 'status' }
34
+ ],
35
+ // 宽度别名:width 值不是数字时按这里查值
36
+ tableWidthConfig: {
37
+ status: 90,
38
+ dateTime: 180
39
+ }
40
+ })
41
+ ```
42
+
43
+ 组件也可全局注册:
44
+
45
+ ```js
46
+ import ElementCrud from '@nuonuo/element-crud'
47
+
48
+ app.use(ElementCrud) // 注册 Crud/Table/Filter/Form/Pagination/Icon/MColumnSettings
49
+ ```
50
+
51
+ ### 2. 用 Crud 跑通增删改查
52
+
53
+ ```vue
54
+ <template>
55
+ <!-- 行数、翻页、搜索、勾选、批量等全部内聚在 Crud 内 -->
56
+ <Crud
57
+ ref="crudComp"
58
+ table-columns="userList"
59
+ :request="fetchUsers"
60
+ :search-columns="searchColumns"
61
+ :more-search-columns="moreSearchColumns"
62
+ selection
63
+ :action="{ label: '操作', width: '180px' }"
64
+ border
65
+ >
66
+ <!-- 工具栏 -->
67
+ <template #menu-right>
68
+ <el-button type="primary" @click="openAdd">新增用户</el-button>
69
+ </template>
70
+ <!-- 自定义单元格(table-{prop})-->
71
+ <template #table-status="{ row }">
72
+ <el-tag :type="row.status === 1 ? 'success' : 'info'" size="small">
73
+ {{ row.status === 1 ? '启用' : '禁用' }}
74
+ </el-tag>
75
+ </template>
76
+ <!-- 操作列(action)-->
77
+ <template #action="{ row }">
78
+ <el-button link type="primary" @click="openEdit(row)">编辑</el-button>
79
+ <el-button link type="danger" @click="removeUser(row)">删除</el-button>
80
+ </template>
81
+ <!-- 批量操作条(batch,勾选行后出现)-->
82
+ <template #batch="{ list }">
83
+ <el-button v-if="list.length" size="small" type="danger" plain @click="batchRemove(list)">
84
+ 批量删除({{ list.length }})
85
+ </el-button>
86
+ </template>
87
+ </Crud>
88
+ </template>
89
+
90
+ <script setup>
91
+ import { ref } from 'vue'
92
+ import { Crud, registerTableConfig } from '@nuonuo/element-crud'
93
+
94
+ // request 契约:接收 { pageInfo:{page,limit}, params },返回 { data, total, success }
95
+ const fetchUsers = async ({ pageInfo, params }) => {
96
+ const res = await api.getUserList({ ...pageInfo, ...params })
97
+ return { data: res.list, total: res.total, success: true }
98
+ }
99
+
100
+ const searchColumns = [
101
+ { label: '关键词', prop: 'keyword', component: 'input' },
102
+ {
103
+ label: '状态',
104
+ prop: 'status',
105
+ component: 'select',
106
+ all: true, // 单选下拉自动补「全部」选项(value=0)
107
+ data: [
108
+ { label: '启用', value: 1 },
109
+ { label: '禁用', value: 0 }
110
+ ]
111
+ }
112
+ ]
113
+ const moreSearchColumns = [{ label: '创建日期', prop: 'createdAt', component: 'date' }]
114
+ </script>
115
+ ```
116
+
117
+ > 组件实例方法通过 ref 暴露:`refresh()`(重置到第 1 页并刷新)、`initSearchParams()`、`clearSelection()`、`toggleRowSelection()` 等;或使用 `useCrud()` 组合式函数代理访问。
118
+
119
+ ## 组件 API
120
+
121
+ ### `<Crud>` Props
122
+
123
+ | 属性 | 说明 | 类型 | 默认值 |
124
+ |------|------|------|--------|
125
+ | tableColumns | 列配置,支持数组或字符串(字符串从 `registerTableConfig` 取) | `TableColumn[] \| string` | `[]` |
126
+ | searchColumns | 常驻搜索项 | `FormColumn[]` | `[]` |
127
+ | moreSearchColumns | 「更多筛选」弹窗搜索项 | `FormColumn[]` | `[]` |
128
+ | request | 数据请求函数(必传) | `(opt) => Promise<{data,total,success}>` | — |
129
+ | debounceTime | 请求防抖毫秒 | `number` | `500` |
130
+ | afterRequest | 请求完成回调 `(data) => void` | `Function` | — |
131
+ | init | 挂载后是否自动请求 | `boolean` | `true` |
132
+ | limit | 分页每页条数 | `number` | `20` |
133
+ | footerReverse | 底部布局反转 | `boolean` | `false` |
134
+
135
+ 其余未声明的 attrs(如 `border`、`stripe`、`row-key`…)透传给内部 ElTable。
136
+
137
+ **Events**:`reset`(重置)、`update:search`
138
+ **Slots**:`header`、`menu-left`、`menu-right`、`form-menu-top/left/right`、`table`(整体覆盖)、`table-{prop}`(单元格)、`table-{prop}-header`(列头)、`action`(操作列)、`action-header`、`batch`(批量操作区)、`footer`(整段覆盖)、`expand`、`empty`、`append`,以及透传给 Filter 的 `search-*` / `moreSearch-*` / `filter-*`
139
+
140
+ ### `<Table>` 关键 Props
141
+
142
+ | 属性 | 说明 | 类型 | 默认值 |
143
+ |------|------|------|--------|
144
+ | columns | 列配置(数组/字符串) | `TableColumn[] \| string` | `[]` |
145
+ | data | 行数据 | `any[]` | `[]` |
146
+ | selection | 多选列 | `boolean \| object` | `false` |
147
+ | index | 序号列 | `boolean \| object` | `false` |
148
+ | action | 操作列配置(配合 `slots.action`) | `boolean \| object` | `false` |
149
+ | emptyFill | 空值填充符 | `string` | `'--'` |
150
+
151
+ `TableColumn`:`{ label, prop, width?, minWidth?, hide?, fixed?, render?(row,index), children? }`
152
+
153
+ ### `<Filter>` Props
154
+
155
+ | 属性 | 说明 | 类型 | 默认值 |
156
+ |------|------|------|--------|
157
+ | modelValue | v-model 搜索对象 | `object` | `{}` |
158
+ | searchColumns | 常驻项(第 3 个起小屏自动隐藏) | `FormColumn[]` | `[]` |
159
+ | moreSearchColumns | 弹窗项 | `FormColumn[]` | `[]` |
160
+ | isSearch / isMore / isReset | 搜索/更多筛选/重置按钮开关 | `boolean` | true / true / false |
161
+
162
+ **Events**:`search`、`change`、`more`、`activated`、`reset`
163
+ **Slots**:默认、`menu-left/right`、`search-{prop}`、`moreSearch-{prop}`、`moreSearch-title-right`
164
+
165
+ ### `<Form>`(搜索表单)
166
+
167
+ | 属性 | 说明 | 类型 | 默认值 |
168
+ |------|------|------|--------|
169
+ | modelValue | v-model 表单对象 | `object` | `{}` |
170
+ | columns | 表单项配置 | `FormColumn[]` | `[]` |
171
+ | inline | 行内布局 | `boolean` | `false` |
172
+ | labelWidth / labelPosition / size | 同 ElForm | — | 80 / top / — |
173
+
174
+ 支持插槽自定义控件:`#{prop}`(参数 `{ item, value, setValue }`)。
175
+ expose:`validate / resetFields / clearValidate / validateField / scrollToField`。
176
+
177
+ **FormColumn.component 支持**:`input`、`select`(多选+all 全选联动/单选 all 补「全部」)、`radio`、`checkbox`、`date`、`cascader`、`treeSelect`、`inputNumber`;其余复杂业务控件用同名插槽注入。
178
+
179
+ ### `<Pagination>` Props
180
+
181
+ 继承常用 ElPagination 行为:`total`(必传)、`page`/`update:page`、`limit`/`update:limit`、`pageSizes`、`layout`、`autoScroll`、`background`、`simple`。事件 `pagination({page, limit})` 在翻页/改条数时触发。
182
+
183
+ ### `<Icon>`
184
+
185
+ - `name="el-close"` 等 el- 前缀 → 渲染 Element Plus 图标
186
+ - 其余名称 → 渲染宿主的 svg symbol(`#icon-name`,需宿主注入 sprite)
187
+ - Props:`name`(必填)、`size`、`color`、`type`
188
+
189
+ ### `<MColumnSettings>`(列显示/排序抽屉)
190
+
191
+ 由 Table 的 `isSetting` 列头图标触发打开(`ref.init()`),拖拽排序 + 显隐勾选 + localStorage 持久化(键 `element_crud_table_config`)。Props:`type`(必填,对应注册的列配置名)、`title`(默认「列表显示字段」)。Event:`submit`、`update:modelValue`。
192
+
193
+ ## Composables
194
+
195
+ ```js
196
+ import { useCrud, useTableConfig, useOpenDialog, useEventListener } from '@nuonuo/element-crud'
197
+
198
+ // useCrud:经函数型 ref 绑定实例后代理访问
199
+ const { crudRef, search, data, pageTotal, selectionList, refresh, calcHeight, initSearchParams } = useCrud()
200
+ // crudRef 是函数:模板里 ref="crudRef" 或 JSX 里 ref={crudRef} 即可绑定
201
+ refresh() // 回到第 1 页并刷新列表
202
+
203
+ // useTableConfig:细粒度管理列配置(包内已由 Table/ColumnSettings 使用)
204
+ const { getTableConfig, setTableConfig, resetTableConfig } = useTableConfig()
205
+ ```
206
+
207
+ ## 类型声明
208
+
209
+ 全部组件 Props 与 composable 返回值的 TypeScript 类型位于 `dist/types/index.d.ts`,导入即有提示。
210
+
211
+ ## 从旧项目迁移
212
+
213
+ 1. 依赖改为 `"@nuonuo/element-crud": "file:packages/element-crud"`(或私有源版本号)
214
+ 2. 全局样式导入:`import '@nuonuo/element-crud/style.css'`
215
+ 3. 把原来散落的 tableConfig modules 用 `registerTableConfig()` 注册(参考本仓库 `src/main.js` 的适配层示例)
216
+ 4. 将各组件入口文件替换为包内转发(参考本仓库 `src/components/{Crud,Table,Filter,ColumnSettings}/index.js`)
217
+
218
+ ## 已知边界
219
+
220
+ - Form 为搜索场景精简版:业务级上传/富文本等富控件请走插槽或继续使用项目本地 Form 组件
221
+ - `keep-alive` 场景的搜索条件路由级缓存(原 `useCacheSearchParams`)需要 vue-router 上下文,包内默认关闭
222
+ - Icon 非 `el-` 名称依赖宿主 svg sprite,缺失时不显示对应图形
@@ -0,0 +1 @@
1
+ @charset "UTF-8";.m-crud{height:100%}.m-crud-header{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;padding:16px 0}.m-crud-body{position:relative}.m-crud-footer{display:flex;justify-content:space-between;align-items:center;height:50px}.m-filter{display:flex;justify-content:space-between;align-items:center}.m-filter-l{display:flex;align-items:center}.m-filter-l :deep(.el-form-item){margin-right:12px;margin-bottom:0!important}.m-pagination{display:flex;justify-content:flex-end;align-items:center}.m-column-settings{display:flex;align-items:center;margin:0 5px}.m-drawer-title{display:flex;justify-content:space-between;align-items:center;padding:0 0 20px}.settings-item{cursor:pointer;display:flex;align-items:center}.settings-footer{display:flex;justify-content:space-between}.cursor-pointer{cursor:pointer}.cursor-move{cursor:move}.cursor-not-allowed{cursor:not-allowed!important}.mr-2{margin-right:.5rem}.flex{display:flex}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-between{justify-content:space-between}.flex-1{flex:1}.flex-row-reverse{flex-direction:row-reverse}@media(max-width:1535px){.hidden-below-2xl{display:none!important}}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("vue"),G=require("@vueuse/core"),y=require("element-plus"),j=require("lodash-es"),ke=require("@element-plus/icons-vue"),Re=require("vuedraggable-es");function Oe(e){const l=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const u in e)if(u!=="default"){const o=Object.getOwnPropertyDescriptor(e,u);Object.defineProperty(l,u,o.get?o:{enumerable:!0,get:()=>e[u]})}}return l.default=e,Object.freeze(l)}const Be=Oe(ke);function be({el:e=window,isDebounce:l=!0,listener:u,wait:o=80,name:a,options:c,autoRemove:g=!0}){let d;const h=t.ref(!1);if(e){const i=t.ref(e),S=l?G.useDebounceFn(u,o):G.useThrottleFn(u,o),s=o?S:u,r=N=>{h.value=!0,N.removeEventListener(a,s,c)},f=N=>N.addEventListener(a,s,c),E=t.watch(i,(N,C,z)=>{N&&(!t.unref(h)&&f(N),z(()=>{g&&r(N)}))},{immediate:!0});return d=()=>{r(i.value),E()},{removeEvent:d}}}const je=Object.prototype.toString;function le(e,l){return je.call(e)===`[object ${l}]`}function De(e){return typeof e<"u"}function Ie(e){return!De(e)}function Se(e){return e!==null&&le(e,"Object")}function Me(e){return e==null?!0:H(e)||M(e)?e.length===0:e instanceof Map||e instanceof Set?e.size===0:Se(e)?Object.keys(e).length===0:!1}function Pe(e){return le(e,"Number")}function M(e){return le(e,"String")}function ee(e){return typeof e=="function"}function H(e){return e&&Array.isArray(e)}function Ce(e,l,u=!0){const o=[];for(let a=0;a<e.length;a++){const c={...e[a]};(u?c[l]:!c[l])&&(c.children&&c.children.length&&(c.children=Ce(c.children,l,u)),o.push(c))}return o}function we(e,l="px"){if(!e)return"";if(M(e))return e;if(Pe(e))return`${e}${l}`}const te="element_crud_table_config";let _={};const D=t.ref({});function _e(e,l={}){if(e){e.tableWidthConfig&&(_.tableWidthConfig={..._.tableWidthConfig||{},...e.tableWidthConfig,...l.tableWidthConfig||{}});for(const u in e)u!=="tableWidthConfig"&&(_[u]=e[u])}}function Ue(){_={},D.value={}}function ne(){return _}function qe(e){const l=_.tableWidthConfig||{};return e.map(u=>{const o={...u};return o.width&&isNaN(parseInt(o.width))&&(o.width=l[o.width]||""),o.minWidth&&isNaN(parseInt(o.minWidth))&&(o.minWidth=l[o.minWidth]||""),o})}function Le(){try{const e=JSON.parse(localStorage.getItem(te)||"{}"),l=ne(),u={};for(const o in l){if(o==="tableWidthConfig")continue;const a=l[o],c=e[o],g=typeof a=="function"?a():a;Array.isArray(g)&&(u[o]=g.map((d,h)=>{const i=c==null?void 0:c.find(S=>S.prop===d.prop);return{prop:d.prop,hide:i?!!i.hide:!!d.hide,sort:i?i.sort:h}}))}D.value=u}catch{D.value={}}}function ae(){return Object.keys(D.value).length===0&&Le(),{getTableConfig:o=>{const c=ne()[o];return c?qe(typeof c=="function"?c():c).map(d=>{var i;const h=(i=D.value[o])==null?void 0:i.find(S=>S.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,a)=>{const c=a.map((g,d)=>({prop:g.prop,hide:!!g.hide,sort:d}));D.value[o]=c,ve(g=>{g[o]=c})},resetTableConfig:o=>{const c=ne()[o];if(!c)return;const g=typeof c=="function"?c():c;D.value[o]=g.map((d,h)=>({prop:d.prop,hide:!!d.hide,sort:h})),ve(d=>{d[o]=D.value[o]})}}}function ve(e){try{const l=JSON.parse(localStorage.getItem(te)||"{}");e(l),localStorage.setItem(te,JSON.stringify(l))}catch{}}function We(e){const{getTableConfig:l}=ae();return t.computed(()=>{const u=M(e.columns)?(()=>{const o=l(e.columns);return Me(o)?[]:o})():e.columns;return Ce(u||[],"hide",!1)})}function He(e){return t.computed(()=>({showOverflowTooltip:e.showOverflowTooltip||!1,align:e.align,headerAlign:e.headerAlign}))}function W(e,l){return t.computed(()=>{const u=t.unref(e),o=t.unref(l),a=Se(u)?{...u}:void 0;return a&&(a.slot&&delete a.slot,a.children&&delete a.children),Object.assign({},o,a)})}function Te(){const e=t.shallowRef({});function l(){var s,r;(r=(s=e.value)==null?void 0:s.clearSelection)==null||r.call(s)}const u=()=>{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,E;(E=(f=e.value)==null?void 0:f.toggleRowSelection)==null||E.call(f,s,r)}function a(){var s,r;(r=(s=e.value)==null?void 0:s.toggleAllSelection)==null||r.call(s)}function c(s,r){var f,E;(E=(f=e.value)==null?void 0:f.toggleRowExpansion)==null||E.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 i(){var s,r;(r=(s=e.value)==null?void 0:s.doLayout)==null||r.call(s)}function S(s,r){var f,E;(E=(f=e.value)==null?void 0:f.sort)==null||E.call(f,s,r)}return{table:e,clearSelection:l,getSelectionRows:u,toggleRowSelection:o,toggleAllSelection:a,toggleRowExpansion:c,setCurrentRow:g,clearSort:d,clearFilter:h,doLayout:i,sort:S}}function $e(){const e=t.useSlots(),l={},u={},o={};for(const a in e){const c=e[a];if(/^table-/.test(a)){const g=a.replace("table-","");l[g]=c}(/^search-/.test(a)||/^moreSearch-/.test(a))&&(o[a]=c),/^filter-/.test(a)&&(u[a]=c)}return{tableSlots:l,searchSlots:o,filterSlots:u}}function Ke(e){const l=t.ref(""),u=`#${e}-header`,o=`#${e}-footer`;function a(){var d,h;const c=((d=document.querySelector(o))==null?void 0:d.clientHeight)||0,g=((h=document.querySelector(u))==null?void 0:h.clientHeight)||0;l.value=`calc(100% - ${c+g}px)`}return{tableHeight:l,calcTableHeight:a}}const Je={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}},Ge={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:()=>({})}},U=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 l=t.computed(()=>{if(!e.size&&!e.color&&!e.type)return{};const c=e.color||!e.type?e.color:`var(--el-color-${e.type})`;return{fontSize:Ie(e.size)?void 0:we(e.size),color:c}}),u=t.computed(()=>e.color||!e.type?{color:e.color}:{color:`var(--el-color-${e.type})`}),o=t.computed(()=>/^el-/.test(e.name)),a=t.computed(()=>o.value?j.upperFirst(e.name.replace("el-","")):"#icon-"+e.name);return()=>{if(o.value){const c=Be[a.value];return t.createVNode(y.ElIcon,{size:e.size,color:e.color,class:"el-svg-icon",style:u.value},{default:()=>[c?t.createVNode(c,null,null):null]})}return t.createVNode("svg",{class:"svg-icon","aria-hidden":"true",style:l.value},[t.createVNode("use",{"xlink:href":a.value},null)])}}});function oe(){const e=t.ref(!1);return{visible:e,openDialog:()=>{e.value=!0},closeDialog:()=>{e.value=!1}}}const Qe={title:{type:String,default:"列表显示字段"},type:{type:String,required:!0}},Y=t.defineComponent({name:"MColumnSettings",props:Qe,emits:["update:modelValue","submit"],setup(e,{emit:l,expose:u}){const{setTableConfig:o,getTableConfig:a,resetTableConfig:c}=ae(),{visible:g,openDialog:d,closeDialog:h}=oe(),i=t.ref([]),S=()=>{d(),i.value=JSON.parse(JSON.stringify(a(e.type)||[])).filter(C=>C.label)},s=C=>!r(C.relatedContext.element),r=C=>C.fixed==="left",f=()=>{o(e.type,i.value),l("update:modelValue",i.value),l("submit"),h()},E=()=>{c(e.type),l("submit"),h()},N=C=>{C.hide=!C.hide};return u({init:S}),()=>t.h("div",{class:"m-column-settings"},[t.h(y.ElDrawer,{modelValue:g.value,"onUpdate:modelValue":C=>g.value=C,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(U,{class:"cursor-pointer",name:"el-close",size:16,onClick:h})]),t.h("div",{class:"settings-body"},[t.h(Re,{modelValue:i.value,"onUpdate:modelValue":C=>i.value=C,draggable:".settings-item",filter:".forbid",itemKey:"prop",move:s,handle:".handle"},{item:({element:C})=>t.h("div",{class:"settings-item"},[t.h(U,{class:["handle","cursor-move","mr-2",r(C)?"forbid cursor-not-allowed":""],name:"sortDot",size:20}),t.h(y.ElCheckbox,{checked:!C.hide,disabled:C.disabled,onChange:()=>N(C)},()=>C.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:E},()=>"恢复默认")])})])}}),Ee=t.defineComponent({name:"MTableItem",props:{item:{type:Object,required:!0},size:{type:String,default:void 0}},setup(e,{slots:l}){const{item:u}=t.toRefs(e),o=t.inject("defaultBind"),a=W(u,o),c=t.inject("columns"),g=t.inject("emptyFill");function d(i){const S=t.shallowRef();if(l[u.value.prop+"-header"])return l[u.value.prop+"-header"]({...i,size:e.size});if(u.value.isSetting){const s={right:"flex-end",center:"center",left:"flex-start"};return t.createVNode("div",{style:{display:"flex",alignItems:"center",justifyContent:s[u.value.align||u.value.headerAlign]}},[t.createVNode("span",null,[u.value.label]),t.createVNode(U,{name:u.value.icon||"el-operation",onClick:()=>S.value.init()},null),M(c)?t.createVNode(Y,{ref:S,type:c},null):null])}else return u.value.label}function h(i){var s,r;let S=[];if((r=(s=u.value)==null?void 0:s.children)!=null&&r.length){const f=u.value.children.map(E=>t.h(Ee,{item:E,size:e.size},l));S.push(f)}else l[u.value.prop]?S.push(l[u.value.prop]({...i,size:e.size})):u.value.render?S.push(ee(u.value.render)?u.value.render(i.row,i.$index):String(u.value.render)):S.push(j.get(i.row,u.value.prop,"")??g);return S}return()=>t.createVNode(y.ElTableColumn,a.value,{header:i=>d(i),default:i=>h(i)})}}),re=t.defineComponent({name:"Table",props:Ge,setup(e,{slots:l,expose:u}){const{selection:o,expand:a,index:c,action:g,height:d}=t.toRefs(e),h=y.useAttrs(),i=We(e),S=He(e),s=W(o,S);W(a,S);const r=W(c,S),f=W(g,S),{table:E,clearSelection:N,toggleRowSelection:C,toggleAllSelection:z,toggleRowExpansion:b,setCurrentRow:T,clearSort:V,clearFilter:F,doLayout:n,sort:p,getSelectionRows:v}=Te(),A=G.reactiveOmit(e,"showOverflowTooltip","align","headerAlign");t.provide("defaultBind",S),t.provide("columns",e.columns),t.provide("emptyFill",e.emptyFill),u({clearSelection:N,toggleRowSelection:C,toggleAllSelection:z,toggleRowExpansion:b,setCurrentRow:T,clearSort:V,clearFilter:F,doLayout:n,getSelectionRows:v,sort:p});function B(){let m=[];function P(){const O=t.shallowRef(),k={right:"flex-end",center:"center",left:"flex-start"};return t.createVNode("div",{class:"flex items-center",style:{justifyContent:k[f.value.align||f.value.headerAlign]}},[t.createVNode("span",null,[f.value.label]),t.createVNode(U,{name:f.value.icon||"el-operation",onClick:()=>O.value.init()},null),M(e.columns)?t.createVNode(Y,{ref:O,type:e.columns},null):null])}if(a.value!==!1&&l.expand&&m.push(t.createVNode(y.ElTableColumn,t.mergeProps(bindExpand.value,{type:"expand"}),{default:O=>l.expand&&l.expand(O)})),o.value&&m.push(t.createVNode(y.ElTableColumn,t.mergeProps(s.value,{type:"selection"}),null)),c.value&&m.push(t.createVNode(y.ElTableColumn,t.mergeProps(r.value,{type:"index"}),null)),i.value){const O=i.value.map(k=>t.h(Ee,{item:k,size:e.size},l));m=m.concat(O)}return l.default&&(m=m.concat(l.default())),g.value!==!1&&l.action&&m.push(t.createVNode(y.ElTableColumn,f.value,{default:O=>l.action&&l.action({...O,size:e.size}),header:O=>l["action-header"]?l["action-header"]({...O,size:e.size}):f.value.isSetting?P():t.h("span",{},f.value.label)})),m}return()=>t.createVNode("div",{style:{height:we(d.value)}},[t.createVNode(y.ElTable,t.mergeProps(A,h.value,{ref:E,height:d.value?"100%":null}),{default:()=>B(),append:l.append,empty:l.empty})])}}),Ye={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:()=>({})}},I="value",J="label",Xe=["component","prop","data","render","children","slot","class","initValue","labelName","valueName","all","placeholder","prefixIcon","size","width","type","props"],Q=t.defineComponent({name:"MForm",props:Ye,emits:["update:modelValue","change"],setup(e,{emit:l,slots:u,expose:o}){const{columns:a,modelValue:c,inline:g}=t.toRefs(e),d=t.ref(null),h=t.computed({get:()=>e.modelValue,set:n=>l("update:modelValue",n)});function i(n,p){const v={...h.value};j.set(v,n,p),l("update:modelValue",v),l("change",v)}function S(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 v;(v=d.value)==null||v.validateField(n,p)}function E(n){var p,v;(v=(p=d.value)==null?void 0:p.scrollToField)==null||v.call(p,n)}o({validate:S,resetFields:s,clearValidate:r,validateField:f,scrollToField:E});const N=t.ref({checked:!1,indeterminate:!1});function C(n){var p;if(["cascader","select"].includes(n.component)&&n.all&&!n.multiple){const v=[...n.data??[]],A=M(n.all)?n.all:"全部",B=n.labelName||J;return((p=v==null?void 0:v[0])==null?void 0:p[B])!==A&&v.unshift({[B]:A,[n.valueName||I]:0}),v}return n.data}function z(){l("change",h.value)}function b(n,p){var v;if(n.multiple&&n.all){const A=((v=C(n))==null?void 0:v.length)||0;!p||p.length===0?N.value={checked:!1,indeterminate:!1}:p.length===A?N.value={checked:!0,indeterminate:!1}:N.value={checked:!1,indeterminate:!0}}z()}function T(n,p){p?i(n.prop,(C(n)||[]).map(v=>v[n.valueName||I])):i(n.prop,[]),N.value={checked:!!p,indeterminate:!1}}function V(n,p){const v=j.omit(n,Xe),A=n.width!==void 0?typeof n.width=="number"?`${n.width}px`:String(n.width):void 0,B=A?{width:A}:{};switch(n.component){case"select":{const m=n.labelName||J,P=n.valueName||I,O=C(n);return t.h(y.ElSelect,{...v,modelValue:p,"onUpdate:modelValue":k=>i(n.prop,k),size:n.size,style:B,fitInputWidth:!0,onChange:k=>b(n,k),...n.clearable===void 0?{clearable:!0}:{}},{...n.multiple&&n.all?{header:()=>t.h(y.ElCheckbox,{modelValue:N.value.checked,indeterminate:N.value.indeterminate,onChange:k=>T(n,k)},()=>M(n.all)?n.all:"全部")}:{},default:()=>(O||[]).map(k=>t.h(y.ElOption,{key:k[P],label:k[m],value:k[P],disabled:k.disabled}))})}case"radio":return t.h(y.ElRadioGroup,{...v,modelValue:p,"onUpdate:modelValue":m=>i(n.prop,m),size:n.size,onChange:z},()=>(n.data||[]).map(m=>t.h(y.ElRadio,{key:m[n.valueName||I],label:m[n.valueName||I],disabled:m.disabled},()=>m[n.labelName||J])));case"checkbox":return t.h(y.ElCheckboxGroup,{...v,modelValue:p??[],"onUpdate:modelValue":m=>i(n.prop,m),size:n.size,onChange:z},()=>(n.data||[]).map(m=>t.h(y.ElCheckbox,{key:m[n.valueName||I],label:m[n.valueName||I],disabled:m.disabled},()=>m[n.labelName||J])));case"cascader":return t.h(y.ElCascader,{...v,modelValue:p,"onUpdate:modelValue":m=>i(n.prop,m),options:C(n)||[],props:n.props||{},size:n.size,style:B,clearable:!0,onChange:z});case"treeSelect":return t.h(y.ElTreeSelect,{...v,modelValue:p,"onUpdate:modelValue":m=>i(n.prop,m),data:n.data||[],size:n.size,style:B,onChange:z});case"date":return t.h(y.ElDatePicker,{...v,modelValue:p,"onUpdate:modelValue":m=>i(n.prop,m),type:n.type||"date",size:n.size,style:B,onChange:z});case"inputNumber":return t.h(y.ElInputNumber,{...v,modelValue:p,"onUpdate:modelValue":m=>i(n.prop,m),size:n.size,style:B,onChange:z});case"input":default:return t.h(y.ElInput,{...v,modelValue:p,"onUpdate:modelValue":m=>i(n.prop,m),placeholder:n.placeholder,size:n.size,style:B,clearable:n.clearable===void 0?!0:n.clearable,onKeydown:m=>{m.key==="Enter"&&z()}})}}function F(n){return t.h(y.ElFormItem,{key:n.prop,label:n.label,prop:n.prop},{default:()=>{const p=j.has(h.value,n.prop),v=p?j.get(h.value,n.prop,""):n.initValue!==void 0?n.initValue:"";return u[n.prop]?u[n.prop]({item:n,value:p?j.get(h.value,n.prop):v,setValue:A=>i(n.prop,A)}):V(n,v)}})}return()=>{const n=a.value.map((p,v)=>Array.isArray(p)?p.map(A=>t.h("div",{key:`${A.prop}-${v}`,class:"m-form-item-group"},[F(A)])):F(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,u.default&&u.default()]})}}}),Z=new Map,ue=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:l,expose:u}){const o=t.useSlots(),{visible:a,openDialog:c,closeDialog:g}=oe(),d=t.computed({get:()=>e.modelValue,set:b=>l("update:modelValue",b)}),h=t.computed(()=>e.searchColumns.map((b,T)=>(T>1&&(b.class=b.class?b.class+" hidden-below-2xl":"hidden-below-2xl"),b))),i={},S={};for(const b in o){const T=o[b];if(/^search-/.test(b)){const V=b.replace("search-","");i[V]=T}if(/^moreSearch-/.test(b)){const V=b.replace("moreSearch-","");S[V]=T}}let s;try{s=void 0}catch{}t.onActivated(()=>{s&&Z.has(s)&&(d.value=Z.get(s),l("activated"))}),t.onDeactivated(()=>{s&&Z.set(s,t.unref(d))});const r=()=>{const b={};e.searchColumns&&e.searchColumns.forEach(T=>{H(T)?T.forEach(V=>{b[V.prop]=V.initValue??""}):b[T.prop]=T.initValue??""}),e.moreSearchColumns&&e.moreSearchColumns.forEach(T=>{H(T)?T.forEach(V=>{b[V.prop]=V.initValue??""}):b[T.prop]=T.initValue??""}),d.value=b};function f(){l("search")}function E(){a.value=!1,l("search")}function N(){r(),l("search"),l("reset"),g()}function C(){c(),l("more")}function z(b){l("change",b)}return u({initSearchParams:r}),()=>{var b,T,V;return t.h("div",{class:"m-filter"},[t.h("div",{class:"m-filter-l"},[t.h(Q,{modelValue:d.value,"onUpdate:modelValue":F=>d.value=F,columns:h.value,inline:!0,onChange:z},i),(b=o.default)==null?void 0:b.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:C},()=>"更多筛选"),e.isReset&&t.h(y.ElButton,{onClick:N},()=>"重置")])].filter(Boolean)),t.h("div",{class:"m-filter-r"},[(V=o["menu-right"])==null?void 0:V.call(o)]),e.moreSearchColumns.length>0?t.h(y.ElDialog,{modelValue:a.value,"onUpdate:modelValue":F=>a.value=F,top:"150px",width:"900px",draggable:!0},{header:()=>{var F;return t.h("div",{class:"flex justify-between items-center"},[t.h("span",null,"更多筛选"),(F=o["moreSearch-title-right"])==null?void 0:F.call(o)])},default:()=>t.h(Q,{modelValue:d.value,"onUpdate:modelValue":F=>d.value=F,columns:e.moreSearchColumns,labelWidth:e.labelWidth},S),footer:()=>t.h("div",null,[t.h(y.ElButton,{type:"primary",onClick:E},()=>"确定"),t.h(y.ElButton,{onClick:g},()=>"取消"),t.h(y.ElButton,{onClick:N},()=>"重置")])}):null])}}});Math.easeInOutQuad=function(e,l,u,o){return e/=o/2,e<1?u/2*e*e+l:(e--,-u/2*(e*(e-2)-1)+l)};let Ze=(function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(e){window.setTimeout(e,1e3/60)}})();function et(e){document.documentElement.scrollTop=e,document.body.parentNode.scrollTop=e,document.body.scrollTop=e}function tt(){return document.documentElement.scrollTop||document.body.parentNode.scrollTop||document.body.scrollTop}function ye(e,l,u){const o=tt(),a=e-o,c=20;let g=0;l=typeof l>"u"?500:l;let d=function(){g+=c;let h=Math.easeInOutQuad(g,o,a,l);et(h),g<l&&Ze(d)};d()}const ie=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:l}){const u=y.useAttrs(),o=t.computed(()=>j.pick(u.value,j.keys(y.paginationProps))),a=t.computed(()=>e.simple?"prev, pager, next":e.layout),c=t.computed({get(){return e.page},set(i){l("update:page",i)}}),g=t.computed({get(){return e.limit},set(i){l("update:limit",i)}});function d(i){l("pagination",{page:c.value,limit:i}),e.autoScroll&&ye(0,800)}function h(i){l("pagination",{page:i,limit:g.value}),e.autoScroll&&ye(0,800)}return()=>t.createVNode("div",{class:"m-pagination"},[t.createVNode(y.ElPagination,t.mergeProps(o.value,{currentPage:c.value},{"onUpdate:currentPage":i=>c.value=i},{pageSize:g.value},{"onUpdate:pageSize":i=>g.value=i},{layout:a.value,"page-sizes":e.pageSizes,total:e.total,background:e.background,onSizeChange:d,onCurrentChange:h}),null)])}}),Ne=t.defineComponent({name:"Crud",props:Je,emits:["update:search","reset"],setup(e,{emit:l,expose:u}){const o=t.useAttrs(),a=t.useSlots(),c=t.ref([]),{tableSlots:g,filterSlots:d,searchSlots:h}=$e(),i=`a${Math.floor(Math.random()*1e6)}`,{tableHeight:S,calcTableHeight:s}=Ke(i),r=t.ref(!1),f=t.ref(0),{tableColumns:E,searchColumns:N,moreSearchColumns:C,footerReverse:z}=t.toRefs(e),b=t.ref([]),T=t.ref(1),V=t.ref(e.limit),F=t.ref(e.pageSizes),n=t.ref({});be({el:window,name:"resize",listener:()=>{s()}});const{table:p,clearSelection:v,toggleRowSelection:A,toggleAllSelection:B,toggleRowExpansion:m,setCurrentRow:P,clearSort:O,clearFilter:k,doLayout:Ve,sort:xe}=Te();async function ze(){try{if(ee(e.request)){r.value=!0;const{data:w,success:x,total:K}=await e.request({pageInfo:{page:T.value,limit:V.value},params:n.value});r.value=!1,x?(f.value=K,b.value=w):(b.value=[],f.value=0),t.nextTick(()=>{var L;ee(e.afterRequest)&&((L=e.afterRequest)==null||L.call(e,t.unref(b)))})}else throw new TypeError("Type of the default value for 'request' prop must be a function")}catch(w){throw r.value=!1,w}}const X=()=>{e.searchColumns&&e.searchColumns.forEach(w=>{H(w)?w.forEach(x=>{n.value[x.prop]=x.initValue??""}):n.value[w.prop]=w.initValue??""}),e.moreSearchColumns&&e.moreSearchColumns.forEach(w=>{H(w)?w.forEach(x=>{n.value[x.prop]=x.initValue??""}):n.value[w.prop]=w.initValue??""})},$=G.useDebounceFn(ze,e.debounceTime);t.onMounted(()=>{X(),e.init&&$(),t.nextTick(()=>{s()})});let ce=!0;t.onActivated(()=>{s(),!ce&&b.value.length===0&&$(),ce=!1});const Fe=w=>{c.value=w},q=(w=!1)=>{w&&(T.value=1),$()},Ae=()=>{l("reset"),X(),q(!0)};u({pageTotal:f,initSearchParams:X,refresh:q,search:n,table:p,clearSelection:v,toggleRowSelection:A,toggleAllSelection:B,toggleRowExpansion:m,setCurrentRow:P,clearSort:O,clearFilter:k,doLayout:Ve,sort:xe,data:b,calcTableHeight:s,selectionList:c});const se={};for(const w in g)se[w]=x=>g[w]({row:x==null?void 0:x.row,index:x==null?void 0:x.$index});const de={};["action","action-header","expand","append","empty"].forEach(w=>{a[w]&&(de[w]=x=>a[w]({...x||{},size:void 0}))});const fe={};for(const w in h)fe[w]=()=>h[w]({params:n.value});return()=>{var w,x,K,L,he,pe,ge,me;return t.h("section",{class:"m-crud"},[t.h("div",{id:`${i}-header`,class:"m-crud-header"},[((w=a.header)==null?void 0:w.call(a))||[((x=a["menu-left"])==null?void 0:x.call(a))||t.h("div",{class:"flex items-center"},[(K=a["form-menu-top"])==null?void 0:K.call(a),t.h("div",{class:"flex items-center"},[(L=a["form-menu-left"])==null?void 0:L.call(a),t.h(ue,{modelValue:n.value,"onUpdate:modelValue":R=>n.value=R,searchColumns:N.value,moreSearchColumns:C.value,...o,onSearch:()=>q(!0),onChange:()=>q(!0),onActivated:()=>q(!1),onReset:Ae},{...fe,...d,"form-menu-right":()=>{var R;return(R=a["form-menu-right"])==null?void 0:R.call(a,{search:n.value})},"moreSearch-title-right":()=>{var R;return(R=a["moreSearch-title-right"])==null?void 0:R.call(a)}})])]),t.h("div",{class:"flex-1 flex justify-end"},[(he=a["menu-right"])==null?void 0:he.call(a)])]]),t.h("div",{class:"m-crud-body",style:{height:`calc(100% - ${S.value||"120px"})`}},[((pe=a.table)==null?void 0:pe.call(a,{data:b.value}))||t.withDirectives(t.h(re,{ref:p,height:"100%",columns:E.value,data:b.value,...o,onSelectionChange:R=>Fe(R)},{...de,...se}),[[y.vLoading,r.value]])]),t.h("div",{id:`${i}-footer`,class:["m-crud-footer",z.value?"flex-row-reverse":""]},[((ge=a.footer)==null?void 0:ge.call(a))||[t.h("div",{},[(me=a.batch)==null?void 0:me.call(a,{list:c.value})]),t.h(ie,{style:f.value>0?void 0:{display:"none"},page:T.value,"onUpdate:page":R=>T.value=R,limit:V.value,"onUpdate:limit":R=>V.value=R,pageSizes:F.value,"onUpdate:pageSizes":R=>F.value=R,total:f.value,...o,onPagination:$})]])])}}}),nt=()=>{const e=t.ref(),l=t.computed({get(){var r;return(r=e.value)==null?void 0:r.search},set(r){e.value.search=r}}),u=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}),a=t.computed(()=>{var r;return(r=e.value)==null?void 0:r.selectionList});return{crudRef:r=>{e.value=r},search:l,doLayout:()=>{t.nextTick(()=>{var r;(r=e.value)==null||r.calcTableHeight()})},data:u,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:a,toggleAllSelection:()=>{var r;(r=e.value)==null||r.toggleAllSelection()},toggleRowSelection:(r,f)=>{var E;(E=e.value)==null||E.toggleRowSelection(r,f)}}},lt=[Ne,re,ue,Q,ie,U,Y],at=e=>{lt.forEach(l=>{const u=l.name||l.__name;u&&e.component(u,l)})},ot={install:at};exports.ColumnSettings=Y;exports.Crud=Ne;exports.Filter=ue;exports.Form=Q;exports.Icon=U;exports.Pagination=ie;exports.Table=re;exports.clearTableConfig=Ue;exports.default=ot;exports.registerTableConfig=_e;exports.useCrud=nt;exports.useEventListener=be;exports.useOpenDialog=oe;exports.useTableConfig=ae;
2
+ //# sourceMappingURL=element-crud.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element-crud.cjs.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","install","app","component"],"mappings":"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"}