@idooel/components 0.0.1-beta.99 → 0.0.2

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 (105) hide show
  1. package/README.md +98 -98
  2. package/dist/@idooel/components.esm.js +256 -159
  3. package/dist/@idooel/components.umd.js +256 -159
  4. package/jsconfig.json +7 -7
  5. package/package.json +50 -50
  6. package/packages/alert/index.js +4 -4
  7. package/packages/alert/src/index.vue +45 -45
  8. package/packages/batch-export/index.js +4 -4
  9. package/packages/batch-export/src/index.vue +104 -104
  10. package/packages/business-components/modal-fsm/index.js +4 -4
  11. package/packages/business-components/modal-fsm/src/index.vue +163 -163
  12. package/packages/business-components/modal-import/index.js +4 -4
  13. package/packages/business-components/modal-import/src/index.vue +139 -139
  14. package/packages/business-components/modal-timeline/index.js +4 -4
  15. package/packages/business-components/modal-timeline/src/index.vue +77 -77
  16. package/packages/business-components/tabs-sub-center/index.js +4 -4
  17. package/packages/business-components/tabs-sub-center/src/index.vue +116 -116
  18. package/packages/button/index.js +4 -4
  19. package/packages/button/src/index.vue +65 -65
  20. package/packages/checkbox/index.js +4 -4
  21. package/packages/checkbox/src/index.vue +52 -52
  22. package/packages/composite-components/button-group/index.js +4 -4
  23. package/packages/composite-components/button-group/src/index.vue +151 -151
  24. package/packages/composite-components/form-attachment/src/index.vue +14 -14
  25. package/packages/composite-components/form-img-crop/index.js +4 -4
  26. package/packages/composite-components/form-img-crop/src/index.vue +120 -111
  27. package/packages/composite-components/modal-confirm/index.js +4 -4
  28. package/packages/composite-components/modal-confirm/src/index.vue +103 -103
  29. package/packages/composite-components/modal-form/index.js +4 -4
  30. package/packages/composite-components/modal-form/src/index.vue +230 -223
  31. package/packages/composite-components/modal-img-crop/index.js +4 -4
  32. package/packages/composite-components/modal-img-crop/src/index.vue +298 -289
  33. package/packages/composite-components/modal-table/index.js +4 -4
  34. package/packages/composite-components/modal-table/src/index.vue +155 -155
  35. package/packages/composite-components/modal-tree/index.js +4 -4
  36. package/packages/composite-components/modal-tree/src/index.vue +75 -75
  37. package/packages/composite-components/search-area/index.js +4 -4
  38. package/packages/composite-components/search-area/src/index.vue +237 -237
  39. package/packages/composite-components/search-area/src/label.vue +35 -35
  40. package/packages/composite-components/select-entity-modal-table/index.js +4 -4
  41. package/packages/composite-components/select-entity-modal-table/src/index.vue +171 -168
  42. package/packages/date/index.js +4 -4
  43. package/packages/date/src/index.vue +112 -112
  44. package/packages/date-range/index.js +4 -4
  45. package/packages/date-range/src/index.vue +47 -47
  46. package/packages/form/index.js +4 -4
  47. package/packages/form/src/index.vue +318 -302
  48. package/packages/icon/index.js +4 -4
  49. package/packages/icon/src/index.vue +31 -31
  50. package/packages/index.js +153 -153
  51. package/packages/input/index.js +4 -4
  52. package/packages/input/src/index.vue +35 -35
  53. package/packages/input-number/index.js +4 -4
  54. package/packages/input-number/src/index.vue +23 -23
  55. package/packages/loading/index.js +4 -4
  56. package/packages/loading/src/index.vue +36 -36
  57. package/packages/modal/index.js +4 -4
  58. package/packages/modal/src/index.vue +184 -184
  59. package/packages/models/form-group-model/index.js +4 -4
  60. package/packages/models/form-group-model/src/index.vue +273 -273
  61. package/packages/models/form-model/index.js +4 -4
  62. package/packages/models/form-model/src/index.vue +232 -221
  63. package/packages/models/step-model/index.js +4 -4
  64. package/packages/models/step-model/src/index.vue +224 -224
  65. package/packages/models/tree-table-model/index.js +4 -4
  66. package/packages/models/tree-table-model/src/index.vue +689 -681
  67. package/packages/radio/index.js +4 -4
  68. package/packages/radio/src/index.vue +56 -56
  69. package/packages/select/index.js +4 -4
  70. package/packages/select/src/index.vue +105 -105
  71. package/packages/select-entity/index.js +4 -4
  72. package/packages/select-entity/src/index.vue +119 -119
  73. package/packages/table/index.js +4 -4
  74. package/packages/table/src/action.vue +172 -172
  75. package/packages/table/src/index.vue +289 -335
  76. package/packages/tabs/index.js +4 -4
  77. package/packages/tabs/src/index.vue +55 -55
  78. package/packages/text/index.js +4 -4
  79. package/packages/text/src/index.vue +47 -47
  80. package/packages/text-editor/index.js +4 -4
  81. package/packages/text-editor/src/index.vue +72 -72
  82. package/packages/textarea/index.js +4 -4
  83. package/packages/textarea/src/index.vue +57 -57
  84. package/packages/theme/form.scss +21 -21
  85. package/packages/theme/index.scss +42 -42
  86. package/packages/theme/overrid.scss +7 -7
  87. package/packages/theme/styleClass.scss +2 -2
  88. package/packages/theme/variables.scss +55 -55
  89. package/packages/timeline/index.js +4 -4
  90. package/packages/timeline/src/index.vue +257 -257
  91. package/packages/tpl/index.js +4 -4
  92. package/packages/tpl/src/index.vue +55 -55
  93. package/packages/tree/index.js +4 -4
  94. package/packages/tree/src/TreeNode.vue +29 -29
  95. package/packages/tree/src/index.vue +101 -101
  96. package/packages/tree-select/index.js +4 -4
  97. package/packages/tree-select/src/index.vue +142 -142
  98. package/packages/upload/index.js +4 -4
  99. package/packages/upload/src/index.vue +444 -444
  100. package/packages/utils/index.js +62 -62
  101. package/scripts/rollup.config.js +42 -42
  102. package/scripts/rollup.esm.config.js +11 -11
  103. package/scripts/rollup.umd.config.js +14 -14
  104. package/dist/@idooel/components.esm.js.map +0 -1
  105. package/dist/@idooel/components.umd.js.map +0 -1
