@ebiz/designer-components 0.0.40 → 0.0.43
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.
- package/dist/designer-components.css +1 -1
- package/dist/index.mjs +9285 -9137
- package/package.json +1 -1
- package/src/components/EbizEmployeeSelector.vue +285 -64
- package/src/components/senior/EbizSData/index.vue +1 -1
- package/src/components/senior/EbizSDialog/index.vue +1 -1
- package/src/components/senior/EbizSForm/item.vue +49 -4
package/package.json
CHANGED
@@ -1,23 +1,23 @@
|
|
1
1
|
<template>
|
2
2
|
<div class="ebiz-employee-selector">
|
3
3
|
<!-- 选择框展示区 -->
|
4
|
-
<div>
|
4
|
+
<div style="display: flex; flex-direction: column; align-items: flex-start; gap: 10px;">
|
5
5
|
<div class="selected-items" v-if="selectedItems && selectedItems.length">
|
6
6
|
<div v-for="(item, index) in selectedItems" :key="index" class="selected-item">
|
7
7
|
<t-avatar v-if="item.avatar" :image="item.avatar" size="small" />
|
8
8
|
<t-avatar v-else size="small">{{ getAvatarText(item.name) }}</t-avatar>
|
9
9
|
<span class="item-info">
|
10
|
-
<span class="item-code">{{ item.
|
10
|
+
<span class="item-code">{{ item.no }} - </span>
|
11
11
|
<span class="item-name">{{ item.name }}</span>
|
12
12
|
</span>
|
13
13
|
<t-icon name="close" class="item-remove" @click="removeItem(index, item.id)"></t-icon>
|
14
14
|
</div>
|
15
15
|
</div>
|
16
|
-
<t-button @click="showDialog" variant="text" theme="primary"
|
16
|
+
<t-button @click="showDialog" variant="text" theme="primary">选择人员</t-button>
|
17
17
|
</div>
|
18
18
|
|
19
19
|
<!-- 选择弹窗 -->
|
20
|
-
<t-dialog v-model:visible="dialogVisible" header="选择人员" :width="800"
|
20
|
+
<t-dialog v-model:visible="dialogVisible" header="选择人员" :width="800" footer :close-btn="true"
|
21
21
|
:close-on-esc-keydown="true" :close-on-overlay-click="true">
|
22
22
|
|
23
23
|
<!-- 选项卡 -->
|
@@ -35,15 +35,6 @@
|
|
35
35
|
<div class="selector-dialog-content">
|
36
36
|
<!-- 左侧选择区域 -->
|
37
37
|
<div class="left-panel">
|
38
|
-
<!-- 顶部搜索区域 -->
|
39
|
-
<div class="search-box">
|
40
|
-
<t-input v-model="searchText" placeholder="请输入姓名/拼音/工号" clearable>
|
41
|
-
<template #suffix-icon>
|
42
|
-
<t-icon name="search"></t-icon>
|
43
|
-
</template>
|
44
|
-
</t-input>
|
45
|
-
</div>
|
46
|
-
|
47
38
|
<!-- 内容区域 -->
|
48
39
|
<div class="content-area">
|
49
40
|
<div v-if="loading" class="loading-container">
|
@@ -98,6 +89,9 @@
|
|
98
89
|
<div class="employee-header">
|
99
90
|
<div class="employee-title">
|
100
91
|
{{ currentNodeName || '人员列表' }}
|
92
|
+
<div v-if="activeTab === 'organization'" class="sub-dept-option">
|
93
|
+
<t-checkbox v-model="childDeptEnable">包含子部门</t-checkbox>
|
94
|
+
</div>
|
101
95
|
</div>
|
102
96
|
<div class="employee-count">
|
103
97
|
<t-checkbox v-model="selectAll" @change="handleSelectAll">全选</t-checkbox>
|
@@ -105,6 +99,17 @@
|
|
105
99
|
</div>
|
106
100
|
</div>
|
107
101
|
|
102
|
+
<!-- 搜索框 -->
|
103
|
+
<div class="search-box">
|
104
|
+
<t-input v-model="searchText" placeholder="请输入姓名/拼音/工号搜索" clearable
|
105
|
+
@keyup.enter="handleSearchEnter">
|
106
|
+
<template #suffix-icon>
|
107
|
+
<t-icon name="search" @click="handleSearchClick"></t-icon>
|
108
|
+
</template>
|
109
|
+
</t-input>
|
110
|
+
<t-button v-if="searchText" size="small" theme="default" class="clear-search-btn" @click="clearSearch">清除搜索</t-button>
|
111
|
+
</div>
|
112
|
+
|
108
113
|
<div class="employee-list">
|
109
114
|
<div v-for="(item, index) in filteredEmployeeList" :key="index" class="employee-item">
|
110
115
|
<t-checkbox v-model="item.checked" @change="handleCheckChange(item)"></t-checkbox>
|
@@ -113,7 +118,7 @@
|
|
113
118
|
<t-avatar v-else size="small">{{ getAvatarText(item.name) }}</t-avatar>
|
114
119
|
</div>
|
115
120
|
<div class="employee-info">
|
116
|
-
<div class="employee-code">{{ item.
|
121
|
+
<div class="employee-code">{{ item.no }} - </div>
|
117
122
|
<div class="employee-name">{{ item.name }}</div>
|
118
123
|
</div>
|
119
124
|
</div>
|
@@ -130,7 +135,18 @@
|
|
130
135
|
<template #footer>
|
131
136
|
<div class="dialog-footer">
|
132
137
|
<div class="selected-preview">
|
133
|
-
已选: {{
|
138
|
+
已选: {{ tempSelectedEmployees.length }} 人
|
139
|
+
<div class="selected-people-list" v-if="tempSelectedEmployees.length > 0">
|
140
|
+
<div v-for="(item, index) in tempSelectedEmployees" :key="index" class="selected-people-item">
|
141
|
+
<t-avatar v-if="item.avatar" :image="item.avatar" size="small" />
|
142
|
+
<t-avatar v-else size="small">{{ getAvatarText(item.name) }}</t-avatar>
|
143
|
+
<span class="item-info">
|
144
|
+
<span class="item-code">{{ item.no }}</span>
|
145
|
+
<span class="item-name">{{ item.name }}</span>
|
146
|
+
</span>
|
147
|
+
<t-icon name="close" class="item-remove" @click="removeSelectedEmployee(item)"></t-icon>
|
148
|
+
</div>
|
149
|
+
</div>
|
134
150
|
</div>
|
135
151
|
<div class="dialog-actions">
|
136
152
|
<t-button theme="default" @click="handleCancel">取消</t-button>
|
@@ -205,6 +221,10 @@ const searchText = ref('');
|
|
205
221
|
const activeTab = ref(props.defaultTab);
|
206
222
|
const loading = ref(false);
|
207
223
|
const selectedItems = ref([]);
|
224
|
+
// 对话框中临时保存的选中员工列表
|
225
|
+
const tempSelectedEmployees = ref([]);
|
226
|
+
// 是否查询子部门
|
227
|
+
const childDeptEnable = ref(false);
|
208
228
|
|
209
229
|
// 数据源
|
210
230
|
const organizationData = ref([]);
|
@@ -222,14 +242,8 @@ const getAvatarText = (name) => {
|
|
222
242
|
return name ? name.substring(0, 1) : '';
|
223
243
|
};
|
224
244
|
|
225
|
-
// 判断员工是否已选中
|
226
|
-
const isEmployeeSelected = (employee) => {
|
227
|
-
return props.modelValue && props.modelValue.includes(employee.id);
|
228
|
-
};
|
229
|
-
|
230
245
|
// 处理组织数据,转换为树形结构
|
231
|
-
const
|
232
|
-
console.log(data);
|
246
|
+
const _processOrgData = (data) => {
|
233
247
|
// 转换数据结构为树形结构
|
234
248
|
const map = {};
|
235
249
|
const result = [];
|
@@ -256,8 +270,6 @@ const processOrgData = (data) => {
|
|
256
270
|
}
|
257
271
|
});
|
258
272
|
|
259
|
-
console.log(result);
|
260
|
-
|
261
273
|
return result;
|
262
274
|
};
|
263
275
|
|
@@ -296,9 +308,10 @@ const fetchOrganizationData = async () => {
|
|
296
308
|
{
|
297
309
|
apiId: 1933,
|
298
310
|
key: 'organizationalStructure'
|
299
|
-
}
|
311
|
+
},"/process/deptList"
|
300
312
|
);
|
301
|
-
organizationData.value =
|
313
|
+
organizationData.value = response
|
314
|
+
// organizationData.value = processOrgData(response.data || []);
|
302
315
|
} catch (error) {
|
303
316
|
MessagePlugin.error({
|
304
317
|
content: '获取组织架构数据失败',
|
@@ -396,44 +409,56 @@ const fetchSubordinateData = async () => {
|
|
396
409
|
};
|
397
410
|
|
398
411
|
// 根据节点ID获取员工列表
|
399
|
-
const fetchEmployeesByNode = async (nodeId, type) => {
|
412
|
+
const fetchEmployeesByNode = async (nodeId, type, keyword = searchText.value) => {
|
400
413
|
loading.value = true;
|
401
|
-
employeeList.value = [];
|
402
414
|
|
403
415
|
try {
|
404
416
|
const params = {};
|
405
417
|
|
406
|
-
//
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
418
|
+
// 只有当nodeId不为空且type有效时,添加对应参数
|
419
|
+
if (nodeId && type) {
|
420
|
+
// 根据不同类型设置不同的查询参数
|
421
|
+
switch (type) {
|
422
|
+
case 'organization':
|
423
|
+
params.deptId = Array.isArray(nodeId) ? nodeId[0] : nodeId;
|
424
|
+
// 添加子部门查询参数
|
425
|
+
params.childDeptEnable = childDeptEnable.value;
|
426
|
+
break;
|
427
|
+
case 'role':
|
428
|
+
params.roleId = nodeId;
|
429
|
+
break;
|
430
|
+
case 'position':
|
431
|
+
params.positionId = nodeId;
|
432
|
+
break;
|
433
|
+
case 'department':
|
434
|
+
params.departmentId = nodeId;
|
435
|
+
break;
|
436
|
+
case 'subordinate':
|
437
|
+
params.managerId = nodeId;
|
438
|
+
break;
|
439
|
+
}
|
440
|
+
}
|
441
|
+
|
442
|
+
// 如果有搜索关键词,添加到查询参数中
|
443
|
+
if (keyword) {
|
444
|
+
params.keyWord = keyword;
|
423
445
|
}
|
424
446
|
|
425
447
|
const response = await dataService.fetch(
|
426
448
|
params,
|
427
449
|
{},
|
428
|
-
'/process/userList'
|
450
|
+
'/process/userList'
|
429
451
|
);
|
430
452
|
|
431
|
-
//
|
432
|
-
const
|
453
|
+
// 获取当前已选择的员工ID列表
|
454
|
+
const selectedIds = new Set(tempSelectedEmployees.value.map(emp => emp.id));
|
455
|
+
|
456
|
+
// 处理返回数据,添加checked属性,保留已选状态
|
457
|
+
const employees = (response || []).map(emp => ({
|
433
458
|
...emp,
|
434
|
-
checked:
|
459
|
+
checked: selectedIds.has(emp.id)
|
435
460
|
}));
|
436
|
-
|
461
|
+
|
437
462
|
employeeList.value = employees;
|
438
463
|
updateSelectAllStatus();
|
439
464
|
} catch (error) {
|
@@ -457,14 +482,14 @@ const fetchEmployeesByIds = async (ids) => {
|
|
457
482
|
try {
|
458
483
|
const response = await dataService.fetch(
|
459
484
|
{
|
460
|
-
|
485
|
+
userIds: ids // 使用新的接口参数格式
|
461
486
|
},
|
462
487
|
{},
|
463
|
-
'/
|
488
|
+
'/process/userList' // 直接使用新的API路径
|
464
489
|
);
|
465
490
|
|
466
|
-
if (response
|
467
|
-
selectedItems.value = response
|
491
|
+
if (response && Array.isArray(response)) {
|
492
|
+
selectedItems.value = response;
|
468
493
|
} else {
|
469
494
|
selectedItems.value = [];
|
470
495
|
MessagePlugin.warning({
|
@@ -502,6 +527,11 @@ const selectDepartment = (department) => {
|
|
502
527
|
const handleSelectAll = (checked) => {
|
503
528
|
employeeList.value.forEach(item => {
|
504
529
|
item.checked = checked;
|
530
|
+
|
531
|
+
// 如果选中,确保添加到临时选中列表
|
532
|
+
if (checked && !tempSelectedEmployees.value.some(emp => emp.id === item.id)) {
|
533
|
+
tempSelectedEmployees.value.push(item);
|
534
|
+
}
|
505
535
|
});
|
506
536
|
};
|
507
537
|
|
@@ -514,14 +544,36 @@ const handleCheckChange = (item) => {
|
|
514
544
|
emp.checked = false;
|
515
545
|
}
|
516
546
|
});
|
547
|
+
|
548
|
+
// 单选模式下,直接替换tempSelectedEmployees
|
549
|
+
tempSelectedEmployees.value = item.checked ? [item] : [];
|
550
|
+
} else {
|
551
|
+
// 多选模式
|
552
|
+
// 如果选中,添加到临时选中列表
|
553
|
+
if (item.checked && !tempSelectedEmployees.value.some(emp => emp.id === item.id)) {
|
554
|
+
tempSelectedEmployees.value.push(item);
|
555
|
+
} else if (!item.checked) {
|
556
|
+
// 如果取消选中,从临时选中列表中移除
|
557
|
+
const index = tempSelectedEmployees.value.findIndex(emp => emp.id === item.id);
|
558
|
+
if (index !== -1) {
|
559
|
+
tempSelectedEmployees.value.splice(index, 1);
|
560
|
+
}
|
561
|
+
}
|
517
562
|
}
|
518
563
|
|
519
564
|
// 检查最大选择数量限制
|
520
565
|
if (props.maxCount > 0) {
|
521
|
-
const checkedCount =
|
566
|
+
const checkedCount = tempSelectedEmployees.value.length;
|
522
567
|
if (checkedCount > props.maxCount) {
|
523
568
|
item.checked = false;
|
524
|
-
|
569
|
+
const index = tempSelectedEmployees.value.findIndex(emp => emp.id === item.id);
|
570
|
+
if (index !== -1) {
|
571
|
+
tempSelectedEmployees.value.splice(index, 1);
|
572
|
+
}
|
573
|
+
MessagePlugin.warning({
|
574
|
+
content: `最多只能选择${props.maxCount}个人员`,
|
575
|
+
duration: 3000
|
576
|
+
});
|
525
577
|
}
|
526
578
|
}
|
527
579
|
|
@@ -543,6 +595,24 @@ const removeItem = (index, id) => {
|
|
543
595
|
selectedItems.value.splice(index, 1);
|
544
596
|
};
|
545
597
|
|
598
|
+
// 从已选列表中移除员工
|
599
|
+
const removeSelectedEmployee = (employee) => {
|
600
|
+
// 将员工的checked状态设为false
|
601
|
+
const foundEmployee = employeeList.value.find(item => item.id === employee.id);
|
602
|
+
if (foundEmployee) {
|
603
|
+
foundEmployee.checked = false;
|
604
|
+
}
|
605
|
+
|
606
|
+
// 从临时选中列表中移除
|
607
|
+
const index = tempSelectedEmployees.value.findIndex(emp => emp.id === employee.id);
|
608
|
+
if (index !== -1) {
|
609
|
+
tempSelectedEmployees.value.splice(index, 1);
|
610
|
+
}
|
611
|
+
|
612
|
+
// 更新全选状态
|
613
|
+
updateSelectAllStatus();
|
614
|
+
};
|
615
|
+
|
546
616
|
// 初始化选择器
|
547
617
|
const initSelector = async () => {
|
548
618
|
// 获取数据
|
@@ -561,6 +631,13 @@ const initSelector = async () => {
|
|
561
631
|
|
562
632
|
// 显示对话框
|
563
633
|
const showDialog = () => {
|
634
|
+
// 初始化临时选中列表
|
635
|
+
if (selectedItems.value.length > 0) {
|
636
|
+
tempSelectedEmployees.value = [...selectedItems.value];
|
637
|
+
} else {
|
638
|
+
tempSelectedEmployees.value = [];
|
639
|
+
}
|
640
|
+
|
564
641
|
// 初始化数据
|
565
642
|
initSelector();
|
566
643
|
dialogVisible.value = true;
|
@@ -568,9 +645,7 @@ const showDialog = () => {
|
|
568
645
|
|
569
646
|
// 确认选择
|
570
647
|
const handleConfirm = () => {
|
571
|
-
const selectedEmployeeIds =
|
572
|
-
.filter(item => item.checked)
|
573
|
-
.map(item => item.id);
|
648
|
+
const selectedEmployeeIds = tempSelectedEmployees.value.map(item => item.id);
|
574
649
|
|
575
650
|
emit('update:modelValue', selectedEmployeeIds);
|
576
651
|
emit('change', selectedEmployeeIds);
|
@@ -579,6 +654,8 @@ const handleConfirm = () => {
|
|
579
654
|
|
580
655
|
// 取消选择
|
581
656
|
const handleCancel = () => {
|
657
|
+
// 放弃临时选择
|
658
|
+
tempSelectedEmployees.value = [];
|
582
659
|
dialogVisible.value = false;
|
583
660
|
};
|
584
661
|
|
@@ -600,16 +677,100 @@ watch(() => props.modelValue, (newIds, oldIds) => {
|
|
600
677
|
}
|
601
678
|
}, { immediate: true, deep: true });
|
602
679
|
|
680
|
+
// 监听选中员工变化,更新临时已选列表
|
681
|
+
watch(selectedEmployees, (newVal) => {
|
682
|
+
// 更新临时选中列表,保留之前不在当前列表中的已选员工
|
683
|
+
const currentIds = new Set(newVal.map(emp => emp.id));
|
684
|
+
|
685
|
+
// 移除tempSelectedEmployees中已经不再选中的员工
|
686
|
+
tempSelectedEmployees.value = tempSelectedEmployees.value.filter(emp =>
|
687
|
+
!currentIds.has(emp.id) || newVal.some(item => item.id === emp.id)
|
688
|
+
);
|
689
|
+
|
690
|
+
// 添加新选中的员工
|
691
|
+
newVal.forEach(emp => {
|
692
|
+
if (!tempSelectedEmployees.value.some(item => item.id === emp.id)) {
|
693
|
+
tempSelectedEmployees.value.push(emp);
|
694
|
+
}
|
695
|
+
});
|
696
|
+
}, { deep: true });
|
697
|
+
|
698
|
+
// 监听子部门查询开关变化
|
699
|
+
watch(childDeptEnable, () => {
|
700
|
+
// 如果当前在组织架构页面且有选中节点,重新加载员工列表
|
701
|
+
if (activeTab.value === 'organization' && currentActive.value && currentActive.value.length > 0) {
|
702
|
+
fetchEmployeesByNode(currentActive.value[0], activeTab.value);
|
703
|
+
}
|
704
|
+
});
|
705
|
+
|
706
|
+
// 防抖函数
|
707
|
+
const debounce = (fn, delay) => {
|
708
|
+
let timer = null;
|
709
|
+
return function(...args) {
|
710
|
+
if (timer) clearTimeout(timer);
|
711
|
+
timer = setTimeout(() => {
|
712
|
+
fn.apply(this, args);
|
713
|
+
}, delay);
|
714
|
+
};
|
715
|
+
};
|
716
|
+
|
717
|
+
// 防抖处理过的搜索函数
|
718
|
+
const debouncedSearch = debounce((keyword) => {
|
719
|
+
if (keyword) {
|
720
|
+
const nodeId = currentActive.value && currentActive.value.length > 0 ? currentActive.value[0] : null;
|
721
|
+
const type = nodeId ? activeTab.value : null;
|
722
|
+
fetchEmployeesByNode(nodeId, type, keyword);
|
723
|
+
} else if (currentActive.value && currentActive.value.length > 0) {
|
724
|
+
// 如果搜索框清空,恢复显示当前选中节点的员工列表
|
725
|
+
fetchEmployeesByNode(currentActive.value[0], activeTab.value);
|
726
|
+
} else {
|
727
|
+
// 如果没有选中节点,清空员工列表
|
728
|
+
employeeList.value = [];
|
729
|
+
}
|
730
|
+
}, 300); // 300ms防抖
|
731
|
+
|
732
|
+
// 监听搜索文本变化,触发搜索
|
733
|
+
watch(searchText, (newValue) => {
|
734
|
+
debouncedSearch(newValue);
|
735
|
+
}, { immediate: false });
|
736
|
+
|
603
737
|
// 组件挂载时执行
|
604
738
|
onMounted(() => {
|
605
|
-
// 初始化数据
|
606
|
-
if (props.defaultTab === 'organization') {
|
607
|
-
fetchOrganizationData();
|
608
|
-
}
|
609
|
-
|
610
739
|
// 获取已选员工详情
|
611
740
|
fetchEmployeesByIds(props.modelValue);
|
612
741
|
});
|
742
|
+
|
743
|
+
// 处理搜索图标点击
|
744
|
+
const handleSearchClick = () => {
|
745
|
+
if (searchText.value) {
|
746
|
+
const nodeId = currentActive.value && currentActive.value.length > 0 ? currentActive.value[0] : null;
|
747
|
+
const type = nodeId ? activeTab.value : null;
|
748
|
+
fetchEmployeesByNode(nodeId, type, searchText.value);
|
749
|
+
}
|
750
|
+
};
|
751
|
+
|
752
|
+
// 处理回车键搜索
|
753
|
+
const handleSearchEnter = () => {
|
754
|
+
if (searchText.value) {
|
755
|
+
const nodeId = currentActive.value && currentActive.value.length > 0 ? currentActive.value[0] : null;
|
756
|
+
const type = nodeId ? activeTab.value : null;
|
757
|
+
fetchEmployeesByNode(nodeId, type, searchText.value);
|
758
|
+
}
|
759
|
+
};
|
760
|
+
|
761
|
+
// 清除搜索
|
762
|
+
const clearSearch = () => {
|
763
|
+
searchText.value = '';
|
764
|
+
if (currentActive.value && currentActive.value.length > 0) {
|
765
|
+
fetchEmployeesByNode(currentActive.value[0], activeTab.value);
|
766
|
+
} else {
|
767
|
+
// 如果没有选中节点,重置员工列表但保留选中状态
|
768
|
+
employeeList.value = employeeList.value.map(emp => ({
|
769
|
+
...emp,
|
770
|
+
checked: tempSelectedEmployees.value.some(item => item.id === emp.id)
|
771
|
+
}));
|
772
|
+
}
|
773
|
+
};
|
613
774
|
</script>
|
614
775
|
|
615
776
|
<style scoped>
|
@@ -700,6 +861,27 @@ onMounted(() => {
|
|
700
861
|
margin-bottom: 16px;
|
701
862
|
}
|
702
863
|
|
864
|
+
.right-panel .search-box {
|
865
|
+
margin-top: 8px;
|
866
|
+
margin-bottom: 16px;
|
867
|
+
display: flex;
|
868
|
+
align-items: center;
|
869
|
+
gap: 8px;
|
870
|
+
}
|
871
|
+
|
872
|
+
.right-panel .search-box .t-input {
|
873
|
+
width: 100%;
|
874
|
+
border-radius: 4px;
|
875
|
+
}
|
876
|
+
|
877
|
+
.right-panel .search-box .t-input__suffix-icon {
|
878
|
+
cursor: pointer;
|
879
|
+
}
|
880
|
+
|
881
|
+
.right-panel .search-box .t-input__suffix-icon:hover {
|
882
|
+
color: var(--td-brand-color);
|
883
|
+
}
|
884
|
+
|
703
885
|
.selector-tabs {
|
704
886
|
margin-bottom: 16px;
|
705
887
|
}
|
@@ -747,6 +929,15 @@ onMounted(() => {
|
|
747
929
|
.employee-title {
|
748
930
|
font-weight: bold;
|
749
931
|
font-size: 16px;
|
932
|
+
display: flex;
|
933
|
+
align-items: center;
|
934
|
+
gap: 10px;
|
935
|
+
}
|
936
|
+
|
937
|
+
.sub-dept-option {
|
938
|
+
margin-left: 10px;
|
939
|
+
font-weight: normal;
|
940
|
+
font-size: 14px;
|
750
941
|
}
|
751
942
|
|
752
943
|
.employee-count {
|
@@ -822,4 +1013,34 @@ onMounted(() => {
|
|
822
1013
|
display: flex;
|
823
1014
|
gap: 8px;
|
824
1015
|
}
|
1016
|
+
|
1017
|
+
.selected-people-list {
|
1018
|
+
margin-top: 8px;
|
1019
|
+
display: flex;
|
1020
|
+
flex-wrap: wrap;
|
1021
|
+
gap: 8px;
|
1022
|
+
}
|
1023
|
+
|
1024
|
+
.selected-people-item {
|
1025
|
+
display: flex;
|
1026
|
+
align-items: center;
|
1027
|
+
background-color: #f0f0f0;
|
1028
|
+
border-radius: 3px;
|
1029
|
+
padding: 2px 8px 2px 2px;
|
1030
|
+
gap: 8px;
|
1031
|
+
}
|
1032
|
+
|
1033
|
+
.selected-people-item:hover {
|
1034
|
+
background-color: #e0e0e0;
|
1035
|
+
}
|
1036
|
+
|
1037
|
+
.selected-people-item .item-remove {
|
1038
|
+
cursor: pointer;
|
1039
|
+
color: #999;
|
1040
|
+
font-size: 12px;
|
1041
|
+
}
|
1042
|
+
|
1043
|
+
.selected-people-item .item-remove:hover {
|
1044
|
+
color: #E34D59;
|
1045
|
+
}
|
825
1046
|
</style>
|
@@ -70,7 +70,7 @@ export default {
|
|
70
70
|
<script setup>
|
71
71
|
import { defineProps, defineEmits, ref, onMounted, computed } from 'vue';
|
72
72
|
import { dataService, EbizTableSort, EbizTdesignButton, EbizTdesignCard, EbizPageHeader } from "../../../index"
|
73
|
-
import { Space as TSpace } from 'tdesign-vue-next';
|
73
|
+
import { Space as TSpace, Pagination as TPagination, Input as TInput } from 'tdesign-vue-next';
|
74
74
|
|
75
75
|
const currentPage = ref(1)
|
76
76
|
const pageSize = ref(10)
|
@@ -48,7 +48,7 @@
|
|
48
48
|
|
49
49
|
<script setup>
|
50
50
|
import { ref, computed, watch } from 'vue'
|
51
|
-
import { Dialog as TDialog, MessagePlugin, Icon as TIcon } from 'tdesign-vue-next'
|
51
|
+
import { Dialog as TDialog, MessagePlugin, Icon as TIcon,Form as TForm } from 'tdesign-vue-next'
|
52
52
|
import dataService from '../../../apiService/simpleDataService'
|
53
53
|
|
54
54
|
const props = defineProps({
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<template>
|
2
2
|
<t-form-item :class="['ebiz-s-form-item', className]" :for="forAttr" :help="help" :label="label" :name="name"
|
3
3
|
:style="customStyle" :rules="rules" :label-width="labelWidth" :label-align="labelAlign" :status="status"
|
4
|
-
@validate="handleValidate">
|
4
|
+
@validate="handleValidate" style="margin-bottom: 10px;">
|
5
5
|
<!-- 输入框 -->
|
6
6
|
<template v-if="type === 'input'">
|
7
7
|
<t-input v-model="computedModelValue" :placeholder="placeholder || '请输入'" :disabled="disabled"
|
@@ -24,9 +24,32 @@
|
|
24
24
|
|
25
25
|
<!-- 选择器 -->
|
26
26
|
<template v-else-if="type === 'select'">
|
27
|
-
<
|
28
|
-
|
29
|
-
|
27
|
+
<template v-if="isRemote">
|
28
|
+
<ebiz-remote-select
|
29
|
+
v-model="computedModelValue"
|
30
|
+
:placeholder="placeholder || '请选择'"
|
31
|
+
:disabled="disabled"
|
32
|
+
:clearable="clearable"
|
33
|
+
:filterable="filterable"
|
34
|
+
:multiple="multiple"
|
35
|
+
:loading="loading"
|
36
|
+
:remote-api-config="remoteApiConfig"
|
37
|
+
@change="handleChange"
|
38
|
+
/>
|
39
|
+
</template>
|
40
|
+
<template v-else>
|
41
|
+
<t-select
|
42
|
+
v-model="computedModelValue"
|
43
|
+
:options="options"
|
44
|
+
:placeholder="placeholder || '请选择'"
|
45
|
+
:disabled="disabled"
|
46
|
+
:clearable="clearable"
|
47
|
+
:filterable="filterable"
|
48
|
+
:multiple="multiple"
|
49
|
+
:loading="loading"
|
50
|
+
@change="handleChange"
|
51
|
+
/>
|
52
|
+
</template>
|
30
53
|
</template>
|
31
54
|
|
32
55
|
<!-- 日期选择器 -->
|
@@ -134,6 +157,7 @@ import {
|
|
134
157
|
TreeSelect as TTreeSelect,
|
135
158
|
ColorPicker as TColorPicker
|
136
159
|
} from 'tdesign-vue-next';
|
160
|
+
import EbizRemoteSelect from '../../EbizRemoteSelect.vue';
|
137
161
|
|
138
162
|
const props = defineProps({
|
139
163
|
/**
|
@@ -436,6 +460,27 @@ const props = defineProps({
|
|
436
460
|
type: String,
|
437
461
|
default: 'file',
|
438
462
|
validator: (val) => ['file', 'image', 'image-flow'].includes(val)
|
463
|
+
},
|
464
|
+
/**
|
465
|
+
* 是否开启远程搜索
|
466
|
+
*/
|
467
|
+
isRemote: {
|
468
|
+
type: Boolean,
|
469
|
+
default: false
|
470
|
+
},
|
471
|
+
/**
|
472
|
+
* 远程搜索配置
|
473
|
+
*/
|
474
|
+
remoteApiConfig: {
|
475
|
+
type: Object,
|
476
|
+
default: () => ({
|
477
|
+
url: '',
|
478
|
+
method: 'GET',
|
479
|
+
params: {},
|
480
|
+
data: {},
|
481
|
+
headers: {},
|
482
|
+
transformResponse: null
|
483
|
+
})
|
439
484
|
}
|
440
485
|
});
|
441
486
|
|