@wp1001/ui 2.9.13

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 (177) hide show
  1. package/.env +6 -0
  2. package/@vant-D4fmGxs6.js +3891 -0
  3. package/index.js +8419 -0
  4. package/package.json +59 -0
  5. package/packages/assets/devtools-detector.js +2 -0
  6. package/packages/components/xarray/index.js +64 -0
  7. package/packages/components/xarray/xarray.vue +57 -0
  8. package/packages/components/xautorows/index.js +35 -0
  9. package/packages/components/xautorows/xautorows.vue +29 -0
  10. package/packages/components/xbutton/mobile.js +3 -0
  11. package/packages/components/xbutton/mobile.vue +9 -0
  12. package/packages/components/xbutton/pc.js +3 -0
  13. package/packages/components/xbutton/pc.vue +9 -0
  14. package/packages/components/xbuttons/mobile.js +51 -0
  15. package/packages/components/xbuttons/mobile.vue +12 -0
  16. package/packages/components/xbuttons/pc.js +51 -0
  17. package/packages/components/xbuttons/pc.vue +16 -0
  18. package/packages/components/xchart/constants.js +58 -0
  19. package/packages/components/xchart/index.js +263 -0
  20. package/packages/components/xchart/utils.js +121 -0
  21. package/packages/components/xchart/xchart.vue +173 -0
  22. package/packages/components/xcheckboxs/mobile.js +58 -0
  23. package/packages/components/xcheckboxs/mobile.vue +38 -0
  24. package/packages/components/xcheckboxs/pc.js +49 -0
  25. package/packages/components/xcheckboxs/pc.vue +42 -0
  26. package/packages/components/xcol/mobile.js +10 -0
  27. package/packages/components/xcol/mobile.vue +9 -0
  28. package/packages/components/xcol/pc.js +10 -0
  29. package/packages/components/xcol/pc.vue +9 -0
  30. package/packages/components/xdatepicker/mobile.js +71 -0
  31. package/packages/components/xdatepicker/mobile.vue +44 -0
  32. package/packages/components/xdatepicker/pc.js +9 -0
  33. package/packages/components/xdatepicker/pc.vue +12 -0
  34. package/packages/components/xdialog/mobile.js +60 -0
  35. package/packages/components/xdialog/mobile.vue +43 -0
  36. package/packages/components/xdialog/pc.js +64 -0
  37. package/packages/components/xdialog/pc.vue +51 -0
  38. package/packages/components/xdict/index.js +47 -0
  39. package/packages/components/xdict/xdict.vue +9 -0
  40. package/packages/components/xdistrictselect/mobile.js +79 -0
  41. package/packages/components/xdistrictselect/mobile.vue +28 -0
  42. package/packages/components/xdistrictselect/pc.js +127 -0
  43. package/packages/components/xdistrictselect/pc.vue +32 -0
  44. package/packages/components/xform/mobile.js +29 -0
  45. package/packages/components/xform/mobile.vue +43 -0
  46. package/packages/components/xform/pc.js +42 -0
  47. package/packages/components/xform/pc.vue +76 -0
  48. package/packages/components/xform/utils.js +95 -0
  49. package/packages/components/xformitem/mobile.js +56 -0
  50. package/packages/components/xformitem/mobile.vue +3 -0
  51. package/packages/components/xformitem/pc.js +72 -0
  52. package/packages/components/xformitem/pc.vue +10 -0
  53. package/packages/components/xformitem/utils.jsx +181 -0
  54. package/packages/components/xicon/mobile.js +35 -0
  55. package/packages/components/xicon/mobile.vue +9 -0
  56. package/packages/components/xicon/pc.js +35 -0
  57. package/packages/components/xicon/pc.vue +11 -0
  58. package/packages/components/xinfo/index.js +100 -0
  59. package/packages/components/xinfo/xinfo.vue +140 -0
  60. package/packages/components/xlooper/index.js +7 -0
  61. package/packages/components/xlooper/xlooper.vue +20 -0
  62. package/packages/components/xpagination/mobile.js +21 -0
  63. package/packages/components/xpagination/mobile.vue +31 -0
  64. package/packages/components/xpagination/pc.js +21 -0
  65. package/packages/components/xpagination/pc.vue +16 -0
  66. package/packages/components/xpicker/index.js +38 -0
  67. package/packages/components/xpicker/xpicker.vue +29 -0
  68. package/packages/components/xradios/mobile.js +40 -0
  69. package/packages/components/xradios/mobile.vue +22 -0
  70. package/packages/components/xradios/pc.js +53 -0
  71. package/packages/components/xradios/pc.vue +43 -0
  72. package/packages/components/xrow/mobile.js +9 -0
  73. package/packages/components/xrow/mobile.vue +23 -0
  74. package/packages/components/xrow/pc.js +9 -0
  75. package/packages/components/xrow/pc.vue +22 -0
  76. package/packages/components/xscan/mobile.js +24 -0
  77. package/packages/components/xscan/mobile.vue +21 -0
  78. package/packages/components/xscan/pc.js +20 -0
  79. package/packages/components/xscan/pc.vue +18 -0
  80. package/packages/components/xsearcher/index.js +198 -0
  81. package/packages/components/xsearcher/xsearcher.vue +170 -0
  82. package/packages/components/xselect/mobile.js +86 -0
  83. package/packages/components/xselect/mobile.vue +24 -0
  84. package/packages/components/xselect/pc.js +114 -0
  85. package/packages/components/xselect/pc.vue +55 -0
  86. package/packages/components/xselect/util.js +66 -0
  87. package/packages/components/xselectv2/index.js +91 -0
  88. package/packages/components/xselectv2/xselectv2.vue +46 -0
  89. package/packages/components/xtable/mobile.js +108 -0
  90. package/packages/components/xtable/mobile.vue +246 -0
  91. package/packages/components/xtable/pc.js +143 -0
  92. package/packages/components/xtable/pc.vue +421 -0
  93. package/packages/components/xtable/searcher.js +477 -0
  94. package/packages/components/xtable/searcher.jsx +330 -0
  95. package/packages/components/xtable/searcher.vue +133 -0
  96. package/packages/components/xtable/settings.js +80 -0
  97. package/packages/components/xtable/settings.vue +77 -0
  98. package/packages/components/xtable/utils.js +692 -0
  99. package/packages/components/xtabletools/mobile.js +25 -0
  100. package/packages/components/xtabletools/mobile.vue +126 -0
  101. package/packages/components/xtabletools/pc.js +18 -0
  102. package/packages/components/xtabletools/pc.vue +135 -0
  103. package/packages/components/xtablev2/index.js +53 -0
  104. package/packages/components/xtablev2/utils.jsx +214 -0
  105. package/packages/components/xtablev2/xtablev2.vue +147 -0
  106. package/packages/components/xtags/mobile.js +17 -0
  107. package/packages/components/xtags/mobile.vue +21 -0
  108. package/packages/components/xtags/pc.js +17 -0
  109. package/packages/components/xtags/pc.vue +22 -0
  110. package/packages/components/xtinymce/index.js +71 -0
  111. package/packages/components/xtinymce/xtinymce.vue +9 -0
  112. package/packages/components/xuploader/xfileuploader.js +48 -0
  113. package/packages/components/xuploader/xfileuploader.vue +54 -0
  114. package/packages/components/xuploader/ximageuploader.js +53 -0
  115. package/packages/components/xuploader/ximageuploader.vue +52 -0
  116. package/packages/comps.js +108 -0
  117. package/packages/controllers/BaseController.js +125 -0
  118. package/packages/controllers/CrudController.js +907 -0
  119. package/packages/controllers/TempCrudController.js +32 -0
  120. package/packages/controllers/index.js +15 -0
  121. package/packages/directives/el-table-infinite-scroll.js +55 -0
  122. package/packages/directives/index.js +5 -0
  123. package/packages/index.js +81 -0
  124. package/packages/index.scss +4 -0
  125. package/packages/layout/breadcrumb/breadcrumb.vue +31 -0
  126. package/packages/layout/breadcrumb/index.js +41 -0
  127. package/packages/layout/header/header.vue +281 -0
  128. package/packages/layout/header/inner.js +11 -0
  129. package/packages/layout/header/inner.vue +3 -0
  130. package/packages/layout/mobile-menu.vue +83 -0
  131. package/packages/layout/mobile-tabs.vue +54 -0
  132. package/packages/layout/pc.vue +85 -0
  133. package/packages/layout/screenlock/index.js +129 -0
  134. package/packages/layout/screenlock/screenlock.vue +85 -0
  135. package/packages/layout/sidebar/item.js +16 -0
  136. package/packages/layout/sidebar/item.vue +16 -0
  137. package/packages/layout/sidebar/menu.js +72 -0
  138. package/packages/layout/sidebar/menu.vue +106 -0
  139. package/packages/layout/sidebar/sidebar.vue +147 -0
  140. package/packages/layout/tagsview/ScrollPane.js +65 -0
  141. package/packages/layout/tagsview/ScrollPane.vue +24 -0
  142. package/packages/layout/tagsview/index.js +169 -0
  143. package/packages/layout/tagsview/index.vue +124 -0
  144. package/packages/plop/actions/make-fill-admin-partials-action.js +95 -0
  145. package/packages/plop/generators/make-admin-page.js +39 -0
  146. package/packages/plop/generators/make-database-admin-pages.js +84 -0
  147. package/packages/plop/generators/make-page-generator.js +52 -0
  148. package/packages/plop/generators/make-simple-page.js +20 -0
  149. package/packages/plop/plopfile.js +24 -0
  150. package/packages/plop/templates/admin_page/controller.js +3 -0
  151. package/packages/plop/templates/admin_page/model.js +24 -0
  152. package/packages/plop/templates/admin_page/{{snakeCase pagename}}-scoped.scss +3 -0
  153. package/packages/plop/templates/admin_page/{{snakeCase pagename}}.vue +11 -0
  154. package/packages/plop/templates/simple_page/controller.js +3 -0
  155. package/packages/plop/templates/simple_page/model.js +6 -0
  156. package/packages/plop/templates/simple_page/{{snakeCase pagename}}-scoped.scss +3 -0
  157. package/packages/plop/templates/simple_page/{{snakeCase pagename}}.vue +7 -0
  158. package/packages/plop/utils/index.js +168 -0
  159. package/packages/plop/utils/plop-utils.js +86 -0
  160. package/packages/styles/common.scss +137 -0
  161. package/packages/styles/element-ui.scss +142 -0
  162. package/packages/styles/vant.scss +133 -0
  163. package/packages/styles/variables.scss +23 -0
  164. package/packages/utils/crypt.js +24 -0
  165. package/packages/utils/decorators.js +67 -0
  166. package/packages/utils/disallowDevtools.js +53 -0
  167. package/packages/utils/effects.js +173 -0
  168. package/packages/utils/funcs.js +78 -0
  169. package/packages/utils/index.js +95 -0
  170. package/packages/utils/message.js +110 -0
  171. package/packages/utils/middlewares.js +86 -0
  172. package/packages/utils/model.js +71 -0
  173. package/packages/utils/modelUtils.js +203 -0
  174. package/packages/utils/request.js +57 -0
  175. package/packages/utils/site.js +33 -0
  176. package/packages/vite-plugins.js +141 -0
  177. package/publish.sh +12 -0
