Add trip checklists with rule-based packing advice
Each trip gets a checklist whose items group under free-text categories (Documents, Clothing, Toiletries, Health, Electronics, Extras first, then any custom ones alphabetically). Items are either shared — every member sees and can tick them, and checked_by records who — or personal to one member, which nobody else can see or touch. Items carry an optional quantity, drag-reorder within their category, and "Uncheck all" resets the list for the trip home. The "Suggestions" modal is deterministic, offline advice derived from the trip itself (src/server/util/packing.js) — no LLM and no external calls, so it stays unit-testable and works on a self-hosted box. Nights scale clothing quantities, flights add liquids/power-bank/check-in, rentals add licence + IDP, ferries add motion-sickness tablets, tropical stops add sun cream and repellent, and the destination country picks the plug type from a bundled ~50-country table. Every suggestion carries a short reason, and already-added ones are keyed by suggestion_key so they can't be duplicated. Two rules deliberately differ from the naive reading, both regression-tested: a latitude floor stops a December trip to Bangkok being tagged cold as well as tropical, and only a flight segment's arrival airport counts, since the first segment's departure airport is home rather than a destination. checklist_items is a new table, so the existing CREATE TABLE IF NOT EXISTS path creates it on upgrade; no MIGRATIONS entry is needed and existing data is untouched. docs/API.md documents the full contract. 113/113 tests pass.
This commit is contained in:
Vendored
+16
@@ -206,3 +206,19 @@ export function enableTripReorder(rows, refresh) {
|
||||
refresh,
|
||||
);
|
||||
}
|
||||
|
||||
// ---------- Checklist: reorder items within a category ----------
|
||||
|
||||
// `rows`: [{ node, handle, item }] — same mechanics as enableRowReorder,
|
||||
// scoped to one category's rows (checklist.js calls this once per category,
|
||||
// so the resulting sort_order values only need to rank correctly within that
|
||||
// category — category is always the primary sort key server-side).
|
||||
export function enableChecklistReorder(rows, refresh) {
|
||||
enableReorder(
|
||||
rows,
|
||||
(item) => item.id,
|
||||
(item) => item.sort_order,
|
||||
(id, sort_order) => api.checklist.update(id, { sort_order }),
|
||||
refresh,
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user