Merge pull request #5168 from christianbeeznest/ofaj-21101-7
Social: Improve user profile interface with extra information display - refs BT#21101pull/5169/head
commit
93cd0311ec
@ -1,58 +1,120 @@ |
||||
<template> |
||||
<BaseCard plain> |
||||
<div class="p-4 text-center"> |
||||
<img |
||||
:src="user.illustrationUrl" |
||||
class="mb-4 w-24 h-24 mx-auto rounded-full" |
||||
alt="Profile picture" |
||||
/> |
||||
<div class="text-xl font-bold">{{ user.fullName }}</div> |
||||
<div class="text-lg">{{ user.username }}</div> |
||||
<div class="p-4 text-center user-profile-card"> |
||||
<img :src="user.illustrationUrl" class="mb-4 w-24 h-24 mx-auto rounded-full" alt="Profile picture" /> |
||||
<div v-if="visibility.firstname && visibility.lastname" class="text-xl font-bold">{{ user.fullName }}</div> |
||||
|
||||
<div v-if="visibility.language && languageInfo"> |
||||
<template v-if="flagIconExists(languageInfo.code)"> |
||||
<i :class="`mdi mdi-flag-${languageInfo.code.toLowerCase()}`"></i> |
||||
</template> |
||||
<template v-else> |
||||
{{ languageInfo.code }} |
||||
</template> |
||||
</div> |
||||
|
||||
<div class="mt-4"> |
||||
<p class="flex items-center justify-center mb-2"> |
||||
<i class="mdi mdi-email-outline mr-2"></i> |
||||
{{ user.email }} |
||||
<p v-if="showFullProfile" class="flex items-center justify-center mb-2"> |
||||
<a v-if="visibility.email && user.email" :href="'/resources/messages/new'" class="flex items-center justify-center mb-2"> |
||||
<i class="mdi mdi-email-outline mr-2"></i> {{ user.email }} |
||||
</a> |
||||
</p> |
||||
<p class="flex items-center justify-center mb-2"> |
||||
<i class="mdi mdi-card-account-details-outline mr-2"></i> |
||||
{{ t('Business card') }} |
||||
<p v-if="vCardUserLink" class="flex items-center justify-center mb-2"> |
||||
<a :href="vCardUserLink" target="_blank" class="flex items-center justify-center"> |
||||
<i class="mdi mdi-card-account-details-outline mr-2"></i> {{ t('Business card') }} |
||||
</a> |
||||
</p> |
||||
<p class="flex items-center justify-center mb-2"> |
||||
<i class="mdi mdi-skype mr-2"></i> |
||||
Skype |
||||
<p v-if="user.skype" class="flex items-center justify-center mb-2"> |
||||
<i class="mdi mdi-skype mr-2"></i> Skype: {{ user.skype }} |
||||
</p> |
||||
<p class="flex items-center justify-center"> |
||||
<i class="mdi mdi-linkedin mr-2"></i> |
||||
LinkedIn |
||||
<p v-if="user.linkedin" class="flex items-center justify-center"> |
||||
<i class="mdi mdi-linkedin mr-2"></i> LinkedIn: {{ user.linkedin }} |
||||
</p> |
||||
</div> |
||||
<BaseButton |
||||
v-if="isCurrentUser" |
||||
:label="t('Edit profile')" |
||||
type="primary" |
||||
class="mt-4" |
||||
@click="editProfile" |
||||
icon="edit" |
||||
/> |
||||
|
||||
<hr /> |
||||
<div v-if="extraInfo && extraInfo.length > 0" class="extra-info-container"> |
||||
<dl class="extra-info-list"> |
||||
<template v-for="item in extraInfo" :key="item.variable"> |
||||
<div v-if="item.value"> |
||||
<dt v-if="item.variable !== 'langue_cible'">{{ item.label }}:</dt> |
||||
<dd v-if="item.variable !== 'langue_cible'">{{ item.value }}</dd> |
||||
|
||||
<div v-if="item.variable === 'langue_cible'" class="language-target"> |
||||
<i v-if="flagIconExists(item.value)" :class="`flag-icon flag-icon-${item.value.toLowerCase()}`"></i> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
</dl> |
||||
</div> |
||||
|
||||
<div v-if="chatEnabled && isUserOnline && !userOnlyInChat"> |
||||
<button @click="chatWith(user.id, user.fullName, user.isOnline, user.illustrationUrl)"> |
||||
{{ t('Chat') }} ({{ t('Online') }}) |
||||
</button> |
||||
</div> |
||||
|
||||
<Divider /> |
||||
<BaseButton v-if="isCurrentUser || isAdmin" :label="t('Edit profile')" type="primary" class="mt-4" @click="editProfile" icon="edit" /> |
||||
</div> |
||||
</BaseCard> |
||||
</template> |
||||
|
||||
<script setup> |
||||
import { computed, inject, onMounted, ref, watch } from "vue" |
||||
import { computed, inject, onMounted, ref, watchEffect } from "vue" |
||||
import { useStore } from 'vuex' |
||||
import BaseCard from "../basecomponents/BaseCard.vue" |
||||
import BaseButton from "../basecomponents/BaseButton.vue" |
||||
import { useI18n } from "vue-i18n" |
||||
import { useRoute } from "vue-router" |
||||
import Divider from 'primevue/divider' |
||||
import axios from "axios" |
||||
|
||||
|
||||
const { t } = useI18n() |
||||
const store = useStore() |
||||
const route = useRoute() |
||||
const user = inject('social-user') |
||||
const isCurrentUser = inject('is-current-user') |
||||
const isAdmin = ref(false) |
||||
const extraInfo = ref([]) |
||||
const chatEnabled = ref(true) |
||||
const isUserOnline = ref(false) |
||||
const userOnlyInChat = ref(false) |
||||
const showFullProfile = computed(() => isCurrentUser.value || isAdmin.value) |
||||
const languageInfo = ref(null) |
||||
const vCardUserLink = ref('') |
||||
const visibility = ref({}) |
||||
watchEffect(() => { |
||||
if (user.value && user.value.id) { |
||||
fetchUserProfile(user.value.id) |
||||
} |
||||
}) |
||||
|
||||
const editProfile = () => { |
||||
window.location = "/account/edit" |
||||
} |
||||
async function fetchUserProfile(userId) { |
||||
try { |
||||
const response = await axios.get(`/social-network/user-profile/${userId}`) |
||||
const data = response.data |
||||
languageInfo.value = data.language |
||||
vCardUserLink.value = data.vCardUserLink |
||||
visibility.value = data.visibility |
||||
extraInfo.value = data.extraFields |
||||
isUserOnline.value = data.isUserOnline |
||||
userOnlyInChat.value = data.userOnlyInChat |
||||
chatEnabled.value = data.chatEnabled |
||||
} catch (error) { |
||||
console.error('Error fetching user profile data:', error) |
||||
} |
||||
} |
||||
|
||||
function flagIconExists(code) { |
||||
const mdiFlagIcons = ['us', 'fr', 'de', 'es', 'it', 'pl'] |
||||
return mdiFlagIcons.includes(code.toLowerCase()) |
||||
} |
||||
|
||||
function chatWith(userId, completeName, isOnline, avatarSmall) { |
||||
} |
||||
|
||||
isAdmin.value = user.value.role === 'admin' |
||||
</script> |
||||
|
||||
Loading…
Reference in new issue