|
@@ -1,15 +1,79 @@
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
-import { ComponentSize } from 'element-plus'
|
|
|
|
-import { PropType } from 'vue'
|
|
|
|
|
|
+import { ComponentSize, ElAvatar, ElTooltip } from 'element-plus'
|
|
|
|
+import { PropType, computed } from 'vue'
|
|
|
|
+import { AvatarItem } from './types'
|
|
|
|
+import { useDesign } from '@/hooks/web/useDesign'
|
|
|
|
|
|
-defineProps({
|
|
|
|
|
|
+const { getPrefixCls } = useDesign()
|
|
|
|
+
|
|
|
|
+const prefixCls = getPrefixCls('avatars')
|
|
|
|
+
|
|
|
|
+const props = defineProps({
|
|
size: {
|
|
size: {
|
|
- type: String as PropType<ComponentSize>,
|
|
|
|
|
|
+ type: [String, Number] as PropType<ComponentSize | number>,
|
|
default: ''
|
|
default: ''
|
|
|
|
+ },
|
|
|
|
+ max: {
|
|
|
|
+ type: Number,
|
|
|
|
+ default: 5
|
|
|
|
+ },
|
|
|
|
+ data: {
|
|
|
|
+ type: Array as PropType<AvatarItem[]>,
|
|
|
|
+ default: () => []
|
|
|
|
+ },
|
|
|
|
+ showTooltip: {
|
|
|
|
+ type: Boolean,
|
|
|
|
+ default: true
|
|
}
|
|
}
|
|
})
|
|
})
|
|
|
|
+
|
|
|
|
+const filterData = computed(() => props.data.slice(0, props.max))
|
|
</script>
|
|
</script>
|
|
|
|
|
|
<template>
|
|
<template>
|
|
- <div> 头像 </div>
|
|
|
|
|
|
+ <div :class="prefixCls" class="flex items-center">
|
|
|
|
+ <template v-for="item in filterData" :key="item.url">
|
|
|
|
+ <template v-if="showTooltip && item.name">
|
|
|
|
+ <ElTooltip :content="item.name" placement="top">
|
|
|
|
+ <ElAvatar
|
|
|
|
+ :size="size"
|
|
|
|
+ :src="item.url"
|
|
|
|
+ class="relative"
|
|
|
|
+ :style="{
|
|
|
|
+ zIndex: filterData.indexOf(item)
|
|
|
|
+ }"
|
|
|
|
+ />
|
|
|
|
+ </ElTooltip>
|
|
|
|
+ </template>
|
|
|
|
+ <template v-else>
|
|
|
|
+ <ElAvatar
|
|
|
|
+ :size="size"
|
|
|
|
+ :src="item.url"
|
|
|
|
+ class="relative"
|
|
|
|
+ :style="{
|
|
|
|
+ zIndex: filterData.indexOf(item)
|
|
|
|
+ }"
|
|
|
|
+ />
|
|
|
|
+ </template>
|
|
|
|
+ </template>
|
|
|
|
+
|
|
|
|
+ <ElAvatar
|
|
|
|
+ v-if="data.length > max"
|
|
|
|
+ :style="{
|
|
|
|
+ zIndex: data.length
|
|
|
|
+ }"
|
|
|
|
+ >
|
|
|
|
+ <span>+{{ data.length - max }}</span>
|
|
|
|
+ </ElAvatar>
|
|
|
|
+ </div>
|
|
</template>
|
|
</template>
|
|
|
|
+
|
|
|
|
+<style scoped lang="less">
|
|
|
|
+@prefix-cls: ~'@{namespace}-avatars';
|
|
|
|
+
|
|
|
|
+.@{prefix-cls} {
|
|
|
|
+ .@{elNamespace}-avatar + .@{elNamespace}-avatar {
|
|
|
|
+ margin-left: -15px;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+</style>
|