sohelp-eleplus 1.1.26 → 1.1.28

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 (205) hide show
  1. package/components.js +1 -0
  2. package/icons/flag/README.md +2 -2
  3. package/icons/flag/index.js +0 -1
  4. package/package.json +1 -1
  5. package/sohelp-ace-editor/README.md +32 -42
  6. package/sohelp-ace-editor/index.vue +166 -156
  7. package/sohelp-api-doc/README.md +36 -0
  8. package/sohelp-api-doc/index.vue +160 -0
  9. package/sohelp-application-select/README.md +9 -7
  10. package/sohelp-application-select/index.vue +10 -13
  11. package/sohelp-autocode/README.md +14 -26
  12. package/sohelp-calendar-view/README.md +9 -7
  13. package/sohelp-calendar-view/index.vue +10 -9
  14. package/sohelp-card/README.md +15 -17
  15. package/sohelp-card/index.vue +1 -1
  16. package/sohelp-card-view/README.md +9 -7
  17. package/sohelp-card-view/index.vue +10 -9
  18. package/sohelp-condition/README.md +29 -49
  19. package/sohelp-condition/index.vue +2 -1
  20. package/sohelp-country-select/README.md +15 -123
  21. package/sohelp-country-select/index.vue +1 -1
  22. package/sohelp-cry-input/README.md +19 -195
  23. package/sohelp-cry-input/index.vue +6 -2
  24. package/sohelp-date/README.md +12 -15
  25. package/sohelp-datetime/README.md +15 -17
  26. package/sohelp-datetime-picker/README.md +18 -18
  27. package/sohelp-datetime-picker/index.vue +11 -4
  28. package/sohelp-datetime-range/README.md +20 -23
  29. package/sohelp-demo-block/README.md +43 -0
  30. package/sohelp-demo-block/index.vue +229 -0
  31. package/sohelp-dict/README.md +28 -23
  32. package/sohelp-dict/index.vue +17 -17
  33. package/sohelp-drawer/README.md +28 -26
  34. package/sohelp-drop-card/README.md +29 -28
  35. package/sohelp-drop-card/index.vue +0 -1
  36. package/sohelp-dyn-select/README.md +31 -16
  37. package/sohelp-dyn-select/index.vue +65 -67
  38. package/sohelp-dyn-tree/README.md +26 -20
  39. package/sohelp-dyn-tree/index.vue +2 -2
  40. package/sohelp-dyn-tree-select/README.md +28 -19
  41. package/sohelp-dyn-tree-select/index.vue +23 -7
  42. package/sohelp-entity-form/README.md +65 -30
  43. package/sohelp-entity-form/index.vue +3 -2
  44. package/sohelp-entity-grid/README.md +13 -11
  45. package/sohelp-entity-grid/index.vue +1 -1
  46. package/sohelp-file-upload/README.md +25 -27
  47. package/sohelp-file-upload/index.vue +1 -1
  48. package/sohelp-filter-scheme/README.md +34 -30
  49. package/sohelp-filter-scheme/index.vue +2 -2
  50. package/sohelp-grid/README.md +52 -33
  51. package/sohelp-grid/index.vue +41 -39
  52. package/sohelp-grid/js/SohelpGridConfig.js +3 -3
  53. package/sohelp-grid/js/useSohelpGridConfig.js +4 -6
  54. package/sohelp-grid-select/README.md +32 -27
  55. package/sohelp-grid-select/index.vue +6 -5
  56. package/sohelp-grid-view/README.md +51 -22
  57. package/sohelp-grid-view-select/README.md +33 -25
  58. package/sohelp-grid-view-select/index.vue +2 -1
  59. package/sohelp-group-view/README.md +14 -4
  60. package/sohelp-group-view/index.vue +10 -9
  61. package/sohelp-icon-select/README.md +14 -12
  62. package/sohelp-image-upload/README.md +27 -27
  63. package/sohelp-image-upload/index.vue +2 -2
  64. package/sohelp-import/README.md +25 -24
  65. package/sohelp-input/README.md +27 -11
  66. package/sohelp-input/index.vue +15 -2
  67. package/sohelp-input-tag/README.md +53 -0
  68. package/sohelp-input-tag/index.vue +337 -0
  69. package/sohelp-modal/README.md +42 -16
  70. package/sohelp-modal/index.vue +21 -4
  71. package/sohelp-modal-select/README.md +745 -0
  72. package/sohelp-modal-select/index.vue +705 -0
  73. package/sohelp-module/README.md +24 -13
  74. package/sohelp-number-input/README.md +15 -8
  75. package/sohelp-number-input/index.vue +3 -0
  76. package/sohelp-number-range/README.md +22 -12
  77. package/sohelp-number-range/index.vue +3 -11
  78. package/sohelp-org-modal-select/README.md +47 -0
  79. package/sohelp-org-modal-select/index.vue +411 -0
  80. package/sohelp-org-select/README.md +23 -10
  81. package/sohelp-org-select/index.vue +41 -24
  82. package/sohelp-org-tree/README.md +19 -7
  83. package/sohelp-org-tree/index.vue +1 -2
  84. package/sohelp-org-tree-select/README.md +22 -11
  85. package/sohelp-org-tree-select/index.vue +1 -2
  86. package/sohelp-org-user-tree/README.md +19 -7
  87. package/sohelp-org-user-tree/index.vue +1 -2
  88. package/sohelp-org-user-tree-select/README.md +8 -3
  89. package/sohelp-org-user-tree-select/index.vue +8 -7
  90. package/sohelp-page/README.md +20 -11
  91. package/sohelp-page/index.vue +1 -1
  92. package/sohelp-pagination/README.md +14 -6
  93. package/sohelp-pagination/index.vue +1 -1
  94. package/sohelp-power/README.md +34 -19
  95. package/sohelp-power/index.vue +2 -2
  96. package/sohelp-pro-form/README.md +64 -21
  97. package/sohelp-pro-layout/README.md +10 -4
  98. package/sohelp-pro-layout/index.vue +8 -7
  99. package/sohelp-pro-table/README.md +30 -6
  100. package/sohelp-process/README.md +26 -13
  101. package/sohelp-process/index.vue +6 -6
  102. package/sohelp-rate/README.md +24 -12
  103. package/sohelp-rate/index.vue +5 -1
  104. package/sohelp-relation/README.md +10 -4
  105. package/sohelp-relation/index.vue +8 -7
  106. package/sohelp-relation-modal-select/README.md +41 -0
  107. package/sohelp-relation-modal-select/index.vue +70 -0
  108. package/sohelp-rich-text/README.md +29 -11
  109. package/sohelp-rich-text/index.vue +21 -20
  110. package/sohelp-richtext/README.md +12 -2
  111. package/sohelp-richtext/index.vue +8 -6
  112. package/sohelp-role-modal-select/README.md +45 -0
  113. package/sohelp-role-modal-select/index.vue +111 -0
  114. package/sohelp-role-select/README.md +18 -10
  115. package/sohelp-role-select/index.vue +36 -27
  116. package/sohelp-search/README.md +12 -4
  117. package/sohelp-search/index.vue +2 -2
  118. package/sohelp-search-pro-form/README.md +15 -1
  119. package/sohelp-search-pro-form/index.vue +2 -1
  120. package/sohelp-select/README.md +31 -30
  121. package/sohelp-select/index.vue +79 -84
  122. package/sohelp-split-panel/README.md +17 -18
  123. package/sohelp-switch/README.md +21 -19
  124. package/sohelp-switch/index.vue +34 -33
  125. package/sohelp-table/README.md +35 -27
  126. package/sohelp-table/index.vue +110 -109
  127. package/sohelp-table-select/README.md +55 -0
  128. package/sohelp-tenant-select/README.md +19 -18
  129. package/sohelp-tenant-select/index.vue +105 -109
  130. package/sohelp-text/README.md +16 -10
  131. package/sohelp-text/index.vue +5 -5
  132. package/sohelp-textarea-input/README.md +19 -12
  133. package/sohelp-time/README.md +11 -10
  134. package/sohelp-tree/README.md +24 -19
  135. package/sohelp-tree/index.vue +21 -23
  136. package/sohelp-tree-select/README.md +23 -10
  137. package/sohelp-user-modal-select/README.md +739 -0
  138. package/sohelp-user-modal-select/index.vue +87 -0
  139. package/sohelp-user-select/README.md +26 -15
  140. package/sohelp-user-select/index.vue +6 -2
  141. package/sohelp-user-tag/README.md +5 -7
  142. package/sohelp-user-tag/index.vue +8 -8
  143. package/sohelp-user-tree/README.md +5 -8
  144. package/sohelp-user-tree/index.vue +8 -7
  145. package/sohelp-vform-drawer/README.md +36 -18
  146. package/sohelp-vform-drawer/index.vue +2 -2
  147. package/sohelp-vform-eleplus/README.md +33 -31
  148. package/sohelp-vform-eleplus/index.vue +2 -2
  149. package/sohelp-vform-eleplus/tinymce/langs/zh_CN.js +461 -461
  150. package/sohelp-vform-eleplus/tinymce/langs/zh_TW.js +418 -418
  151. package/sohelp-vform-eleplus/tinymce/skins/content/dark/content.css +72 -72
  152. package/sohelp-vform-eleplus/tinymce/skins/content/dark/content.min.css +7 -7
  153. package/sohelp-vform-eleplus/tinymce/skins/content/default/content.css +67 -67
  154. package/sohelp-vform-eleplus/tinymce/skins/content/default/content.min.css +7 -7
  155. package/sohelp-vform-eleplus/tinymce/skins/content/document/content.css +72 -72
  156. package/sohelp-vform-eleplus/tinymce/skins/content/document/content.min.css +7 -7
  157. package/sohelp-vform-eleplus/tinymce/skins/content/writer/content.css +68 -68
  158. package/sohelp-vform-eleplus/tinymce/skins/content/writer/content.min.css +7 -7
  159. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/content.css +732 -732
  160. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/content.inline.css +726 -726
  161. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/content.inline.min.css +7 -7
  162. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/content.min.css +7 -7
  163. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/content.mobile.css +29 -29
  164. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/content.mobile.min.css +7 -7
  165. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/skin.css +3047 -3047
  166. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/skin.min.css +7 -7
  167. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/skin.mobile.css +673 -673
  168. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/skin.mobile.min.css +7 -7
  169. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/skin.shadowdom.css +37 -37
  170. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/skin.shadowdom.min.css +7 -7
  171. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/content.css +714 -714
  172. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/content.inline.css +726 -726
  173. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/content.inline.min.css +7 -7
  174. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/content.min.css +7 -7
  175. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/content.mobile.css +29 -29
  176. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/content.mobile.min.css +7 -7
  177. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/skin.css +3047 -3047
  178. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/skin.min.css +7 -7
  179. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/skin.mobile.css +673 -673
  180. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/skin.mobile.min.css +7 -7
  181. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/skin.shadowdom.css +37 -37
  182. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css +7 -7
  183. package/sohelp-vform-modal/README.md +36 -18
  184. package/sohelp-vform-modal/index.vue +2 -2
  185. package/sohelp-vform-select/README.md +9 -7
  186. package/sohelp-vform-select/index.vue +8 -7
  187. package/sohelp-vxe-grid/DefaultGridOptions.js +5 -3
  188. package/sohelp-vxe-grid/DefaultProps.js +0 -1
  189. package/sohelp-vxe-grid/README.md +540 -35
  190. package/sohelp-vxe-grid/SohelpGridConfig.js +8 -6
  191. package/sohelp-vxe-grid/index.vue +141 -94
  192. package/sohelp-vxe-grid-select/README.md +41 -26
  193. package/sohelp-vxe-table/README.md +23 -20
  194. package/sohelp-vxe-table/index.vue +5 -4
  195. package/sohelp-workflow/README.md +21 -17
  196. package/sohelp-workflow/index.vue +25 -22
  197. package/sohelp-workflow-drawer/README.md +41 -28
  198. package/sohelp-workflow-drawer/components/table.vue +7 -1
  199. package/sohelp-workflow-drawer/index.vue +86 -71
  200. package/sohelp-workflow-drawer/js/index.js +15 -13
  201. package/style/index.scss +0 -0
  202. package/utils/safe-eval.js +89 -0
  203. package/sohelp-dyn-select/props.js +0 -67
  204. package/sohelp-user-select/index.vue~ +0 -53
  205. package/sohelp-user-select/props.js +0 -71
