olp-table 5.3.1 → 5.3.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.
Files changed (171) hide show
  1. package/.env.build +1 -0
  2. package/README.md +26 -0
  3. package/babel.config.js +5 -0
  4. package/jsconfig.json +22 -0
  5. package/{olp-table.common.js → olp-table/olp-table.common.js} +5 -5
  6. package/{olp-table.umd.js → olp-table/olp-table.umd.js} +5 -5
  7. package/{olp-table.umd.min.js → olp-table/olp-table.umd.min.js} +3 -3
  8. package/package.json +92 -12
  9. package/public/favicon.ico +0 -0
  10. package/public/index.html +17 -0
  11. package/rmMode.bat +1 -0
  12. package/src/App.vue +199 -0
  13. package/src/api/crud.js +22 -0
  14. package/src/api/dist.js +6 -0
  15. package/src/assets/iconfont/iconfont.css +20 -0
  16. package/src/assets/iconfont/iconfont.json +16 -0
  17. package/src/assets/iconfont/iconfont.ttf +0 -0
  18. package/src/assets/iconfont/iconfont.woff +0 -0
  19. package/src/assets/iconfont/iconfont.woff2 +0 -0
  20. package/src/assets/logo.png +0 -0
  21. package/src/components/auto-height/index.vue +75 -0
  22. package/src/components/codemirror-tag.vue +100 -0
  23. package/src/components/lazy-load-select.vue +107 -0
  24. package/src/components/ol-dialog-excel.vue +112 -0
  25. package/src/components/ol-dialog-import.vue +304 -0
  26. package/src/components/ol-dialog-json.vue +82 -0
  27. package/src/components/ol-dialog-table.vue +81 -0
  28. package/src/components/ol-dialog-upload-file.vue +208 -0
  29. package/src/components/ol-dict-tag.vue +271 -0
  30. package/src/components/ol-select-dom.vue +71 -0
  31. package/src/components/ol-table-filter.vue +28 -0
  32. package/src/components/ol-table-render.vue +44 -0
  33. package/src/components/ol-table-select.vue +150 -0
  34. package/src/components/pinia-init.vue +18 -0
  35. package/src/components/table/model/ModelMixins.js +43 -0
  36. package/src/components/table/model/model-index.vue +121 -0
  37. package/src/components/table/model/ot-left-right.vue +18 -0
  38. package/src/components/table/model/ot-left-tree-right-table.scss +14 -0
  39. package/src/components/table/model/ot-left-tree-right-table.vue +41 -0
  40. package/src/components/table/model/ot-top-1-bottom-2.vue +39 -0
  41. package/src/components/table/model/ot-top-2-bottom-1.vue +38 -0
  42. package/src/components/table/model/ot-top-2-bottom-2.vue +38 -0
  43. package/src/components/table/model/ot-top-bottom.vue +18 -0
  44. package/src/components/table/model/splitpanesModel.css +22 -0
  45. package/src/components/table/model/splitpanesModel.vue +54 -0
  46. package/src/components/table/ol-form/index.vue +537 -0
  47. package/src/components/table/ol-form-v3/index.vue +455 -0
  48. package/src/components/table/ol-main-form-sub-table/index.vue +601 -0
  49. package/src/components/table/ol-pager/index.vue +46 -0
  50. package/src/components/table/ol-table/components/ol-table-column-config/columnIndex.vue +233 -0
  51. package/src/components/table/ol-table/components/ol-table-column-config/index.vue +145 -0
  52. package/src/components/table/ol-table/components/ol-table-column-dict-color/index.vue +88 -0
  53. package/src/components/table/ol-table/index.vue +232 -0
  54. package/src/components/table/ol-table-operate/index.vue +61 -0
  55. package/src/components/table/ol-table-search/index.vue +17 -0
  56. package/src/components/table/ol-table-tool-btn/index.vue +60 -0
  57. package/src/components/tree/components/o-tree.vue +289 -0
  58. package/src/components/tree/index.vue +46 -0
  59. package/src/components/v-component/index.vue +43 -0
  60. package/src/config/dev-config.js +5 -0
  61. package/src/config/prod-config.js +5 -0
  62. package/src/config/shared-config.js +20 -0
  63. package/src/data.js +9378 -0
  64. package/src/directives/permission/hasPermi.js +63 -0
  65. package/src/directives/permission/hasRole.js +30 -0
  66. package/src/main.js +55 -0
  67. package/src/mixins/VTMixin/DefaultMethods.js +749 -0
  68. package/src/mixins/VTMixin/OTMixinBody.js +105 -0
  69. package/src/mixins/VTMixin/OTMixinBodyFooter.js +93 -0
  70. package/src/mixins/VTMixin/OTMixinBodyMethods.js +420 -0
  71. package/src/mixins/VTMixin/OTMixinColumnMethod.js +450 -0
  72. package/src/mixins/VTMixin/OTMixinInitMethod.js +130 -0
  73. package/src/mixins/VTMixin/OTMixinPager.js +38 -0
  74. package/src/mixins/VTMixin/OTMixinSortable.js +43 -0
  75. package/src/mixins/VTMixin/index.js +18 -0
  76. package/src/package/index.js +20 -0
  77. package/src/plugins/axios.js +61 -0
  78. package/src/store/dict.js +76 -0
  79. package/src/store/dictType.js +52 -0
  80. package/src/store/permi.js +45 -0
  81. package/src/styles/common.scss +37 -0
  82. package/src/styles/index.scss +48 -0
  83. package/src/styles/theme.scss +32 -0
  84. package/src/utils/AESCRUDUtils.js +87 -0
  85. package/src/utils/DateUtils.js +35 -0
  86. package/src/utils/ExcelUtil.js +159 -0
  87. package/src/utils/TableSortUtil.js +91 -0
  88. package/src/utils/columnProp.js +3 -0
  89. package/src/utils/groupCompute.js +68 -0
  90. package/src/utils/http/httpFactory.js +92 -0
  91. package/src/utils/http/httpFactory2.js +79 -0
  92. package/src/utils/http/httpUtil.js +123 -0
  93. package/src/utils/http/httpUtils.js +38 -0
  94. package/src/utils/loadStyle.js +14 -0
  95. package/src/utils/message.js +56 -0
  96. package/src/utils/object.js +80 -0
  97. package/src/utils/security/TokenUtil.js +19 -0
  98. package/src/utils/tree.js +54 -0
  99. package/src/utils/util.js +127 -0
  100. package/src/views/Test/index.vue +77 -0
  101. package/src/views/Test/index2.vue +33 -0
  102. package/src/views/components/btn-config/index.vue +202 -0
  103. package/src/views/components/option-config/index.vue +192 -0
  104. package/src/views/db/chineseToEnglish.vue +127 -0
  105. package/src/views/db/filed.vue +395 -0
  106. package/src/views/db/index.vue +192 -0
  107. package/src/views/db/preview/index.vue +139 -0
  108. package/src/views/db/preview/left.vue +204 -0
  109. package/src/views/db/preview/right.vue +466 -0
  110. package/src/views/groupTable/index.vue +137 -0
  111. package/src/views/groupTable/ol-table-column-config/columnIndex.vue +194 -0
  112. package/src/views/groupTable/ol-table-column-config/index.vue +92 -0
  113. package/src/views/table/add-or-edit/config/base-config/index.vue +539 -0
  114. package/src/views/table/add-or-edit/config/base-config/table-form.vue +333 -0
  115. package/src/views/table/add-or-edit/config/column-config/header-config.vue +475 -0
  116. package/src/views/table/add-or-edit/config/column-config/index.vue +790 -0
  117. package/src/views/table/add-or-edit/config/data/column.js +218 -0
  118. package/src/views/table/add-or-edit/config/data/crud.js +122 -0
  119. package/src/views/table/add-or-edit/config/data/events.js +109 -0
  120. package/src/views/table/add-or-edit/config/data/method.js +127 -0
  121. package/src/views/table/add-or-edit/config/data/option.js +725 -0
  122. package/src/views/table/add-or-edit/config/data/page.js +79 -0
  123. package/src/views/table/add-or-edit/config/field-config/filed-config-table.vue +42 -0
  124. package/src/views/table/add-or-edit/config/field-config/index.vue +91 -0
  125. package/src/views/table/add-or-edit/config/form-config/index.vue +1179 -0
  126. package/src/views/table/add-or-edit/config/index.vue +376 -0
  127. package/src/views/table/add-or-edit/config/initFormObject.js +25 -0
  128. package/src/views/table/add-or-edit/config/script-config/LeftMeun.vue +71 -0
  129. package/src/views/table/add-or-edit/config/script-config/index.vue +70 -0
  130. package/src/views/table/add-or-edit/config/table-config/btn-config.vue +340 -0
  131. package/src/views/table/add-or-edit/config/table-config/btn-sort.vue +132 -0
  132. package/src/views/table/add-or-edit/config/table-config/index.vue +446 -0
  133. package/src/views/table/add-or-edit/configOld/dataTags/filed-config-table-model.vue +41 -0
  134. package/src/views/table/add-or-edit/configOld/dataTags/filed-config.vue +74 -0
  135. package/src/views/table/add-or-edit/configOld/dataTags/index.vue +439 -0
  136. package/src/views/table/add-or-edit/configOld/dataTags/set-table-sql.vue +79 -0
  137. package/src/views/table/add-or-edit/configOld/dataTags/table-on-config.vue +74 -0
  138. package/src/views/table/add-or-edit/configOld/index.vue +127 -0
  139. package/src/views/table/add-or-edit/configOld/tableTags/columnConfig.js +5 -0
  140. package/src/views/table/add-or-edit/configOld/tableTags/index.vue +353 -0
  141. package/src/views/table/add-or-edit/configOld/tableTags/operation-but-config.vue +75 -0
  142. package/src/views/table/add-or-edit/configOld/tableTags/tool-but-config.vue +92 -0
  143. package/src/views/table/add-or-edit/index.vue +201 -0
  144. package/src/views/table/add-or-edit/themeModel/index.vue +53 -0
  145. package/src/views/table/add-or-edit/themeModel/init-model-table.vue +48 -0
  146. package/src/views/table/add-or-edit/themeModel/init-model.vue +81 -0
  147. package/src/views/table/add-or-edit/themeModel/left-right.vue +24 -0
  148. package/src/views/table/add-or-edit/themeModel/left-tree-right-table.vue +75 -0
  149. package/src/views/table/add-or-edit/themeModel/olTableSearchModelMixins.js +42 -0
  150. package/src/views/table/add-or-edit/themeModel/splitpanesThemeModel.vue +49 -0
  151. package/src/views/table/add-or-edit/themeModel/top-1-bottom-2.vue +29 -0
  152. package/src/views/table/add-or-edit/themeModel/top-2-bottom-1.vue +32 -0
  153. package/src/views/table/add-or-edit/themeModel/top-2-bottom-2.vue +32 -0
  154. package/src/views/table/add-or-edit/themeModel/top-bottom.vue +14 -0
  155. package/src/views/table/index.vue +43 -0
  156. package/src/views/table/index2.vue +199 -0
  157. package/src/views/table/preview/index.vue +29 -0
  158. package/src/views/tree/components/config-core-data.vue +85 -0
  159. package/src/views/tree/components/config-core-table.vue +362 -0
  160. package/src/views/tree/components/config-core-tree/data/events.js +95 -0
  161. package/src/views/tree/components/config-core-tree/data/option.js +88 -0
  162. package/src/views/tree/components/config-core-tree/data/prop.js +28 -0
  163. package/src/views/tree/components/config-core-tree/index.vue +181 -0
  164. package/src/views/tree/components/config-core.vue +42 -0
  165. package/src/views/tree/components/form-config/index.vue +967 -0
  166. package/src/views/tree/index.vue +424 -0
  167. package/vue.config.js +44 -0
  168. /package/{demo.html → olp-table/demo.html} +0 -0
  169. /package/{fonts → olp-table/fonts}/iconfont.1720006583309.7e4906d9.woff +0 -0
  170. /package/{fonts → olp-table/fonts}/iconfont.1720006583309.947a27f0.ttf +0 -0
  171. /package/{olp-table.css → olp-table/olp-table.css} +0 -0
