first commit

This commit is contained in:
Inshal
2024-05-29 22:34:28 +05:00
commit e63fc41a20
1470 changed files with 174828 additions and 0 deletions

View File

@@ -0,0 +1,109 @@
<script setup>
const props = defineProps({
data: {
type: null,
required: true,
},
})
</script>
<template>
<VCard class="mb-4">
<VCardText>
<div class="text-body-2 mb-4 text-disabled">
ABOUT
</div>
<div class="d-flex flex-column gap-y-4">
<div
v-for="item in props.data.about"
:key="item.property"
class="d-flex align-center gap-x-2"
>
<VIcon
:icon="item.icon"
size="24"
/>
<div class="font-weight-medium">
{{ item.property }}:
</div>
<div>
{{ item.value }}
</div>
</div>
</div>
<div class="text-body-2 text-disabled mt-6 mb-4">
CONTACTS
</div>
<div class="d-flex flex-column gap-y-4">
<div
v-for="item in props.data.contacts"
:key="item.property"
class="d-flex align-center gap-x-2"
>
<VIcon
:icon="item.icon"
size="24"
/>
<div class="font-weight-medium">
{{ item.property }}:
</div>
<div class="text-truncate">
{{ item.value }}
</div>
</div>
</div>
<div class="text-body-2 text-disabled mt-6 mb-4">
TEAMS
</div>
<div class="d-flex flex-column gap-y-4">
<div
v-for="item in props.data.teams"
:key="item.property"
>
<div class="d-flex align-center gap-x-2">
<div class="font-weight-medium text-no-wrap">
{{ item.property }}:
</div>
<div class="text-no-wrap text-truncate">
{{ item.value }}
</div>
</div>
</div>
</div>
</VCardText>
</VCard>
<VCard>
<VCardText>
<div class="text-body-2 text-disabled mb-4">
OVERVIEW
</div>
<div class="d-flex flex-column gap-y-4">
<div
v-for="item in props.data.overview"
:key="item.property"
class="d-flex gap-x-2 align-center"
>
<VIcon
:icon="item.icon"
size="24"
/>
<div class="font-weight-medium">
{{ item.property }}:
</div>
<div>{{ item.value }}</div>
</div>
</div>
</VCardText>
</VCard>
</template>
<style lang="scss" scoped>
.card-list {
--v-card-list-gap: 16px;
}
</style>

View File

@@ -0,0 +1,137 @@
<script setup>
import avatar1 from '@images/avatars/avatar-1.png'
import avatar6 from '@images/avatars/avatar-6.png'
import avatar8 from '@images/avatars/avatar-8.png'
import pdf from '@images/icons/project-icons/pdf.png'
</script>
<template>
<VCard>
<VCardItem>
<template #prepend>
<VIcon
icon="ri-bar-chart-2-line"
size="24"
/>
</template>
<VCardTitle>Activity Timeline</VCardTitle>
</VCardItem>
<VCardText>
<VTimeline
side="end"
align="start"
line-inset="8"
truncate-line="start"
density="compact"
>
<VTimelineItem
dot-color="primary"
size="x-small"
>
<!-- 👉 Header -->
<div class="d-flex justify-space-between align-center gap-2 flex-wrap mb-3">
<div class="app-timeline-title align-self-start">
12 Invoices have been paid
</div>
<div class="app-timeline-meta">
12 min ago
</div>
</div>
<p class="app-timeline-text mb-2">
Invoices have been paid to the company.
</p>
<div class="d-inline-flex align-center timeline-chip mb-4">
<img
:src="pdf"
height="20"
class="me-3"
alt="img"
>
<h6 class="text-h6 text-medium-emphasis">
invoice.pdf
</h6>
</div>
</VTimelineItem>
<VTimelineItem
dot-color="success"
size="x-small"
>
<!-- 👉 Header -->
<div class="d-flex justify-space-between align-center gap-2 flex-wrap mb-3">
<div class="app-timeline-title align-self-start">
Client Meeting
</div>
<div class="app-timeline-meta">
45 min ago
</div>
</div>
<p class="app-timeline-text mb-2">
Project meeting with john @10:15am
</p>
<div class="d-flex align-center mb-2">
<VAvatar
size="32"
:image="avatar1"
class="me-3"
/>
<div>
<div class="text-body-2 font-weight-medium">
Lester McCarthy (Client)
</div>
<div class="text-body-2">
CEO of ThemeSelection
</div>
</div>
</div>
</VTimelineItem>
<VTimelineItem
dot-color="info"
size="x-small"
>
<div class="d-flex justify-space-between align-center gap-2 flex-wrap mb-3">
<div class="app-timeline-title align-self-start">
Create a new project for client
</div>
<div class="app-timeline-meta">
2 Day Ago
</div>
</div>
<p class="mb-0 app-timeline-text mb-2">
6 team members in a project
</p>
<div class="v-avatar-group">
<VAvatar
:size="40"
:image="avatar1"
/>
<VAvatar
:size="40"
:image="avatar8"
/>
<VAvatar
:size="40"
:image="avatar6"
/>
<VAvatar
:color="$vuetify.theme.current.dark ? '#3A3B59' : '#F0EFF0'"
:size="40"
>
+3
</VAvatar>
</div>
</VTimelineItem>
</VTimeline>
</VCardText>
</VCard>
</template>