@@ -0,0 +1,705 @@
1
+ <template>
2
+ <div class="sohelp-modal-select">
3
+ <!-- header -->
4
+ <div class="sohelp-modal-select-header" :class="{ 'is-disabled': disabled, 'is-readonly': readonly }">
5
+ <div class="tag-wrapper" :class="[
6
+ globalConfig.size ? 'el-input--' + globalConfig.size : '',
7
+ { 'is-disabled': disabled }
8
+ ]" v-if="!$slots.header" @click.stop="onOpenModal">
9
+ <div class="tag-input">
10
+ <span class="placeholder-text" v-if="!modelValue || modelValue?.length < 1">{{
11
+ placeholder
12
+ }}</span>
13
+
14
+ <template v-else>
15
+ <el-tag v-for="item in selectionsData" :key="item[props.valueField]" class="selection-tag"
16
+ :type="disabled || readonly ? 'info' : 'primary'" :closable="clearable && !disabled && !readonly"
17
+ @close.stop="removeTag(item)">
18
+ {{ item[labelField] }}
19
+ </el-tag></template>
20
+ </div>
21
+ <div class="append-icon">
22
+ <el-icon size="15" class="clear-icon" v-if="
23
+ clearable &&
24
+ !disabled &&
25
+ !readonly &&
26
+ modelValue &&
27
+ modelValue?.length > 0
28
+ " @click.stop="clearAll">
29
+ <CircleCloseFilled />
30
+ </el-icon>
31
+ <el-icon size="15">
32
+ <Search />
33
+ </el-icon>
34
+ </div>
35
+ </div>
36
+ <slot v-else name="header" :data="selections"></slot>
37
+ </div>
38
+ <!-- body -->
39
+ <SohelpModal v-bind="getModalProps" ref="sohelpModalRef" @confirm="onConfirm" class="sohelp-modal">
40
+ <div class="sohelp-modal-select-body">
41
+ <template v-if="$slots.default">
42
+ <slot name="default"></slot>
43
+ </template>
44
+ <div v-else class="sohelp-modal-select-container">
45
+ <div class="sohelp-vxe-grid-container">
46
+ <sohelp-vxe-grid v-bind="getGridProps" :multiple="multiple" ref="gridRef"
47
+ v-model:selections="selections"></sohelp-vxe-grid>
48
+ </div>
49
+
50
+ <div class="selection-container" v-if="multiple">
51
+ <ele-card :header="`已选择`" class="selection-card" bodyStyle="padding: 0" headerStyle="padding: 0 0 5px 0">
52
+ <template #header>
53
+ <div class="card-header">
54
+ <ele-text>已选择 {{ selections.length }} 个</ele-text>
55
+ <el-button @click="clearAllSelections" type="danger" plain size="small"
56
+ v-if="selections.length > 0">清空</el-button>
57
+ </div>
58
+ </template>
59
+
60
+ <div class="selections-box">
61
+ <div class="selections-item" v-for="item in selections" :key="item[valueField]">
62
+ <ele-ellipsis size="xs" :tooltip="true">{{
63
+ getSelectionTemplate(item)
64
+ }}</ele-ellipsis>
65
+ <el-link type="danger" :underline="false" @click="removeSelection(item)">
66
+ <el-icon :size="16">
67
+ <Close />
68
+ </el-icon>
69
+ </el-link>
70
+ </div>
71
+ </div>
72
+ </ele-card>
73
+ </div>
74
+ </div>
75
+ </div>
76
+ </SohelpModal>
77
+ </div>
78
+ </template>
79
+
80
+ <script setup>
81
+ import { Search, CircleCloseFilled } from '@element-plus/icons-vue';
82
+ import { ref, nextTick, onMounted, computed } from 'vue';
83
+ import { useGlobalConfig } from 'element-plus';
84
+
85
+ import SohelpModal from '../sohelp-modal/index.vue';
86
+ import SohelpVxeGrid from '../sohelp-vxe-grid/index.vue';
87
+
88
+ const defaultModalProps = {
89
+ closeOnClickModal: true,
90
+ title: '选择',
91
+ width: '50%',
92
+ minWidth: 500,
93
+ minHeight: 500,
94
+
95
+ bodyStyle: {
96
+ paddingBottom: '10px'
97
+ }
98
+ };
99
+
100
+ const defaultGridProps = {
101
+ url: '/admin/system/user/page',
102
+ autoLoad: true,
103
+ gridOptions: {
104
+ columns: []
105
+ }
106
+ };
107
+
108
+ const props = defineProps({
109
+ modalProps: {
110
+ type: Object,
111
+ default: () => ({
112
+ title: '选择数据',
113
+ width: '100%'
114
+ })
115
+ },
116
+
117
+ gridProps: {
118
+ type: Object,
119
+ default: () => ({
120
+ datasource: function () { },
121
+ columns: []
122
+ })
123
+ },
124
+
125
+ modelValue: {
126
+ type: [String, Array],
127
+ default: ''
128
+ },
129
+ multiple: {
130
+ type: Boolean,
131
+ default: true
132
+ },
133
+ labelField: {
134
+ type: String,
135
+ default: 'label'
136
+ },
137
+ readonly: {
138
+ type: Boolean,
139
+ default: false
140
+ },
141
+ valueField: {
142
+ type: String,
143
+ default: 'value'
144
+ },
145
+ placeholder: {
146
+ type: String,
147
+ default: '请选择'
148
+ },
149
+ title: {
150
+ type: String,
151
+ default: '选择'
152
+ },
153
+ beforeOpen: {
154
+ type: Function,
155
+ default: () => true
156
+ },
157
+ selectionTemplate: {
158
+ type: String,
159
+ default: ''
160
+ },
161
+ disabled: {
162
+ type: Boolean,
163
+ default: false
164
+ },
165
+ clearable: {
166
+ type: Boolean,
167
+ default: true
168
+ }
169
+ });
170
+
171
+ const data = defineModel('data', {
172
+ type: [Array, Object],
173
+ default: () => []
174
+ });
175
+
176
+ const emits = defineEmits(['update:modelValue', 'page-change', 'confirm']);
177
+
178
+ const selectionsData = ref([]);
179
+
180
+ const sohelpModalRef = ref(null);
181
+ const gridRef = ref(null);
182
+ const selections = ref([]);
183
+ const globalConfig = useGlobalConfig();
184
+
185
+ onMounted(() => {
186
+ nextTick(() => {
187
+ initData();
188
+ });
189
+ });
190
+
191
+ const getModalProps = computed(() => {
192
+ return { ...defaultModalProps, ...props.modalProps };
193
+ });
194
+
195
+ const initColumns = (columns) => {
196
+ const addColumnByType = (column, columns) => {
197
+ const idx = columns?.findIndex((c) => c.type === column.type);
198
+ if (idx === -1) {
199
+ columns.unshift(column);
200
+ }
201
+ };
202
+
203
+ addColumnByType(
204
+ {
205
+ type: props.multiple ? 'checkbox' : 'radio',
206
+ title: '',
207
+ width: 40,
208
+ fixed: 'left',
209
+ align: 'center'
210
+ },
211
+ columns
212
+ );
213
+ addColumnByType(
214
+ {
215
+ type: 'seq',
216
+ title: '序号',
217
+ width: 50,
218
+ fixed: 'left',
219
+ align: 'center'
220
+ },
221
+ columns
222
+ );
223
+ };
224
+
225
+ const getGridProps = computed(() => {
226
+ const params = { ...defaultGridProps, ...props.gridProps };
227
+ const { columns } = params.gridOptions;
228
+ initColumns(columns);
229
+ return params;
230
+ });
231
+
232
+ const enrichDataWithColumns = (dataList) => {
233
+ const { valueField, labelField } = props;
234
+ const excludeColumns = ['seq', 'checkbox', 'radio', 'html', 'expand'];
235
+ const columns = props.gridProps.gridOptions.columns
236
+ .filter((item) => !excludeColumns.includes(item.type))
237
+ ?.map((f) => f.field);
238
+ if (columns?.length < 1) {
239
+ return dataList;
240
+ }
241
+
242
+
243
+ return dataList?.map((item) => {
244
+ //根据columns 数组 补充数据
245
+ let obj = {
246
+ [valueField]: item[valueField]
247
+ };
248
+ columns.forEach((field) => {
249
+ obj[field] = item[field] || '';
250
+
251
+ });
252
+ return obj;
253
+ });
254
+ };
255
+
256
+ const initData = (newData = props.data) => {
257
+ // 初始化数据
258
+ const dataArray = Array.isArray(newData) ? [...newData] : [newData];
259
+ const modelValues = props.modelValue
260
+ ? Array.isArray(props.modelValue)
261
+ ? props.modelValue
262
+ : [props.modelValue]
263
+ : [];
264
+
265
+ if (modelValues.length > 0) {
266
+ const { valueField, labelField } = props;
267
+
268
+ selectionsData.value = modelValues.map((item) => {
269
+ let idx = dataArray.findIndex((d) => d[valueField] === item);
270
+ if (idx != -1) {
271
+ return dataArray[idx];
272
+ }
273
+ return {
274
+ [valueField]: item,
275
+ [labelField]: item
276
+ };
277
+ });
278
+
279
+ selections.value = [...selectionsData.value];
280
+
281
+ return;
282
+ } else {
283
+ selections.value = [];
284
+ selectionsData.value = [];
285
+
286
+ const $grid = gridRef.value?.$grid;
287
+ $grid?.clearCheckboxRow();
288
+ $grid?.clearRadioRow();
289
+ }
290
+ };
291
+
292
+ const onOpenModal = async () => {
293
+ if (props.disabled || props.readonly) return;
294
+ if (props.beforeOpen && typeof props.beforeOpen === 'function') {
295
+ const result = await props.beforeOpen(props.modelValue, data.value);
296
+ if (!result) return;
297
+ }
298
+ sohelpModalRef.value?.show();
299
+
300
+ //回显
301
+ nextTick(() => {
302
+ initData(data.value);
303
+ });
304
+ };
305
+
306
+ const onConfirm = () => {
307
+ const selectedIds = selections.value?.map((item) => item[props.valueField]);
308
+ const enrichedData = enrichDataWithColumns([...selections.value]);
309
+ selectionsData.value = [...selections.value];
310
+
311
+ if (props.multiple) {
312
+ data.value = enrichedData;
313
+ emits('update:modelValue', selectedIds);
314
+ emits('confirm', selectedIds, data.value);
315
+ } else {
316
+ data.value = enrichedData[0];
317
+ emits('update:modelValue', selectedIds[0]);
318
+ emits('confirm', selectedIds[0], enrichedData[0]);
319
+ }
320
+ };
321
+
322
+
323
+ const removeSelection = (item) => {
324
+ const v = item[props.valueField];
325
+ selections.value = selections.value.filter(
326
+ (i) => i[props.valueField] !== v
327
+ );
328
+ const $grid = gridRef.value?.$grid;
329
+ $grid?.setCheckboxRowKey([v], false);
330
+ $grid?.clearRadioRow();
331
+ };
332
+
333
+ const removeTag = (row) => {
334
+ removeSelection(row);
335
+ data.value = [...selections.value];
336
+ selectionsData.value = [...selections.value];
337
+
338
+ emits(
339
+ 'update:modelValue',
340
+ selections.value.map((item) => item[props.valueField])
341
+ );
342
+ };
343
+
344
+ const clearAllSelections = () => {
345
+ selections.value = [];
346
+ const $grid = gridRef.value?.$grid;
347
+ $grid?.clearCheckboxRow();
348
+ $grid?.clearRadioRow();
349
+ };
350
+
351
+ /**
352
+ * 清空所有选中(对外暴露)
353
+ */
354
+ const clearAll = () => {
355
+ clearAllSelections();
356
+ data.value = [];
357
+ emits('update:modelValue', props.multiple ? [] : '');
358
+ };
359
+
360
+ const getSelectionTemplate = (item) => {
361
+ if (!props.selectionTemplate) return item[props.labelField];
362
+
363
+ // 支持 ${field} 格式
364
+ return props.selectionTemplate.replace(/\$\{([^}]+)\}/g, (_, key) => {
365
+ return item[key] ?? '';
366
+ });
367
+ };
368
+ </script>
369
+
370
+ <script>
371
+ export default {
372
+ name: 'SohelpModalSelect'
373
+ };
374
+ </script>
375
+ <style lang="scss" scoped>
376
+ .sohelp-modal-select {
377
+ width: 100%;
378
+
379
+ .sohelp-modal-select-header {
380
+ display: flex;
381
+ align-items: flex-start;
382
+ cursor: pointer;
383
+ min-width: 160px;
384
+ min-height: 24px;
385
+ width: 100%;
386
+ border: 1px solid var(--el-border-color);
387
+ border-radius: var(--el-border-radius-base);
388
+ box-sizing: border-box;
389
+ transition:
390
+ box-shadow 0.2s,
391
+ border-color 0.2s;
392
+
393
+ &:hover .tag-wrapper .append-icon .clear-icon {
394
+ opacity: 1;
395
+ }
396
+
397
+ &:hover {
398
+ border-color: var(--el-color-primary);
399
+ }
400
+
401
+ &:focus-within {
402
+ border-color: var(--el-color-primary);
403
+ box-shadow: 0 0 0 2px var(--el-color-primary-light-7);
404
+ }
405
+
406
+ &.is-disabled {
407
+ cursor: not-allowed;
408
+ }
409
+
410
+ .tag-wrapper {
411
+ cursor: pointer;
412
+ display: inline-flex;
413
+ align-items: center;
414
+ justify-content: center;
415
+ width: 100%;
416
+ box-sizing: border-box;
417
+ border-radius: 6px;
418
+
419
+
420
+ transition: var(--el-transition-border);
421
+ font-size: var(--el-font-size-base);
422
+ color: var(--el-text-color-regular);
423
+
424
+ &:hover {
425
+ border-color: var(--el-border-color-hover);
426
+ }
427
+
428
+ &:focus-within {
429
+ outline: none;
430
+ border-color: var(--el-color-primary);
431
+ box-shadow: 0 0 0 2px var(--el-color-primary-light-7);
432
+ }
433
+
434
+ &.is-disabled {
435
+ background-color: var(--el-disabled-bg-color);
436
+ border-color: var(--el-disabled-border-color);
437
+ color: var(--el-disabled-text-color);
438
+ cursor: not-allowed;
439
+
440
+ .tag-input {
441
+ color: var(--el-disabled-text-color);
442
+ }
443
+
444
+ .append-icon {
445
+ color: var(--el-disabled-text-color);
446
+ background-color: var(--el-disabled-bg-color);
447
+ border-color: var(--el-disabled-border-color);
448
+
449
+ &:hover,
450
+ &:active {
451
+ background-color: var(--el-disabled-bg-color);
452
+ color: var(--el-disabled-text-color);
453
+ }
454
+ }
455
+ }
456
+
457
+ &.el-input--small {
458
+ height: 100%;
459
+ font-size: var(--el-font-size-small);
460
+ box-sizing: border-box;
461
+
462
+ :deep(.el-tag) {
463
+ padding: 0 6px !important;
464
+ }
465
+ }
466
+
467
+ &.el-input--default {
468
+ min-height: 30px !important;
469
+
470
+ .tag-input {
471
+ line-height: calc(var(--el-component-size-small) - 2px);
472
+ }
473
+
474
+ .selection-tag {
475
+ height: calc(var(--el-component-size-small) - 1px) !important;
476
+ line-height: calc(var(--el-component-size-small) - 10px);
477
+ }
478
+ }
479
+
480
+ &.el-input--large {
481
+ min-height: 38px !important;
482
+ font-size: var(--el-font-size-base);
483
+
484
+ .tag-input {
485
+ line-height: calc(var(--el-component-size-large) - 2px);
486
+ }
487
+
488
+ .selection-tag {
489
+ height: calc(var(--el-component-size-large) - 10px) !important;
490
+ line-height: calc(var(--el-component-size-large) - 10px);
491
+ }
492
+ }
493
+
494
+ .tag-input {
495
+ box-sizing: border-box;
496
+ padding: 2px 6px;
497
+ flex: 1;
498
+ display: flex;
499
+ align-items: center;
500
+ gap: 4px;
501
+ flex-wrap: wrap;
502
+ overflow: hidden;
503
+ min-height: 18px;
504
+
505
+ line-height: calc(var(--el-component-size) - 2px);
506
+ cursor: inherit;
507
+
508
+ .placeholder-text {
509
+ color: var(--el-text-color-placeholder);
510
+ line-height: 18px;
511
+ }
512
+
513
+ .selection-tag {
514
+ flex-shrink: 0;
515
+ margin: 0;
516
+ max-width: 120px;
517
+ height: calc(var(--el-component-size) - 15px);
518
+ line-height: calc(var(--el-component-size) - 10px);
519
+ border: 0;
520
+ margin-top: 1px;
521
+
522
+ :deep(.el-tag__content) {
523
+ overflow: hidden;
524
+ text-overflow: ellipsis;
525
+ white-space: nowrap;
526
+ }
527
+
528
+ :deep(.el-tag__close) {
529
+ border-radius: 100%;
530
+
531
+ &:hover {
532
+ color: #fff;
533
+ background: var(--el-color-primary);
534
+ }
535
+ }
536
+ }
537
+
538
+ .more-tag {
539
+ flex-shrink: 0;
540
+ margin: 0;
541
+ background-color: var(--el-color-info-light-9);
542
+ color: var(--el-color-info);
543
+ border-color: var(--el-color-info-light-8);
544
+ height: calc(var(--el-component-size) - 8px);
545
+ line-height: calc(var(--el-component-size) - 10px);
546
+ border: 0;
547
+ }
548
+ }
549
+
550
+ .append-icon {
551
+ display: flex;
552
+ align-items: center;
553
+ height: 100%;
554
+ color: var(--el-text-color-placeholder);
555
+ padding: 0 5px;
556
+ margin-top: 1px;
557
+ transition: var(--el-transition-border);
558
+ border-top-right-radius: var(--el-border-radius-base);
559
+ border-bottom-right-radius: var(--el-border-radius-base);
560
+ box-sizing: border-box;
561
+
562
+ .el-icon {
563
+ font-size: inherit;
564
+ transition: var(--el-transition-color);
565
+ }
566
+
567
+ .clear-icon {
568
+ margin-right: 2px;
569
+ width: 18px;
570
+ height: 18px;
571
+ border-radius: 100%;
572
+ text-align: center;
573
+ line-height: 16px;
574
+ cursor: pointer;
575
+ opacity: 0;
576
+ transition: opacity 0.2s;
577
+ color: #c0c4cc;
578
+
579
+ &:hover {
580
+ color: #909399;
581
+ }
582
+ }
583
+
584
+ &:hover {
585
+ color: var(--el-text-color-regular);
586
+ }
587
+ }
588
+
589
+ .prepend-icon {
590
+ display: inline-flex;
591
+ align-items: center;
592
+ justify-content: center;
593
+ height: 100%;
594
+ width: 25px;
595
+ flex-shrink: 0;
596
+ color: var(--el-text-color-placeholder);
597
+ padding: 0 0 0 8px;
598
+ border-right: 1px solid var(--el-border-color);
599
+ margin-right: 4px;
600
+ transition: var(--el-transition-border);
601
+
602
+ .el-icon {
603
+ font-size: inherit;
604
+ transition: var(--el-transition-color);
605
+ }
606
+
607
+ &:hover {
608
+ color: var(--el-text-color-regular);
609
+ }
610
+ }
611
+ }
612
+ }
613
+ }
614
+
615
+ .sohelp-modal-select-body {
616
+ width: 100%;
617
+ height: 60vh;
618
+
619
+ .sohelp-modal-select-container {
620
+ display: flex;
621
+ height: 100% !important;
622
+ gap: 16px;
623
+ justify-content: space-between;
624
+
625
+ .sohelp-vxe-grid-container {
626
+ width: 100%;
627
+ height: 100%;
628
+ }
629
+
630
+ .selection-container {
631
+ width: 220px;
632
+ height: 100%;
633
+ flex-shrink: 0;
634
+
635
+ .selection-card {
636
+ height: 100%;
637
+ display: flex;
638
+ flex-direction: column;
639
+
640
+ .card-header {
641
+ display: flex;
642
+ justify-content: space-between;
643
+ }
644
+
645
+ .el-button {
646
+ margin-left: 0;
647
+ }
648
+
649
+ :deep(.ele-card-body) {
650
+ flex: 1;
651
+ overflow: hidden;
652
+ padding: 16px;
653
+ }
654
+
655
+ .selections-box {
656
+ display: flex;
657
+ flex-direction: column;
658
+ gap: 8px;
659
+ margin-top: 10px;
660
+ height: calc(100% - 25px);
661
+ overflow: auto;
662
+
663
+ .selections-item {
664
+ display: flex;
665
+ align-items: center;
666
+ gap: 8px;
667
+
668
+ border: 1px solid #ccc;
669
+ padding: 2px 5px 2px 10px;
670
+ border-radius: 6px;
671
+ justify-content: space-between;
672
+ }
673
+ }
674
+
675
+ .selection-list {
676
+ height: 100%;
677
+ overflow-y: auto;
678
+ display: flex;
679
+ flex-direction: column;
680
+ gap: 8px;
681
+
682
+ .selection-tag {
683
+ margin: 0;
684
+ }
685
+
686
+ :deep(.el-tag) {
687
+ display: flex;
688
+ justify-content: space-between;
689
+ background: #ccc;
690
+ padding-right: 40px;
691
+ box-sizing: border-box;
692
+ }
693
+
694
+ :deep(.el-empty) {
695
+ display: flex;
696
+ justify-content: center;
697
+ align-items: center;
698
+ height: 100%;
699
+ }
700
+ }
701
+ }
702
+ }
703
+ }
704
+ }
705
+ </style>