initial commit

This commit is contained in:
Inshal
2024-10-25 01:02:11 +05:00
commit 6e65bc3a62
1710 changed files with 273609 additions and 0 deletions

View File

@@ -0,0 +1,311 @@
<script setup>
import illustrationJohnDark from '@images/cards/illustration-john-dark.png';
import illustrationJohnLight from '@images/cards/illustration-john-light.png';
import { useTheme } from 'vuetify';
// const panelActive = ref(true);
const panel = ref(0)
onMounted(() => {
// panelActive.value = true;
});
const props = defineProps({
date: {
type: String,
required: true,
},
time: {
type: String,
required: true,
},
timezone: {
type: String,
required: true,
},
})
const orders = ref([
{
icon: 'tabler-circle-check',
type: 'SENDER',
name: 'Myrtle Ullrich',
address: '101 Boulder, California(CA), 95959',
},
{
icon: 'tabler-map-pin',
type: 'RECEIVER',
name: 'Barry Schowalter',
address: '939 Orange, California(CA),92118',
},
]);
const { global } = useTheme()
const illustrationJohn = computed(() => global.name.value === 'dark' ? illustrationJohnDark : illustrationJohnLight)
</script>
<template>
<VCard class="text-center text-sm-start">
<VRow no-gutters>
<VCol>
<VExpansionPanels v-model="panel">
<VExpansionPanel>
<VExpansionPanelTitle variant="tonal" color="secondary">
<span><b>TRT Lab Kit with a Virtual Provider Consultation.</b> <br><br>
<p>{{ date }} Status: InProcess <br>
</p>
<p>Test Kit Tracking : <Routerview to="/"> To you</Routerview> / <Routerview to="/trt"> back to Lab
</Routerview>
</p>
</span>
</VExpansionPanelTitle>
<VExpansionPanelText>
<VCardText>
<VTimeline side="end" align="start" line-inset="8" truncate-line="both" density="compact">
<!-- SECTION Timeline Item: Flight -->
<VTimelineItem dot-color="rgb(var(--v-theme-yellow))" icon="tabler-check" size="small">
<!-- 👉 Header -->
<div class="d-flex justify-space-between align-center gap-2 flex-wrap">
<span class="app-timeline-title">
<b>Medical History Form Completed</b><br><br>
</span>
</div>
</VTimelineItem>
<!-- !SECTION -->
<VTimelineItem dot-color="rgb(var(--v-theme-yellow))" icon="tabler-check" size="small">
<!-- 👉 Header -->
<div class="d-flex justify-space-between align-center flex-wrap mb-1">
<div class="app-timeline-title">
<b>Online Consultation Scheduled</b><br><br>
</div>
</div>
</VTimelineItem>
<!-- SECTION Timeline Item: Interview Schedule -->
<VTimelineItem dot-color="rgb(var(--v-theme-yellow))" icon="tabler-check" size="small">
<template #icon>
3
</template>
<!-- 👉 Header -->
<div class="d-flex justify-space-between align-center flex-wrap mb-1">
<div class="app-timeline-title">
<b>eClinic Schedule is Confirmed for {{ date }}</b>
</div>
</div>
<div class="d-flex justify-space-between align-center flex-wrap">
<!-- 👉 Avatar & Personal Info -->
<div class="d-flex align-center mt-2">
<div class="d-flex flex-column">
<p class="text-sm font-weight-medium text-high-emphasis mb-0">
Your virtual consultation with your HGH provider is set for {{ props.date }}, at {{
props.time
}}
, {{ props.timezone }}. On the appointment day, we will send you an email containing the
link
to join, along
with useful tips for preparation. If you have any inquiries or need to reschedule, feel free
to reach out via text at (223) 124-5533.
</p>
</div>
</div>
<VBtn class="mt-3" color="rgb(var(--v-theme-yellow))">Go to Meeting</VBtn>
<!-- 👉 Person Actions -->
</div>
</VTimelineItem>
<VTimelineItem dot-color="secondary" color="secondary" icon="tabler-check" size="small">
<template #icon>
4
</template>
<!-- <template #icon>
<VIcon size="20" icon="tabler-circle-check" color="error" />
</template> -->
<!-- 👉 Header -->
<div class="d-flex justify-space-between align-center flex-wrap mb-1">
<div>
<b>eClicnic Attented</b><br><br>
</div>
</div>
</VTimelineItem>
<VTimelineItem dot-color="secondary" color="secondary" icon="tabler-check" size="small">
<template #icon>
5
</template>
<!-- 👉 Header -->
<div class="d-flex justify-space-between align-center flex-wrap mb-1">
<div>
<b>Medication Ordered</b>
</div>
</div>
</VTimelineItem>
<VTimelineItem dot-color="secondary" color="secondary" icon="tabler-check" size="small">
<template #icon>
6
</template>
<!-- 👉 Header -->
<div class="d-flex justify-space-between align-center flex-wrap mb-1">
<div>
<b>Medication Shipped</b>
</div>
</div>
</VTimelineItem>
<VTimelineItem dot-color="secondary" color="secondary" icon="tabler-check" size="small">
<template #icon>
7
</template>
<!-- 👉 Header -->
<div class="d-flex justify-space-between align-center flex-wrap mb-1">
<div>
<b>Medication Delivered</b>
</div>
</div>
</VTimelineItem>
<!-- !SECTION -->
</VTimeline>
</VCardText>
</VExpansionPanelText>
</VExpansionPanel>
</VExpansionPanels>
<VCardTitle class="text-start">Latest Labs <RouterLink to="/">
<span>(See all)</span>
</RouterLink>
</VCardTitle>
<VExpansionPanels class="mt-2">
<VExpansionPanel>
<VExpansionPanelTitle variant="tonal" color="secondary">
<span><b>TRT Lab Kit </b> <br><br>
<p>{{ date }} Status: Ordered <br>
</p>
<p>Test Kit Tracking : <Routerview to="/"> To you</Routerview> / <Routerview to="/trt"> back to Lab
</Routerview>
</p>
</span>
</VExpansionPanelTitle>
<VExpansionPanelText>
<h2 class="text-start">Results</h2>
<VCardText>
<VTimeline side="end" align="start" line-inset="8" truncate-line="both" density="compact">
<!-- SECTION Timeline Item: Flight -->
<VTimelineItem dot-color="rgb(var(--v-theme-yellow))" icon="tabler-check" size="small">
<!-- 👉 Header -->
<div class="d-flex justify-space-between align-center gap-2 flex-wrap">
<span class="app-timeline-title">
<b>Ordered Hormone Test Kit</b><br><br>
</span>
</div>
</VTimelineItem>
<!-- !SECTION -->
<VTimelineItem dot-color="rgb(var(--v-theme-yellow))" icon="tabler-check" size="small">
<!-- 👉 Header -->
<div class="d-flex justify-space-between align-center flex-wrap mb-1">
<div class="app-timeline-title">
<b>Shipped Hormone Test Kit</b><br><br>
</div>
</div>
</VTimelineItem>
<!-- SECTION Timeline Item: Interview Schedule -->
<VTimelineItem dot-color="rgb(var(--v-theme-yellow))" icon="tabler-check" size="small">
<!-- 👉 Header -->
<div class="d-flex justify-space-between align-center flex-wrap mb-1">
<div class="app-timeline-title">
<b>Delivered Hormone Test Kit</b><br><br>
</div>
</div>
</VTimelineItem>
<VTimelineItem dot-color="rgb(var(--v-theme-yellow))" color="rgb(var(--v-theme-yellow))"
icon="tabler-check" size="small">
<template #icon>
4
</template>
<!-- <template #icon>
<VIcon size="20" icon="tabler-circle-check" color="error" />
</template> -->
<!-- 👉 Header -->
<div class="d-flex justify-space-between align-center flex-wrap mb-1 ">
<div>
<b>Hormone Test Kit in Transit</b><br><br>
</div>
</div>
</VTimelineItem>
<VTimelineItem dot-color="secondary" color="secondary" icon="tabler-check" size="small">
<template #icon>
5
</template>
<!-- 👉 Header -->
<div class="d-flex justify-space-between align-center flex-wrap mb-1">
<div>
<b>Lab Received Hormone Test Kit</b>
</div>
</div>
</VTimelineItem>
<VTimelineItem dot-color="secondary" color="secondary" icon="tabler-check" size="small">
<template #icon>
6
</template>
<!-- 👉 Header -->
<div class="d-flex justify-space-between align-center flex-wrap mb-1">
<div>
<b>Provider Reviewed Test Results</b>
</div>
</div>
</VTimelineItem>
<!-- !SECTION -->
</VTimeline>
</VCardText>
</VExpansionPanelText>
</VExpansionPanel>
</VExpansionPanels>
</VCol>
</VRow>
</VCard>
</template>
<style lang="scss" scoped>
.john-illustration {
inset-block-end: -0.0625rem;
inset-inline-end: 3rem;
}
.v-timeline .v-timeline-divider__inner-dot {
background-color: white !important;
}
button.v-expansion-panel-title {
background-color: rgb(var(--v-theme-yellow)) !important;
color: #fff;
}
button.v-expansion-panel-title.bg-secondary {
background-color: rgb(var(--v-theme-yellow)) !important;
color: #fff;
}
button.v-expansion-panel-title {
background-color: rgb(var(--v-theme-yellow)) !important;
color: #fff;
}
button.v-expansion-panel-title.v-expansion-panel-title--active {
background-color: rgb(var(--v-theme-yellow)) !important;
color: #fff;
}
span.v-expansion-panel-title__icon {
color: #fff
}
</style>

