@idooel/components 0.0.2 → 0.0.3-beta.1

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 (108) hide show
  1. package/README.md +98 -98
  2. package/dist/@idooel/components.esm.js +3499 -1698
  3. package/dist/@idooel/components.umd.js +3522 -1723
  4. package/jsconfig.json +7 -7
  5. package/package.json +64 -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 +222 -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 +131 -120
  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 -230
  31. package/packages/composite-components/modal-img-crop/index.js +4 -4
  32. package/packages/composite-components/modal-img-crop/src/index.vue +298 -298
  33. package/packages/composite-components/modal-table/index.js +4 -4
  34. package/packages/composite-components/modal-table/src/index.vue +150 -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 +239 -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 -171
  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 +393 -318
  48. package/packages/icon/index.js +4 -4
  49. package/packages/icon/src/index.vue +31 -31
  50. package/packages/index.js +162 -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/meta/provider.js +4 -0
  58. package/packages/modal/index.js +4 -4
  59. package/packages/modal/src/index.vue +184 -184
  60. package/packages/models/form-group-model/index.js +4 -4
  61. package/packages/models/form-group-model/src/index.vue +271 -273
  62. package/packages/models/form-model/index.js +4 -4
  63. package/packages/models/form-model/src/index.vue +353 -232
  64. package/packages/models/step-model/index.js +4 -4
  65. package/packages/models/step-model/src/index.vue +224 -224
  66. package/packages/models/tree-table-model/index.js +4 -4
  67. package/packages/models/tree-table-model/src/index.vue +1376 -689
  68. package/packages/pagination/index.js +5 -0
  69. package/packages/pagination/src/index.vue +372 -0
  70. package/packages/radio/index.js +4 -4
  71. package/packages/radio/src/index.vue +56 -56
  72. package/packages/select/index.js +4 -4
  73. package/packages/select/src/index.vue +113 -105
  74. package/packages/select-entity/index.js +4 -4
  75. package/packages/select-entity/src/index.vue +119 -119
  76. package/packages/table/index.js +4 -4
  77. package/packages/table/src/action.vue +176 -172
  78. package/packages/table/src/index.vue +604 -289
  79. package/packages/tabs/index.js +4 -4
  80. package/packages/tabs/src/index.vue +55 -55
  81. package/packages/text/index.js +4 -4
  82. package/packages/text/src/index.vue +47 -47
  83. package/packages/text-editor/index.js +4 -4
  84. package/packages/text-editor/src/index.vue +72 -72
  85. package/packages/textarea/index.js +4 -4
  86. package/packages/textarea/src/index.vue +57 -57
  87. package/packages/theme/form.scss +21 -21
  88. package/packages/theme/index.scss +43 -42
  89. package/packages/theme/overrid.scss +7 -7
  90. package/packages/theme/styleClass.scss +2 -2
  91. package/packages/theme/variables.scss +55 -55
  92. package/packages/timeline/index.js +4 -4
  93. package/packages/timeline/src/index.vue +257 -257
  94. package/packages/tpl/index.js +4 -4
  95. package/packages/tpl/src/index.vue +55 -55
  96. package/packages/tree/index.js +4 -4
  97. package/packages/tree/src/TreeNode.vue +29 -29
  98. package/packages/tree/src/index.vue +101 -101
  99. package/packages/tree-select/index.js +4 -4
  100. package/packages/tree-select/src/index.vue +142 -142
  101. package/packages/upload/index.js +4 -4
  102. package/packages/upload/src/index.vue +998 -444
  103. package/packages/utils/index.js +67 -63
  104. package/packages/utils/vue2-expr.js +72 -0
  105. package/scripts/rollup.config.js +42 -42
  106. package/scripts/rollup.esm.config.js +11 -11
  107. package/scripts/rollup.umd.config.js +17 -14
  108. package/vitest.config.js +17 -0
