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,308 @@
1
+ <template>
2
+ <el-dialog
3
+ ref="dialog"
4
+ :visible.sync="showDialog"
5
+ :title="title"
6
+ width="1096px"
7
+ class="iov-pro-dialog-select"
8
+ :close-on-click-modal="false"
9
+ append-to-body
10
+ @close="onClose"
11
+ >
12
+ <div
13
+ v-if="showDialog"
14
+ ref="content"
15
+ class="iov-pro-dialog-select__table"
16
+ >
17
+ <el-tabs
18
+ v-model="activeName"
19
+ type="card"
20
+ size="small"
21
+ >
22
+ <div class="iov-pro-dialog-select__filter">
23
+ <el-input
24
+ v-model="filterText"
25
+ :placeholder="placeholder"
26
+ prefix-icon="iov-icon-search"
27
+ size="small"
28
+ />
29
+ </div>
30
+ <el-tab-pane
31
+ label="全部"
32
+ name="0"
33
+ >
34
+ <IovProTable
35
+ ref="unselect"
36
+ :columns="unselectColumns"
37
+ :data-source="unselectList"
38
+ :config="{table: { border: true, size: 'small', rowKey, maxHeight: tableHeight }, pagination: false}"
39
+ @selection-change="onChangeSelection"
40
+ />
41
+ </el-tab-pane>
42
+ <el-tab-pane
43
+ :label="`本次已选 (${selectedData.length})`"
44
+ type="card"
45
+ name="1"
46
+ >
47
+ <IovProTable
48
+ ref="selected"
49
+ :columns="selectedColumns"
50
+ :data-source="selectedList"
51
+ :config="{table: { border: true, size: 'small', maxHeight: tableHeight }, pagination: false}"
52
+ >
53
+ <template #operation="scope">
54
+ <el-link
55
+ type="primary"
56
+ @click="onRemove(scope.row)"
57
+ >移除</el-link>
58
+ </template>
59
+ </IovProTable>
60
+ </el-tab-pane>
61
+ </el-tabs>
62
+ </div>
63
+ <template slot="footer">
64
+ <el-button
65
+ round
66
+ size="small"
67
+ @click="showDialog = false"
68
+ >取消</el-button>
69
+ <el-button
70
+ type="primary"
71
+ round
72
+ size="small"
73
+ @click="onConfirm"
74
+ >确定</el-button>
75
+ </template>
76
+ </el-dialog>
77
+ </template>
78
+ <script>
79
+ import cloneDeep from 'lodash/cloneDeep'
80
+ export default {
81
+ name: 'IovProDialogSelect',
82
+ props: {
83
+ value: {
84
+ type: Array,
85
+ default: () => ([])
86
+ },
87
+ title: {
88
+ type: String,
89
+ default: ''
90
+ },
91
+ rowKey: {
92
+ type: String,
93
+ default: ''
94
+ },
95
+ // 过滤字段
96
+ filterField: {
97
+ type: Array,
98
+ default: () => ([])
99
+ },
100
+ // 全部列scheme
101
+ unselectColumns: {
102
+ type: Array,
103
+ default: () => ([])
104
+ },
105
+ // 已选列scheme
106
+ selectedColumns: {
107
+ type: Array,
108
+ default: () => ([])
109
+ },
110
+ // 全部数据列表
111
+ data: {
112
+ type: Array,
113
+ default: () => ([])
114
+ },
115
+ placeholder: {
116
+ type: String,
117
+ default: '请输入关键字'
118
+ },
119
+ visible: {
120
+ type: Boolean,
121
+ default: false
122
+ }
123
+ },
124
+ data() {
125
+ return {
126
+ showDialog: false,
127
+ activeName: '0',
128
+ filterText: '',
129
+ selectedData: [],
130
+ tableHeight: 'auto'
131
+ }
132
+ },
133
+ computed: {
134
+ unselectList() {
135
+ const data = cloneDeep(this.data)
136
+ // 如果切换到已选择tab
137
+ if (this.activeName === '1') {
138
+ return data
139
+ }
140
+ // 如果当前没有过滤数据
141
+ if ([null, undefined, ''].includes(this.filterText) || this.filterField.length === 0) {
142
+ return data
143
+ }
144
+ // 返回过滤后的数据
145
+ return data.filter(item => {
146
+ return this.filterField.some(name => {
147
+ return item[name].indexOf(this.filterText) >= 0
148
+ })
149
+ })
150
+ },
151
+ selectedList() {
152
+ // 如果切换到未选择tab
153
+ if (this.activeName === '0') {
154
+ return this.selectedData
155
+ }
156
+ // 如果当前没有过滤数据
157
+ if ([null, undefined, ''].includes(this.filterText) || this.filterField.length === 0) {
158
+ return this.selectedData
159
+ }
160
+ // 返回过滤后的数据
161
+ return this.selectedData.filter(item => {
162
+ return this.filterField.some(name => {
163
+ return item[name].indexOf(this.filterText) >= 0
164
+ })
165
+ })
166
+ }
167
+ },
168
+ watch: {
169
+ visible(val) {
170
+ this.showDialog = val
171
+ if (val) {
172
+ this.$nextTick(() => {
173
+ this.selectedData = this.value
174
+ this.$refs.unselect.$refs.table.clearSelection()
175
+ this.selectedData.forEach(row => {
176
+ this.$refs.unselect.$refs.table.toggleRowSelection(row)
177
+ })
178
+ this.initHeight()
179
+ })
180
+ } else {
181
+ this.filterText = ''
182
+ this.activeName = '0'
183
+ this.selectedData = []
184
+ this.$refs.unselect.$refs.table.clearSelection()
185
+ }
186
+ },
187
+ activeName() {
188
+ this.filterText = ''
189
+ }
190
+ },
191
+ methods: {
192
+ /**
193
+ * 初始化弹窗内容高度
194
+ * @time 2025-04-10 15:00:23
195
+ */
196
+ initHeight() {
197
+ if (this.timer) {
198
+ clearTimeout(this.timer)
199
+ }
200
+ this.timer = setTimeout(() => {
201
+ const dialogBodyHeight = this.getDialogBodyHeight()
202
+ const { tabHeaderHeight, tabFilterHeight, contentHeight } = this.getDialogContentHeight()
203
+ if (contentHeight >= dialogBodyHeight) {
204
+ this.tableHeight = Math.ceil((dialogBodyHeight - tabHeaderHeight - tabFilterHeight)) + 'px'
205
+ // 固定弹窗内容高度
206
+ this.$refs.content.style.height = dialogBodyHeight + 'px'
207
+ this.$refs.unselect.$refs.table.doLayout()
208
+ this.setDialogFooterShadow()
209
+ } else {
210
+ // 固定弹窗内容高度
211
+ this.$refs.content.style.height = contentHeight + 'px'
212
+ this.tableHeight = 'auto'
213
+ }
214
+ }, 100)
215
+ },
216
+
217
+ /**
218
+ * 设置弹窗按钮区域投影
219
+ * @time 2025-04-24 19:28:27
220
+ */
221
+ setDialogFooterShadow() {
222
+ const footer = this.$refs.dialog.$el.querySelector('.el-dialog__footer')
223
+ footer.style.boxShadow = '0px 0px 12px 0px rgba(196, 198, 207, 0.21)'
224
+ },
225
+
226
+ /**
227
+ * 弹窗内部高度
228
+ * @time 2025-04-23 15:31:29
229
+ */
230
+ getDialogBodyHeight() {
231
+ const body = this.$refs.dialog.$el.querySelector('.el-dialog__body')
232
+ const style = window.getComputedStyle(body)
233
+ const height = Math.ceil(+style.maxHeight.replace('px', ''))
234
+ return height
235
+ },
236
+
237
+ /**
238
+ * 弹窗内容高度
239
+ * @time 2025-04-23 15:32:53
240
+ */
241
+ getDialogContentHeight() {
242
+ const tabHeader = this.$refs.content.querySelector('.el-tabs__header')
243
+ const tabFilter = this.$refs.content.querySelector('.iov-pro-dialog-select__filter')
244
+ const tabHeaderStyle = window.getComputedStyle(tabHeader)
245
+ const tabFilterStyle = window.getComputedStyle(tabFilter)
246
+ const contentStyle = window.getComputedStyle(this.$refs.content)
247
+ return {
248
+ // tab高度 height + margin-bottom + border-bottom-width
249
+ tabHeaderHeight: Math.ceil(+tabHeaderStyle.height.replace('px', '')) + Math.ceil(+tabHeaderStyle.marginBottom.replace('px', '') + 1),
250
+ // 搜索框高度
251
+ tabFilterHeight: Math.ceil(+tabFilterStyle.height.replace('px', '')) + Math.ceil(+tabFilterStyle.marginBottom.replace('px', '')),
252
+ // 内容总高度 包括tab + 搜索框 + 表格
253
+ contentHeight: Math.ceil(+contentStyle.height.replace('px', ''))
254
+ }
255
+ },
256
+
257
+ /**
258
+ * 表格选择事件
259
+ * @param {arr} selection 已选择的项
260
+ * @time 2025-03-17 19:56:24
261
+ */
262
+ onChangeSelection(selection) {
263
+ this.selectedData = cloneDeep(selection) || []
264
+ },
265
+
266
+ /**
267
+ * 除移数据
268
+ * @param {obj} row 当前行数据
269
+ * @time 2024-12-20 13:59:57
270
+ */
271
+ onRemove(row) {
272
+ // 过滤出本次不需要删除的数据
273
+ const selectedData = this.selectedData.filter(item => item[this.rowKey] !== row[this.rowKey])
274
+ // 清空表格选择的数据
275
+ this.$refs.unselect.$refs.table.clearSelection()
276
+ // 重新赋值选择的数据
277
+ selectedData.forEach(row => {
278
+ this.$refs.unselect.$refs.table.toggleRowSelection(row)
279
+ })
280
+ },
281
+
282
+ /**
283
+ * 关闭弹窗
284
+ * @time 2025-03-17 19:56:54
285
+ */
286
+ onClose() {
287
+ this.$emit('update:visible', false)
288
+ },
289
+
290
+ /**
291
+ * 确定事件
292
+ * @time 2024-12-20 14:20:19
293
+ */
294
+ onConfirm() {
295
+ const selectedData = this.selectedData.map(item => {
296
+ // 如果已选择的数据中包含其他字段, 则使用初始传进来的数据
297
+ const val = this.value.filter(row => item[this.rowKey] === row[this.rowKey])
298
+ if (val.length > 0) {
299
+ return val[0]
300
+ }
301
+ return item
302
+ })
303
+ this.$emit('input', selectedData)
304
+ this.onClose()
305
+ }
306
+ }
307
+ }
308
+ </script>
@@ -0,0 +1,7 @@
1
+ import Display from './src/main.vue'
2
+
3
+ Display.install = function(Vue) {
4
+ Vue.component(Display.name, Display)
5
+ }
6
+
7
+ export default Display
@@ -0,0 +1,44 @@
1
+ <template>
2
+ <div
3
+ v-if="isLoaded"
4
+ v-show="isVisible"
5
+ class="iov-pro-display"
6
+ >
7
+ <slot />
8
+ </div>
9
+ </template>
10
+
11
+ <script>
12
+ export default {
13
+ name: 'IovProDisplay',
14
+ props: {
15
+ visible: {
16
+ type: Boolean,
17
+ default: false
18
+ }
19
+ },
20
+ data() {
21
+ return {
22
+ isVisible: false,
23
+ isLoaded: false
24
+ }
25
+ },
26
+ watch: {
27
+ /**
28
+ * 监听visible变化
29
+ * @time 2024-12-31 09:36:37
30
+ */
31
+ visible: {
32
+ handler(val) {
33
+ // 重新赋值
34
+ this.isVisible = val
35
+ // 如果当前已经展示
36
+ if (val) {
37
+ this.isLoaded = true
38
+ }
39
+ },
40
+ immediate: true
41
+ }
42
+ }
43
+ }
44
+ </script>
@@ -0,0 +1,7 @@
1
+ import Enums from './src/main.vue'
2
+
3
+ Enums.install = function(Vue) {
4
+ Vue.component(Enums.name, Enums)
5
+ }
6
+
7
+ export default Enums
@@ -0,0 +1,23 @@
1
+ <script>
2
+ export default {
3
+ name: 'IovProEnums',
4
+ props: {
5
+ value: {
6
+ type: [Number, String, Boolean],
7
+ default: null
8
+ },
9
+ enums: {
10
+ type: Array,
11
+ default: () => []
12
+ }
13
+ },
14
+ render() {
15
+ // 如果有返回数据,则不渲染
16
+ if ([null, undefined].includes(this.value)) {
17
+ return null
18
+ }
19
+ // 取出枚举字段渲染
20
+ return <span>{ this.enums.find(item => item.value === this.value)?.label }</span>
21
+ }
22
+ }
23
+ </script>
@@ -0,0 +1,7 @@
1
+ import Export from './src/main.vue'
2
+
3
+ Export.install = function(Vue) {
4
+ Vue.component(Export.name, Export)
5
+ }
6
+
7
+ export default Export