Skip to content

Commit 30a4a74

Browse files
author
alexandrosnt
committed
Pan project: remove all disabled states, add undo emptied button
1 parent 5405dcb commit 30a4a74

5 files changed

Lines changed: 84 additions & 17 deletions

File tree

src/lib/components/PanItemCard.svelte

Lines changed: 58 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
let {
1919
item,
2020
onMarkEmptied,
21+
onUndoEmptied,
2122
onRemove,
2223
onEdit,
2324
selectMode = false,
@@ -26,6 +27,7 @@
2627
}: {
2728
item: PanItem;
2829
onMarkEmptied?: (id: number) => void;
30+
onUndoEmptied?: (id: number) => void;
2931
onRemove?: (id: number) => void;
3032
onEdit?: (id: number) => void;
3133
selectMode?: boolean;
@@ -84,21 +86,31 @@
8486
<ProgressBar value={percentage} height="8px" />
8587
</div>
8688

87-
{#if onMarkEmptied}
88-
<button
89-
class="mark-emptied-btn"
90-
class:complete={isComplete}
91-
disabled={isComplete}
92-
onclick={() => onMarkEmptied(item.id)}
93-
>
94-
{#if isComplete}
95-
<i class="ri-check-double-line"></i>
96-
{:else}
97-
<i class="ri-check-line"></i>
98-
{/if}
99-
{t.panProject.markEmptied}
100-
</button>
101-
{/if}
89+
<div class="btn-row">
90+
{#if onUndoEmptied && item.emptied > 0}
91+
<button
92+
class="undo-emptied-btn"
93+
onclick={() => onUndoEmptied(item.id)}
94+
>
95+
<i class="ri-arrow-go-back-line"></i>
96+
{t.panProject.undoEmptied}
97+
</button>
98+
{/if}
99+
{#if onMarkEmptied}
100+
<button
101+
class="mark-emptied-btn"
102+
class:complete={isComplete}
103+
onclick={() => onMarkEmptied(item.id)}
104+
>
105+
{#if isComplete}
106+
<i class="ri-check-double-line"></i>
107+
{:else}
108+
<i class="ri-check-line"></i>
109+
{/if}
110+
{t.panProject.markEmptied}
111+
</button>
112+
{/if}
113+
</div>
102114
</div>
103115

104116
<style>
@@ -212,8 +224,38 @@
212224
color: var(--text-soft);
213225
}
214226
227+
.btn-row {
228+
display: flex;
229+
gap: 8px;
230+
}
231+
232+
.undo-emptied-btn {
233+
flex: 0 0 auto;
234+
padding: 10px 14px;
235+
border: 1px solid rgba(0, 0, 0, 0.06);
236+
border-radius: 50px;
237+
background: white;
238+
font-family: 'Poppins', sans-serif;
239+
font-size: 13px;
240+
font-weight: 600;
241+
color: var(--text-soft);
242+
cursor: pointer;
243+
display: flex;
244+
align-items: center;
245+
justify-content: center;
246+
gap: 6px;
247+
transition: 0.2s;
248+
-webkit-tap-highlight-color: transparent;
249+
touch-action: manipulation;
250+
}
251+
252+
.undo-emptied-btn:active {
253+
transform: scale(0.98);
254+
background: #f5f5f5;
255+
}
256+
215257
.mark-emptied-btn {
216-
width: 100%;
258+
flex: 1;
217259
padding: 10px;
218260
border: 1px solid rgba(0, 0, 0, 0.06);
219261
border-radius: 50px;

src/lib/db/queries.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1951,6 +1951,22 @@ export async function markPanItemEmptied(panItemId: number): Promise<void> {
19511951
});
19521952
}
19531953

1954+
export async function undoPanItemEmptied(panItemId: number): Promise<void> {
1955+
const db = getDb();
1956+
// Decrement emptied count (min 0)
1957+
await db.execute({
1958+
sql: 'UPDATE pan_project_items SET emptied = MAX(emptied - 1, 0) WHERE id = ?',
1959+
args: [panItemId]
1960+
});
1961+
// If the inventory item was auto-marked used_up, reactivate it
1962+
await db.execute({
1963+
sql: `UPDATE items SET status = 'active', used_up_at = NULL
1964+
WHERE id = (SELECT item_id FROM pan_project_items WHERE id = ? AND emptied < quantity)
1965+
AND status = 'used_up'`,
1966+
args: [panItemId]
1967+
});
1968+
}
1969+
19541970
export async function removePanItem(userId: number, panItemId: number): Promise<void> {
19551971
const db = getDb();
19561972
await db.execute({

src/lib/i18n/de.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,7 @@ const de = {
336336
editQuantity: 'Menge bearbeiten',
337337
save: 'Speichern',
338338
saving: 'Speichern...',
339+
undoEmptied: 'Rückgängig',
339340
},
340341
shoppingList: {
341342
title: 'Einkaufsliste',

src/lib/i18n/en.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,7 @@ const en = {
336336
editQuantity: 'Edit Quantity',
337337
save: 'Save',
338338
saving: 'Saving...',
339+
undoEmptied: 'Undo',
339340
},
340341
shoppingList: {
341342
title: 'Shopping List',

src/routes/pan-project/+page.svelte

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import PanItemCard from '$lib/components/PanItemCard.svelte';
66
import SelectModeButton from '$lib/components/SelectModeButton.svelte';
77
import SelectionBar from '$lib/components/SelectionBar.svelte';
8-
import { getPanItems, getPanProjectStats, markPanItemEmptied, removePanItem, removePanItems, updatePanItem, type PanProjectItem, type PanProjectStats } from '$lib/db/queries';
8+
import { getPanItems, getPanProjectStats, markPanItemEmptied, undoPanItemEmptied, removePanItem, removePanItems, updatePanItem, type PanProjectItem, type PanProjectStats } from '$lib/db/queries';
99
import { getAuthState } from '$lib/stores/auth.svelte';
1010
import { getRefreshSignal, triggerRefresh } from '$lib/stores/refresh.svelte';
1111
import { t } from '$lib/i18n/index.svelte';
@@ -96,6 +96,12 @@
9696
await loadData();
9797
}
9898
99+
async function handleUndoEmptied(panItemId: number) {
100+
await undoPanItemEmptied(panItemId);
101+
triggerRefresh();
102+
await loadData();
103+
}
104+
99105
async function handleRemove(panItemId: number) {
100106
const userId = auth.currentUser?.id;
101107
if (!userId) return;
@@ -194,6 +200,7 @@
194200
<PanItemCard
195201
{item}
196202
onMarkEmptied={selectMode ? undefined : handleMarkEmptied}
203+
onUndoEmptied={selectMode ? undefined : handleUndoEmptied}
197204
onRemove={selectMode ? undefined : handleRemove}
198205
onEdit={selectMode ? undefined : startEdit}
199206
{selectMode}

0 commit comments

Comments
 (0)