npmapps 1.0.21 → 1.0.23

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 (105) hide show
  1. package/app/Wscats.vue-1.0.26.vsix +0 -0
  2. package/app/febean.vue-format-0.1.8.vsix +0 -0
  3. package/app/wujie-vue3-child/.claude/settings.local.json +8 -0
  4. package/app/wujie-vue3-child/.vscode/extensions.json +3 -0
  5. package/app/wujie-vue3-child/PROJECT_MEMORY.md +427 -0
  6. package/app/wujie-vue3-child/README.md +5 -0
  7. package/app/wujie-vue3-child/index.html +13 -0
  8. package/app/wujie-vue3-child/package-lock.json +5744 -0
  9. package/app/wujie-vue3-child/package.json +28 -0
  10. package/app/wujie-vue3-child/public/vite.svg +1 -0
  11. package/app/wujie-vue3-child/src/App.vue +130 -0
  12. package/app/wujie-vue3-child/src/assets/vue.svg +1 -0
  13. package/app/wujie-vue3-child/src/components/HelloWorld.vue +43 -0
  14. package/app/wujie-vue3-child/src/components/tags-view.vue +193 -0
  15. package/app/wujie-vue3-child/src/components/tags-view1.vue +131 -0
  16. package/app/wujie-vue3-child/src/hooks/useClickOutside.js +11 -0
  17. package/app/wujie-vue3-child/src/hooks/useTableDragSort.js +28 -0
  18. package/app/wujie-vue3-child/src/main.js +15 -0
  19. package/app/wujie-vue3-child/src/router/index.js +104 -0
  20. package/app/wujie-vue3-child/src/store/tagsViewStroe.js +34 -0
  21. package/app/wujie-vue3-child/src/style.css +4 -0
  22. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/README.md +836 -0
  23. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/REFLEX_EXAMPLES.md +728 -0
  24. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentPersonnelSelector.jsx +687 -0
  25. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentPersonnelSelector.module.scss +560 -0
  26. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelector.jsx +570 -0
  27. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelector.module.scss +330 -0
  28. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelectorV2.jsx +378 -0
  29. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelectorV2.module.scss +228 -0
  30. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/OptionsSelector.jsx +399 -0
  31. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/OptionsSelector.module.scss +252 -0
  32. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PersonnelSelector.jsx +585 -0
  33. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PersonnelSelector.module.scss +331 -0
  34. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PopoverSelector.jsx +392 -0
  35. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PopoverSelector.module.scss +39 -0
  36. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/README.md +248 -0
  37. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/SelectorTrigger.jsx +194 -0
  38. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/index.jsx +1459 -0
  39. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/mockData.js +301 -0
  40. package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/dialogueSegment/index.jsx +28 -4
  41. package/app/wujie-vue3-child/src/views/aiCoach/index.jsx +32 -0
  42. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ChartsPanel/index.jsx +121 -0
  43. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ChartsPanel/index.module.scss +76 -0
  44. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/DonutChart/index.jsx +104 -0
  45. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/PracticeTable/index.jsx +75 -0
  46. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/PracticeTable/index.module.scss +12 -0
  47. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankBarChart/index.jsx +62 -0
  48. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankBarChart/index.module.scss +43 -0
  49. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingGroup/index.jsx +29 -0
  50. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingGroup/index.module.scss +5 -0
  51. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingList/index.jsx +58 -0
  52. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingList/index.module.scss +85 -0
  53. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ScriptStatsPanel/index.jsx +92 -0
  54. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ScriptStatsPanel/index.module.scss +56 -0
  55. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/StatCardsRow/index.jsx +40 -0
  56. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/StatCardsRow/index.module.scss +53 -0
  57. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/echarts/EchartsDonut.jsx +106 -0
  58. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/echarts/EchartsRankBar.jsx +132 -0
  59. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/index.jsx +176 -0
  60. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/index.module.scss +96 -0
  61. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/CoachReport/index.jsx +162 -0
  62. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/CoachReport/index.module.scss +16 -0
  63. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ComprehensiveEvaluation/index.jsx +29 -0
  64. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ComprehensiveEvaluation/index.module.scss +25 -0
  65. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueBubble/index.jsx +106 -0
  66. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueBubble/index.module.scss +164 -0
  67. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueRecord/index.jsx +182 -0
  68. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueRecord/index.module.scss +203 -0
  69. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionDetail/index.jsx +145 -0
  70. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionDetail/index.module.scss +126 -0
  71. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionScores/index.jsx +67 -0
  72. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionScores/index.module.scss +105 -0
  73. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ReportHeader/index.jsx +81 -0
  74. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ReportHeader/index.module.scss +47 -0
  75. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/RoleInfo/index.jsx +64 -0
  76. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/RoleInfo/index.module.scss +85 -0
  77. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ScoreBadge/index.jsx +39 -0
  78. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ScoreBadge/index.module.scss +44 -0
  79. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/SubDimensionItem/index.jsx +83 -0
  80. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/SubDimensionItem/index.module.scss +101 -0
  81. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/index.jsx +50 -0
  82. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/index.module.scss +25 -0
  83. package/app/wujie-vue3-child/src/views/child-to-parent.vue +117 -0
  84. package/app/wujie-vue3-child/src/views/home.vue +53 -0
  85. package/app/wujie-vue3-child/src/views/jsx/btnSelect/btnSelect.vue +169 -0
  86. package/app/wujie-vue3-child/src/views/jsx/btnSelect/index.vue +69 -0
  87. package/app/wujie-vue3-child/src/views/jsx/com.vue +44 -0
  88. package/app/wujie-vue3-child/src/views/jsx/dialog.jsx +66 -0
  89. package/app/wujie-vue3-child/src/views/jsx/index.vue +72 -0
  90. package/app/wujie-vue3-child/src/views/jsx/props.vue +33 -0
  91. package/app/wujie-vue3-child/src/views/parent-to-child.vue +225 -0
  92. package/app/wujie-vue3-child/src/views/phone-code.vue +318 -0
  93. package/app/wujie-vue3-child/src/views/router-jump.vue +123 -0
  94. package/app/wujie-vue3-child/src/views/test.vue +192 -0
  95. package/app/wujie-vue3-child/vite.config.js +15 -0
  96. package/package.json +1 -1
  97. package/app/aiCoach/index.jsx +0 -20
  98. package/npmapps-1.0.20.tgz +0 -0
  99. /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/collapseExpand/index.jsx +0 -0
  100. /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/collapseExpand/index.module.scss +0 -0
  101. /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/dialogueSegment/index.module.scss +0 -0
  102. /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/scriptTable/index.jsx +0 -0
  103. /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/scriptTable/index.module.scss +0 -0
  104. /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/scriptTable/inputColumn/index.jsx +0 -0
  105. /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/scriptTable/inputColumn/index.module.scss +0 -0