@@ -1,233 +1,354 @@
1
- <template>
2
- <div class="form__model--wrapper">
3
- <div class="form-model__title" v-if="title">
4
- {{ title }}
5
- </div>
6
- <div class="form-model__content">
7
- <ele-alert style="margin-bottom: 16px;" v-if="alertMeta" v-bind="alertMeta"></ele-alert>
8
- <ele-form :ref="formRef" @change="onChangeFormStatus($event)" :elements="elements" :disabled="globalDisabled"></ele-form>
9
- </div>
10
- <div class="form-model__footer" v-if="footerMeta">
11
- <ele-button-group v-on="assignAttrForEvents" :data-source="footerElements"></ele-button-group>
12
- </div>
13
- </div>
14
- </template>
15
-
16
- <script>
17
- import { BUILT_IN_EVENT_NAMES, parseFieldMap, RESERVE_EVENT_NAMES, PAGE_STATUS, CONTEXT, BUILT_IN_METHODS_NAMES } from '../../../utils'
18
- import { v4 as uuidv4 } from 'uuid'
19
- import { net, type } from '@idooel/shared'
20
- import { parse } from '@idooel/expression'
21
- export default {
22
- name: 'ele-form-model',
23
- props: {
24
- disabled: {
25
- type: [Boolean, String],
26
- default: '_routeMeta.disabled'
27
- },
28
- title: {
29
- type: String
30
- },
31
- formMeta: {
32
- type: Object
33
- },
34
- footerMeta: {
35
- type: Object
36
- }
37
- },
38
- data() {
39
- return {}
40
- },
41
- provide () {
42
- return {
43
- [CONTEXT]: () => {
44
- return {
45
- exposed: this.exposed
46
- }
47
- }
48
- }
49
- },
50
- computed: {
51
- globalDisabled () {
52
- return this.executeExpression(this.disabled)
53
- },
54
- formRef () {
55
- return uuidv4()
56
- },
57
- exposed () {
58
- return {
59
- setFieldsValue: this.setFieldsValue,
60
- validateFields: this.validateFields,
61
- getFieldsValue: this.getFieldsValue,
62
- route: this.$route,
63
- [BUILT_IN_METHODS_NAMES.SUBMIT_FORM]: this.submitRequestTrigger
64
- }
65
- },
66
- assignAttrForEvents () {
67
- const events = this.footerElements.reduce((ret, ele) => {
68
- ret[ele.eventName] = (e) => {
69
- this.$emit(ele.eventName || 'click', { ...e, formModel: this.formModels(), exposed: this.exposed })
70
- }
71
- return ret
72
- }, {})
73
- return {
74
- ...this.$listeners,
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
- elements () {
81
- const { elements } = this.formMeta
82
- return elements
83
- },
84
- preRequest () {
85
- const { preRequest = {} } = this.formMeta
86
- return preRequest
87
- },
88
- infoRequest () {
89
- const { infoRequest = {} } = this.formMeta
90
- return infoRequest
91
- },
92
- alertMeta () {
93
- const { alert = {} } = this.formMeta
94
- return type.isEmpty(alert) ? null : alert
95
- },
96
- submitRequest () {
97
- const { submitRequest = {} } = this.formMeta
98
- return submitRequest
99
- },
100
- footerElements () {
101
- const { elements } = this.footerMeta
102
- return elements.call(this)
103
- },
104
- expressionData () {
105
- return {
106
- _route: this.$route.query,
107
- _routeMeta: this.$route.meta
108
- }
109
- },
110
- routeMetaMode () {
111
- return this.$route.meta.mode
112
- }
113
- },
114
- methods: {
115
- collectDefaultValues () {
116
- const ret = this.elements.reduce((ret, props) => {
117
- const { name, defaultValue } = props
118
- if (defaultValue) {
119
- ret[name] = defaultValue
120
- }
121
- return ret
122
- }, {})
123
- return ret
124
- },
125
- onChangeFormStatus (props) {
126
- this.$emit(RESERVE_EVENT_NAMES.WATCH_FORM_STATUS, { ...props })
127
- },
128
- formModels (fieldNames) {
129
- return this.$refs[this.formRef] ? this.$refs[this.formRef].getFieldsValue(fieldNames) : {}
130
- },
131
- executeExpression (expression, dataSource = {}) {
132
- if (type.isBool(expression)) return expression
133
- if (type.isEmpty(expression)) return false
134
- return parse(expression, { ...this.expressionData, ...this.formModels(), ...dataSource })
135
- },
136
- execFieldMap (fieldMap = {}, dataSource = {}) {
137
- const ret = parseFieldMap(fieldMap, { ...this.expressionData, ...dataSource})
138
- return ret
139
- },
140
- async submitRequestTrigger (props = {}) {
141
- const { url, requestType, headers = {}, params = {}, fieldMap = {} } = this.submitRequest
142
- const currentUrl = this.executeExpressionForUrl(url)
143
- if (!currentUrl) return
144
- const ret = await net[requestType.toLowerCase()](currentUrl, { ...params, ...this.execFieldMap(fieldMap, { ...this.formModels() }), ...this.formModels() }, { headers }).then(resp => {
145
- this.$emit(BUILT_IN_EVENT_NAMES.SUBMIT, { ...props, formModel: { ...this.formModels(), ...resp.data || {} } })
146
- return resp.data
147
- })
148
- return ret
149
- },
150
- async infoRequestTrigger () {
151
- if (PAGE_STATUS.CREATE == this.routeMetaMode) return
152
- const { url, requestType, params = {}, fieldMap = {}, headers = {} } = this.infoRequest
153
- const currentUrl = this.executeExpressionForUrl(url)
154
- if (!currentUrl) return
155
- net[requestType.toLowerCase()](currentUrl, { ...params, ...this.execFieldMap(fieldMap) }, { ...headers }).then(resp => {
156
- const { data = {} } = resp
157
- this.setFieldsValue(data)
158
- this.$emit(RESERVE_EVENT_NAMES.INIT_FORM, { ...data })
159
- })
160
- },
161
- async preRequestTrigger () {
162
- const { url, requestType = 'GET', params = {}, fieldMap = {}, headers = {} } = this.preRequest
163
- const currentUrl = this.executeExpressionForUrl(url)
164
- if (!currentUrl) return
165
- const { data } = await net[requestType.toLowerCase()](currentUrl, { ...params, ...this.execFieldMap(fieldMap) }, { ...headers })
166
- this.setFieldsValue(data)
167
- this.$emit(RESERVE_EVENT_NAMES.INIT_FORM, { ...data })
168
- },
169
- executeExpressionForUrl (url) {
170
- return type.isApi(url) ? url : this.executeExpression(url)
171
- },
172
- setFieldsValue (props) {
173
- this.$refs[this.formRef].setFieldsValue(props)
174
- },
175
- getFieldsValue (fieldNames) {
176
- return this.$refs[this.formRef].getFieldsValue(fieldNames)
177
- },
178
- validateFields () {
179
- return this.$refs[this.formRef].validateFields()
180
- },
181
- [BUILT_IN_EVENT_NAMES.SUBMIT] (props = {}) {
182
- if (this.globalDisabled) return
183
- const status = this.$refs[this.formRef].validateFields()
184
- if (status) {
185
- //TODO fieldMap
186
- return this.submitRequestTrigger(props)
187
- } else {
188
- return false
189
- }
190
- },
191
- [BUILT_IN_EVENT_NAMES.CANCEL] (props = {}) {
192
- this.$emit(BUILT_IN_EVENT_NAMES.CANCEL, { ...props })
193
- }
194
- },
195
- async mounted() {
196
- this.setFieldsValue(this.collectDefaultValues())
197
- await this.preRequestTrigger()
198
- await this.infoRequestTrigger()
199
- this.$emit(RESERVE_EVENT_NAMES.INIT_FORM, { exposed: this.exposed })
200
- }
201
- }
202
- </script>
203
-
204
- <style lang="scss" scoped>
205
- .form__model--wrapper {
206
- width: 100%;
207
- height: 100%;
208
- overflow: auto;
209
- background: #fff;
210
- .form-model__title {
211
- height: 56px;
212
- padding: 0 16px;
213
- display: flex;
214
- flex-direction: row;
215
- align-items: center;
216
- border-bottom: 1px solid var(--idooel-form-title-border-color);
217
- }
218
- .form-model__content {
219
- padding: 16px;
220
- }
221
- .form-model__footer {
222
- /* width: 100%; */
223
- height: 64px;
224
- position: fixed;
225
- bottom: 0;
226
- display: flex;
227
- float: right;
228
- flex-direction: row;
229
- align-items: center;
230
- justify-content: end;
231
- }
232
- }
1
+ <template>
2
+ <div class="form__model--wrapper">
3
+ <div class="form-model__title" v-if="title">
4
+ {{ title }}
5
+ </div>
6
+ <div class="form-model__content">
7
+ <ele-alert style="margin-bottom: 16px;" v-if="alertMeta" v-bind="alertMeta"></ele-alert>
8
+ <ele-form :ref="formRef" @change="onChangeFormStatus($event)" :elements="elements" :disabled="globalDisabled"></ele-form>
9
+ </div>
10
+ <div class="form-model__footer" v-if="footerMeta">
11
+ <ele-button-group v-on="assignAttrForEvents" :data-source="footerElements"></ele-button-group>
12
+ </div>
13
+ </div>
14
+ </template>
15
+
16
+ <script>
17
+ import { BUILT_IN_EVENT_NAMES, RESERVE_EVENT_NAMES, PAGE_STATUS, CONTEXT, BUILT_IN_METHODS_NAMES } from '../../../utils'
18
+ import { v4 as uuidv4 } from 'uuid'
19
+ import { net, type } from '@idooel/shared'
20
+ import { parse } from '@idooel/expression'
21
+ import { createFormModel } from '@idooel/runtime-context'
22
+ export default {
23
+ name: 'ele-form-model',
24
+ props: {
25
+ disabled: {
26
+ type: [Boolean, String],
27
+ default: '_routeMeta.disabled'
28
+ },
29
+ title: {
30
+ type: String
31
+ },
32
+ formMeta: {
33
+ type: Object
34
+ },
35
+ footerMeta: {
36
+ type: Object
37
+ }
38
+ },
39
+ inject: {
40
+ parentScopeId: {
41
+ default: () => (() => null)
42
+ },
43
+ parentEvalExpression: {
44
+ from: 'evalExpression',
45
+ default: () => (() => undefined)
46
+ }
47
+ },
48
+ data() {
49
+ return {
50
+ model: null,
51
+ unsubscribeFormData: null,
52
+ isSyncingFromModel: false
53
+ }
54
+ },
55
+ provide () {
56
+ return {
57
+ evalExpression: this.parseExpression,
58
+ parentScopeId: () => this.model?.scopeId,
59
+ [CONTEXT]: () => {
60
+ return {
61
+ exposed: this.exposed
62
+ }
63
+ }
64
+ }
65
+ },
66
+ computed: {
67
+ globalDisabled () {
68
+ return this.parseExpression(this.disabled)
69
+ },
70
+ formRef () {
71
+ return uuidv4()
72
+ },
73
+ exposed () {
74
+ return {
75
+ setFieldsValue: this.setFieldsValue,
76
+ validateFields: this.validateFields,
77
+ getFieldsValue: this.getFieldsValue,
78
+ executeExpressions: this.executeExpressions,
79
+ route: this.$route,
80
+ [BUILT_IN_METHODS_NAMES.SUBMIT_FORM]: this.submitRequestTrigger
81
+ }
82
+ },
83
+ assignAttrForEvents () {
84
+ const events = this.footerElements.reduce((ret, ele) => {
85
+ ret[ele.eventName] = (e) => {
86
+ this.$emit(ele.eventName || 'click', { ...e, formModel: this.formModels(), exposed: this.exposed })
87
+ }
88
+ return ret
89
+ }, {})
90
+ return {
91
+ ...this.$listeners,
92
+ ...events,
93
+ [BUILT_IN_EVENT_NAMES.SUBMIT]: this[BUILT_IN_EVENT_NAMES.SUBMIT],
94
+ [BUILT_IN_EVENT_NAMES.CANCEL]: this[BUILT_IN_EVENT_NAMES.CANCEL]
95
+ }
96
+ },
97
+ elements () {
98
+ const { elements } = this.formMeta
99
+ return elements
100
+ },
101
+ preRequest () {
102
+ const { preRequest = {} } = this.formMeta
103
+ return preRequest
104
+ },
105
+ infoRequest () {
106
+ const { infoRequest = {} } = this.formMeta
107
+ return infoRequest
108
+ },
109
+ alertMeta () {
110
+ const { alert = {} } = this.formMeta
111
+ return type.isEmpty(alert) ? null : alert
112
+ },
113
+ submitRequest () {
114
+ const { submitRequest = {} } = this.formMeta
115
+ return submitRequest
116
+ },
117
+ footerElements () {
118
+ const { elements } = this.footerMeta
119
+ return elements.call(this)
120
+ },
121
+ expressionData () {
122
+ return {
123
+ _route: this.$route.query,
124
+ _routeMeta: this.$route.meta
125
+ }
126
+ },
127
+ routeMetaMode () {
128
+ return this.$route.meta.mode
129
+ }
130
+ },
131
+ created () {
132
+ try {
133
+ const debugName = `FormModel_${uuidv4().slice(0, 8)}`
134
+ this.model = createFormModel(Symbol(debugName))
135
+ if (!this.model) {
136
+ throw new Error('Failed to create form model')
137
+ }
138
+ this.setupModelSubscriptions()
139
+ } catch (error) {
140
+ console.error('Error creating form model:', error)
141
+ this.model = null
142
+ }
143
+ },
144
+ methods: {
145
+ collectDefaultValues () {
146
+ const ret = this.elements.reduce((ret, props) => {
147
+ const { name, defaultValue } = props
148
+ if (defaultValue) {
149
+ ret[name] = defaultValue
150
+ }
151
+ return ret
152
+ }, {})
153
+ return ret
154
+ },
155
+ onChangeFormStatus (props) {
156
+ this.$emit(RESERVE_EVENT_NAMES.WATCH_FORM_STATUS, { ...props })
157
+ if (!this.model || this.isSyncingFromModel) return
158
+ const { value, props: fieldProps } = props || {}
159
+ if (fieldProps && fieldProps.name !== undefined) {
160
+ this.model.setFieldValue(fieldProps.name, value)
161
+ return
162
+ }
163
+ this.model.setFormData(this.formModels())
164
+ },
165
+ formModels (fieldNames) {
166
+ return this.getFieldsValue(fieldNames)
167
+ },
168
+ buildExpressionContext (dataSource = {}) {
169
+ const formData = this.model ? this.model.getFormData() : {}
170
+ return {
171
+ ...this.expressionData,
172
+ ...formData,
173
+ formData,
174
+ exposed: this.exposed,
175
+ ...dataSource
176
+ }
177
+ },
178
+ parseExpression (expression, dataSource = {}) {
179
+ if (type.isBool(expression)) return expression
180
+ if (type.isEmpty(expression)) return false
181
+ const context = this.buildExpressionContext(dataSource)
182
+ if (this.model) {
183
+ try {
184
+ const val = this.model.eval(expression, context)
185
+ if ((val === undefined || val === null) && this.parentEvalExpression) {
186
+ return this.parentEvalExpression(expression, dataSource)
187
+ }
188
+ return val
189
+ } catch (error) {
190
+ console.error(`[FormModel] Expression parsing failed: "${expression}"`, error)
191
+ return undefined
192
+ }
193
+ }
194
+ return parse(expression, context)
195
+ },
196
+ execFieldMap (fieldMap = {}, dataSource = {}) {
197
+ if (!fieldMap || Object.keys(fieldMap).length === 0) {
198
+ return {}
199
+ }
200
+ const ret = {}
201
+ Object.keys(fieldMap).forEach((expression) => {
202
+ const targetKey = fieldMap[expression]
203
+ ret[targetKey] = this.parseExpression(expression, dataSource)
204
+ })
205
+ return ret
206
+ },
207
+ async submitRequestTrigger (props = {}) {
208
+ const { url, requestType, headers = {}, params = {}, fieldMap = {} } = this.submitRequest
209
+ const currentUrl = this.executeExpressionForUrl(url)
210
+ if (!currentUrl) return
211
+ const ret = await net[requestType.toLowerCase()](currentUrl, { ...params, ...this.execFieldMap(fieldMap, { ...this.formModels() }), ...this.formModels() }, { headers }).then(resp => {
212
+ this.$emit(BUILT_IN_EVENT_NAMES.SUBMIT, { ...props, response: resp, formModel: { ...this.formModels(), ...resp.data || {} } })
213
+ return resp.data
214
+ })
215
+ return ret
216
+ },
217
+ async infoRequestTrigger () {
218
+ if (PAGE_STATUS.CREATE == this.routeMetaMode) return
219
+ const { url, requestType, params = {}, fieldMap = {}, headers = {} } = this.infoRequest
220
+ const currentUrl = this.executeExpressionForUrl(url)
221
+ if (!currentUrl) return
222
+ net[requestType.toLowerCase()](currentUrl, { ...params, ...this.execFieldMap(fieldMap) }, { ...headers }).then(resp => {
223
+ const { data = {} } = resp
224
+ this.setFieldsValue(data)
225
+ this.$emit(RESERVE_EVENT_NAMES.INIT_FORM, { ...data })
226
+ })
227
+ },
228
+ async preRequestTrigger () {
229
+ const { url, requestType = 'GET', params = {}, fieldMap = {}, headers = {} } = this.preRequest
230
+ const currentUrl = this.executeExpressionForUrl(url)
231
+ if (!currentUrl) return
232
+ const { data } = await net[requestType.toLowerCase()](currentUrl, { ...params, ...this.execFieldMap(fieldMap) }, { ...headers })
233
+ this.setFieldsValue(data)
234
+ this.$emit(RESERVE_EVENT_NAMES.INIT_FORM, { ...data })
235
+ },
236
+ executeExpressionForUrl (url) {
237
+ return type.isApi(url) ? url : this.parseExpression(url)
238
+ },
239
+ applyFormFields (props = {}) {
240
+ if (!this.$refs[this.formRef]) return
241
+ this.isSyncingFromModel = true
242
+ this.$refs[this.formRef].setFieldsValue(props)
243
+ this.$nextTick(() => {
244
+ this.isSyncingFromModel = false
245
+ })
246
+ },
247
+ setFieldsValue (props = {}) {
248
+ if (this.model) {
249
+ const currentData = this.model.getFormData() || {}
250
+ this.model.setFormData({ ...currentData, ...props })
251
+ }
252
+ this.applyFormFields(props)
253
+ },
254
+ getFieldsValue (fieldNames) {
255
+ if (this.model) {
256
+ const data = this.model.getFormData() || {}
257
+ if (Array.isArray(fieldNames)) {
258
+ return fieldNames.reduce((ret, key) => {
259
+ if (Object.prototype.hasOwnProperty.call(data, key)) {
260
+ ret[key] = data[key]
261
+ }
262
+ return ret
263
+ }, {})
264
+ }
265
+ if (typeof fieldNames === 'string') {
266
+ return data[fieldNames]
267
+ }
268
+ return data
269
+ }
270
+ return this.$refs[this.formRef] ? this.$refs[this.formRef].getFieldsValue(fieldNames) : {}
271
+ },
272
+ setupModelSubscriptions () {
273
+ if (!this.model) {
274
+ console.warn('[FormModel] Model not initialized, cannot setup subscriptions')
275
+ return
276
+ }
277
+ this.unsubscribeFormData = this.model.subscribe('formData', (newValue) => {
278
+ this.applyFormFields(newValue || {})
279
+ })
280
+ },
281
+ cleanupModelSubscriptions () {
282
+ const subscriptions = ['unsubscribeFormData']
283
+ subscriptions.forEach((key) => {
284
+ if (this[key]) {
285
+ this[key]()
286
+ this[key] = null
287
+ }
288
+ })
289
+ },
290
+ executeExpressions () {
291
+ return this.$refs[this.formRef].evalShowExpression()
292
+ },
293
+ validateFields () {
294
+ return this.$refs[this.formRef].validateFields()
295
+ },
296
+ async [BUILT_IN_EVENT_NAMES.SUBMIT] (props = {}) {
297
+ if (this.globalDisabled) return
298
+ const status = await this.$refs[this.formRef].validateFields()
299
+ if (status) {
300
+ //TODO fieldMap
301
+ return this.submitRequestTrigger(props)
302
+ } else {
303
+ return false
304
+ }
305
+ },
306
+ [BUILT_IN_EVENT_NAMES.CANCEL] (props = {}) {
307
+ this.$emit(BUILT_IN_EVENT_NAMES.CANCEL, { ...props })
308
+ }
309
+ },
310
+ async mounted() {
311
+ this.setFieldsValue(this.collectDefaultValues())
312
+ await this.preRequestTrigger()
313
+ await this.infoRequestTrigger()
314
+ this.$emit(RESERVE_EVENT_NAMES.INIT_FORM, { exposed: this.exposed })
315
+ },
316
+ destroyed () {
317
+ if (this.model) {
318
+ this.cleanupModelSubscriptions()
319
+ this.model.cleanup()
320
+ }
321
+ }
322
+ }
323
+ </script>
324
+
325
+ <style lang="scss" scoped>
326
+ .form__model--wrapper {
327
+ width: 100%;
328
+ height: 100%;
329
+ overflow: auto;
330
+ background: #fff;
331
+ .form-model__title {
332
+ height: 56px;
333
+ padding: 0 16px;
334
+ display: flex;
335
+ flex-direction: row;
336
+ align-items: center;
337
+ border-bottom: 1px solid var(--idooel-form-title-border-color);
338
+ }
339
+ .form-model__content {
340
+ padding: 16px;
341
+ }
342
+ .form-model__footer {
343
+ /* width: 100%; */
344
+ height: 64px;
345
+ position: fixed;
346
+ bottom: 0;
347
+ display: flex;
348
+ float: right;
349
+ flex-direction: row;
350
+ align-items: center;
351
+ justify-content: end;
352
+ }
353
+ }
233
354
  </style>
@@ -1,5 +1,5 @@
1
- import EleStepModel from './src/index.vue'
2
-
3
- EleStepModel.install = Vue => Vue.component(EleStepModel.name, EleStepModel)
4
-
1
+ import EleStepModel from './src/index.vue'
2
+
3
+ EleStepModel.install = Vue => Vue.component(EleStepModel.name, EleStepModel)
4
+
5
5
  export default EleStepModel