View File

@@ -0,0 +1,262 @@
<script setup>
import VueApexCharts from 'vue3-apexcharts'
import { useTheme } from 'vuetify'
import statsVerticalChart from '@images/cards/chart-success.png'
import statsVerticalPaypal from '@images/cards/paypal-error.png'
import statsVerticalWallet from '@images/cards/wallet-primary.png'
import { hexToRgb } from '@layouts/utils'
const vuetifyTheme = useTheme()
const series = {
income: [{
data: [
24,
21,
30,
22,
42,
26,
35,
29,
],
}],
expenses: [{
data: [
24,
21,
30,
25,
42,
26,
35,
29,
],
}],
profit: [{
data: [
24,
21,
30,
22,
42,
26,
35,
35,
],
}],
}
const currentTab = ref('income')
const tabData = computed(() => {
const data = {
income: {
avatar: statsVerticalWallet,
title: 'Total Income',
stats: '$459.1k',
profitLoss: 65,
profitLossAmount: '6.5k',
compareToLastWeek: '$39k',
},
expenses: {
avatar: statsVerticalPaypal,
title: 'Total Expenses',
stats: '$316.5k',
profitLoss: 27.8,
profitLossAmount: '7.2k',
compareToLastWeek: '$16k',
},
profit: {
avatar: statsVerticalChart,
title: 'Total Profit',
stats: '$147.9k',
profitLoss: 35.1,
profitLossAmount: '4.5k',
compareToLastWeek: '$28k',
},
}
return data[currentTab.value]
})
const chartConfig = computed(() => {
const currentTheme = vuetifyTheme.current.value.colors
const variableTheme = vuetifyTheme.current.value.variables
const disabledTextColor = `rgba(${ hexToRgb(String(currentTheme['on-surface'])) },${ variableTheme['disabled-opacity'] })`
const borderColor = `rgba(${ hexToRgb(String(variableTheme['border-color'])) },${ variableTheme['border-opacity'] })`
return {
chart: {
parentHeightOffset: 0,
toolbar: { show: false },
},
dataLabels: { enabled: false },
stroke: {
width: 3,
curve: 'smooth',
},
grid: {
strokeDashArray: 4.5,
borderColor,
padding: {
left: 0,
top: -20,
right: 11,
bottom: 7,
},
},
fill: {
type: 'gradient',
gradient: {
opacityTo: 0.25,
opacityFrom: 0.5,
stops: [
0,
95,
100,
],
shadeIntensity: 0.6,
colorStops: [[
{
offset: 0,
opacity: 0.4,
color: currentTheme.primary,
},
{
offset: 100,
opacity: 0.2,
color: currentTheme.surface,
},
]],
},
},
theme: {
monochrome: {
enabled: true,
shadeTo: 'light',
shadeIntensity: 1,
color: currentTheme.primary,
},
},
xaxis: {
axisTicks: { show: false },
axisBorder: { show: false },
categories: [
'',
'Jan',
'Feb',
'Mar',
'Apr',
'May',
'Jun',
'Jul',
],
labels: {
style: {
fontSize: '14px',
colors: disabledTextColor,
fontFamily: 'Public Sans',
},
},
},
yaxis: {
min: 10,
max: 50,
show: false,
tickAmount: 4,
},
markers: {
size: 8,
strokeWidth: 6,
strokeOpacity: 1,
hover: { size: 8 },
colors: ['transparent'],
strokeColors: 'transparent',
discrete: [{
size: 8,
seriesIndex: 0,
fillColor: '#fff',
strokeColor: currentTheme.primary,
dataPointIndex: series[currentTab.value][0].data.length - 1,
}],
},
}
})
</script>
<template>
<VCard>
<VCardItem>
<VTabs
v-model="currentTab"
class="v-tabs-pill"
>
<VTab value="income">
Income
</VTab>
<VTab value="expenses">
Expenses
</VTab>
<VTab value="profit">
Profit
</VTab>
</VTabs>
</VCardItem>
<VCardText class="d-flex align-center gap-3">
<VAvatar
size="46"
rounded
:image="tabData.avatar"
/>
<div>
<p class="mb-0">
{{ tabData.title }}
</p>
<div class="d-flex align-center gap-2">
<h6 class="text-h6">
{{ tabData.stats }}
</h6>
<span
class="text-sm"
:class="tabData.profitLoss > 0 ? 'text-success' : 'text-error'"
>
<VIcon
size="24"
icon="bx-chevron-up"
/>
{{ tabData.profitLoss }}%
</span>
</div>
</div>
</VCardText>
<VCardText>
<VueApexCharts
type="area"
:height="241"
:options="chartConfig"
:series="series[currentTab]"
/>
</VCardText>
<VCardText class="d-flex align-center justify-center gap-3">
<VProgressCircular
size="45"
:model-value="tabData.profitLoss"
>
<span class="text-xs text-medium-emphasis">{{ tabData.profitLossAmount }}</span>
</VProgressCircular>
<div>
<h6 class="text-base font-weight-regular">
<span class="text-capitalize">{{ currentTab }}</span>
<span> this week</span>
</h6>
<span class="text-sm text-disabled">{{ tabData.compareToLastWeek }} less than last week</span>
</div>
</VCardText>
</VCard>
</template>

