updates dashboard layout

This commit is contained in:
Christian Beutel
2024-11-05 22:56:29 +01:00
parent 81d309c582
commit cf903f4071
4 changed files with 114 additions and 112 deletions

View File

@@ -123,8 +123,6 @@
if (!date) { if (!date) {
return; return;
} }
console.log(date);
dispatch("click", date); dispatch("click", date);
} }
</script> </script>
@@ -151,7 +149,7 @@
</div> </div>
{/each} {/each}
</div> </div>
<div class="grid grid-cols-7 grid-rows-6" style="aspect-ratio: 1.17/1"> <div class="grid grid-cols-7 grid-rows-6 gap-1" style="aspect-ratio: 1.17/1">
{#each { length: 42 } as _, i} {#each { length: 42 } as _, i}
<button <button
class="calendar-day flex items-center justify-center rounded-xl" class="calendar-day flex items-center justify-center rounded-xl"

View File

@@ -2,6 +2,7 @@
import { writable } from "svelte/store"; import { writable } from "svelte/store";
import type { SelectItem } from "./select.svelte"; import type { SelectItem } from "./select.svelte";
import { createEventDispatcher } from "svelte"; import { createEventDispatcher } from "svelte";
import {_} from "svelte-i18n"
export let items: SelectItem[] = []; export let items: SelectItem[] = [];
export let value: SelectItem[] = []; export let value: SelectItem[] = [];
@@ -38,7 +39,7 @@
</label> </label>
{/if} {/if}
<button <button
class="min-w-44 flex flex-wrap items-center gap-2 border bg-input-background min-h-[50px] p-3 rounded-md transition-colors focus:border-input-border-focus focus:outline-none focus:ring-0" class="min-w-44 flex flex-wrap items-center gap-2 border border-input-border bg-input-background min-h-[50px] p-3 rounded-md transition-colors focus:border-input-border-focus focus:outline-none focus:ring-0"
on:click={() => (showDropdown = !showDropdown)} on:click={() => (showDropdown = !showDropdown)}
> >
{#if value.length === 0} {#if value.length === 0}
@@ -48,7 +49,7 @@
<div <div
class="bg-primary text-white px-2 py-1 rounded-full flex items-center gap-1" class="bg-primary text-white px-2 py-1 rounded-full flex items-center gap-1"
> >
<span class="text-sm">{item.text}</span> <span class="text-sm">{$_(item.text)}</span>
<button <button
on:click|stopPropagation={() => removeItem(item)} on:click|stopPropagation={() => removeItem(item)}
class="text-white hover:bg-primary-hover rounded-full w-4 h-4 flex items-center justify-center" class="text-white hover:bg-primary-hover rounded-full w-4 h-4 flex items-center justify-center"
@@ -63,14 +64,14 @@
{#if showDropdown} {#if showDropdown}
<div <div
bind:this={dropdownRef} bind:this={dropdownRef}
class="absolute z-10 mt-1 w-full bg-white border border-gray-300 rounded shadow-lg max-h-40 overflow-y-auto" class="absolute z-10 mt-1 w-full bg-menu-background border border-input-border rounded-md max-h-40 overflow-y-auto"
> >
{#each items as item} {#each items as item}
<button <button
on:click={() => toggleItem(item)} on:click={() => toggleItem(item)}
class="px-3 py-2 hover:bg-blue-100 cursor-pointer flex justify-between items-center w-full" class="px-3 py-2 hover:bg-menu-item-background-hover cursor-pointer flex justify-between items-center w-full"
> >
<span>{item.text}</span> <span>{$_(item.text)}</span>
{#if value.includes(item)} {#if value.includes(item)}
<div class="ml-auto"> <div class="ml-auto">
<i class="fa fa-check"></i> <i class="fa fa-check"></i>

View File

@@ -15,7 +15,6 @@
import { createEventDispatcher, onMount } from "svelte"; import { createEventDispatcher, onMount } from "svelte";
import { _ } from "svelte-i18n"; import { _ } from "svelte-i18n";
import Dropdown from "../base/dropdown.svelte"; import Dropdown from "../base/dropdown.svelte";
import { trail } from "$lib/stores/trail_store";
export let trails: Trail[]; export let trails: Trail[];
export let map: any | null = null; export let map: any | null = null;

View File

@@ -144,7 +144,7 @@
(acc[date] || 0) + ((log as any)[barChartSelectedValue] ?? 0); (acc[date] || 0) + ((log as any)[barChartSelectedValue] ?? 0);
if (barChartSelectedValue === "distance") { if (barChartSelectedValue === "distance") {
acc[date] = acc[date] / 1000; acc[date] = acc[date] / 1000;
}else if(barChartSelectedValue === "duration") { } else if (barChartSelectedValue === "duration") {
acc[date] = acc[date] / 60 / 60; acc[date] = acc[date] / 60 / 60;
} }
if ($page.data.settings?.unit !== "metric") { if ($page.data.settings?.unit !== "metric") {
@@ -228,10 +228,37 @@
</svelte:head> </svelte:head>
<div <div
class="grid grid-cols-1 md:grid-cols-[356px_minmax(0,_1fr)] gap-y-4 items-start max-w-6xl mx-auto" class="grid grid-cols-1 sm:grid-cols-[272px_minmax(0,_1fr)] md:grid-cols-[356px_minmax(0,_1fr)] gap-y-4 max-w-6xl mx-auto"
> >
{#if $currentUser}
<div class="flex items-center gap-x-6 h-full px-4">
<img
class="rounded-full w-16 aspect-square overflow-hidden"
src={getFileURL($currentUser, $currentUser.avatar) ||
`https://api.dicebear.com/7.x/initials/svg?seed=${$currentUser.username}&backgroundType=gradientLinear`}
alt="avatar"
/>
<div>
<h4 class="text-2xl font-semibold col-start-2">
{$currentUser.username}
</h4>
<p class="text-sm">
<span class="text-gray-500">Joined:</span>
{new Date($currentUser.created ?? "").toLocaleDateString(
undefined,
{
month: "2-digit",
day: "2-digit",
year: "numeric",
timeZone: "UTC",
},
)}
</p>
</div>
</div>
{/if}
<div <div
class="flex flex-wrap md:flex-nowrap col-start-1 md:col-start-2 gap-x-4 justify-end" class="flex flex-wrap md:flex-nowrap col-start-1 sm:col-start-2 gap-x-4 justify-end"
> >
<MultiSelect <MultiSelect
on:change={(e) => updateFilterCategory(e.detail)} on:change={(e) => updateFilterCategory(e.detail)}
@@ -250,105 +277,16 @@
label={$_("before")} label={$_("before")}
></Datepicker> ></Datepicker>
</div> </div>
<div <div class="space-y-4 grow-0 sm:mr-4">
class="border border-input-border rounded-xl p-6 lg:row-span-3 space-y-6 grow-0 md:mr-4" <div class="border border-input-border rounded-xl p-6">
> <Calendar
{#if $currentUser} on:click={(e) => handleDateClick(e.detail)}
<div class="flex items-center gap-x-6"> logs={$summitLogs}
<img colorMap={categoryColorMap}
class="rounded-full w-24 aspect-square overflow-hidden" ></Calendar>
src={getFileURL($currentUser, $currentUser.avatar) ||
`https://api.dicebear.com/7.x/initials/svg?seed=${$currentUser.username}&backgroundType=gradientLinear`}
alt="avatar"
/>
<div>
<h4 class="text-2xl font-semibold col-start-2">
{$currentUser.username}
</h4>
<p class="text-sm">
<span class="text-gray-500">Joined:</span>
{new Date(
$currentUser.created ?? "",
).toLocaleDateString(undefined, {
month: "2-digit",
day: "2-digit",
year: "numeric",
timeZone: "UTC",
})}
</p>
</div>
</div>
{/if}
<Calendar
on:click={(e) => handleDateClick(e.detail)}
logs={$summitLogs}
colorMap={categoryColorMap}
></Calendar>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
<div
class="flex flex-col items-center gap-6 border border-input-border rounded-xl p-6"
>
<span class="text-gray-500 font-semibold text-lg self-start"
><i class="fa fa-hashtag mr-3"></i>{$_("activity", {
values: { n: 2 },
})}</span
>
<p class="text-4xl font-bold">{$summitLogs.length}</p>
</div> </div>
<div <div
class="flex flex-col items-center gap-6 border border-input-border rounded-xl p-6" class="border border-input-border rounded-xl p-6 space-y-4"
>
<span class="text-gray-500 font-semibold text-lg self-start"
><i class="fa fa-left-right mr-3"></i>{$_("distance")}</span
>
<p class="text-4xl font-bold">{formatDistance(totalDistance)}</p>
</div>
<div
class="flex flex-col items-center gap-6 border border-input-border rounded-xl p-6"
>
<span class="text-gray-500 font-semibold text-lg self-start"
><i class="fa fa-clock mr-3"></i>{$_("duration")}</span
>
<p class="text-4xl font-bold">{formatTimeHHMM(totalDuration / 60)}</p>
</div>
<div
class="flex flex-col items-center gap-6 border border-input-border rounded-xl p-6"
>
<span class="text-gray-500 font-semibold text-lg self-start"
><i class="fa fa-arrow-trend-up mr-3"></i>{$_(
"elevation-gain",
)}</span
>
<p class="text-4xl font-bold">
{formatElevation(totalElevationGain)}
</p>
</div>
<div
class="flex flex-col items-center gap-6 border border-input-border rounded-xl p-6"
>
<span class="text-gray-500 font-semibold text-lg self-start"
><i class="fa fa-arrow-trend-down mr-3"></i>{$_(
"elevation-loss",
)}</span
>
<p class="text-4xl font-bold">
{formatElevation(totalElevationLoss)}
</p>
</div>
<div
class="flex flex-col items-center gap-6 border border-input-border rounded-xl p-6"
>
<span class="text-gray-500 font-semibold text-lg self-start"
><i class="fa fa-arrow-trend-down mr-3"></i>{$_(
"average-speed",
)}</span
>
<p class="text-4xl font-bold">{formatSpeed(averageSpeed)}</p>
</div>
<div
class="col-start-1 col-span-1 border border-input-border rounded-xl p-6 space-y-4"
> >
<span class="text-gray-500 font-semibold text-lg" <span class="text-gray-500 font-semibold text-lg"
><i class="fa fa-person-hiking mr-3"></i>{$_( ><i class="fa fa-person-hiking mr-3"></i>{$_(
@@ -367,8 +305,74 @@
}} }}
/> />
</div> </div>
</div>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
<div <div
class="h-full md:col-span-2 space-y-2 border border-input-border rounded-xl p-6" class="flex flex-col items-center gap-4 border border-input-border rounded-xl p-6"
>
<span class="text-gray-500 font-semibold text-lg self-start"
><i class="fa fa-hashtag mr-3"></i>{$_("activity", {
values: { n: 2 },
})}</span
>
<p class="text-3xl font-bold">{$summitLogs.length}</p>
</div>
<div
class="flex flex-col items-center gap-4 border border-input-border rounded-xl p-6"
>
<span class="text-gray-500 font-semibold text-lg self-start"
><i class="fa fa-left-right mr-3"></i>{$_("distance")}</span
>
<p class="text-3xl font-bold">{formatDistance(totalDistance)}</p>
</div>
<div
class="flex flex-col items-center gap-4 border border-input-border rounded-xl p-6"
>
<span class="text-gray-500 font-semibold text-lg self-start"
><i class="fa fa-clock mr-3"></i>{$_("duration")}</span
>
<p class="text-3xl font-bold">
{formatTimeHHMM(totalDuration / 60)}
</p>
</div>
<div
class="flex flex-col items-center gap-4 border border-input-border rounded-xl p-6"
>
<span class="text-gray-500 font-semibold text-lg self-start"
><i class="fa fa-arrow-trend-up mr-3"></i>{$_(
"elevation-gain",
)}</span
>
<p class="text-3xl font-bold">
{formatElevation(totalElevationGain)}
</p>
</div>
<div
class="flex flex-col items-center gap-4 border border-input-border rounded-xl p-6"
>
<span class="text-gray-500 font-semibold text-lg self-start"
><i class="fa fa-arrow-trend-down mr-3"></i>{$_(
"elevation-loss",
)}</span
>
<p class="text-3xl font-bold">
{formatElevation(totalElevationLoss)}
</p>
</div>
<div
class="flex flex-col items-center gap-4 border border-input-border rounded-xl p-6"
>
<span class="text-gray-500 font-semibold text-lg self-start"
><i class="fa fa-arrow-trend-down mr-3"></i>{$_(
"average-speed",
)}</span
>
<p class="text-3xl font-bold">{formatSpeed(averageSpeed)}</p>
</div>
<div
class="h-full sm:col-span-2 lg:col-span-3 space-y-2 border border-input-border rounded-xl p-6"
> >
<div class="flex justify-between"> <div class="flex justify-between">
<span class="text-gray-500 font-semibold text-lg" <span class="text-gray-500 font-semibold text-lg"
@@ -411,7 +415,7 @@
</div> </div>
<div <div
class="col-span-1 md:col-span-2 border border-input-border rounded-xl p-6 space-y-6" class="col-span-1 sm:col-span-2 border border-input-border rounded-xl p-6 space-y-6"
> >
<span class="text-gray-500 font-semibold text-lg" <span class="text-gray-500 font-semibold text-lg"
><i class="fa fa-table mr-3"></i>{$_("all-activities")}</span ><i class="fa fa-table mr-3"></i>{$_("all-activities")}</span