feat(housekeeping): add per-hotel theme manager with import/export and background
CI / check (push) Failing after 20s
CI / preflight (push) Skipped
CI / deploy (push) Skipped

Theme Manager under /admin-next/hotel/theme-manager lets the owner save, apply, rename, delete, import, and export custom themes, plus set a custom site background by URL or upload. Themes are stored in WebsiteSetting/custom_themes JSON so they survive CMS updates.
This commit is contained in:
openhands committed 2026-09-16 19:45:57 +02:00
1 parent 55c13b533c
commit 5b4b275b2a
13 files changed
+1376 -1

No files matched your search

@@ -21,6 +21,12 @@ export const hotelManifest = {
PERMS.CATALOG_EDIT,
),
routes: [
{
id: "theme-manager",
labelKey: "pages.housekeeping.domains.hotel.routes.themeManager",
href: "/admin-next/hotel/theme-manager",
capability: anyCapability(PERMS.SETTINGS_VIEW, PERMS.SETTINGS_EDIT),
},
{
id: "nitro-cleanup",
labelKey: "pages.housekeeping.domains.hotel.routes.nitroCleanup",
@@ -580,6 +580,11 @@ describe("housekeeping foundation completion contracts", () => {
expect(
registry.domains.find((domain) => domain.id === "hotel")?.routes,
).toEqual([
expect.objectContaining({
id: "theme-manager",
href: "/admin-next/hotel/theme-manager",
labelKey: "pages.housekeeping.domains.hotel.routes.themeManager",
}),
expect.objectContaining({
id: "nitro-cleanup",
href: "/admin-next/hotel/nitro-cleanup",
@@ -166,6 +166,15 @@ const expectedManifests = [
PERMS.CATALOG_EDIT,
],
routes: [
{
id: "theme-manager",
labelKey: "pages.housekeeping.domains.hotel.routes.themeManager",
href: "/admin-next/hotel/theme-manager",
capability: {
mode: "any",
slugs: [PERMS.SETTINGS_VIEW, PERMS.SETTINGS_EDIT],
},
},
{
id: "nitro-cleanup",
labelKey: "pages.housekeeping.domains.hotel.routes.nitroCleanup",