View File

@@ -0,0 +1,118 @@
<script setup>
import VueApexCharts from 'vue3-apexcharts'
import { useTheme } from 'vuetify'
const vuetifyTheme = useTheme()
const series = [{
data: [
30,
70,
35,
55,
45,
70,
],
}]
const chartOptions = computed(() => {
const currentTheme = vuetifyTheme.current.value.colors
return {
chart: {
parentHeightOffset: 0,
toolbar: { show: false },
},
tooltip: { enabled: false },
dataLabels: { enabled: false },
stroke: {
width: 3,
curve: 'smooth',
lineCap: 'round',
},
grid: {
show: false,
padding: {
left: 0,
top: -32,
right: 17,
},
},
fill: {
type: 'gradient',
gradient: {
opacityTo: 0.7,
opacityFrom: 0.5,
shadeIntensity: 1,
stops: [
0,
90,
100,
],
colorStops: [[
{
offset: 0,
opacity: 0.6,
color: currentTheme.success,
},
{
offset: 100,
opacity: 0.1,
color: currentTheme.surface,
},
]],
},
},
theme: {
monochrome: {
enabled: true,
shadeTo: 'light',
shadeIntensity: 1,
color: currentTheme.success,
},
},
xaxis: {
labels: { show: false },
axisTicks: { show: false },
axisBorder: { show: false },
},
yaxis: { show: false },
markers: {
size: 1,
offsetY: 2,
offsetX: -4,
strokeWidth: 4,
strokeOpacity: 1,
colors: ['transparent'],
strokeColors: 'transparent',
discrete: [{
size: 6,
seriesIndex: 0,
fillColor: '#fff',
strokeColor: currentTheme.success,
dataPointIndex: series[0].data.length - 1,
}],
},
}
})
</script>
<template>
<VCard>
<VCardText class="pb-1">
<h6 class="text-base font-weight-regular">
Order
</h6>
<h5 class="text-h5 font-weight-medium">
276k
</h5>
</VCardText>
<VueApexCharts
type="area"
:height="110"
:options="chartOptions"
:series="series"
/>
</VCard>
</template>

View File

