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
+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,
});
});