View File

@@ -0,0 +1,104 @@
<script setup>
const props = defineProps({
connectionsData: {
type: Array,
required: true,
},
})
const moreList = [
{
title: 'Share connections',
value: 'Share connections',
},
{
title: 'Suggest edits',
value: 'Suggest edits',
},
{
title: 'Report Bug',
value: 'Report Bug',
},
]
</script>
<template>
<VCard
title="Connection"
class="connectionCard"
>
<template #append>
<div class="me-n2">
<MoreBtn
:menu-list="moreList"
density="compact"
/>
</div>
</template>
<VCardText>
<VList class="card-list">
<VListItem
v-for="data in props.connectionsData"
:key="data.name"
>
<template #prepend>
<VAvatar
size="38"
:image="data.avatar"
/>
</template>
<VListItemTitle class="font-weight-medium mb-1">
{{ data.name }}
</VListItemTitle>
<VListItemSubtitle>{{ data.connections }} Connections</VListItemSubtitle>
<template #append>
<VBtn
icon
class="rounded"
:variant="data.isFriend ? 'elevated' : 'outlined' "
>
<VIcon
size="24"
:icon="data.isFriend ? 'ri-user-line' : 'ri-user-add-line'"
/>
</VBtn>
</template>
</VListItem>
<VListItem>
<VListItemTitle>
<VBtn
block
variant="text"
>
View all connections
</VBtn>
</VListItemTitle>
</VListItem>
</VList>
</VCardText>
</VCard>
</template>
<style lang="scss" scoped>
.card-list {
--v-card-list-gap: 16px;
}
</style>
<style lang="scss">
.connectionCard{
.v-list{
.v-list-item{
&__prepend{
.v-list-item__spacer{
inline-size: 8px !important;
}
}
}
}
}
</style>

View File

@@ -0,0 +1,266 @@
<script setup>
import avatar1 from '@images/avatars/avatar-1.png'
import avatar2 from '@images/avatars/avatar-2.png'
import avatar3 from '@images/avatars/avatar-3.png'
import avatar4 from '@images/avatars/avatar-4.png'
import avatar5 from '@images/avatars/avatar-5.png'
import avatar6 from '@images/avatars/avatar-6.png'
import avatar7 from '@images/avatars/avatar-7.png'
import avatar8 from '@images/avatars/avatar-8.png'
import figma from '@images/icons/project-icons/figma.png'
import html5 from '@images/icons/project-icons/html5.png'
import python from '@images/icons/project-icons/python.png'
import react from '@images/icons/project-icons/react.png'
import sketch from '@images/icons/project-icons/sketch.png'
import vue from '@images/icons/project-icons/vue.png'
import xamarin from '@images/icons/project-icons/xamarin.png'
// Project Table Header
const projectTableHeaders = [
{
title: 'PROJECT',
key: 'project',
},
{
title: 'LEADER',
key: 'leader',
},
{
title: 'Team',
key: 'team',
},
{
title: 'PROGRESS',
key: 'progress',
},
{
title: 'Action',
key: 'Action',
sortable: false,
},
]
const projects = [
{
logo: react,
name: 'BGC eCommerce App',
project: 'React Project',
leader: 'Eileen',
progress: 78,
hours: '18:42',
team: [
avatar1,
avatar8,
avatar6,
],
extraMembers: 3,
},
{
logo: figma,
name: 'Falcon Logo Design',
project: 'Figma Project',
leader: 'Owen',
progress: 25,
hours: '20:42',
team: [
avatar5,
avatar2,
],
},
{
logo: vue,
name: 'Dashboard Design',
project: 'Vuejs Project',
leader: 'Keith',
progress: 62,
hours: '120:87',
team: [
avatar8,
avatar2,
avatar1,
],
},
{
logo: xamarin,
name: 'Foodista mobile app',
project: 'Xamarin Project',
leader: 'Merline',
progress: 8,
hours: '120:87',
team: [
avatar3,
avatar4,
avatar7,
],
extraMembers: 8,
},
{
logo: python,
name: 'Dojo Email App',
project: 'Python Project',
leader: 'Harmonia',
progress: 51,
hours: '230:10',
team: [
avatar4,
avatar3,
avatar1,
],
extraMembers: 5,
},
{
logo: sketch,
name: 'Blockchain Website',
project: 'Sketch Project',
leader: 'Allyson',
progress: 92,
hours: '342:41',
team: [
avatar1,
avatar8,
],
},
{
logo: html5,
name: 'Hoffman Website',
project: 'HTML Project',
leader: 'Georgie',
progress: 80,
hours: '12:45',
team: [
avatar1,
avatar8,
avatar6,
],
},
]
const moreList = [
{
title: 'Download',
value: 'Download',
},
{
title: 'Delete',
value: 'Delete',
},
{
title: 'View',
value: 'View',
},
]
</script>
<template>
<VCard
title="Project List"
class="projectList"
>
<!-- 👉 User Project List Table -->
<!-- SECTION Datatable -->
<VDataTable
:headers="projectTableHeaders"
:items="projects"
hide-default-footer
show-select
item-value="name"
>
<!-- projects -->
<template #item.project="{ item }">
<div class="d-flex align-center gap-x-3">
<VAvatar
:size="34"
:image="item.logo"
/>
<div>
<h6 class="text-h6 text-no-wrap">
{{ item.name }}
</h6>
<div class="text-body-2">
{{ item.project }}
</div>
</div>
</div>
</template>
<template #item.leader="{ item }">
<div class="text-base text-high-emphasis">
{{ item.leader }}
</div>
</template>
<!-- Team -->
<template #item.team="{ item }">
<div class="d-flex">
<div class="v-avatar-group">
<VAvatar
v-for="(data, index) in item.team"
:key="index"
size="30"
>
<VImg :src="data" />
</VAvatar>
<VAvatar
v-if="item.extraMembers"
:color="$vuetify.theme.current.dark ? '#3A3B59' : '#F0EFF0'"
:size="30"
>
<div class="text-caption text-high-emphasis">
+{{ item.extraMembers }}
</div>
</VAvatar>
</div>
</div>
</template>
<!-- Progress -->
<template #item.progress="{ item }">
<div class="d-flex align-center gap-3">
<div class="flex-grow-1">
<VProgressLinear
:height="6"
:model-value="item.progress"
rounded
/>
</div>
<div class="text-high-emphasis">
{{ item.progress }}%
</div>
</div>
</template>
<!-- Action -->
<template #item.Action>
<MoreBtn
:menu-list="moreList"
density="compact"
/>
</template>
<!-- TODO Refactor this after vuetify provides proper solution for removing default footer -->
<template #bottom />
</VDataTable>
<!-- !SECTION -->
</VCard>
</template>
<style lang="scss">
.projectList{
.v-table{
&--density-default{
.v-table__wrapper{
table{
tbody{
tr{
td{
block-size: 56px;
}
}
}
}
}
}
}
}
</style>

