Blame view

Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/copy-component.vue 2.48 KB
515fceeb   “wangming”   框架初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
  <!--抄送组件-->
  <script setup lang="ts">
  import type { PropType } from 'vue';
  
  import type { User } from '#/api/system/user/model';
  
  import { computed } from 'vue';
  
  import { useVbenModal, VbenAvatar } from '@vben/common-ui';
  
  import { Avatar, AvatarGroup, Tooltip } from 'ant-design-vue';
  
  import { userSelectModal } from '.';
  
  defineOptions({
    name: 'CopyComponent',
    inheritAttrs: false,
  });
  
  const props = withDefaults(
    defineProps<{ allowUserIds?: string; ellipseNumber?: number }>(),
    {
      /**
       * 最大显示的头像数量 超过显示为省略号头像
       */
      ellipseNumber: 3,
      /**
       * 允许选择允许选择的人员ID 会当做参数拼接在uselist接口
       */
      allowUserIds: '',
    },
  );
  
  const emit = defineEmits<{ cancel: []; finish: [User[]] }>();
  
  const [UserSelectModal, modalApi] = useVbenModal({
    connectedComponent: userSelectModal,
  });
  
  const userListModel = defineModel('userList', {
    type: Array as PropType<User[]>,
    default: () => [],
  });
  
  function handleOpen() {
    modalApi.setData({ userList: userListModel.value });
    modalApi.open();
  }
  
  function handleFinish(userList: User[]) {
    // 清空 直接赋值[]会丢失响应性
    userListModel.value.splice(0, userListModel.value.length);
    userListModel.value.push(...userList);
    emit('finish', userList);
  }
  
  const displayedList = computed(() => {
    return userListModel.value.slice(0, props.ellipseNumber);
  });
  </script>
  
  <template>
    <div class="flex items-center gap-2">
      <AvatarGroup v-if="userListModel.length > 0">
        <Tooltip
          v-for="user in displayedList"
          :key="user.userId"
          :title="user.nick"
          placement="top"
        >
          <div>
            <VbenAvatar
              :alt="user.nick"
              class="bg-primary size-[36px] cursor-pointer rounded-full border text-white"
              src=""
            />
          </div>
        </Tooltip>
        <Tooltip
          :title="`等${userListModel.length - props.ellipseNumber}人`"
          placement="top"
        >
          <Avatar
            v-if="userListModel.length > ellipseNumber"
            class="flex size-[36px] cursor-pointer items-center justify-center rounded-full border bg-[gray] text-white"
          >
            +{{ userListModel.length - props.ellipseNumber }}
          </Avatar>
        </Tooltip>
      </AvatarGroup>
      <a-button size="small" @click="handleOpen">选择人员</a-button>
      <UserSelectModal
        :allow-user-ids="allowUserIds"
        @cancel="$emit('cancel')"
        @finish="handleFinish"
      />
    </div>
  </template>