aboutsummaryrefslogtreecommitdiff
path: root/src/routes/groceries/catalog
diff options
context:
space:
mode:
authorMartin Kagamino Lehoux <martin@lehoux.net>2026-09-07 19:30:50 +0200
committerMartin Kagamino Lehoux <martin@lehoux.net>2026-09-07 19:30:50 +0200
commit20a7a08e97e75c3a45b3430a74c2931554498f1c (patch)
treed74bdeef3d426e563b2127942ab71ae31aaf0707 /src/routes/groceries/catalog
parent37573109a05a07ac50827759ea63793209baa73a (diff)
Extract shared groceries helpers and BestRef component
Diffstat (limited to 'src/routes/groceries/catalog')
-rw-r--r--src/routes/groceries/catalog/+page.server.ts13
-rw-r--r--src/routes/groceries/catalog/+page.svelte33
2 files changed, 6 insertions, 40 deletions
diff --git a/src/routes/groceries/catalog/+page.server.ts b/src/routes/groceries/catalog/+page.server.ts
index 22464dc..fd71e30 100644
--- a/src/routes/groceries/catalog/+page.server.ts
+++ b/src/routes/groceries/catalog/+page.server.ts
@@ -1,9 +1,9 @@
import { fail } from '@sveltejs/kit';
import {
loadAll,
- toggle,
bulkUpdateGroceryCategory,
} from '$lib/server/services/groceries';
+import { toggleGroceryAction } from '$lib/server/services/grocery-actions';
import {
numericId,
parseOptionalNumber,
@@ -22,16 +22,7 @@ export const load: PageServerLoad = async () => {
};
export const actions: Actions = {
- toggle: async ({ request }) => {
- const data = await request.formData();
- try {
- const id = numericId(data.get('id'));
- await toggle(id);
- } catch {
- return fail(400, { error: 'ID invalide' });
- }
- return { success: true };
- },
+ toggle: ({ request }) => toggleGroceryAction(request),
bulkUpdateCategory: async ({ request }) => {
const data = await request.formData();
diff --git a/src/routes/groceries/catalog/+page.svelte b/src/routes/groceries/catalog/+page.svelte
index 4cbcc27..74a82e8 100644
--- a/src/routes/groceries/catalog/+page.svelte
+++ b/src/routes/groceries/catalog/+page.svelte
@@ -1,6 +1,8 @@
<script lang="ts">
import { enhance } from '$app/forms';
import { SvelteSet } from 'svelte/reactivity';
+ import BestRef from '$lib/components/BestRef.svelte';
+ import { groupByCategory } from '$lib/shared/group-by-category';
let { data, form } = $props();
@@ -20,24 +22,6 @@
if (selectedIds.has(id)) selectedIds.delete(id);
else selectedIds.add(id);
}
-
- function groupByCategory(items: typeof catalogItems) {
- const groups: Record<string, typeof catalogItems> = {};
- for (const item of items) {
- const key = item.categoryName ?? 'Non catégorisé';
- (groups[key] ??= []).push(item);
- }
- const result: [string, typeof catalogItems][] = [];
- for (const cat of data.categories) {
- if (groups[cat.name]?.length > 0) {
- result.push([cat.name, groups[cat.name]]);
- }
- }
- if (groups['Non catégorisé']?.length > 0) {
- result.unshift(['Non catégorisé', groups['Non catégorisé']]);
- }
- return result;
- }
</script>
{#if catalogItems.length > 0}
@@ -91,7 +75,7 @@
<p class="empty">Aucun résultat</p>
{:else}
<form method="POST" action="?/toggle" use:enhance>
- {#each groupByCategory(filteredItems) as [cat, items] (cat)}
+ {#each groupByCategory(filteredItems, data.categories) as [cat, items] (cat)}
<h3 class="category-name">{cat}</h3>
<ul class="item-list">
{#each items as item (item.id)}
@@ -112,16 +96,7 @@
<span class="item-text">
<span class:checked={item.checked}>{item.name}</span>
{#if item.bestRef}
- <span class="best-ref"
- >{item.bestRef.reference}
- {#if item.bestRef.price && item.bestRef.unit}
- &nbsp;{item.bestRef.price.toFixed(2)}
- {item.bestRef.unit}
- {/if}
- {#if item.bestRef.qualityScore != null}
- &nbsp;({item.bestRef.qualityScore}/100)
- {/if}
- </span>
+ <BestRef ref={item.bestRef} />
{/if}
</span>
</button>