@idooel/components 0.0.1 → 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 (107) hide show
  1. package/README.md +99 -0
  2. package/dist/@idooel/components.esm.js +13956 -1882
  3. package/dist/@idooel/components.umd.js +14000 -1891
  4. package/jsconfig.json +8 -0
  5. package/package.json +12 -6
  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/index.js +4 -4
  19. package/packages/button/src/index.vue +65 -24
  20. package/packages/checkbox/index.js +5 -0
  21. package/packages/checkbox/src/index.vue +53 -0
  22. package/packages/composite-components/button-group/index.js +4 -4
  23. package/packages/composite-components/button-group/src/index.vue +151 -46
  24. package/packages/composite-components/form-attachment/src/index.vue +15 -0
  25. package/packages/composite-components/form-img-crop/index.js +5 -0
  26. package/packages/composite-components/form-img-crop/src/index.vue +121 -0
  27. package/packages/composite-components/modal-confirm/index.js +5 -0
  28. package/packages/composite-components/modal-confirm/src/index.vue +104 -0
  29. package/packages/composite-components/modal-form/index.js +5 -0
  30. package/packages/composite-components/modal-form/src/index.vue +231 -0
  31. package/packages/composite-components/modal-img-crop/index.js +5 -0
  32. package/packages/composite-components/modal-img-crop/src/index.vue +299 -0
  33. package/packages/composite-components/modal-table/index.js +5 -0
  34. package/packages/composite-components/modal-table/src/index.vue +156 -0
  35. package/packages/composite-components/modal-table-transfer/index.js +0 -0
  36. package/packages/composite-components/modal-tree/index.js +5 -0
  37. package/packages/composite-components/modal-tree/src/index.vue +76 -0
  38. package/packages/composite-components/search-area/index.js +4 -4
  39. package/packages/composite-components/search-area/src/index.vue +237 -128
  40. package/packages/composite-components/search-area/src/label.vue +35 -35
  41. package/packages/composite-components/select-entity-modal-table/index.js +5 -0
  42. package/packages/composite-components/select-entity-modal-table/src/index.vue +172 -0
  43. package/packages/composite-components/table-transfer/index.js +0 -0
  44. package/packages/date/index.js +4 -4
  45. package/packages/date/src/index.vue +113 -40
  46. package/packages/date-range/index.js +5 -0
  47. package/packages/date-range/src/index.vue +47 -0
  48. package/packages/form/index.js +5 -0
  49. package/packages/form/src/index.vue +319 -0
  50. package/packages/icon/index.js +5 -0
  51. package/packages/icon/src/index.vue +32 -0
  52. package/packages/index.js +153 -50
  53. package/packages/input/index.js +4 -4
  54. package/packages/input/src/index.vue +35 -23
  55. package/packages/input-number/index.js +5 -0
  56. package/packages/input-number/src/index.vue +24 -0
  57. package/packages/loading/index.js +5 -0
  58. package/packages/loading/src/index.vue +37 -0
  59. package/packages/modal/index.js +5 -0
  60. package/packages/modal/src/index.vue +185 -0
  61. package/packages/models/form-group-model/index.js +5 -0
  62. package/packages/models/form-group-model/src/index.vue +274 -0
  63. package/packages/models/form-model/index.js +5 -0
  64. package/packages/models/form-model/src/index.vue +233 -0
  65. package/packages/models/step-model/index.js +5 -0
  66. package/packages/models/step-model/src/index.vue +224 -0
  67. package/packages/{tree-table-model → models/tree-table-model}/index.js +4 -4
  68. package/packages/models/tree-table-model/src/index.vue +689 -0
  69. package/packages/radio/index.js +5 -0
  70. package/packages/radio/src/index.vue +57 -0
  71. package/packages/select/index.js +4 -4
  72. package/packages/select/src/index.vue +105 -34
  73. package/packages/select-entity/index.js +5 -0
  74. package/packages/select-entity/src/index.vue +120 -0
  75. package/packages/table/index.js +4 -4
  76. package/packages/table/src/action.vue +172 -103
  77. package/packages/table/src/index.vue +289 -88
  78. package/packages/tabs/index.js +5 -0
  79. package/packages/tabs/src/index.vue +56 -0
  80. package/packages/text/index.js +5 -0
  81. package/packages/text/src/index.vue +48 -0
  82. package/packages/text-editor/index.js +5 -0
  83. package/packages/text-editor/src/index.vue +73 -0
  84. package/packages/textarea/index.js +5 -0
  85. package/packages/textarea/src/index.vue +58 -0
  86. package/packages/theme/form.scss +22 -0
  87. package/packages/theme/index.scss +43 -0
  88. package/packages/theme/overrid.scss +8 -0
  89. package/packages/theme/styleClass.scss +3 -0
  90. package/packages/theme/variables.scss +56 -0
  91. package/packages/timeline/index.js +5 -0
  92. package/packages/timeline/src/index.vue +258 -0
  93. package/packages/tpl/index.js +4 -4
  94. package/packages/tpl/src/index.vue +56 -47
  95. package/packages/tree/index.js +4 -4
  96. package/packages/tree/src/TreeNode.vue +29 -29
  97. package/packages/tree/src/index.vue +101 -96
  98. package/packages/tree-select/index.js +5 -0
  99. package/packages/tree-select/src/index.vue +143 -0
  100. package/packages/upload/index.js +5 -0
  101. package/packages/upload/src/index.vue +445 -0
  102. package/packages/utils/index.js +63 -0
  103. package/scripts/rollup.config.js +42 -35
  104. package/scripts/rollup.esm.config.js +11 -11
  105. package/scripts/rollup.umd.config.js +14 -14
  106. package/packages/tree-table-model/src/index.vue +0 -290
  107. /package/packages/{tree-table-model/README.md → composite-components/form-attachment/index.js} +0 -0
