iov-pro-components 0.0.3

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 (133) hide show
  1. package/.eslintignore +5 -0
  2. package/.eslintrc.js +192 -0
  3. package/.gitignore +3 -0
  4. package/README.md +4 -0
  5. package/babel.config.js +5 -0
  6. package/docs/.vuepress/config.js +169 -0
  7. package/docs/.vuepress/styles/index.styl +62 -0
  8. package/docs/.vuepress/styles/palette.styl +20 -0
  9. package/docs/.vuepress/theme/enhanceApp.js +100 -0
  10. package/docs/.vuepress/theme/index.js +3 -0
  11. package/docs/README.md +13 -0
  12. package/docs/components/description.md +519 -0
  13. package/docs/components/dialog-select.md +91 -0
  14. package/docs/components/display.md +36 -0
  15. package/docs/components/enums.md +33 -0
  16. package/docs/components/icon.md +406 -0
  17. package/docs/components/link-group.md +39 -0
  18. package/docs/components/page-detail.md +48 -0
  19. package/docs/components/page-module.md +51 -0
  20. package/docs/components/pro-form.md +958 -0
  21. package/docs/components/pro-table.md +683 -0
  22. package/docs/components/request.md +44 -0
  23. package/docs/components/search-table.md +963 -0
  24. package/docs/components/space.md +35 -0
  25. package/docs/components/sub-title.md +24 -0
  26. package/docs/components/submit-module.md +24 -0
  27. package/docs/template/add.md +124 -0
  28. package/docs/template/confirm.md +28 -0
  29. package/docs/template/detail.md +240 -0
  30. package/docs/template/dialog.md +339 -0
  31. package/docs/template/list.md +464 -0
  32. package/docs/template/tabs-mini.md +32 -0
  33. package/docs/template/tabs.md +32 -0
  34. package/jsconfig.json +19 -0
  35. package/lib/iov-pro-components.css +1 -0
  36. package/lib/iov-pro-components.min.js +7 -0
  37. package/lib/postcss.config.js +8 -0
  38. package/package.json +75 -0
  39. package/patches/vue-server-renderer+2.7.16.patch +13 -0
  40. package/rollup.config.mjs +79 -0
  41. package/src/App.vue +103 -0
  42. package/src/main.js +33 -0
  43. package/src/packages/column-tooltip/index.js +7 -0
  44. package/src/packages/column-tooltip/src/main.vue +127 -0
  45. package/src/packages/description/index.js +7 -0
  46. package/src/packages/description/src/main.vue +375 -0
  47. package/src/packages/description/src/text.vue +103 -0
  48. package/src/packages/dialog-select/index.js +7 -0
  49. package/src/packages/dialog-select/src/main.vue +308 -0
  50. package/src/packages/display/index.js +7 -0
  51. package/src/packages/display/src/main.vue +44 -0
  52. package/src/packages/enums/index.js +7 -0
  53. package/src/packages/enums/src/main.vue +23 -0
  54. package/src/packages/export/index.js +7 -0
  55. package/src/packages/export/src/main.vue +316 -0
  56. package/src/packages/fixed-button-group/index.js +7 -0
  57. package/src/packages/fixed-button-group/src/main.vue +104 -0
  58. package/src/packages/form/index.js +7 -0
  59. package/src/packages/form/src/collapse.vue +149 -0
  60. package/src/packages/form/src/main.vue +1190 -0
  61. package/src/packages/form-collapse/index.js +7 -0
  62. package/src/packages/index.js +86 -0
  63. package/src/packages/link-group/index.js +7 -0
  64. package/src/packages/link-group/src/main.vue +52 -0
  65. package/src/packages/page-detail/index.js +7 -0
  66. package/src/packages/page-detail/src/main.vue +123 -0
  67. package/src/packages/page-module/index.js +7 -0
  68. package/src/packages/page-module/src/main.vue +56 -0
  69. package/src/packages/preview/index.js +7 -0
  70. package/src/packages/preview/src/eval-image-viewer.js +50 -0
  71. package/src/packages/preview/src/image-viewer.vue +366 -0
  72. package/src/packages/preview/src/main.vue +97 -0
  73. package/src/packages/request/index.js +7 -0
  74. package/src/packages/request/src/main.vue +125 -0
  75. package/src/packages/search-table/index.js +7 -0
  76. package/src/packages/search-table/src/inner-tabs.vue +237 -0
  77. package/src/packages/search-table/src/main.vue +472 -0
  78. package/src/packages/search-table/src/outer-tabs.vue +45 -0
  79. package/src/packages/search-table-inner-tabs/index.js +7 -0
  80. package/src/packages/search-table-outer-tabs/index.js +7 -0
  81. package/src/packages/space/index.js +7 -0
  82. package/src/packages/space/src/main.vue +74 -0
  83. package/src/packages/sub-title/index.js +7 -0
  84. package/src/packages/sub-title/src/main.vue +70 -0
  85. package/src/packages/submit-module/index.js +7 -0
  86. package/src/packages/submit-module/src/main.vue +67 -0
  87. package/src/packages/table/index.js +7 -0
  88. package/src/packages/table/src/filter.vue +89 -0
  89. package/src/packages/table/src/main.vue +668 -0
  90. package/src/packages/table/src/search.vue +90 -0
  91. package/src/packages/table/src/sort.vue +118 -0
  92. package/src/packages/theme/index.scss +15 -0
  93. package/src/packages/theme/src/column-tooltip.scss +23 -0
  94. package/src/packages/theme/src/common/color.scss +134 -0
  95. package/src/packages/theme/src/description.scss +56 -0
  96. package/src/packages/theme/src/dialog-select.scss +32 -0
  97. package/src/packages/theme/src/fixed-button-group.scss +25 -0
  98. package/src/packages/theme/src/form.scss +11 -0
  99. package/src/packages/theme/src/link-group.scss +43 -0
  100. package/src/packages/theme/src/page-detail.scss +61 -0
  101. package/src/packages/theme/src/page-module.scss +46 -0
  102. package/src/packages/theme/src/preview.scss +67 -0
  103. package/src/packages/theme/src/search-table.scss +185 -0
  104. package/src/packages/theme/src/space.scss +12 -0
  105. package/src/packages/theme/src/sub-title.scss +47 -0
  106. package/src/packages/theme/src/submit-module.scss +13 -0
  107. package/src/packages/theme/src/table.scss +129 -0
  108. package/src/packages/theme/src/toolbar.scss +109 -0
  109. package/src/packages/toolbar/index.js +7 -0
  110. package/src/packages/toolbar/src/main.vue +126 -0
  111. package/src/packages/toolbar/src/setting.vue +217 -0
  112. package/src/packages/toolbar/src/style.vue +68 -0
  113. package/src/packages/toolbar/src/zoom.vue +65 -0
  114. package/src/router.js +83 -0
  115. package/src/utils/config-center.js +218 -0
  116. package/src/utils/function-eval.js +84 -0
  117. package/src/utils/index.js +104 -0
  118. package/src/views/column-tooltip.vue +37 -0
  119. package/src/views/components/OtherSelect.vue +18 -0
  120. package/src/views/description.vue +60 -0
  121. package/src/views/detail.vue +146 -0
  122. package/src/views/directive/number.js +82 -0
  123. package/src/views/enums.vue +22 -0
  124. package/src/views/export.vue +9 -0
  125. package/src/views/form-collapse.vue +185 -0
  126. package/src/views/form.vue +402 -0
  127. package/src/views/link-group.vue +16 -0
  128. package/src/views/preview.vue +33 -0
  129. package/src/views/request.vue +56 -0
  130. package/src/views/search-table.vue +297 -0
  131. package/src/views/table.vue +145 -0
  132. package/src/views/toolbar.vue +30 -0
  133. package/vue.config.js +22 -0
