@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
@@ -1,89 +1,290 @@
1
- <template>
2
- <div class="g-table__wrapper">
3
- <a-table
4
- :pagination="false"
5
- :loading="loading"
6
- :columns="columns"
7
- :row-class-name="setRowClassName"
8
- :data-source="dataSource"
9
- :scroll="{ x: 1500, y: 500 }">
10
- <template slot="action" slot-scope="record">
11
- <Actions v-on="$listeners" :data-source="actions" :record="record"></Actions>
12
- </template>
13
- </a-table>
14
- <div class="g-table__pagination">
15
- <a-pagination
16
- :show-total="total => `共 ${total} 条数据`"
17
- show-size-changer
18
- show-quick-jumper
19
- :pageSize="pageSize"
20
- :pageSizeOptions="pageSizeOptions"
21
- @change="onChangePagination"
22
- :total="total">
23
- </a-pagination>
24
- </div>
25
- </div>
26
- </template>
27
-
28
- <script>
29
- import Actions from './action.vue'
30
- export default {
31
- name: 'ele-table',
32
- components: {
33
- Actions
34
- },
35
- props: {
36
- actions: {
37
- type: Array,
38
- default: () => []
39
- },
40
- total: {
41
- type: Number,
42
- default: 0
43
- },
44
- loading: {
45
- type: Boolean,
46
- default: false
47
- },
48
- columns: {
49
- type: Array,
50
- default: () => []
51
- },
52
- dataSource: {
53
- type: Array,
54
- default: () => []
55
- },
56
- pageSize: {
57
- type: Number,
58
- default: 10
59
- },
60
- pageSizeOptions: {
61
- type: Array,
62
- default: () => ['10', '20', '30', '40']
63
- }
64
- },
65
- methods: {
66
- setRowClassName (record, idx) {
67
- return idx % 2 === 0 ? 'g-table__row--even' : 'g-table__row--odd'
68
- },
69
- onChangePagination (page, pagrSize) {
70
- this.$emit('change-page', page, pagrSize)
71
- }
72
- }
73
- }
74
- </script>
75
-
76
- <style lang="scss" scoped>
77
- .g-table__wrapper {
78
- padding: 16px;
79
- padding-top: unset;
80
- .g-table__row--even {}
81
- .g-table__row--odd {}
82
- .g-table__pagination {
83
- margin-top: 8px;
84
- display: flex;
85
- flex-direction: row;
86
- justify-content: end;
87
- }
88
- }
1
+ <template>
2
+ <div class="g-table__wrapper" :style="wrapperStyle" :class="{ 'g-table--no-scroll-y': !needScrollY }">
3
+ <a-table
4
+ :bordered="bordered"
5
+ :class="[isNoData && 'g-table__no-data']"
6
+ :pagination="false"
7
+ :loading="loading"
8
+ :columns="innerColumns"
9
+ :row-selection="rowSelection"
10
+ :row-class-name="setRowClassName"
11
+ :data-source="dataSource"
12
+ :scroll="getScroll">
13
+ <template slot="action" slot-scope="record">
14
+ <Actions v-on="$listeners" :data-source="actions" :record="record"></Actions>
15
+ </template>
16
+ </a-table>
17
+ <div class="g-table__pagination">
18
+ <a-pagination
19
+ :show-total="all => `共 ${all} 条数据`"
20
+ show-size-changer
21
+ show-quick-jumper
22
+ :pageSize="innerPageSize"
23
+ :current="innerCurrentPage"
24
+ :pageSizeOptions="pageSizeOptions"
25
+ @change="onChangePagination"
26
+ @showSizeChange="onShowSizeChange"
27
+ :total="total">
28
+ </a-pagination>
29
+ </div>
30
+ </div>
31
+ </template>
32
+
33
+ <script>
34
+ import Actions from './action.vue'
35
+ export default {
36
+ name: 'ele-table',
37
+ components: {
38
+ Actions
39
+ },
40
+ props: {
41
+ // ant table wrapper
42
+ height: {
43
+ type: Number
44
+ },
45
+ width: {
46
+ type: Number
47
+ },
48
+ x: {
49
+ type: Number,
50
+ default: 1200
51
+ },
52
+ y: {
53
+ type: Number,
54
+ default: 200
55
+ },
56
+ scroll: {
57
+ type: Object
58
+ },
59
+ rowSelection: {
60
+ type: Object
61
+ },
62
+ actions: {
63
+ type: Array,
64
+ default: () => []
65
+ },
66
+ total: {
67
+ type: Number,
68
+ default: 0
69
+ },
70
+ loading: {
71
+ type: Boolean,
72
+ default: false
73
+ },
74
+ columns: {
75
+ type: Array,
76
+ default: () => []
77
+ },
78
+ dataSource: {
79
+ type: Array,
80
+ default: () => []
81
+ },
82
+ pageSize: {
83
+ type: Number,
84
+ default: 10
85
+ },
86
+ pageSizeOptions: {
87
+ type: Array,
88
+ default: () => ['10', '20', '30', '40']
89
+ },
90
+ bordered: {
91
+ type: Boolean,
92
+ default: true
93
+ }
94
+ },
95
+ data() {
96
+ return {
97
+ tableHeaderHeight: 0,
98
+ paginationHeight: 0,
99
+ innerPageSize: 10,
100
+ innerCurrentPage: 1,
101
+ tableContentHeight: 0,
102
+ obs: []
103
+ }
104
+ },
105
+ computed: {
106
+ wrapperStyle () {
107
+ // 外层容器样式:确保分页始终可见,表格充满剩余空间
108
+ if (!this.height) return {}
109
+ return { height: `${this.height}px` }
110
+ },
111
+ needScrollY () {
112
+ // 判断是否需要 y 轴滚动:基于数据行数与可用高度预估
113
+ if (!this.height) return false
114
+
115
+ const availableHeight = this.getScrollHeightByHeight
116
+ if (availableHeight <= 0) return false
117
+
118
+ // 预估每行高度(包含边框),antd 默认约 54px
119
+ const estimatedRowHeight = 54
120
+ const estimatedTableHeight = this.dataSource.length * estimatedRowHeight
121
+
122
+ return estimatedTableHeight > availableHeight
123
+ },
124
+ innerColumns () {
125
+ return this.columns.filter(col => !Object.keys(col).includes('multiple'))
126
+ },
127
+ isNoData () {
128
+ return !this.dataSource.length
129
+ },
130
+ getScrollHeightByHeight () {
131
+ // 始终返回可用的剩余高度,让表格内容不足时也能占满容器
132
+ return this.height - this.tableHeaderHeight - this.paginationHeight
133
+ },
134
+ isFlexColumn () {
135
+ return this.columns.every(col => !col.width)
136
+ },
137
+ getScroll () {
138
+ if (this.scroll) {
139
+ return this.scroll
140
+ } else {
141
+ const baseX = this.isFlexColumn ? 0 : (this.width > this.x ? 0 : this.x)
142
+ if (this.height) {
143
+ // 计算表体可用高度
144
+ const availableHeight = this.tableHeaderHeight && this.paginationHeight
145
+ ? this.getScrollHeightByHeight
146
+ : this.height - 100 // 预估值,给表头和分页留空间
147
+
148
+ if (availableHeight > 50) { // 确保有足够的最小高度
149
+ console.log('Table scroll config:', { x: baseX, y: availableHeight, height: this.height, headerHeight: this.tableHeaderHeight, paginationHeight: this.paginationHeight })
150
+ return { x: baseX, y: availableHeight }
151
+ }
152
+ }
153
+ return { x: baseX }
154
+ }
155
+ }
156
+ },
157
+ watch: {
158
+ pageSize: {
159
+ handler (pageSize) {
160
+ this.innerPageSize = pageSize
161
+ },
162
+ immediate: true
163
+ }
164
+ },
165
+ methods: {
166
+ onShowSizeChange (current, pageSize) {
167
+ this.innerCurrentPage = current
168
+ this.innerPageSize = pageSize
169
+ this.$emit('change-page', current, pageSize)
170
+ },
171
+ setPaginationHeight () {
172
+ this.$nextTick(() => {
173
+ const { height } = document.querySelector('.g-table__pagination').getBoundingClientRect()
174
+ this.paginationHeight = height
175
+ })
176
+ },
177
+ setTableHeaderHeight () {
178
+ this.$nextTick(() => {
179
+ const el = document.querySelector('.ant-table-header')
180
+ if (!el) return
181
+ const { height } = el.getBoundingClientRect()
182
+ this.tableHeaderHeight = height
183
+ })
184
+ },
185
+ setTableTbodyHeight () {
186
+ // 简化:仅需要获取表头高度,不再依赖表体高度的动态监听
187
+ this.$nextTick(() => {
188
+ this.setTableHeaderHeight()
189
+ })
190
+ },
191
+ setRowClassName (record, idx) {
192
+ return idx % 2 === 0 ? 'g-table__row--even' : 'g-table__row--odd'
193
+ },
194
+ onChangePagination (page, pageSize) {
195
+ this.innerCurrentPage = page
196
+ this.innerPageSize = pageSize
197
+ this.$emit('change-page', page, pageSize)
198
+ }
199
+ },
200
+ mounted() {
201
+ this.$nextTick(() => {
202
+ this.setPaginationHeight()
203
+ setTimeout(() => {
204
+ this.setTableTbodyHeight()
205
+ // 再测一次分页高度,确保初次渲染完成后数值准确
206
+ this.setPaginationHeight()
207
+ }, 200)
208
+ })
209
+ },
210
+ destroyed () {
211
+ this.obs.forEach(ob => ob.disconnect())
212
+ }
213
+ }
214
+ </script>
215
+
216
+ <style lang="scss" scoped>
217
+ .g-table__wrapper {
218
+ /* 外层采用列布局,确保分页始终可见,表格充满剩余空间 */
219
+ display: flex;
220
+ flex-direction: column;
221
+ overflow: hidden;
222
+
223
+ /* 表格区域占满剩余空间,启用纵向滚动 */
224
+ ::v-deep .ant-table-wrapper {
225
+ flex: 1 1 auto;
226
+ min-height: 0;
227
+ display: flex;
228
+ flex-direction: column;
229
+ }
230
+
231
+ ::v-deep .ant-spin-nested-loading {
232
+ flex: 1 1 auto;
233
+ min-height: 0;
234
+ display: flex;
235
+ flex-direction: column;
236
+ }
237
+
238
+ ::v-deep .ant-spin-container {
239
+ flex: 1 1 auto;
240
+ min-height: 0;
241
+ display: flex;
242
+ flex-direction: column;
243
+ }
244
+
245
+ ::v-deep .ant-table {
246
+ flex: 1 1 auto;
247
+ min-height: 0;
248
+ display: flex;
249
+ flex-direction: column;
250
+ }
251
+
252
+ /* 确保表体能够正常纵向滚动 */
253
+ ::v-deep .ant-table-content {
254
+ flex: 1 1 auto;
255
+ min-height: 0;
256
+ overflow: hidden;
257
+ }
258
+
259
+ ::v-deep .ant-table-scroll {
260
+ height: 100%;
261
+ display: flex;
262
+ flex-direction: column;
263
+ }
264
+
265
+ ::v-deep .ant-table-header {
266
+ flex: 0 0 auto;
267
+ overflow: hidden;
268
+ }
269
+
270
+ ::v-deep .ant-table-body {
271
+ flex: 1 1 auto;
272
+ overflow: auto !important;
273
+ /* 确保滚动条稳定,避免列宽抖动 */
274
+ scrollbar-gutter: stable;
275
+ }
276
+
277
+ /* 分页区域固定在底部,不被挤出视口 */
278
+ .g-table__pagination {
279
+ flex: 0 0 auto;
280
+ display: flex;
281
+ flex-direction: row;
282
+ justify-content: end;
283
+ border-top: unset;
284
+ padding-top: 8px;
285
+ padding-bottom: 8px;
286
+ background: #fff;
287
+ z-index: 999;
288
+ }
289
+ }
89
290
  </style>
