From 6eed909a0db34016bfcf9edd7624df3902252c64 Mon Sep 17 00:00:00 2001 From: JiriUhlir <149317995+JiriUhlir@users.noreply.github.com> Date: Wed, 9 Sep 2026 11:19:04 +0200 Subject: [PATCH] Novy ucet videl na dashboardu chybejici widget Katalog widgetu schovava list.myTickets tomu, kdo ve firme neni veden jako resitel, ale vychozi rozlozeni ho obsahovalo vzdy. Novy ucet nebo nova firma tak videly jako prvni vec hlasku "Widget list.myTickets uz v katalogu neni". getLayout a resetLayout dostavaji stejne hasPerson jako katalog; bez resitele je misto nej list.unassigned pres celou sirku. Co-Authored-By: Claude Fable 5.1 --- documentation/08-dashboard-widgety.md | 5 +++++ documentation/99-zmeny.md | 14 ++++++++++++++ src/data/dashboardLayouts.ts | 23 +++++++++++++++++++---- src/routes/dashboard.ts | 4 ++-- 4 files changed, 40 insertions(+), 6 deletions(-) diff --git a/documentation/08-dashboard-widgety.md b/documentation/08-dashboard-widgety.md index 6d43d6d..fe06d5a 100644 --- a/documentation/08-dashboard-widgety.md +++ b/documentation/08-dashboard-widgety.md @@ -24,6 +24,11 @@ Klic je `${userId}:${tenantId}`, uloziste je `src/data/dashboardLayouts.ts` dostane vychozi rozlozeni a `custom: false`. Ulozene rozlozeni si drzi `createdAt` i po uprave. +Vychozi rozlozeni dostava stejne `hasPerson` jako katalog: kdo ve firme neni +veden jako resitel, nema v katalogu `list.myTickets`, a tak ho nesmi mit ani +ve vychozi sade (misto nej jsou nezarazene tickety pres celou sirku). Jinak +by novy ucet videl jako prvni vec hlasku o widgetu, ktery "uz v katalogu neni". + ## Katalog widgetu `src/data/widgets.ts`, stejny princip jako katalog konektoru: server je zdroj diff --git a/documentation/99-zmeny.md b/documentation/99-zmeny.md index 35abbf6..5995db9 100644 --- a/documentation/99-zmeny.md +++ b/documentation/99-zmeny.md @@ -2,6 +2,20 @@ Nejnovejsi nahore. +## 2026-09-09 - Novy ucet videl na dashboardu chybejici widget + +Kdo se prihlasil do nove firmy (nebo jako nove zalozeny ucet), videl jako +prvni vec na prehledu hlasku "Widget list.myTickets uz v katalogu neni". +Katalog widgetu tenhle widget schovava tomu, kdo ve firme neni veden jako +resitel (nema co ukazat), ale **vychozi rozlozeni ho obsahovalo vzdy**. +Dve pravidla o jedne veci na dvou mistech. + +`getLayout` a `resetLayout` v `dashboardLayouts.ts` dostavaji stejne +`hasPerson` jako katalog a vychozi rozlozeni bez resitele `list.myTickets` +nema; misto nej jsou nezarazene tickety pres celou sirku. Ulozene rozlozeni +se nemeni - kdyz nekomu resitele zrusi, hlaska s tlacitkem "Odebrat" je +spravna, protoze si ten widget na dashboard dal sam. + ## 2026-09-09 - Revize projektu: prava, vykon, runtime, portal a ARES Velka sada oprav napric celym projektem. Zadna nova obrazovka, ale skoro kazda diff --git a/src/data/dashboardLayouts.ts b/src/data/dashboardLayouts.ts index c3413ea..94ab191 100644 --- a/src/data/dashboardLayouts.ts +++ b/src/data/dashboardLayouts.ts @@ -68,8 +68,23 @@ export async function initLayouts(): Promise { } } -export function getLayout(userId: string, tenantId: string): LayoutItem[] { - return layouts.get(key(userId, tenantId))?.items ?? defaultLayout.map((item) => ({ ...item })); +/** + * Rozlozeni uzivatele, nebo vychozi. + * + * `hasPerson` musi byt stejne, jako dostava katalog (`widgetCatalog`): kdo + * neni ve firme veden jako resitel, nema v katalogu `list.myTickets`, a tak + * nesmi byt ani ve vychozim rozlozeni. Jinak novy ucet uvidel jako prvni vec + * na dashboardu hlasku, ze widget "uz v katalogu neni". Misto nej dostane + * nezarazene tickety pres celou sirku, aby radek nezustal poloprazdny. + */ +export function getLayout(userId: string, tenantId: string, hasPerson: boolean): LayoutItem[] { + const saved = layouts.get(key(userId, tenantId))?.items; + if (saved) return saved; + return defaultLayout + .filter((item) => hasPerson || item.widgetId !== 'list.myTickets') + .map((item) => + !hasPerson && item.widgetId === 'list.unassigned' ? { ...item, size: 'full' as const } : { ...item }, + ); } /** true = uzivatel si rozlozeni uz upravil, nekouka na vychozi. */ @@ -91,13 +106,13 @@ export function saveLayout(userId: string, tenantId: string, items: LayoutItem[] } /** Vrati dashboard do vychoziho stavu. */ -export function resetLayout(userId: string, tenantId: string): LayoutItem[] { +export function resetLayout(userId: string, tenantId: string, hasPerson: boolean): LayoutItem[] { const id = key(userId, tenantId); layouts.delete(id); // Vychozi rozlozeni se neuklada, takze vraceni znamena smazat zaznam. mirror.drop(id); console.info(`[layout] ${userId}@${tenantId}: vraceno na vychozi`); - return getLayout(userId, tenantId); + return getLayout(userId, tenantId, hasPerson); } /** diff --git a/src/routes/dashboard.ts b/src/routes/dashboard.ts index f5a5a59..f724948 100644 --- a/src/routes/dashboard.ts +++ b/src/routes/dashboard.ts @@ -299,7 +299,7 @@ dashboardRouter.get('/layout', (req, res) => { return res.json({ tenantId, - items: getLayout(req.user!.id, tenantId), + items: getLayout(req.user!.id, tenantId, accessOf(req).personId !== null), custom: hasCustomLayout(req.user!.id, tenantId), }); }); @@ -341,7 +341,7 @@ dashboardRouter.delete('/layout', (req, res) => { return res.json({ tenantId, - items: resetLayout(req.user!.id, tenantId), + items: resetLayout(req.user!.id, tenantId, accessOf(req).personId !== null), custom: false, }); });