@@ -1,681 +1,689 @@
1
- <template>
2
- <section class="ele model__tree-table">
3
- <section class="model__tree-table--container" v-if="showTree">
4
- <div class="model__tree--title"></div>
5
- <section :ref="modelTreeWrapper" class="model__tree--wrapper" :style="{height: `${treeWrapperHeight}px`}">
6
- <ele-tree
7
- :tree-data="treeData"
8
- :defaultExpandedKeys="defaultExpandedKeys"
9
- :defaultSelectedKeys="defaultSelectedKeys"
10
- @select="selectTreeNode"
11
- :replace-fields="mapFields">
12
- </ele-tree>
13
- </section>
14
- </section>
15
- <section class="model__table--container" :ref="modelTableContainerRef">
16
- <div class="model__table--title" v-if="title">
17
- <template v-if="titleMode">
18
- <div :class="[`model__table-title--${titleMode}`]"></div>
19
- </template>
20
- <template v-else>
21
- <div class="model__table-title--text">{{ title }}</div>
22
- </template>
23
- </div>
24
- <section :ref="modelTableWrapper" class="model__table--wrapper">
25
- <ele-search-area :ref="searchArea" @search="onSearch" :data-source="searchMeta.elements"></ele-search-area>
26
- <div class="button-row__area">
27
- <ele-button-group class="model-table__button-group" v-on="overrideButtonGroupEvent" :ref="buttonGroup" @click="handleClickButtonGroup" :data-source="getButtonGroupElements"></ele-button-group>
28
- <slot name="tags"></slot>
29
- <slot v-if="$slots['sub-center']" name="sub-center"></slot>
30
- </div>
31
- <ele-table
32
- v-on="overrideTableEvent"
33
- :ref="tableRef"
34
- :row-selection="rowSelection"
35
- :loading="loading"
36
- :columns="columns"
37
- :total="total"
38
- :x="x"
39
- :y="y"
40
- :bordered="setBorder"
41
- :height="tableHeight"
42
- :width="tableWidth"
43
- :actions="actions"
44
- :pageSize="pageSize"
45
- :pageSizeOptions="pageSizeOptions"
46
- :data-source="tableData"
47
- @change-page="onChangePage"
48
- ></ele-table>
49
- </section>
50
- </section>
51
- <ele-modal-form v-model="modalFormValue" v-on="overrideModalFormEvent" :meta="modalFormMeta"></ele-modal-form>
52
- <ele-modal-fsm v-model="showFsmModal" :contextProp="fsmContextProp" :meta="fsmMeta" @cancel="handleCloseFsmModal"></ele-modal-fsm>
53
- <ele-modal-table
54
- :meta="modalTableMeta"
55
- v-model="modalTableValue"
56
- v-on="overrideModalTableEvent"
57
- ></ele-modal-table>
58
- </section>
59
- </template>
60
-
61
- <script>
62
- import { type, net, util } from '@idooel/shared'
63
- import { v4 as uuidv4 } from 'uuid'
64
- import { BUILT_IN_EVENT_NAMES, RESERVE_EVENT_NAMES, parseFieldMap, BUILT_IN_TRIGGER, CONTEXT } from '../../../utils'
65
- export default {
66
- name: 'ele-tree-table-model',
67
- props: {
68
- title: {
69
- type: [Object, String]
70
- },
71
- overHeight: {
72
- type: Number,
73
- default: 0
74
- },
75
- treeMeta: {
76
- type: Object,
77
- default: () => ({})
78
- },
79
- searchMeta: {
80
- type: Object,
81
- default: () => ({})
82
- },
83
- buttonGroupMeta: {
84
- typeof: Object,
85
- default: () => ({})
86
- },
87
- tableMeta: {
88
- type: Object,
89
- default: () => ({})
90
- },
91
- createMeta: {
92
- type: Object
93
- },
94
- editMeta: {
95
- type: Object
96
- }
97
- },
98
- provide () {
99
- return {
100
- requestTreeData: this.requestTreeData,
101
- requestTableData: this.requestTableData,
102
- [CONTEXT]: () => {
103
- return {
104
- exposed: this.exposed
105
- }
106
- }
107
- }
108
- },
109
- data () {
110
- return {
111
- tableHeight: 0,
112
- tableWidth: 0,
113
- modalFormMeta: {},
114
- modalFormValue: false,
115
- treeData: [],
116
- tableData: [],
117
- defaultExpandedKeys: [],
118
- defaultSelectedKeys: [],
119
- replaceFields: {
120
- title: 'title',
121
- children: 'children',
122
- key: 'id'
123
- },
124
- loading: false,
125
- total: 0,
126
- tableQuerys: {},
127
- resizeObserverModelTableWrapper: null,
128
- modelTableWrapperHeight: 0,
129
- currentTreeNodeData: {},
130
- currentRowData: {},
131
- treeWrapperHeight: 0,
132
- currentTableSelection: this.currentTableMode == 'radio' ? {} : [],
133
- showFsmModal: false,
134
- fsmMeta: {},
135
- fsmContextProp: {},
136
- modalTableValue: false,
137
- modalTableMeta: {}
138
- }
139
- },
140
- computed: {
141
- setBorder () {
142
- return this.tableMeta.bordered === false ? false : true
143
- },
144
- rowSelection () {
145
- if (!this.currentTableMode) return void 0
146
- return {
147
- columnTitle: this.currentSelectionColumn.columnTitle,
148
- fixed: true,
149
- type: this.currentTableMode,
150
- onChange: this.onChangeTableSelection
151
- }
152
- },
153
- currentSelectionColumn () {
154
- const { multiple } = this.tableMeta
155
- const target = this.columns.find(item => Object.keys(item).includes('multiple'))
156
- const isGlobalExistMultiple = Object.keys(this.tableMeta).includes('multiple')
157
- if (target) {
158
- return target
159
- } else if (isGlobalExistMultiple) {
160
- return { multiple }
161
- }
162
- return void 0
163
- },
164
- x () {
165
- const { x } = this.tableMeta
166
- return x
167
- },
168
- y () {
169
- const { y } = this.tableMeta
170
- return y
171
- },
172
- currentTableMode () {
173
- if (!this.currentSelectionColumn) return void 0
174
- const { multiple } = this.currentSelectionColumn
175
- if (type.isBool(multiple)) {
176
- if (multiple) {
177
- return 'checkbox'
178
- } else {
179
- return 'radio'
180
- }
181
- } else {
182
- return void 0
183
- }
184
- },
185
- modelTableContainerRef () {
186
- return uuidv4()
187
- },
188
- titleMode () {
189
- if (type.isObject(this.title)) {
190
- const { mode = '' } = this.title
191
- return mode
192
- }
193
- return void 0
194
- },
195
- tableRef () {
196
- return uuidv4()
197
- },
198
- exposed () {
199
- return {
200
- showModalForm: this.showModalForm,
201
- closeModalForm: this.closeModalForm,
202
- showModalTable: this.showModalTable,
203
- closeModalTable: this.closeModalTable,
204
- currentTableSelection: this.currentTableSelection,
205
- currentTreeNode: this.currentTreeNodeData,
206
- requestTableData: this.requestTableData,
207
- querys: this.tableQuerys,
208
- currentRowData: this.currentRowData,
209
- getCurrentRowData: this.getCurrentRowData,
210
- setCurrentRowData: this.setCurrentRowData,
211
- setCurrentTableSelection: this.setCurrentTableSelection,
212
- getCurrentTableSelection: this.getCurrentTableSelection,
213
- cleanCurrentModelEffect: this.cleanCurrentModelEffect,
214
- route: this.$route,
215
- _route: this.$route.query,
216
- _routeMeta: this.$route.meta
217
- }
218
- },
219
- overrideTableEvent () {
220
- const events = this.actions.reduce((ret, action) => {
221
- ret[action.eventName || action.key] = (e) => {
222
- this.setCurrentRowData(e.exposed.currentRowData)
223
- const { target } = action
224
- const targetMeta = this.findMetaByKey(target)
225
- const { mode } = targetMeta
226
- mode && this.dispatchTrigger({ mode, record: e.exposed.currentRowData, modeMeta: targetMeta })
227
- this.$emit(action.eventName || action.key, { ...e, currentTreeNode: this.currentTreeNodeData, exposed: { ...this.exposed, ...e.exposed } })
228
- }
229
- return ret
230
- }, {})
231
- return {
232
- ...this.$listeners,
233
- ...events,
234
- [BUILT_IN_EVENT_NAMES.EDIT]: this[BUILT_IN_EVENT_NAMES.EDIT],
235
- [BUILT_IN_EVENT_NAMES.SUBMIT]: this[BUILT_IN_EVENT_NAMES.SUBMIT]
236
- }
237
- },
238
- overrideModalFormEvent () {
239
- const { footerMeta } = this.modalFormMeta
240
- const { elements = [] } = footerMeta || {}
241
- const eles = type.isFunction(elements) ? elements.call(this) : elements
242
- const events = eles.reduce((ret, ele) => {
243
- ret[ele.eventName] = (e = {}) => {
244
- if (ele.eventName === 'cancel') {
245
- this.closeModalForm()
246
- } else {
247
- const { exposed = {} } = e
248
- this.$emit(`${ele.eventName || ele.key}`, { ...e, currentTreeNode: this.currentTreeNodeData, exposed: Object.assign({}, exposed )})
249
- }
250
- }
251
- return ret
252
- }, {})
253
- return {
254
- ...events
255
- }
256
- },
257
- overrideModalTableEvent () {
258
- const { footerMeta } = this.modalTableMeta
259
- const { elements = [] } = footerMeta || {}
260
- const eles = type.isFunction(elements) ? elements.call(this) : elements
261
- const events = eles.reduce((ret, ele) => {
262
- ret[ele.eventName] = (e = {}) => {
263
- if (ele.eventName === 'cancel') {
264
- this.closeModalTable()
265
- } else {
266
- const { exposed = {} } = e
267
- this.$emit(`${ele.eventName || ele.key}`, { ...e, currentTreeNode: this.currentTreeNodeData, exposed: Object.assign({}, exposed )})
268
- }
269
- }
270
- return ret
271
- }, {})
272
- return {
273
- ...events,
274
- exposed: this.exposed
275
- }
276
- },
277
- overrideButtonGroupEvent () {
278
- const events = this.getButtonGroupElements.reduce((ret, ele) => {
279
- ret[ele.eventName] = (e) => {
280
- this.$emit(ele.eventName || 'click', { ...e, currentTreeNode: this.currentTreeNodeData, exposed: Object.assign({}, e.exposed || {}, this.exposed)})
281
- }
282
- return ret
283
- }, {})
284
- return {
285
- ...this.$listeners,
286
- ...events,
287
- [BUILT_IN_EVENT_NAMES.CREATE]: this[BUILT_IN_EVENT_NAMES.CREATE],
288
- exposed: this.exposed
289
- }
290
- },
291
- showTree () {
292
- return !!Object.keys(this.treeMeta).length
293
- },
294
- buttonGroup () {
295
- return uuidv4()
296
- },
297
- searchArea () {
298
- return uuidv4()
299
- },
300
- modelTreeWrapper () {
301
- return uuidv4()
302
- },
303
- modelTableWrapper () {
304
- return uuidv4()
305
- },
306
- actions () {
307
- const { operations } = this.tableMeta
308
- if (operations) {
309
- return operations.elements
310
- } else {
311
- return []
312
- }
313
- },
314
- pageSize () {
315
- const { page = {} } = this.tableMeta
316
- return page.pageSize || 10
317
- },
318
- pageSizeOptions () {
319
- const { page = {} } = this.tableMeta
320
- return page.pageSizeOptions || ['10', '20', '30', '40']
321
- },
322
- columns () {
323
- const { columns, operations } = this.tableMeta
324
- if (type.get(columns) === 'array') {
325
- const columnsOptions = columns.map(item => {
326
- const { mode = 'text' } = item
327
- if (item.render) {
328
- return {
329
- ...item,
330
- customRender: (text, record, index) => {
331
- const { $createElement } = this
332
- return item.render.call(this,
333
- { h: $createElement, ctx: this },
334
- text ? typeof text == 'object' ? text[item.dataIndex] : text : '',
335
- record, index)
336
- }
337
- }
338
- } else if (mode !== BUILT_IN_TRIGGER.TEXT) {
339
- const { [`${mode}Meta`]: modeMeta } = item
340
- return {
341
- ...item,
342
- customRender: (text, record, index) => {
343
- return <span onClick={() => this.dispatchTrigger({ mode, record, modeMeta, index })} class={ mode }>{ text }</span>
344
- }
345
- }
346
- }
347
- return {
348
- ...item
349
- }
350
- })
351
- if (operations) {
352
- return [
353
- ...columnsOptions,
354
- {
355
- title: '操作',
356
- width: operations.width,
357
- key: 'action',
358
- fixed: 'right',
359
- scopedSlots: { customRender: 'action' }
360
- }
361
- ]
362
- }
363
- return columnsOptions
364
- } else {
365
- console.error('Error: columns is invalid, please check it')
366
- return []
367
- }
368
- },
369
- getButtonGroupElements () {
370
- const { elements } = this.buttonGroupMeta
371
- if (type.get(elements) === 'function') {
372
- return elements.call(this)
373
- } else if (type.get(elements) === 'array') {
374
- return elements
375
- } else {
376
- return []
377
- }
378
- },
379
- mapFields () {
380
- const { replaceFields = {} } = this.treeMeta
381
- const mapFields = type.isEmpty(replaceFields) ? this.replaceFields : replaceFields
382
- return mapFields
383
- }
384
- },
385
- async created () {
386
- if (this.showTree) {
387
- this.treeData = await this.requestTreeData()
388
- const [defaultTreeNode = {}] = this.treeData
389
- this.defaultExpandedKeys = [defaultTreeNode[this.mapFields.key]]
390
- this.defaultSelectedKeys = [defaultTreeNode[this.mapFields.key]]
391
- this.currentTreeNodeData = defaultTreeNode
392
- }
393
- const { params = {}, fieldMap = {}, overrideInit = false } = this.tableMeta
394
- const ctx = { ...this.currentTreeNodeData, _route: this.$route.query }
395
- const initQuerys = Object.assign({}, params, parseFieldMap(fieldMap, ctx))
396
- if (overrideInit) {
397
- this.$emit(RESERVE_EVENT_NAMES.INIT, { ...this.exposed })
398
- } else {
399
- this.tableData = await this.requestTableData(initQuerys)
400
- }
401
- },
402
- methods: {
403
- dispatchTrigger ({ mode, record = {}, modeMeta = { } }) {
404
- switch (mode) {
405
- case BUILT_IN_TRIGGER.FSM:
406
- this[`${BUILT_IN_TRIGGER.FSM}Trigger`](record, modeMeta = type.isEmpty(modeMeta) ? {
407
- url: 'api-fsm/workbench/fsm/auditFlow',
408
- requestType: 'GET',
409
- fieldMap: {
410
- modelCode: 'modelCode',
411
- businessId: 'businessId'
412
- }
413
- } : modeMeta)
414
- break
415
- case BUILT_IN_TRIGGER.ELE_MODAL_FORM:
416
- this.modalFormMeta = modeMeta
417
- this.showModalForm(modeMeta)
418
- break
419
- case BUILT_IN_TRIGGER.ELE_MODAL_TABLE:
420
- this.modalTableMeta = modeMeta
421
- this.showModalTable(modeMeta)
422
- break
423
- default:
424
- break
425
- }
426
- },
427
- handleCloseFsmModal () {
428
- this.showFsmModal = false
429
- },
430
- [`${BUILT_IN_TRIGGER.FSM}Trigger`] (record, meta) {
431
- this.fsmMeta = meta
432
- this.fsmContextProp = record
433
- this.showFsmModal = true
434
- },
435
- onChangeTableSelection (_, selectedRows = []) {
436
- if (this.currentTableMode === 'radio') {
437
- this.setCurrentTableSelection(selectedRows)
438
- this.$emit('on-change-table-selection', this.currentTableSelection)
439
- this.$emit('x:refresh-exposed', { exposed: this.exposed })
440
- } else {
441
- this.setCurrentTableSelection(selectedRows)
442
- this.$emit('on-change-table-selection', this.currentTableSelection)
443
- this.$emit('x:refresh-exposed', { exposed: this.exposed })
444
- }
445
- },
446
- setCurrentTableSelection (props = {}) {
447
- if (this.currentTableMode === 'radio') {
448
- this.$set(this, 'currentTableSelection', type.isObject(props) ? props : {})
449
- } else {
450
- this.$set(this, 'currentTableSelection', type.isArray(props) ? props : [])
451
- }
452
- },
453
- getCurrentTableSelection () {
454
- return this.currentTableSelection
455
- },
456
- setCurrentRowData (props = {}) {
457
- this.currentRowData = props
458
- },
459
- getCurrentRowData () {
460
- return this.currentRowData
461
- },
462
- cleanCurrentModelEffect () {
463
- this.setCurrentTableSelection()
464
- this.setCurrentRowData({})
465
- },
466
- [BUILT_IN_EVENT_NAMES.SUBMIT] (props = {}) {
467
- this.cleanCurrentModelEffect()
468
- this.requestTableData()
469
- },
470
- [BUILT_IN_EVENT_NAMES.EDIT] (props = {}) {
471
- const { record = {} } = props
472
- this.currentRowData = record
473
- this.setCurrentRowData(record)
474
- this.modalFormMeta = this.editMeta
475
- this.modalFormValue = true
476
- },
477
- [BUILT_IN_EVENT_NAMES.CREATE] () {
478
- this.modalFormMeta = this.createMeta
479
- this.modalFormValue = true
480
- },
481
- showModalForm (modeMeta = {}) {
482
- if (type.isStr(modeMeta)) {
483
- const targetMeta = this.findMetaByKey(modeMeta)
484
- this.modalFormMeta = targetMeta
485
- } else {
486
- this.modalFormMeta = modeMeta
487
- }
488
- this.modalFormValue = true
489
- },
490
- showModalTable (modeMeta = {}) {
491
- console.log('showModalTable', modeMeta)
492
- if (type.isStr(modeMeta)) {
493
- const targetMeta = this.findMetaByKey(modeMeta)
494
- this.modalTableMeta = targetMeta
495
- } else {
496
- this.modalTableMeta = modeMeta
497
- }
498
- this.modalTableValue = true
499
- },
500
- closeModalForm () {
501
- this.modalFormValue = false
502
- },
503
- closeModalTable () {
504
- console.log('closeModalTable')
505
- this.modalTableValue = false
506
- },
507
- findMetaByKey (key) {
508
- return this.$attrs[key] || {}
509
- },
510
- handleClickButtonGroup (props) {
511
- const { eventName, target } = props
512
- const targetMeta = this.findMetaByKey(target)
513
- const { mode } = targetMeta
514
- mode && this.dispatchTrigger({ mode, modeMeta: targetMeta })
515
- this.$emit(eventName || 'click', { currentTreeNode: this.currentTreeNodeData })
516
- },
517
- watchViewPort () {
518
- const modelTableWrapper = this.$refs[this.modelTableWrapper]
519
- const { top } = modelTableWrapper.getBoundingClientRect()
520
- this.$refs[this.modelTreeWrapper].style.height = `calc(100vh - ${top}px)`
521
- },
522
- async onSearch (props) {
523
- const { overrideInit = false } = this.tableMeta
524
- this.tableQuerys = Object.assign(this.tableQuerys, props)
525
- if (overrideInit) {
526
- this.$emit(RESERVE_EVENT_NAMES.TREE_CHANGE, { ...this.exposed })
527
- } else {
528
- this.tableData = await this.requestTableData()
529
- }
530
- },
531
- async selectTreeNode (selectedKeys, e) {
532
- const { fieldMap } = this.tableMeta
533
- this.currentTreeNodeData = e.node.$vnode.data.props.dataRef || {}
534
- //@deprecated '_' namespace is deprecated, please use 'exposed' instead
535
- const execFieldMapRet = parseFieldMap(fieldMap, { ...this.currentTreeNodeData, exposed: this.exposed, _route: this.exposed._route })
536
- const { overrideInit = false } = this.tableMeta
537
- if (overrideInit) {
538
- this.$emit(RESERVE_EVENT_NAMES.TREE_CHANGE, { ...this.exposed })
539
- } else {
540
- this.tableData = await this.requestTableData(execFieldMapRet)
541
- }
542
- },
543
- async requestTreeData () {
544
- const { url, requestType = 'GET', params = {}, fieldMap = {} } = this.treeMeta
545
- const fieldMapRet = parseFieldMap(fieldMap, { ...this.currentTreeNodeData, _route: this.$route.query })
546
- const ret = await net[requestType.toLowerCase()](
547
- url,
548
- { ...params, ...fieldMapRet }
549
- ).then(resp => {
550
- const { data } = resp || {}
551
- return data
552
- })
553
- return ret
554
- },
555
- async onChangePage (page, pageSize) {
556
- this.tableData = await this.requestTableData({ currentPage: page, pageSize })
557
- },
558
- async requestTableData (props = {}) {
559
- const { url, requestType = 'GET', page = {} } = this.tableMeta
560
- const { pageSize = 10 } = page
561
- this.tableQuerys = Object.assign(this.tableQuerys, { currentPage: 1, pageSize }, props)
562
- this.$emit(RESERVE_EVENT_NAMES.WATCH, { ...this.exposed })
563
- this.loading = true
564
- const ret = await net[requestType.toLowerCase()](
565
- url,
566
- this.tableQuerys
567
- ).then(resp => {
568
- const { data = [], count } = resp || {}
569
- this.total = count
570
- this.loading = false
571
- return (data || []).map(item => {
572
- delete item.children
573
- return {
574
- key: uuidv4(),
575
- ...item
576
- }
577
- })
578
- })
579
- this.cleanCurrentModelEffect()
580
- this.tableData = ret
581
- return ret
582
- },
583
- refreshTreeStatus (props = {}) {},
584
- refreshTableStatus (props = {}) {},
585
- calculateTableHeight () {
586
- const currentViewportHeight = window.innerHeight
587
- const tableRef = this.$refs[this.tableRef]
588
- const { top: tableToTop, width } = tableRef.$el.getBoundingClientRect()
589
- this.tableWidth = width
590
- this.tableHeight = currentViewportHeight - tableToTop - this.overHeight
591
- },
592
- calculateTreeHeight () {
593
- if (!this.showTree) return
594
- const modelTableContainerRef = this.$refs[this.modelTableContainerRef]
595
- const { height } = modelTableContainerRef.getBoundingClientRect()
596
- this.treeWrapperHeight = height
597
- }
598
- },
599
- mounted () {
600
- this.calculateTableHeight()
601
- this.$nextTick(() => {
602
- this.calculateTreeHeight()
603
- })
604
- this.resizeObserverModelTableWrapper = new ResizeObserver(entries => {
605
- for (const _ of entries) {
606
- requestAnimationFrame(() => {
607
- this.calculateTableHeight()
608
- })
609
- }
610
- })
611
- this.resizeObserverModelTableWrapper.observe(this.$refs[this.modelTableWrapper])
612
- },
613
- destroyed () {
614
- this.resizeObserverModelTableWrapper.disconnect()
615
- }
616
- }
617
- </script>
618
-
619
- <style lang="scss" scoped>
620
- .ele {
621
- &.model__tree-table {
622
- background: transparent;
623
- display: flex;
624
- flex-direction: row;
625
- width: 100%;
626
- .model__tree-table--container {
627
- .model__tree--wrapper {
628
- width: 240px;
629
- background: #fff;
630
- flex-shrink: 0;
631
- padding: 16px;
632
- box-sizing: border-box;
633
- margin-right: 16px;
634
- overflow-y: auto;
635
- }
636
- }
637
- .model__table--container {
638
- width: 100%;
639
- min-width: 0;
640
- background: #fff;
641
- .model__table--title {
642
- .model__table-title--bar {
643
- width: 100%;
644
- height: 8px;
645
- background: var(--idooel-primary-color);
646
- border-top-left-radius: 4px;
647
- border-top-right-radius: 4px;
648
- }
649
- .model__table-title--text {
650
- text-align: left;
651
- padding: 16px;
652
- font-size: 16px;
653
- font-weight: bold;
654
- background: #fff;
655
- border-bottom: 1px solid;
656
- border-color: var(--idoole-black-016);
657
- }
658
- }
659
- .model__table--wrapper {
660
- background: #fff;
661
- .button-row__area {
662
- width: 100%;
663
- display: flex;
664
- flex-direction: row;
665
- align-items: center;
666
- justify-content: space-between;
667
- padding-top: 16px;
668
- padding-bottom: 8px;
669
- padding-right: 16px;
670
- }
671
- .g-table__wrapper {
672
- .fsm {
673
- cursor: pointer;
674
- color: var(--idooel-primary-color);
675
- }
676
- }
677
- }
678
- }
679
- }
680
- }
681
- </style>
1
+ <template>
2
+ <section class="ele model__tree-table">
3
+ <section class="model__tree-table--container" v-if="showTree">
4
+ <div class="model__tree--title"></div>
5
+ <section :ref="modelTreeWrapper" class="model__tree--wrapper" :style="{height: `${treeWrapperHeight}px`}">
6
+ <ele-tree
7
+ :tree-data="treeData"
8
+ :defaultExpandedKeys="defaultExpandedKeys"
9
+ :defaultSelectedKeys="defaultSelectedKeys"
10
+ @select="selectTreeNode"
11
+ :replace-fields="mapFields">
12
+ </ele-tree>
13
+ </section>
14
+ </section>
15
+ <section class="model__table--container" :ref="modelTableContainerRef">
16
+ <div class="model__table--title" v-if="title">
17
+ <template v-if="titleMode">
18
+ <div :class="[`model__table-title--${titleMode}`]"></div>
19
+ </template>
20
+ <template v-else>
21
+ <div class="model__table-title--text">{{ title }}</div>
22
+ </template>
23
+ </div>
24
+ <section :ref="modelTableWrapper" class="model__table--wrapper">
25
+ <ele-search-area :ref="searchArea" @search="onSearch" :data-source="searchMeta.elements"></ele-search-area>
26
+ <div class="button-row__area">
27
+ <ele-button-group class="model-table__button-group" v-on="overrideButtonGroupEvent" :ref="buttonGroup" @click="handleClickButtonGroup" :data-source="getButtonGroupElements"></ele-button-group>
28
+ <slot name="tags"></slot>
29
+ <slot v-if="$slots['sub-center']" name="sub-center"></slot>
30
+ </div>
31
+ <ele-table
32
+ v-on="overrideTableEvent"
33
+ :ref="tableRef"
34
+ :row-selection="rowSelection"
35
+ :loading="loading"
36
+ :columns="columns"
37
+ :total="total"
38
+ :x="x"
39
+ :y="y"
40
+ :bordered="setBorder"
41
+ :height="tableHeight"
42
+ :width="tableWidth"
43
+ :actions="actions"
44
+ :pageSize="pageSize"
45
+ :pageSizeOptions="pageSizeOptions"
46
+ :data-source="tableData"
47
+ @change-page="onChangePage"
48
+ ></ele-table>
49
+ </section>
50
+ </section>
51
+ <ele-modal-form v-model="modalFormValue" v-on="overrideModalFormEvent" :meta="modalFormMeta"></ele-modal-form>
52
+ <ele-modal-fsm v-model="showFsmModal" :contextProp="fsmContextProp" :meta="fsmMeta" @cancel="handleCloseFsmModal"></ele-modal-fsm>
53
+ <ele-modal-table
54
+ :meta="modalTableMeta"
55
+ v-model="modalTableValue"
56
+ v-on="overrideModalTableEvent"
57
+ ></ele-modal-table>
58
+ </section>
59
+ </template>
60
+
61
+ <script>
62
+ import { type, net, util } from '@idooel/shared'
63
+ import { v4 as uuidv4 } from 'uuid'
64
+ import { BUILT_IN_EVENT_NAMES, RESERVE_EVENT_NAMES, parseFieldMap, BUILT_IN_TRIGGER, CONTEXT } from '../../../utils'
65
+ export default {
66
+ name: 'ele-tree-table-model',
67
+ props: {
68
+ title: {
69
+ type: [Object, String]
70
+ },
71
+ overHeight: {
72
+ type: Number,
73
+ default: 0
74
+ },
75
+ treeMeta: {
76
+ type: Object,
77
+ default: () => ({})
78
+ },
79
+ searchMeta: {
80
+ type: Object,
81
+ default: () => ({})
82
+ },
83
+ buttonGroupMeta: {
84
+ typeof: Object,
85
+ default: () => ({})
86
+ },
87
+ tableMeta: {
88
+ type: Object,
89
+ default: () => ({})
90
+ },
91
+ createMeta: {
92
+ type: Object
93
+ },
94
+ editMeta: {
95
+ type: Object
96
+ }
97
+ },
98
+ provide () {
99
+ return {
100
+ requestTreeData: this.requestTreeData,
101
+ requestTableData: this.requestTableData,
102
+ [CONTEXT]: () => {
103
+ return {
104
+ exposed: this.exposed
105
+ }
106
+ }
107
+ }
108
+ },
109
+ data () {
110
+ return {
111
+ tableHeight: 0,
112
+ tableWidth: 0,
113
+ modalFormMeta: {},
114
+ modalFormValue: false,
115
+ treeData: [],
116
+ tableData: [],
117
+ defaultExpandedKeys: [],
118
+ defaultSelectedKeys: [],
119
+ replaceFields: {
120
+ title: 'title',
121
+ children: 'children',
122
+ key: 'id'
123
+ },
124
+ loading: false,
125
+ total: 0,
126
+ tableQuerys: {},
127
+ resizeObserverModelTableWrapper: null,
128
+ modelTableWrapperHeight: 0,
129
+ currentTreeNodeData: {},
130
+ currentRowData: {},
131
+ treeWrapperHeight: 0,
132
+ currentTableSelection: this.currentTableMode == 'radio' ? {} : [],
133
+ showFsmModal: false,
134
+ fsmMeta: {},
135
+ fsmContextProp: {},
136
+ modalTableValue: false,
137
+ modalTableMeta: {}
138
+ }
139
+ },
140
+ computed: {
141
+ setBorder () {
142
+ return this.tableMeta.bordered === false ? false : true
143
+ },
144
+ rowSelection () {
145
+ if (!this.currentTableMode) return void 0
146
+ return {
147
+ columnTitle: this.currentSelectionColumn.columnTitle,
148
+ fixed: true,
149
+ type: this.currentTableMode,
150
+ onChange: this.onChangeTableSelection
151
+ }
152
+ },
153
+ currentSelectionColumn () {
154
+ const { multiple } = this.tableMeta
155
+ const target = this.columns.find(item => Object.keys(item).includes('multiple'))
156
+ const isGlobalExistMultiple = Object.keys(this.tableMeta).includes('multiple')
157
+ if (target) {
158
+ return target
159
+ } else if (isGlobalExistMultiple) {
160
+ return { multiple }
161
+ }
162
+ return void 0
163
+ },
164
+ x () {
165
+ const { x } = this.tableMeta
166
+ return x
167
+ },
168
+ y () {
169
+ const { y } = this.tableMeta
170
+ return y
171
+ },
172
+ currentTableMode () {
173
+ if (!this.currentSelectionColumn) return void 0
174
+ const { multiple } = this.currentSelectionColumn
175
+ if (type.isBool(multiple)) {
176
+ if (multiple) {
177
+ return 'checkbox'
178
+ } else {
179
+ return 'radio'
180
+ }
181
+ } else {
182
+ return void 0
183
+ }
184
+ },
185
+ modelTableContainerRef () {
186
+ return uuidv4()
187
+ },
188
+ titleMode () {
189
+ if (type.isObject(this.title)) {
190
+ const { mode = '' } = this.title
191
+ return mode
192
+ }
193
+ return void 0
194
+ },
195
+ tableRef () {
196
+ return uuidv4()
197
+ },
198
+ exposed () {
199
+ return {
200
+ showModalForm: this.showModalForm,
201
+ closeModalForm: this.closeModalForm,
202
+ showModalTable: this.showModalTable,
203
+ closeModalTable: this.closeModalTable,
204
+ currentTableSelection: this.currentTableSelection,
205
+ currentTreeNode: this.currentTreeNodeData,
206
+ requestTableData: this.requestTableData,
207
+ refreshTreeData: this.refreshTreeData,
208
+ querys: this.tableQuerys,
209
+ currentRowData: this.currentRowData,
210
+ getCurrentRowData: this.getCurrentRowData,
211
+ setCurrentRowData: this.setCurrentRowData,
212
+ setCurrentTableSelection: this.setCurrentTableSelection,
213
+ getCurrentTableSelection: this.getCurrentTableSelection,
214
+ cleanCurrentModelEffect: this.cleanCurrentModelEffect,
215
+ route: this.$route,
216
+ _route: this.$route.query,
217
+ _routeMeta: this.$route.meta
218
+ }
219
+ },
220
+ overrideTableEvent () {
221
+ const events = this.actions.reduce((ret, action) => {
222
+ ret[action.eventName || action.key] = (e) => {
223
+ this.setCurrentRowData(e.exposed.currentRowData)
224
+ const { target } = action
225
+ const targetMeta = this.findMetaByKey(target)
226
+ const { mode } = targetMeta
227
+ mode && this.dispatchTrigger({ mode, record: e.exposed.currentRowData, modeMeta: targetMeta })
228
+ this.$emit(action.eventName || action.key, { ...e, currentTreeNode: this.currentTreeNodeData, exposed: { ...this.exposed, ...e.exposed } })
229
+ }
230
+ return ret
231
+ }, {})
232
+ return {
233
+ ...this.$listeners,
234
+ ...events,
235
+ [BUILT_IN_EVENT_NAMES.EDIT]: this[BUILT_IN_EVENT_NAMES.EDIT],
236
+ [BUILT_IN_EVENT_NAMES.SUBMIT]: this[BUILT_IN_EVENT_NAMES.SUBMIT]
237
+ }
238
+ },
239
+ overrideModalFormEvent () {
240
+ const { footerMeta } = this.modalFormMeta
241
+ const { elements = [] } = footerMeta || {}
242
+ const eles = type.isFunction(elements) ? elements.call(this) : elements
243
+ const events = eles.reduce((ret, ele) => {
244
+ ret[ele.eventName] = (e = {}) => {
245
+ if (ele.eventName === 'cancel') {
246
+ this.closeModalForm()
247
+ } else {
248
+ const { exposed = {} } = e
249
+ this.$emit(`${ele.eventName || ele.key}`, { ...e, currentTreeNode: this.currentTreeNodeData, exposed: Object.assign({}, exposed )})
250
+ }
251
+ }
252
+ return ret
253
+ }, {})
254
+ return {
255
+ ...events
256
+ }
257
+ },
258
+ overrideModalTableEvent () {
259
+ const { footerMeta } = this.modalTableMeta
260
+ const { elements = [] } = footerMeta || {}
261
+ const eles = type.isFunction(elements) ? elements.call(this) : elements
262
+ const events = eles.reduce((ret, ele) => {
263
+ ret[ele.eventName] = (e = {}) => {
264
+ if (ele.eventName === 'cancel') {
265
+ this.closeModalTable()
266
+ } else {
267
+ const { exposed = {} } = e
268
+ this.$emit(`${ele.eventName || ele.key}`, { ...e, currentTreeNode: this.currentTreeNodeData, exposed: Object.assign({}, exposed )})
269
+ }
270
+ }
271
+ return ret
272
+ }, {})
273
+ return {
274
+ ...events,
275
+ exposed: this.exposed
276
+ }
277
+ },
278
+ overrideButtonGroupEvent () {
279
+ const events = this.getButtonGroupElements.reduce((ret, ele) => {
280
+ ret[ele.eventName] = (e) => {
281
+ this.$emit(ele.eventName || 'click', { ...e, currentTreeNode: this.currentTreeNodeData, exposed: Object.assign({}, e.exposed || {}, this.exposed)})
282
+ }
283
+ return ret
284
+ }, {})
285
+ return {
286
+ ...this.$listeners,
287
+ ...events,
288
+ [BUILT_IN_EVENT_NAMES.CREATE]: this[BUILT_IN_EVENT_NAMES.CREATE],
289
+ exposed: this.exposed
290
+ }
291
+ },
292
+ showTree () {
293
+ return !!Object.keys(this.treeMeta).length
294
+ },
295
+ buttonGroup () {
296
+ return uuidv4()
297
+ },
298
+ searchArea () {
299
+ return uuidv4()
300
+ },
301
+ modelTreeWrapper () {
302
+ return uuidv4()
303
+ },
304
+ modelTableWrapper () {
305
+ return uuidv4()
306
+ },
307
+ actions () {
308
+ const { operations } = this.tableMeta
309
+ if (operations) {
310
+ return operations.elements
311
+ } else {
312
+ return []
313
+ }
314
+ },
315
+ pageSize () {
316
+ const { page = {} } = this.tableMeta
317
+ return page.pageSize || 10
318
+ },
319
+ pageSizeOptions () {
320
+ const { page = {} } = this.tableMeta
321
+ return page.pageSizeOptions || ['10', '20', '30', '40']
322
+ },
323
+ columns () {
324
+ const { columns, operations } = this.tableMeta
325
+ if (type.get(columns) === 'array') {
326
+ const columnsOptions = columns.map(item => {
327
+ const { mode = 'text' } = item
328
+ if (item.render) {
329
+ return {
330
+ ...item,
331
+ customRender: (text, record, index) => {
332
+ const { $createElement } = this
333
+ return item.render.call(this,
334
+ { h: $createElement, ctx: this },
335
+ text ? typeof text == 'object' ? text[item.dataIndex] : text : '',
336
+ record, index)
337
+ }
338
+ }
339
+ } else if (mode !== BUILT_IN_TRIGGER.TEXT) {
340
+ const { [`${mode}Meta`]: modeMeta } = item
341
+ return {
342
+ ...item,
343
+ customRender: (text, record, index) => {
344
+ return <span onClick={() => this.dispatchTrigger({ mode, record, modeMeta, index })} class={ mode }>{ text }</span>
345
+ }
346
+ }
347
+ }
348
+ return {
349
+ ...item
350
+ }
351
+ })
352
+ if (operations) {
353
+ return [
354
+ ...columnsOptions,
355
+ {
356
+ title: '操作',
357
+ width: operations.width,
358
+ key: 'action',
359
+ fixed: 'right',
360
+ scopedSlots: { customRender: 'action' }
361
+ }
362
+ ]
363
+ }
364
+ return columnsOptions
365
+ } else {
366
+ console.error('Error: columns is invalid, please check it')
367
+ return []
368
+ }
369
+ },
370
+ getButtonGroupElements () {
371
+ const { elements } = this.buttonGroupMeta
372
+ if (type.get(elements) === 'function') {
373
+ return elements.call(this)
374
+ } else if (type.get(elements) === 'array') {
375
+ return elements
376
+ } else {
377
+ return []
378
+ }
379
+ },
380
+ mapFields () {
381
+ const { replaceFields = {} } = this.treeMeta
382
+ const mapFields = type.isEmpty(replaceFields) ? this.replaceFields : replaceFields
383
+ return mapFields
384
+ }
385
+ },
386
+ async created () {
387
+ if (this.showTree) {
388
+ this.treeData = await this.requestTreeData()
389
+ const [defaultTreeNode = {}] = this.treeData
390
+ this.defaultExpandedKeys = [defaultTreeNode[this.mapFields.key]]
391
+ this.defaultSelectedKeys = [defaultTreeNode[this.mapFields.key]]
392
+ this.currentTreeNodeData = defaultTreeNode
393
+ }
394
+ const { params = {}, fieldMap = {}, overrideInit = false } = this.tableMeta
395
+ const ctx = { ...this.currentTreeNodeData, _route: this.$route.query }
396
+ const initQuerys = Object.assign({}, params, parseFieldMap(fieldMap, ctx))
397
+ if (overrideInit) {
398
+ this.$emit(RESERVE_EVENT_NAMES.INIT, { ...this.exposed })
399
+ } else {
400
+ this.tableData = await this.requestTableData(initQuerys)
401
+ }
402
+ },
403
+ methods: {
404
+ async refreshTreeData () {
405
+ this.treeData = await this.requestTreeData()
406
+ const [defaultTreeNode = {}] = this.treeData
407
+ this.defaultExpandedKeys = [defaultTreeNode[this.mapFields.key]]
408
+ this.defaultSelectedKeys = [defaultTreeNode[this.mapFields.key]]
409
+ this.currentTreeNodeData = defaultTreeNode
410
+ },
411
+ dispatchTrigger ({ mode, record = {}, modeMeta = { } }) {
412
+ switch (mode) {
413
+ case BUILT_IN_TRIGGER.FSM:
414
+ this[`${BUILT_IN_TRIGGER.FSM}Trigger`](record, modeMeta = type.isEmpty(modeMeta) ? {
415
+ url: 'api-fsm/workbench/fsm/auditFlow',
416
+ requestType: 'GET',
417
+ fieldMap: {
418
+ modelCode: 'modelCode',
419
+ businessId: 'businessId'
420
+ }
421
+ } : modeMeta)
422
+ break
423
+ case BUILT_IN_TRIGGER.ELE_MODAL_FORM:
424
+ this.modalFormMeta = modeMeta
425
+ this.showModalForm(modeMeta)
426
+ break
427
+ case BUILT_IN_TRIGGER.ELE_MODAL_TABLE:
428
+ this.modalTableMeta = modeMeta
429
+ this.showModalTable(modeMeta)
430
+ break
431
+ default:
432
+ break
433
+ }
434
+ },
435
+ handleCloseFsmModal () {
436
+ this.showFsmModal = false
437
+ },
438
+ [`${BUILT_IN_TRIGGER.FSM}Trigger`] (record, meta) {
439
+ this.fsmMeta = meta
440
+ this.fsmContextProp = record
441
+ this.showFsmModal = true
442
+ },
443
+ onChangeTableSelection (_, selectedRows = []) {
444
+ if (this.currentTableMode === 'radio') {
445
+ this.setCurrentTableSelection(selectedRows)
446
+ this.$emit('on-change-table-selection', this.currentTableSelection)
447
+ this.$emit('x:refresh-exposed', { exposed: this.exposed })
448
+ } else {
449
+ this.setCurrentTableSelection(selectedRows)
450
+ this.$emit('on-change-table-selection', this.currentTableSelection)
451
+ this.$emit('x:refresh-exposed', { exposed: this.exposed })
452
+ }
453
+ },
454
+ setCurrentTableSelection (props = {}) {
455
+ if (this.currentTableMode === 'radio') {
456
+ this.$set(this, 'currentTableSelection', (type.isArray(props) && props.length > 0) ? props[0] : type.isObject(props) ? props : {})
457
+ } else {
458
+ this.$set(this, 'currentTableSelection', type.isArray(props) ? props : [])
459
+ }
460
+ },
461
+ getCurrentTableSelection () {
462
+ return this.currentTableSelection
463
+ },
464
+ setCurrentRowData (props = {}) {
465
+ this.currentRowData = props
466
+ },
467
+ getCurrentRowData () {
468
+ return this.currentRowData
469
+ },
470
+ cleanCurrentModelEffect () {
471
+ this.setCurrentTableSelection()
472
+ this.setCurrentRowData({})
473
+ },
474
+ [BUILT_IN_EVENT_NAMES.SUBMIT] (props = {}) {
475
+ this.cleanCurrentModelEffect()
476
+ this.requestTableData()
477
+ },
478
+ [BUILT_IN_EVENT_NAMES.EDIT] (props = {}) {
479
+ const { record = {} } = props
480
+ this.currentRowData = record
481
+ this.setCurrentRowData(record)
482
+ this.modalFormMeta = this.editMeta
483
+ this.modalFormValue = true
484
+ },
485
+ [BUILT_IN_EVENT_NAMES.CREATE] () {
486
+ this.modalFormMeta = this.createMeta
487
+ this.modalFormValue = true
488
+ },
489
+ showModalForm (modeMeta = {}) {
490
+ if (type.isStr(modeMeta)) {
491
+ const targetMeta = this.findMetaByKey(modeMeta)
492
+ this.modalFormMeta = targetMeta
493
+ } else {
494
+ this.modalFormMeta = modeMeta
495
+ }
496
+ this.modalFormValue = true
497
+ },
498
+ showModalTable (modeMeta = {}) {
499
+ console.log('showModalTable', modeMeta)
500
+ if (type.isStr(modeMeta)) {
501
+ const targetMeta = this.findMetaByKey(modeMeta)
502
+ this.modalTableMeta = targetMeta
503
+ } else {
504
+ this.modalTableMeta = modeMeta
505
+ }
506
+ this.modalTableValue = true
507
+ },
508
+ closeModalForm () {
509
+ this.modalFormValue = false
510
+ },
511
+ closeModalTable () {
512
+ console.log('closeModalTable')
513
+ this.modalTableValue = false
514
+ },
515
+ findMetaByKey (key) {
516
+ return this.$attrs[key] || {}
517
+ },
518
+ handleClickButtonGroup (props) {
519
+ const { eventName, target } = props
520
+ const targetMeta = this.findMetaByKey(target)
521
+ const { mode } = targetMeta
522
+ mode && this.dispatchTrigger({ mode, modeMeta: targetMeta })
523
+ this.$emit(eventName || 'click', { currentTreeNode: this.currentTreeNodeData })
524
+ },
525
+ watchViewPort () {
526
+ const modelTableWrapper = this.$refs[this.modelTableWrapper]
527
+ const { top } = modelTableWrapper.getBoundingClientRect()
528
+ this.$refs[this.modelTreeWrapper].style.height = `calc(100vh - ${top}px)`
529
+ },
530
+ async onSearch (props) {
531
+ const { overrideInit = false } = this.tableMeta
532
+ this.tableQuerys = Object.assign(this.tableQuerys, props)
533
+ if (overrideInit) {
534
+ this.$emit(RESERVE_EVENT_NAMES.TREE_CHANGE, { ...this.exposed })
535
+ } else {
536
+ this.tableData = await this.requestTableData()
537
+ }
538
+ },
539
+ async selectTreeNode (selectedKeys, e) {
540
+ const { fieldMap } = this.tableMeta
541
+ this.currentTreeNodeData = e.node.$vnode.data.props.dataRef || {}
542
+ //@deprecated '_' namespace is deprecated, please use 'exposed' instead
543
+ const execFieldMapRet = parseFieldMap(fieldMap, { ...this.currentTreeNodeData, exposed: this.exposed, _route: this.exposed._route })
544
+ const { overrideInit = false } = this.tableMeta
545
+ if (overrideInit) {
546
+ this.$emit(RESERVE_EVENT_NAMES.TREE_CHANGE, { ...this.exposed })
547
+ } else {
548
+ this.tableData = await this.requestTableData(execFieldMapRet)
549
+ }
550
+ },
551
+ async requestTreeData () {
552
+ const { url, requestType = 'GET', params = {}, fieldMap = {} } = this.treeMeta
553
+ const fieldMapRet = parseFieldMap(fieldMap, { ...this.currentTreeNodeData, _route: this.$route.query })
554
+ const ret = await net[requestType.toLowerCase()](
555
+ url,
556
+ { ...params, ...fieldMapRet }
557
+ ).then(resp => {
558
+ const { data } = resp || {}
559
+ return data
560
+ })
561
+ return ret
562
+ },
563
+ async onChangePage (page, pageSize) {
564
+ this.tableData = await this.requestTableData({ currentPage: page, pageSize })
565
+ },
566
+ async requestTableData (props = {}) {
567
+ const { url, requestType = 'GET', page = {} } = this.tableMeta
568
+ const { pageSize = 10 } = page
569
+ this.tableQuerys = Object.assign(this.tableQuerys, { currentPage: 1, pageSize }, props)
570
+ this.$emit(RESERVE_EVENT_NAMES.WATCH, { ...this.exposed })
571
+ this.loading = true
572
+ const ret = await net[requestType.toLowerCase()](
573
+ url,
574
+ this.tableQuerys
575
+ ).then(resp => {
576
+ const { data = [], count } = resp || {}
577
+ this.total = count
578
+ this.loading = false
579
+ return (data || []).map(item => {
580
+ delete item.children
581
+ return {
582
+ key: uuidv4(),
583
+ ...item
584
+ }
585
+ })
586
+ })
587
+ this.cleanCurrentModelEffect()
588
+ this.tableData = ret
589
+ return ret
590
+ },
591
+ refreshTreeStatus (props = {}) {},
592
+ refreshTableStatus (props = {}) {},
593
+ calculateTableHeight () {
594
+ const currentViewportHeight = window.innerHeight
595
+ const tableRef = this.$refs[this.tableRef]
596
+ const { top: tableToTop, width } = tableRef.$el.getBoundingClientRect()
597
+ this.tableWidth = width
598
+ this.tableHeight = currentViewportHeight - tableToTop - this.overHeight
599
+ },
600
+ calculateTreeHeight () {
601
+ if (!this.showTree) return
602
+ const modelTableContainerRef = this.$refs[this.modelTableContainerRef]
603
+ const { height } = modelTableContainerRef.getBoundingClientRect()
604
+ this.treeWrapperHeight = height
605
+ }
606
+ },
607
+ mounted () {
608
+ this.calculateTableHeight()
609
+ this.$nextTick(() => {
610
+ this.calculateTreeHeight()
611
+ })
612
+ this.resizeObserverModelTableWrapper = new ResizeObserver(entries => {
613
+ for (const _ of entries) {
614
+ requestAnimationFrame(() => {
615
+ this.calculateTableHeight()
616
+ })
617
+ }
618
+ })
619
+ this.resizeObserverModelTableWrapper.observe(this.$refs[this.modelTableWrapper])
620
+ },
621
+ destroyed () {
622
+ this.resizeObserverModelTableWrapper.disconnect()
623
+ }
624
+ }
625
+ </script>
626
+
627
+ <style lang="scss" scoped>
628
+ .ele {
629
+ &.model__tree-table {
630
+ background: transparent;
631
+ display: flex;
632
+ flex-direction: row;
633
+ width: 100%;
634
+ .model__tree-table--container {
635
+ .model__tree--wrapper {
636
+ width: 240px;
637
+ background: #fff;
638
+ flex-shrink: 0;
639
+ padding: 16px;
640
+ box-sizing: border-box;
641
+ margin-right: 16px;
642
+ overflow-y: auto;
643
+ }
644
+ }
645
+ .model__table--container {
646
+ width: 100%;
647
+ min-width: 0;
648
+ background: #fff;
649
+ .model__table--title {
650
+ .model__table-title--bar {
651
+ width: 100%;
652
+ height: 8px;
653
+ background: var(--idooel-primary-color);
654
+ border-top-left-radius: 4px;
655
+ border-top-right-radius: 4px;
656
+ }
657
+ .model__table-title--text {
658
+ text-align: left;
659
+ padding: 16px;
660
+ font-size: 16px;
661
+ font-weight: bold;
662
+ background: #fff;
663
+ border-bottom: 1px solid;
664
+ border-color: var(--idoole-black-016);
665
+ }
666
+ }
667
+ .model__table--wrapper {
668
+ background: #fff;
669
+ .button-row__area {
670
+ width: 100%;
671
+ display: flex;
672
+ flex-direction: row;
673
+ align-items: center;
674
+ justify-content: space-between;
675
+ padding-top: 16px;
676
+ padding-bottom: 8px;
677
+ padding-right: 16px;
678
+ }
679
+ .g-table__wrapper {
680
+ .fsm {
681
+ cursor: pointer;
682
+ color: var(--idooel-primary-color);
683
+ }
684
+ }
685
+ }
686
+ }
687
+ }
688
+ }
689
+ </style>