@@ -0,0 +1,1459 @@
1
+ import { defineComponent, ref } from 'vue'
2
+ import DepartmentSelector from './components/DepartmentSelector.jsx'
3
+ import PersonnelSelector from './components/PersonnelSelector.jsx'
4
+ import DepartmentPersonnelSelector from './components/DepartmentPersonnelSelector.jsx'
5
+ import DepartmentSelectorV2 from './components/DepartmentSelectorV2.jsx'
6
+ import OptionsSelector from './components/OptionsSelector.jsx'
7
+
8
+ /**
9
+ * 部门人员选择组件
10
+ * @description 用于选择部门和人员
11
+ */
12
+ export default defineComponent({
13
+ name: 'DepartmentPersonnel',
14
+
15
+ setup() {
16
+ // 折叠面板状态(控制哪些面板展开)
17
+ const activeNames = ref([])
18
+
19
+ // ===== 部门选择器相关 =====
20
+ // 单选模式 - 已选部门
21
+ const singleSelectedDepartment = ref(null)
22
+
23
+ // 多选模式 - 已选部门
24
+ const multipleSelectedDepartments = ref([ { id: 910, label: '后端开发组' },
25
+ { id: 911, label: '前端开发组' },
26
+ { id: 912, label: '测试组' }])
27
+
28
+ // 多选 - collapse-tags 模式
29
+ const collapseTagsDepartments = ref([ { id: 910, label: '后端开发组' },
30
+ { id: 911, label: '前端开发组' },
31
+ { id: 912, label: '测试组' }])
32
+
33
+ // 多选 - collapse-tags-tooltip 模式
34
+ const collapseTagsTooltipDepartments = ref([ { id: 910, label: '后端开发组' },
35
+ { id: 911, label: '前端开发组' },
36
+ { id: 912, label: '测试组' }])
37
+
38
+ // 多选 - max-collapse-tags 模式
39
+ const maxCollapseTagsDepartments = ref([])
40
+
41
+ // 按钮模式 - 单选
42
+ const buttonModeSingleDepartment = ref(null)
43
+
44
+ // 按钮模式 - 多选
45
+ const buttonModeMultipleDepartments = ref([])
46
+
47
+ // ===== 人员选择器相关 =====
48
+ // 单选模式 - 已选人员
49
+ const singleSelectedPersonnel = ref(null)
50
+
51
+ // 多选模式 - 已选人员
52
+ const multipleSelectedPersonnel = ref([])
53
+
54
+ // 多选 - collapse-tags 模式
55
+ const collapseTagsPersonnel = ref([])
56
+
57
+ // 多选 - collapse-tags-tooltip 模式
58
+ const collapseTagsTooltipPersonnel = ref([])
59
+
60
+ // 多选 - max-collapse-tags 模式
61
+ const maxCollapseTagsPersonnel = ref([])
62
+
63
+ // 按部门过滤的人员选择
64
+ const departmentFilteredPersonnel = ref([])
65
+ const selectedDepartmentForFilter = ref(911) // 默认选择前端开发组
66
+
67
+ // 按钮模式 - 单选
68
+ const buttonModeSinglePersonnel = ref(null)
69
+
70
+ // 按钮模式 - 多选
71
+ const buttonModeMultiplePersonnel = ref([])
72
+
73
+ // ===== 三栏人员选择器相关 =====
74
+ // 单选模式 - 已选人员
75
+ const threeColumnSinglePersonnel = ref(null)
76
+
77
+ // 多选模式 - 已选人员
78
+ const threeColumnMultiplePersonnel = ref([
79
+ {
80
+ "id": 1001,
81
+ "name": "张伟",
82
+ "departmentId": 1,
83
+ "position": "部门总经理",
84
+ "phone": "13800000001",
85
+ "email": "zhangwei@bank.com"
86
+ },
87
+ {
88
+ "id": 1002,
89
+ "name": "王芳",
90
+ "departmentId": 11,
91
+ "position": "招聘中心主任",
92
+ "phone": "13800000002",
93
+ "email": "wangfang@bank.com"
94
+ }
95
+ ])
96
+
97
+ // 多选 - collapse-tags 模式
98
+ const threeColumnCollapseTagsPersonnel = ref([])
99
+
100
+ // 多选 - collapse-tags-tooltip 模式
101
+ const threeColumnCollapseTagsTooltipPersonnel = ref([])
102
+
103
+ // 多选 - max-collapse-tags 模式
104
+ const threeColumnMaxCollapseTagsPersonnel = ref([])
105
+
106
+ // 不默认选择第一个部门
107
+ const threeColumnNoDefaultDepartment = ref([])
108
+
109
+ // 按钮模式 - 单选
110
+ const threeColumnButtonSinglePersonnel = ref(null)
111
+
112
+ // 按钮模式 - 多选
113
+ const threeColumnButtonMultiplePersonnel = ref([])
114
+
115
+ // ===== V2 版本选择器(基于 PopoverSelector)=====
116
+ // 单选模式
117
+ const v2SingleDepartment = ref(null)
118
+
119
+ // 多选模式
120
+ const v2MultipleDepartments = ref([])
121
+
122
+ // 按钮模式 - 单选
123
+ const v2ButtonSingleDepartment = ref(null)
124
+
125
+ // 按钮模式 - 多选
126
+ const v2ButtonMultipleDepartments = ref([])
127
+
128
+ // ===== 通用选项选择器相关 =====
129
+ // 模拟选项数据
130
+ const statusOptions = [
131
+ { label: '全部', value: '' },
132
+ { label: '待审核', value: 'pending' },
133
+ { label: '已通过', value: 'approved' },
134
+ { label: '已拒绝', value: 'rejected' },
135
+ { label: '已关闭', value: 'closed' }
136
+ ]
137
+
138
+ const priorityOptions = [
139
+ { label: '全部', value: '' },
140
+ { label: '低', value: 1 },
141
+ { label: '中', value: 2 },
142
+ { label: '高', value: 3 },
143
+ { label: '紧急', value: 4 }
144
+ ]
145
+
146
+ // 单选模式 - 状态选择
147
+ const singleStatusOption = ref(null)
148
+
149
+ // 多选模式 - 优先级选择
150
+ const multiplePriorityOptions = ref([])
151
+
152
+ // 按钮模式 - 单选
153
+ const buttonSingleStatus = ref(null)
154
+
155
+ // 按钮模式 - 多选
156
+ const buttonMultiplePriority = ref([])
157
+
158
+ // 无搜索框模式
159
+ const noFilterStatus = ref(null)
160
+
161
+ // ===== 反显演示数据 =====
162
+ // 部门单选反显
163
+ const refluxDept = ref({ id: 911, label: '前端开发组' })
164
+
165
+ // 部门多选反显
166
+ const refluxDepts = ref([
167
+ { id: 910, label: '后端开发组' },
168
+ { id: 911, label: '前端开发组' },
169
+ { id: 912, label: '测试组' }
170
+ ])
171
+
172
+ // 人员单选反显
173
+ const refluxPerson = ref({
174
+ id: 10245,
175
+ name: '张三',
176
+ position: '高级工程师',
177
+ phone: '13800138001',
178
+ email: 'zhangsan@example.com'
179
+ })
180
+
181
+ // 人员多选反显
182
+ const refluxPersons = ref([
183
+ { id: 10245, name: '张三', position: '高级工程师', phone: '13800138001' },
184
+ { id: 10246, name: '李四', position: '中级工程师', phone: '13800138002' },
185
+ { id: 10247, name: '王五', position: '初级工程师', phone: '13800138003' }
186
+ ])
187
+
188
+ /**
189
+ * 处理单选部门选择变化
190
+ * @param {number|string} selected - 选中的部门ID
191
+ */
192
+ const handleSingleChange = (selected) => {
193
+ console.log('单选 - 已选部门ID:', selected)
194
+ }
195
+
196
+ /**
197
+ * 处理多选部门选择变化
198
+ * @param {Array} selected - 选中的部门ID列表
199
+ */
200
+ const handleMultipleChange = (selected) => {
201
+ console.log('多选 - 已选部门ID列表:', selected)
202
+ }
203
+
204
+ /**
205
+ * 处理单选人员选择变化
206
+ * @param {number|string} selected - 选中的人员ID
207
+ */
208
+ const handleSinglePersonnelChange = (selected) => {
209
+ console.log('单选 - 已选人员ID:', selected)
210
+ }
211
+
212
+ /**
213
+ * 处理多选人员选择变化
214
+ * @param {Array} selected - 选中的人员ID列表
215
+ */
216
+ const handleMultiplePersonnelChange = (selected) => {
217
+ console.log('多选 - 已选人员ID列表:', selected)
218
+ }
219
+
220
+ /**
221
+ * 处理三栏选择器单选人员变化
222
+ * @param {number|string} selected - 选中的人员ID
223
+ */
224
+ const handleThreeColumnSingleChange = (selected) => {
225
+ console.log('三栏选择器 - 单选 - 已选人员ID:', selected)
226
+ }
227
+
228
+ /**
229
+ * 处理三栏选择器多选人员变化
230
+ * @param {Array} selected - 选中的人员ID列表
231
+ */
232
+ const handleThreeColumnMultipleChange = (selected) => {
233
+ console.log('三栏选择器 - 多选 - 已选人员ID列表:', selected)
234
+ }
235
+
236
+ /**
237
+ * 处理选项选择器单选变化
238
+ * @param {Object} selected - 选中的选项对象
239
+ */
240
+ const handleOptionSingleChange = (selected) => {
241
+ console.log('选项选择器 - 单选 - 已选选项:', selected)
242
+ }
243
+
244
+ /**
245
+ * 处理选项选择器多选变化
246
+ * @param {Array} selected - 选中的选项对象列表
247
+ */
248
+ const handleOptionMultipleChange = (selected) => {
249
+ console.log('选项选择器 - 多选 - 已选选项列表:', selected)
250
+ }
251
+
252
+ return () => {
253
+ return (
254
+ <div style={{ padding: '20px' }}>
255
+ <h2>部门人员选择组件演示</h2>
256
+
257
+ <el-collapse v-model={activeNames.value} style={{ marginTop: '20px' }}>
258
+ {/* ==================== 部门选择器 ==================== */}
259
+ <el-collapse-item name="1">
260
+ {{
261
+ title: () => (
262
+ <h2 style={{ margin: 0, color: '#409eff', fontSize: '18px' }}>
263
+ 📋 部门选择器演示
264
+ </h2>
265
+ ),
266
+ default: () => (
267
+ <div style={{ padding: '10px 0' }}>
268
+
269
+ {/* 单选模式演示 */}
270
+ <div style={{ marginBottom: '30px' }}>
271
+ <div style={{ display: 'flex', alignItems: 'center', gap: '10px', marginBottom: '10px' }}>
272
+ <h3 style={{ margin: 0 }}>1. 单选模式</h3>
273
+ <el-button
274
+ size="small"
275
+ type="primary"
276
+ onClick={() => {
277
+ singleSelectedDepartment.value = { id: 911, label: '前端开发组' }
278
+ }}
279
+ >
280
+ 测试反显
281
+ </el-button>
282
+ <el-button
283
+ size="small"
284
+ onClick={() => {
285
+ singleSelectedDepartment.value = null
286
+ }}
287
+ >
288
+ 清空
289
+ </el-button>
290
+ </div>
291
+ <div style={{ maxWidth: '400px' }}>
292
+ <DepartmentSelector
293
+ v-model={singleSelectedDepartment.value}
294
+ placeholder="请选择部门(单选)"
295
+ multiple={false}
296
+ clearable={true}
297
+ onChange={handleSingleChange}
298
+ />
299
+ </div>
300
+ {singleSelectedDepartment.value && (
301
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
302
+ 已选部门: {JSON.stringify(singleSelectedDepartment.value)}
303
+ </div>
304
+ )}
305
+ </div>
306
+
307
+ {/* 多选模式 - 默认 */}
308
+ <div style={{ marginBottom: '30px' }}>
309
+ <div style={{ display: 'flex', alignItems: 'center', gap: '10px', marginBottom: '10px' }}>
310
+ <h3 style={{ margin: 0 }}>2. 多选模式 - 默认(显示所有标签)</h3>
311
+ <el-button
312
+ size="small"
313
+ type="primary"
314
+ onClick={() => {
315
+ multipleSelectedDepartments.value = [
316
+ { id: 910, label: '后端开发组' },
317
+ { id: 911, label: '前端开发组' },
318
+ { id: 912, label: '测试组' }
319
+ ]
320
+ }}
321
+ >
322
+ 测试反显
323
+ </el-button>
324
+ <el-button
325
+ size="small"
326
+ onClick={() => {
327
+ multipleSelectedDepartments.value = []
328
+ }}
329
+ >
330
+ 清空
331
+ </el-button>
332
+ </div>
333
+ <div style={{ maxWidth: '400px' }}>
334
+ <DepartmentSelector
335
+ v-model={multipleSelectedDepartments.value}
336
+ placeholder="请选择部门(多选)"
337
+ multiple={true}
338
+ clearable={true}
339
+ onChange={handleMultipleChange}
340
+ />
341
+ </div>
342
+ {multipleSelectedDepartments.value.length > 0 && (
343
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
344
+ 已选 {multipleSelectedDepartments.value.length} 个部门
345
+ </div>
346
+ )}
347
+ </div>
348
+
349
+ {/* 多选模式 - collapse-tags */}
350
+ <div style={{ marginBottom: '30px' }}>
351
+ <h3>3. 多选模式 - collapse-tags(折叠标签)</h3>
352
+ <div style={{ maxWidth: '400px' }}>
353
+ <DepartmentSelector
354
+ v-model={collapseTagsDepartments.value}
355
+ placeholder="请选择部门(折叠显示)"
356
+ multiple={true}
357
+ clearable={true}
358
+ collapseTags={true}
359
+ onChange={handleMultipleChange}
360
+ />
361
+ </div>
362
+ {collapseTagsDepartments.value.length > 0 && (
363
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
364
+ 已选 {collapseTagsDepartments.value.length} 个部门
365
+ </div>
366
+ )}
367
+ </div>
368
+
369
+ {/* 多选模式 - collapse-tags-tooltip */}
370
+ <div style={{ marginBottom: '30px' }}>
371
+ <h3>4. 多选模式 - collapse-tags-tooltip(悬停显示详情)</h3>
372
+ <div style={{ maxWidth: '400px' }}>
373
+ <DepartmentSelector
374
+ v-model={collapseTagsTooltipDepartments.value}
375
+ placeholder="请选择部门(悬停显示)"
376
+ multiple={true}
377
+ clearable={true}
378
+ collapseTags={true}
379
+ collapseTagsTooltip={true}
380
+ onChange={handleMultipleChange}
381
+ />
382
+ </div>
383
+ {collapseTagsTooltipDepartments.value.length > 0 && (
384
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
385
+ 已选 {collapseTagsTooltipDepartments.value.length} 个部门
386
+ </div>
387
+ )}
388
+ </div>
389
+
390
+ {/* 多选模式 - max-collapse-tags */}
391
+ <div style={{ marginBottom: '30px' }}>
392
+ <h3>5. 多选模式 - max-collapse-tags(限制显示2个标签)</h3>
393
+ <div style={{ maxWidth: '400px' }}>
394
+ <DepartmentSelector
395
+ v-model={maxCollapseTagsDepartments.value}
396
+ placeholder="请选择部门(最多显示2个)"
397
+ multiple={true}
398
+ clearable={true}
399
+ maxCollapseTags={2}
400
+ onChange={handleMultipleChange}
401
+ />
402
+ </div>
403
+ {maxCollapseTagsDepartments.value.length > 0 && (
404
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
405
+ 已选 {maxCollapseTagsDepartments.value.length} 个部门
406
+ </div>
407
+ )}
408
+ </div>
409
+
410
+ {/* 按钮模式 - 单选 */}
411
+ <div style={{ marginBottom: '30px' }}>
412
+ <h3>6. 按钮模式 - 单选(带标签)</h3>
413
+ <div style={{ maxWidth: '400px' }}>
414
+ <DepartmentSelector
415
+ v-model={buttonModeSingleDepartment.value}
416
+ placeholder="请选择部门"
417
+ displayType="button"
418
+ label="部门:"
419
+ multiple={false}
420
+ clearable={true}
421
+ onChange={handleSingleChange}
422
+ />
423
+ </div>
424
+ {buttonModeSingleDepartment.value && (
425
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
426
+ 已选部门ID: {buttonModeSingleDepartment.value}
427
+ </div>
428
+ )}
429
+ </div>
430
+
431
+ {/* 按钮模式 - 多选 */}
432
+ <div style={{ marginBottom: '30px' }}>
433
+ <h3>7. 按钮模式 - 多选(带标签 + 数量徽章)</h3>
434
+ <div style={{ maxWidth: '400px' }}>
435
+ <DepartmentSelector
436
+ v-model={buttonModeMultipleDepartments.value}
437
+ placeholder="请选择部门"
438
+ displayType="button"
439
+ label="所属部门:"
440
+ multiple={true}
441
+ clearable={true}
442
+ onChange={handleMultipleChange}
443
+ />
444
+ </div>
445
+ {buttonModeMultipleDepartments.value.length > 0 && (
446
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
447
+ 已选 {buttonModeMultipleDepartments.value.length} 个部门
448
+ </div>
449
+ )}
450
+ </div>
451
+
452
+ {/* 禁用状态演示 */}
453
+ <div style={{ marginBottom: '30px' }}>
454
+ <h3>8. 禁用状态</h3>
455
+ <div style={{ maxWidth: '400px' }}>
456
+ <DepartmentSelector
457
+ v-model={singleSelectedDepartment.value}
458
+ placeholder="禁用状态"
459
+ disabled={true}
460
+ />
461
+ </div>
462
+ </div>
463
+ </div>
464
+ ),
465
+ }}
466
+ </el-collapse-item>
467
+
468
+ {/* ==================== 人员选择器 ==================== */}
469
+ <el-collapse-item name="2">
470
+ {{
471
+ title: () => (
472
+ <h2 style={{ margin: 0, color: '#67c23a', fontSize: '18px' }}>
473
+ 👥 人员选择器演示
474
+ </h2>
475
+ ),
476
+ default: () => (
477
+ <div style={{ padding: '10px 0' }}>
478
+
479
+ {/* 单选模式演示 */}
480
+ <div style={{ marginBottom: '30px' }}>
481
+ <div style={{ display: 'flex', alignItems: 'center', gap: '10px', marginBottom: '10px' }}>
482
+ <h3 style={{ margin: 0 }}>1. 单选模式</h3>
483
+ <el-button
484
+ size="small"
485
+ type="primary"
486
+ onClick={() => {
487
+ singleSelectedPersonnel.value = {
488
+ id: 10245,
489
+ name: '张三',
490
+ position: '高级工程师',
491
+ phone: '13800138001',
492
+ email: 'zhangsan@example.com'
493
+ }
494
+ }}
495
+ >
496
+ 测试反显
497
+ </el-button>
498
+ <el-button
499
+ size="small"
500
+ onClick={() => {
501
+ singleSelectedPersonnel.value = null
502
+ }}
503
+ >
504
+ 清空
505
+ </el-button>
506
+ </div>
507
+ <div style={{ maxWidth: '400px' }}>
508
+ <PersonnelSelector
509
+ v-model={singleSelectedPersonnel.value}
510
+ placeholder="请选择人员(单选)"
511
+ multiple={false}
512
+ clearable={true}
513
+ onChange={handleSinglePersonnelChange}
514
+ />
515
+ </div>
516
+ {singleSelectedPersonnel.value && (
517
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
518
+ 已选人员: {JSON.stringify(singleSelectedPersonnel.value)}
519
+ </div>
520
+ )}
521
+ </div>
522
+
523
+ {/* 多选模式 - 默认 */}
524
+ <div style={{ marginBottom: '30px' }}>
525
+ <div style={{ display: 'flex', alignItems: 'center', gap: '10px', marginBottom: '10px' }}>
526
+ <h3 style={{ margin: 0 }}>2. 多选模式 - 默认(显示所有标签)</h3>
527
+ <el-button
528
+ size="small"
529
+ type="primary"
530
+ onClick={() => {
531
+ multipleSelectedPersonnel.value = [
532
+ { id: 10245, name: '张三', position: '高级工程师', phone: '13800138001' },
533
+ { id: 10246, name: '李四', position: '中级工程师', phone: '13800138002' },
534
+ { id: 10247, name: '王五', position: '初级工程师', phone: '13800138003' }
535
+ ]
536
+ }}
537
+ >
538
+ 测试反显
539
+ </el-button>
540
+ <el-button
541
+ size="small"
542
+ onClick={() => {
543
+ multipleSelectedPersonnel.value = []
544
+ }}
545
+ >
546
+ 清空
547
+ </el-button>
548
+ </div>
549
+ <div style={{ maxWidth: '400px' }}>
550
+ <PersonnelSelector
551
+ v-model={multipleSelectedPersonnel.value}
552
+ placeholder="请选择人员(多选)"
553
+ multiple={true}
554
+ clearable={true}
555
+ onChange={handleMultiplePersonnelChange}
556
+ />
557
+ </div>
558
+ {multipleSelectedPersonnel.value.length > 0 && (
559
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
560
+ 已选 {multipleSelectedPersonnel.value.length} 个人员
561
+ </div>
562
+ )}
563
+ </div>
564
+
565
+ {/* 多选模式 - collapse-tags */}
566
+ <div style={{ marginBottom: '30px' }}>
567
+ <h3>3. 多选模式 - collapse-tags(折叠标签)</h3>
568
+ <div style={{ maxWidth: '400px' }}>
569
+ <PersonnelSelector
570
+ v-model={collapseTagsPersonnel.value}
571
+ placeholder="请选择人员(折叠显示)"
572
+ multiple={true}
573
+ clearable={true}
574
+ collapseTags={true}
575
+ onChange={handleMultiplePersonnelChange}
576
+ />
577
+ </div>
578
+ {collapseTagsPersonnel.value.length > 0 && (
579
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
580
+ 已选 {collapseTagsPersonnel.value.length} 个人员
581
+ </div>
582
+ )}
583
+ </div>
584
+
585
+ {/* 多选模式 - collapse-tags-tooltip */}
586
+ <div style={{ marginBottom: '30px' }}>
587
+ <h3>4. 多选模式 - collapse-tags-tooltip(悬停显示详情)</h3>
588
+ <div style={{ maxWidth: '400px' }}>
589
+ <PersonnelSelector
590
+ v-model={collapseTagsTooltipPersonnel.value}
591
+ placeholder="请选择人员(悬停显示)"
592
+ multiple={true}
593
+ clearable={true}
594
+ collapseTags={true}
595
+ collapseTagsTooltip={true}
596
+ onChange={handleMultiplePersonnelChange}
597
+ />
598
+ </div>
599
+ {collapseTagsTooltipPersonnel.value.length > 0 && (
600
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
601
+ 已选 {collapseTagsTooltipPersonnel.value.length} 个人员
602
+ </div>
603
+ )}
604
+ </div>
605
+
606
+ {/* 多选模式 - max-collapse-tags */}
607
+ <div style={{ marginBottom: '30px' }}>
608
+ <h3>5. 多选模式 - max-collapse-tags(限制显示2个标签)</h3>
609
+ <div style={{ maxWidth: '400px' }}>
610
+ <PersonnelSelector
611
+ v-model={maxCollapseTagsPersonnel.value}
612
+ placeholder="请选择人员(最多显示2个)"
613
+ multiple={true}
614
+ clearable={true}
615
+ maxCollapseTags={2}
616
+ onChange={handleMultiplePersonnelChange}
617
+ />
618
+ </div>
619
+ {maxCollapseTagsPersonnel.value.length > 0 && (
620
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
621
+ 已选 {maxCollapseTagsPersonnel.value.length} 个人员
622
+ </div>
623
+ )}
624
+ </div>
625
+
626
+ {/* 按部门过滤人员 */}
627
+ <div style={{ marginBottom: '30px' }}>
628
+ <h3>6. 按部门过滤人员(显示前端开发组的人员)</h3>
629
+ <div style={{ maxWidth: '400px' }}>
630
+ <PersonnelSelector
631
+ v-model={departmentFilteredPersonnel.value}
632
+ placeholder="请选择人员(前端开发组)"
633
+ multiple={true}
634
+ clearable={true}
635
+ departmentId={selectedDepartmentForFilter.value}
636
+ onChange={handleMultiplePersonnelChange}
637
+ />
638
+ </div>
639
+ {departmentFilteredPersonnel.value.length > 0 && (
640
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
641
+ 已选 {departmentFilteredPersonnel.value.length} 个人员
642
+ </div>
643
+ )}
644
+ </div>
645
+
646
+ {/* 按钮模式 - 单选 */}
647
+ <div style={{ marginBottom: '30px' }}>
648
+ <h3>7. 按钮模式 - 单选(带标签)</h3>
649
+ <div style={{ maxWidth: '400px' }}>
650
+ <PersonnelSelector
651
+ v-model={buttonModeSinglePersonnel.value}
652
+ placeholder="请选择人员"
653
+ displayType="button"
654
+ label="人员:"
655
+ multiple={false}
656
+ clearable={true}
657
+ onChange={handleSinglePersonnelChange}
658
+ />
659
+ </div>
660
+ {buttonModeSinglePersonnel.value && (
661
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
662
+ 已选人员ID: {buttonModeSinglePersonnel.value}
663
+ </div>
664
+ )}
665
+ </div>
666
+
667
+ {/* 按钮模式 - 多选 */}
668
+ <div style={{ marginBottom: '30px' }}>
669
+ <h3>8. 按钮模式 - 多选(带标签 + 数量徽章)</h3>
670
+ <div style={{ maxWidth: '400px' }}>
671
+ <PersonnelSelector
672
+ v-model={buttonModeMultiplePersonnel.value}
673
+ placeholder="请选择人员"
674
+ displayType="button"
675
+ label="选择人员:"
676
+ multiple={true}
677
+ clearable={true}
678
+ onChange={handleMultiplePersonnelChange}
679
+ />
680
+ </div>
681
+ {buttonModeMultiplePersonnel.value.length > 0 && (
682
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
683
+ 已选 {buttonModeMultiplePersonnel.value.length} 个人员
684
+ </div>
685
+ )}
686
+ </div>
687
+
688
+ {/* 禁用状态演示 */}
689
+ <div style={{ marginBottom: '30px' }}>
690
+ <h3>9. 禁用状态</h3>
691
+ <div style={{ maxWidth: '400px' }}>
692
+ <PersonnelSelector
693
+ v-model={singleSelectedPersonnel.value}
694
+ placeholder="禁用状态"
695
+ disabled={true}
696
+ />
697
+ </div>
698
+ </div>
699
+ </div>
700
+ ),
701
+ }}
702
+ </el-collapse-item>
703
+
704
+ {/* ==================== 三栏人员选择器 ==================== */}
705
+ <el-collapse-item name="3">
706
+ {{
707
+ title: () => (
708
+ <h2 style={{ margin: 0, color: '#e6a23c', fontSize: '18px' }}>
709
+ 🏢 三栏人员选择器演示(部门树 + 人员列表 + 已选人员)
710
+ </h2>
711
+ ),
712
+ default: () => (
713
+ <div style={{ padding: '10px 0' }}>
714
+
715
+ {/* 单选模式演示 */}
716
+ <div style={{ marginBottom: '30px' }}>
717
+ <div style={{ display: 'flex', alignItems: 'center', gap: '10px', marginBottom: '10px' }}>
718
+ <h3 style={{ margin: 0 }}>1. 单选模式</h3>
719
+ <el-button
720
+ size="small"
721
+ type="primary"
722
+ onClick={() => {
723
+ threeColumnSinglePersonnel.value = {
724
+ id: 1001,
725
+ name: '张伟',
726
+ departmentId: 1,
727
+ position: '部门总经理',
728
+ phone: '13800000001',
729
+ email: 'zhangwei@bank.com'
730
+ }
731
+ }}
732
+ >
733
+ 测试反显
734
+ </el-button>
735
+ <el-button
736
+ size="small"
737
+ onClick={() => {
738
+ threeColumnSinglePersonnel.value = null
739
+ }}
740
+ >
741
+ 清空
742
+ </el-button>
743
+ </div>
744
+ <div style={{ maxWidth: '600px' }}>
745
+ <DepartmentPersonnelSelector
746
+ v-model={threeColumnSinglePersonnel.value}
747
+ placeholder="请选择人员(单选)"
748
+ multiple={false}
749
+ clearable={true}
750
+ onChange={handleThreeColumnSingleChange}
751
+ />
752
+ </div>
753
+ {threeColumnSinglePersonnel.value && (
754
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
755
+ 已选人员: {JSON.stringify(threeColumnSinglePersonnel.value)}
756
+ </div>
757
+ )}
758
+ </div>
759
+
760
+ {/* 多选模式 - 默认 */}
761
+ <div style={{ marginBottom: '30px' }}>
762
+ <div style={{ display: 'flex', alignItems: 'center', gap: '10px', marginBottom: '10px' }}>
763
+ <h3 style={{ margin: 0 }}>2. 多选模式 - 默认(显示所有标签)</h3>
764
+ <el-button
765
+ size="small"
766
+ type="primary"
767
+ onClick={() => {
768
+ threeColumnMultiplePersonnel.value = [
769
+ {
770
+ id: 1001,
771
+ name: '张伟',
772
+ departmentId: 1,
773
+ position: '部门总经理',
774
+ phone: '13800000001',
775
+ email: 'zhangwei@bank.com'
776
+ },
777
+ {
778
+ id: 1002,
779
+ name: '王芳',
780
+ departmentId: 11,
781
+ position: '招聘中心主任',
782
+ phone: '13800000002',
783
+ email: 'wangfang@bank.com'
784
+ }
785
+ ]
786
+ }}
787
+ >
788
+ 测试反显
789
+ </el-button>
790
+ <el-button
791
+ size="small"
792
+ onClick={() => {
793
+ threeColumnMultiplePersonnel.value = []
794
+ }}
795
+ >
796
+ 清空
797
+ </el-button>
798
+ </div>
799
+ <div style={{ maxWidth: '600px' }}>
800
+ <DepartmentPersonnelSelector
801
+ v-model={threeColumnMultiplePersonnel.value}
802
+ placeholder="请选择人员(多选)"
803
+ multiple={true}
804
+ clearable={true}
805
+ onChange={handleThreeColumnMultipleChange}
806
+ />
807
+ </div>
808
+ {threeColumnMultiplePersonnel.value.length > 0 && (
809
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
810
+ 已选 {threeColumnMultiplePersonnel.value.length} 个人员
811
+ </div>
812
+ )}
813
+ </div>
814
+
815
+ {/* 多选模式 - collapse-tags */}
816
+ <div style={{ marginBottom: '30px' }}>
817
+ <h3>3. 多选模式 - collapse-tags(折叠标签)</h3>
818
+ <div style={{ maxWidth: '600px' }}>
819
+ <DepartmentPersonnelSelector
820
+ v-model={threeColumnCollapseTagsPersonnel.value}
821
+ placeholder="请选择人员(折叠显示)"
822
+ multiple={true}
823
+ clearable={true}
824
+ collapseTags={true}
825
+ onChange={handleThreeColumnMultipleChange}
826
+ />
827
+ </div>
828
+ {threeColumnCollapseTagsPersonnel.value.length > 0 && (
829
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
830
+ 已选 {threeColumnCollapseTagsPersonnel.value.length} 个人员
831
+ </div>
832
+ )}
833
+ </div>
834
+
835
+ {/* 多选模式 - collapse-tags-tooltip */}
836
+ <div style={{ marginBottom: '30px' }}>
837
+ <h3>4. 多选模式 - collapse-tags-tooltip(悬停显示详情)</h3>
838
+ <div style={{ maxWidth: '600px' }}>
839
+ <DepartmentPersonnelSelector
840
+ v-model={threeColumnCollapseTagsTooltipPersonnel.value}
841
+ placeholder="请选择人员(悬停显示)"
842
+ multiple={true}
843
+ clearable={true}
844
+ collapseTags={true}
845
+ collapseTagsTooltip={true}
846
+ onChange={handleThreeColumnMultipleChange}
847
+ />
848
+ </div>
849
+ {threeColumnCollapseTagsTooltipPersonnel.value.length > 0 && (
850
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
851
+ 已选 {threeColumnCollapseTagsTooltipPersonnel.value.length} 个人员
852
+ </div>
853
+ )}
854
+ </div>
855
+
856
+ {/* 多选模式 - max-collapse-tags */}
857
+ <div style={{ marginBottom: '30px' }}>
858
+ <h3>5. 多选模式 - max-collapse-tags(限制显示2个标签)</h3>
859
+ <div style={{ maxWidth: '600px' }}>
860
+ <DepartmentPersonnelSelector
861
+ v-model={threeColumnMaxCollapseTagsPersonnel.value}
862
+ placeholder="请选择人员(最多显示2个)"
863
+ multiple={true}
864
+ clearable={true}
865
+ maxCollapseTags={2}
866
+ onChange={handleThreeColumnMultipleChange}
867
+ />
868
+ </div>
869
+ {threeColumnMaxCollapseTagsPersonnel.value.length > 0 && (
870
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
871
+ 已选 {threeColumnMaxCollapseTagsPersonnel.value.length} 个人员
872
+ </div>
873
+ )}
874
+ </div>
875
+
876
+ {/* 禁用状态演示 */}
877
+ <div style={{ marginBottom: '30px' }}>
878
+ <h3>6. 禁用状态</h3>
879
+ <div style={{ maxWidth: '600px' }}>
880
+ <DepartmentPersonnelSelector
881
+ v-model={threeColumnSinglePersonnel.value}
882
+ placeholder="禁用状态"
883
+ disabled={true}
884
+ />
885
+ </div>
886
+ </div>
887
+
888
+ {/* 不默认选择第一个部门 */}
889
+ <div style={{ marginBottom: '30px' }}>
890
+ <h3>7. 不默认选择第一个部门(需要手动选择部门)</h3>
891
+ <div style={{ maxWidth: '600px' }}>
892
+ <DepartmentPersonnelSelector
893
+ v-model={threeColumnNoDefaultDepartment.value}
894
+ placeholder="请先选择部门"
895
+ multiple={true}
896
+ clearable={true}
897
+ defaultSelectFirstDepartment={false}
898
+ onChange={handleThreeColumnMultipleChange}
899
+ />
900
+ </div>
901
+ {threeColumnNoDefaultDepartment.value.length > 0 && (
902
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
903
+ 已选 {threeColumnNoDefaultDepartment.value.length} 个人员
904
+ </div>
905
+ )}
906
+ </div>
907
+
908
+ {/* 按钮模式 - 单选 */}
909
+ <div style={{ marginBottom: '30px' }}>
910
+ <h3>8. 按钮模式 - 单选(带标签)</h3>
911
+ <div style={{ maxWidth: '600px' }}>
912
+ <DepartmentPersonnelSelector
913
+ v-model={threeColumnButtonSinglePersonnel.value}
914
+ placeholder="请选择人员"
915
+ displayType="button"
916
+ label="选择人员:"
917
+ multiple={false}
918
+ clearable={true}
919
+ onChange={handleThreeColumnSingleChange}
920
+ />
921
+ </div>
922
+ {threeColumnButtonSinglePersonnel.value && (
923
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
924
+ 已选人员ID: {threeColumnButtonSinglePersonnel.value}
925
+ </div>
926
+ )}
927
+ </div>
928
+
929
+ {/* 按钮模式 - 多选 */}
930
+ <div style={{ marginBottom: '30px' }}>
931
+ <h3>9. 按钮模式 - 多选(带标签 + 数量徽章)</h3>
932
+ <div style={{ maxWidth: '600px' }}>
933
+ <DepartmentPersonnelSelector
934
+ v-model={threeColumnButtonMultiplePersonnel.value}
935
+ placeholder="请选择人员"
936
+ displayType="button"
937
+ label="已选人员:"
938
+ multiple={true}
939
+ clearable={true}
940
+ onChange={handleThreeColumnMultipleChange}
941
+ />
942
+ </div>
943
+ {threeColumnButtonMultiplePersonnel.value.length > 0 && (
944
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
945
+ 已选 {threeColumnButtonMultiplePersonnel.value.length} 个人员
946
+ </div>
947
+ )}
948
+ </div>
949
+ </div>
950
+ ),
951
+ }}
952
+ </el-collapse-item>
953
+
954
+ {/* ==================== V2 版本选择器(基于 PopoverSelector)==================== */}
955
+ <el-collapse-item name="4">
956
+ {{
957
+ title: () => (
958
+ <h2 style={{ margin: 0, color: '#f56c6c', fontSize: '18px' }}>
959
+ 🔧 V2 版本 - 基于 PopoverSelector 通用组件(解耦设计)
960
+ </h2>
961
+ ),
962
+ default: () => (
963
+ <div style={{ padding: '10px 0' }}>
964
+ <div style={{ marginBottom: '20px', padding: '12px', background: '#fef0f0', borderRadius: '4px', color: '#f56c6c', fontSize: '14px' }}>
965
+ 💡 这是使用通用 PopoverSelector 组件构建的新版本,展示了如何通过插槽解耦触发器和悬浮窗内容
966
+ </div>
967
+
968
+ {/* 输入框模式 - 单选 */}
969
+ <div style={{ marginBottom: '30px' }}>
970
+ <h3>1. 输入框模式 - 单选</h3>
971
+ <div style={{ maxWidth: '400px' }}>
972
+ <DepartmentSelectorV2
973
+ v-model={v2SingleDepartment.value}
974
+ placeholder="请选择部门(V2单选)"
975
+ multiple={false}
976
+ clearable={true}
977
+ onChange={handleSingleChange}
978
+ />
979
+ </div>
980
+ {v2SingleDepartment.value && (
981
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
982
+ 已选部门ID: {v2SingleDepartment.value}
983
+ </div>
984
+ )}
985
+ </div>
986
+
987
+ {/* 输入框模式 - 多选 */}
988
+ <div style={{ marginBottom: '30px' }}>
989
+ <h3>2. 输入框模式 - 多选</h3>
990
+ <div style={{ maxWidth: '400px' }}>
991
+ <DepartmentSelectorV2
992
+ v-model={v2MultipleDepartments.value}
993
+ placeholder="请选择部门(V2多选)"
994
+ multiple={true}
995
+ clearable={true}
996
+ onChange={handleMultipleChange}
997
+ />
998
+ </div>
999
+ {v2MultipleDepartments.value.length > 0 && (
1000
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
1001
+ 已选 {v2MultipleDepartments.value.length} 个部门
1002
+ </div>
1003
+ )}
1004
+ </div>
1005
+
1006
+ {/* 按钮模式 - 单选 */}
1007
+ <div style={{ marginBottom: '30px' }}>
1008
+ <h3>3. 按钮模式 - 单选(带标签)</h3>
1009
+ <div style={{ maxWidth: '400px' }}>
1010
+ <DepartmentSelectorV2
1011
+ v-model={v2ButtonSingleDepartment.value}
1012
+ placeholder="请选择部门"
1013
+ displayType="button"
1014
+ label="部门:"
1015
+ multiple={false}
1016
+ clearable={true}
1017
+ onChange={handleSingleChange}
1018
+ />
1019
+ </div>
1020
+ {v2ButtonSingleDepartment.value && (
1021
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
1022
+ 已选部门ID: {v2ButtonSingleDepartment.value}
1023
+ </div>
1024
+ )}
1025
+ </div>
1026
+
1027
+ {/* 按钮模式 - 多选 */}
1028
+ <div style={{ marginBottom: '30px' }}>
1029
+ <h3>4. 按钮模式 - 多选(带标签 + 数量徽章)</h3>
1030
+ <div style={{ maxWidth: '400px' }}>
1031
+ <DepartmentSelectorV2
1032
+ v-model={v2ButtonMultipleDepartments.value}
1033
+ placeholder="请选择部门"
1034
+ displayType="button"
1035
+ label="所属部门:"
1036
+ multiple={true}
1037
+ clearable={true}
1038
+ onChange={handleMultipleChange}
1039
+ />
1040
+ </div>
1041
+ {v2ButtonMultipleDepartments.value.length > 0 && (
1042
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
1043
+ 已选 {v2ButtonMultipleDepartments.value.length} 个部门
1044
+ </div>
1045
+ )}
1046
+ </div>
1047
+
1048
+ {/* 说明 */}
1049
+ <div style={{ marginTop: '30px', padding: '16px', background: '#f4f4f5', borderRadius: '4px' }}>
1050
+ <h4 style={{ marginBottom: '12px', color: '#303133' }}>💡 V2 版本优势:</h4>
1051
+ <ul style={{ margin: 0, paddingLeft: '20px', color: '#606266', fontSize: '14px', lineHeight: '1.8' }}>
1052
+ <li>✅ <strong>解耦设计</strong>:触发器和悬浮窗内容完全分离,通过插槽组合</li>
1053
+ <li>✅ <strong>高度可复用</strong>:PopoverSelector 可用于任何需要悬浮窗的场景</li>
1054
+ <li>✅ <strong>灵活配置</strong>:支持自定义宽度、高度、位置、样式等</li>
1055
+ <li>✅ <strong>易于扩展</strong>:可以轻松创建人员选择器、日期选择器等其他选择器</li>
1056
+ <li>✅ <strong>代码更简洁</strong>:业务逻辑专注于数据处理,UI 交互由通用组件处理</li>
1057
+ </ul>
1058
+ </div>
1059
+ </div>
1060
+ ),
1061
+ }}
1062
+ </el-collapse-item>
1063
+
1064
+ {/* ==================== 反显演示 ==================== */}
1065
+ <el-collapse-item name="5">
1066
+ {{
1067
+ title: () => (
1068
+ <h2 style={{ margin: 0, color: '#67c23a', fontSize: '18px' }}>
1069
+ ⭐ 反显演示(v-model 直接绑定对象)
1070
+ </h2>
1071
+ ),
1072
+ default: () => (
1073
+ <div style={{ padding: '10px 0' }}>
1074
+ <div style={{ marginBottom: '20px', padding: '12px', background: '#f0f9ff', borderRadius: '4px', color: '#0369a1', fontSize: '14px' }}>
1075
+ 💡 <strong>v-model 直接绑定完整对象</strong>,无需 defaultData,无需加载大量数据。<br/>
1076
+ 单选绑定对象:<code>{`{ id: 911, label: '前端开发组' }`}</code><br/>
1077
+ 多选绑定数组:<code>{`[{ id: 910, label: '后端开发组' }, ...]`}</code>
1078
+ </div>
1079
+
1080
+ {/* 部门选择器 - 单选反显 */}
1081
+ <div style={{ marginBottom: '30px' }}>
1082
+ <h3>1. 部门选择器 - 单选反显</h3>
1083
+ <div style={{ maxWidth: '400px' }}>
1084
+ <DepartmentSelector
1085
+ v-model={refluxDept.value}
1086
+ placeholder="请选择部门"
1087
+ clearable={true}
1088
+ onChange={(dept) => {
1089
+ console.log('选中部门对象:', dept)
1090
+ refluxDept.value = dept
1091
+ }}
1092
+ />
1093
+ </div>
1094
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '13px', background: '#f5f5f5', padding: '8px', borderRadius: '4px' }}>
1095
+ <div><strong>v-model:</strong> {JSON.stringify(refluxDept.value)}</div>
1096
+ <div style={{ color: '#67c23a', marginTop: '4px' }}>✅ 直接显示 "{refluxDept.value?.label}",无需加载数据</div>
1097
+ </div>
1098
+ </div>
1099
+
1100
+ {/* 部门选择器 - 多选反显 */}
1101
+ <div style={{ marginBottom: '30px' }}>
1102
+ <h3>2. 部门选择器 - 多选反显</h3>
1103
+ <div style={{ maxWidth: '400px' }}>
1104
+ <DepartmentSelector
1105
+ v-model={refluxDepts.value}
1106
+ placeholder="请选择部门"
1107
+ multiple={true}
1108
+ clearable={true}
1109
+ onChange={(depts) => {
1110
+ console.log('选中部门列表:', depts)
1111
+ refluxDepts.value = depts
1112
+ }}
1113
+ />
1114
+ </div>
1115
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '13px', background: '#f5f5f5', padding: '8px', borderRadius: '4px' }}>
1116
+ <div><strong>v-model:</strong> {refluxDepts.value.map(d => d.label).join(', ')}</div>
1117
+ <div><strong>数量:</strong> {refluxDepts.value.length} 个部门</div>
1118
+ <div style={{ color: '#67c23a', marginTop: '4px' }}>✅ 直接显示标签,无需加载数据</div>
1119
+ </div>
1120
+ </div>
1121
+
1122
+ {/* 人员选择器 - 单选反显 */}
1123
+ <div style={{ marginBottom: '30px' }}>
1124
+ <h3>3. 人员选择器 - 单选反显</h3>
1125
+ <div style={{ maxWidth: '400px' }}>
1126
+ <PersonnelSelector
1127
+ v-model={refluxPerson.value}
1128
+ placeholder="请选择人员"
1129
+ clearable={true}
1130
+ onChange={(person) => {
1131
+ console.log('选中人员对象:', person)
1132
+ refluxPerson.value = person
1133
+ }}
1134
+ />
1135
+ </div>
1136
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '13px', background: '#f5f5f5', padding: '8px', borderRadius: '4px' }}>
1137
+ <div><strong>v-model:</strong> {refluxPerson.value?.name} - {refluxPerson.value?.position}</div>
1138
+ <div style={{ color: '#67c23a', marginTop: '4px' }}>✅ 直接显示 "{refluxPerson.value?.name}",无需加载数据</div>
1139
+ </div>
1140
+ </div>
1141
+
1142
+ {/* 人员选择器 - 多选反显 */}
1143
+ <div style={{ marginBottom: '30px' }}>
1144
+ <h3>4. 人员选择器 - 多选反显(按钮模式)</h3>
1145
+ <div style={{ maxWidth: '400px' }}>
1146
+ <PersonnelSelector
1147
+ v-model={refluxPersons.value}
1148
+ displayType="button"
1149
+ label="项目成员:"
1150
+ placeholder="请选择成员"
1151
+ multiple={true}
1152
+ clearable={true}
1153
+ onChange={(persons) => {
1154
+ console.log('选中人员列表:', persons)
1155
+ refluxPersons.value = persons
1156
+ }}
1157
+ />
1158
+ </div>
1159
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '13px', background: '#f5f5f5', padding: '8px', borderRadius: '4px' }}>
1160
+ <div><strong>v-model:</strong> {refluxPersons.value.map(p => p.name).join(', ')}</div>
1161
+ <div><strong>数量:</strong> {refluxPersons.value.length} 个成员</div>
1162
+ <div style={{ color: '#67c23a', marginTop: '4px' }}>✅ 按钮显示 "{refluxPersons.value[0]?.name} +{refluxPersons.value.length - 1}"</div>
1163
+ </div>
1164
+ </div>
1165
+
1166
+ {/* 使用场景说明 */}
1167
+ <div style={{ marginTop: '30px', padding: '16px', background: '#f0f9ff', borderRadius: '4px' }}>
1168
+ <h4 style={{ marginBottom: '12px', color: '#0369a1' }}>💡 典型使用场景:</h4>
1169
+ <ul style={{ margin: 0, paddingLeft: '20px', color: '#0c4a6e', fontSize: '14px', lineHeight: '1.8' }}>
1170
+ <li><strong>编辑页面</strong>:从接口获取详情,包含完整对象,直接绑定 v-model</li>
1171
+ <li><strong>详情查看</strong>:只展示已选数据,不需要加载全量数据</li>
1172
+ <li><strong>表单回填</strong>:页面刷新或路由跳转回来,从 localStorage 恢复完整对象</li>
1173
+ <li><strong>性能优化</strong>:避免组件初始化时加载大量部门/人员数据(可能几千条)</li>
1174
+ </ul>
1175
+ </div>
1176
+
1177
+ {/* 代码示例 */}
1178
+ <div style={{ marginTop: '20px', padding: '16px', background: '#fafafa', borderRadius: '4px', fontSize: '13px', fontFamily: 'monospace' }}>
1179
+ <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#333' }}>代码示例:</div>
1180
+ <pre style={{ margin: 0, overflow: 'auto' }}>{`// ✅ 正确做法:v-model 直接绑定完整对象
1181
+ const dept = ref({ id: 911, label: '前端开发组' })
1182
+ <DepartmentSelector v-model={dept.value} />
1183
+
1184
+ // 多选
1185
+ const depts = ref([
1186
+ { id: 910, label: '后端开发组' },
1187
+ { id: 911, label: '前端开发组' }
1188
+ ])
1189
+ <DepartmentSelector v-model={depts.value} multiple={true} />
1190
+
1191
+ // 实际场景:从接口获取完整对象
1192
+ onMounted(async () => {
1193
+ const userInfo = await fetchUserInfo(userId.value)
1194
+ // 后端返回完整的部门对象
1195
+ dept.value = {
1196
+ id: userInfo.departmentId,
1197
+ label: userInfo.departmentName
1198
+ }
1199
+ // 或者直接使用后端返回的对象
1200
+ dept.value = userInfo.department
1201
+ })`}</pre>
1202
+ </div>
1203
+ </div>
1204
+ ),
1205
+ }}
1206
+ </el-collapse-item>
1207
+
1208
+ {/* ==================== 通用选项选择器 ==================== */}
1209
+ <el-collapse-item name="6">
1210
+ {{
1211
+ title: () => (
1212
+ <h2 style={{ margin: 0, color: '#9333ea', fontSize: '18px' }}>
1213
+ 🎯 通用选项选择器演示(OptionsSelector)
1214
+ </h2>
1215
+ ),
1216
+ default: () => (
1217
+ <div style={{ padding: '10px 0' }}>
1218
+ <div style={{ marginBottom: '20px', padding: '12px', background: '#faf5ff', borderRadius: '4px', color: '#9333ea', fontSize: '14px' }}>
1219
+ 💡 <strong>通用选项选择器</strong>:基于 PopoverSelector 构建,可用于任何简单的下拉选择场景,如状态选择、优先级选择等。
1220
+ </div>
1221
+
1222
+ {/* 输入框模式 - 单选 */}
1223
+ <div style={{ marginBottom: '30px' }}>
1224
+ <div style={{ display: 'flex', alignItems: 'center', gap: '10px', marginBottom: '10px' }}>
1225
+ <h3 style={{ margin: 0 }}>1. 输入框模式 - 单选(状态选择器)</h3>
1226
+ <el-button
1227
+ size="small"
1228
+ type="primary"
1229
+ onClick={() => {
1230
+ singleStatusOption.value = { label: '已通过', value: 'approved' }
1231
+ }}
1232
+ >
1233
+ 测试反显
1234
+ </el-button>
1235
+ <el-button
1236
+ size="small"
1237
+ onClick={() => {
1238
+ singleStatusOption.value = null
1239
+ }}
1240
+ >
1241
+ 清空
1242
+ </el-button>
1243
+ </div>
1244
+ <div style={{ maxWidth: '300px' }}>
1245
+ <OptionsSelector
1246
+ v-model={singleStatusOption.value}
1247
+ options={statusOptions}
1248
+ placeholder="请选择状态"
1249
+ clearable={true}
1250
+ onChange={handleOptionSingleChange}
1251
+ />
1252
+ </div>
1253
+ {singleStatusOption.value && (
1254
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
1255
+ 已选状态: {JSON.stringify(singleStatusOption.value)}
1256
+ </div>
1257
+ )}
1258
+ </div>
1259
+
1260
+ {/* 输入框模式 - 多选 */}
1261
+ <div style={{ marginBottom: '30px' }}>
1262
+ <div style={{ display: 'flex', alignItems: 'center', gap: '10px', marginBottom: '10px' }}>
1263
+ <h3 style={{ margin: 0 }}>2. 输入框模式 - 多选(优先级选择器)</h3>
1264
+ <el-button
1265
+ size="small"
1266
+ type="primary"
1267
+ onClick={() => {
1268
+ multiplePriorityOptions.value = [
1269
+ { label: '高', value: 3 },
1270
+ { label: '紧急', value: 4 }
1271
+ ]
1272
+ }}
1273
+ >
1274
+ 测试反显
1275
+ </el-button>
1276
+ <el-button
1277
+ size="small"
1278
+ onClick={() => {
1279
+ multiplePriorityOptions.value = []
1280
+ }}
1281
+ >
1282
+ 清空
1283
+ </el-button>
1284
+ </div>
1285
+ <div style={{ maxWidth: '300px' }}>
1286
+ <OptionsSelector
1287
+ v-model={multiplePriorityOptions.value}
1288
+ options={priorityOptions}
1289
+ placeholder="请选择优先级"
1290
+ multiple={true}
1291
+ clearable={true}
1292
+ onChange={handleOptionMultipleChange}
1293
+ />
1294
+ </div>
1295
+ {multiplePriorityOptions.value.length > 0 && (
1296
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
1297
+ 已选 {multiplePriorityOptions.value.length} 个优先级: {multiplePriorityOptions.value.map(p => p.label).join(', ')}
1298
+ </div>
1299
+ )}
1300
+ </div>
1301
+
1302
+ {/* 按钮模式 - 单选 */}
1303
+ <div style={{ marginBottom: '30px' }}>
1304
+ <h3>3. 按钮模式 - 单选(带标签)</h3>
1305
+ <div style={{ maxWidth: '400px' }}>
1306
+ <OptionsSelector
1307
+ v-model={buttonSingleStatus.value}
1308
+ options={statusOptions}
1309
+ placeholder="请选择状态"
1310
+ displayType="button"
1311
+ label="状态:"
1312
+ clearable={true}
1313
+ onChange={handleOptionSingleChange}
1314
+ />
1315
+ </div>
1316
+ {buttonSingleStatus.value && (
1317
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
1318
+ 已选状态: {buttonSingleStatus.value.label}
1319
+ </div>
1320
+ )}
1321
+ </div>
1322
+
1323
+ {/* 按钮模式 - 多选 */}
1324
+ <div style={{ marginBottom: '30px' }}>
1325
+ <h3>4. 按钮模式 - 多选(带标签 + 数量徽章)</h3>
1326
+ <div style={{ maxWidth: '400px' }}>
1327
+ <OptionsSelector
1328
+ v-model={buttonMultiplePriority.value}
1329
+ options={priorityOptions}
1330
+ placeholder="请选择优先级"
1331
+ displayType="button"
1332
+ label="优先级:"
1333
+ multiple={true}
1334
+ clearable={true}
1335
+ onChange={handleOptionMultipleChange}
1336
+ />
1337
+ </div>
1338
+ {buttonMultiplePriority.value.length > 0 && (
1339
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
1340
+ 已选 {buttonMultiplePriority.value.length} 个优先级
1341
+ </div>
1342
+ )}
1343
+ </div>
1344
+
1345
+ {/* 无搜索框模式 */}
1346
+ <div style={{ marginBottom: '30px' }}>
1347
+ <h3>5. 无搜索框模式(选项较少时)</h3>
1348
+ <div style={{ maxWidth: '300px' }}>
1349
+ <OptionsSelector
1350
+ v-model={noFilterStatus.value}
1351
+ options={statusOptions}
1352
+ placeholder="请选择状态"
1353
+ filterable={false}
1354
+ clearable={true}
1355
+ onChange={handleOptionSingleChange}
1356
+ />
1357
+ </div>
1358
+ {noFilterStatus.value && (
1359
+ <div style={{ marginTop: '8px', color: '#606266', fontSize: '14px' }}>
1360
+ 已选状态: {noFilterStatus.value.label}
1361
+ </div>
1362
+ )}
1363
+ </div>
1364
+
1365
+ {/* 自定义宽度和高度 */}
1366
+ <div style={{ marginBottom: '30px' }}>
1367
+ <h3>6. 自定义宽度和高度</h3>
1368
+ <div style={{ maxWidth: '400px' }}>
1369
+ <OptionsSelector
1370
+ v-model={singleStatusOption.value}
1371
+ options={statusOptions}
1372
+ placeholder="请选择状态"
1373
+ width={180}
1374
+ maxHeight={200}
1375
+ clearable={true}
1376
+ onChange={handleOptionSingleChange}
1377
+ />
1378
+ </div>
1379
+ </div>
1380
+
1381
+ {/* 使用说明 */}
1382
+ <div style={{ marginTop: '30px', padding: '16px', background: '#faf5ff', borderRadius: '4px' }}>
1383
+ <h4 style={{ marginBottom: '12px', color: '#9333ea' }}>💡 使用场景:</h4>
1384
+ <ul style={{ margin: 0, paddingLeft: '20px', color: '#581c87', fontSize: '14px', lineHeight: '1.8' }}>
1385
+ <li><strong>状态筛选</strong>:订单状态、任务状态、审批状态等</li>
1386
+ <li><strong>优先级选择</strong>:任务优先级、重要程度等</li>
1387
+ <li><strong>类型分类</strong>:文档类型、标签类型等</li>
1388
+ <li><strong>简单枚举</strong>:性别、是否启用等固定选项</li>
1389
+ <li><strong>替代原生 Select</strong>:更灵活的样式和交互控制</li>
1390
+ </ul>
1391
+ </div>
1392
+
1393
+ {/* 代码示例 */}
1394
+ <div style={{ marginTop: '20px', padding: '16px', background: '#fafafa', borderRadius: '4px', fontSize: '13px', fontFamily: 'monospace' }}>
1395
+ <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#333' }}>代码示例:</div>
1396
+ <pre style={{ margin: 0, overflow: 'auto' }}>{`// 1. 定义选项数据
1397
+ const statusOptions = [
1398
+ { label: '全部', value: '' },
1399
+ { label: '待审核', value: 'pending' },
1400
+ { label: '已通过', value: 'approved' },
1401
+ { label: '已拒绝', value: 'rejected' }
1402
+ ]
1403
+
1404
+ // 2. 定义状态
1405
+ const selectedStatus = ref(null) // 单选
1406
+ const selectedStatuses = ref([]) // 多选
1407
+
1408
+ // 3. 使用组件
1409
+ // 单选
1410
+ <OptionsSelector
1411
+ v-model={selectedStatus.value}
1412
+ options={statusOptions}
1413
+ placeholder="请选择状态"
1414
+ clearable={true}
1415
+ onChange={(val) => console.log('选中:', val)}
1416
+ />
1417
+
1418
+ // 多选
1419
+ <OptionsSelector
1420
+ v-model={selectedStatuses.value}
1421
+ options={statusOptions}
1422
+ placeholder="请选择状态"
1423
+ multiple={true}
1424
+ clearable={true}
1425
+ />
1426
+
1427
+ // 按钮模式
1428
+ <OptionsSelector
1429
+ v-model={selectedStatus.value}
1430
+ options={statusOptions}
1431
+ displayType="button"
1432
+ label="状态:"
1433
+ />
1434
+
1435
+ // 无搜索框
1436
+ <OptionsSelector
1437
+ v-model={selectedStatus.value}
1438
+ options={statusOptions}
1439
+ filterable={false}
1440
+ />
1441
+
1442
+ // 自定义宽度和高度
1443
+ <OptionsSelector
1444
+ v-model={selectedStatus.value}
1445
+ options={statusOptions}
1446
+ width={180}
1447
+ maxHeight={200}
1448
+ />`}</pre>
1449
+ </div>
1450
+ </div>
1451
+ ),
1452
+ }}
1453
+ </el-collapse-item>
1454
+ </el-collapse>
1455
+ </div>
1456
+ )
1457
+ }
1458
+ },
1459
+ })