Add placeholder weight routes
This commit is contained in:
99
src/lib/components/Weight/EmptyWeightComp.svelte
Normal file
99
src/lib/components/Weight/EmptyWeightComp.svelte
Normal file
@@ -0,0 +1,99 @@
|
||||
<script lang="ts">
|
||||
import { type Food, FoodService } from '$lib/database/food'
|
||||
import { toast } from 'svelte-sonner'
|
||||
import type { Err } from '$lib/types'
|
||||
import { foodStore } from '$lib/store/energy/foodStore'
|
||||
|
||||
let item: Food = {
|
||||
food: '',
|
||||
amount: 0,
|
||||
description: ''
|
||||
}
|
||||
let name: string = ''
|
||||
let amount: string = ''
|
||||
let description: string = ''
|
||||
let per100: string = ''
|
||||
let per100Edited: boolean = false
|
||||
let per100Element: HTMLTableCellElement
|
||||
|
||||
async function update(event: KeyboardEvent & { currentTarget: (EventTarget & HTMLTableCellElement) }) {
|
||||
name = name.trim()
|
||||
amount = amount.trim()
|
||||
description = description.trim()
|
||||
per100 = per100.trim()
|
||||
|
||||
if (!per100Edited && event.currentTarget === per100Element)
|
||||
per100Edited = true
|
||||
|
||||
if (event.key == 'Enter') {
|
||||
event.preventDefault()
|
||||
item.food = name
|
||||
item.description = description
|
||||
item.amount = parseInt(amount)
|
||||
item.per100 = parseInt(per100)
|
||||
|
||||
const [dbFood, err]: [Food, Err] = await FoodService.Create(item)
|
||||
name = ''
|
||||
amount = ''
|
||||
description = ''
|
||||
per100 = ''
|
||||
per100Edited = false
|
||||
|
||||
if (err) {
|
||||
toast.error(err)
|
||||
return
|
||||
}
|
||||
foodStore.update((food) => {
|
||||
food.unshift(dbFood)
|
||||
return food
|
||||
})
|
||||
}
|
||||
|
||||
if (!per100Edited)
|
||||
FoodService.GetLatestPer100(name.trim()).then((res) => {
|
||||
if (res[1])
|
||||
// toast.error(res[1])
|
||||
return
|
||||
|
||||
per100 = res[0].toString()
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<tr class="border-b border-gray-200 dark:border-gray-700 text-lg font-bold">
|
||||
<th class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap bg-gray-50 dark:text-white dark:bg-gray-800"
|
||||
scope="row">
|
||||
</th>
|
||||
<td bind:innerText={name}
|
||||
class:border-[3px]={!name}
|
||||
class:border-red-600={!name}
|
||||
class="px-6 py-4 overflow-hidden"
|
||||
contenteditable="true"
|
||||
autofocus
|
||||
on:keydown={update}>
|
||||
</td>
|
||||
<td bind:innerText={description}
|
||||
class="px-6 py-4 bg-gray-50 dark:bg-gray-800 overflow-hidden"
|
||||
contenteditable="true"
|
||||
on:keydown={update}>
|
||||
</td>
|
||||
<td bind:innerText={amount}
|
||||
class:border-[3px]={!amount}
|
||||
class:border-red-600={!amount}
|
||||
class="px-6 py-4 overflow-hidden"
|
||||
contenteditable="true"
|
||||
on:keydown={update}>
|
||||
</td>
|
||||
<td bind:this={per100Element}
|
||||
bind:innerText={per100}
|
||||
class="px-6 py-4 bg-gray-50 dark:bg-gray-800 overflow-hidden"
|
||||
class:border-[3px]={!per100}
|
||||
class:border-orange-600={!per100}
|
||||
contenteditable="true"
|
||||
on:keydown={update}>
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
</td>
|
||||
</tr>
|
||||
</template>
|
45
src/lib/components/Weight/WeightComp.svelte
Normal file
45
src/lib/components/Weight/WeightComp.svelte
Normal file
@@ -0,0 +1,45 @@
|
||||
<script lang="ts">
|
||||
import type { Weight } from '$lib/database/weight'
|
||||
|
||||
export let item: Weight
|
||||
export let dateColor: string
|
||||
|
||||
let weight: string = item.weight.toString()
|
||||
|
||||
async function update(event: KeyboardEvent & { currentTarget: (EventTarget & HTMLTableCellElement) }) {
|
||||
if (event.key == 'Enter') {
|
||||
event.preventDefault()
|
||||
await updateItem()
|
||||
}
|
||||
}
|
||||
|
||||
async function focusOutUpdate() {
|
||||
await updateItem()
|
||||
}
|
||||
|
||||
async function updateItem() {
|
||||
weight = weight.trim()
|
||||
|
||||
item.weight = weight
|
||||
|
||||
const [newItem, err] = await WeightService.Update(item)
|
||||
|
||||
if (newItem && !err) {
|
||||
item = newItem
|
||||
}
|
||||
weight = item.weight
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<tr class="border-b border-gray-200 dark:border-gray-700 font-bold text-lg">
|
||||
<th class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap bg-gray-50 dark:text-white dark:bg-gray-800"
|
||||
style="color: {dateColor}"
|
||||
scope="row">
|
||||
{item.date}
|
||||
</th>
|
||||
<td class="px-6 py-4">
|
||||
{item.weight}
|
||||
</td>
|
||||
</tr>
|
||||
</template>
|
51
src/lib/components/Weight/WeightTable.svelte
Normal file
51
src/lib/components/Weight/WeightTable.svelte
Normal file
@@ -0,0 +1,51 @@
|
||||
<script lang="ts">
|
||||
import type { Food } from '$lib/database/food'
|
||||
import { GenerateColor } from '$lib/utils'
|
||||
import { Weight } from 'lucide-svelte'
|
||||
import EmptyWeightComp from '$components/Weight/EmptyWeightComp.svelte'
|
||||
import WeightComp from '$components/Weight/WeightComp.svelte'
|
||||
|
||||
export let items: Weight[] = []
|
||||
|
||||
const dateColors: Map<string, string> = new Map<string, string>()
|
||||
|
||||
function getDateColor(item: Food): string {
|
||||
if (!item) return GenerateColor()
|
||||
if (!item.date) return GenerateColor()
|
||||
const date = item.date.toString().split(' ')[0]
|
||||
if (!date) return GenerateColor()
|
||||
if (!dateColors.has(date)) dateColors.set(date, GenerateColor())
|
||||
// THERE'S NOTHING UNDEFINED HERE
|
||||
// WE GOT RID OF UNDEFINED ON LINE 33
|
||||
// ASSHOLE
|
||||
// @ts-ignore
|
||||
return dateColors.get(date)
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="relative flex flex-col flex-grow h-[95vh]" data-vaul-drawer-wrapper id="page">
|
||||
<div class="relative overflow-auto h-full shadow-md sm:rounded-lg">
|
||||
<table class="w-full text-sm text-left rtl:text-right text-gray-500 dark:text-gray-400">
|
||||
<thead class="text-xs text-gray-700 uppercase dark:text-gray-400">
|
||||
<tr>
|
||||
<th class="px-6 py-3 bg-gray-50 dark:bg-gray-800" scope="col">
|
||||
Date
|
||||
</th>
|
||||
<th class="px-6 py-3" scope="col">
|
||||
Weight
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<EmptyWeightComp />
|
||||
{#each items as f}
|
||||
<WeightComp item="{f}" dateColor="{getDateColor(f)}" />
|
||||
{/each}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
@@ -5,13 +5,21 @@
|
||||
import Monthly from '$router/routes/Energy/Monthly.svelte'
|
||||
import Yearly from '$router/routes/Energy/Yearly.svelte'
|
||||
import Energy from '$router/routes/Energy/Energy.svelte'
|
||||
import WDaily from '$router/routes/Weight/WDaily.svelte'
|
||||
import WWeekly from '$router/routes/Weight/WWeekly.svelte'
|
||||
import WMonthly from '$router/routes/Weight/WMonthly.svelte'
|
||||
import WYearly from '$router/routes/Weight/WYearly.svelte'
|
||||
|
||||
const routes = {
|
||||
'/': Energy,
|
||||
'/Energy/daily': Daily,
|
||||
'/Energy/weekly': Weekly,
|
||||
'/Energy/monthly': Monthly,
|
||||
'/Energy/yearly': Yearly
|
||||
'/Energy/yearly': Yearly,
|
||||
'/Weight/daily': WDaily,
|
||||
'/Weight/weekly': WWeekly,
|
||||
'/Weight/monthly': WMonthly,
|
||||
'/Weight/yearly': WYearly
|
||||
}
|
||||
</script>
|
||||
|
||||
|
11
src/lib/router/routes/Weight/WDaily.svelte
Normal file
11
src/lib/router/routes/Weight/WDaily.svelte
Normal file
@@ -0,0 +1,11 @@
|
||||
<script lang="ts">
|
||||
import AggregatedFoodTable from '$components/Energy/AggregatedFood/AggregatedFoodTable.svelte'
|
||||
import { dailyFoodStore } from '$lib/store/energy/dailyFoodStore'
|
||||
import { energyStore } from '$lib/store/energy/energyStore'
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<AggregatedFoodTable items="{$dailyFoodStore}"
|
||||
energyLimit="{$energyStore.limit}"
|
||||
energyTarget="{$energyStore.target}" />
|
||||
</template>
|
11
src/lib/router/routes/Weight/WMonthly.svelte
Normal file
11
src/lib/router/routes/Weight/WMonthly.svelte
Normal file
@@ -0,0 +1,11 @@
|
||||
<script lang="ts">
|
||||
import AggregatedFoodTable from '$components/Energy/AggregatedFood/AggregatedFoodTable.svelte'
|
||||
import { monthlyFoodStore } from '$lib/store/energy/monthlyFoodStore'
|
||||
import { energyStore } from '$lib/store/energy/energyStore'
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<AggregatedFoodTable items="{$monthlyFoodStore}"
|
||||
energyLimit="{$energyStore.limit * 30}"
|
||||
energyTarget="{$energyStore.target * 30}" />
|
||||
</template>
|
11
src/lib/router/routes/Weight/WWeekly.svelte
Normal file
11
src/lib/router/routes/Weight/WWeekly.svelte
Normal file
@@ -0,0 +1,11 @@
|
||||
<script lang="ts">
|
||||
import AggregatedFoodTable from '$components/Energy/AggregatedFood/AggregatedFoodTable.svelte'
|
||||
import { energyStore } from '$lib/store/energy/energyStore'
|
||||
import { weeklyFoodStore } from '$lib/store/energy/weeklyFoodStore'
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<AggregatedFoodTable items="{$weeklyFoodStore}"
|
||||
energyLimit="{$energyStore.limit * 7}"
|
||||
energyTarget="{$energyStore.target * 7}" />
|
||||
</template>
|
11
src/lib/router/routes/Weight/WYearly.svelte
Normal file
11
src/lib/router/routes/Weight/WYearly.svelte
Normal file
@@ -0,0 +1,11 @@
|
||||
<script lang="ts">
|
||||
import AggregatedFoodTable from '$components/Energy/AggregatedFood/AggregatedFoodTable.svelte'
|
||||
import { yearlyFoodStore } from '$lib/store/energy/yearlyFoodStore'
|
||||
import { energyStore } from '$lib/store/energy/energyStore'
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<AggregatedFoodTable items="{$yearlyFoodStore}"
|
||||
energyLimit="{$energyStore.limit * 365}"
|
||||
energyTarget="{$energyStore.target * 365}" />
|
||||
</template>
|
11
src/lib/router/routes/Weight/Weight.svelte
Normal file
11
src/lib/router/routes/Weight/Weight.svelte
Normal file
@@ -0,0 +1,11 @@
|
||||
<script lang="ts">
|
||||
import { foodStore } from '$lib/store/energy/foodStore'
|
||||
import FoodTable from '$components/Energy/Food/FoodTable.svelte'
|
||||
import { lookbackDaysStore } from '$lib/store/energy/lookbackDaysStore'
|
||||
// @ts-ignore
|
||||
lookbackDaysStore.subscribe((n) => foodStore.refresh())
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<FoodTable items="{$foodStore}" />
|
||||
</template>
|
Reference in New Issue
Block a user