improve analytics page ui

main
TZGyn 1 year ago
parent 135577b0d6
commit 155623a444
Signed by: TZGyn
GPG Key ID: 122EAF77AE81FD4A

@ -109,10 +109,14 @@ declare global {
} }
} }
} }
// prototype functions are declared in ./lib/utils
interface String { interface String {
removeUnderscores(): string removeUnderscores(): string
capitalize(): string capitalize(): string
} }
interface Number {
toDecimalPoint(decimal: number): Number
}
} }
export {} export {}

@ -70,6 +70,7 @@ export const flyAndScale = (
} }
} }
// type declaration are in ../app.d.ts
// this works because its imported in the root layout by other components // this works because its imported in the root layout by other components
String.prototype.removeUnderscores = function () { String.prototype.removeUnderscores = function () {
return this.replace(/_/g, ' ') return this.replace(/_/g, ' ')
@ -78,3 +79,11 @@ String.prototype.removeUnderscores = function () {
String.prototype.capitalize = function () { String.prototype.capitalize = function () {
return this.charAt(0).toUpperCase() + this.slice(1) return this.charAt(0).toUpperCase() + this.slice(1)
} }
Number.prototype.toDecimalPoint = function (decimal: number) {
const decimalInInt = Math.round(decimal)
const value = 10 ** decimalInInt
return Math.round(this.valueOf() * value) / value
}

@ -141,15 +141,25 @@
<Card.Content> <Card.Content>
<Tabs.Content value="country"> <Tabs.Content value="country">
{#each data.visitorByCountry as visitorByCountry} {#each data.visitorByCountry as visitorByCountry}
<div class="flex flex-col gap-2"> <div
class="hover:bg-muted flex flex-col gap-2 border-b p-2 transition-colors">
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<div class="flex items-center gap-4"> <div class="flex items-center gap-4">
<img <img
src={`https://flagsapi.com/${visitorByCountry.code}/flat/64.png`} src={`https://flagsapi.com/${visitorByCountry.code}/flat/32.png`}
alt="" /> alt="" />
<div>{visitorByCountry.country}</div> <div>{visitorByCountry.country}</div>
</div> </div>
<div>{visitorByCountry.count}</div> <div>
{visitorByCountry.count}
<span class="text-muted-foreground">
({(
(visitorByCountry.count /
data.visitorAllTime[0].count) *
100
).toDecimalPoint(2)} %)
</span>
</div>
</div> </div>
<Progress <Progress
value={visitorByCountry.count} value={visitorByCountry.count}
@ -160,15 +170,25 @@
</Tabs.Content> </Tabs.Content>
<Tabs.Content value="city"> <Tabs.Content value="city">
{#each data.visitorByCity as visitorByCity} {#each data.visitorByCity as visitorByCity}
<div class="flex flex-col gap-2"> <div
class="hover:bg-muted flex flex-col gap-2 border-b p-2 transition-colors">
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<div class="flex items-center gap-4"> <div class="flex items-center gap-4">
<img <img
src={`https://flagsapi.com/${visitorByCity.code}/flat/64.png`} src={`https://flagsapi.com/${visitorByCity.code}/flat/32.png`}
alt="" /> alt="" />
<div>{visitorByCity.city}</div> <div>{visitorByCity.city}</div>
</div> </div>
<div>{visitorByCity.count}</div> <div>
{visitorByCity.count}
<span class="text-muted-foreground">
({(
(visitorByCity.count /
data.visitorAllTime[0].count) *
100
).toDecimalPoint(2)} %)
</span>
</div>
</div> </div>
<Progress <Progress
value={visitorByCity.count} value={visitorByCity.count}
@ -195,17 +215,26 @@
</Card.Header> </Card.Header>
<Card.Content> <Card.Content>
<Tabs.Content value="vendor"> <Tabs.Content value="vendor">
<div class="flex flex-col gap-6">
{#each data.visitorByDeviceVendor as visitorByDeviceVendor} {#each data.visitorByDeviceVendor as visitorByDeviceVendor}
<div class="flex flex-col gap-2"> <div
class="hover:bg-muted flex flex-col gap-2 border-b p-2 transition-colors">
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<div class="flex items-center gap-4"> <div class="flex items-center gap-4">
<TabletSmartphone /> <TabletSmartphone />
<div> <div>
{visitorByDeviceVendor.vendor ?? '(None)'} {visitorByDeviceVendor.vendor || '(None)'}
</div>
</div> </div>
<div>
{visitorByDeviceVendor.count}
<span class="text-muted-foreground">
({(
(visitorByDeviceVendor.count /
data.visitorAllTime[0].count) *
100
).toDecimalPoint(2)} %)
</span>
</div> </div>
<div>{visitorByDeviceVendor.count}</div>
</div> </div>
<Progress <Progress
value={visitorByDeviceVendor.count} value={visitorByDeviceVendor.count}
@ -213,12 +242,11 @@
class={'h-2'} /> class={'h-2'} />
</div> </div>
{/each} {/each}
</div>
</Tabs.Content> </Tabs.Content>
<Tabs.Content value="type"> <Tabs.Content value="type">
<div class="flex flex-col gap-6">
{#each data.visitorByDeviceType as visitorByDeviceType} {#each data.visitorByDeviceType as visitorByDeviceType}
<div class="flex flex-col gap-2"> <div
class="hover:bg-muted flex flex-col gap-2 border-b p-2 transition-colors">
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<div class="flex items-center gap-4"> <div class="flex items-center gap-4">
{#if visitorByDeviceType.type === 'mobile'} {#if visitorByDeviceType.type === 'mobile'}
@ -232,7 +260,16 @@
{visitorByDeviceType.type ?? '(None)'} {visitorByDeviceType.type ?? '(None)'}
</div> </div>
</div> </div>
<div>{visitorByDeviceType.count}</div> <div>
{visitorByDeviceType.count}
<span class="text-muted-foreground">
({(
(visitorByDeviceType.count /
data.visitorAllTime[0].count) *
100
).toDecimalPoint(2)} %)
</span>
</div>
</div> </div>
<Progress <Progress
value={visitorByDeviceType.count} value={visitorByDeviceType.count}
@ -240,7 +277,6 @@
class={'h-2'} /> class={'h-2'} />
</div> </div>
{/each} {/each}
</div>
</Tabs.Content> </Tabs.Content>
</Card.Content> </Card.Content>
</Tabs.Root> </Tabs.Root>
@ -260,15 +296,24 @@
</Card.Header> </Card.Header>
<Card.Content> <Card.Content>
<Tabs.Content value="os"> <Tabs.Content value="os">
<div class="flex flex-col gap-6">
{#each data.visitorByOS as visitorByOS} {#each data.visitorByOS as visitorByOS}
<div class="flex flex-col gap-2"> <div
class="hover:bg-muted flex flex-col gap-2 border-b p-2 transition-colors">
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<div class="flex items-center gap-4"> <div class="flex items-center gap-4">
<TabletSmartphone /> <TabletSmartphone />
<div>{visitorByOS.os ?? '(None)'}</div> <div>{visitorByOS.os ?? '(None)'}</div>
</div> </div>
<div>{visitorByOS.count}</div> <div>
{visitorByOS.count}
<span class="text-muted-foreground">
({(
(visitorByOS.count /
data.visitorAllTime[0].count) *
100
).toDecimalPoint(2)} %)
</span>
</div>
</div> </div>
<Progress <Progress
value={visitorByOS.count} value={visitorByOS.count}
@ -276,12 +321,11 @@
class={'h-2'} /> class={'h-2'} />
</div> </div>
{/each} {/each}
</div>
</Tabs.Content> </Tabs.Content>
<Tabs.Content value="browser"> <Tabs.Content value="browser">
<div class="flex flex-col gap-6">
{#each data.visitorByBrowser as visitorByBrowser} {#each data.visitorByBrowser as visitorByBrowser}
<div class="flex flex-col gap-2"> <div
class="hover:bg-muted flex flex-col gap-2 border-b p-2 transition-colors">
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<div class="flex items-center gap-4"> <div class="flex items-center gap-4">
<GlobeIcon /> <GlobeIcon />
@ -289,7 +333,16 @@
{visitorByBrowser.browser ?? '(None)'} {visitorByBrowser.browser ?? '(None)'}
</div> </div>
</div> </div>
<div>{visitorByBrowser.count}</div> <div>
{visitorByBrowser.count}
<span class="text-muted-foreground">
({(
(visitorByBrowser.count /
data.visitorAllTime[0].count) *
100
).toDecimalPoint(2)} %)
</span>
</div>
</div> </div>
<Progress <Progress
value={visitorByBrowser.count} value={visitorByBrowser.count}
@ -297,7 +350,6 @@
class={'h-2'} /> class={'h-2'} />
</div> </div>
{/each} {/each}
</div>
</Tabs.Content> </Tabs.Content>
</Card.Content> </Card.Content>
</Tabs.Root> </Tabs.Root>

Loading…
Cancel
Save