@@ -0,0 +1,790 @@
1
+ <template>
2
+ <div>
3
+ <vxe-grid v-if="show" v-bind="gridOptions" ref="vexGridRef"
4
+ :expand-config="{ labelField: 'seq' }"
5
+ resizable>
6
+ <template #toolbar_buttons>
7
+ <el-button @click="onAdd">新增列</el-button>
8
+ <el-button @click="headerConfigShow">多级表头配置</el-button>
9
+ <el-button @click="setGroupByMin">批量设置分组为SUM</el-button>
10
+ </template>
11
+ <template #seq="{ rowIndex}">
12
+ <vxe-button size="mini" style="padding:0" type="text">
13
+ <span class="vxe-icon-sort"/>{{ rowIndex + 1 }}
14
+ </vxe-button>
15
+ </template>
16
+ <template #label_filter="{ column, $panel }">
17
+ <input type="type" v-for="(option, index) in column.filters"
18
+ :key="index"
19
+ v-model="option.data"
20
+ @input="$panel.changeOption($event, !!option.data, option)"
21
+ @keyup.enter="enterFilterEvent({ column, $panel })">
22
+ </template>
23
+ <!-- 通用多选框 -->
24
+ <template #checkedBox_header="{ column }">
25
+ <div style="display: flex;align-items: center;">
26
+ <el-checkbox v-model="column.params.all" @change="headerClick(column)"></el-checkbox>
27
+ <span style="margin-left: 5px;">{{ column.title }} </span>
28
+
29
+ </div>
30
+ </template>
31
+ <template #checkedBox_default="{ column, row }">
32
+ <el-checkbox v-model="row[column.field]" true-value="1" false-value="0"
33
+ @change="checkBoxClick(column, row)"/>
34
+ </template>
35
+ <!-- 通用下拉框 -->
36
+ <template #select_default="{ column, row }">
37
+ <el-select filterable clearable v-model="row[column.field]"
38
+ placeholder="可搜索">
39
+ <el-option
40
+ v-for="item in dictType.val()"
41
+ :key="item.value"
42
+ :label="item.label"
43
+ :value="item.value">
44
+ </el-option>
45
+ </el-select>
46
+ </template>
47
+ <!-- 通用弹窗 -->
48
+ <template #dialog_default="{ column, row }">
49
+ <olCodemirrorTag v-model="row[column.field]" :title="row.title+' - console.log(cellValue, row, column) '"
50
+ size="small">
51
+ <template #toolbar-left>
52
+ <el-button type="primary" @click="row[column.prompt] = !row[column.prompt]">用法提示</el-button>
53
+ </template>
54
+ <template #tip-header>
55
+ <div v-if="row[column.prompt]"
56
+ style="text-align: center;padding: 10px;background-color: #282C34;color: #fff;">
57
+ <h3>格式化显示的内容</h3>
58
+ <p>格式化字符串,以下为实例,当前处于函数中,可直接return</p>
59
+ <p>参数:(({ cellValue, row, column }) => any) | any[] | string</p>
60
+ <p>return cellValue && cellValue >= 18 ? cellValue + '成年人' : cellValue + '未成年'</p>
61
+ </div>
62
+ </template>
63
+ </olCodemirrorTag>
64
+ </template>
65
+ <!-- 展开行 -->
66
+ <!-- <template #content="{ row, rowIndex }">
67
+ <div style="width: 80%;padding:30px 50px 12px;display: flex;">
68
+ <avue-form ref="formRef" :option="option" v-model="row.form"></avue-form>
69
+ </div>
70
+ </template>-->
71
+ <!-- 操作栏 -->
72
+ <template #operate="{ row }">
73
+ <el-button @click="removeRowEvent(row)" type="danger" size="small" circle plain>
74
+ <el-icon>
75
+ <Delete/>
76
+ </el-icon>
77
+ </el-button>
78
+ </template>
79
+ </vxe-grid>
80
+ <HeaderConfig ref="headerConfig" @ok="setGroupColumnData"/>
81
+ </div>
82
+
83
+ </template>
84
+ <script setup>
85
+ import {ref, reactive, defineExpose, onMounted, nextTick, defineEmits, watch, defineProps, inject} from "vue"
86
+ import {Delete} from '@element-plus/icons-vue'
87
+ import VXETable from 'vxe-table'
88
+ import XEUtils from 'xe-utils'
89
+ import Sortable from "sortablejs"
90
+ import {storeDict} from "@/store/dict";
91
+ import {storeDictType} from "@/store/dictType";
92
+ import HeaderConfig from "@/views/table/add-or-edit/config/column-config/header-config.vue";
93
+ import {get} from "@/utils/http/httpUtils";
94
+
95
+ const props = defineProps({
96
+ addVisible: {},
97
+ editVisible: {},
98
+ })
99
+ const show = ref(false)
100
+ const vexGridRef = ref()
101
+ const headerConfig = ref()
102
+ const dict = storeDict();
103
+ const dictType = storeDictType();
104
+
105
+ function setShow(value) {
106
+ nextTick(() => {
107
+ show.value = value;
108
+ updateSort()
109
+ })
110
+ }
111
+
112
+ function setGroupByMin() {
113
+ gridOptions.data.forEach(item => {
114
+ if (item.groupToOtherProp != 1 && !item.groupTotalToOtherProp) {
115
+ item.groupTotalToOtherProp = 'sum'
116
+ }
117
+ })
118
+ }
119
+
120
+ const http = inject('http')
121
+
122
+ dict.init(http)
123
+ dictType.init(http)
124
+
125
+ function headerConfigShow() {
126
+ if (gridOptions.data) {
127
+ let tableConfigId = gridOptions.data[0].parentId;
128
+ get(http, '/online/tableConfigColumn/queryGroupByParentId', {id: tableConfigId}).then(res => {
129
+ headerConfig.value.setColumn(res)
130
+ })
131
+ }
132
+ }
133
+
134
+ watch(props, () => {
135
+ for (let column of gridOptions.columns) {
136
+ if (column.prop == 'addDisplay' || column.field == 'addDisplay') {
137
+ if (!column.visible && props.addVisible) {
138
+ checkBoxAllChange(column.field)
139
+ }
140
+ column.visible = props.addVisible;
141
+ }
142
+ if (column.prop == 'editDisplay' || column.field == 'editDisplay') {
143
+ if (!column.visible && props.editVisible) {
144
+ checkBoxAllChange(column.field)
145
+ }
146
+ column.visible = props.editVisible;
147
+ }
148
+ }
149
+ if (show.value) {
150
+ vexGridRef.value.loadColumn(gridOptions.columns)
151
+ }
152
+ }, {deep: true})
153
+
154
+ const checkBoxAllChange = (field) => {
155
+ emits('checkBoxAll', {
156
+ checkBoxName: field == 'editDisplay' ? 'edit' : 'add',
157
+ isAll: true,
158
+ list: gridOptions.data.filter(row => row[field] == '1')
159
+ })
160
+
161
+ }
162
+ //表头全选框更新
163
+ const headerClick = (column) => {
164
+ if (column.field != 'columnAuth' && column.field == 'visible') {
165
+ let columnField = vexGridRef.value.getColumnByField('columnAuth');
166
+ columnField.params.all = column.params.all
167
+ headerClick(columnField)
168
+ }
169
+
170
+ gridOptions.data.forEach(item => {
171
+ item[column.field] = column.params.all ? '1' : '0'
172
+ })
173
+ if (column.params.all == '0') {
174
+ //全不选的时候
175
+ if (column.field == 'addDisplay') {
176
+ emits("checkBoxAll", {
177
+ checkBoxName: "add",
178
+ isAll: false,
179
+ list: gridOptions.data
180
+ })
181
+ } else if (column.field == 'editDisplay') {
182
+ emits("checkBoxAll", {
183
+ checkBoxName: "edit",
184
+ isAll: false,
185
+ list: gridOptions.data
186
+ })
187
+ }
188
+ } else if (column.params.all == '1') {
189
+ //全选
190
+ if (column.field == 'addDisplay') {
191
+ emits("checkBoxAll", {
192
+ checkBoxName: "add",
193
+ isAll: true,
194
+ list: gridOptions.data
195
+ })
196
+ } else if (column.field == 'editDisplay') {
197
+ emits("checkBoxAll", {
198
+ checkBoxName: "edit",
199
+ isAll: true,
200
+ list: gridOptions.data
201
+ })
202
+ }
203
+ }
204
+ }
205
+ //表格多选框更新
206
+ const checkBoxClick = (column, row) => {
207
+ emits("checkBoxChange", {
208
+ row: row,
209
+ column: column,
210
+ })
211
+ if (column.field != 'columnAuth' && column.field == 'visible') {
212
+ let columnField = vexGridRef.value.getColumnByField('columnAuth');
213
+ row.columnAuth = row.visible
214
+ checkBoxClick(columnField, row)
215
+ }
216
+
217
+ let f = true
218
+ gridOptions.data.forEach(item => {
219
+ if (item[column.field] != '1') {
220
+ f = false
221
+ }
222
+ })
223
+ column.params.all = f
224
+ }
225
+
226
+ //拿到数据
227
+ const setData = (data) => {
228
+ if (!data) {
229
+ return
230
+ }
231
+ gridOptions.data = data
232
+ //查看多选框是否多选
233
+ gridOptions.columns.forEach(item => {
234
+ if (item.slots && item.slots.default == "checkedBox_default") {
235
+ //默认全选状态
236
+ let flag = gridOptions.data.length > 0
237
+ gridOptions.data.forEach(row => {
238
+ if (row[item.field] != "1") {
239
+ //有某个参数没选择则不是全选的状态
240
+ flag = false
241
+ }
242
+ })
243
+ item.params.all = flag
244
+ }
245
+ })
246
+ }
247
+
248
+ //新增新字段
249
+ const onAdd = () => {
250
+ let newBtn = {visible: 0, form: {}, sort: gridOptions.data.length + 1}
251
+ gridOptions.data.push(newBtn)
252
+ vexGridRef.value.loadData(gridOptions.data)
253
+ setTimeout(() => {
254
+ vexGridRef.value.scrollToRow(gridOptions.data[newBtn.sort - 1], null)
255
+ }, 500)
256
+ }
257
+
258
+ //删除数据
259
+ const removeRowEvent = (row) => {
260
+ VXETable.modal.confirm('您确定要删除该数据?')
261
+ .then(() => {
262
+ gridOptions.data = gridOptions.data.filter(item => item._X_ROW_KEY != row._X_ROW_KEY)
263
+ handleCheckBoxClick(row)
264
+ })
265
+ .catch(() => {
266
+ })
267
+ }
268
+
269
+ const handleCheckBoxClick = (row) => {
270
+ for (let column of gridOptions.columns) {
271
+ if (column.field == 'addDisplay' || column.field == 'editDisplay') {
272
+ row.addDisplay = undefined
273
+ row.editDisplay = undefined
274
+ checkBoxClick(column, row)
275
+ }
276
+ }
277
+ }
278
+
279
+ //表更新
280
+ const updateData = (data) => {
281
+ let list = gridOptions.data
282
+ // 字段映射hash表
283
+ let map = {}
284
+ for (let item of list) {
285
+ if (item.visible == 1) {
286
+ item.visible = "1"
287
+ }
288
+ map[item.asName] = item
289
+ }
290
+ gridOptions.data = []
291
+ if (!data) {
292
+ return
293
+ }
294
+ data.forEach((item, index) => {
295
+ if (map[item.prop]) {
296
+ // 存在字段不覆盖
297
+ gridOptions.data.push(map[item.prop])
298
+ return
299
+ }
300
+
301
+ if (!item.column_comment || item.column_comment.toString().trim()) {
302
+ item.column_comment = item.prop
303
+ }
304
+ let data = {
305
+ field: item.prop,
306
+ title: item.column_comment,
307
+ tableField: item.column_name,
308
+ asName: item.prop,
309
+ sort: index,
310
+ visible: "1",
311
+ form: {},
312
+ label: item.column_comment
313
+ }
314
+ //映射表更新返回的字段
315
+ gridOptions.data.push(data)
316
+ })
317
+ // title格式化
318
+ updateTitleAndWidth()
319
+ // 列权限更新
320
+ updateColumnAuth()
321
+ }
322
+ const visible = (item) => {
323
+ return item.visible && '1' == item.visible
324
+ }
325
+ const setAddDisplay = (value) => {
326
+ let data = []
327
+ gridOptions.data.forEach(item => {
328
+ if (visible(item)) {
329
+ item.addDisplay = value
330
+ data.push(item)
331
+ }
332
+ })
333
+ doEmits('add', data)
334
+ }
335
+ const doEmits = (name, data) => {
336
+ emits('checkBoxAll', {
337
+ checkBoxName: name,
338
+ isAll: true,
339
+ list: data
340
+ })
341
+ }
342
+ const setEditDisplay = (value) => {
343
+ let data = []
344
+ gridOptions.data.forEach(item => {
345
+ if (visible(item)) {
346
+ item.editDisplay = value
347
+ data.push(item)
348
+ }
349
+ })
350
+ doEmits('edit', data)
351
+ }
352
+ const updateColumnAuth = () => {
353
+ gridOptions.data.forEach(item => {
354
+ if (item.visible == '0') {
355
+ item.columnAuth = item.visible
356
+ }
357
+ })
358
+ }
359
+ const updateTitleAndWidth = () => {
360
+ gridOptions.data.forEach(item => {
361
+ let index = -1
362
+ if (item.title) {
363
+ item.title = item.title.trim()
364
+ }
365
+ if (item.title && (index = item.title.indexOf(' ')) != -1) {
366
+ item.title = item.title.substring(0, index)
367
+ }
368
+ if (item.title && (index = item.title.indexOf('(')) >= 1) {
369
+ item.title = item.title.substring(0, index)
370
+ }
371
+ if (item.title && (index = item.title.lastIndexOf('(')) >= 1) {
372
+ item.title = item.title.substring(0, index)
373
+ }
374
+ })
375
+ }
376
+
377
+ //表格配置项
378
+ const gridOptions = reactive({
379
+ scrollX: {enabled: true, gt: 1},
380
+ scrollY: {enabled: true, gt: 1},
381
+ border: true,
382
+ showHeaderOverflow: true,
383
+ showOverflow: true,
384
+ height: 620,
385
+ align: "center",
386
+ size: 'mini',
387
+ rowConfig: {isHover: true, isCurrent: true},
388
+ editConfig: {
389
+ trigger: 'click',
390
+ mode: 'cell'
391
+ },
392
+ toolbarConfig: {
393
+ custom: true,
394
+ zoom: true,
395
+ slots: {
396
+ buttons: 'toolbar_buttons'
397
+ },
398
+ perfect: true,
399
+ },
400
+ columns: [
401
+ /* {
402
+ type: "expand",
403
+ title: "其他属性",
404
+ width: 80,
405
+ fixed: "left",
406
+ slots: {
407
+ content: 'content',
408
+ },
409
+ },*/
410
+ {
411
+ type: "seq",
412
+ width: 60,
413
+ title: "序号",
414
+ slots: {
415
+ default: 'seq'
416
+ },
417
+ },
418
+ {
419
+ title: '字段',
420
+ field: 'field',
421
+ fixed: 'left',
422
+ width: 200,
423
+ editRender: {props: {clearable: true}, name: '$input'},
424
+ filters: [{data: ''}],
425
+ filterMethod({option, row, column}) {
426
+ if (option.data) {
427
+ return XEUtils.toValueString(row[column.field]).toLowerCase().indexOf(option.data) > -1
428
+ }
429
+ return true
430
+ },
431
+ slots: {filter: 'label_filter'}
432
+ },
433
+ {
434
+ title: '字段描述',
435
+ field: 'label',
436
+ fixed: 'left',
437
+ width: 200,
438
+ filters: [{data: ''}],
439
+ filterMethod({option, row, column}) {
440
+ if (option.data) {
441
+ return XEUtils.toValueString(row[column.field]).toLowerCase().indexOf(option.data) > -1
442
+ }
443
+ return true
444
+ },
445
+ slots: {filter: 'label_filter'}
446
+ }, {
447
+ title: '标题',
448
+ field: 'title',
449
+ width: 200,
450
+ editRender: {props: {clearable: true}, name: '$input'},
451
+ filters: [{data: ''}],
452
+ filterMethod({option, row, column}) {
453
+ if (option.data) {
454
+ return XEUtils.toValueString(row[column.field]).toLowerCase().indexOf(option.data) > -1
455
+ }
456
+ return true
457
+ },
458
+ slots: {filter: 'label_filter'}
459
+ },
460
+ {
461
+ title: '显示',
462
+ field: 'visible',
463
+ align: 'center',
464
+ width: 80,
465
+ params: {
466
+ all: null
467
+ },
468
+ slots: {
469
+ header: 'checkedBox_header',
470
+ default: 'checkedBox_default'
471
+ },
472
+ },
473
+ {
474
+ title: '新增',
475
+ field: 'addDisplay',
476
+ align: 'center',
477
+ visible: props.addVisible,
478
+ params: {
479
+ all: 1
480
+ },
481
+ width: 80,
482
+ slots: {
483
+ header: 'checkedBox_header',
484
+ default: 'checkedBox_default'
485
+ }
486
+ }, {
487
+ title: '编辑',
488
+ field: 'editDisplay',
489
+ align: 'center',
490
+ width: 80,
491
+ visible: props.editVisible,
492
+ params: {
493
+ all: 0
494
+ },
495
+ slots: {
496
+ header: 'checkedBox_header',
497
+ default: 'checkedBox_default'
498
+ }
499
+ },
500
+ {
501
+ title: '不保存',
502
+ field: 'tableSaveToOtherProp',
503
+ width: 100,
504
+ params: {
505
+ all: 0
506
+ },
507
+ slots: {
508
+ default: 'checkedBox_default'
509
+ }
510
+ }, {
511
+ title: '排序',
512
+ field: 'sortable',
513
+ align: 'center',
514
+ width: 100,
515
+ params: {
516
+ all: 0,
517
+ dictCode: 'order_by_type'
518
+ },
519
+ editRender: {props: {clearable: true, filterable: true}, name: '$select', options: dict.val('order_by_type')},
520
+ },
521
+ {
522
+ title: '数据字典',
523
+ field: 'dictCode',
524
+ params: {
525
+ dictCode: 'dictCode'
526
+ },
527
+ width: 200,
528
+ editRender: {props: {clearable: true, filterable: true}, name: '$select', options: dictType.val()}
529
+ // editRender: {props: {clearable: true, filterable: true}, name: 'input', options: dictType.val()}
530
+ }, {
531
+ title: '搜索类型',
532
+ field: 'selectType',
533
+ params: {
534
+ dictCode: 'select_type'
535
+ },
536
+ width: 120,
537
+ editRender: {props: {clearable: true, filterable: true}, name: '$select', options: dict.val('select_type')},
538
+ },
539
+ {
540
+ title: '控件类型',
541
+ field: 'selectDom',
542
+ /*params: {
543
+ dictCode: 'select_dom'
544
+ },*/
545
+ width: 180,
546
+ editRender: {props: {clearable: true, filterable: true}, name: '$select', options: dict.val('select_dom')}
547
+ /*slots: {
548
+ default: 'select_default'
549
+ },*/
550
+ },
551
+ {
552
+ title: '固定',
553
+ field: 'fixed',
554
+ params: {
555
+ dictCode: 'table_fixed'
556
+ },
557
+ editRender: {props: {clearable: true}, name: '$select', options: dict.val('table_fixed')},
558
+ width: 80,
559
+ },
560
+ {
561
+ title: '合计',
562
+ field: 'totalToOtherProp',
563
+ width: 100,
564
+ params: {
565
+ all: null
566
+ },
567
+ editRender: {
568
+ props: {clearable: true, filterable: true},
569
+ name: '$select',
570
+ options: dict.val('online_calculation_type')
571
+ }
572
+ },
573
+ {
574
+ title: '分组',
575
+ field: 'groupToOtherProp',
576
+ width: 100,
577
+ params: {
578
+ all: null
579
+ },
580
+ slots: {
581
+ default: 'checkedBox_default'
582
+ }
583
+ },
584
+ {
585
+ title: '分组合计',
586
+ field: 'groupTotalToOtherProp',
587
+ width: 100,
588
+ editRender: {
589
+ props: {clearable: true, filterable: true},
590
+ name: '$select',
591
+ options: dict.val('online_calculation_type')
592
+ }
593
+ },
594
+ {
595
+ title: '行合并',
596
+ field: 'mergeFlag',
597
+ width: 100,
598
+ params: {
599
+ all: null
600
+ },
601
+ slots: {
602
+ header: 'checkedBox_header',
603
+ default: 'checkedBox_default'
604
+ },
605
+ },
606
+ {
607
+ title: '可列配置',
608
+ field: 'columnAuth',
609
+ align: 'center',
610
+ width: 80,
611
+ params: {
612
+ all: null
613
+ },
614
+ slots: {
615
+ header: 'checkedBox_header',
616
+ default: 'checkedBox_default'
617
+ },
618
+ },
619
+ {
620
+ title: '对齐',
621
+ field: 'align',
622
+ params: {
623
+ dictCode: 'align'
624
+ },
625
+ editRender: {props: {clearable: true}, name: '$select', options: dict.val('align')},
626
+ width: 80,
627
+ },
628
+ {
629
+ title: '列宽',
630
+ width: 80,
631
+ field: 'width',
632
+ editRender: {props: {clearable: true}, name: '$input'},
633
+ },
634
+ {
635
+ title: '列宽拖动',
636
+ field: 'resizable',
637
+ width: 80,
638
+ params: {
639
+ all: null
640
+ },
641
+ slots: {
642
+ header: 'checkedBox_header',
643
+ default: 'checkedBox_default'
644
+ },
645
+ },
646
+ {
647
+ title: 'formatter',
648
+ field: 'formatter',
649
+ width: 168,
650
+ slots: {
651
+ default: 'dialog_default'
652
+ }
653
+ }, {
654
+ title: '搜索顺序',
655
+ field: 'searchSort',
656
+ width: 100,
657
+ editRender: {name: '$input', props: {type: 'number'}},
658
+ },
659
+ {
660
+ title: '搜索默认值',
661
+ field: 'valueSEARCHToOtherProp',
662
+ width: 100,
663
+ editRender: {name: '$input'},
664
+ },
665
+ {
666
+ title: '不可清空',
667
+ field: 'clearableSEARCHToOtherProp',
668
+ width: 100,
669
+ params: {},
670
+ slots: {
671
+ default: 'checkedBox_default'
672
+ }
673
+ },
674
+ {
675
+ title: '时间',
676
+ field: 'toDateSEARCHToOtherProp',
677
+ width: 80,
678
+ params: {},
679
+ slots: {
680
+ default: 'checkedBox_default'
681
+ }
682
+ },
683
+ {
684
+ title: '搜索span',
685
+ field: 'spanSEARCHToOtherProp',
686
+ width: 110,
687
+ editRender: {name: '$input', props: {clearable: true, min: 2, max: 24, type: 'number'},},
688
+ },
689
+ {
690
+ title: '搜索label',
691
+ field: 'titleSEARCHToOtherProp',
692
+ width: 120,
693
+ editRender: {name: '$input', props: {clearable: true}}
694
+ },
695
+ {
696
+ title: '搜索别名',
697
+ field: 'tableNameSEARCHToOtherProp',
698
+ width: 100,
699
+ editRender: {name: '$input', props: {clearable: true}}
700
+ },
701
+ {
702
+ title: '操作',
703
+ width: 100,
704
+ fixed: 'right',
705
+ align: 'center',
706
+ slots: {
707
+ default: 'operate'
708
+ }
709
+ }
710
+ ],
711
+ data: [],
712
+ groupColumns: [],
713
+ })
714
+ //表格拖动更新
715
+ const updateSort = () => {
716
+ nextTick(() => {
717
+ if (!vexGridRef.value) {
718
+ return
719
+ }
720
+ //el绑定元素需要找到vxe的DOM下的tbody元素
721
+ Sortable.create(vexGridRef.value.$el.querySelector('.body--wrapper>.vxe-table--body tbody'), {
722
+ animation: 200,//拖拽动画过渡时间
723
+ sort: true,
724
+ handle: '.col--seq', //必须设置该属性,属性值为你要拖动的该单元格的样式名
725
+ // 元素被选中
726
+ onStart: function (/**Event*/evt) {
727
+ //关闭所有展开行
728
+ vexGridRef.value.clearRowExpand()
729
+ evt.oldIndex // element index within parent
730
+ },
731
+ // 结束拖拽
732
+ onEnd: function (/**Event*/{oldIndex, newIndex, item}) {
733
+ //evt.to; // 目标列表
734
+ //evt.from; // 来自以前的列表
735
+ //evt.oldIndex; // 元素在旧父元素中的旧索引
736
+ //evt.newIndex; // 元素在新父元素中的新索引
737
+ //evt.clone // 克隆元素
738
+ //evt.pullMode; // 当项在另一个可排序中时:"clone"(克隆),"true"(移动)
739
+ let rowNode = vexGridRef.value.getRowNode(item);
740
+ newIndex = rowNode.index - oldIndex + newIndex
741
+
742
+ const list = JSON.parse(JSON.stringify(gridOptions.data)) //保存旧数据
743
+ const targetRow = list.splice(rowNode.index, 1)[0] //保存移动的元素并删除原列表中移动的元素
744
+ list.splice(newIndex, 0, targetRow) //插入到目标新索引中
745
+ const newsArr = JSON.parse(JSON.stringify(list)) //重新赋值数组
746
+ //将新数据重新排序
747
+ for (let i = 0; i < newsArr.length; i++) {
748
+ newsArr[i].sort = i + 1
749
+ }
750
+ gridOptions.data = newsArr
751
+ },
752
+ })
753
+ })
754
+ }
755
+
756
+ onMounted(() => {
757
+ updateSort()
758
+ })
759
+ const enterFilterEvent = ({$panel}) => {
760
+ $panel.confirmFilter()
761
+ }
762
+
763
+ // 子组件调用父组件
764
+ const emits = defineEmits(['checkBoxChange']) //声明 emits
765
+ function getColumns() {
766
+ return gridOptions.data
767
+ }
768
+
769
+ function getGroupColumnData() {
770
+ return gridOptions.groupColumns
771
+ }
772
+
773
+ function setGroupColumnData(value) {
774
+ gridOptions.groupColumns = value.groupColumns
775
+ }
776
+
777
+ // 对外暴露
778
+ defineExpose({
779
+ setData, updateData, gridOptions, vexGridRef, getColumns, setAddDisplay, setEditDisplay, setShow, getGroupColumnData
780
+ })
781
+ </script>
782
+ <style>
783
+ .expand-wrapper {
784
+ padding: 20px;
785
+ }
786
+
787
+ .test {
788
+ padding: 80px;
789
+ }
790
+ </style>