View File

@@ -0,0 +1,100 @@
<script setup>
const props = defineProps({
teamsData: {
type: Array,
required: true,
},
})
const moreList = [
{
title: 'Share connections',
value: 'Share connections',
},
{
title: 'Suggest edits',
value: 'Suggest edits',
},
{
title: 'Report Bug',
value: 'Report Bug',
},
]
</script>
<template>
<VCard
title="Teams"
class="teamsCard"
>
<template #append>
<div class="me-n2">
<MoreBtn
:menu-list="moreList"
density="compact"
/>
</div>
</template>
<VCardText>
<VList class="card-list">
<VListItem
v-for="data in props.teamsData"
:key="data.title"
>
<template #prepend>
<VAvatar
size="38"
:image="data.avatar"
/>
</template>
<VListItemTitle class="font-weight-medium mb-1">
{{ data.title }}
</VListItemTitle>
<VListItemSubtitle>{{ data.members }} Members</VListItemSubtitle>
<template #append>
<VChip
:color="data.ChipColor"
size="small"
>
{{ data.chipText }}
</VChip>
</template>
</VListItem>
<VListItem>
<VListItemTitle>
<VBtn
block
variant="text"
>
View all teams
</VBtn>
</VListItemTitle>
</VListItem>
</VList>
</VCardText>
</VCard>
</template>
<style lang="scss" scoped>
.card-list {
--v-card-list-gap: 16px;
}
</style>
<style lang="scss">
.teamsCard{
.v-list{
.v-list-item{
&__prepend{
.v-list-item__spacer{
inline-size: 8px !important;
}
}
}
}
}
</style>

View File

@@ -0,0 +1,60 @@
<script setup>
import About from './About.vue'
import ActivityTimeline from './ActivityTimeline.vue'
import Connection from './Connection.vue'
import ProjectList from './ProjectList.vue'
import Teams from './Teams.vue'
const router = useRoute('pages-user-profile-tab')
const profileTabData = ref()
const fetchAboutData = async () => {
if (router.params.tab === 'profile') {
const data = await $api('/pages/profile', { query: { tab: router.params.tab } }).catch(err => console.log(err))
profileTabData.value = data
}
}
watch(router, fetchAboutData, { immediate: true })
</script>
<template>
<VRow v-if="profileTabData">
<VCol
md="4"
cols="12"
>
<About :data="profileTabData" />
</VCol>
<VCol
cols="12"
md="8"
>
<VRow>
<VCol cols="12">
<ActivityTimeline />
</VCol>
<VCol
cols="12"
md="6"
>
<Connection :connections-data="profileTabData.connections" />
</VCol>
<VCol
cols="12"
md="6"
>
<Teams :teams-data="profileTabData.teamsTech" />
</VCol>
<VCol cols="12">
<ProjectList />
</VCol>
</VRow>
</VCol>
</VRow>
</template>