@@ -0,0 +1,37 @@
1
+ <template>
2
+ <div v-if="loading" class="g-loading">
3
+
4
+ </div>
5
+ </template>
6
+
7
+ <script>
8
+ export default {
9
+ name: 'ele-loading',
10
+ props: {
11
+ loading: {
12
+ type: Boolean,
13
+ default: true
14
+ }
15
+ }
16
+ }
17
+ </script>
18
+
19
+ <style lang="scss" scoped>
20
+ .g-loading {
21
+ width: 16px;
22
+ height: 16px;
23
+ border: 1px solid #409EFF;
24
+ border-top-color: transparent;
25
+ border-left-color: transparent;
26
+ border-radius: 100%;
27
+ animation: rotate infinite 0.75s linear;
28
+ }
29
+ @keyframes rotate {
30
+ 0% {
31
+ transform: rotate(0);
32
+ }
33
+ 100% {
34
+ transform: rotate(360deg);
35
+ }
36
+ }
37
+ </style>
@@ -0,0 +1,5 @@
1
+ import EleModal from './src/index.vue'
2
+
3
+ EleModal.install = Vue => Vue.component(EleModal.name, EleModal)
4
+
5
+ export default EleModal
@@ -0,0 +1,185 @@
1
+ <template>
2
+ <a-modal
3
+ :title="title"
4
+ :cancelText="cancelText"
5
+ :okText="okText"
6
+ :closable="closable"
7
+ v-model:visible="showModal"
8
+ :width="width"
9
+ :keyboard="false"
10
+ :maskClosable="maskClosable"
11
+ :dialogStyle="{ top: `${upDownDistance[size]}px` }"
12
+ :bodyStyle="{ maxHeight: maxheight, overflowY: 'auto' }"
13
+ :footer="showFooter ? undefined : null"
14
+ @cancel="handleCancel"
15
+ @ok="handleOk"
16
+ >
17
+ <slot v-if="showModal"></slot>
18
+ <template slot="footer" v-if="!showDefaultFooter">
19
+ <div class="ele-modal__footer">
20
+ <slot name="footer-text"></slot>
21
+ <div class="footer-btn__wrapper">
22
+ <ele-button
23
+ v-for="btn in buttonGroupMeta.elements"
24
+ :type="btn.type"
25
+ v-on="assignAttrEvents"
26
+ :event-name="btn.eventName"
27
+ :key="btn.key">
28
+ {{ btn.label }}
29
+ </ele-button>
30
+ </div>
31
+ </div>
32
+ </template>
33
+ </a-modal>
34
+ </template>
35
+ <script>
36
+ import { CONTEXT } from '../../utils'
37
+ export default {
38
+ name: 'ele-modal',
39
+ props: {
40
+ value: {
41
+ type: Boolean,
42
+ default: false
43
+ },
44
+ title: {
45
+ type: String,
46
+ default: '标题'
47
+ },
48
+ cancelText: {
49
+ type: String,
50
+ default: '关闭'
51
+ },
52
+ okText: {
53
+ type: String,
54
+ default: '确定'
55
+ },
56
+ size: {
57
+ type: String,
58
+ default: 'middle'
59
+ },
60
+ map: {
61
+ type: Object,
62
+ default () {
63
+ return {}
64
+ }
65
+ },
66
+ closable: {
67
+ type: Boolean,
68
+ default: true
69
+ },
70
+ maskClosable: {
71
+ type: Boolean,
72
+ default: false
73
+ },
74
+ showFooter: {
75
+ type: Boolean,
76
+ default: true
77
+ },
78
+ footer: {
79
+ type: Function,
80
+ default: null
81
+ },
82
+ onlyClose: {
83
+ type: Boolean,
84
+ default: false
85
+ },
86
+ buttonGroupMeta: {
87
+ type: Object,
88
+ default: () => ({})
89
+ },
90
+ // 是否展示组件默认底部按钮
91
+ showDefaultFooter: {
92
+ type: Boolean,
93
+ default: false
94
+ }
95
+ },
96
+ watch: {
97
+ value: {
98
+ handler (value) {
99
+ this.$nextTick(() => {
100
+ this.showModal = value
101
+ })
102
+ },
103
+ immediate: true
104
+ }
105
+ },
106
+ inject: {
107
+ [CONTEXT]: {
108
+ default: () => (() => ({}))
109
+ }
110
+ },
111
+ computed: {
112
+ assignAttrEvents () {
113
+ const events = this.buttons.reduce((ret, btn) => {
114
+ ret[btn.eventName] = (e) => {
115
+ this.$emit(btn.eventName || 'click', { ...e, ...this[CONTEXT]() })
116
+ }
117
+ return ret
118
+ }, {})
119
+ return {
120
+ ...this.$listeners,
121
+ ...events
122
+ }
123
+ },
124
+ buttons () {
125
+ const { elements = [] } = this.buttonGroupMeta
126
+ return elements
127
+ },
128
+ width () {
129
+ return this.map[this.size]
130
+ },
131
+ maxheight () {
132
+ return `calc(100vh - ${this.upDownDistance[this.size] * 2 + (this.title ? 55 : 0) + (this.showFooter ? 53 : 0) }px`
133
+ }
134
+ },
135
+ data () {
136
+ return {
137
+ showModal: false
138
+ }
139
+ },
140
+ created () {
141
+ let defaultMap = {
142
+ small: 480,
143
+ middle: 768,
144
+ big: 1200
145
+ }
146
+ this.upDownDistance = {
147
+ small: 80,
148
+ middle: 80,
149
+ big: 40
150
+ }
151
+ this.map = Object.assign(this.map, defaultMap)
152
+ },
153
+ methods: {
154
+ openModal () {
155
+ this.showModal = true
156
+ this.removeHidden()
157
+ },
158
+ handleCancel () {
159
+ this.showModal = false
160
+ this.$emit('input', this.showModal)
161
+ this.$emit('change', this.showModal)
162
+ this.removeHidden()
163
+ this.$emit('cancel')
164
+ },
165
+ handleOk () {
166
+ this.$emit('ok')
167
+ },
168
+ removeHidden () {
169
+ let ishidden = document.body.style.overflow === 'hidden'
170
+ ishidden && (document.body.style.overflow = 'initial')
171
+ }
172
+ }
173
+ }
174
+ </script>
175
+ <style lang="scss" scoped>
176
+ .ele-modal__footer {
177
+ display: flex;
178
+ flex-direction: row;
179
+ justify-content: space-between;
180
+ align-items: center;
181
+ .footer-btn__wrapper {
182
+ flex: 1;
183
+ }
184
+ }
185
+ </style>
@@ -0,0 +1,5 @@
1
+ import EleFormGroupModel from './src/index.vue'
2
+
3
+ EleFormGroupModel.install = Vue => Vue.component(EleFormGroupModel.name, EleFormGroupModel)
4
+
5
+ export default EleFormGroupModel
@@ -0,0 +1,274 @@
1
+ <template>
2
+ <div class="ele form-group-model__wrapper">
3
+ <template v-for="(group, idx) in innerGroupMeta">
4
+ <div
5
+ class="form-group-model__from"
6
+ v-if="!group.isGenTpl"
7
+ :key="group.key || idx">
8
+ <div class="form-group-model__form--title">
9
+ <div>{{ group.title }}</div>
10
+ <div class="form-group-model__form--buttons">
11
+ <ele-button-group v-if="group.buttonGroupMeta" v-on="assignAttrForEvents" @delete="handleClickDelete($event, group, idx)" :data-source="group.buttonGroupMeta.elements.call(this)"></ele-button-group>
12
+ </div>
13
+ </div>
14
+ <div class="form-group-model__form--content">
15
+ <ele-form @change="onChangeFormStatus($event, group.key || idx)" :form-name="group.key || idx" :ref="group.key || `${formRefBase}__${idx}`" :elements="group.elements"></ele-form>
16
+ </div>
17
+ </div>
18
+ </template>
19
+ <div v-if="showFooterMeta" class="form-group-model__form--footer">
20
+ <ele-button-group v-on="assignAttrForEvents" :data-source="footerElements"></ele-button-group>
21
+ </div>
22
+ </div>
23
+ </template>
24
+
25
+ <script>
26
+ import { BUILT_IN_EVENT_NAMES, RESERVE_EVENT_NAMES, parseFieldMap, PAGE_STATUS } from '../../../utils'
27
+ import { v4 as uuidv4 } from 'uuid'
28
+ import { type, net } from '@idooel/shared'
29
+ export default {
30
+ name: 'ele-form-group-model',
31
+ props: {
32
+ mode: {
33
+ type: String
34
+ },
35
+ fieldName: {
36
+ type: String,
37
+ default: 'formGroup'
38
+ },
39
+ groupMeta: {
40
+ type: Function,
41
+ default: () => []
42
+ },
43
+ footerMeta: {
44
+ type: Object,
45
+ default: () => {}
46
+ },
47
+ preRequest: {
48
+ type: Object,
49
+ default: () => {}
50
+ },
51
+ infoRequest: {
52
+ type: Object,
53
+ default: () => {}
54
+ },
55
+ submitRequest: {
56
+ type: Object,
57
+ default: () => {}
58
+ }
59
+ },
60
+ data () {
61
+ return {
62
+ increaseCount: 1,
63
+ innerGroupMeta: []
64
+ }
65
+ },
66
+ watch: {
67
+ readOnlyGroupMeta: {
68
+ handler (meta) {
69
+ this.innerGroupMeta = meta
70
+ },
71
+ immediate: true
72
+ }
73
+ },
74
+ computed: {
75
+ routeMetaMode () {
76
+ return this.$route.meta.mode
77
+ },
78
+ readOnlyGroupMeta () {
79
+ return this.groupMeta.call(this)
80
+ },
81
+ showFooterMeta () {
82
+ return !type.isEmpty(this.footerMeta)
83
+ },
84
+ formRefBase () {
85
+ return uuidv4()
86
+ },
87
+ footerElements () {
88
+ const { elements } = this.footerMeta
89
+ return elements.call(this)
90
+ },
91
+ assignAttrForEvents () {
92
+ const events = this.footerElements.reduce((ret, ele) => {
93
+ ret[ele.eventName] = (e) => {
94
+ this.$emit(ele.eventName || 'click', { ...e })
95
+ }
96
+ return ret
97
+ }, {})
98
+ return {
99
+ ...this.$listeners,
100
+ ...events,
101
+ [BUILT_IN_EVENT_NAMES.SUBMIT]: this[BUILT_IN_EVENT_NAMES.SUBMIT],
102
+ [BUILT_IN_EVENT_NAMES.CANCEL]: this[BUILT_IN_EVENT_NAMES.CANCEL],
103
+ [BUILT_IN_EVENT_NAMES.INCREASE]: this[BUILT_IN_EVENT_NAMES.INCREASE]
104
+ }
105
+ },
106
+ getFormRefs () {
107
+ return this.innerGroupMeta.map((group, idx) => {
108
+ if (!group.isGenTpl) {
109
+ return this.$refs[group.key || `${this.formRefBase}__${idx}`]
110
+ }
111
+ return void 0
112
+ }).filter(item => !!item).flat()
113
+ },
114
+ formModels () {
115
+ if (this.mode === 'increase') {
116
+ //TODO increase mode to return formModels
117
+ return this.getFormRefs.map(form => {
118
+ return form.getFieldsValue()
119
+ })
120
+ } else {
121
+ return this.getFormRefs.map(form => {
122
+ const { $vnode: { data: { ref } } } = form
123
+ return {
124
+ key: ref,
125
+ value: form.getFieldsValue()
126
+ }
127
+ }).reduce((ret, props) => {
128
+ ret[props.key] = props.value
129
+ return ret
130
+ }, {})
131
+ }
132
+ }
133
+ },
134
+ methods: {
135
+ execFieldMap (fieldMap = {}, dataSource = {}) {
136
+ const ret = parseFieldMap(fieldMap, { _route: this.$route.query, ...dataSource})
137
+ return ret
138
+ },
139
+ onChangeFormStatus (props, key) {
140
+ this.$emit(RESERVE_EVENT_NAMES.WATCH_FORM_STATUS, { key, ...props })
141
+ },
142
+ async infoRequestTrigger () {
143
+ if (!this.infoRequest || this.routeMetaMode == PAGE_STATUS.CREATE) return
144
+ const { url, requestType, params = {}, fieldMap = {}, headers = {} } = this.infoRequest
145
+ if (!url) return
146
+ net[requestType.toLowerCase()](url, { ...params, ...this.execFieldMap(fieldMap) }, { ...headers }).then(resp => {
147
+ const { data = {} } = resp
148
+ if (this.mode === 'increase') {
149
+ this.renderIncreaseForm(data)
150
+ }
151
+ this.$emit(RESERVE_EVENT_NAMES.INIT_FORM, { ...data })
152
+ })
153
+ },
154
+ async preRequestTrigger () {
155
+ if (!this.preRequest) return
156
+ const { url, requestType = 'GET', params = {}, fieldMap = {}, headers = {} } = this.preRequest
157
+ if (!url) return
158
+ net[requestType.toLowerCase()](url, { ...params, ...fieldMap }, { ...headers }).then(resp => {
159
+ const { data = {} } = resp
160
+ if (this.mode === 'increase') {
161
+ this.renderIncreaseForm(data)
162
+ }
163
+ this.$emit(RESERVE_EVENT_NAMES.INIT_FORM, { ...data })
164
+ })
165
+ },
166
+ renderIncreaseForm (data = {}) {
167
+ const formGroupValuesLength = data[this.fieldName].length
168
+ const genTplTarget = this.readOnlyGroupMeta.find(item => item.isGenTpl)
169
+ const notGenTplPoolLength = this.readOnlyGroupMeta.filter(item => !item.isGenTpl).length
170
+ const genNum = formGroupValuesLength - notGenTplPoolLength
171
+ new Array(genNum).fill().forEach(() => {
172
+ const form = this.genForm(genTplTarget)
173
+ this.innerGroupMeta.push(form)
174
+ })
175
+ const formGroupValues = data[this.fieldName]
176
+ this.$nextTick(() => {
177
+ this.setFieldsValue(formGroupValues)
178
+ })
179
+ },
180
+ async submitRequestTrigger (props = {}) {
181
+ const { url, requestType, headers = {}, params = {}, fieldMap = {} } = this.submitRequest
182
+ if (!url) return
183
+ const ret = await net[requestType.toLowerCase()](url, { ...params, ...this.execFieldMap(fieldMap, { ...this.formModels }), [this.fieldName]: this.formModels }, { headers }).then(resp => {
184
+ this.$emit(BUILT_IN_EVENT_NAMES.SUBMIT, { ...props, formModel: { ...this.formModels, ...resp.data || {} } })
185
+ return resp.data
186
+ })
187
+ return ret
188
+ },
189
+ setFieldsValue (data = []) {
190
+ this.getFormRefs.forEach((form, idx) => {
191
+ form.setFieldsValue(data[idx])
192
+ form.evalDisabledExpression(data[idx])
193
+ })
194
+ },
195
+ [BUILT_IN_EVENT_NAMES.SUBMIT] (props = {}) {
196
+ const status = this.getFormRefs.map(form => {
197
+ const status = form.validateFields()
198
+ return status
199
+ }).every(item => item)
200
+ if (status) {
201
+ return this.submitRequestTrigger(props)
202
+ } else {
203
+ return false
204
+ }
205
+ },
206
+ [BUILT_IN_EVENT_NAMES.CANCEL] (props = {}) {
207
+ this.$emit(BUILT_IN_EVENT_NAMES.CANCEL, { ...props })
208
+ },
209
+ genForm (base) {
210
+ const { elements, title, buttonGroupMeta } = base
211
+ return {
212
+ elements: JSON.parse(JSON.stringify(elements)),
213
+ buttonGroupMeta,
214
+ title: `${title}${this.increaseCount++}`,
215
+ _gen: true
216
+ }
217
+ },
218
+ handleClickDelete (props = {}, attr = {}, idx) {
219
+ this.innerGroupMeta.splice(idx, 1)
220
+ this.$emit(BUILT_IN_EVENT_NAMES.DELETE, { ...props })
221
+ },
222
+ [BUILT_IN_EVENT_NAMES.INCREASE] (props) {
223
+ const genTplTarget = this.readOnlyGroupMeta.find(item => item.isGenTpl)
224
+ const form = this.genForm(genTplTarget)
225
+ this.innerGroupMeta.push(form)
226
+ }
227
+ },
228
+ async mounted() {
229
+ await this.preRequestTrigger()
230
+ await this.infoRequestTrigger()
231
+ }
232
+ }
233
+ </script>
234
+
235
+ <style lang="scss" scoped>
236
+ .ele {
237
+ &.form-group-model__wrapper {
238
+ background: unset;
239
+ padding-bottom: 80px;
240
+ .form-group-model__from {
241
+ background: #fff;
242
+ margin-top: 16px;
243
+ &:first-child {
244
+ margin-top: unset;
245
+ }
246
+ .form-group-model__form--title {
247
+ width: 100%;
248
+ height: 56px;
249
+ padding: 0 16px;
250
+ border-bottom: 1px solid;
251
+ border-color: var(--idooel-form-title-border-color);
252
+ display: flex;
253
+ flex-direction: row;
254
+ align-items: center;
255
+ justify-content: space-between;
256
+ }
257
+ .form-group-model__form--content {
258
+ padding: 16px;
259
+ }
260
+ }
261
+ .form-group-model__form--footer {
262
+ width: 100%;
263
+ height: 64px;
264
+ background: #fff;
265
+ position: fixed;
266
+ bottom: 0;
267
+ display: flex;
268
+ flex-direction: row;
269
+ align-items: center;
270
+ justify-content: end;
271
+ }
272
+ }
273
+ }
274
+ </style>
@@ -0,0 +1,5 @@
1
+ import EleFormPageModel from './src/index.vue'
2
+
3
+ EleFormPageModel.install = Vue => Vue.component(EleFormPageModel.name, EleFormPageModel)
4
+
5
+ export default EleFormPageModel