@@ -0,0 +1,375 @@
1
+ <script>
2
+ import isNil from 'lodash/isNil'
3
+ import Space from '@/packages/space'
4
+ import DescriptionText from './text.vue'
5
+ import { getComponentNames } from '@/utils/config-center'
6
+ import functionEval, { isEvalFunction } from '@/utils/function-eval'
7
+ import { isUrl, randomString, splitColsToRow } from '@/utils'
8
+
9
+ const FILE_ICON = {
10
+ img: 'https://prod-common-public.obs-helf.cucloud.cn/user/74f61000000000128620027',
11
+ pdf: 'https://prod-common-public.obs-helf.cucloud.cn/user/e0e61000000000128620062',
12
+ excel: 'https://prod-common-public.obs-helf.cucloud.cn/user/da5a1000000000128609725',
13
+ zip: 'https://prod-common-public.obs-helf.cucloud.cn/user/e6981000000000128620103',
14
+ rar: 'https://prod-common-public.obs-helf.cucloud.cn/user/e6981000000000128620103',
15
+ '7z': 'https://prod-common-public.obs-helf.cucloud.cn/user/e6981000000000128620103',
16
+ ppt: 'https://prod-common-public.obs-helf.cucloud.cn/user/fa371000000000128620154',
17
+ word: 'https://prod-common-public.obs-helf.cucloud.cn/user/97a81000000000128620217',
18
+ default: 'https://prod-common-public.obs-helf.cucloud.cn/user/27351000000000128609979'
19
+ }
20
+
21
+ export default {
22
+ name: 'IovProDescription',
23
+ inject: {
24
+ pageThis: { value: 'pageThis', default: null },
25
+ preview: { value: 'preview', default: null }
26
+ },
27
+ props: {
28
+ // 数据源
29
+ dataSource: {
30
+ type: Object,
31
+ default: () => ({})
32
+ },
33
+ // 当前需要渲染的配置项
34
+ items: {
35
+ type: Array,
36
+ default: () => []
37
+ },
38
+ // 默认值
39
+ defaultValue: {
40
+ type: String,
41
+ default: '--'
42
+ },
43
+ // label宽度
44
+ labelWidth: {
45
+ type: String,
46
+ default: ''
47
+ }
48
+ },
49
+ data() {
50
+ return {
51
+ values: {}
52
+ }
53
+ },
54
+ computed: {
55
+ /**
56
+ * 对原始数据进行处理
57
+ * @time 2024-11-19 11:30:18
58
+ */
59
+ descriptionItems() {
60
+ return this.items.map(item => {
61
+ // 当前label宽度
62
+ const labelWidth = `${item.labelWidth || this.labelWidth}`
63
+ return {
64
+ type: item.type || 'text',
65
+ label: item.label,
66
+ labelWidth: labelWidth.indexOf('px') > 0
67
+ ? labelWidth
68
+ : labelWidth ? `${labelWidth}px` : '',
69
+ vif: item.vif,
70
+ prop: item.prop,
71
+ value: item.value,
72
+ key: item.prop || randomString(),
73
+ enums: item.enums,
74
+ span: item.span || 12,
75
+ config: item.config,
76
+ showOverflowTooltip: item.showOverflowTooltip || false,
77
+ onClick: item.onClick
78
+ }
79
+ })
80
+ }
81
+ },
82
+ watch: {
83
+ /**
84
+ * 监听数据源变化,重新设置值
85
+ * @time 2024-11-19 16:07:12
86
+ */
87
+ dataSource() {
88
+ // 初始化值
89
+ this.initValue()
90
+ },
91
+
92
+ /**
93
+ * 监听配置变化,重新设置值
94
+ * @time 2025-04-17 18:25:48
95
+ */
96
+ items() {
97
+ this.initValue()
98
+ }
99
+ },
100
+ created() {
101
+ // 当前转换函数
102
+ this.functionEval = functionEval(() => ({
103
+ model: this.dataSource,
104
+ $route: this.$route,
105
+ $router: this.$router,
106
+ pageThis: this.pageThis || this.$parent
107
+ }))
108
+ },
109
+ mounted() {
110
+ // 初始化值
111
+ this.initValue()
112
+ },
113
+ methods: {
114
+ /**
115
+ * 初始化值
116
+ * @time 2024-11-19 11:14:48
117
+ */
118
+ initValue() {
119
+ // 如果没有传入需要渲染的值
120
+ const dataSource = this.dataSource || {}
121
+ // 遍历所有数据
122
+ this.descriptionItems.forEach(async item => {
123
+ // 当前值
124
+ const value = isNil(item.value)
125
+ ? dataSource[item.prop]
126
+ : item.value
127
+ // 当前渲染类型
128
+ const itemType = item.type || 'text'
129
+ // 当前枚举字段值
130
+ let enums = []
131
+ // 根据类型去赋值
132
+ switch (itemType) {
133
+ case 'tag': // 如果当前是标签
134
+ case 'enum': // 如果是枚举类型
135
+ // 如果是函数,则需要动态获取
136
+ if (item.enums instanceof Function) {
137
+ enums = await this.functionEval(item.enums)(value) || []
138
+ } else {
139
+ enums = item.enums || []
140
+ }
141
+ // 开始赋值
142
+ this.$set(
143
+ this.values,
144
+ item.key,
145
+ Array.isArray(value)
146
+ ? enums.find(option => value.includes(option.value))
147
+ : enums.find(option => option.value === value)
148
+ )
149
+ break
150
+ default: // 其他类型
151
+ this.$set(this.values, item.key, value)
152
+ break
153
+ }
154
+ })
155
+ },
156
+
157
+ /**
158
+ * 判断当前值是否是空
159
+ * @param {String|Array} val 需要判断的值
160
+ * @time 2024-08-08 11:10:33
161
+ */
162
+ isEmpty(val) {
163
+ // 如果是null,undefined,空字符串都返回true
164
+ if ([null, undefined, ''].includes(val)) {
165
+ return true
166
+ }
167
+ // 如果是空数组,则返回true
168
+ if (Array.isArray(val) && val.length === 0) {
169
+ return true
170
+ }
171
+ // 其他默认有值
172
+ return false
173
+ },
174
+
175
+ /**
176
+ * 触发被点击事件
177
+ * @param {Object} col 当前配置
178
+ * @time 2024-11-19 10:40:44
179
+ */
180
+ onItemClick(item, value) {
181
+ // 如果当前有点击事件
182
+ if (item.onClick) {
183
+ this.functionEval(item.onClick)(value)
184
+ }
185
+ // 如果是文件类型,则
186
+ if (item.type === 'file' && this.preview) {
187
+ // 开始预览文件
188
+ this.preview({
189
+ name: value[item.props?.name || 'name'],
190
+ uuid: value[item.props?.uuid || 'uuid'],
191
+ url: value[item.props?.url || 'url'],
192
+ isPrivate: value[item.props?.isPrivate || 'isPrivate']
193
+ })
194
+ }
195
+ // 触发事件
196
+ this.$emit('item-click', item)
197
+ },
198
+
199
+ /**
200
+ * 根据文件名称获取对应的icon
201
+ * @param {str} fileName 文件名称
202
+ * @time 2025-05-08 10:15:57
203
+ */
204
+ getFileIcon(fileName) {
205
+ const ext = fileName.split('.').pop().toLowerCase()
206
+ if (['png', 'jpg', 'jpeg'].includes(ext)) {
207
+ return FILE_ICON.img
208
+ } else if (['doc', 'docx'].includes(ext)) {
209
+ return FILE_ICON.word
210
+ } else if (['xls', 'xlsx'].includes(ext)) {
211
+ return FILE_ICON.excel
212
+ } else if (['ppt', 'pptx'].includes(ext)) {
213
+ return FILE_ICON.ppt
214
+ } else if (['pdf'].includes(ext)) {
215
+ return FILE_ICON.pdf
216
+ } else {
217
+ return FILE_ICON[ext] || FILE_ICON.default
218
+ }
219
+ }
220
+ },
221
+ render() {
222
+ // 是否需要展示
223
+ const vif = col => [null, undefined, ''].includes(col.vif)
224
+ ? true
225
+ : isEvalFunction(col.vif)
226
+ ? this.functionEval(col.vif)(this.dataSource)
227
+ : col.vif
228
+ // 取出组件
229
+ const [Row, Col, Link, Tag] = getComponentNames(['row', 'col', 'link', 'tag'])
230
+ // 将数据转换到行中
231
+ const itemsInRows = splitColsToRow(this.descriptionItems.filter(vif))
232
+ return (
233
+ <Space space='12' class='iov-pro-description'>
234
+ { // 按行遍历数据
235
+ itemsInRows.map(items => (
236
+ <Row class='iov-pro-description__row' key={items.map(item => item.key).join('|')}>
237
+ { // 遍历每个子项目
238
+ items.map((item) => {
239
+ // 值当前需要展示的组件
240
+ let valueComp = <span>{this.defaultValue}</span>
241
+ // 获取当前需要展示的值
242
+ let value = this.values[item.key]
243
+ // 单项的配置
244
+ const itemConfig = item.config || {}
245
+ // 如果值是空
246
+ if (!this.isEmpty(value)) {
247
+ // 当前插槽名称
248
+ const slotName = item.slotName || item.prop
249
+ // 判断类型
250
+ switch (item.type) {
251
+ case 'text':
252
+ valueComp = <span>{value}</span>
253
+ break
254
+ case 'enum':
255
+ // 将值转换成数组类型
256
+ value = Array.isArray(value) ? value : [value]
257
+ // 开始设置值的组件
258
+ valueComp = <span>{value.map(v => v.label).join(', ')}</span>
259
+ break
260
+ case 'rich-text':
261
+ valueComp = <div v-html={value} />
262
+ break
263
+ case 'tag': // 如果当前是标签
264
+ // 将值转换成数组类型
265
+ value = Array.isArray(value) ? value : [value]
266
+ // 开始设置值的组件
267
+ valueComp = (
268
+ <Space direction='horizontal' space={8}>
269
+ { // 当前值渲染的组件
270
+ value.map(v => <Tag type={v.type} size='small'>{v.label}</Tag>)
271
+ }
272
+ </Space>
273
+ )
274
+ break
275
+ case 'file':
276
+ value = Array.isArray(value) ? value : [value]
277
+ valueComp = (
278
+ <div class='iov-pro-description__link-group'>
279
+ <Space direction='horizontal' space={8}>
280
+ {
281
+ value.map(v => {
282
+ return (
283
+ <Link
284
+ type='primary'
285
+ class={['iov-pro-description__link primary', 'has-icon']}
286
+ underline={false}
287
+ onClick={this.onItemClick.bind(this, item, v)}
288
+ >
289
+ {
290
+ v[itemConfig.props?.icon || 'icon']
291
+ ? isUrl(v[itemConfig.props?.icon || 'icon'])
292
+ ? <img src={v[itemConfig.props?.icon || 'icon']} class='iov-pro-description__link-icon' />
293
+ : null
294
+ : <img src={this.getFileIcon(v[itemConfig.props?.name || 'name'] || v)} class='iov-pro-description__link-icon' />
295
+ }
296
+ {v[itemConfig.props?.name || 'name'] ? v[itemConfig.props?.name || 'name'] : v}
297
+ </Link>
298
+ )
299
+ })
300
+ }
301
+ </Space>
302
+ </div>
303
+ )
304
+ break
305
+ case 'link':
306
+ // 将值转换成数组类型
307
+ value = Array.isArray(value) ? value : [value]
308
+ // 开始设置值的组件
309
+ valueComp = (
310
+ <div class='iov-pro-description__link-group'>
311
+ <Space direction='horizontal' space={8}>
312
+ { // 遍历值的数据
313
+ value.map(v => (
314
+ <Link
315
+ type='primary'
316
+ class={['iov-pro-description__link primary', v[itemConfig.props?.icon || 'icon'] ? 'has-icon' : ''].join(' ')}
317
+ underline={false}
318
+ onClick={this.onItemClick.bind(this, item, v)}
319
+ >
320
+ {
321
+ v[itemConfig.props?.icon || 'icon']
322
+ ? isUrl(v[itemConfig.props?.icon || 'icon'])
323
+ ? <img src={v[itemConfig.props?.icon || 'icon']} class='iov-pro-description__link-icon' />
324
+ : <i class={['iov-pro-description__link-icon', v[itemConfig.props?.icon || 'icon']].join(' ')} />
325
+ : null
326
+ }
327
+ {v[itemConfig.props?.name || 'name'] ? v[itemConfig.props?.name || 'name'] : v}
328
+ </Link>
329
+ ))
330
+ }
331
+ </Space>
332
+ </div>
333
+ )
334
+ break
335
+ case 'slot':
336
+ // 如果当前放了自定义插槽,则调用方法生成
337
+ if (this.$scopedSlots[slotName]) {
338
+ valueComp = this.$scopedSlots[slotName]({ data: value })
339
+ }
340
+ break
341
+ default:
342
+ valueComp = <span>{value}</span>
343
+ break
344
+ }
345
+ // 如果组件需要超出隐藏
346
+ if (item.showOverflowTooltip) {
347
+ valueComp = (
348
+ <DescriptionText>{valueComp}</DescriptionText>
349
+ )
350
+ }
351
+ }
352
+ // 当前label的样式
353
+ const labelStyle = [null, undefined].includes(item.labelWidth)
354
+ ? {}
355
+ : { width: item.labelWidth }
356
+ return (
357
+ <Col
358
+ span={item.span}
359
+ key={item.key}
360
+ class='iov-pro-description__col'
361
+ >
362
+ <div style={labelStyle} class='iov-pro-description__label'>{item.label && `${item.label}:`}</div>
363
+ <div class='iov-pro-description__value'>{valueComp}</div>
364
+ </Col>
365
+ )
366
+ })
367
+ }
368
+ </Row>
369
+ ))
370
+ }
371
+ </Space>
372
+ )
373
+ }
374
+ }
375
+ </script>
@@ -0,0 +1,103 @@
1
+ <script>
2
+ import { getComponentNames } from '@/utils/config-center'
3
+
4
+ export default {
5
+ name: 'IovProText',
6
+ props: {
7
+ lineClamp: {
8
+ type: Number,
9
+ default: 1
10
+ },
11
+ placement: {
12
+ type: String,
13
+ default: 'top'
14
+ }
15
+ },
16
+ data() {
17
+ return {
18
+ content: ''
19
+ }
20
+ },
21
+ computed: {
22
+ /**
23
+ * 文案样式
24
+ * @time 2024-05-08 17:36:42
25
+ */
26
+ textStyle() {
27
+ return {
28
+ '-webkit-line-clamp': this.lineClamp
29
+ }
30
+ }
31
+ },
32
+ methods: {
33
+ /**
34
+ * 检测文案移除状态
35
+ * @time 2024-05-08 17:16:55
36
+ */
37
+ detectOverflowStatus() {
38
+ // 如果当前不需要显示省略号
39
+ if (this.lineClamp === 0) {
40
+ return
41
+ }
42
+ // 先清空内容
43
+ this.content = ''
44
+ // 当前文案dom实例
45
+ const $el = this.$refs.text
46
+ // 当前块的长度
47
+ const blockWidth = $el.offsetWidth
48
+ // 如果当前有元素,才计算是否需要tooltip
49
+ if ($el.innerText) {
50
+ // 创建一个承接内容的透明区域用于计算宽度
51
+ const span = document.createElement('span')
52
+ // 获取当前样式
53
+ const style = getComputedStyle($el)
54
+ // 设置样式
55
+ span.setAttribute(
56
+ 'style',
57
+ [
58
+ `font: ${style.font}`,
59
+ `font-weight: ${style.fontWeight}`,
60
+ 'opactiy: 0',
61
+ 'position: fixed',
62
+ 'top: 100vh',
63
+ 'white-space: nowrap'
64
+ ].join('; ')
65
+ )
66
+ // 将当前文案塞进去
67
+ span.appendChild(
68
+ document.createTextNode($el.innerText)
69
+ )
70
+ // 将当前临时dom插到body下
71
+ document.body.appendChild(span)
72
+ // 当前文本宽度
73
+ const textWidth = span.offsetWidth
74
+ // 如果当前顶格了,说明超长
75
+ if (blockWidth * this.lineClamp < textWidth) {
76
+ this.content = $el.innerText
77
+ }
78
+ // 移除当前临时区块
79
+ document.body.removeChild(span)
80
+ }
81
+ }
82
+ },
83
+ render() {
84
+ const [Tooltip] = getComponentNames(['tooltip'])
85
+ return (
86
+ <Tooltip
87
+ disabled={!this.content}
88
+ content={this.content}
89
+ placement={this.placement}
90
+ >
91
+ <div
92
+ ref='text'
93
+ style={this.textStyle}
94
+ class='iov-pro-text__content'
95
+ onMouseover={this.detectOverflowStatus.bind(this)}
96
+ >
97
+ {this.$slots.default}
98
+ </div>
99
+ </Tooltip>
100
+ )
101
+ }
102
+ }
103
+ </script>
@@ -0,0 +1,7 @@
1
+ import DialogSelect from './src/main.vue'
2
+
3
+ DialogSelect.install = function(Vue) {
4
+ Vue.component(DialogSelect.name, DialogSelect)
5
+ }
6
+
7
+ export default DialogSelect