@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,104 @@
1
+ <template>
2
+ <ele-modal :title="title" :value="value" :size="size" @cancel="onCancel" v-on="overrideEvents" :buttonGroupMeta="buttonGroupMeta">
3
+ <ele-alert v-if="alert" v-bind="alert"></ele-alert>
4
+ <div v-if="contentText" class="ele-modal-confirm__content">
5
+ {{ contentText }}
6
+ </div>
7
+ </ele-modal>
8
+ </template>
9
+
10
+ <script>
11
+ import { CONTEXT } from '../../../utils'
12
+ export default {
13
+ name: 'ele-modal-confirm',
14
+ model: {
15
+ event: 'change',
16
+ prop: 'value'
17
+ },
18
+ props: {
19
+ title: {
20
+ type: String
21
+ },
22
+ size: {
23
+ type: String,
24
+ default: 'small'
25
+ },
26
+ alert: {
27
+ type: [Object, Boolean],
28
+ default: () => ({
29
+ type: 'warning',
30
+ message: '确定要删除吗?',
31
+ description: '删除后将无法恢复',
32
+ closable: false
33
+ })
34
+ },
35
+ contentText: {
36
+ type: String
37
+ },
38
+ value: {
39
+ type: Boolean,
40
+ default: false
41
+ },
42
+ buttonGroupMeta: {
43
+ type: Object
44
+ },
45
+ //!deprecated
46
+ contextProp: {
47
+ type: Object,
48
+ default: () => ({})
49
+ }
50
+ },
51
+ inject: {
52
+ [CONTEXT]: {
53
+ default: () => (() => ({}))
54
+ }
55
+ },
56
+ data () {
57
+ return {}
58
+ },
59
+ computed: {
60
+ currentContext () {
61
+ const { exposed: exposedData = {} } = this[CONTEXT]()
62
+ const exposed = Object.assign({}, exposedData, { closeModalConfirm: this.closeModalConfirm })
63
+ return {
64
+ _route: this.$route.query,
65
+ _routeMeta: this.$route.meta,
66
+ ...this[CONTEXT](),
67
+ exposed
68
+ }
69
+ },
70
+ overrideEvents () {
71
+ if (!this.buttonGroupMeta) return {}
72
+ const { elements = [] } = this.buttonGroupMeta
73
+ const events = elements.reduce((ret, ele) =>{
74
+ ret[ele.eventName || 'click'] = (e) => {
75
+ this.$emit(ele.eventName || 'click', { ...e, ...this.currentContext })
76
+ }
77
+ return ret
78
+ }, {})
79
+ return {
80
+ ...events
81
+ }
82
+ }
83
+ },
84
+ methods: {
85
+ closeModalConfirm () {
86
+ this.$emit('change', false)
87
+ },
88
+ onCancel () {
89
+ this.$emit('change', false)
90
+ }
91
+ }
92
+ }
93
+ </script>
94
+ <style lang="scss">
95
+ @import '../../../theme/index';
96
+ </style>
97
+ <style lang="scss" scoped>
98
+ .ele-modal-confirm__content {
99
+ margin-top: 8px;
100
+ color: var(--idoole-black-088);
101
+ font-size: 14px;
102
+ line-height: 22px;
103
+ }
104
+ </style>
@@ -0,0 +1,5 @@
1
+ import EleModalForm from './src/index.vue'
2
+
3
+ EleModalForm.install = Vue => Vue.component(EleModalForm.name, EleModalForm)
4
+
5
+ export default EleModalForm
@@ -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="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