@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ebiz/designer-components",
3
- "version": "0.0.40",
3
+ "version": "0.0.43",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -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.code }}</span>
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" size="small"> 选择人员 </t-button>
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" :footer="false" :close-btn="true"
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.code }}</div>
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
- 已选: {{ selectedEmployees.length }} 人
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 processOrgData = (data) => {
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 = processOrgData(response.data || []);
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
- switch (type) {
408
- case 'organization':
409
- params.deptId = nodeId[0];
410
- break;
411
- case 'role':
412
- params.roleId = nodeId;
413
- break;
414
- case 'position':
415
- params.positionId = nodeId;
416
- break;
417
- case 'department':
418
- params.departmentId = nodeId;
419
- break;
420
- case 'subordinate':
421
- params.managerId = nodeId;
422
- break;
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' // 直接使用新的API路径
450
+ '/process/userList'
429
451
  );
430
452
 
431
- // 处理返回数据,添加checked属性
432
- const employees = (response?.data || []).map(emp => ({
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: isEmployeeSelected(emp)
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
- ids: ids // 使用新的接口参数格式
485
+ userIds: ids // 使用新的接口参数格式
461
486
  },
462
487
  {},
463
- '/v1/employee/getByIds' // 直接使用新的API路径
488
+ '/process/userList' // 直接使用新的API路径
464
489
  );
465
490
 
466
- if (response?.data && Array.isArray(response.data)) {
467
- selectedItems.value = response.data;
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 = employeeList.value.filter(emp => emp.checked).length;
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 = employeeList.value
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
- <t-select v-model="computedModelValue" :options="options" :placeholder="placeholder || '请选择'"
28
- :disabled="disabled" :clearable="clearable" :filterable="filterable" :multiple="multiple"
29
- :loading="loading" @change="handleChange" />
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