Files
edr-platform/apps/edr-freight-web/backoffice/src/services/overview.service.ts
ghost2023 503ea30f58 feat(overview): resolve dashboard layout from permissions, not role keys
role-dashboards.config.ts's ROLE_LAYOUTS was a hand-typed table of ~40
raw role/position keys (including edr_freight_app/xxx ad-hoc
sub-positions), matched against the user's held keys client-side.
Replaced with resolveOverviewLayout(), which just picks the
highest-priority key out of whatever GET /overview/layouts returns —
the same 'server filters by permission, frontend renders what comes
back' shape Reports already uses, so the frontend no longer needs to
know any individual permission key.

Hard cutover: no fallback to the old key table. Positions not covered
by the previous commit's grants (the ad-hoc department sub-positions)
will render the executive layout until granted a layout permission.
2026-08-21 15:43:44 +03:00

97 lines
3.1 KiB
TypeScript

import { api as client } from "../auth/http";
import { unwrap } from "@/utils/endpoint";
import { URL_CONSTANTS } from "@/constants/URLS";
import type { OverviewLayoutKey } from "@/components/overview/role-dashboards.config";
import type {
IOverviewBillingTab,
IOverviewBookingsTab,
IOverviewClearanceTab,
IOverviewContractsTab,
IOverviewCustomersTab,
IOverviewDashboard,
IOverviewFleetTab,
IOverviewOperationsTab,
IOverviewStaffTab,
OverviewRange,
} from "@/types/overview";
const O = URL_CONSTANTS.OVERVIEW;
/** Mirrors the API's OverviewLayoutDto — one entry per GET /overview/layouts item. */
export interface IOverviewLayoutOption {
key: OverviewLayoutKey;
label: string;
}
export const overviewService = {
/** Layouts the caller has permission to render, in server priority order. */
getLayouts: async (): Promise<IOverviewLayoutOption[]> => {
const response = await client.get<IOverviewLayoutOption[]>(O.LAYOUTS);
return unwrap(response);
},
getDashboard: async (range?: OverviewRange): Promise<IOverviewDashboard> => {
const response = await client.get<IOverviewDashboard>(O.BASE, {
params: range ? { range } : undefined,
});
return unwrap(response);
},
getBookingsTab: async (range?: OverviewRange): Promise<IOverviewBookingsTab> => {
const response = await client.get<IOverviewBookingsTab>(O.BOOKINGS, {
params: range ? { range } : undefined,
});
return unwrap(response);
},
getContractsTab: async (range?: OverviewRange): Promise<IOverviewContractsTab> => {
const response = await client.get<IOverviewContractsTab>(O.CONTRACTS, {
params: range ? { range } : undefined,
});
return unwrap(response);
},
getBillingTab: async (range?: OverviewRange): Promise<IOverviewBillingTab> => {
const response = await client.get<IOverviewBillingTab>(O.BILLING, {
params: range ? { range } : undefined,
});
return unwrap(response);
},
getOperationsTab: async (
range?: OverviewRange,
): Promise<IOverviewOperationsTab> => {
const response = await client.get<IOverviewOperationsTab>(O.OPERATIONS, {
params: range ? { range } : undefined,
});
return unwrap(response);
},
getFleetTab: async (range?: OverviewRange): Promise<IOverviewFleetTab> => {
const response = await client.get<IOverviewFleetTab>(O.FLEET, {
params: range ? { range } : undefined,
});
return unwrap(response);
},
/** Document + invoice queues; not range-scoped — these are open work items. */
getClearanceTab: async (): Promise<IOverviewClearanceTab> => {
const response = await client.get<IOverviewClearanceTab>(O.CLEARANCE);
return unwrap(response);
},
getCustomersTab: async (range?: OverviewRange): Promise<IOverviewCustomersTab> => {
const response = await client.get<IOverviewCustomersTab>(O.CUSTOMERS, {
params: range ? { range } : undefined,
});
return unwrap(response);
},
getStaffTab: async (range?: OverviewRange): Promise<IOverviewStaffTab> => {
const response = await client.get<IOverviewStaffTab>(O.STAFF, {
params: range ? { range } : undefined,
});
return unwrap(response);
},
};