@@ -0,0 +1,206 @@
<script setup>
import VueApexCharts from 'vue3-apexcharts'
import { useTheme } from 'vuetify'
import { hexToRgb } from '@layouts/utils'
const vuetifyTheme = useTheme()
const series = [
45,
80,
20,
40,
]
const chartOptions = computed(() => {
const currentTheme = vuetifyTheme.current.value.colors
const variableTheme = vuetifyTheme.current.value.variables
const disabledTextColor = `rgba(${ hexToRgb(String(currentTheme['on-surface'])) },${ variableTheme['disabled-opacity'] })`
const primaryTextColor = `rgba(${ hexToRgb(String(currentTheme['on-surface'])) },${ variableTheme['high-emphasis-opacity'] })`
return {
chart: {
sparkline: { enabled: true },
animations: { enabled: false },
},
stroke: {
width: 6,
colors: [currentTheme.surface],
},
legend: { show: false },
tooltip: { enabled: false },
dataLabels: { enabled: false },
labels: [
'Fashion',
'Electronic',
'Sports',
'Decor',
],
colors: [
currentTheme.success,
currentTheme.primary,
currentTheme.secondary,
currentTheme.info,
],
grid: {
padding: {
top: -7,
bottom: 5,
},
},
states: {
hover: { filter: { type: 'none' } },
active: { filter: { type: 'none' } },
},
plotOptions: {
pie: {
expandOnClick: false,
donut: {
size: '75%',
labels: {
show: true,
name: {
offsetY: 17,
fontSize: '14px',
color: disabledTextColor,
fontFamily: 'Public Sans',
},
value: {
offsetY: -17,
fontSize: '24px',
color: primaryTextColor,
fontFamily: 'Public Sans',
},
total: {
show: true,
label: 'Weekly',
fontSize: '14px',
formatter: () => '38%',
color: disabledTextColor,
fontFamily: 'Public Sans',
},
},
},
},
},
}
})
const orders = [
{
amount: '82.5k',
title: 'Electronic',
avatarColor: 'primary',
subtitle: 'Mobile, Earbuds, TV',
avatarIcon: 'bx-mobile-alt',
},
{
amount: '23.8k',
title: 'Fashion',
avatarColor: 'success',
subtitle: 'Tshirt, Jeans, Shoes',
avatarIcon: 'bx-closet',
},
{
amount: 849,
title: 'Decor',
avatarColor: 'info',
subtitle: 'Fine Art, Dining',
avatarIcon: 'bx-home',
},
{
amount: 99,
title: 'Sports',
avatarColor: 'secondary',
subtitle: 'Football, Cricket Kit',
avatarIcon: 'bx-football',
},
]
const moreList = [
{
title: 'Share',
value: 'Share',
},
{
title: 'Refresh',
value: 'Refresh',
},
{
title: 'Update',
value: 'Update',
},
]
</script>
<template>
<VCard>
<VCardItem class="pb-3">
<VCardTitle class="mb-1">
Order Statistics
</VCardTitle>
<VCardSubtitle>42.82k Total Sales</VCardSubtitle>
<template #append>
<div class="me-n3 mt-n8">
<MoreBtn :menu-list="moreList" />
</div>
</template>
</VCardItem>
<VCardText>
<div class="d-flex align-center justify-space-between mb-3">
<div class="flex-grow-1">
<h4 class="text-h4 mb-1">
8,258
</h4>
<span>Total Orders</span>
</div>
<div>
<VueApexCharts
type="donut"
:height="125"
width="105"
:options="chartOptions"
:series="series"
/>
</div>
</div>
<VList class="card-list mt-7">
<VListItem
v-for="order in orders"
:key="order.title"
>
<template #prepend>
<VAvatar
rounded
variant="tonal"
:color="order.avatarColor"
>
<VIcon :icon="order.avatarIcon" />
</VAvatar>
</template>
<VListItemTitle class="mb-1">
{{ order.title }}
</VListItemTitle>
<VListItemSubtitle class="text-disabled">
{{ order.subtitle }}
</VListItemSubtitle>
<template #append>
<span>{{ order.amount }}</span>
</template>
</VListItem>
</VList>
</VCardText>
</VCard>
</template>
<style lang="scss" scoped>
.card-list {
--v-card-list-gap: 21px;
}
</style>

View File

@@ -0,0 +1,124 @@
<script setup>
import VueApexCharts from 'vue3-apexcharts'
import {
useDisplay,
useTheme,
} from 'vuetify'
import { hexToRgb } from '@layouts/utils'
const vuetifyTheme = useTheme()
const display = useDisplay()
const series = [{
data: [
30,
58,
35,
53,
50,
68,
],
}]
const chartOptions = computed(() => {
const currentTheme = vuetifyTheme.current.value.colors
return {
chart: {
parentHeightOffset: 0,
toolbar: { show: false },
dropShadow: {
top: 12,
blur: 4,
left: 0,
enabled: true,
opacity: 0.12,
color: currentTheme.warning,
},
},
tooltip: { enabled: false },
colors: [`rgba(${ hexToRgb(String(currentTheme.warning)) }, 1)`],
stroke: {
width: 4,
curve: 'smooth',
lineCap: 'round',
},
grid: {
show: false,
padding: {
top: -21,
left: -5,
bottom: -8,
},
},
xaxis: {
labels: { show: false },
axisTicks: { show: false },
axisBorder: { show: false },
},
yaxis: { labels: { show: false } },
responsive: [
{
breakpoint: display.thresholds.value.lg,
options: {
chart: {
height: 151,
width: '100%',
},
},
},
{
breakpoint: display.thresholds.value.md,
options: {
chart: {
height: 131,
width: '100%',
},
},
},
],
}
})
</script>
<template>
<VCard>
<VCardText class="d-flex justify-space-between h-100">
<div class="d-flex flex-column justify-space-between gap-y-4">
<div>
<h6 class="text-h6 text-no-wrap mb-1">
Profile Report
</h6>
<VChip color="warning">
Year 2022
</VChip>
</div>
<div>
<div class="text-success text-sm">
<VIcon
icon="bx-up-arrow-alt"
size="18"
class="me-1"
/>
<span>68.2%</span>
</div>
<h5 class="text-h5">
$84,686k
</h5>
</div>
</div>
<div class="h-100 d-flex align-center">
<VueApexCharts
type="line"
:height="131"
width="80%"
:options="chartOptions"
:series="series"
/>
</div>
</VCardText>
</VCard>
</template>

View File

