From 80429cd52af7048c71f8ee1b38b1230b23fd1b32 Mon Sep 17 00:00:00 2001 From: HotelSync Date: Mon, 20 Apr 2026 10:42:05 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20home=20page=20per=20role=20=E2=80=94=20?= =?UTF-8?q?selector=20in=20RolesTab,=20saved=20to=20DB=20and=20applied=20o?= =?UTF-8?q?n=20login?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- src/lib/api.ts | 2 +- src/pages/UsersPage.tsx | 73 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/src/lib/api.ts b/src/lib/api.ts index 9930f74..b59259c 100644 --- a/src/lib/api.ts +++ b/src/lib/api.ts @@ -309,7 +309,7 @@ export const api = { 'GET', `/api/hotels/${slug}/role-permissions`), save: (slug: string, roleKey: string, data: { - name: string; color: string; isSystem: boolean; permissions: Record + name: string; color: string; isSystem: boolean; permissions: Record; homePage?: string | null }) => req( 'PUT', `/api/hotels/${slug}/role-permissions/${roleKey}`, data), diff --git a/src/pages/UsersPage.tsx b/src/pages/UsersPage.tsx index 5f07441..f2bb86c 100644 --- a/src/pages/UsersPage.tsx +++ b/src/pages/UsersPage.tsx @@ -41,6 +41,7 @@ interface RolePermissions { color: string isSystem: boolean permissions: Record + homePage?: string | null } // ── Constants ────────────────────────────────────────────────────────────────── @@ -134,6 +135,36 @@ const ALL_MODULE_KEYS = MODULE_GROUPS.flatMap(g => g.modules.map(m => m.key)) const allPerms = (v: boolean) => Object.fromEntries(ALL_MODULE_KEYS.map(k => [k, v])) +// Permission key → route path (for home page selector) +const PERM_TO_ROUTE: Record = { + calendar: '/calendar', + bookings: '/bookings', + guests: '/guests', + rooms: '/rooms', + availability: '/availability', + housekeeping: '/housekeeping', + maintenance: '/maintenance', + room_service: '/room-service', + rental: '/rental', + pos: '/pos', + tariffs: '/tariffs', + pricing: '/dynamic-pricing', + discounts: '/discounts', + loyalty: '/loyalty', + reports: '/reports', + channels: '/channels', + reviews: '/reviews', + website: '/website', + floor_map: '/floor-map', + equipment: '/equipment', + wifi: '/wifi', + ttlock: '/ttlock', + users: '/users', + schedule: '/schedule', + documents: '/documents', + settings: '/settings', +} + const INITIAL_ROLE_PERMISSIONS: RolePermissions[] = [ { id: 'rp_hotel_admin', @@ -492,7 +523,7 @@ function RolesTab() { if (!s) return def // Ensure all module keys are present (new modules default to false) const fullPerms = { ...allPerms(false), ...s.permissions } - return { ...def, permissions: fullPerms } + return { ...def, permissions: fullPerms, homePage: s.homePage ?? def.homePage } }) // Custom roles (not in system list) @@ -505,6 +536,7 @@ function RolesTab() { color: r.color, isSystem: false, permissions: { ...allPerms(false), ...r.permissions }, + homePage: r.homePage ?? null, })) setRoles([...merged, ...custom]) @@ -534,6 +566,12 @@ function RolesTab() { )) } + const setHomePage = (page: string | null) => { + setRoles(prev => prev.map(r => + r.id === selectedRoleId ? { ...r, homePage: page } : r + )) + } + // ── Save to API ──────────────────────────────────────────────────────────── const handleSave = async () => { if (!slug || saving) return @@ -546,6 +584,7 @@ function RolesTab() { color: role.color, isSystem: role.isSystem, permissions: role.permissions, + homePage: role.homePage ?? null, }) })) setSaveOk(true) @@ -786,6 +825,38 @@ function RolesTab() { ))} + {/* Home page selector */} +
+
+
+

+ Стартовая страница +

+

+ Страница, которая открывается при входе в систему +

+
+
+ +
+ {selectedRole.isSystem && (