@@ -0,0 +1,126 @@
1
+ <script>
2
+ export { default } from './mobile.js'
3
+ </script>
4
+
5
+ <template>
6
+ <div class="x-table-tools mobile-x-table-tools">
7
+ <span ref="fbc" v-domid="domids['add']" class="floating-bubble-checker" />
8
+ <van-floating-bubble
9
+ v-if="domidsCanAdd"
10
+ axis="xy"
11
+ magnetic="x"
12
+ icon="plus"
13
+ class="flex-center x-table-add"
14
+ style="position: fixed; top: 0; font-size: 22px; width: 40px; height: 40px; background-color: #1989fa; border-radius: 50%; color: white;"
15
+ @click="$emit('add')"
16
+ />
17
+ <div class="tools">
18
+ <slot name="tools-prefix" />
19
+
20
+ <van-search
21
+ v-if="!!$attrs.onKeywordsSearch"
22
+ v-domid="domids['keywords-search']"
23
+ v-model="keywords"
24
+ :placeholder="$attrs['keywords-placeholder'] || '输入关键词搜索'"
25
+ clearable
26
+ show-action
27
+ class="keywords-search"
28
+ @search="$emit('keywords-search', keywords.trim())"
29
+ >
30
+ <template #action>
31
+ <div @click="$emit('keywords-search', keywords.trim())">搜索</div>
32
+ </template>
33
+ </van-search>
34
+
35
+ <van-button
36
+ v-if="!!$attrs.onSearch"
37
+ v-bind="{ type: 'success', ...searchBtn }"
38
+ v-domid="domids['search']"
39
+ class="x-table-search"
40
+ @click="$emit('search')"
41
+ >
42
+ <mobile-x-icon name="search" />
43
+ 高级查询
44
+ </van-button>
45
+ <van-button
46
+ v-if="!!$attrs.onMultiEdit"
47
+ v-bind="{ type: 'warning', ...multiEditBtn }"
48
+ v-domid="domids['multi-edit']"
49
+ class="x-table-edit"
50
+ @click="$emit('multi-edit')"
51
+ >
52
+ <mobile-x-icon name="edit" />
53
+ 编辑
54
+ </van-button>
55
+ <van-button
56
+ v-if="!!$attrs.onMultiDelete"
57
+ v-bind="{ type: 'danger', ...multiDeleteBtn }"
58
+ v-domid="domids['multi-delete']"
59
+ class="x-table-multi-delete"
60
+ @click="$emit('multi-delete')"
61
+ >
62
+ <mobile-x-icon name="DeleteFilled" />
63
+ 批量删除
64
+ </van-button>
65
+ <van-button
66
+ v-if="!!$attrs.onExport"
67
+ v-bind="{ type: 'success', ...exportBtn }"
68
+ v-domid="domids['export']"
69
+ class="x-table-export"
70
+ @click="$emit('export')"
71
+ >
72
+ <mobile-x-icon name="printer" />
73
+ 导出
74
+ </van-button>
75
+ <van-button
76
+ v-if="!!$attrs.onSearchExport"
77
+ v-bind="{ type: 'success', ...exportBtn }"
78
+ v-domid="domids['search-export']"
79
+ class="x-table-search-export"
80
+ @click="$emit('search-export')"
81
+ >
82
+ <mobile-x-icon name="printer" />
83
+ 查询导出
84
+ </van-button>
85
+ <van-button
86
+ v-if="!!$attrs.onImport"
87
+ v-bind="{ type: 'warning', ...importBtn }"
88
+ v-domid="domids['import']"
89
+ class="x-table-import"
90
+ @click="$emit('import')"
91
+ >
92
+ <mobile-x-icon name="UploadFilled" />
93
+ 导入
94
+ </van-button>
95
+
96
+ <slot name="tools-suffix" />
97
+
98
+ <div class="tools-end">
99
+ <slot name="tools-end" />
100
+ </div>
101
+ </div>
102
+ </div>
103
+ </template>
104
+
105
+ <style lang="scss" scoped>
106
+ .mobile-x-table-tools {
107
+ margin: 5px;
108
+ .tools {
109
+ position: relative;
110
+ min-height: 32px;
111
+ .van-button {
112
+ width: calc(33.33% - 6px);
113
+ height: 30px;
114
+ margin: 3px;
115
+ }
116
+ }
117
+ .tools-end {
118
+ position: absolute;
119
+ right: 0;
120
+ top: 0;
121
+ :deep(.van-icon) {
122
+ margin-right: 0;
123
+ }
124
+ }
125
+ }
126
+ </style>
@@ -0,0 +1,18 @@
1
+ export default {
2
+ name: 'PcXTableTools',
3
+ inheritAttrs: false,
4
+ props: {
5
+ searchBtn: Object,
6
+ addBtn: Object,
7
+ multiEditBtn: Object,
8
+ multiDeleteBtn: Object,
9
+ exportBtn: Object,
10
+ importBtn: Object,
11
+ domids: Object
12
+ },
13
+ data () {
14
+ return {
15
+ keywords: ''
16
+ }
17
+ }
18
+ }
@@ -0,0 +1,135 @@
1
+ <script>
2
+ export { default } from './pc.js'
3
+ </script>
4
+
5
+ <template>
6
+ <el-card shadow="hover" :body-style="{ padding: '10px' }" class="x-table-tools pc-x-table-tools">
7
+ <div class="tools">
8
+ <slot name="tools-prefix" />
9
+
10
+ <el-input
11
+ v-if="!!$attrs.onKeywordsSearch"
12
+ v-domid="domids['keywords-search']"
13
+ v-model="keywords"
14
+ :placeholder="$attrs['keywords-placeholder'] || '输入关键词搜索'"
15
+ clearable
16
+ class="keywords-search"
17
+ @keyup.enter="$emit('keywords-search', keywords.trim())"
18
+ />
19
+
20
+ <el-button
21
+ v-if="!!$attrs.onSearch"
22
+ v-bind="{ type: 'success', ...searchBtn }"
23
+ v-domid="domids['search']"
24
+ icon="search"
25
+ class="x-table-search"
26
+ @click="$emit('search')"
27
+ >
28
+ {{ $attrs['search-btn-text'] ?? '高级查询' }}
29
+ </el-button>
30
+ <el-button
31
+ v-if="!!$attrs.onAdd"
32
+ v-bind="{ type: 'primary', ...addBtn }"
33
+ v-domid="domids['add']"
34
+ icon="circle-plus-filled"
35
+ class="x-table-add"
36
+ @click="$emit('add')"
37
+ >
38
+ {{ $attrs['add-btn-text'] ?? '新增' }}
39
+ </el-button>
40
+ <el-button
41
+ v-if="!!$attrs.onMultiEdit"
42
+ v-bind="{ type: 'warning', ...multiEditBtn }"
43
+ v-domid="domids['multi-edit']"
44
+ icon="edit"
45
+ class="x-table-edit"
46
+ @click="$emit('multi-edit')"
47
+ >
48
+ {{ $attrs['edit-btn-text'] ?? '编辑' }}
49
+ </el-button>
50
+ <el-button
51
+ v-if="!!$attrs.onMultiDelete"
52
+ v-bind="{ type: 'danger', ...multiDeleteBtn }"
53
+ v-domid="domids['multi-delete']"
54
+ icon="DeleteFilled"
55
+ class="x-table-multi-delete"
56
+ @click="$emit('multi-delete')"
57
+ >
58
+ {{ $attrs['multi-delete-btn-text'] ?? '批量删除' }}
59
+ </el-button>
60
+ <el-button
61
+ v-if="!!$attrs.onExport"
62
+ v-bind="{ type: 'success', ...exportBtn }"
63
+ v-domid="domids['export']"
64
+ icon="printer"
65
+ class="x-table-export"
66
+ @click="$emit('export')"
67
+ >
68
+ {{ $attrs['export-btn-text'] ?? '导出' }}
69
+ </el-button>
70
+ <el-button
71
+ v-if="!!$attrs.onSearchExport"
72
+ v-bind="{ type: 'success', ...exportBtn }"
73
+ v-domid="domids['search-export']"
74
+ icon="printer"
75
+ class="x-table-search-export"
76
+ @click="$emit('search-export')"
77
+ >
78
+ {{ $attrs['search-export-btn-text'] ?? '查询导出' }}
79
+ </el-button>
80
+ <el-button
81
+ v-if="!!$attrs.onImport"
82
+ v-bind="{ type: 'warning', ...importBtn }"
83
+ v-domid="domids['import']"
84
+ icon="UploadFilled"
85
+ class="x-table-import"
86
+ @click="$emit('import')"
87
+ >
88
+ {{ $attrs['import-btn-text'] ?? '导入' }}
89
+ </el-button>
90
+
91
+ <slot name="tools-suffix" />
92
+
93
+ <div class="tools-end flex-center">
94
+ <slot name="tools-end" />
95
+ </div>
96
+ </div>
97
+ </el-card>
98
+ </template>
99
+
100
+ <style lang="scss" scoped>
101
+ .pc-x-table-tools {
102
+ margin-bottom: 5px;
103
+ :deep(.el-button) {
104
+ vertical-align: top;
105
+ }
106
+ :deep(.el-input) {
107
+ width: 100%;
108
+ margin-right: 5px;
109
+ }
110
+ .keywords-search {
111
+ width: 200px;
112
+ margin-right: 10px;
113
+ }
114
+ .tools {
115
+ position: relative;
116
+ min-height: 32px;
117
+ }
118
+ .tools-end {
119
+ position: absolute;
120
+ right: 0;
121
+ top: 0;
122
+ & > :deep(*) {
123
+ margin-left: 10px;
124
+ }
125
+ :deep(.el-icon) {
126
+ font-size: 18px;
127
+ cursor: pointer;
128
+ height: 32px;
129
+ &:hover {
130
+ color: var(--el-color-primary);
131
+ }
132
+ }
133
+ }
134
+ }
135
+ </style>
@@ -0,0 +1,53 @@
1
+ import tableUtils from '../xtable/utils.js'
2
+ import utils from './utils.jsx'
3
+ import Searcher from '../xtable/searcher.vue'
4
+ import Settings from '../xtable/settings.vue'
5
+
6
+ export default {
7
+ name: 'XTableV2',
8
+ props: {
9
+ ...tableUtils.props(),
10
+ fixed: {
11
+ type: Boolean,
12
+ default: true
13
+ },
14
+ height: {
15
+ type: String,
16
+ default: '60vh'
17
+ }
18
+ },
19
+ emits: [
20
+ ...tableUtils.emits()
21
+ ],
22
+ components: { Searcher, Settings },
23
+ data () {
24
+ return {
25
+ isFullscreen: false,
26
+ zoom: 1,
27
+ selected: new Set(),
28
+ checked: null,
29
+ activeNames: ['name'],
30
+ settings: {}
31
+ }
32
+ },
33
+ computed: {
34
+ ...tableUtils.computed
35
+ },
36
+ watch: {
37
+ ...tableUtils.watch,
38
+ settings: 'saveSettings'
39
+ },
40
+ created () {
41
+ this.initSettings()
42
+ },
43
+ mounted () {
44
+ if (this.table) {
45
+ this.table.tableRef = this.$refs.tableRef
46
+ }
47
+ this.$emit('update:tref', this.$refs.tableRef)
48
+ },
49
+ methods: {
50
+ ...tableUtils.methods,
51
+ convertColumnsForTableV2: utils.convertColumnsForTableV2
52
+ }
53
+ }
@@ -0,0 +1,214 @@
1
+ import { h, resolveComponent } from 'vue'
2
+
3
+ const makeSelectionHeader = (vm) => {
4
+ const all = vm._data.length > 0 && (vm.selected.size === vm._data.length)
5
+ const indeterminate = !all && vm.selected.size > 0
6
+
7
+ const onChange = (value) => {
8
+ if (value) {
9
+ vm._data.forEach((_, i) => vm.selected.add(i))
10
+ } else {
11
+ vm.selected.clear()
12
+ }
13
+ const rows = value ? vm._data.slice() : []
14
+ vm.handleSelectionChange(rows)
15
+ }
16
+ return (
17
+ <el-checkbox
18
+ modelValue={all}
19
+ indeterminate={indeterminate}
20
+ onChange={onChange}
21
+ />
22
+ )
23
+ }
24
+
25
+ const makeSelection = (props, vm) => {
26
+ const { rowIndex: $index, rowData: row } = props
27
+ const onChange = () => {
28
+ if (vm.selected.has($index)) {
29
+ vm.selected.delete($index)
30
+ } else {
31
+ vm.selected.add($index)
32
+ }
33
+ const rows = [...vm.selected].map(i => vm._data[i])
34
+ vm.handleSelectionChange(rows)
35
+ }
36
+ return (
37
+ <el-checkbox
38
+ modelValue={vm.selected.has($index)}
39
+ onChange={onChange}
40
+ />
41
+ )
42
+ }
43
+
44
+ const makeIndex = (props, vm) => {
45
+ const { page, limit } = vm._query
46
+ return (page - 1) * limit + props.rowIndex + 1
47
+ }
48
+
49
+ const makeRadio = (props, vm) => {
50
+ const { rowIndex: $index } = props
51
+ return (
52
+ <input
53
+ type="radio"
54
+ value={$index}
55
+ checked={$index === vm.checked}
56
+ onChange={vm.handleCheckedChange}
57
+ />
58
+ )
59
+ }
60
+
61
+ const makeButton = ([props, vm, emit, type, icon, text]) => {
62
+ const { rowIndex: $index, rowData: row } = props
63
+ const onClick = () => {
64
+ vm._emit(emit, { $index, row })
65
+ }
66
+ return (
67
+ <el-button
68
+ type={type}
69
+ {...vm._attrs[emit + '-btn']}
70
+ icon={icon}
71
+ onClick={onClick}
72
+ >
73
+ {text}
74
+ </el-button>
75
+ )
76
+ }
77
+
78
+ const makeEditButton = (props, vm) => {
79
+ if (vm.canEdit(props.rowData)) {
80
+ return makeButton([props, vm, 'edit', 'warning', 'edit', '编辑'])
81
+ }
82
+ }
83
+
84
+ const makeRowEditButton = (props, vm) => {
85
+ if (vm.canRowEdit(props.rowData)) {
86
+ return makeButton([props, vm, 'row-edit', 'success', 'collection', '保存'])
87
+ }
88
+ }
89
+
90
+ const makeCancelEditButton = (props, vm) => {
91
+ if (vm.canCancelEdit(props.rowData)) {
92
+ return makeButton([props, vm, 'cancel-edit', 'warning', 'refresh-left', '取消编辑'])
93
+ }
94
+ }
95
+
96
+ const makeDeleteButton = (props, vm) => {
97
+ if (vm.canDelete(props.rowData)) {
98
+ return makeButton([props, vm, 'delete', 'danger', 'DeleteFilled', '删除'])
99
+ }
100
+ }
101
+
102
+ const makeRenderer = (col, vm) => {
103
+ const { _attrs, $slots } = vm
104
+ const { slotRenderers = {} } = _attrs
105
+
106
+ if (col.type === 'selection') {
107
+ return (props) => makeSelection(props, vm)
108
+ } else if (col.type === 'index') {
109
+ return (props) => makeIndex(props, vm)
110
+ } else if (col.type === 'radio') {
111
+ return (props) => makeRadio(props, vm)
112
+ } else if (col.slot) {
113
+ if (slotRenderers[col.slot]) {
114
+ return slotRenderers[col.slot]
115
+ } else if ($slots[col.slot]) {
116
+ return (props) => {
117
+ return $slots[col.slot]({
118
+ scope: {
119
+ $index: props.rowIndex,
120
+ row: props.rowData
121
+ },
122
+ column: col
123
+ })
124
+ }
125
+ }
126
+ } else if (vm.slotAll) {
127
+ return (props) => {
128
+ return $slots.all({
129
+ scope: {
130
+ $index: props.rowIndex,
131
+ row: props.rowData
132
+ },
133
+ column: col
134
+ })
135
+ }
136
+ }
137
+ return (props) => {
138
+ const { rowData: row, column } = props
139
+ if (column.comp === 'ElSwitch' || vm.table.isRowEdit && row.isEditing && (column.visible !== false || column.canEdit)) {
140
+ const onInput = (value) => {
141
+ row[column.prop] = value
142
+ }
143
+ const comp = column.comp || 'ElInput'
144
+ return h(resolveComponent(comp), {
145
+ ...column,
146
+ ...column.formAttrs,
147
+ modelValue: row[column.prop],
148
+ onInput,
149
+ disabled: !row.editable || !row.isEditing
150
+ })
151
+ }
152
+ const value = vm.calcValue(props.rowData, col)
153
+ const { showOverflowTooltip } = column.tableAttrs || {}
154
+ if (showOverflowTooltip) {
155
+ return (
156
+ <el-tooltip content={value}>
157
+ {value}
158
+ </el-tooltip>
159
+ )
160
+ }
161
+ return value
162
+ }
163
+ }
164
+
165
+ export const convertColumnsForTableV2 = (columns, vm) => {
166
+ const { _attrs, $slots } = vm
167
+
168
+ const cols = columns.map((column, index) => {
169
+ const { tableAttrs = {} } = column
170
+ const col = {
171
+ ...column,
172
+ key: column.prop,
173
+ dataKey: column.prop,
174
+ title: column.label,
175
+ width: column.width || tableAttrs.width ||
176
+ column.minWidth || tableAttrs.minWidth ||
177
+ column.maxWidth || tableAttrs.maxWidth,
178
+ align: column.align || _attrs.tableAlign || 'center'
179
+ }
180
+ if (col.type === 'selection') {
181
+ col.width = col.width || 46
182
+ col.headerCellRenderer = makeSelectionHeader(vm)
183
+ }
184
+ col.cellRenderer = makeRenderer(col, vm)
185
+ return col
186
+ })
187
+ if (!vm.hideOperates) {
188
+ cols.push({
189
+ key: cols.length,
190
+ title: '操作',
191
+ type: 'operates',
192
+ width: vm.operatesWidth || 150,
193
+ align: _attrs.operatesAlign || _attrs.tableAlign || 'center',
194
+ fixed: _attrs.operatesFixed || 'right',
195
+ cellRenderer (props) {
196
+ return (
197
+ <div class="operates">
198
+ {$slots['operates-prefix'] ? $slots['operates-prefix']() : null}
199
+ {makeEditButton(props, vm)}
200
+ {makeRowEditButton(props, vm)}
201
+ {makeCancelEditButton(props, vm)}
202
+ {makeDeleteButton(props, vm)}
203
+ {$slots['operates-suffix'] ? $slots['operates-suffix']() : null}
204
+ </div>
205
+ )
206
+ }
207
+ })
208
+ }
209
+ return cols
210
+ }
211
+
212
+ export default {
213
+ convertColumnsForTableV2
214
+ }
@@ -0,0 +1,147 @@
1
+ <script>
2
+ export { default } from './index.js'
3
+ </script>
4
+
5
+ <template>
6
+ <div class="x-table-v2 pc-x-table-v2" :class="{ fullscreen: isFullscreen }">
7
+ <searcher
8
+ ref="searcher"
9
+ :uid="_uid"
10
+ :columns="searcherColumns"
11
+ :config="searcherConfig"
12
+ @search="handleSearch"
13
+ @save="saveSettings"
14
+ />
15
+
16
+ <el-collapse
17
+ v-model="activeNames"
18
+ :class="(useCollapse ? 'use' : 'no') + '-collapse'"
19
+ >
20
+ <el-collapse-item :name="activeNames[0]">
21
+ <template #title>
22
+ <div class="collapse-header">
23
+ <slot v-if="$slots['collapse-title']" name="collapse-title" />
24
+ <span v-else-if="activeNames.length" class="collapse-title">{{ title }}</span>
25
+ <span v-else class="collapse-title">
26
+ {{ title }},当前第
27
+ <span>{{ _query.page }}</span>
28
+ 页,展示
29
+ <span>{{ _data.length }}</span>
30
+ 条数据,
31
+
32
+ <span>{{ _total || _data.length }}</span> 条数据
33
+ </span>
34
+ </div>
35
+ </template>
36
+ <x-table-tools
37
+ v-if="hideTools !== '' && hideTools !== true"
38
+ v-bind="_attrs"
39
+ :domids
40
+ @add="_onAdd"
41
+ @search="_onSearch"
42
+ @export="_onExport"
43
+ @search-export="_onSearchExport"
44
+ @import="_onImport"
45
+ @multi-delete="_onMultiDelete"
46
+ >
47
+ <template v-if="$slots['tools-prefix']" #tools-prefix>
48
+ <slot name="tools-prefix" />
49
+ </template>
50
+ <template v-if="$slots['tools-suffix']" #tools-suffix>
51
+ <slot name="tools-suffix" />
52
+ </template>
53
+ <template #tools-end>
54
+ <x-icon
55
+ name="FullScreen"
56
+ class="full"
57
+ @click="handleToggleFullscreen"
58
+ />
59
+ <settings
60
+ v-if="!hideSettings"
61
+ v-model="settings"
62
+ ref="settings"
63
+ v-bind="{ ..._attrs.settings, ...$attrs }"
64
+ :width="_attrs['cols-popover-width'] || 500"
65
+ @sort="$emit('sort', $event)"
66
+ @reset="handleResetSettings"
67
+ @sort-change="handleSortChange"
68
+ @init="initSettings"
69
+ @save="saveSettings"
70
+ />
71
+ </template>
72
+ </x-table-tools>
73
+
74
+ <el-auto-resizer :style="{ height }">
75
+ <template #default="{ width, height }">
76
+ <el-table-v2
77
+ ref="tableRef"
78
+ :header-height="46"
79
+ :row-height="40"
80
+ v-bind="elTableAttrs"
81
+ v-loading="_loading"
82
+ :data="_data"
83
+ :columns="convertColumnsForTableV2(_visibleColumns, this)"
84
+ :fixed
85
+ :width
86
+ :height
87
+ >
88
+ <template v-if="$slots['footer']" #footer>
89
+ <slot name="footer" />
90
+ </template>
91
+ <template v-if="$slots['empty']" #empty>
92
+ <slot name="empty" />
93
+ </template>
94
+ <template v-if="$slots['overlay']" #overlay>
95
+ <slot name="overlay" />
96
+ </template>
97
+ </el-table-v2>
98
+ </template>
99
+ </el-auto-resizer>
100
+
101
+ <x-pagination
102
+ v-if="!!_query && !!_total && !!(onSearch || _listen['search'])"
103
+ :query="_query"
104
+ :total="_total"
105
+ @search="_emit('search')"
106
+ />
107
+ </el-collapse-item>
108
+ </el-collapse>
109
+ </div>
110
+ </template>
111
+
112
+ <style lang="scss">
113
+ .pc-x-table-v2 {
114
+ &.fullscreen {
115
+ background-color: white;
116
+ z-index: 2000;
117
+ }
118
+ .collapse-header {
119
+ border-left: 5px solid var(--el-color-primary);
120
+ padding-left: 10px;
121
+ height: 30px;
122
+ line-height: 30px;
123
+ }
124
+ .collapse-title span {
125
+ color: var(--el-color-danger);
126
+ }
127
+ .el-icon.full {
128
+ font-size: 20px;
129
+ color: #606666;
130
+ height: 32px;
131
+ cursor: pointer;
132
+ margin-right: 10px !important;
133
+ &:hover {
134
+ color: var(--el-color-primary);
135
+ }
136
+ }
137
+ .el-table-v2__header-cell.is-align-center {
138
+ .el-checkbox {
139
+ width: 15px !important;
140
+ }
141
+ }
142
+ }
143
+ .visible-cols-reference {
144
+ padding: 0 10px;
145
+ font-size: 18px;
146
+ }
147
+ </style>