@@ -0,0 +1,103 @@
<script setup>
import { hexToRgb } from '@layouts/utils';
import VueApexCharts from 'vue3-apexcharts';
import { useTheme } from 'vuetify';
const vuetifyTheme = useTheme()
const series = [{
data: [
23,
81,
70,
31,
99,
46,
73,
],
}]
const chartOptions = computed(() => {
const currentTheme = vuetifyTheme.current.value.colors
const variableTheme = vuetifyTheme.current.value.variables
const disabledText = `rgba(${hexToRgb(String(currentTheme['on-surface']))},${variableTheme['disabled-opacity']})`
return {
chart: {
parentHeightOffset: 0,
toolbar: { show: false },
},
plotOptions: {
bar: {
borderRadius: 2,
distributed: true,
columnWidth: '10%',
endingShape: 'rounded',
startingShape: 'rounded',
},
},
legend: { show: false },
tooltip: { enabled: false },
dataLabels: { enabled: false },
colors: [
`rgba(${hexToRgb(String(currentTheme.primary))}, 0.16)`,
`rgba(${hexToRgb(String(currentTheme.primary))}, 0.16)`,
`rgba(${hexToRgb(String(currentTheme.primary))}, 0.16)`,
`rgba(${hexToRgb(String(currentTheme.primary))}, 0.16)`,
`rgba(${hexToRgb(String(currentTheme.primary))}, 1)`,
`rgba(${hexToRgb(String(currentTheme.primary))}, 0.16)`,
`rgba(${hexToRgb(String(currentTheme.primary))}, 0.16)`,
],
states: {
hover: { filter: { type: 'none' } },
active: { filter: { type: 'none' } },
},
xaxis: {
categories: [
'M',
'T',
'W',
'T',
'F',
'S',
'S',
],
axisTicks: { show: false },
axisBorder: { show: false },
tickPlacement: 'on',
labels: {
style: {
fontSize: '14px',
colors: disabledText,
fontFamily: 'Public Sans',
},
},
},
yaxis: { show: false },
grid: {
show: false,
padding: {
left: 0,
top: -10,
right: 7,
bottom: -3,
},
},
}
})
</script>
<template>
<VCard>
<VCardText class="pb-1">
<h6 class="text-base font-weight-regular">
Revenue
</h6>
<h5 class="text-h5 font-weight-medium">
425k
</h5>
</VCardText>
<VueApexCharts type="bar" :height="110" :options="chartOptions" :series="series" />
</VCard>
</template>

View File

@@ -0,0 +1,332 @@
<script setup>
import VueApexCharts from 'vue3-apexcharts'
import {
useDisplay,
useTheme,
} from 'vuetify'
import { hexToRgb } from '@layouts/utils'
const vuetifyTheme = useTheme()
const display = useDisplay()
const series = [
{
name: `${ new Date().getFullYear() - 1 }`,
data: [
18,
7,
15,
29,
18,
12,
9,
],
},
{
name: `${ new Date().getFullYear() - 2 }`,
data: [
-13,
-18,
-9,
-14,
-5,
-17,
-15,
],
},
]
const chartOptions = computed(() => {
const currentTheme = vuetifyTheme.current.value.colors
const variableTheme = vuetifyTheme.current.value.variables
const disabledTextColor = `rgba(${ hexToRgb(String(currentTheme['on-surface'])) },${ variableTheme['disabled-opacity'] })`
const primaryTextColor = `rgba(${ hexToRgb(String(currentTheme['on-surface'])) },${ variableTheme['high-emphasis-opacity'] })`
const borderColor = `rgba(${ hexToRgb(String(variableTheme['border-color'])) },${ variableTheme['border-opacity'] })`
return {
bar: {
chart: {
stacked: true,
parentHeightOffset: 0,
toolbar: { show: false },
},
dataLabels: { enabled: false },
stroke: {
width: 6,
lineCap: 'round',
colors: [currentTheme.surface],
},
colors: [
`rgba(${ hexToRgb(String(currentTheme.primary)) }, 1)`,
`rgba(${ hexToRgb(String(currentTheme.info)) }, 1)`,
],
legend: {
offsetX: -10,
position: 'top',
fontSize: '14px',
horizontalAlign: 'left',
fontFamily: 'Public Sans',
labels: { colors: currentTheme.secondary },
itemMargin: {
vertical: 4,
horizontal: 10,
},
markers: {
width: 8,
height: 8,
radius: 10,
offsetX: -4,
},
},
states: {
hover: { filter: { type: 'none' } },
active: { filter: { type: 'none' } },
},
grid: {
borderColor,
padding: { bottom: 5 },
},
plotOptions: {
bar: {
borderRadius: 10,
columnWidth: '30%',
endingShape: 'rounded',
startingShape: 'rounded',
},
},
xaxis: {
axisTicks: { show: false },
crosshairs: { opacity: 0 },
axisBorder: { show: false },
categories: [
'Jan',
'Feb',
'Mar',
'Apr',
'May',
'Jun',
'Jul',
],
labels: {
style: {
fontSize: '14px',
colors: disabledTextColor,
fontFamily: 'Public Sans',
},
},
},
yaxis: {
labels: {
style: {
fontSize: '14px',
colors: disabledTextColor,
fontFamily: 'Public Sans',
},
},
},
responsive: [
{
breakpoint: display.thresholds.value.xl,
options: { plotOptions: { bar: { columnWidth: '43%' } } },
},
{
breakpoint: display.thresholds.value.lg,
options: { plotOptions: { bar: { columnWidth: '50%' } } },
},
{
breakpoint: display.thresholds.value.md,
options: { plotOptions: { bar: { columnWidth: '42%' } } },
},
{
breakpoint: display.thresholds.value.sm,
options: { plotOptions: { bar: { columnWidth: '45%' } } },
},
],
},
radial: {
chart: { sparkline: { enabled: true } },
labels: ['Growth'],
stroke: { dashArray: 5 },
colors: [`rgba(${ hexToRgb(String(currentTheme.primary)) }, 1)`],
states: {
hover: { filter: { type: 'none' } },
active: { filter: { type: 'none' } },
},
fill: {
type: 'gradient',
gradient: {
shade: 'dark',
opacityTo: 0.6,
opacityFrom: 1,
shadeIntensity: 0.5,
stops: [
30,
70,
100,
],
inverseColors: false,
gradientToColors: [currentTheme.primary],
},
},
plotOptions: {
radialBar: {
endAngle: 150,
startAngle: -140,
hollow: { size: '55%' },
track: { background: 'transparent' },
dataLabels: {
name: {
offsetY: 25,
fontWeight: 600,
fontSize: '16px',
color: currentTheme.secondary,
fontFamily: 'Public Sans',
},
value: {
offsetY: -15,
fontWeight: 500,
fontSize: '24px',
color: primaryTextColor,
fontFamily: 'Public Sans',
},
},
},
},
responsive: [
{
breakpoint: 900,
options: { chart: { height: 200 } },
},
{
breakpoint: 735,
options: { chart: { height: 200 } },
},
{
breakpoint: 660,
options: { chart: { height: 200 } },
},
{
breakpoint: 600,
options: { chart: { height: 280 } },
},
],
},
}
})
const balanceData = [
{
icon: 'bx-dollar',
amount: '$32.5k',
year: '2023',
color: 'primary',
},
{
icon: 'bx-wallet',
amount: '$41.2k',
year: '2022',
color: 'info',
},
]
</script>
<template>
<VCard>
<VRow no-gutters>
<VCol
cols="12"
sm="7"
xl="8"
:class="$vuetify.display.smAndUp ? 'border-e' : 'border-b'"
>
<VCardItem class="pb-0">
<VCardTitle>Total Revenue</VCardTitle>
<template #append>
<div class="me-n3">
<MoreBtn />
</div>
</template>
</VCardItem>
<!-- bar chart -->
<VueApexCharts
id="bar-chart"
type="bar"
:height="336"
:options="chartOptions.bar"
:series="series"
/>
</VCol>
<VCol
cols="12"
sm="5"
xl="4"
>
<VCardText class="text-center">
<VBtn
size="small"
variant="tonal"
append-icon="bx-chevron-down"
class="mt-4"
>
2023
<VMenu activator="parent">
<VList>
<VListItem
v-for="(item, index) in ['2023', '2022', '2021']"
:key="index"
:value="item"
>
<VListItemTitle>{{ item }}</VListItemTitle>
</VListItem>
</VList>
</VMenu>
</VBtn>
<!-- radial chart -->
<VueApexCharts
type="radialBar"
:height="200"
:options="chartOptions.radial"
:series="[78]"
class="mt-6"
/>
<p class="font-weight-medium text-high-emphasis mb-7">
62% Company Growth
</p>
<div class="d-flex align-center justify-center gap-x-8 gap-y-4 flex-wrap">
<div
v-for="data in balanceData"
:key="data.year"
class="d-flex align-center gap-3"
>
<VAvatar
:icon="data.icon"
:color="data.color"
size="38"
rounded
variant="tonal"
/>
<div class="text-start">
<span class="text-sm"> {{ data.year }}</span>
<h6 class="text-base font-weight-medium">
{{ data.amount }}
</h6>
</div>
</div>
</div>
</VCardText>
</VCol>
</VRow>
</VCard>
</template>
<style lang="scss">
#bar-chart .apexcharts-series[rel="2"] {
transform: translateY(-10px);
}
</style>

