Profile picture display has been standardized across the board.

This commit is contained in:
2026-10-06 14:23:59 +03:30
parent bc01384551
commit 43717392b2
9 changed files with 154 additions and 21 deletions
+1 -1
View File
@@ -329,7 +329,7 @@ onMounted(() => {
ایجاد شده توسط
</dt>
<dd class="person">
<UserAvatar v-if="activity.createdBy" :name="activity.createdBy.fullName" :size="28" />
<UserAvatar v-if="activity.createdBy" :name="activity.createdBy.fullName" :user-id="activity.createdBy.id" :size="28" />
{{ activity.createdBy?.fullName || '—' }}
</dd>
</div>
+3 -1
View File
@@ -623,6 +623,8 @@ watch([id, isNew], () => void load(), { immediate: true });
v-for="user in selectedAssignees.slice(0, 3)"
:key="user.id"
:name="user.fullName"
:user-id="user.id"
:has-avatar="user.hasAvatar"
:size="28"
/>
<UserAvatar
@@ -647,7 +649,7 @@ watch([id, isNew], () => void load(), { immediate: true });
<span class="check" :class="{ on: assigneeIds.includes(user.id) }">
<UiIcon v-if="assigneeIds.includes(user.id)" name="check-plain" :size="12" />
</span>
<UserAvatar :name="user.fullName" :size="28" />
<UserAvatar :name="user.fullName" :user-id="user.id" :has-avatar="user.hasAvatar" :size="28" />
{{ user.fullName }}
</button>
</li>
+16 -10
View File
@@ -296,6 +296,12 @@ function roomTitle(room: ConversationRoomDto) {
return peer?.fullName ?? room.name;
}
function roomAvatarProps(room: ConversationRoomDto) {
if (room.kind !== 'dm') return { src: '' };
const peer = peers.value.find((p) => p.id === room.peerUserId);
return { userId: room.peerUserId, hasAvatar: peer?.hasAvatar };
}
function roomKindLabel(kind: ConversationRoomDto['kind']) {
if (kind === 'channel') return 'کانال';
if (kind === 'group') return 'گروه';
@@ -1912,7 +1918,7 @@ onUnmounted(() => {
@click="openRoom(room)"
>
<span class="avatar-ring">
<UserAvatar :name="roomTitle(room)" :size="40" />
<UserAvatar v-bind="roomAvatarProps(room)" :name="roomTitle(room)" :size="40" />
</span>
<span class="room-meta">
<strong>
@@ -2019,7 +2025,7 @@ onUnmounted(() => {
<UiIcon name="arrow-right" :size="20" />
</button>
<span class="stage-avatar">
<UserAvatar :name="roomTitle(activeRoom)" :size="36" />
<UserAvatar v-bind="roomAvatarProps(activeRoom)" :name="roomTitle(activeRoom)" :size="36" />
</span>
<div class="stage-titles">
<h2>{{ roomTitle(activeRoom) }}</h2>
@@ -2274,7 +2280,7 @@ onUnmounted(() => {
:class="{ active: idx === mentionIndex }"
@click="insertMention(peer)"
>
<UserAvatar :name="peer.fullName" :size="28" />
<UserAvatar :name="peer.fullName" :user-id="peer.id" :has-avatar="peer.hasAvatar" :size="28" />
<span>{{ peer.fullName }}</span>
</button>
</div>
@@ -2521,7 +2527,7 @@ onUnmounted(() => {
:class="{ on: dmPeerId === p.id }"
@click="dmPeerId = p.id"
>
<UserAvatar :name="p.fullName" :size="40" />
<UserAvatar :name="p.fullName" :user-id="p.id" :has-avatar="p.hasAvatar" :size="40" />
<span class="peer-row-meta">
<strong>{{ p.fullName }}</strong>
<small>گفتگوی خصوصی</small>
@@ -2563,7 +2569,7 @@ onUnmounted(() => {
:title="`حذف ${p.fullName}`"
@click="toggleGroupMember(p.id)"
>
<UserAvatar :name="p.fullName" :size="22" />
<UserAvatar :name="p.fullName" :user-id="p.id" :has-avatar="p.hasAvatar" :size="22" />
<span>{{ p.fullName }}</span>
<UiIcon name="x" :size="12" />
</button>
@@ -2586,7 +2592,7 @@ onUnmounted(() => {
:class="{ on: groupMemberIds.includes(p.id) }"
@click="toggleGroupMember(p.id)"
>
<UserAvatar :name="p.fullName" :size="40" />
<UserAvatar :name="p.fullName" :user-id="p.id" :has-avatar="p.hasAvatar" :size="40" />
<span class="peer-row-meta">
<strong>{{ p.fullName }}</strong>
<small>{{ groupMemberIds.includes(p.id) ? 'انتخاب‌شده' : 'برای افزودن بزنید' }}</small>
@@ -2638,7 +2644,7 @@ onUnmounted(() => {
:title="`حذف ${p.fullName}`"
@click="toggleChannelMember(p.id)"
>
<UserAvatar :name="p.fullName" :size="22" />
<UserAvatar :name="p.fullName" :user-id="p.id" :has-avatar="p.hasAvatar" :size="22" />
<span>{{ p.fullName }}</span>
<UiIcon name="x" :size="12" />
</button>
@@ -2661,7 +2667,7 @@ onUnmounted(() => {
:class="{ on: channelMemberIds.includes(p.id) }"
@click="toggleChannelMember(p.id)"
>
<UserAvatar :name="p.fullName" :size="40" />
<UserAvatar :name="p.fullName" :user-id="p.id" :has-avatar="p.hasAvatar" :size="40" />
<span class="peer-row-meta">
<strong>{{ p.fullName }}</strong>
<small>{{ channelMemberIds.includes(p.id) ? 'انتخاب‌شده' : 'برای افزودن بزنید' }}</small>
@@ -2853,7 +2859,7 @@ onUnmounted(() => {
<div v-if="membersBusy && !roomMembers.length" class="muted center pad">در حال بارگذاری…</div>
<div v-else class="peer-list members-list">
<div v-for="m in roomMembers" :key="m.userId" class="peer-row member-static">
<UserAvatar :name="m.fullName" :size="40" />
<UserAvatar :name="m.fullName" :user-id="m.userId" :has-avatar="m.hasAvatar" :size="40" />
<span class="peer-row-meta">
<strong>{{ m.fullName }}{{ m.isMe ? ' (شما)' : '' }}</strong>
<small>{{ m.role === 'admin' ? 'ادمین' : 'عضو' }}</small>
@@ -2904,7 +2910,7 @@ onUnmounted(() => {
:disabled="forwardBusy"
@click="confirmForward(room.externalRoomId)"
>
<UserAvatar :name="roomTitle(room)" :size="36" />
<UserAvatar v-bind="roomAvatarProps(room)" :name="roomTitle(room)" :size="36" />
<span>{{ roomTitle(room) }}</span>
</button>
</div>
+2 -2
View File
@@ -613,7 +613,7 @@ onMounted(load);
<div class="field owner-field">
<label>مسئول انجام این معامله <i>*</i></label>
<button class="picker" type="button" @click.stop="toggleMenu('owner')">
<UserAvatar :name="selectedOwner?.fullName || 'مسئول'" :size="32" />
<UserAvatar :name="selectedOwner?.fullName || 'مسئول'" :user-id="selectedOwner?.id" :size="32" />
<span :class="{ ghost: !selectedOwner }">
{{ selectedOwner?.fullName || 'انتخاب کنید' }}
</span>
@@ -622,7 +622,7 @@ onMounted(load);
<ul v-if="openMenu === 'owner'" class="menu">
<li v-for="user in users" :key="user.id">
<button type="button" @click="ownerId = user.id; openMenu = ''">
<UserAvatar :name="user.fullName" :size="28" />
<UserAvatar :name="user.fullName" :user-id="user.id" :has-avatar="user.hasAvatar" :size="28" />
{{ user.fullName }}
</button>
</li>