Skip to content

Commit

Permalink
refactor(avatar): sfc to tsx (#1331)
Browse files Browse the repository at this point in the history
* refactor(avatar): sfc to tsx

* fix: import avatar

* test: max  测试用例补充

* fix: z-index
  • Loading branch information
liweijie0812 committed Apr 24, 2024
1 parent a3dcf05 commit f20a6ba
Show file tree
Hide file tree
Showing 10 changed files with 319 additions and 187 deletions.
148 changes: 144 additions & 4 deletions src/avatar/__test__/__snapshots__/demo.test.jsx.snap
Original file line number Diff line number Diff line change
Expand Up @@ -343,8 +343,50 @@ exports[`Avatar > Avatar actionVue demo works fine 1`] = `
</div>
</div>
</div>
<div
class="t-avatar__wrapper"
>
<div
class="t-avatar__badge"
>
<div
class="t-badge"
>
<div
class="t-badge__content"
>
<div
class="t-avatar t-avatar--medium t-avatar--circle t-avatar--border t-avatar--border-medium"
>
<span>
<svg
class="t-icon t-icon-user-add"
fill="none"
height="1em"
style="font-size: 24px;"
viewBox="0 0 24 24"
width="1em"
>
<path
d="M11.5 4a3.5 3.5 0 100 7 3.5 3.5 0 000-7zM6 7.5a5.5 5.5 0 1111 0 5.5 5.5 0 01-11 0zM19 13v4h4v2h-4v4h-2v-4h-4v-2h4v-4h2zM8 16a4 4 0 00-4 4h8.05v2H2v-2a6 6 0 016-6h4v2H8z"
fill="currentColor"
/>
</svg>
</span>
</div>
</div>
<!---->
<!---->
</div>
</div>
</div>
<!--v-if-->
</div>
</div>
`;
Expand Down Expand Up @@ -927,8 +969,36 @@ exports[`Avatar > Avatar exhibitionVue demo works fine 1`] = `
</div>
</div>
</div>
<div
class="t-avatar__wrapper"
>
<div
class="t-avatar__badge"
>
<div
class="t-badge"
>
<div
class="t-badge__content"
>
<div
class="t-avatar t-avatar--medium t-avatar--circle t-avatar--border t-avatar--border-medium"
>
<span>
+5
</span>
</div>
</div>
<!---->
<!---->
</div>
</div>
</div>
<!--v-if-->
</div>
</div>
`;
Expand Down Expand Up @@ -1903,8 +1973,36 @@ exports[`Avatar > Avatar mobileVue demo works fine 1`] = `
</div>
</div>
</div>
<div
class="t-avatar__wrapper"
>
<div
class="t-avatar__badge"
>
<div
class="t-badge"
>
<div
class="t-badge__content"
>
<div
class="t-avatar t-avatar--medium t-avatar--circle t-avatar--border t-avatar--border-medium"
>
<span>
+5
</span>
</div>
</div>
<!---->
<!---->
</div>
</div>
</div>
<!--v-if-->
</div>
</div>
Expand Down Expand Up @@ -2271,8 +2369,50 @@ exports[`Avatar > Avatar mobileVue demo works fine 1`] = `
</div>
</div>
</div>
<div
class="t-avatar__wrapper"
>
<div
class="t-avatar__badge"
>
<div
class="t-badge"
>
<div
class="t-badge__content"
>
<div
class="t-avatar t-avatar--medium t-avatar--circle t-avatar--border t-avatar--border-medium"
>
<span>
<svg
class="t-icon t-icon-user-add"
fill="none"
height="1em"
style="font-size: 24px;"
viewBox="0 0 24 24"
width="1em"
>
<path
d="M11.5 4a3.5 3.5 0 100 7 3.5 3.5 0 000-7zM6 7.5a5.5 5.5 0 1111 0 5.5 5.5 0 01-11 0zM19 13v4h4v2h-4v4h-2v-4h-4v-2h4v-4h2zM8 16a4 4 0 00-4 4h8.05v2H2v-2a6 6 0 016-6h4v2H8z"
fill="currentColor"
/>
</svg>
</span>
</div>
</div>
<!---->
<!---->
</div>
</div>
</div>
<!--v-if-->
</div>
</div>
Expand Down
9 changes: 5 additions & 4 deletions src/avatar/__test__/index.test.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import { h, nextTick } from 'vue';
import { mount } from '@vue/test-utils';
import { describe, it, expect, vi } from 'vitest';
import { UserIcon } from 'tdesign-icons-vue-next';
import Avatar from '../avatar.vue';
import AvatarGroup from '../avatar-group.vue';
import Avatar from '../avatar';
import AvatarGroup from '../avatar-group';
import Badge from '../../badge/badge';

const IMAGE = 'https://tdesign.gtimg.com/site/avatar.jpg';
Expand Down Expand Up @@ -121,7 +121,7 @@ describe('avatar-group', async () => {

it(': max', async () => {
const wrapper = mount(() => (
<AvatarGroup max={1}>
<AvatarGroup max={2}>
<Avatar image={IMAGE}></Avatar>
<Avatar image={IMAGE}></Avatar>
<Avatar image={IMAGE}></Avatar>
Expand All @@ -130,6 +130,7 @@ describe('avatar-group', async () => {
</AvatarGroup>
));
const avatarList = wrapper.findAllComponents(Avatar);
expect(avatarList.length).toBe(1);
expect(avatarList.length).toBe(3);
expect(avatarList[avatarList.length-1].text()).toBe('+3');
});
});
73 changes: 73 additions & 0 deletions src/avatar/avatar-group.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import { computed, defineComponent, Fragment, provide, RendererNode } from 'vue';

import AvatarGroupProps from './avatar-group-props';
import config from '../config';
import TAvatar from './avatar';

import { useTNodeJSX } from '../hooks/tnode';
import { usePrefixClass } from '../hooks/useClass';

const { prefix } = config;
const name = `${prefix}-avatar-group`;

export default defineComponent({
name,
props: AvatarGroupProps,
setup(props) {
const renderTNodeJSX = useTNodeJSX();
const avatarGroupClass = usePrefixClass('avatar-group');

provide('avatarGroup', { ...props });

const direction = props.cascading ? props.cascading.split('-')[0] : 'right';

const avatarGroupClasses = computed(() => [
`${avatarGroupClass.value}`,
`${avatarGroupClass.value}-offset-${direction}-${props.size.indexOf('px') > -1 ? 'medium' : props.size}`,
]);

const readerAvatar = () => {
const children: Array<RendererNode> = renderTNodeJSX('default');
const allChildren: Array<RendererNode> = [];

children.forEach((child) => {
if (child.type === Fragment) {
allChildren.push(...child.children);
} else {
allChildren.push(child);
}
});

let isShowCollapse = false;
let avatarList: Array<RendererNode> = [];
if (allChildren.length > props.max) {
avatarList = allChildren.slice(0, props.max);
isShowCollapse = true;
} else {
avatarList = allChildren;
}

if (props.cascading === 'left-up') {
const defaultZIndex = 100;
for (let index = 0; index < avatarList.length; index++) {
avatarList[index].props.style = `z-index: ${defaultZIndex - index * 10}`;
}
}

if (isShowCollapse) {
const collapseAvatar = renderTNodeJSX('collapseAvatar');
avatarList.push(
<TAvatar size={avatarList[0].size || props.size}>
{collapseAvatar || `+${allChildren.length - props.max}`}
</TAvatar>,
);
}

return avatarList;
};

return () => {
return <div class={avatarGroupClasses.value}>{readerAvatar()}</div>;
};
},
});
81 changes: 0 additions & 81 deletions src/avatar/avatar-group.vue

This file was deleted.

Loading

0 comments on commit f20a6ba

Please sign in to comment.