View File

@@ -0,0 +1,116 @@
<script setup>
import chartInfo from '@images/cards/chart-info.png'
import creditCardSuccess from '@images/cards/credit-card-success.png'
import creditCardWarning from '@images/cards/credit-card-warning.png'
import paypalError from '@images/cards/paypal-error.png'
import walletPrimary from '@images/cards/wallet-primary.png'
const transactions = [
{
amount: +82.6,
paymentMethod: 'Paypal',
description: 'Send money',
icon: paypalError,
color: 'error',
},
{
paymentMethod: 'Wallet',
amount: +270.69,
description: 'Mac\'D',
icon: walletPrimary,
color: 'primary',
},
{
amount: +637.91,
paymentMethod: 'Transfer',
description: 'Refund',
icon: chartInfo,
color: 'info',
},
{
paymentMethod: 'Credit Card',
amount: -838.71,
description: 'Ordered Food',
icon: creditCardSuccess,
color: 'success',
},
{
paymentMethod: 'Wallet',
amount: +203.33,
description: 'Starbucks',
icon: walletPrimary,
color: 'primary',
},
{
paymentMethod: 'Mastercard',
amount: -92.45,
description: 'Ordered Food',
icon: creditCardWarning,
color: 'warning',
},
]
const moreList = [
{
title: 'Share',
value: 'Share',
},
{
title: 'Refresh',
value: 'Refresh',
},
{
title: 'Update',
value: 'Update',
},
]
</script>
<template>
<VCard title="Transactions">
<template #append>
<div class="me-n3 mt-n2">
<MoreBtn :menu-list="moreList" />
</div>
</template>
<VCardText>
<VList class="card-list">
<VListItem
v-for="item in transactions"
:key="item.paymentMethod"
>
<template #prepend>
<VAvatar
rounded
variant="tonal"
:color="item.color"
:image="item.icon"
class="me-3"
/>
</template>
<VListItemSubtitle class="text-disabled mb-1">
{{ item.paymentMethod }}
</VListItemSubtitle>
<VListItemTitle>
{{ item.description }}
</VListItemTitle>
<template #append>
<VListItemAction>
<span class="me-1">{{ item.amount > 0 ? `+$${Math.abs(item.amount)}` : `-$${Math.abs(item.amount)}` }}</span>
<span class="text-disabled">USD</span>
</VListItemAction>
</template>
</VListItem>
</VList>
</VCardText>
</VCard>
</template>
<style lang="scss" scoped>
.card-list {
--v-card-list-gap: 1.6rem;
}
</style>

View File

