@idooel/components 0.0.1 → 0.0.2-beta.10

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 (96) hide show
  1. package/README.md +99 -0
  2. package/dist/@idooel/components.esm.js +13639 -1388
  3. package/dist/@idooel/components.umd.js +13682 -1397
  4. package/jsconfig.json +8 -0
  5. package/package.json +58 -44
  6. package/packages/alert/index.js +5 -0
  7. package/packages/alert/src/index.vue +46 -0
  8. package/packages/batch-export/index.js +5 -0
  9. package/packages/batch-export/src/index.vue +105 -0
  10. package/packages/business-components/modal-fsm/index.js +5 -0
  11. package/packages/business-components/modal-fsm/src/index.vue +164 -0
  12. package/packages/business-components/modal-import/index.js +5 -0
  13. package/packages/business-components/modal-import/src/index.vue +140 -0
  14. package/packages/business-components/modal-timeline/index.js +5 -0
  15. package/packages/business-components/modal-timeline/src/index.vue +78 -0
  16. package/packages/business-components/tabs-sub-center/index.js +5 -0
  17. package/packages/business-components/tabs-sub-center/src/index.vue +117 -0
  18. package/packages/button/src/index.vue +43 -2
  19. package/packages/checkbox/index.js +5 -0
  20. package/packages/checkbox/src/index.vue +53 -0
  21. package/packages/composite-components/button-group/src/index.vue +119 -14
  22. package/packages/composite-components/form-attachment/src/index.vue +15 -0
  23. package/packages/composite-components/form-img-crop/index.js +5 -0
  24. package/packages/composite-components/form-img-crop/src/index.vue +132 -0
  25. package/packages/composite-components/modal-confirm/index.js +5 -0
  26. package/packages/composite-components/modal-confirm/src/index.vue +104 -0
  27. package/packages/composite-components/modal-form/index.js +5 -0
  28. package/packages/composite-components/modal-form/src/index.vue +231 -0
  29. package/packages/composite-components/modal-img-crop/index.js +5 -0
  30. package/packages/composite-components/modal-img-crop/src/index.vue +299 -0
  31. package/packages/composite-components/modal-table/index.js +5 -0
  32. package/packages/composite-components/modal-table/src/index.vue +156 -0
  33. package/packages/composite-components/modal-table-transfer/index.js +0 -0
  34. package/packages/composite-components/modal-tree/index.js +5 -0
  35. package/packages/composite-components/modal-tree/src/index.vue +76 -0
  36. package/packages/composite-components/search-area/src/index.vue +145 -36
  37. package/packages/composite-components/select-entity-modal-table/index.js +5 -0
  38. package/packages/composite-components/select-entity-modal-table/src/index.vue +172 -0
  39. package/packages/composite-components/table-transfer/index.js +0 -0
  40. package/packages/date/src/index.vue +87 -14
  41. package/packages/date-range/index.js +5 -0
  42. package/packages/date-range/src/index.vue +47 -0
  43. package/packages/form/index.js +5 -0
  44. package/packages/form/src/index.vue +320 -0
  45. package/packages/icon/index.js +5 -0
  46. package/packages/icon/src/index.vue +32 -0
  47. package/packages/index.js +109 -6
  48. package/packages/input/src/index.vue +13 -1
  49. package/packages/input-number/index.js +5 -0
  50. package/packages/input-number/src/index.vue +24 -0
  51. package/packages/loading/index.js +5 -0
  52. package/packages/loading/src/index.vue +37 -0
  53. package/packages/modal/index.js +5 -0
  54. package/packages/modal/src/index.vue +185 -0
  55. package/packages/models/form-group-model/index.js +5 -0
  56. package/packages/models/form-group-model/src/index.vue +274 -0
  57. package/packages/models/form-model/index.js +5 -0
  58. package/packages/models/form-model/src/index.vue +237 -0
  59. package/packages/models/step-model/index.js +5 -0
  60. package/packages/models/step-model/src/index.vue +224 -0
  61. package/packages/models/tree-table-model/src/index.vue +689 -0
  62. package/packages/radio/index.js +5 -0
  63. package/packages/radio/src/index.vue +57 -0
  64. package/packages/select/src/index.vue +73 -2
  65. package/packages/select-entity/index.js +5 -0
  66. package/packages/select-entity/src/index.vue +120 -0
  67. package/packages/table/src/action.vue +81 -12
  68. package/packages/table/src/index.vue +244 -13
  69. package/packages/tabs/index.js +5 -0
  70. package/packages/tabs/src/index.vue +56 -0
  71. package/packages/text/index.js +5 -0
  72. package/packages/text/src/index.vue +48 -0
  73. package/packages/text-editor/index.js +5 -0
  74. package/packages/text-editor/src/index.vue +73 -0
  75. package/packages/textarea/index.js +5 -0
  76. package/packages/textarea/src/index.vue +58 -0
  77. package/packages/theme/form.scss +22 -0
  78. package/packages/theme/index.scss +44 -0
  79. package/packages/theme/overrid.scss +8 -0
  80. package/packages/theme/styleClass.scss +3 -0
  81. package/packages/theme/variables.scss +56 -0
  82. package/packages/timeline/index.js +5 -0
  83. package/packages/timeline/src/index.vue +258 -0
  84. package/packages/tpl/src/index.vue +12 -3
  85. package/packages/tree/src/index.vue +32 -27
  86. package/packages/tree-select/index.js +5 -0
  87. package/packages/tree-select/src/index.vue +143 -0
  88. package/packages/upload/index.js +5 -0
  89. package/packages/upload/src/index.vue +997 -0
  90. package/packages/utils/index.js +63 -0
  91. package/scripts/rollup.config.js +18 -11
  92. package/scripts/rollup.umd.config.js +3 -1
  93. package/vitest.config.js +17 -0
  94. package/packages/tree-table-model/src/index.vue +0 -290
  95. /package/packages/{tree-table-model/README.md → composite-components/form-attachment/index.js} +0 -0
  96. /package/packages/{tree-table-model → models/tree-table-model}/index.js +0 -0
