@voyant-travel/admin 0.111.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +285 -0
- package/dist/app/extension-routes.d.ts +99 -0
- package/dist/app/extension-routes.d.ts.map +1 -0
- package/dist/app/extension-routes.js +134 -0
- package/dist/app/index.d.ts +9 -0
- package/dist/app/index.d.ts.map +1 -0
- package/dist/app/index.js +4 -0
- package/dist/app/root.d.ts +47 -0
- package/dist/app/root.d.ts.map +1 -0
- package/dist/app/root.js +55 -0
- package/dist/app/router.d.ts +30 -0
- package/dist/app/router.d.ts.map +1 -0
- package/dist/app/router.js +51 -0
- package/dist/app/workspace.d.ts +84 -0
- package/dist/app/workspace.d.ts.map +1 -0
- package/dist/app/workspace.js +87 -0
- package/dist/components/admin-breadcrumbs.d.ts +18 -0
- package/dist/components/admin-breadcrumbs.d.ts.map +1 -0
- package/dist/components/admin-breadcrumbs.js +84 -0
- package/dist/components/admin-nav-group.d.ts +11 -0
- package/dist/components/admin-nav-group.d.ts.map +1 -0
- package/dist/components/admin-nav-group.js +49 -0
- package/dist/components/admin-nav-link.d.ts +10 -0
- package/dist/components/admin-nav-link.d.ts.map +1 -0
- package/dist/components/admin-nav-link.js +5 -0
- package/dist/components/admin-page-head.d.ts +17 -0
- package/dist/components/admin-page-head.d.ts.map +1 -0
- package/dist/components/admin-page-head.js +107 -0
- package/dist/components/admin-widget-slot.d.ts +8 -0
- package/dist/components/admin-widget-slot.d.ts.map +1 -0
- package/dist/components/admin-widget-slot.js +19 -0
- package/dist/components/brand/voyant-mark.d.ts +3 -0
- package/dist/components/brand/voyant-mark.d.ts.map +1 -0
- package/dist/components/brand/voyant-mark.js +4 -0
- package/dist/components/brand/voyant-wordmark.d.ts +3 -0
- package/dist/components/brand/voyant-wordmark.d.ts.map +1 -0
- package/dist/components/brand/voyant-wordmark.js +4 -0
- package/dist/components/operator-admin-bootstrap-gate.d.ts +26 -0
- package/dist/components/operator-admin-bootstrap-gate.d.ts.map +1 -0
- package/dist/components/operator-admin-bootstrap-gate.js +22 -0
- package/dist/components/operator-admin-page-shell.d.ts +13 -0
- package/dist/components/operator-admin-page-shell.d.ts.map +1 -0
- package/dist/components/operator-admin-page-shell.js +6 -0
- package/dist/components/operator-admin-sidebar.d.ts +57 -0
- package/dist/components/operator-admin-sidebar.d.ts.map +1 -0
- package/dist/components/operator-admin-sidebar.js +104 -0
- package/dist/components/operator-admin-user-menu.d.ts +10 -0
- package/dist/components/operator-admin-user-menu.d.ts.map +1 -0
- package/dist/components/operator-admin-user-menu.js +19 -0
- package/dist/components/team-settings-page.d.ts +10 -0
- package/dist/components/team-settings-page.d.ts.map +1 -0
- package/dist/components/team-settings-page.js +149 -0
- package/dist/dashboard/dashboard-empty-states.d.ts +67 -0
- package/dist/dashboard/dashboard-empty-states.d.ts.map +1 -0
- package/dist/dashboard/dashboard-empty-states.js +65 -0
- package/dist/dashboard/dashboard-kpi-card.d.ts +13 -0
- package/dist/dashboard/dashboard-kpi-card.d.ts.map +1 -0
- package/dist/dashboard/dashboard-kpi-card.js +12 -0
- package/dist/dashboard/dashboard-page.d.ts +7 -0
- package/dist/dashboard/dashboard-page.d.ts.map +1 -0
- package/dist/dashboard/dashboard-page.js +150 -0
- package/dist/dashboard/dashboard-query-options.d.ts +224 -0
- package/dist/dashboard/dashboard-query-options.d.ts.map +1 -0
- package/dist/dashboard/dashboard-query-options.js +153 -0
- package/dist/dashboard/dashboard-skeleton.d.ts +13 -0
- package/dist/dashboard/dashboard-skeleton.d.ts.map +1 -0
- package/dist/dashboard/dashboard-skeleton.js +28 -0
- package/dist/extensions.d.ts +254 -0
- package/dist/extensions.d.ts.map +1 -0
- package/dist/extensions.js +139 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/lib/i18n.d.ts +2 -0
- package/dist/lib/i18n.d.ts.map +1 -0
- package/dist/lib/i18n.js +1 -0
- package/dist/lib/initials.d.ts +24 -0
- package/dist/lib/initials.d.ts.map +1 -0
- package/dist/lib/initials.js +45 -0
- package/dist/navigation/destinations.d.ts +83 -0
- package/dist/navigation/destinations.d.ts.map +1 -0
- package/dist/navigation/destinations.js +65 -0
- package/dist/navigation/operator-navigation.d.ts +10 -0
- package/dist/navigation/operator-navigation.d.ts.map +1 -0
- package/dist/navigation/operator-navigation.js +191 -0
- package/dist/providers/admin-extensions.d.ts +9 -0
- package/dist/providers/admin-extensions.d.ts.map +1 -0
- package/dist/providers/admin-extensions.js +10 -0
- package/dist/providers/admin-provider.d.ts +53 -0
- package/dist/providers/admin-provider.d.ts.map +1 -0
- package/dist/providers/admin-provider.js +26 -0
- package/dist/providers/locale-preferences.d.ts +12 -0
- package/dist/providers/locale-preferences.d.ts.map +1 -0
- package/dist/providers/locale-preferences.js +32 -0
- package/dist/providers/locale.d.ts +23 -0
- package/dist/providers/locale.d.ts.map +1 -0
- package/dist/providers/locale.js +98 -0
- package/dist/providers/operator-admin-messages.d.ts +14 -0
- package/dist/providers/operator-admin-messages.d.ts.map +1 -0
- package/dist/providers/operator-admin-messages.js +16 -0
- package/dist/providers/operator-admin-shell.d.ts +35 -0
- package/dist/providers/operator-admin-shell.d.ts.map +1 -0
- package/dist/providers/operator-admin-shell.js +20 -0
- package/dist/providers/query-client.d.ts +19 -0
- package/dist/providers/query-client.d.ts.map +1 -0
- package/dist/providers/query-client.js +34 -0
- package/dist/providers/theme.d.ts +29 -0
- package/dist/providers/theme.d.ts.map +1 -0
- package/dist/providers/theme.js +63 -0
- package/dist/types.d.ts +60 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/package.json +222 -0
- package/src/styles.css +11 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type NavItem } from "../types.js";
|
|
2
|
+
import { type AdminNavLinkComponent } from "./admin-nav-link.js";
|
|
3
|
+
export interface AdminNavGroupProps {
|
|
4
|
+
className?: string;
|
|
5
|
+
currentPath: string;
|
|
6
|
+
items: ReadonlyArray<NavItem>;
|
|
7
|
+
label?: string;
|
|
8
|
+
linkComponent?: AdminNavLinkComponent;
|
|
9
|
+
}
|
|
10
|
+
export declare function AdminNavGroup({ className, currentPath, items, label, linkComponent: LinkComponent, }: AdminNavGroupProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=admin-nav-group.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-nav-group.d.ts","sourceRoot":"","sources":["../../src/components/admin-nav-group.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAA0B,KAAK,OAAO,EAAE,MAAM,aAAa,CAAA;AAClE,OAAO,EAAE,KAAK,qBAAqB,EAAuB,MAAM,qBAAqB,CAAA;AAErF,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,qBAAqB,CAAA;CACtC;AAqCD,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,WAAW,EACX,KAAK,EACL,KAAK,EACL,aAAa,EAAE,aAAmC,GACnD,EAAE,kBAAkB,2CA0GpB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Badge, cn, SidebarGroup, SidebarGroupLabel, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, useSidebar, } from "@voyant-travel/ui/components";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { COMING_SOON } from "../types.js";
|
|
6
|
+
import { DefaultAdminNavLink } from "./admin-nav-link.js";
|
|
7
|
+
function isExternalUrl(url) {
|
|
8
|
+
return url.startsWith("http://") || url.startsWith("https://");
|
|
9
|
+
}
|
|
10
|
+
function isActivePath(currentPath, url) {
|
|
11
|
+
if (url === "/") {
|
|
12
|
+
return currentPath === "/";
|
|
13
|
+
}
|
|
14
|
+
if (currentPath.startsWith(url)) {
|
|
15
|
+
const nextChar = currentPath.charAt(url.length);
|
|
16
|
+
return nextChar === "/" || nextChar === "" || currentPath === url;
|
|
17
|
+
}
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
function renderBadge(status) {
|
|
21
|
+
if (!status)
|
|
22
|
+
return null;
|
|
23
|
+
if (status === COMING_SOON) {
|
|
24
|
+
return (_jsx(Badge, { variant: "outline", className: "ml-auto text-xs", children: "Soon" }));
|
|
25
|
+
}
|
|
26
|
+
return (_jsx(Badge, { variant: "secondary", className: "ml-auto text-xs", children: "Beta" }));
|
|
27
|
+
}
|
|
28
|
+
export function AdminNavGroup({ className, currentPath, items, label, linkComponent: LinkComponent = DefaultAdminNavLink, }) {
|
|
29
|
+
const { isMobile, setOpenMobile } = useSidebar();
|
|
30
|
+
const handleLinkClick = () => {
|
|
31
|
+
if (isMobile) {
|
|
32
|
+
setOpenMobile(false);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
return (_jsxs(SidebarGroup, { className: className, children: [label && _jsx(SidebarGroupLabel, { children: label }), _jsx(SidebarMenu, { children: items.map((item) => {
|
|
36
|
+
const key = item.id ?? item.url ?? item.title;
|
|
37
|
+
const icon = item.icon ? React.createElement(item.icon, { className: "h-4 w-4" }) : null;
|
|
38
|
+
if (item.items?.length) {
|
|
39
|
+
const parentActive = isActivePath(currentPath, item.url);
|
|
40
|
+
const anyChildActive = item.items.some((sub) => isActivePath(currentPath, sub.url));
|
|
41
|
+
const expanded = parentActive || anyChildActive;
|
|
42
|
+
return (_jsxs(SidebarMenuItem, { children: [_jsx(SidebarMenuButton, { asChild: true, tooltip: item.title, isActive: parentActive, children: _jsxs(LinkComponent, { href: item.url, onClick: handleLinkClick, target: item.target ?? "_self", children: [icon, _jsx("span", { children: item.title }), renderBadge(item.status)] }) }), expanded && (_jsx(SidebarMenuSub, { children: item.items.map((subItem) => (_jsx(SidebarMenuSubItem, { children: subItem.status === COMING_SOON ? (_jsxs(SidebarMenuSubButton, { className: cn(subItem.status === COMING_SOON && "opacity-50"), children: [_jsx("span", { children: subItem.title }), renderBadge(subItem.status)] })) : (_jsx(SidebarMenuSubButton, { asChild: true, isActive: !isExternalUrl(subItem.url) && isActivePath(currentPath, subItem.url), children: _jsxs(LinkComponent, { href: subItem.url, onClick: handleLinkClick, target: subItem.target ?? "_self", children: [_jsx("span", { children: subItem.title }), renderBadge(subItem.status)] }) })) }, subItem.id ?? subItem.url ?? subItem.title))) }))] }, key));
|
|
43
|
+
}
|
|
44
|
+
if (item.status === COMING_SOON) {
|
|
45
|
+
return (_jsx(SidebarMenuItem, { children: _jsxs(SidebarMenuButton, { tooltip: item.title, disabled: true, children: [icon, _jsx("span", { children: item.title }), renderBadge(item.status)] }) }, key));
|
|
46
|
+
}
|
|
47
|
+
return (_jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { asChild: true, tooltip: item.title, isActive: !isExternalUrl(item.url) && isActivePath(currentPath, item.url), children: _jsxs(LinkComponent, { href: item.url, onClick: handleLinkClick, target: item.target ?? "_self", children: [icon, _jsx("span", { children: item.title }), renderBadge(item.status)] }) }) }, key));
|
|
48
|
+
}) })] }));
|
|
49
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
export interface AdminNavLinkProps extends Omit<React.ComponentPropsWithoutRef<"a">, "href" | "onClick" | "target"> {
|
|
3
|
+
children: React.ReactNode;
|
|
4
|
+
href: string;
|
|
5
|
+
onClick?: () => void;
|
|
6
|
+
target?: "_self" | "_blank";
|
|
7
|
+
}
|
|
8
|
+
export type AdminNavLinkComponent = React.ComponentType<AdminNavLinkProps>;
|
|
9
|
+
export declare function DefaultAdminNavLink({ "aria-label": ariaLabel, children, href, onClick, target, ...props }: AdminNavLinkProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=admin-nav-link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-nav-link.d.ts","sourceRoot":"","sources":["../../src/components/admin-nav-link.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAEnC,MAAM,WAAW,iBACf,SAAQ,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;IAChF,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;CAC5B;AAED,MAAM,MAAM,qBAAqB,GAAG,KAAK,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAA;AAE1E,wBAAgB,mBAAmB,CAAC,EAClC,YAAY,EAAE,SAAS,EACvB,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,MAAM,EACN,GAAG,KAAK,EACT,EAAE,iBAAiB,2CAanB"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
export function DefaultAdminNavLink({ "aria-label": ariaLabel, children, href, onClick, target, ...props }) {
|
|
4
|
+
return (_jsx("a", { href: href, "aria-label": ariaLabel, target: target, rel: target === "_blank" ? "noopener noreferrer" : undefined, onClick: onClick, ...props, children: children }));
|
|
5
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
export interface AdminPageHeadOptions {
|
|
3
|
+
brand?: string | null;
|
|
4
|
+
description?: string | null;
|
|
5
|
+
title?: string | null;
|
|
6
|
+
}
|
|
7
|
+
export interface AdminPageHeadProps extends AdminPageHeadOptions {
|
|
8
|
+
children?: React.ReactNode;
|
|
9
|
+
}
|
|
10
|
+
export interface AdminPageHeadProviderProps {
|
|
11
|
+
baseHead?: AdminPageHeadOptions | null;
|
|
12
|
+
children: React.ReactNode;
|
|
13
|
+
}
|
|
14
|
+
export declare function AdminPageHead({ children, ...head }: AdminPageHeadProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export declare function AdminPageHeadProvider({ baseHead, children }: AdminPageHeadProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export declare function useAdminPageHead(head: AdminPageHeadOptions): void;
|
|
17
|
+
//# sourceMappingURL=admin-page-head.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-page-head.d.ts","sourceRoot":"","sources":["../../src/components/admin-page-head.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAKnC,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB;IAC9D,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC3B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAA;IACtC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AA4FD,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,kBAAkB,2CAItE;AAED,wBAAgB,qBAAqB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,0BAA0B,2CA+BvF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,QA0B1D"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, useContext, useEffect, useId, useMemo, useState } from "react";
|
|
4
|
+
import { DEFAULT_ADMIN_LOCALE, useLocale } from "../providers/locale.js";
|
|
5
|
+
const AdminPageHeadContext = createContext(null);
|
|
6
|
+
function formatAdminDocumentTitle({ brand, title, }) {
|
|
7
|
+
const resolvedBrand = brand?.trim() || "Voyant";
|
|
8
|
+
const resolvedTitle = title?.trim();
|
|
9
|
+
return resolvedTitle ? `${resolvedTitle} · ${resolvedBrand}` : resolvedBrand;
|
|
10
|
+
}
|
|
11
|
+
function upsertMeta(selector, attributes, content) {
|
|
12
|
+
let element = document.head.querySelector(selector);
|
|
13
|
+
if (!element) {
|
|
14
|
+
element = document.createElement("meta");
|
|
15
|
+
for (const [name, value] of Object.entries(attributes)) {
|
|
16
|
+
element.setAttribute(name, value);
|
|
17
|
+
}
|
|
18
|
+
document.head.appendChild(element);
|
|
19
|
+
}
|
|
20
|
+
element.content = content;
|
|
21
|
+
}
|
|
22
|
+
function removeMeta(selector) {
|
|
23
|
+
document.head.querySelector(selector)?.remove();
|
|
24
|
+
}
|
|
25
|
+
function useApplyAdminPageHead({ brand, description, enabled = true, title, }) {
|
|
26
|
+
const { resolvedLocale } = useLocale();
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
if (!enabled || typeof document === "undefined") {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const lang = resolvedLocale || DEFAULT_ADMIN_LOCALE;
|
|
32
|
+
if (document.documentElement.lang !== lang) {
|
|
33
|
+
document.documentElement.lang = lang;
|
|
34
|
+
}
|
|
35
|
+
}, [enabled, resolvedLocale]);
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
if (!enabled || typeof document === "undefined") {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const documentTitle = formatAdminDocumentTitle({ brand, title });
|
|
41
|
+
document.title = documentTitle;
|
|
42
|
+
upsertMeta('meta[property="og:title"]', { property: "og:title" }, documentTitle);
|
|
43
|
+
}, [brand, enabled, title]);
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
if (!enabled || typeof document === "undefined") {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (description == null) {
|
|
49
|
+
removeMeta('meta[name="description"]');
|
|
50
|
+
removeMeta('meta[property="og:description"]');
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
upsertMeta('meta[name="description"]', { name: "description" }, description);
|
|
54
|
+
upsertMeta('meta[property="og:description"]', { property: "og:description" }, description);
|
|
55
|
+
}, [description, enabled]);
|
|
56
|
+
}
|
|
57
|
+
function mergeAdminPageHead(baseHead, override) {
|
|
58
|
+
return {
|
|
59
|
+
brand: override?.brand ?? baseHead?.brand ?? "Voyant",
|
|
60
|
+
description: override?.description ?? baseHead?.description ?? null,
|
|
61
|
+
title: override?.title ?? baseHead?.title ?? null,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export function AdminPageHead({ children, ...head }) {
|
|
65
|
+
useApplyAdminPageHead(head);
|
|
66
|
+
return _jsx(_Fragment, { children: children ?? null });
|
|
67
|
+
}
|
|
68
|
+
export function AdminPageHeadProvider({ baseHead, children }) {
|
|
69
|
+
const [overrides, setOverrides] = useState(() => new Map());
|
|
70
|
+
const latestOverride = Array.from(overrides.values()).at(-1);
|
|
71
|
+
const resolvedHead = mergeAdminPageHead(baseHead, latestOverride);
|
|
72
|
+
const context = useMemo(() => ({
|
|
73
|
+
setPageHeadOverride(id, head) {
|
|
74
|
+
setOverrides((currentOverrides) => {
|
|
75
|
+
const nextOverrides = new Map(currentOverrides);
|
|
76
|
+
if (head) {
|
|
77
|
+
nextOverrides.set(id, head);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
nextOverrides.delete(id);
|
|
81
|
+
}
|
|
82
|
+
return nextOverrides;
|
|
83
|
+
});
|
|
84
|
+
},
|
|
85
|
+
}), []);
|
|
86
|
+
return (_jsxs(AdminPageHeadContext.Provider, { value: context, children: [_jsx(AdminPageHead, { ...resolvedHead }), children] }));
|
|
87
|
+
}
|
|
88
|
+
export function useAdminPageHead(head) {
|
|
89
|
+
const context = useContext(AdminPageHeadContext);
|
|
90
|
+
const id = useId();
|
|
91
|
+
const stableHead = useMemo(() => ({
|
|
92
|
+
brand: head.brand,
|
|
93
|
+
description: head.description,
|
|
94
|
+
title: head.title,
|
|
95
|
+
}), [head.brand, head.description, head.title]);
|
|
96
|
+
useEffect(() => {
|
|
97
|
+
if (!context) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
context.setPageHeadOverride(id, stableHead);
|
|
101
|
+
return () => context.setPageHeadOverride(id, null);
|
|
102
|
+
}, [context, id, stableHead]);
|
|
103
|
+
useApplyAdminPageHead({
|
|
104
|
+
...stableHead,
|
|
105
|
+
enabled: context == null,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type AdminExtension, type AdminWidgetSlot } from "../extensions.js";
|
|
2
|
+
export interface AdminWidgetSlotRendererProps {
|
|
3
|
+
extensions?: ReadonlyArray<AdminExtension>;
|
|
4
|
+
props?: Record<string, unknown>;
|
|
5
|
+
slot: AdminWidgetSlot;
|
|
6
|
+
}
|
|
7
|
+
export declare function AdminWidgetSlotRenderer({ extensions, props, slot, }: AdminWidgetSlotRendererProps): import("react/jsx-runtime").JSX.Element | null;
|
|
8
|
+
//# sourceMappingURL=admin-widget-slot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-widget-slot.d.ts","sourceRoot":"","sources":["../../src/components/admin-widget-slot.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAuB,MAAM,kBAAkB,CAAA;AAGjG,MAAM,WAAW,4BAA4B;IAC3C,UAAU,CAAC,EAAE,aAAa,CAAC,cAAc,CAAC,CAAA;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,IAAI,EAAE,eAAe,CAAA;CACtB;AAED,wBAAgB,uBAAuB,CAAC,EACtC,UAAU,EACV,KAAU,EACV,IAAI,GACL,EAAE,4BAA4B,kDAwB9B"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { Fragment } from "react";
|
|
4
|
+
import { resolveAdminWidgets } from "../extensions.js";
|
|
5
|
+
import { useAdminExtensions } from "../providers/admin-extensions.js";
|
|
6
|
+
export function AdminWidgetSlotRenderer({ extensions, props = {}, slot, }) {
|
|
7
|
+
const contextExtensions = useAdminExtensions();
|
|
8
|
+
const widgets = resolveAdminWidgets({
|
|
9
|
+
slot,
|
|
10
|
+
extensions: extensions ?? contextExtensions,
|
|
11
|
+
});
|
|
12
|
+
if (widgets.length === 0) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
return (_jsx(_Fragment, { children: widgets.map((widget) => {
|
|
16
|
+
const Component = widget.component;
|
|
17
|
+
return (_jsx(Fragment, { children: _jsx(Component, { ...props }) }, widget.id));
|
|
18
|
+
}) }));
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voyant-mark.d.ts","sourceRoot":"","sources":["../../../src/components/brand/voyant-mark.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAEnC,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAe9E"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
export function VoyantMark({ className, ...props }) {
|
|
3
|
+
return (_jsx("svg", { viewBox: "0 0 834 834", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", "aria-label": "Voyant", role: "img", "data-slot": "voyant-mark", className: className, ...props, children: _jsx("path", { d: "M323.896 798.828L14 35H177.677L369.725 519.485C393.731 580.591 401.37 620.965 401.37 688.618V695.165H436.288V689.709C436.288 624.238 443.926 583.865 469.023 521.667L664.345 35H819.293L514.853 798.828H323.896Z" }) }));
|
|
4
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voyant-wordmark.d.ts","sourceRoot":"","sources":["../../../src/components/brand/voyant-wordmark.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAEnC,wBAAgB,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAoBlF"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
export function VoyantWordmark({ className, ...props }) {
|
|
3
|
+
return (_jsxs("svg", { viewBox: "0 0 89 25", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", "aria-label": "Voyant", role: "img", "data-slot": "voyant-wordmark", className: className, ...props, children: [_jsx("path", { d: "M6.99067 18.5567L-0.0361328 1.23711H3.67521L8.02985 12.2227C8.57418 13.6082 8.74737 14.5237 8.74737 16.0577V16.2062H9.53912V16.0825C9.53912 14.5979 9.71232 13.6825 10.2814 12.2722L14.7103 1.23711H18.2237L11.3206 18.5567H6.99067Z" }), _jsx("path", { d: "M24.2608 18.9278C20.0793 18.9278 17.135 16.2557 16.9618 12.2969H20.0298C20.203 14.7464 21.9103 16.4289 24.2608 16.4289C26.6113 16.4289 28.2938 14.7464 28.467 12.2969H31.535C31.3618 16.2557 28.4422 18.9278 24.2608 18.9278ZM16.9618 11.5299C17.1597 7.64536 20.1041 4.9732 24.2608 4.9732C28.4175 4.9732 31.3371 7.64536 31.535 11.5299H28.4422C28.2938 9.1299 26.6113 7.47217 24.2608 7.47217C21.9103 7.47217 20.203 9.1299 20.0546 11.5299H16.9618Z" }), _jsx("path", { d: "M33.2257 24V21.501H35.3288C36.7144 21.501 37.5061 20.7588 37.5061 19.2247V18.3835L31.667 5.36907H35.1061L37.8773 11.6289C38.4711 12.9897 38.669 13.8804 38.669 15.4144V15.934H39.4855V15.4144C39.4855 13.9299 39.6587 13.0144 40.2773 11.6289L43.0237 5.36907H46.4628L40.6237 18.3588V19.2247C40.6237 22.7876 38.57 24 35.9969 24H33.2257Z" }), _jsx("path", { d: "M52.2855 18.8783C49.5391 18.8783 47.7577 16.8742 47.7577 14.4495C47.7577 12.6186 48.6979 11.2825 49.6133 10.466C51.5432 8.73402 52.0381 8.63505 53.9432 8.63505H55.6999V7.86804H47.9309V5.36907H60.8216V18.5567H57.6793V14.9196H57.036C56.7144 17.5175 54.7845 18.8783 52.2855 18.8783ZM53.8195 16.4536C56.1206 16.4536 57.6793 14.499 57.6793 10.8124V7.81856L53.1515 10.9361C51.6422 11.9753 51.0979 12.8412 51.0979 13.9794C51.0979 15.5134 52.2113 16.4536 53.8195 16.4536Z" }), _jsx("path", { d: "M63.2133 18.5567V5.36907H66.3556V8.9567H66.9989C67.1969 6.43299 69.102 5.04742 71.5267 5.04742C74.3474 5.04742 76.0546 6.80412 76.0546 9.94639V18.5567H72.9371V10.5402C72.9371 8.56083 71.7742 7.49691 70.1412 7.49691C67.8402 7.49691 66.3556 9.57526 66.3556 13.2124V18.5567H63.2133Z" }), _jsx("path", { d: "M85.6958 18.5567C82.4793 18.5567 80.6979 16.7753 80.6979 13.4598V7.86804H77.135V5.36907H80.8216V1.60825L83.8154 0V5.36907H89.036V7.86804H81.935V8.61031H82.3556C83.3453 8.63505 83.8154 9.25361 83.8154 10.1443V13.1876C83.8154 15.068 84.7309 16.0577 86.4876 16.0577H89.036V18.5567H85.6958Z" })] }));
|
|
4
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
export type OperatorAdminBootstrapMode = "single-tenant" | "organization";
|
|
3
|
+
export interface OperatorAdminBootstrapRenderState<TUser, TWorkspace> {
|
|
4
|
+
user: TUser;
|
|
5
|
+
workspace: TWorkspace | null | undefined;
|
|
6
|
+
mode: OperatorAdminBootstrapMode;
|
|
7
|
+
}
|
|
8
|
+
export interface OperatorAdminBootstrapGateProps<TUser, TWorkspace = unknown> {
|
|
9
|
+
children: React.ReactNode | ((state: OperatorAdminBootstrapRenderState<TUser, TWorkspace>) => React.ReactNode);
|
|
10
|
+
/**
|
|
11
|
+
* Voyant first-party starters are single-tenant per deployment. In that
|
|
12
|
+
* baseline, current-user readiness is the only shell bootstrap dependency.
|
|
13
|
+
* Use "organization" only when an app explicitly owns workspace switching.
|
|
14
|
+
*/
|
|
15
|
+
mode?: OperatorAdminBootstrapMode;
|
|
16
|
+
user: TUser | null | undefined;
|
|
17
|
+
isUserLoading?: boolean;
|
|
18
|
+
workspace?: TWorkspace | null;
|
|
19
|
+
isWorkspaceLoading?: boolean;
|
|
20
|
+
isWorkspaceReady?: (workspace: TWorkspace | null | undefined) => boolean;
|
|
21
|
+
loadingFallback?: React.ReactNode;
|
|
22
|
+
unauthenticatedFallback?: React.ReactNode;
|
|
23
|
+
missingWorkspaceFallback?: React.ReactNode;
|
|
24
|
+
}
|
|
25
|
+
export declare function OperatorAdminBootstrapGate<TUser, TWorkspace = unknown>({ children, mode, user, isUserLoading, workspace, isWorkspaceLoading, isWorkspaceReady, loadingFallback, unauthenticatedFallback, missingWorkspaceFallback, }: OperatorAdminBootstrapGateProps<TUser, TWorkspace>): import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
//# sourceMappingURL=operator-admin-bootstrap-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operator-admin-bootstrap-gate.d.ts","sourceRoot":"","sources":["../../src/components/operator-admin-bootstrap-gate.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAEnC,MAAM,MAAM,0BAA0B,GAAG,eAAe,GAAG,cAAc,CAAA;AAEzE,MAAM,WAAW,iCAAiC,CAAC,KAAK,EAAE,UAAU;IAClE,IAAI,EAAE,KAAK,CAAA;IACX,SAAS,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,CAAA;IACxC,IAAI,EAAE,0BAA0B,CAAA;CACjC;AAED,MAAM,WAAW,+BAA+B,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO;IAC1E,QAAQ,EACJ,KAAK,CAAC,SAAS,GACf,CAAC,CAAC,KAAK,EAAE,iCAAiC,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC,CAAA;IACtF;;;;OAIG;IACH,IAAI,CAAC,EAAE,0BAA0B,CAAA;IACjC,IAAI,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,CAAA;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;IAC7B,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,KAAK,OAAO,CAAA;IACxE,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACjC,uBAAuB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACzC,wBAAwB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC3C;AASD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,EAAE,EACtE,QAAQ,EACR,IAAsB,EACtB,IAAI,EACJ,aAAqB,EACrB,SAAS,EACT,kBAA0B,EAC1B,gBAA0B,EAC1B,eAAsB,EACtB,uBAA8B,EAC9B,wBAA+B,GAChC,EAAE,+BAA+B,CAAC,KAAK,EAAE,UAAU,CAAC,2CAoBpD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
function renderChildren(children, state) {
|
|
4
|
+
return typeof children === "function" ? children(state) : children;
|
|
5
|
+
}
|
|
6
|
+
export function OperatorAdminBootstrapGate({ children, mode = "single-tenant", user, isUserLoading = false, workspace, isWorkspaceLoading = false, isWorkspaceReady = Boolean, loadingFallback = null, unauthenticatedFallback = null, missingWorkspaceFallback = null, }) {
|
|
7
|
+
if (isUserLoading) {
|
|
8
|
+
return _jsx(_Fragment, { children: loadingFallback });
|
|
9
|
+
}
|
|
10
|
+
if (!user) {
|
|
11
|
+
return _jsx(_Fragment, { children: unauthenticatedFallback });
|
|
12
|
+
}
|
|
13
|
+
if (mode === "organization") {
|
|
14
|
+
if (isWorkspaceLoading) {
|
|
15
|
+
return _jsx(_Fragment, { children: loadingFallback });
|
|
16
|
+
}
|
|
17
|
+
if (!isWorkspaceReady(workspace)) {
|
|
18
|
+
return _jsx(_Fragment, { children: missingWorkspaceFallback });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return _jsx(_Fragment, { children: renderChildren(children, { user, workspace, mode }) });
|
|
22
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
export interface OperatorAdminPageShellProps {
|
|
3
|
+
actions?: React.ReactNode;
|
|
4
|
+
breadcrumbs?: React.ReactNode;
|
|
5
|
+
children: React.ReactNode;
|
|
6
|
+
className?: string;
|
|
7
|
+
contentClassName?: string;
|
|
8
|
+
headerClassName?: string;
|
|
9
|
+
padded?: boolean;
|
|
10
|
+
showSidebarTrigger?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function OperatorAdminPageShell({ actions, breadcrumbs, children, className, contentClassName, headerClassName, padded, showSidebarTrigger, }: OperatorAdminPageShellProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
//# sourceMappingURL=operator-admin-page-shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operator-admin-page-shell.d.ts","sourceRoot":"","sources":["../../src/components/operator-admin-page-shell.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAEnC,MAAM,WAAW,2BAA2B;IAC1C,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC7B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED,wBAAgB,sBAAsB,CAAC,EACrC,OAAO,EACP,WAAW,EACX,QAAQ,EACR,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,MAAa,EACb,kBAAyB,GAC1B,EAAE,2BAA2B,2CA+C7B"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { cn, Separator, SidebarTrigger } from "@voyant-travel/ui/components";
|
|
4
|
+
export function OperatorAdminPageShell({ actions, breadcrumbs, children, className, contentClassName, headerClassName, padded = true, showSidebarTrigger = true, }) {
|
|
5
|
+
return (_jsxs("div", { "data-slot": "operator-admin-page-shell", className: cn("flex min-h-0 flex-1 flex-col", className), children: [_jsxs("header", { "data-slot": "operator-admin-page-shell-header", className: cn("sticky top-0 z-10 flex h-16 shrink-0 items-center justify-between gap-2 border-b border-border bg-background/95 px-4 backdrop-blur transition-[width,height] ease-linear supports-[backdrop-filter]:bg-background/80 group-has-[[data-collapsible=icon]]/sidebar-wrapper:h-12", headerClassName), children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [showSidebarTrigger ? (_jsx(SidebarTrigger, { className: "-ml-1", title: "Toggle sidebar (Cmd/Ctrl+B)", "aria-label": "Toggle sidebar" })) : null, breadcrumbs ? (_jsxs(_Fragment, { children: [showSidebarTrigger ? (_jsx(Separator, { orientation: "vertical", className: "mr-2 h-4" })) : null, _jsx("div", { className: "min-w-0 flex-1", children: breadcrumbs })] })) : null] }), actions ? (_jsx("div", { className: "flex shrink-0 items-center gap-2", "data-slot": "operator-admin-page-shell-actions", children: actions })) : null] }), _jsx("div", { "data-slot": "operator-admin-page-shell-content", className: cn(padded && "px-4 py-6 md:px-6", contentClassName), children: children })] }));
|
|
6
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Sidebar, SidebarProvider } from "@voyant-travel/ui/components";
|
|
2
|
+
import type * as React from "react";
|
|
3
|
+
import type { AdminExtension } from "../extensions.js";
|
|
4
|
+
import { type OperatorAdminNavigationIcons } from "../navigation/operator-navigation.js";
|
|
5
|
+
import type { AdminUser, NavItem } from "../types.js";
|
|
6
|
+
import { type AdminNavLinkComponent } from "./admin-nav-link.js";
|
|
7
|
+
import { type AdminPageHeadOptions } from "./admin-page-head.js";
|
|
8
|
+
export interface OperatorAdminSidebarProps extends Omit<React.ComponentProps<typeof Sidebar>, "children"> {
|
|
9
|
+
accountHref?: string;
|
|
10
|
+
brand?: React.ReactNode;
|
|
11
|
+
currentPath: string;
|
|
12
|
+
extensions?: ReadonlyArray<AdminExtension>;
|
|
13
|
+
icons?: OperatorAdminNavigationIcons;
|
|
14
|
+
linkComponent?: AdminNavLinkComponent;
|
|
15
|
+
navItems?: ReadonlyArray<NavItem>;
|
|
16
|
+
onSignOut?: () => void | Promise<void>;
|
|
17
|
+
user?: AdminUser | null;
|
|
18
|
+
}
|
|
19
|
+
export interface DefaultOperatorAdminBrandProps {
|
|
20
|
+
href?: string;
|
|
21
|
+
linkComponent?: AdminNavLinkComponent;
|
|
22
|
+
}
|
|
23
|
+
export declare function DefaultOperatorAdminBrand({ href, linkComponent: LinkComponent, }: DefaultOperatorAdminBrandProps): import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
export declare function OperatorAdminSidebar({ accountHref, brand, currentPath, extensions, icons, linkComponent, navItems, onSignOut, user, ...props }: OperatorAdminSidebarProps): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
export interface OperatorAdminWorkspaceLayoutProps {
|
|
26
|
+
accountHref?: string;
|
|
27
|
+
brand?: React.ReactNode;
|
|
28
|
+
children: React.ReactNode;
|
|
29
|
+
currentPath: string;
|
|
30
|
+
defaultOpen?: React.ComponentProps<typeof SidebarProvider>["defaultOpen"];
|
|
31
|
+
extensions?: ReadonlyArray<AdminExtension>;
|
|
32
|
+
headerClassName?: string;
|
|
33
|
+
/**
|
|
34
|
+
* Left slot of the inset header (after the sidebar trigger). When
|
|
35
|
+
* omitted, a default breadcrumb showing the resolved page title is
|
|
36
|
+
* rendered automatically.
|
|
37
|
+
*/
|
|
38
|
+
headerSlot?: React.ReactNode;
|
|
39
|
+
/** Right slot of the inset header — meant for page actions. */
|
|
40
|
+
headerSlotRight?: React.ReactNode;
|
|
41
|
+
icons?: OperatorAdminNavigationIcons;
|
|
42
|
+
linkComponent?: AdminNavLinkComponent;
|
|
43
|
+
mainClassName?: string;
|
|
44
|
+
navItems?: ReadonlyArray<NavItem>;
|
|
45
|
+
onSignOut?: () => void | Promise<void>;
|
|
46
|
+
pageHead?: (AdminPageHeadOptions & {
|
|
47
|
+
titleOverride?: string | null;
|
|
48
|
+
}) | false;
|
|
49
|
+
side?: React.ComponentProps<typeof Sidebar>["side"];
|
|
50
|
+
sidebarProps?: Omit<OperatorAdminSidebarProps, "currentPath">;
|
|
51
|
+
showSidebarTrigger?: boolean;
|
|
52
|
+
user?: AdminUser | null;
|
|
53
|
+
variant?: React.ComponentProps<typeof Sidebar>["variant"];
|
|
54
|
+
}
|
|
55
|
+
export declare function resolveAdminPageTitle(currentPath: string, navItems: ReadonlyArray<NavItem>): string | null;
|
|
56
|
+
export declare function OperatorAdminWorkspaceLayout({ accountHref, brand, children, currentPath, defaultOpen, extensions, headerClassName, headerSlot, headerSlotRight, icons, linkComponent, mainClassName, navItems, onSignOut, pageHead, side, sidebarProps, showSidebarTrigger, user, variant, }: OperatorAdminWorkspaceLayoutProps): import("react/jsx-runtime").JSX.Element;
|
|
57
|
+
//# sourceMappingURL=operator-admin-sidebar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operator-admin-sidebar.d.ts","sourceRoot":"","sources":["../../src/components/operator-admin-sidebar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { cn, Sidebar, SidebarContent, SidebarFooter, SidebarHeader, SidebarInset, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarProvider, SidebarRail, SidebarTrigger, } from "@voyant-travel/ui/components";
|
|
4
|
+
import { Settings as DefaultSettingsIcon } from "lucide-react";
|
|
5
|
+
import { resolveAdminNavigation } from "../extensions.js";
|
|
6
|
+
import { createOperatorAdminNavigation, } from "../navigation/operator-navigation.js";
|
|
7
|
+
import { AdminExtensionsProvider } from "../providers/admin-extensions.js";
|
|
8
|
+
import { useOperatorAdminMessages } from "../providers/operator-admin-messages.js";
|
|
9
|
+
import { AdminBreadcrumbsProvider, AdminBreadcrumbsTrail, useAdminBreadcrumbsValue, } from "./admin-breadcrumbs.js";
|
|
10
|
+
import { AdminNavGroup } from "./admin-nav-group.js";
|
|
11
|
+
import { DefaultAdminNavLink } from "./admin-nav-link.js";
|
|
12
|
+
import { AdminPageHeadProvider } from "./admin-page-head.js";
|
|
13
|
+
import { VoyantMark } from "./brand/voyant-mark.js";
|
|
14
|
+
import { VoyantWordmark } from "./brand/voyant-wordmark.js";
|
|
15
|
+
import { OperatorAdminUserMenu } from "./operator-admin-user-menu.js";
|
|
16
|
+
export function DefaultOperatorAdminBrand({ href = "/", linkComponent: LinkComponent = DefaultAdminNavLink, }) {
|
|
17
|
+
return (_jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { asChild: true, tooltip: "Voyant", size: "lg", className: "group-data-[collapsible=icon]:justify-center", children: _jsxs(LinkComponent, { href: href, target: "_self", "aria-label": "Voyant", children: [_jsx(VoyantMark, { "aria-hidden": "true", className: "hidden! size-5! shrink-0 group-data-[collapsible=icon]:block!" }), _jsx(VoyantWordmark, { "aria-hidden": "true", className: "h-6! w-auto! group-data-[collapsible=icon]:hidden!" })] }) }) }) }));
|
|
18
|
+
}
|
|
19
|
+
export function OperatorAdminSidebar({ accountHref, brand, currentPath, extensions, icons, linkComponent, navItems, onSignOut, user, ...props }) {
|
|
20
|
+
const messages = useOperatorAdminMessages();
|
|
21
|
+
const baseItems = navItems ?? createOperatorAdminNavigation({ icons, messages: messages.nav });
|
|
22
|
+
const resolvedItems = resolveAdminNavigation({ baseItems, extensions });
|
|
23
|
+
const resolvedBrand = brand ?? _jsx(DefaultOperatorAdminBrand, { linkComponent: linkComponent });
|
|
24
|
+
const LinkComponent = linkComponent ?? DefaultAdminNavLink;
|
|
25
|
+
const SettingsIcon = icons?.settings ?? DefaultSettingsIcon;
|
|
26
|
+
const settingsActive = navUrlMatchesPath("/settings", currentPath);
|
|
27
|
+
return (_jsxs(Sidebar, { collapsible: "icon", ...props, children: [_jsx(SidebarHeader, { children: resolvedBrand }), _jsx(SidebarContent, { children: _jsx(AdminNavGroup, { currentPath: currentPath, items: resolvedItems, linkComponent: linkComponent }) }), _jsxs(SidebarFooter, { children: [_jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { asChild: true, isActive: settingsActive, tooltip: messages.nav.settings, children: _jsxs(LinkComponent, { href: "/settings", children: [_jsx(SettingsIcon, {}), _jsx("span", { children: messages.nav.settings })] }) }) }) }), user && (_jsx(OperatorAdminUserMenu, { accountHref: accountHref, linkComponent: linkComponent, onSignOut: onSignOut, user: user }))] }), _jsx(SidebarRail, {})] }));
|
|
28
|
+
}
|
|
29
|
+
function normalizePath(path) {
|
|
30
|
+
const withoutHash = path.split("#")[0] ?? "";
|
|
31
|
+
const withoutSearch = withoutHash.split("?")[0] ?? "";
|
|
32
|
+
const normalized = withoutSearch.replace(/\/+$/, "");
|
|
33
|
+
return normalized || "/";
|
|
34
|
+
}
|
|
35
|
+
function navUrlMatchesPath(navUrl, currentPath) {
|
|
36
|
+
const normalizedUrl = normalizePath(navUrl);
|
|
37
|
+
const normalizedPath = normalizePath(currentPath);
|
|
38
|
+
if (normalizedUrl === "/") {
|
|
39
|
+
return normalizedPath === "/";
|
|
40
|
+
}
|
|
41
|
+
return normalizedPath === normalizedUrl || normalizedPath.startsWith(`${normalizedUrl}/`);
|
|
42
|
+
}
|
|
43
|
+
export function resolveAdminPageTitle(currentPath, navItems) {
|
|
44
|
+
let matchedTitle = null;
|
|
45
|
+
let matchedUrlLength = -1;
|
|
46
|
+
const visitItem = (item) => {
|
|
47
|
+
if (navUrlMatchesPath(item.url, currentPath)) {
|
|
48
|
+
const urlLength = normalizePath(item.url).length;
|
|
49
|
+
if (urlLength >= matchedUrlLength) {
|
|
50
|
+
matchedTitle = item.title;
|
|
51
|
+
matchedUrlLength = urlLength;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if ("items" in item) {
|
|
55
|
+
item.items?.forEach(visitItem);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
navItems.forEach(visitItem);
|
|
59
|
+
return matchedTitle;
|
|
60
|
+
}
|
|
61
|
+
export function OperatorAdminWorkspaceLayout({ accountHref, brand, children, currentPath, defaultOpen, extensions, headerClassName, headerSlot, headerSlotRight, icons, linkComponent, mainClassName = "flex-1", navItems, onSignOut, pageHead, side, sidebarProps, showSidebarTrigger = true, user, variant, }) {
|
|
62
|
+
const messages = useOperatorAdminMessages();
|
|
63
|
+
const { extensions: sidebarExtensions, navItems: sidebarNavItems, side: sidebarSide, ...restSidebarProps } = sidebarProps ?? {};
|
|
64
|
+
const baseItems = sidebarNavItems ?? navItems ?? createOperatorAdminNavigation({ icons, messages: messages.nav });
|
|
65
|
+
const resolvedItems = resolveAdminNavigation({
|
|
66
|
+
baseItems,
|
|
67
|
+
extensions: sidebarExtensions ?? extensions,
|
|
68
|
+
});
|
|
69
|
+
const resolvedSide = sidebarSide ?? side;
|
|
70
|
+
let pageTitle = null;
|
|
71
|
+
if (pageHead !== false) {
|
|
72
|
+
if (pageHead?.titleOverride !== undefined) {
|
|
73
|
+
pageTitle = pageHead.titleOverride;
|
|
74
|
+
}
|
|
75
|
+
else if (pageHead?.title !== undefined) {
|
|
76
|
+
pageTitle = pageHead.title;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
pageTitle = resolveAdminPageTitle(currentPath, resolvedItems);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const pageHeadBase = pageHead === false
|
|
83
|
+
? null
|
|
84
|
+
: {
|
|
85
|
+
brand: pageHead?.brand ?? "Voyant",
|
|
86
|
+
description: pageHead?.description ?? null,
|
|
87
|
+
title: pageTitle,
|
|
88
|
+
};
|
|
89
|
+
const sidebar = (_jsx(OperatorAdminSidebar, { accountHref: accountHref, brand: brand, currentPath: currentPath, extensions: undefined, icons: icons, linkComponent: linkComponent, navItems: resolvedItems, onSignOut: onSignOut, side: resolvedSide, user: user, variant: variant, ...restSidebarProps }));
|
|
90
|
+
const headerHasContent = showSidebarTrigger || headerSlot !== undefined || pageTitle != null;
|
|
91
|
+
const hasHeader = headerHasContent || headerSlotRight != null;
|
|
92
|
+
const inset = (_jsxs(SidebarInset, { className: mainClassName, children: [hasHeader && (_jsxs("header", { className: cn("flex h-14 shrink-0 items-center justify-between gap-3 border-b px-4 transition-[width,height] ease-linear group-has-[[data-collapsible=icon]]/sidebar-wrapper:h-12", headerClassName), children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [showSidebarTrigger && (_jsx(SidebarTrigger, { className: "-ml-1", title: "Toggle sidebar (Cmd/Ctrl+B)", "aria-label": "Toggle sidebar" })), headerSlot !== undefined ? (headerSlot) : (_jsx(DefaultHeaderBreadcrumb, { linkComponent: linkComponent, pageTitle: pageTitle }))] }), headerSlotRight && (_jsx("div", { className: "flex shrink-0 items-center gap-2", children: headerSlotRight }))] })), children] }));
|
|
93
|
+
const workspace = resolvedSide === "right" ? (_jsxs(_Fragment, { children: [inset, sidebar] })) : (_jsxs(_Fragment, { children: [sidebar, inset] }));
|
|
94
|
+
return (_jsx(AdminExtensionsProvider, { extensions: extensions, children: _jsx(SidebarProvider, { defaultOpen: defaultOpen, children: _jsx(AdminBreadcrumbsProvider, { children: pageHead === false ? (workspace) : (_jsx(AdminPageHeadProvider, { baseHead: pageHeadBase, children: workspace })) }) }) }));
|
|
95
|
+
}
|
|
96
|
+
function DefaultHeaderBreadcrumb({ linkComponent, pageTitle, }) {
|
|
97
|
+
const segments = useAdminBreadcrumbsValue();
|
|
98
|
+
if (segments.length > 0) {
|
|
99
|
+
return _jsx(AdminBreadcrumbsTrail, { linkComponent: linkComponent, segments: segments });
|
|
100
|
+
}
|
|
101
|
+
if (pageTitle == null)
|
|
102
|
+
return null;
|
|
103
|
+
return _jsx(AdminBreadcrumbsTrail, { linkComponent: linkComponent, segments: [{ label: pageTitle }] });
|
|
104
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AdminUser } from "../types.js";
|
|
2
|
+
import { type AdminNavLinkComponent } from "./admin-nav-link.js";
|
|
3
|
+
export interface OperatorAdminUserMenuProps {
|
|
4
|
+
accountHref?: string;
|
|
5
|
+
linkComponent?: AdminNavLinkComponent;
|
|
6
|
+
onSignOut?: () => void | Promise<void>;
|
|
7
|
+
user: AdminUser;
|
|
8
|
+
}
|
|
9
|
+
export declare function OperatorAdminUserMenu({ accountHref, linkComponent: LinkComponent, onSignOut, user, }: OperatorAdminUserMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=operator-admin-user-menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operator-admin-user-menu.d.ts","sourceRoot":"","sources":["../../src/components/operator-admin-user-menu.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,KAAK,qBAAqB,EAAuB,MAAM,qBAAqB,CAAA;AAErF,MAAM,WAAW,0BAA0B;IACzC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,qBAAqB,CAAA;IACrC,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtC,IAAI,EAAE,SAAS,CAAA;CAChB;AAED,wBAAgB,qBAAqB,CAAC,EACpC,WAAwB,EACxB,aAAa,EAAE,aAAmC,EAClD,SAAS,EACT,IAAI,GACL,EAAE,0BAA0B,2CA2F5B"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Avatar, AvatarFallback, AvatarImage, DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, SidebarMenu, SidebarMenuButton, SidebarMenuItem, useSidebar, } from "@voyant-travel/ui/components";
|
|
4
|
+
import { BadgeCheck, Check, ChevronsUpDown, LogOut, Moon, Sun } from "lucide-react";
|
|
5
|
+
import { getDisplayName, getInitials } from "../lib/initials.js";
|
|
6
|
+
import { useLocale } from "../providers/locale.js";
|
|
7
|
+
import { useOperatorAdminMessages } from "../providers/operator-admin-messages.js";
|
|
8
|
+
import { useTheme } from "../providers/theme.js";
|
|
9
|
+
import { DefaultAdminNavLink } from "./admin-nav-link.js";
|
|
10
|
+
export function OperatorAdminUserMenu({ accountHref = "/account", linkComponent: LinkComponent = DefaultAdminNavLink, onSignOut, user, }) {
|
|
11
|
+
const { isMobile } = useSidebar();
|
|
12
|
+
const { setTheme, theme, resolvedTheme } = useTheme();
|
|
13
|
+
const { setLocale, resolvedLocale } = useLocale();
|
|
14
|
+
const messages = useOperatorAdminMessages();
|
|
15
|
+
const displayName = getDisplayName(user);
|
|
16
|
+
const initials = getInitials(user.firstName, user.lastName, user.email);
|
|
17
|
+
const showEmailSeparately = Boolean(user.email && displayName !== user.email);
|
|
18
|
+
return (_jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(SidebarMenuButton, { size: "lg", className: "data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground", children: [_jsxs(Avatar, { className: "h-8 w-8 rounded-lg", children: [_jsx(AvatarImage, { src: user.avatar ?? undefined, alt: displayName }), _jsx(AvatarFallback, { className: "rounded-lg", children: initials })] }), _jsxs("div", { className: "grid flex-1 text-left text-sm leading-tight", children: [_jsx("span", { className: "truncate font-medium", children: displayName }), showEmailSeparately && _jsx("span", { className: "truncate text-xs", children: user.email })] }), _jsx(ChevronsUpDown, { className: "ml-auto size-4" })] }) }), _jsxs(DropdownMenuContent, { className: "w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-lg", side: isMobile ? "bottom" : "right", align: "end", sideOffset: 4, children: [_jsx("div", { className: "p-0 font-normal", children: _jsxs("div", { className: "flex items-center gap-2 px-1 py-1.5 text-left text-sm", children: [_jsxs(Avatar, { className: "h-8 w-8 rounded-lg", children: [_jsx(AvatarImage, { src: user.avatar ?? undefined, alt: displayName }), _jsx(AvatarFallback, { className: "rounded-lg", children: initials })] }), _jsxs("div", { className: "grid flex-1 text-left text-sm leading-tight", children: [_jsx("span", { className: "truncate font-medium", children: displayName }), showEmailSeparately && _jsx("span", { className: "truncate text-xs", children: user.email })] })] }) }), _jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuGroup, { children: [_jsx(DropdownMenuItem, { asChild: true, children: _jsxs(LinkComponent, { href: accountHref, children: [_jsx(BadgeCheck, {}), messages.account] }) }), _jsxs(DropdownMenuItem, { onClick: () => setTheme("light"), children: [_jsx(Sun, { className: "h-4 w-4" }), messages.light, (theme === "light" || (theme === "system" && resolvedTheme === "light")) && (_jsx(Check, { className: "ml-auto h-4 w-4" }))] }), _jsxs(DropdownMenuItem, { onClick: () => setTheme("dark"), children: [_jsx(Moon, { className: "h-4 w-4" }), messages.dark, (theme === "dark" || (theme === "system" && resolvedTheme === "dark")) && (_jsx(Check, { className: "ml-auto h-4 w-4" }))] }), _jsx(DropdownMenuSeparator, {}), _jsx(DropdownMenuItem, { disabled: true, children: messages.language }), _jsxs(DropdownMenuItem, { onClick: () => setLocale("en"), children: [messages.english, resolvedLocale === "en" && _jsx(Check, { className: "ml-auto h-4 w-4" })] }), _jsxs(DropdownMenuItem, { onClick: () => setLocale("ro"), children: [messages.romanian, resolvedLocale === "ro" && _jsx(Check, { className: "ml-auto h-4 w-4" })] })] }), _jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuItem, { onClick: () => void onSignOut?.(), children: [_jsx(LogOut, {}), messages.logOut] })] })] }) }) }));
|
|
19
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface TeamSettingsPageApi {
|
|
2
|
+
get: <T = unknown>(path: string) => Promise<T>;
|
|
3
|
+
post: <T = unknown>(path: string, body?: unknown) => Promise<T>;
|
|
4
|
+
delete: <T = unknown>(path: string) => Promise<T>;
|
|
5
|
+
}
|
|
6
|
+
export interface TeamSettingsPageProps {
|
|
7
|
+
api?: TeamSettingsPageApi;
|
|
8
|
+
}
|
|
9
|
+
export declare function TeamSettingsPage({ api: apiProp }?: TeamSettingsPageProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=team-settings-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-settings-page.d.ts","sourceRoot":"","sources":["../../src/components/team-settings-page.tsx"],"names":[],"mappings":"AAiDA,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;IAC9C,IAAI,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;IAC/D,MAAM,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;CAClD;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,EAAE,mBAAmB,CAAA;CAC1B;AA4DD,wBAAgB,gBAAgB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAE,qBAA0B,2CAG5E"}
|