@@ -0,0 +1,432 @@
<script setup>
import { hexToRgb } from "@layouts/utils";
import moment from "moment";
import { onBeforeMount, onMounted } from "vue";
import VueApexCharts from "vue3-apexcharts";
import { useTheme } from "vuetify";
import { useStore } from "vuex";
const vuetifyTheme = useTheme();
const store = useStore();
const total_sessions = ref();
const total_call_time = ref();
const avg_session_time = ref(0);
const getAnalytics = ref([]);
const getAnalyticsFilter = ref([]);
const monthly_session_count = ref([]);
const currentMonth = ref();
const refChart = ref(null);
const showGraph = ref(false);
const selectedFilter = ref(null);
const monthListf = ref([]);
const isHover = ref(false);
const currentTheme = "rgb(38 84 129 / 60%)";
const variableTheme = vuetifyTheme.current.value.variables;
const labelColor = `rgba(203 40 225 / 60%)`;
const labelPrimaryColor = `rgba(rgb(132 173 21 / 60%),0.1)`;
const series = ref([
{
data: [],
},
]);
onMounted(async () => {
console.log("refChart", refChart);
});
onBeforeMount(async () => {
currentMonth.value = moment().format("MMMM") + "(Month to date)";
console.log("cm", currentMonth.value);
await store.dispatch("getAnalytics");
getAnalytics.value = store.getters.getAnalytics;
console.log("getAnalytics", getAnalytics.value);
total_sessions.value = getAnalytics.value.total_sessions;
total_call_time.value = getAnalytics.value.total_call_time;
avg_session_time.value = getAnalytics.value.avg_session_time;
// monthListf.value = getAnalytics.value.months_list;
series.value[0].data = getAnalytics.value.data;
const currentTheme = vuetifyTheme.current.value.colors;
const variableTheme = vuetifyTheme.current.value.variables;
const labelColor = `rgba(${hexToRgb(currentTheme["on-background"])})`;
const labelPrimaryColor = `rgba(${hexToRgb(currentTheme.primary)},0.1)`;
chartOptions.value.colors = [
labelPrimaryColor,
labelPrimaryColor,
labelPrimaryColor,
labelPrimaryColor,
`rgba(${hexToRgb(currentTheme.primary)}, 1)`,
labelPrimaryColor,
labelPrimaryColor,
];
chartOptions.value.xaxis.labels.style.colors = labelColor;
chartOptions.value.xaxis.categories = getAnalytics.value.months_list;
showGraph.value = true;
});
const chartOptions1 = computed(() => {
return chartOptions.value;
});
const chartOptions = ref({
chart: {
type: "bar",
toolbar: { show: false },
},
tooltip: { enabled: false },
plotOptions: {
bar: {
barHeight: "60%",
columnWidth: "40%",
startingShape: "rounded",
endingShape: "rounded",
borderRadius: 5,
distributed: true,
},
},
grid: {
show: false,
padding: {
top: -20,
bottom: 0,
left: -10,
right: -10,
},
},
colors: [
"rgba(rgb(132 173 21 / 60%),0.1)",
"rgba(rgb(132 173 21 / 60%),0.1)",
"rgba(rgb(132 173 21 / 60%),0.1)",
"rgba(rgb(132 173 21 / 60%),0.1)",
`rgba('38 84 129 / 60%', 1)`,
"rgba(rgb(132 173 21 / 60%),0.1)",
"rgba(rgb(132 173 21 / 60%),0.1)",
],
dataLabels: { enabled: false },
legend: { show: false },
xaxis: {
categories: [],
axisBorder: { show: false },
axisTicks: { show: false },
labels: {
style: {
colors: `rgba(203 40 225 / 60%)`,
fontSize: "13px",
},
},
},
yaxis: { labels: { show: false } },
});
const filter = [
{
value: "This Month",
key: "current_month",
},
{
value: "Past Month",
key: "1_month",
},
{
value: "Past 2 Month from today",
key: "2_months",
},
{
value: "Past 3 Month from today",
key: "3_months",
},
{
value: "Past 6 Month from today",
key: "6_months",
},
{
value: "Past 12 Month from today",
key: "12_months",
},
{
value: "All Time",
key: "all_time",
},
];
const handleDateInput = async () => {
await store.dispatch("getAnalyticsFilter", {
filter: selectedFilter.value,
});
getAnalyticsFilter.value = store.getters.getAnalyticsFilter;
console.log("getAnalyticsFilter", getAnalyticsFilter.value);
total_sessions.value = getAnalyticsFilter.value.total_sessions;
total_call_time.value = getAnalyticsFilter.value.total_call_time;
avg_session_time.value = getAnalyticsFilter.value.avg_session_time;
store.dispatch("updateIsLoading", false);
};
</script>
<template>
<VRow class="mb-5">
<VCol cols="12">
<v-select
v-model="selectedFilter"
:items="filter"
:label="currentMonth"
item-title="value"
item-value="key"
@update:model-value="handleDateInput"
prepend-inner-icon="mdi-calendar"
density="compact"
clearable
class="custom-select"
>
</v-select>
</VCol>
<VCol cols="12" md="4" sm="6">
<div>
<VCard
class="logistics-card-statistics cursor-pointer"
:style="
isHover
? `border-block-end-color: rgb(var(--v-theme-primary))`
: `border-block-end-color: rgba(var(--v-theme-primary),0.7)`
"
@mouseenter="isHover = true"
@mouseleave="isHover = false"
>
<VCardText>
<div class="d-flex align-center gap-x-4 mb-2">
<VAvatar variant="tonal" color="yellow" rounded>
<VIcon icon="mdi-account-group" size="24" />
</VAvatar>
<h4 class="text-h5">Total Session</h4>
</div>
<h6 class="text-body-1 mb-2"></h6>
<div class="d-flex gap-x-2 align-center">
<div class="text-body-1 font-weight-medium me-2">
{{ total_sessions }}
</div>
<span class="text-sm text-disabled"
>Total session</span
>
</div>
</VCardText>
</VCard>
</div>
</VCol>
<VCol cols="12" md="4" sm="6">
<div>
<VCard
class="logistics-card-statistics cursor-pointer"
:style="
isHover
? `border-block-end-color: rgb(var(--v-theme-warning))`
: `border-block-end-color: rgba(var(--v-theme-warning),0.7)`
"
@mouseenter="isHover = true"
@mouseleave="isHover = false"
>
<VCardText>
<div class="d-flex align-center gap-x-4 mb-2">
<VAvatar variant="tonal" color="yellow" rounded>
<VIcon icon="mdi-timer" size="24" />
</VAvatar>
<h4 class="text-h5">Session Minutes</h4>
</div>
<h6 class="text-body-1 mb-2"></h6>
<div class="d-flex gap-x-2 align-center">
<div class="text-body-1 font-weight-medium me-2">
{{ total_call_time }}
</div>
<span class="text-sm text-disabled"
>Total Call Minutes
</span>
</div>
</VCardText>
</VCard>
</div>
</VCol>
<VCol cols="12" md="4" sm="6">
<div>
<VCard
class="logistics-card-statistics cursor-pointer"
:style="
isHover
? `border-block-end-color: rgb(var(--v-theme-info))`
: `border-block-end-color: rgba(var(--v-theme-info),0.7)`
"
@mouseenter="isHover = true"
@mouseleave="isHover = false"
>
<VCardText>
<div class="d-flex align-center gap-x-4 mb-2">
<VAvatar variant="tonal" color="yellow" rounded>
<VIcon icon="mdi-hourglass" size="24" />
</VAvatar>
<h4 class="text-h5">Avg Session Time</h4>
</div>
<h6 class="text-body-1 mb-2"></h6>
<div class="d-flex gap-x-2 align-center">
<div class="text-body-1 font-weight-medium me-2">
{{ avg_session_time }}
</div>
<span class="text-sm text-disabled"
>Avg Session Time
</span>
</div>
</VCardText>
</VCard>
</div>
</VCol>
</VRow>
<VCard>
<VCardText class="pt-6">
<VRow>
<VDialog
v-model="store.getters.getIsLoading"
width="110"
height="150"
color="primary"
>
<VCardText class="" style="color: white !important">
<div class="demo-space-x">
<VProgressCircular
:size="40"
color="primary"
indeterminate
/>
</div>
</VCardText>
</VDialog>
<VCol cols="12" lg="4" md="4" sm="12" style="display: none">
<div class="d-flex align-center gap-4">
<v-icon size="42" color="rgb(var(--v-theme-yellow))"
>mdi-account-group</v-icon
>
<div class="d-flex flex-column">
<span class="text-h5 font-weight-medium mt-1">{{
total_sessions
}}</span>
<span
class="text-sm"
color="rgb(var(--v-theme-yellow))"
>
Total Session
</span>
</div>
</div>
</VCol>
<VCol cols="12" lg="4" md="4" sm="12" style="display: none">
<div class="d-flex align-center gap-4">
<v-icon size="42" color="rgb(var(--v-theme-yellow))"
>mdi-timer</v-icon
>
<div class="d-flex flex-column">
<span class="text-h5 font-weight-medium">{{
total_call_time
}}</span>
<span class="text-sm"> Session Minutes </span>
</div>
</div>
</VCol>
<VCol cols="12" lg="4" md="4" sm="12" style="display: none">
<div class="d-flex align-center gap-4">
<v-icon size="42" color="rgb(var(--v-theme-yellow))"
>mdi-hourglass</v-icon
>
<div class="d-flex flex-column">
<span class="text-h5 font-weight-medium">{{
avg_session_time
}}</span>
<span class="text-sm"> Avg Session Time </span>
</div>
</div>
</VCol>
<VueApexCharts
v-if="showGraph"
ref="refChart"
:options="chartOptions1"
:series="series"
:height="250"
:width="850"
class="graph-scroll"
/>
</VRow>
</VCardText>
</VCard>
</template>
<style scoped>
@media (max-width: 576px) {
.graph-scroll {
overflow-x: scroll;
overflow-y: hidden;
}
}
.text-h4 {
font-size: 1.5rem !important;
font-weight: 500;
line-height: 2.375rem;
letter-spacing: normal !important;
font-family: Public Sans, sans-serif, -apple-system, blinkmacsystemfont,
Segoe UI, roboto, Helvetica Neue, arial, sans-serif, "Apple Color Emoji",
"Segoe UI Emoji", Segoe UI Symbol;
text-transform: none !important;
}
.text-body-1 {
font-size: 0.9375rem !important;
font-weight: 400;
line-height: 1.375rem;
letter-spacing: normal !important;
font-family: Public Sans, sans-serif, -apple-system, blinkmacsystemfont,
Segoe UI, roboto, Helvetica Neue, arial, sans-serif, "Apple Color Emoji",
"Segoe UI Emoji", Segoe UI Symbol;
text-transform: none !important;
}
.logistics-card-statistics {
border-block-end-style: solid;
border-block-end-width: 2px;
&:hover {
border-block-end-width: 3px;
margin-block-end: -1px;
transition: all 0.1s ease-out;
}
}
.skin--bordered {
.logistics-card-statistics {
&:hover {
margin-block-end: -2px;
}
}
}
.custom-select {
width: 100%;
}
.custom-select :deep(.v-input__control) {
min-height: 40px;
}
.custom-select :deep(.v-select__selection) {
color: var(--v-primary-base);
font-weight: 500;
}
.custom-select :deep(.v-input__slot) {
border-color: var(--v-primary-lighten2) !important;
transition: all 0.3s ease;
}
.custom-select:hover :deep(.v-input__slot) {
border-color: var(--v-primary-base) !important;
box-shadow: 0 0 0 1px var(--v-primary-base);
}
.text-sm {
font-size: 13px;
line-height: 1.25rem;
}
</style>

File diff suppressed because it is too large Load Diff