@@ -0,0 +1,231 @@
1
+ <template>
2
+ <ele-modal
3
+ :title="modalTitle"
4
+ :value="innerValue"
5
+ :size="modalSize"
6
+ v-on="assignAttrForEvents"
7
+ :button-group-meta="buildButtonGroupMeta">
8
+ <ele-form :ref="formRef" :elements="elements" @x:mounted="formMounted"></ele-form>
9
+ </ele-modal>
10
+ </template>
11
+
12
+ <script>
13
+ import { v4 as uuidv4 } from 'uuid'
14
+ import { net, type } from '@idooel/shared'
15
+ import { parse } from '@idooel/expression'
16
+ import { BUILT_IN_EVENT_NAMES, BUILT_IN_METHODS_NAMES, parseFieldMap, RESERVE_EVENT_NAMES, PAGE_STATUS, CONTEXT } from '../../../utils'
17
+ export default {
18
+ name: 'ele-modal-form',
19
+ model: {
20
+ prop: 'value',
21
+ event: 'change'
22
+ },
23
+ props: {
24
+ title: {
25
+ type: String,
26
+ default: 'ModalForm'
27
+ },
28
+ size: {
29
+ type: String
30
+ },
31
+ value: {
32
+ type: Boolean,
33
+ default: false
34
+ },
35
+ meta: {
36
+ type: Object
37
+ }
38
+ },
39
+ data() {
40
+ return {
41
+ innerValue: false,
42
+ formModel: {}
43
+ }
44
+ },
45
+ inject: {
46
+ context: {
47
+ default: () => ({})
48
+ },
49
+ [CONTEXT]: {
50
+ default: () => (() => {})
51
+ }
52
+ },
53
+ computed: {
54
+ currentExposed () {
55
+ return {
56
+ formModel: this.formModels(),
57
+ validateFields: this.validateFields,
58
+ setFieldsValue: this.setFieldsValue,
59
+ submitForm: this.submitRequestTrigger
60
+ }
61
+ },
62
+ globalDisabled () {
63
+ return this.executeExpression(this.disabled)
64
+ },
65
+ assignAttrForEvents () {
66
+ const events = this.footerMetaElements.reduce((ret, ele) => {
67
+ ret[ele.eventName] = (e) => {
68
+ const { exposed = {} } = e
69
+ Object.assign(exposed, { ...this.currentExposed })
70
+ this.$emit(ele.eventName || 'click', { ...e, formModel: this.formModels() })
71
+ }
72
+ return ret
73
+ }, {})
74
+ return {
75
+ ...events,
76
+ [BUILT_IN_EVENT_NAMES.SUBMIT]: this[BUILT_IN_EVENT_NAMES.SUBMIT],
77
+ [BUILT_IN_EVENT_NAMES.CANCEL]: this[BUILT_IN_EVENT_NAMES.CANCEL]
78
+ }
79
+ },
80
+ expressionData () {
81
+ return {
82
+ _route: this.$route.query,
83
+ _routeMeta: this.$route.meta
84
+ }
85
+ },
86
+ formRef () {
87
+ return uuidv4()
88
+ },
89
+ buttonGroupMeta () {
90
+ const { footerMeta = {} } = this.meta
91
+ return footerMeta
92
+ },
93
+ footerMetaElements () {
94
+ const { elements = [] } = this.buttonGroupMeta
95
+ if (type.isFunction(elements)) {
96
+ return elements.call(this)
97
+ }
98
+ return elements
99
+ },
100
+ buildButtonGroupMeta () {
101
+ return { ...this.buttonGroupMeta, elements: this.footerMetaElements }
102
+ },
103
+ formMeta () {
104
+ const { formMeta = {} } = this.meta
105
+ return formMeta
106
+ },
107
+ preRequest () {
108
+ const { preRequest } = this.formMeta
109
+ return preRequest
110
+ },
111
+ infoRequest () {
112
+ const { infoRequest } = this.formMeta
113
+ return infoRequest
114
+ },
115
+ submitRequest () {
116
+ const { submitRequest } = this.formMeta
117
+ return submitRequest
118
+ },
119
+ elements () {
120
+ const { elements = [] } = this.formMeta
121
+ return elements
122
+ },
123
+ modalSize () {
124
+ const { size } = this.meta
125
+ return size ? size : this.size
126
+ },
127
+ modalTitle () {
128
+ const { title } = this.meta
129
+ return title ? title : this.title
130
+ },
131
+ exposedMethods () {
132
+ return {
133
+ [BUILT_IN_METHODS_NAMES.CLOSE_MODAL]: this[BUILT_IN_METHODS_NAMES.CLOSE_MODAL]
134
+ }
135
+ },
136
+ contextData () {
137
+ return this[CONTEXT].call(this)
138
+ }
139
+ },
140
+ watch: {
141
+ value: {
142
+ async handler (value) {
143
+ this.innerValue = value
144
+ },
145
+ immediate: true
146
+ }
147
+ },
148
+ methods: {
149
+ async formMounted (ref) {
150
+ const { setFormModel } = ref
151
+ await this.preRequestTrigger({ setFormModel })
152
+ await this.infoRequestTrigger({ setFormModel })
153
+ },
154
+ [BUILT_IN_METHODS_NAMES.CLOSE_MODAL] () {
155
+ this.innerValue = false
156
+ this.$emit('change', this.innerValue)
157
+ },
158
+ formModels () {
159
+ return this.$refs[this.formRef] ? this.$refs[this.formRef].getFieldsValue() : {}
160
+ },
161
+ execFieldMap (fieldMap = {}, dataSource = {}) {
162
+ const contxtData = this[CONTEXT].call(this)
163
+ const { exposed = {} } = contxtData
164
+ const ret = parseFieldMap(fieldMap, { _route: this.$route.query, exposed: exposed, ...exposed, ...dataSource})
165
+ return ret
166
+ },
167
+ executeExpression (expression, dataSource = {}) {
168
+ if (type.isBool(expression)) return expression
169
+ if (type.isEmpty(expression)) return false
170
+ return parse(expression, { ...this.expressionData, ...this.formModels(), ...dataSource })
171
+ },
172
+ async submitRequestTrigger (props = {}) {
173
+ const { exposed = {} } = this.contextData
174
+ const { requestTableData } = exposed
175
+ const { url, requestType, headers = {}, params = {}, fieldMap = {} } = this.submitRequest
176
+ if (!url) return
177
+ const ret = await net[requestType.toLowerCase()](url, { ...params, ...this.execFieldMap(fieldMap, { ...this.formModels() }), ...this.formModels() }, { headers }).then(resp => {
178
+ this.$emit(BUILT_IN_EVENT_NAMES.SUBMIT, { ...props, formModel: { ...this.formModels(), ...resp.data || {} } })
179
+ requestTableData && requestTableData()
180
+ this.innerValue = false
181
+ this.$emit('change', this.innerValue)
182
+ return resp.data
183
+ })
184
+ return ret
185
+ },
186
+ async infoRequestTrigger ({ setFormModel }) {
187
+ if (PAGE_STATUS.CREATE == this.routeMetaMode) return
188
+ if (!this.infoRequest) return
189
+ const { url, requestType, params = {}, fieldMap = {}, headers = {} } = this.infoRequest
190
+ if (!url) return
191
+ net[requestType.toLowerCase()](url, { ...params, ...this.execFieldMap(fieldMap) }, { ...headers }).then(resp => {
192
+ const { data = {} } = resp
193
+ this.setFieldsValue(data)
194
+ setFormModel(data)
195
+ this.$emit(RESERVE_EVENT_NAMES.INIT_FORM, { ...data })
196
+ })
197
+ },
198
+ async preRequestTrigger ({ setFormModel }) {
199
+ const { url, requestType = 'GET', params = {}, fieldMap = {}, headers = {} } = this.preRequest
200
+ if (!url) return
201
+ const { data } = await net[requestType.toLowerCase()](url, { ...params, ...this.execFieldMap(fieldMap) }, { ...headers })
202
+ this.setFieldsValue(data)
203
+ setFormModel(data)
204
+ this.$emit(RESERVE_EVENT_NAMES.INIT_FORM, { ...data })
205
+ },
206
+ setFieldsValue (props) {
207
+ this.$nextTick(() => {
208
+ this.$refs[this.formRef].setFieldsValue(props)
209
+ })
210
+ },
211
+ validateFields () {
212
+ return this.$refs[this.formRef].validateFields()
213
+ },
214
+ [BUILT_IN_EVENT_NAMES.SUBMIT] (props = {}) {
215
+ if (this.globalDisabled) return
216
+ const status = this.$refs[this.formRef].validateFields()
217
+ if (status) {
218
+ //TODO fieldMap
219
+ return this.submitRequestTrigger(props)
220
+ } else {
221
+ return false
222
+ }
223
+ },
224
+ [BUILT_IN_EVENT_NAMES.CANCEL] (props = {}) {
225
+ this.innerValue = false
226
+ this.$emit('change', this.innerValue)
227
+ this.$emit(BUILT_IN_EVENT_NAMES.CANCEL, { ...props })
228
+ }
229
+ }
230
+ }
231
+ </script>
@@ -0,0 +1,5 @@
1
+ import EleImgCrop from './src/index.vue'
2
+
3
+ EleImgCrop.install = Vue => Vue.component(EleImgCrop.name, EleImgCrop)
4
+
5
+ export default EleImgCrop
@@ -0,0 +1,299 @@
1
+ <template>
2
+ <div>
3
+ <ele-modal
4
+ :ref="getEleModal"
5
+ :title="title"
6
+ :cancelText="cancelText"
7
+ :maskClosable="maskClosable"
8
+ v-on="$listeners"
9
+ :size="size"
10
+ :value="value"
11
+ @ok="handleOk"
12
+ @cancel="handleCancel"
13
+ :showDefaultFooter="true"
14
+ >
15
+ <div class="ele-imgCrop__wrapper">
16
+ <div class="ele-imgCrop__left ele-imgCrop__item">
17
+ <div class="ele-imgCrop__noImg">
18
+ <ele-upload v-if="!fileId" v-bind="uploadFileConfig" class="ele-img-crop__upload" @on-success="onUploadFileSuccess" icon="inbox" url="api/zuul/api-file/workbench/file"></ele-upload>
19
+ <template v-else>
20
+ <img :ref="leftImage" class="img-crop-left__image" :src="imageUrl" alt="">
21
+ </template>
22
+ </div>
23
+ <div class="margin-t-8">
24
+ <span v-if="imgtips" class="ele-imgCrop__font1 ele-imgCrop__tips" :class="isFail? 'ele-imgCrop__error' : ''">{{ imgtips }}</span>
25
+ <template v-else>
26
+ <span class="ele-imgCrop__font1">{{ fileName }}</span>
27
+ <a-icon v-if="fileId || fileName" @click="handleClickDeleteFile" type="close" style="cursor: pointer;float: right; line-height: 24px;"/>
28
+ </template>
29
+ </div>
30
+ </div>
31
+ <div class="ele-imgCrop__right ele-imgCrop__item">
32
+ <span v-if="!fileId" class="ele-imgCrop__font2">左侧上传图片后可预览</span>
33
+ <template v-else>
34
+ <img class="img-crop-right__image" :src="previewBase" alt="">
35
+ </template>
36
+ </div>
37
+ </div>
38
+ </ele-modal>
39
+ </div>
40
+ </template>
41
+
42
+ <script>
43
+ import { v4 as uuidv4 } from 'uuid'
44
+ import Cropper from 'cropperjs'
45
+ import { util, net } from '@idooel/shared'
46
+ export default {
47
+ name: 'ele-modal-img-crop',
48
+ model: {
49
+ event: 'input',
50
+ prop: 'value'
51
+ },
52
+ props: {
53
+ title: {
54
+ type: String,
55
+ default: '图像裁剪'
56
+ },
57
+ uploadFileConfig: {
58
+ type: Object,
59
+ default: () => {
60
+ return {
61
+ size: 10,
62
+ accept: '*',
63
+ byteConversion: 1024 * 1024
64
+ }
65
+ }
66
+ },
67
+ imageId: {
68
+ type: String
69
+ },
70
+ maskClosable: {
71
+ type: Boolean,
72
+ default () {
73
+ return false
74
+ }
75
+ },
76
+ size: {
77
+ type: String,
78
+ default () {
79
+ return 'big'
80
+ }
81
+ },
82
+ value: {
83
+ type: Boolean,
84
+ default () {
85
+ return false
86
+ }
87
+ },
88
+ cropperConfig: {
89
+ type: Object,
90
+ default: () => {
91
+ return {
92
+ aspectRatio: 16 / 9
93
+ }
94
+ }
95
+ }
96
+ },
97
+ data () {
98
+ return {
99
+ haveImg: false,
100
+ imgtips: null,
101
+ isFail: false,
102
+ cancelText: '取消',
103
+ fileName: null,
104
+ fileId: null,
105
+ previewBase: null,
106
+ cropper: null
107
+ }
108
+ },
109
+ computed: {
110
+ leftImage () {
111
+ return uuidv4()
112
+ },
113
+ imageUrl () {
114
+ return `/api-file/workbench/file/stream/${this.fileId}?origin=true`
115
+ },
116
+ getEleModal () {
117
+ return uuidv4()
118
+ }
119
+ },
120
+ watch: {
121
+ value: {
122
+ handler (value) {
123
+ this.fileId = this.imageId
124
+ if (value && this.fileId) {
125
+ setTimeout(() => {
126
+ this.initCropper()
127
+ })
128
+ }
129
+ },
130
+ immediate: true
131
+ }
132
+ },
133
+ methods: {
134
+ handleCancel () {
135
+ this.$emit('input', false)
136
+ this.$emit('change', this.fileId)
137
+ },
138
+ handleClickDeleteFile () {
139
+ this.fileId = null
140
+ this.fileName = null
141
+ this.cropper && this.cropper.destroy()
142
+ },
143
+ blobToFile(blob, fileName = 'file.png') {
144
+ return new File([blob], fileName, {
145
+ type: blob.type,
146
+ lastModified: Date.now()
147
+ })
148
+ },
149
+ handleOk () {
150
+ this.cropper && this.cropper.getCroppedCanvas().toBlob(async (blob) => {
151
+ await this.uploadFile(this.blobToFile(blob, this.fileName))
152
+ this.$emit('input', false)
153
+ this.$emit('change', this.fileId)
154
+ })
155
+ },
156
+ async uploadFile (file) {
157
+ const formData = new FormData()
158
+ formData.append('serviceCode', 'cover-image')
159
+ formData.append('_t', Math.random())
160
+ formData.append('file', file)
161
+ await net.post(
162
+ 'zuul/api-file/workbench/file' + '?_csrf=' + localStorage.getItem('token'),
163
+ formData
164
+ ).then((resp) => {
165
+ const { data: { fileID } } = resp
166
+ this.fileId = fileID
167
+ })
168
+ },
169
+ initCropper () {
170
+ let previewReady = false
171
+ this.cropper = new Cropper(this.$refs[this.leftImage], {
172
+ aspectRatio: this.cropperConfig.aspectRatio,
173
+ ready: () => {
174
+ previewReady = true
175
+ },
176
+ crop: util.debounce(() => {
177
+ if (!previewReady) {
178
+ return
179
+ }
180
+ this.previewBase = this.cropper.getCroppedCanvas().toDataURL()
181
+ }, 200)
182
+ })
183
+ },
184
+ onUploadFileSuccess (props) {
185
+ const { response: { data: { fileID } }, name } = props
186
+ this.fileId = fileID
187
+ this.fileName = name
188
+ this.$nextTick(() => {
189
+ this.initCropper()
190
+ })
191
+ }
192
+ }
193
+ }
194
+ </script>
195
+
196
+ <style lang="scss" scoped>
197
+ ::v-deep .ant-modal-body {
198
+ padding: 16px;
199
+ }
200
+ ::v-deep .ant-modal-header {
201
+ padding: 16px;
202
+ }
203
+ .ele-imgCrop__wrapper {
204
+ display: flex;
205
+ gap: 16px;
206
+ justify-content: center;
207
+ margin-bottom: 30px;
208
+ .ele-imgCrop__left {
209
+ .ele-imgCrop__noImg {
210
+ display: flex;
211
+ flex-direction: column;
212
+ justify-content: center;
213
+ align-items: center;
214
+ width: 100%;
215
+ height: 100%;
216
+ position: relative;
217
+ .img-crop-left__image {
218
+ width: 100%;
219
+ height: 100%;
220
+ }
221
+ .ele-img-crop__upload {
222
+ width: 100%;
223
+ height: 100%;
224
+ ::v-deep .ele-upload__inner {
225
+ height: 100%;
226
+ border: unset;
227
+ background: transparent !important;
228
+ .ele-upload__area {
229
+ display: flex;
230
+ flex-direction: column;
231
+ height: 100%;
232
+ align-items: center;
233
+ justify-content: center;
234
+ .ele-upload__area--text {
235
+ margin-top: 16px;
236
+ display: flex;
237
+ flex-direction: column;
238
+ align-items: center;
239
+ }
240
+ }
241
+ }
242
+ }
243
+ .ele-imgCrop__font1 {
244
+ color: var(--idoole-black-088);
245
+ font-size: 16px;
246
+ line-height: 24px !important;
247
+ }
248
+ .ele-imgCrop__font2 {
249
+ color: var(--idoole-black-06);
250
+ font-size: 14px;
251
+ line-height: 22px;
252
+ }
253
+ }
254
+ .ele-imgCrop__update {
255
+ position: absolute;
256
+ top: 0;
257
+ left: 0;
258
+ width: 100%;
259
+ height: 100%;
260
+ opacity: 0;
261
+ cursor: pointer;
262
+ }
263
+ }
264
+ .ele-imgCrop__right {
265
+ position: relative;
266
+ span {
267
+ position: absolute;
268
+ top: 50%;
269
+ left: 50%;
270
+ transform: translate(-50%, -50%);
271
+ }
272
+ .img-crop-right__image {
273
+ width: 100%;
274
+ height: 100%;
275
+ }
276
+ }
277
+ .ele-imgCrop__item {
278
+ width: 480px;
279
+ height: 300px;
280
+ border-radius: 2px;
281
+ border: 1px dashed var(--idooel-form-title-border-color);
282
+ background: var(--idooel-form-upload-bg-color);
283
+ }
284
+ }
285
+ .ele-imgCrop__tips {
286
+ float: left;
287
+ width: 80%;
288
+ }
289
+ .ele-imgCrop__error {
290
+ color: var(--idooel-form-border-err-color) !important;
291
+ }
292
+ .ele-imgCrop__error2 {
293
+ color: var(--idooel-img-crop-err-color) !important;
294
+ }
295
+ .ele-imgCrop__icon {
296
+ font-size: 48px;
297
+ color: var(--idooel-link-06);
298
+ }
299
+ </style>
@@ -0,0 +1,5 @@
1
+ import EleModalTable from './src/index.vue'
2
+
3
+ EleModalTable.install = Vue => Vue.component(EleModalTable.name, EleModalTable)
4
+
5
+ export default EleModalTable
@@ -0,0 +1,156 @@
1
+ <template>
2
+ <ele-modal
3
+ :title="buildTitle"
4
+ v-on="assignAttrForEvents"
5
+ :button-group-meta="buildButtonGroupMeta"
6
+ :value="value"
7
+ :size="size">
8
+ <ele-tree-table-model
9
+ :over-height="156"
10
+ v-on="treeTableListeners"
11
+ @on-change-table-selection="onChangeTableSelection"
12
+ @x:refresh-exposed="onAbstractEvent"
13
+ v-bind="buildMeta">
14
+ <template v-if="$slots['sub-center']" #sub-center>
15
+ <slot name="sub-center"></slot>
16
+ </template>
17
+ </ele-tree-table-model>
18
+ </ele-modal>
19
+ </template>
20
+
21
+ <script>
22
+ import { type } from '@idooel/shared'
23
+ import { CONTEXT } from '../../../utils'
24
+ export default {
25
+ name: 'ele-modal-table',
26
+ model: {
27
+ event: 'change',
28
+ prop: 'value'
29
+ },
30
+ props: {
31
+ value: {
32
+ type: Boolean,
33
+ default: false
34
+ },
35
+ title: {
36
+ type: String
37
+ },
38
+ size: {
39
+ type: String,
40
+ default: 'big'
41
+ },
42
+ meta: {
43
+ type: Object,
44
+ default: () => ({})
45
+ }
46
+ },
47
+ data() {
48
+ return {
49
+ currentTableSelection: null,
50
+ currentExposed: {}
51
+ }
52
+ },
53
+ inject: {
54
+ [CONTEXT]: {
55
+ default: () => (() => ({}))
56
+ }
57
+ },
58
+ computed: {
59
+ buildMeta () {
60
+ const { title, ...rest } = this.meta
61
+ return rest
62
+ },
63
+ buildTitle () {
64
+ return this.title || this.meta.title
65
+ },
66
+ callContext () {
67
+ return this[CONTEXT].call(this)
68
+ },
69
+ exposed () {
70
+ const mergeExposed = Object.assign({}, this.callContext.exposed, this.currentExposed)
71
+ return {
72
+ closeModal: this.closeModal,
73
+ currentTableSelection: this.currentTableSelection,
74
+ ...this.callContext,
75
+ exposed: {
76
+ ...mergeExposed,
77
+ setModalTable: this.setModalTable,
78
+ showModalTable: this.showModalTable,
79
+ closeModalTable: this.closeModalTable
80
+ }
81
+ }
82
+ },
83
+ assignAttrForEvents () {
84
+ const events = this.footerMetaElements.reduce((ret, ele) => {
85
+ ret[ele.eventName] = (e) => {
86
+ this.$emit(ele.eventName || 'click', { ...e, ...this.exposed })
87
+ }
88
+ return ret
89
+ }, {})
90
+ return {
91
+ ...this.$listeners,
92
+ ...events
93
+ }
94
+ },
95
+ treeTableListeners () {
96
+ const events = this.treeTableButtonGroupElements.reduce((ret, ele) => {
97
+ ret[ele.eventName] = (e) => {
98
+ this.$emit(ele.eventName || 'click', { ...e, exposed: this.exposed })
99
+ }
100
+ return ret
101
+ }, {})
102
+ return {
103
+ ...this.$listeners,
104
+ ...events
105
+ }
106
+ },
107
+ footerMetaElements () {
108
+ const { elements = [] } = this.buttonGroupMeta
109
+ if (type.isFunction(elements)) {
110
+ return elements.call(this)
111
+ }
112
+ return elements
113
+ },
114
+ treeTableButtonGroupElements () {
115
+ const { buttonGroupMeta = {} } = this.meta
116
+ const { elements = [] } = buttonGroupMeta
117
+ if (type.isFunction(elements)) {
118
+ return elements.call(this)
119
+ }
120
+ return elements
121
+ },
122
+ buildButtonGroupMeta () {
123
+ return { ...this.buttonGroupMeta, elements: this.footerMetaElements }
124
+ },
125
+ buttonGroupMeta () {
126
+ const { footerMeta = {} } = this.meta
127
+ return footerMeta
128
+ }
129
+ },
130
+ methods: {
131
+ closeModal () {
132
+ this.$emit('change', false)
133
+ },
134
+ setModalTable (arg = false) {
135
+ this.$emit('change', arg)
136
+ },
137
+ showModalTable () {
138
+ this.$emit('change', true)
139
+ },
140
+ closeModalTable () {
141
+ this.$emit('change', false)
142
+ },
143
+ onChangeTableSelection (selection) {
144
+ this.currentTableSelection = selection
145
+ },
146
+ onAbstractEvent (props = {}) {
147
+ const { exposed } = props
148
+ this.currentExposed = Object.assign({}, exposed)
149
+ }
150
+ }
151
+ }
152
+ </script>
153
+
154
+ <style lang="scss" scoped>
155
+
156
+ </style>
@@ -0,0 +1,5 @@
1
+ import EleModalTree from './src/index.vue'
2
+
3
+ EleModalTree.install = Vue => Vue.component(EleModalTree.name, EleModalTree)
4
+
5
+ export default EleModalTree