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 <noreply@anthropic.com>
This commit is contained in:
JiriUhlir
2026-09-09 11:19:04 +02:00
co-authored by Claude Fable 5.1
parent 104ae36783
commit 6eed909a0d
4 changed files with 40 additions and 6 deletions
+5
View File
@@ -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
+14
View File
@@ -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
+19 -4
View File
@@ -68,8 +68,23 @@ export async function initLayouts(): Promise<void> {
}
}
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);
}
/**
+2 -2
View File
@@ -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,
});
});