@@ -0,0 +1,5 @@
1
+ import EleTabs from './src/index.vue'
2
+
3
+ EleTabs.install = Vue => Vue.component(EleTabs.name, EleTabs)
4
+
5
+ export default EleTabs
@@ -0,0 +1,56 @@
1
+ <template>
2
+ <div>
3
+ <a-tabs :default-active-key="activeKey" :tabBarGutter="tabBarGutter" :tabBarStyle="tabBarStyle" @change="changeHandle">
4
+ <a-tab-pane v-for="(item, index) in tabsList" :key="index" :tab="item.tabName" :disabled="item.disabled">
5
+ <template #tab>
6
+ <component v-if="item.renderHeader" :is="item.renderHeader" ></component>
7
+ <span v-else>{{ item.tabName }}</span>
8
+ </template>
9
+ <component :is="item.content"></component>
10
+ </a-tab-pane>
11
+ </a-tabs>
12
+ </div>
13
+ </template>
14
+
15
+ <script>
16
+ export default {
17
+ name: 'ele-tabs',
18
+ components: {},
19
+ model: {
20
+ prop: 'value',
21
+ event: 'change'
22
+ },
23
+ props: {
24
+ activeKey: {
25
+ type: Number,
26
+ default: 0
27
+ },
28
+ tabsList: {
29
+ type: Array,
30
+ default () {
31
+ return []
32
+ }
33
+ },
34
+ tabBarStyle: {
35
+ type: Object,
36
+ default () {
37
+ return {}
38
+ }
39
+ },
40
+ tabBarGutter: {
41
+ type: Number
42
+ }
43
+ },
44
+ methods: {
45
+ changeHandle (key) {
46
+ this.$emit('changeActiveKey', key)
47
+ }
48
+ }
49
+ }
50
+ </script>
51
+
52
+ <style lang="scss" scoped>
53
+ ::v-deep .ant-tabs-nav-scroll {
54
+ float: left !important;
55
+ }
56
+ </style>
@@ -0,0 +1,5 @@
1
+ import EleText from './src/index.vue'
2
+
3
+ EleText.install = Vue => Vue.component(EleText.name, EleText)
4
+
5
+ export default EleText
@@ -0,0 +1,48 @@
1
+ <template>
2
+ <div :class="['ele-text__wrapper', type]">
3
+ <ele-icon theme="filled" :type="icon"></ele-icon>
4
+ <span class="message">{{ message }}</span>
5
+ </div>
6
+ </template>
7
+
8
+ <script>
9
+ export default {
10
+ name: 'ele-text',
11
+ props: {
12
+ type: {
13
+ String,
14
+ // default success error warning info
15
+ default: 'default'
16
+ },
17
+ message: {
18
+ type: String
19
+ }
20
+ },
21
+ computed: {
22
+ icon() {
23
+ return 'info-circle'
24
+ }
25
+ },
26
+ }
27
+ </script>
28
+
29
+ <style lang="scss" scoped>
30
+ //
31
+ .ele-text__wrapper {
32
+ display: flex;
33
+ flex-direction: row;
34
+ align-items: center;
35
+ &.default {
36
+ .anticon, .message {
37
+ color: var(--idoole-black-064);
38
+ }
39
+ }
40
+ .anticon {
41
+ font-size: 16px;
42
+ }
43
+ .message {
44
+ font-size: 14px;
45
+ margin-left: 4px;
46
+ }
47
+ }
48
+ </style>
@@ -0,0 +1,5 @@
1
+ import EleTextEditor from './src/index.vue'
2
+
3
+ EleTextEditor.install = Vue => Vue.component(EleTextEditor.name, EleTextEditor)
4
+
5
+ export default EleTextEditor
@@ -0,0 +1,73 @@
1
+ <template>
2
+ <div class="ele-editor__wrapper" :style="{width: editorWidth, height: editorHeight}">
3
+ <Vueditor :ref="getVueditor" :style="{width: editorWidth, height: editorHeight}"></Vueditor>
4
+ <div class="ele-editor__bottom">
5
+ <span>{{ innerContent.length }}字</span>
6
+ </div>
7
+ </div>
8
+ </template>
9
+
10
+ <script>
11
+ import { v4 as uuidv4 } from 'uuid'
12
+ export default {
13
+ name: 'ele-text-editor',
14
+ props: {
15
+ editorWidth: {
16
+ type: String
17
+ },
18
+ editorHeight: {
19
+ type: String
20
+ },
21
+ maxLength: {
22
+ type: Number,
23
+ default () {
24
+ return 10
25
+ }
26
+ }
27
+ },
28
+ data() {
29
+ return {
30
+ editorConfig: {},
31
+ textEditorRef: null
32
+ }
33
+ },
34
+ computed: {
35
+ innerContent () {
36
+ let content = this.textEditorRef ? this.textEditorRef.getContent() : ''
37
+ if (this.textEditorRef && content.length > this.maxLength) {
38
+ content = content.substring(0, this.maxLength)
39
+ this.$nextTick(() => {
40
+ this.textEditorRef.setContent(content)
41
+ })
42
+ }
43
+ this.$emit('input', content)
44
+ return content
45
+ },
46
+ getVueditor () {
47
+ return uuidv4()
48
+ }
49
+ },
50
+ watch: {},
51
+ methods: {},
52
+ mounted () {
53
+ this.textEditorRef = this.$refs[this.getVueditor]
54
+ }
55
+ }
56
+ </script>
57
+
58
+ <style lang="scss" scoped>
59
+ .ele-editor__bottom {
60
+ height: 40px;
61
+ padding: 8px 20px 8px 8px;
62
+ border: 1px solid var(--idooel-form-title-border-color);
63
+ border-top: 0px;
64
+ span {
65
+ color: var(--idoole-black-088);
66
+ text-align: right;
67
+ font-size: 12px;
68
+ line-height: 20px;
69
+ width: 100%;
70
+ display: inline-block;
71
+ }
72
+ }
73
+ </style>
@@ -0,0 +1,5 @@
1
+ import EleTextarea from './src/index.vue'
2
+
3
+ EleTextarea.install = Vue => Vue.component(EleTextarea.name, EleTextarea)
4
+
5
+ export default EleTextarea
@@ -0,0 +1,58 @@
1
+ <template>
2
+ <a-textarea
3
+ :value="value"
4
+ :disabled="disabled"
5
+ :auto-size="autosize"
6
+ :max-length="maxLength"
7
+ :placeholder="placeholder"
8
+ :allow-clear="allowClear"
9
+ @change="onChange">
10
+ </a-textarea>
11
+ </template>
12
+
13
+ <script>
14
+ export default {
15
+ name: 'ele-textarea',
16
+ model: {
17
+ prop: 'value',
18
+ event: 'change'
19
+ },
20
+ props: {
21
+ maxLength: {
22
+ type: Number
23
+ },
24
+ placeholder: {
25
+ type: String
26
+ },
27
+ allowClear: {
28
+ type: Boolean,
29
+ default: false
30
+ },
31
+ autosize: {
32
+ type: [Boolean, Object],
33
+ default: () => ({
34
+ minRows: 4,
35
+ maxRows: 4
36
+ })
37
+ },
38
+ value: {
39
+ type: String
40
+ },
41
+ disabled: {
42
+ type: Boolean,
43
+ default: false
44
+ }
45
+ },
46
+ methods: {
47
+ onChange (e) {
48
+ const value = e.target.value
49
+ this.$emit('change', value)
50
+ this.$emit('input', value)
51
+ }
52
+ }
53
+ }
54
+ </script>
55
+
56
+ <style scoped>
57
+
58
+ </style>
@@ -0,0 +1,22 @@
1
+ .has-error {
2
+ .ele-upload__wrapper {
3
+ .ele-upload__inner {
4
+ border-color: $error-06;
5
+ .ele-upload__area {
6
+ .ele-upload__area--icon {
7
+ .anticon-cloud-upload {
8
+ color: $error-06;
9
+ }
10
+ }
11
+ .ele-upload__area--text {
12
+ .ele-upload__message {
13
+ color: $error-06;
14
+ }
15
+ .ele-upload__ext {
16
+ color: $error-03;
17
+ }
18
+ }
19
+ }
20
+ }
21
+ }
22
+ }