Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
翻訳待ち
No updates detected yet. GitHub releases will appear here.
Loading the full README. The saved excerpt is shown below.
Beställningsformulär för Business Unit-fredagsluncherna hos Bistrot Lindholmen. Statisk sajt — HTML/CSS/vanilla JS, ingen byggkedja.Read the full README ↗
Beställningsformulär för Business Unit-fredagsluncherna hos Bistrot Lindholmen. Statisk sajt — HTML/CSS/vanilla JS, ingen byggkedja.
index.html — formuläret: välj rätt, namn, allergier.orders.html — "Allas beställningar": antal per rätt, tabell över deltagare
med allergier flaggade, kopiera/mejla-sammanställning till Bistrot, ta bort/rensa.lunch-store.js — delad datakälla för båda sidorna (se nedan).menu.json — reservmeny om Supabase inte är konfigurerat eller inte har
data för aktuell vecka.styles.css — Nocturne-designsystemet (tokens + komponentklasser) hämtat
från designexporten.supabase/functions/import-menu/ — Edge Function som hämtar veckans
fredagsmeny från bistrot.se och sparar den i Supabase, schemalagd måndagar.Detta är produktionsimplementationen av Lunchval.dc.html/Beställningar.dc.html
från Claude Design-handoffen (se chats/ i designbundlen för hela resonemanget
bakom valen).
Sidan använder ES-moduler (import), så den måste köras via en lokal server —
att öppna index.html direkt som en fil (file://) fungerar inte.
npx serve .
# eller
python3 -m http.server 8080
Utan Supabase-konfiguration (se nedan) faller allt tillbaka på localStorage:
sidan fungerar direkt, men beställningarna delas inte mellan personer/enheter —
bra för att testa layouten, inte för skarpt bruk med flera deltagare.
SUPABASE_URL och SUPABASE_ANON_KEY högst upp i lunch-store.js
(anon-nyckeln är avsedd att ligga i klienten — RLS-policyerna nedan är det
som begränsar vad den får göra).create table lunch_orders (
id bigint generated always as identity primary key,
created_at timestamptz not null default now(),
week int not null,
name text not null,
dish text not null,
allergies text default '',
picked_up boolean not null default false
);
alter table lunch_orders enable row level security;
-- alla i nätverket får läsa, lägga till och bocka av "hämtad", men bara innan stopptiden
create policy "läs" on lunch_orders for select using (true);
create policy "lägg till" on lunch_orders for insert with check (true);
create policy "uppdatera" on lunch_orders for update using (true) with check (true);
create policy "ta bort" on lunch_orders for delete using (true);
-- vill du låsa borttagning till en admin: byt sista policyn mot
-- using (auth.role() = 'authenticated')
create table lunch_menu (
week int primary key,
updated_at timestamptz not null default now(),
source text default 'bistrot.se',
groups jsonb not null,
raw text
);
alter table lunch_menu enable row level security;
create policy "läs meny" on lunch_menu for select using (true);
-- skrivning sker från edge-funktionen med service_role-nyckeln (går förbi RLS)
Redan ett projekt igång sen tidigare? picked_up-kolumnen (för avbockning på
beställningssidan) och uppdateringspolicyn fanns inte i den första versionen av
SQL:en ovan. Kör det här en gång i SQL-editorn för att lägga till dem utan att
tappa befintliga rader:
alter table lunch_orders add column if not exists picked_up boolean not null default false;
drop policy if exists "uppdatera" on lunch_orders;
create policy "uppdatera" on lunch_orders for update using (true) with check (true);
Anmälan stänger torsdag kl 13:00 inför kommande fredagslunch — ändra i
DEADLINE i lunch-store.js om tiden ska flyttas. Veckonumret och listan
nollställs automatiskt varje ny fredag (räknas ut från dagens datum, ingen
manuell justering).
Menyn läses i denna ordning: Supabase-tabellen lunch_menu för aktuell
ISO-vecka → menu.json bredvid sidan. Två sätt att hålla den aktuell:
menu.json (eller en rad i lunch_menu) direkt.
Formen är { week, groups: [{ title, items: [{ name, desc, tags }] }] }.
name sparas som beställningens värde, så byt namnet konsekvent på båda
ställena om en rätt döps om efter att någon redan valt den.Två saker körs schemalagt varje måndag för det här projektet
(izfgfzpftfekcxlcskjo):
lunch_orders. Det här är
inget appen behöver — sidan visar redan bara innevarande veckas rader,
så listan "börjar om" automatiskt varje fredag oavsett. Raderingen är
ren datastäd (namn/allergier ligger inte kvar i onödan).import-menu-funktionen hämtar veckans fredagsmeny från
bistrot.se och sparar den i lunch_menu.Tiderna är Europe/Stockholm. pg_cron kör i UTC, så cron-uttrycken nedan
(0 6 * * 1 / 0 7 * * 1) motsvarar 08:00/09:00 svensk sommartid (UTC+2).
När klockan ställs om till vintertid (sista söndagen i oktober) behöver
de här två jobben justeras en timme framåt (0 7 * * 1 / 0 8 * * 1)
och tillbaka igen på våren — kör select cron.alter_job(job_id, schedule := '...') med job_id från select * from cron.job;, eller ta bort och
skapa om jobben.
Kräver Supabase CLI inloggad mot ert konto. Kör från repo-roten:
npm install -g supabase # om du inte redan har CLI:t
supabase login
supabase link --project-ref izfgfzpftfekcxlcskjo
supabase functions deploy import-menu --no-verify-jwt
SUPABASE_URL och SUPABASE_SERVICE_ROLE_KEY finns redan tillgängliga för
funktionen automatiskt — Supabase sätter dem åt dig, inget att konfigurera.
Testa direkt: curl -X POST https://izfgfzpftfekcxlcskjo.supabase.co/functions/v1/import-menu
— svaret ska vara {"ok":true,...} med veckans rätter.
This is the beginning of the README. Read the rest at the original. Read the full README ↗