@burdenoff/microfe-ggnomad 2026.725.2 → 2026.726.1
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/dist/ggnomad/GGNomadRoot.d.ts.map +1 -1
- package/dist/ggnomad/GGNomadRoot.js +60 -53
- package/dist/ggnomad/GGNomadRoot.js.map +1 -1
- package/dist/ggnomad/GGNomadRoutes.d.ts.map +1 -1
- package/dist/ggnomad/GGNomadRoutes.js +9 -5
- package/dist/ggnomad/GGNomadRoutes.js.map +1 -1
- package/dist/ggnomad/components/CreateTravelPolicyDialog.d.ts +14 -0
- package/dist/ggnomad/components/CreateTravelPolicyDialog.d.ts.map +1 -0
- package/dist/ggnomad/components/CreateTravelPolicyDialog.js +192 -0
- package/dist/ggnomad/components/CreateTravelPolicyDialog.js.map +1 -0
- package/dist/ggnomad/components/index.d.ts +1 -0
- package/dist/ggnomad/components/index.d.ts.map +1 -1
- package/dist/ggnomad/components/index.js +1 -0
- package/dist/ggnomad/graphql.d.ts +8 -0
- package/dist/ggnomad/graphql.d.ts.map +1 -1
- package/dist/ggnomad/graphql.js +98 -1
- package/dist/ggnomad/graphql.js.map +1 -1
- package/dist/ggnomad/pages/TravelPolicyPage.d.ts +9 -0
- package/dist/ggnomad/pages/TravelPolicyPage.d.ts.map +1 -0
- package/dist/ggnomad/pages/TravelPolicyPage.js +245 -0
- package/dist/ggnomad/pages/TravelPolicyPage.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GGNomadRoot.d.ts","sourceRoot":"","sources":["../../src/ggnomad/GGNomadRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"GGNomadRoot.d.ts","sourceRoot":"","sources":["../../src/ggnomad/GGNomadRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAqBhC,OAAO,KAAK,EAAE,gBAAgB,EAAW,MAAM,SAAS,CAAC;AAGzD,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAiI5C,CAAC"}
|
|
@@ -2,124 +2,131 @@ import { GGNomadProvider as e } from "./providers/GGNomadProvider.js";
|
|
|
2
2
|
import { joinPath as t } from "./utils/navigation.js";
|
|
3
3
|
import { GGNomadRoutes as n } from "./GGNomadRoutes.js";
|
|
4
4
|
import { useEffect as r } from "react";
|
|
5
|
-
import { Activity as i, BarChart3 as a, Building as o, CalendarCheck as s, Compass as c, LayoutDashboard as l, Map as u, MapPinned as d, Search as f,
|
|
6
|
-
import { useI18n as
|
|
7
|
-
import { jsx as
|
|
8
|
-
import { FeatureFlagProvider as
|
|
5
|
+
import { Activity as i, BarChart3 as a, Building as o, CalendarCheck as s, Compass as c, LayoutDashboard as l, Map as u, MapPinned as d, Search as f, ShieldCheck as p, Star as m, Tickets as h } from "lucide-react";
|
|
6
|
+
import { useI18n as g } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
7
|
+
import { jsx as _ } from "react/jsx-runtime";
|
|
8
|
+
import { FeatureFlagProvider as v } from "@burdenoff/fe-libs/shared/feature-flags";
|
|
9
9
|
//#region src/ggnomad/GGNomadRoot.tsx
|
|
10
|
-
var
|
|
11
|
-
let { registerNavItems:
|
|
10
|
+
var y = (y) => {
|
|
11
|
+
let { registerNavItems: b, registerFooterItems: x, basePath: S = "/" } = y, { t: C } = g();
|
|
12
12
|
return r(() => {
|
|
13
|
-
if (
|
|
13
|
+
if (b) return b({
|
|
14
14
|
id: "ggnomad",
|
|
15
|
-
label:
|
|
16
|
-
path:
|
|
17
|
-
icon: /* @__PURE__ */
|
|
15
|
+
label: C("ggnomad.nav.root", "GGNomad"),
|
|
16
|
+
path: S,
|
|
17
|
+
icon: /* @__PURE__ */ _(l, { size: 18 }),
|
|
18
18
|
order: 80,
|
|
19
19
|
group: "products",
|
|
20
20
|
children: [
|
|
21
21
|
{
|
|
22
22
|
id: "ggnomad-dashboard",
|
|
23
|
-
label:
|
|
24
|
-
path:
|
|
25
|
-
icon: /* @__PURE__ */
|
|
23
|
+
label: C("ggnomad.nav.dashboard", "Dashboard"),
|
|
24
|
+
path: S,
|
|
25
|
+
icon: /* @__PURE__ */ _(l, { size: 16 }),
|
|
26
26
|
order: 0
|
|
27
27
|
},
|
|
28
28
|
{
|
|
29
29
|
id: "ggnomad-search",
|
|
30
|
-
label:
|
|
31
|
-
path: t(
|
|
32
|
-
icon: /* @__PURE__ */
|
|
30
|
+
label: C("ggnomad.nav.search", "Search"),
|
|
31
|
+
path: t(S, "search"),
|
|
32
|
+
icon: /* @__PURE__ */ _(f, { size: 16 }),
|
|
33
33
|
order: 5
|
|
34
34
|
},
|
|
35
35
|
{
|
|
36
36
|
id: "ggnomad-travel",
|
|
37
|
-
label:
|
|
38
|
-
path: t(
|
|
39
|
-
icon: /* @__PURE__ */
|
|
37
|
+
label: C("ggnomad.nav.travel", "Travel"),
|
|
38
|
+
path: t(S, "travel"),
|
|
39
|
+
icon: /* @__PURE__ */ _(c, { size: 16 }),
|
|
40
40
|
order: 10
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
id: "ggnomad-hospitality",
|
|
44
|
-
label:
|
|
45
|
-
path: t(
|
|
46
|
-
icon: /* @__PURE__ */
|
|
44
|
+
label: C("ggnomad.nav.hospitality", "Hospitality"),
|
|
45
|
+
path: t(S, "hospitality"),
|
|
46
|
+
icon: /* @__PURE__ */ _(o, { size: 16 }),
|
|
47
47
|
order: 20
|
|
48
48
|
},
|
|
49
49
|
{
|
|
50
50
|
id: "ggnomad-tourism",
|
|
51
|
-
label:
|
|
52
|
-
path: t(
|
|
53
|
-
icon: /* @__PURE__ */
|
|
51
|
+
label: C("ggnomad.nav.tourism", "Tourism"),
|
|
52
|
+
path: t(S, "tourism"),
|
|
53
|
+
icon: /* @__PURE__ */ _(d, { size: 16 }),
|
|
54
54
|
order: 30
|
|
55
55
|
},
|
|
56
56
|
{
|
|
57
57
|
id: "ggnomad-entertainment",
|
|
58
|
-
label:
|
|
59
|
-
path: t(
|
|
60
|
-
icon: /* @__PURE__ */
|
|
58
|
+
label: C("ggnomad.nav.entertainment", "Entertainment"),
|
|
59
|
+
path: t(S, "entertainment"),
|
|
60
|
+
icon: /* @__PURE__ */ _(i, { size: 16 }),
|
|
61
61
|
order: 40
|
|
62
62
|
},
|
|
63
63
|
{
|
|
64
64
|
id: "ggnomad-trips",
|
|
65
|
-
label:
|
|
66
|
-
path: t(
|
|
67
|
-
icon: /* @__PURE__ */
|
|
65
|
+
label: C("ggnomad.nav.trips", "Trips"),
|
|
66
|
+
path: t(S, "trips"),
|
|
67
|
+
icon: /* @__PURE__ */ _(u, { size: 16 }),
|
|
68
68
|
order: 45
|
|
69
69
|
},
|
|
70
70
|
{
|
|
71
71
|
id: "ggnomad-bookings",
|
|
72
|
-
label:
|
|
73
|
-
path: t(
|
|
74
|
-
icon: /* @__PURE__ */
|
|
72
|
+
label: C("ggnomad.nav.bookings", "Bookings"),
|
|
73
|
+
path: t(S, "bookings"),
|
|
74
|
+
icon: /* @__PURE__ */ _(s, { size: 16 }),
|
|
75
75
|
order: 50
|
|
76
76
|
},
|
|
77
|
+
{
|
|
78
|
+
id: "ggnomad-travel-policy",
|
|
79
|
+
label: C("ggnomad.nav.travelPolicy", "Travel Policy"),
|
|
80
|
+
path: t(S, "travel-policy"),
|
|
81
|
+
icon: /* @__PURE__ */ _(p, { size: 16 }),
|
|
82
|
+
order: 55
|
|
83
|
+
},
|
|
77
84
|
{
|
|
78
85
|
id: "ggnomad-favorites",
|
|
79
|
-
label:
|
|
80
|
-
path: t(
|
|
81
|
-
icon: /* @__PURE__ */
|
|
86
|
+
label: C("ggnomad.nav.favorites", "Favorites"),
|
|
87
|
+
path: t(S, "favorites"),
|
|
88
|
+
icon: /* @__PURE__ */ _(m, { size: 16 }),
|
|
82
89
|
order: 60
|
|
83
90
|
},
|
|
84
91
|
{
|
|
85
92
|
id: "ggnomad-provider",
|
|
86
|
-
label:
|
|
87
|
-
path: t(
|
|
88
|
-
icon: /* @__PURE__ */
|
|
93
|
+
label: C("ggnomad.nav.providers", "Providers"),
|
|
94
|
+
path: t(S, "provider"),
|
|
95
|
+
icon: /* @__PURE__ */ _(h, { size: 16 }),
|
|
89
96
|
order: 70
|
|
90
97
|
},
|
|
91
98
|
{
|
|
92
99
|
id: "ggnomad-analytics",
|
|
93
|
-
label:
|
|
94
|
-
path: t(
|
|
95
|
-
icon: /* @__PURE__ */
|
|
100
|
+
label: C("ggnomad.nav.analytics", "Analytics"),
|
|
101
|
+
path: t(S, "analytics"),
|
|
102
|
+
icon: /* @__PURE__ */ _(a, { size: 16 }),
|
|
96
103
|
order: 80
|
|
97
104
|
}
|
|
98
105
|
]
|
|
99
106
|
});
|
|
100
107
|
}, [
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
108
|
+
b,
|
|
109
|
+
S,
|
|
110
|
+
C
|
|
104
111
|
]), r(() => {
|
|
105
|
-
if (
|
|
112
|
+
if (x) return x([{
|
|
106
113
|
id: "ggnomad-ready",
|
|
107
|
-
label:
|
|
114
|
+
label: C("ggnomad.footer.ready", "GGNomad Ready"),
|
|
108
115
|
type: "status",
|
|
109
116
|
section: "left",
|
|
110
117
|
order: 10
|
|
111
118
|
}]);
|
|
112
|
-
}, [
|
|
119
|
+
}, [x, C]), /* @__PURE__ */ _(v, {
|
|
113
120
|
workspaceId: null,
|
|
114
121
|
gateway: "global",
|
|
115
122
|
defaultEnabled: !0,
|
|
116
|
-
children: /* @__PURE__ */
|
|
117
|
-
...
|
|
118
|
-
children: /* @__PURE__ */
|
|
123
|
+
children: /* @__PURE__ */ _(e, {
|
|
124
|
+
...y,
|
|
125
|
+
children: /* @__PURE__ */ _(n, {})
|
|
119
126
|
})
|
|
120
127
|
});
|
|
121
128
|
};
|
|
122
129
|
//#endregion
|
|
123
|
-
export {
|
|
130
|
+
export { y as GGNomadRoot };
|
|
124
131
|
|
|
125
132
|
//# sourceMappingURL=GGNomadRoot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GGNomadRoot.js","names":[],"sources":["../../src/ggnomad/GGNomadRoot.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useEffect } from 'react';\nimport {\n Activity,\n BarChart3,\n Building,\n CalendarCheck,\n Compass,\n LayoutDashboard,\n MapPinned,\n Map,\n Search,\n Star,\n Tickets,\n} from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\nimport { GGNomadRoutes } from './GGNomadRoutes';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { GGNomadProvider } from './providers/GGNomadProvider';\nimport type { GGNomadRootProps, NavItem } from './types';\nimport { joinPath } from './utils/navigation';\n\nexport const GGNomadRoot: FC<GGNomadRootProps> = (props) => {\n const { registerNavItems, registerFooterItems, basePath = '/' } = props;\n const { t } = useI18n();\n\n useEffect(() => {\n if (!registerNavItems) {\n return;\n }\n\n const navItem: NavItem = {\n id: 'ggnomad',\n label: t('ggnomad.nav.root', 'GGNomad'),\n path: basePath,\n icon: <LayoutDashboard size={18} />,\n order: 80,\n group: 'products',\n children: [\n {\n id: 'ggnomad-dashboard',\n label: t('ggnomad.nav.dashboard', 'Dashboard'),\n path: basePath,\n icon: <LayoutDashboard size={16} />,\n order: 0,\n },\n {\n id: 'ggnomad-search',\n label: t('ggnomad.nav.search', 'Search'),\n path: joinPath(basePath, 'search'),\n icon: <Search size={16} />,\n order: 5,\n },\n {\n id: 'ggnomad-travel',\n label: t('ggnomad.nav.travel', 'Travel'),\n path: joinPath(basePath, 'travel'),\n icon: <Compass size={16} />,\n order: 10,\n },\n {\n id: 'ggnomad-hospitality',\n label: t('ggnomad.nav.hospitality', 'Hospitality'),\n path: joinPath(basePath, 'hospitality'),\n icon: <Building size={16} />,\n order: 20,\n },\n {\n id: 'ggnomad-tourism',\n label: t('ggnomad.nav.tourism', 'Tourism'),\n path: joinPath(basePath, 'tourism'),\n icon: <MapPinned size={16} />,\n order: 30,\n },\n {\n id: 'ggnomad-entertainment',\n label: t('ggnomad.nav.entertainment', 'Entertainment'),\n path: joinPath(basePath, 'entertainment'),\n icon: <Activity size={16} />,\n order: 40,\n },\n {\n id: 'ggnomad-trips',\n label: t('ggnomad.nav.trips', 'Trips'),\n path: joinPath(basePath, 'trips'),\n icon: <Map size={16} />,\n order: 45,\n },\n {\n id: 'ggnomad-bookings',\n label: t('ggnomad.nav.bookings', 'Bookings'),\n path: joinPath(basePath, 'bookings'),\n icon: <CalendarCheck size={16} />,\n order: 50,\n },\n {\n id: 'ggnomad-favorites',\n label: t('ggnomad.nav.favorites', 'Favorites'),\n path: joinPath(basePath, 'favorites'),\n icon: <Star size={16} />,\n order: 60,\n },\n {\n id: 'ggnomad-provider',\n label: t('ggnomad.nav.providers', 'Providers'),\n path: joinPath(basePath, 'provider'),\n icon: <Tickets size={16} />,\n order: 70,\n },\n {\n id: 'ggnomad-analytics',\n label: t('ggnomad.nav.analytics', 'Analytics'),\n path: joinPath(basePath, 'analytics'),\n icon: <BarChart3 size={16} />,\n order: 80,\n },\n ],\n };\n\n return registerNavItems(navItem);\n }, [registerNavItems, basePath, t]);\n\n useEffect(() => {\n if (!registerFooterItems) {\n return;\n }\n return registerFooterItems([\n {\n id: 'ggnomad-ready',\n label: t('ggnomad.footer.ready', 'GGNomad Ready'),\n type: 'status',\n section: 'left',\n order: 10,\n },\n ]);\n }, [registerFooterItems, t]);\n\n return (\n <FeatureFlagProvider workspaceId={null} gateway=\"global\" defaultEnabled={true}>\n <GGNomadProvider {...props}>\n <GGNomadRoutes />\n </GGNomadProvider>\n </FeatureFlagProvider>\n );\n};\n"],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"GGNomadRoot.js","names":[],"sources":["../../src/ggnomad/GGNomadRoot.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useEffect } from 'react';\nimport {\n Activity,\n BarChart3,\n Building,\n CalendarCheck,\n Compass,\n LayoutDashboard,\n MapPinned,\n Map,\n Search,\n ShieldCheck,\n Star,\n Tickets,\n} from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\nimport { GGNomadRoutes } from './GGNomadRoutes';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { GGNomadProvider } from './providers/GGNomadProvider';\nimport type { GGNomadRootProps, NavItem } from './types';\nimport { joinPath } from './utils/navigation';\n\nexport const GGNomadRoot: FC<GGNomadRootProps> = (props) => {\n const { registerNavItems, registerFooterItems, basePath = '/' } = props;\n const { t } = useI18n();\n\n useEffect(() => {\n if (!registerNavItems) {\n return;\n }\n\n const navItem: NavItem = {\n id: 'ggnomad',\n label: t('ggnomad.nav.root', 'GGNomad'),\n path: basePath,\n icon: <LayoutDashboard size={18} />,\n order: 80,\n group: 'products',\n children: [\n {\n id: 'ggnomad-dashboard',\n label: t('ggnomad.nav.dashboard', 'Dashboard'),\n path: basePath,\n icon: <LayoutDashboard size={16} />,\n order: 0,\n },\n {\n id: 'ggnomad-search',\n label: t('ggnomad.nav.search', 'Search'),\n path: joinPath(basePath, 'search'),\n icon: <Search size={16} />,\n order: 5,\n },\n {\n id: 'ggnomad-travel',\n label: t('ggnomad.nav.travel', 'Travel'),\n path: joinPath(basePath, 'travel'),\n icon: <Compass size={16} />,\n order: 10,\n },\n {\n id: 'ggnomad-hospitality',\n label: t('ggnomad.nav.hospitality', 'Hospitality'),\n path: joinPath(basePath, 'hospitality'),\n icon: <Building size={16} />,\n order: 20,\n },\n {\n id: 'ggnomad-tourism',\n label: t('ggnomad.nav.tourism', 'Tourism'),\n path: joinPath(basePath, 'tourism'),\n icon: <MapPinned size={16} />,\n order: 30,\n },\n {\n id: 'ggnomad-entertainment',\n label: t('ggnomad.nav.entertainment', 'Entertainment'),\n path: joinPath(basePath, 'entertainment'),\n icon: <Activity size={16} />,\n order: 40,\n },\n {\n id: 'ggnomad-trips',\n label: t('ggnomad.nav.trips', 'Trips'),\n path: joinPath(basePath, 'trips'),\n icon: <Map size={16} />,\n order: 45,\n },\n {\n id: 'ggnomad-bookings',\n label: t('ggnomad.nav.bookings', 'Bookings'),\n path: joinPath(basePath, 'bookings'),\n icon: <CalendarCheck size={16} />,\n order: 50,\n },\n {\n id: 'ggnomad-travel-policy',\n label: t('ggnomad.nav.travelPolicy', 'Travel Policy'),\n path: joinPath(basePath, 'travel-policy'),\n icon: <ShieldCheck size={16} />,\n order: 55,\n },\n {\n id: 'ggnomad-favorites',\n label: t('ggnomad.nav.favorites', 'Favorites'),\n path: joinPath(basePath, 'favorites'),\n icon: <Star size={16} />,\n order: 60,\n },\n {\n id: 'ggnomad-provider',\n label: t('ggnomad.nav.providers', 'Providers'),\n path: joinPath(basePath, 'provider'),\n icon: <Tickets size={16} />,\n order: 70,\n },\n {\n id: 'ggnomad-analytics',\n label: t('ggnomad.nav.analytics', 'Analytics'),\n path: joinPath(basePath, 'analytics'),\n icon: <BarChart3 size={16} />,\n order: 80,\n },\n ],\n };\n\n return registerNavItems(navItem);\n }, [registerNavItems, basePath, t]);\n\n useEffect(() => {\n if (!registerFooterItems) {\n return;\n }\n return registerFooterItems([\n {\n id: 'ggnomad-ready',\n label: t('ggnomad.footer.ready', 'GGNomad Ready'),\n type: 'status',\n section: 'left',\n order: 10,\n },\n ]);\n }, [registerFooterItems, t]);\n\n return (\n <FeatureFlagProvider workspaceId={null} gateway=\"global\" defaultEnabled={true}>\n <GGNomadProvider {...props}>\n <GGNomadRoutes />\n </GGNomadProvider>\n </FeatureFlagProvider>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GGNomadRoutes.d.ts","sourceRoot":"","sources":["../../src/ggnomad/GGNomadRoutes.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GGNomadRoutes.d.ts","sourceRoot":"","sources":["../../src/ggnomad/GGNomadRoutes.tsx"],"names":[],"mappings":"AA6DA,wBAAgB,aAAa,gCAyB5B"}
|
|
@@ -4,16 +4,16 @@ import { Loader2 as r } from "lucide-react";
|
|
|
4
4
|
import { Navigate as i, Route as a, Routes as o } from "react-router-dom";
|
|
5
5
|
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
6
6
|
//#region src/ggnomad/GGNomadRoutes.tsx
|
|
7
|
-
var l = n(() => import("./pages/SearchPage.js").then((e) => ({ default: e.SearchPage }))), u = n(() => import("./pages/TravelPage.js").then((e) => ({ default: e.TravelPage }))), d = n(() => import("./pages/HospitalityPage.js").then((e) => ({ default: e.HospitalityPage }))), f = n(() => import("./pages/PropertyDetailsPage.js").then((e) => ({ default: e.PropertyDetailsPage }))), p = n(() => import("./pages/TourismPage.js").then((e) => ({ default: e.TourismPage }))), m = n(() => import("./pages/TourDetailsPage.js").then((e) => ({ default: e.TourDetailsPage }))), h = n(() => import("./pages/ActivityDetailsPage.js").then((e) => ({ default: e.ActivityDetailsPage }))), g = n(() => import("./pages/EntertainmentPage.js").then((e) => ({ default: e.EntertainmentPage }))), _ = n(() => import("./pages/EventDetailsPage.js").then((e) => ({ default: e.EventDetailsPage }))), v = n(() => import("./pages/BookingsPage.js").then((e) => ({ default: e.BookingsPage }))), y = n(() => import("./pages/FavoritesPage.js").then((e) => ({ default: e.FavoritesPage }))), b = n(() => import("./pages/ProviderPage.js").then((e) => ({ default: e.ProviderPage }))), x = n(() => import("./pages/AnalyticsPage.js").then((e) => ({ default: e.AnalyticsPage }))), S = n(() => import("./pages/TripsPage.js").then((e) => ({ default: e.TripsPage }))), C = n(() => import("./pages/TripPlanDetailPage.js").then((e) => ({ default: e.TripPlanDetailPage })));
|
|
8
|
-
function
|
|
7
|
+
var l = n(() => import("./pages/SearchPage.js").then((e) => ({ default: e.SearchPage }))), u = n(() => import("./pages/TravelPage.js").then((e) => ({ default: e.TravelPage }))), d = n(() => import("./pages/HospitalityPage.js").then((e) => ({ default: e.HospitalityPage }))), f = n(() => import("./pages/PropertyDetailsPage.js").then((e) => ({ default: e.PropertyDetailsPage }))), p = n(() => import("./pages/TourismPage.js").then((e) => ({ default: e.TourismPage }))), m = n(() => import("./pages/TourDetailsPage.js").then((e) => ({ default: e.TourDetailsPage }))), h = n(() => import("./pages/ActivityDetailsPage.js").then((e) => ({ default: e.ActivityDetailsPage }))), g = n(() => import("./pages/EntertainmentPage.js").then((e) => ({ default: e.EntertainmentPage }))), _ = n(() => import("./pages/EventDetailsPage.js").then((e) => ({ default: e.EventDetailsPage }))), v = n(() => import("./pages/BookingsPage.js").then((e) => ({ default: e.BookingsPage }))), y = n(() => import("./pages/FavoritesPage.js").then((e) => ({ default: e.FavoritesPage }))), b = n(() => import("./pages/ProviderPage.js").then((e) => ({ default: e.ProviderPage }))), x = n(() => import("./pages/AnalyticsPage.js").then((e) => ({ default: e.AnalyticsPage }))), S = n(() => import("./pages/TripsPage.js").then((e) => ({ default: e.TripsPage }))), C = n(() => import("./pages/TripPlanDetailPage.js").then((e) => ({ default: e.TripPlanDetailPage }))), w = n(() => import("./pages/TravelPolicyPage.js").then((e) => ({ default: e.TravelPolicyPage })));
|
|
8
|
+
function T() {
|
|
9
9
|
return /* @__PURE__ */ s("div", {
|
|
10
10
|
className: "flex min-h-[320px] items-center justify-center",
|
|
11
11
|
children: /* @__PURE__ */ s(r, { className: "h-8 w-8 animate-spin text-primary" })
|
|
12
12
|
});
|
|
13
13
|
}
|
|
14
|
-
function
|
|
14
|
+
function E() {
|
|
15
15
|
return /* @__PURE__ */ s(t, {
|
|
16
|
-
fallback: /* @__PURE__ */ s(
|
|
16
|
+
fallback: /* @__PURE__ */ s(T, {}),
|
|
17
17
|
children: /* @__PURE__ */ c(o, { children: [
|
|
18
18
|
/* @__PURE__ */ s(a, {
|
|
19
19
|
index: !0,
|
|
@@ -59,6 +59,10 @@ function T() {
|
|
|
59
59
|
path: "bookings",
|
|
60
60
|
element: /* @__PURE__ */ s(v, {})
|
|
61
61
|
}),
|
|
62
|
+
/* @__PURE__ */ s(a, {
|
|
63
|
+
path: "travel-policy",
|
|
64
|
+
element: /* @__PURE__ */ s(w, {})
|
|
65
|
+
}),
|
|
62
66
|
/* @__PURE__ */ s(a, {
|
|
63
67
|
path: "favorites",
|
|
64
68
|
element: /* @__PURE__ */ s(y, {})
|
|
@@ -90,6 +94,6 @@ function T() {
|
|
|
90
94
|
});
|
|
91
95
|
}
|
|
92
96
|
//#endregion
|
|
93
|
-
export {
|
|
97
|
+
export { E as GGNomadRoutes };
|
|
94
98
|
|
|
95
99
|
//# sourceMappingURL=GGNomadRoutes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GGNomadRoutes.js","names":[],"sources":["../../src/ggnomad/GGNomadRoutes.tsx"],"sourcesContent":["import { lazy, Suspense } from 'react';\nimport { Loader2 } from 'lucide-react';\nimport { Navigate, Route, Routes } from 'react-router-dom';\n\nimport { DashboardPage } from './pages/DashboardPage';\n\nconst SearchPage = lazy(() =>\n import('./pages/SearchPage').then((m) => ({ default: m.SearchPage }))\n);\nconst TravelPage = lazy(() =>\n import('./pages/TravelPage').then((m) => ({ default: m.TravelPage }))\n);\nconst HospitalityPage = lazy(() =>\n import('./pages/HospitalityPage').then((m) => ({ default: m.HospitalityPage }))\n);\nconst PropertyDetailsPage = lazy(() =>\n import('./pages/PropertyDetailsPage').then((m) => ({ default: m.PropertyDetailsPage }))\n);\nconst TourismPage = lazy(() =>\n import('./pages/TourismPage').then((m) => ({ default: m.TourismPage }))\n);\nconst TourDetailsPage = lazy(() =>\n import('./pages/TourDetailsPage').then((m) => ({ default: m.TourDetailsPage }))\n);\nconst ActivityDetailsPage = lazy(() =>\n import('./pages/ActivityDetailsPage').then((m) => ({ default: m.ActivityDetailsPage }))\n);\nconst EntertainmentPage = lazy(() =>\n import('./pages/EntertainmentPage').then((m) => ({ default: m.EntertainmentPage }))\n);\nconst EventDetailsPage = lazy(() =>\n import('./pages/EventDetailsPage').then((m) => ({ default: m.EventDetailsPage }))\n);\nconst BookingsPage = lazy(() =>\n import('./pages/BookingsPage').then((m) => ({ default: m.BookingsPage }))\n);\nconst FavoritesPage = lazy(() =>\n import('./pages/FavoritesPage').then((m) => ({ default: m.FavoritesPage }))\n);\nconst ProviderPage = lazy(() =>\n import('./pages/ProviderPage').then((m) => ({ default: m.ProviderPage }))\n);\nconst AnalyticsPage = lazy(() =>\n import('./pages/AnalyticsPage').then((m) => ({ default: m.AnalyticsPage }))\n);\nconst TripsPage = lazy(() => import('./pages/TripsPage').then((m) => ({ default: m.TripsPage })));\nconst TripPlanDetailPage = lazy(() =>\n import('./pages/TripPlanDetailPage').then((m) => ({ default: m.TripPlanDetailPage }))\n);\n\nfunction PageLoader() {\n return (\n <div className=\"flex min-h-[320px] items-center justify-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n </div>\n );\n}\n\nexport function GGNomadRoutes() {\n return (\n <Suspense fallback={<PageLoader />}>\n <Routes>\n <Route index element={<DashboardPage />} />\n <Route path=\"search\" element={<SearchPage />} />\n <Route path=\"travel\" element={<TravelPage />} />\n <Route path=\"hospitality\" element={<HospitalityPage />} />\n <Route path=\"hospitality/:id\" element={<PropertyDetailsPage />} />\n <Route path=\"tourism\" element={<TourismPage />} />\n <Route path=\"tourism/tours/:id\" element={<TourDetailsPage />} />\n <Route path=\"tourism/activities/:id\" element={<ActivityDetailsPage />} />\n <Route path=\"entertainment\" element={<EntertainmentPage />} />\n <Route path=\"entertainment/:id\" element={<EventDetailsPage />} />\n <Route path=\"bookings\" element={<BookingsPage />} />\n <Route path=\"favorites\" element={<FavoritesPage />} />\n <Route path=\"provider\" element={<ProviderPage />} />\n <Route path=\"analytics\" element={<AnalyticsPage />} />\n <Route path=\"trips\" element={<TripsPage />} />\n <Route path=\"trips/:id\" element={<TripPlanDetailPage />} />\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GGNomadRoutes.js","names":[],"sources":["../../src/ggnomad/GGNomadRoutes.tsx"],"sourcesContent":["import { lazy, Suspense } from 'react';\nimport { Loader2 } from 'lucide-react';\nimport { Navigate, Route, Routes } from 'react-router-dom';\n\nimport { DashboardPage } from './pages/DashboardPage';\n\nconst SearchPage = lazy(() =>\n import('./pages/SearchPage').then((m) => ({ default: m.SearchPage }))\n);\nconst TravelPage = lazy(() =>\n import('./pages/TravelPage').then((m) => ({ default: m.TravelPage }))\n);\nconst HospitalityPage = lazy(() =>\n import('./pages/HospitalityPage').then((m) => ({ default: m.HospitalityPage }))\n);\nconst PropertyDetailsPage = lazy(() =>\n import('./pages/PropertyDetailsPage').then((m) => ({ default: m.PropertyDetailsPage }))\n);\nconst TourismPage = lazy(() =>\n import('./pages/TourismPage').then((m) => ({ default: m.TourismPage }))\n);\nconst TourDetailsPage = lazy(() =>\n import('./pages/TourDetailsPage').then((m) => ({ default: m.TourDetailsPage }))\n);\nconst ActivityDetailsPage = lazy(() =>\n import('./pages/ActivityDetailsPage').then((m) => ({ default: m.ActivityDetailsPage }))\n);\nconst EntertainmentPage = lazy(() =>\n import('./pages/EntertainmentPage').then((m) => ({ default: m.EntertainmentPage }))\n);\nconst EventDetailsPage = lazy(() =>\n import('./pages/EventDetailsPage').then((m) => ({ default: m.EventDetailsPage }))\n);\nconst BookingsPage = lazy(() =>\n import('./pages/BookingsPage').then((m) => ({ default: m.BookingsPage }))\n);\nconst FavoritesPage = lazy(() =>\n import('./pages/FavoritesPage').then((m) => ({ default: m.FavoritesPage }))\n);\nconst ProviderPage = lazy(() =>\n import('./pages/ProviderPage').then((m) => ({ default: m.ProviderPage }))\n);\nconst AnalyticsPage = lazy(() =>\n import('./pages/AnalyticsPage').then((m) => ({ default: m.AnalyticsPage }))\n);\nconst TripsPage = lazy(() => import('./pages/TripsPage').then((m) => ({ default: m.TripsPage })));\nconst TripPlanDetailPage = lazy(() =>\n import('./pages/TripPlanDetailPage').then((m) => ({ default: m.TripPlanDetailPage }))\n);\nconst TravelPolicyPage = lazy(() =>\n import('./pages/TravelPolicyPage').then((m) => ({ default: m.TravelPolicyPage }))\n);\n\nfunction PageLoader() {\n return (\n <div className=\"flex min-h-[320px] items-center justify-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n </div>\n );\n}\n\nexport function GGNomadRoutes() {\n return (\n <Suspense fallback={<PageLoader />}>\n <Routes>\n <Route index element={<DashboardPage />} />\n <Route path=\"search\" element={<SearchPage />} />\n <Route path=\"travel\" element={<TravelPage />} />\n <Route path=\"hospitality\" element={<HospitalityPage />} />\n <Route path=\"hospitality/:id\" element={<PropertyDetailsPage />} />\n <Route path=\"tourism\" element={<TourismPage />} />\n <Route path=\"tourism/tours/:id\" element={<TourDetailsPage />} />\n <Route path=\"tourism/activities/:id\" element={<ActivityDetailsPage />} />\n <Route path=\"entertainment\" element={<EntertainmentPage />} />\n <Route path=\"entertainment/:id\" element={<EventDetailsPage />} />\n <Route path=\"bookings\" element={<BookingsPage />} />\n <Route path=\"travel-policy\" element={<TravelPolicyPage />} />\n <Route path=\"favorites\" element={<FavoritesPage />} />\n <Route path=\"provider\" element={<ProviderPage />} />\n <Route path=\"analytics\" element={<AnalyticsPage />} />\n <Route path=\"trips\" element={<TripsPage />} />\n <Route path=\"trips/:id\" element={<TripPlanDetailPage />} />\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface CreateTravelPolicyDialogProps {
|
|
2
|
+
open: boolean;
|
|
3
|
+
onOpenChange: (open: boolean) => void;
|
|
4
|
+
onCreated?: () => void;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Manager-only form (BOFF-4365) for defining a corporate travel policy:
|
|
8
|
+
* budget caps, blocked destinations, allowed travel classes, and an
|
|
9
|
+
* always-require-approval override. `costCenter` left blank applies the
|
|
10
|
+
* policy workspace-wide; a value scopes it to just that department.
|
|
11
|
+
*/
|
|
12
|
+
export declare function CreateTravelPolicyDialog({ open, onOpenChange, onCreated, }: CreateTravelPolicyDialogProps): import("react").JSX.Element;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=CreateTravelPolicyDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateTravelPolicyDialog.d.ts","sourceRoot":"","sources":["../../../src/ggnomad/components/CreateTravelPolicyDialog.tsx"],"names":[],"mappings":"AAmBA,UAAU,6BAA6B;IACrC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAiBD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,IAAI,EACJ,YAAY,EACZ,SAAS,GACV,EAAE,6BAA6B,+BA0Q/B"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { CREATE_GGNOMAD_TRAVEL_POLICY_MUTATION as e } from "../graphql.js";
|
|
2
|
+
import { notify as t } from "../utils/notify.js";
|
|
3
|
+
import { useState as n } from "react";
|
|
4
|
+
import { ShieldCheck as r } from "lucide-react";
|
|
5
|
+
import { useI18n as i } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
6
|
+
import { useMutation as a } from "@apollo/client/react";
|
|
7
|
+
import { AlertDialog as o, AlertDialogAction as s, AlertDialogCancel as c, AlertDialogContent as l, AlertDialogDescription as u, AlertDialogFooter as d, AlertDialogHeader as f, AlertDialogTitle as p } from "@burdenoff/fe-libs/ui";
|
|
8
|
+
import { jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
9
|
+
//#region src/ggnomad/components/CreateTravelPolicyDialog.tsx
|
|
10
|
+
var g = "mt-1 w-full rounded-md border border-border-seam bg-bg-canvas px-3 py-2 text-sm text-text-primary placeholder-text-secondary focus:border-action-primary-bg focus:outline-none focus:ring-1 focus:ring-action-primary-bg disabled:opacity-50", _ = "block text-sm font-medium text-text-primary";
|
|
11
|
+
function v({ open: v, onOpenChange: y, onCreated: b }) {
|
|
12
|
+
let { t: x } = i(), [S, C] = n(""), [w, T] = n(""), [E, D] = n("USD"), [O, k] = n(""), [A, j] = n(""), [M, N] = n(""), [P, F] = n(""), [I, L] = n(!1), [R, { loading: z }] = a(e), B = () => {
|
|
13
|
+
C(""), T(""), D("USD"), k(""), j(""), N(""), F(""), L(!1);
|
|
14
|
+
}, V = async () => {
|
|
15
|
+
if (!S.trim()) {
|
|
16
|
+
t.warning(x("ggnomad.travelPolicy.create.nameRequiredTitle", "Name is required"), x("ggnomad.travelPolicy.create.nameRequiredBody", "Give this policy a short, recognizable name."));
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
let e = {
|
|
20
|
+
name: S.trim(),
|
|
21
|
+
costCenter: w.trim() || null,
|
|
22
|
+
currency: E.trim() || "USD",
|
|
23
|
+
maxBookingAmount: O.trim() ? Number(O) : null,
|
|
24
|
+
maxMonthlyPerTraveler: A.trim() ? Number(A) : null,
|
|
25
|
+
blockedDestinations: M.split(",").map((e) => e.trim()).filter(Boolean),
|
|
26
|
+
allowedTravelClasses: P.split(",").map((e) => e.trim().toUpperCase()).filter(Boolean),
|
|
27
|
+
requireApprovalAlways: I
|
|
28
|
+
};
|
|
29
|
+
try {
|
|
30
|
+
let n = await R({ variables: { input: e } });
|
|
31
|
+
if (n.error) {
|
|
32
|
+
t.error(x("ggnomad.travelPolicy.create.errorTitle", "Could not create policy"), n.error.message);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
t.success(x("ggnomad.travelPolicy.create.successTitle", "Travel policy created"), n.data?.createGgnomadTravelPolicy.name ?? S), B(), y(!1), b?.();
|
|
36
|
+
} catch (e) {
|
|
37
|
+
t.error(x("ggnomad.travelPolicy.create.errorTitle", "Could not create policy"), e instanceof Error ? e.message : String(e));
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
return /* @__PURE__ */ m(o, {
|
|
41
|
+
open: v,
|
|
42
|
+
onOpenChange: (e) => {
|
|
43
|
+
e || B(), y(e);
|
|
44
|
+
},
|
|
45
|
+
children: /* @__PURE__ */ h(l, {
|
|
46
|
+
className: "max-w-2xl",
|
|
47
|
+
children: [
|
|
48
|
+
/* @__PURE__ */ h(f, { children: [/* @__PURE__ */ h(p, {
|
|
49
|
+
className: "flex items-center gap-2",
|
|
50
|
+
children: [/* @__PURE__ */ m(r, { className: "size-4" }), x("ggnomad.travelPolicy.create.title", "New travel policy")]
|
|
51
|
+
}), /* @__PURE__ */ m(u, { children: x("ggnomad.travelPolicy.create.description", "Bookings that violate an active policy are held for manager approval instead of confirming automatically.") })] }),
|
|
52
|
+
/* @__PURE__ */ h("div", {
|
|
53
|
+
className: "grid gap-4 sm:grid-cols-2",
|
|
54
|
+
children: [
|
|
55
|
+
/* @__PURE__ */ h("div", {
|
|
56
|
+
className: "sm:col-span-2",
|
|
57
|
+
children: [/* @__PURE__ */ m("label", {
|
|
58
|
+
htmlFor: "policy-name",
|
|
59
|
+
className: _,
|
|
60
|
+
children: x("ggnomad.travelPolicy.create.nameLabel", "Policy name")
|
|
61
|
+
}), /* @__PURE__ */ m("input", {
|
|
62
|
+
id: "policy-name",
|
|
63
|
+
type: "text",
|
|
64
|
+
value: S,
|
|
65
|
+
onChange: (e) => C(e.target.value),
|
|
66
|
+
disabled: z,
|
|
67
|
+
className: g,
|
|
68
|
+
placeholder: x("ggnomad.travelPolicy.create.namePlaceholder", "e.g. Sales Team Travel Policy")
|
|
69
|
+
})]
|
|
70
|
+
}),
|
|
71
|
+
/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
|
|
72
|
+
htmlFor: "policy-cost-center",
|
|
73
|
+
className: _,
|
|
74
|
+
children: x("ggnomad.travelPolicy.create.costCenterLabel", "Cost center (optional)")
|
|
75
|
+
}), /* @__PURE__ */ m("input", {
|
|
76
|
+
id: "policy-cost-center",
|
|
77
|
+
type: "text",
|
|
78
|
+
value: w,
|
|
79
|
+
onChange: (e) => T(e.target.value),
|
|
80
|
+
disabled: z,
|
|
81
|
+
className: g,
|
|
82
|
+
placeholder: x("ggnomad.travelPolicy.create.costCenterPlaceholder", "Blank = whole workspace")
|
|
83
|
+
})] }),
|
|
84
|
+
/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
|
|
85
|
+
htmlFor: "policy-currency",
|
|
86
|
+
className: _,
|
|
87
|
+
children: x("ggnomad.travelPolicy.create.currencyLabel", "Currency")
|
|
88
|
+
}), /* @__PURE__ */ m("input", {
|
|
89
|
+
id: "policy-currency",
|
|
90
|
+
type: "text",
|
|
91
|
+
value: E,
|
|
92
|
+
onChange: (e) => D(e.target.value.toUpperCase()),
|
|
93
|
+
disabled: z,
|
|
94
|
+
maxLength: 10,
|
|
95
|
+
className: g
|
|
96
|
+
})] }),
|
|
97
|
+
/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
|
|
98
|
+
htmlFor: "policy-max-booking",
|
|
99
|
+
className: _,
|
|
100
|
+
children: x("ggnomad.travelPolicy.create.maxBookingLabel", "Max per booking (optional)")
|
|
101
|
+
}), /* @__PURE__ */ m("input", {
|
|
102
|
+
id: "policy-max-booking",
|
|
103
|
+
type: "number",
|
|
104
|
+
step: "0.01",
|
|
105
|
+
min: "0",
|
|
106
|
+
value: O,
|
|
107
|
+
onChange: (e) => k(e.target.value),
|
|
108
|
+
disabled: z,
|
|
109
|
+
className: g,
|
|
110
|
+
placeholder: "500.00"
|
|
111
|
+
})] }),
|
|
112
|
+
/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
|
|
113
|
+
htmlFor: "policy-max-monthly",
|
|
114
|
+
className: _,
|
|
115
|
+
children: x("ggnomad.travelPolicy.create.maxMonthlyLabel", "Max per traveler / month (optional)")
|
|
116
|
+
}), /* @__PURE__ */ m("input", {
|
|
117
|
+
id: "policy-max-monthly",
|
|
118
|
+
type: "number",
|
|
119
|
+
step: "0.01",
|
|
120
|
+
min: "0",
|
|
121
|
+
value: A,
|
|
122
|
+
onChange: (e) => j(e.target.value),
|
|
123
|
+
disabled: z,
|
|
124
|
+
className: g,
|
|
125
|
+
placeholder: "2000.00"
|
|
126
|
+
})] }),
|
|
127
|
+
/* @__PURE__ */ h("div", {
|
|
128
|
+
className: "sm:col-span-2",
|
|
129
|
+
children: [/* @__PURE__ */ m("label", {
|
|
130
|
+
htmlFor: "policy-blocked-destinations",
|
|
131
|
+
className: _,
|
|
132
|
+
children: x("ggnomad.travelPolicy.create.blockedDestinationsLabel", "Blocked destinations (comma-separated)")
|
|
133
|
+
}), /* @__PURE__ */ m("input", {
|
|
134
|
+
id: "policy-blocked-destinations",
|
|
135
|
+
type: "text",
|
|
136
|
+
value: M,
|
|
137
|
+
onChange: (e) => N(e.target.value),
|
|
138
|
+
disabled: z,
|
|
139
|
+
className: g,
|
|
140
|
+
placeholder: "Dubai, Moscow"
|
|
141
|
+
})]
|
|
142
|
+
}),
|
|
143
|
+
/* @__PURE__ */ h("div", {
|
|
144
|
+
className: "sm:col-span-2",
|
|
145
|
+
children: [/* @__PURE__ */ m("label", {
|
|
146
|
+
htmlFor: "policy-allowed-classes",
|
|
147
|
+
className: _,
|
|
148
|
+
children: x("ggnomad.travelPolicy.create.allowedClassesLabel", "Allowed travel classes (comma-separated, optional)")
|
|
149
|
+
}), /* @__PURE__ */ m("input", {
|
|
150
|
+
id: "policy-allowed-classes",
|
|
151
|
+
type: "text",
|
|
152
|
+
value: P,
|
|
153
|
+
onChange: (e) => F(e.target.value),
|
|
154
|
+
disabled: z,
|
|
155
|
+
className: g,
|
|
156
|
+
placeholder: "ECONOMY, PREMIUM_ECONOMY"
|
|
157
|
+
})]
|
|
158
|
+
}),
|
|
159
|
+
/* @__PURE__ */ h("label", {
|
|
160
|
+
className: "flex items-center gap-2 sm:col-span-2",
|
|
161
|
+
children: [/* @__PURE__ */ m("input", {
|
|
162
|
+
type: "checkbox",
|
|
163
|
+
checked: I,
|
|
164
|
+
onChange: (e) => L(e.target.checked),
|
|
165
|
+
disabled: z,
|
|
166
|
+
className: "size-4 rounded border-border-seam"
|
|
167
|
+
}), /* @__PURE__ */ m("span", {
|
|
168
|
+
className: "text-sm text-text-primary",
|
|
169
|
+
children: x("ggnomad.travelPolicy.create.requireApprovalAlwaysLabel", "Always require manager approval under this policy")
|
|
170
|
+
})]
|
|
171
|
+
})
|
|
172
|
+
]
|
|
173
|
+
}),
|
|
174
|
+
/* @__PURE__ */ h(d, { children: [/* @__PURE__ */ m(c, {
|
|
175
|
+
disabled: z,
|
|
176
|
+
children: x("ggnomad.travelPolicy.create.cancel", "Cancel")
|
|
177
|
+
}), /* @__PURE__ */ m(s, {
|
|
178
|
+
onClick: (e) => {
|
|
179
|
+
e.preventDefault(), V();
|
|
180
|
+
},
|
|
181
|
+
disabled: z,
|
|
182
|
+
className: "bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bgHover",
|
|
183
|
+
children: z ? x("ggnomad.travelPolicy.create.saving", "Creating…") : x("ggnomad.travelPolicy.create.save", "Create policy")
|
|
184
|
+
})] })
|
|
185
|
+
]
|
|
186
|
+
})
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
//#endregion
|
|
190
|
+
export { v as CreateTravelPolicyDialog };
|
|
191
|
+
|
|
192
|
+
//# sourceMappingURL=CreateTravelPolicyDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateTravelPolicyDialog.js","names":[],"sources":["../../../src/ggnomad/components/CreateTravelPolicyDialog.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useMutation } from '@apollo/client/react';\nimport type { TypedDocumentNode } from '@apollo/client';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { ShieldCheck } from 'lucide-react';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '@burdenoff/fe-libs/ui';\n\nimport { CREATE_GGNOMAD_TRAVEL_POLICY_MUTATION } from '../graphql';\nimport { notify } from '../utils/notify';\n\ninterface CreateTravelPolicyDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onCreated?: () => void;\n}\n\ntype CreateGgnomadTravelPolicyInput = {\n name: string;\n costCenter?: string | null;\n currency?: string;\n maxBookingAmount?: number | null;\n maxMonthlyPerTraveler?: number | null;\n blockedDestinations?: string[];\n allowedTravelClasses?: string[];\n requireApprovalAlways?: boolean;\n};\n\nconst fieldClass =\n 'mt-1 w-full rounded-md border border-border-seam bg-bg-canvas px-3 py-2 text-sm text-text-primary placeholder-text-secondary focus:border-action-primary-bg focus:outline-none focus:ring-1 focus:ring-action-primary-bg disabled:opacity-50';\nconst labelClass = 'block text-sm font-medium text-text-primary';\n\n/**\n * Manager-only form (BOFF-4365) for defining a corporate travel policy:\n * budget caps, blocked destinations, allowed travel classes, and an\n * always-require-approval override. `costCenter` left blank applies the\n * policy workspace-wide; a value scopes it to just that department.\n */\nexport function CreateTravelPolicyDialog({\n open,\n onOpenChange,\n onCreated,\n}: CreateTravelPolicyDialogProps) {\n const { t } = useI18n();\n const [name, setName] = useState('');\n const [costCenter, setCostCenter] = useState('');\n const [currency, setCurrency] = useState('USD');\n const [maxBookingAmount, setMaxBookingAmount] = useState('');\n const [maxMonthlyPerTraveler, setMaxMonthlyPerTraveler] = useState('');\n const [blockedDestinationsText, setBlockedDestinationsText] = useState('');\n const [allowedTravelClassesText, setAllowedTravelClassesText] = useState('');\n const [requireApprovalAlways, setRequireApprovalAlways] = useState(false);\n\n const [createTravelPolicy, { loading }] = useMutation(\n CREATE_GGNOMAD_TRAVEL_POLICY_MUTATION as TypedDocumentNode<\n { createGgnomadTravelPolicy: { id: string; name: string } },\n { input: CreateGgnomadTravelPolicyInput }\n >\n );\n\n const resetForm = () => {\n setName('');\n setCostCenter('');\n setCurrency('USD');\n setMaxBookingAmount('');\n setMaxMonthlyPerTraveler('');\n setBlockedDestinationsText('');\n setAllowedTravelClassesText('');\n setRequireApprovalAlways(false);\n };\n\n const handleCreate = async () => {\n if (!name.trim()) {\n notify.warning(\n t('ggnomad.travelPolicy.create.nameRequiredTitle', 'Name is required'),\n t(\n 'ggnomad.travelPolicy.create.nameRequiredBody',\n 'Give this policy a short, recognizable name.'\n )\n );\n return;\n }\n\n const input: CreateGgnomadTravelPolicyInput = {\n name: name.trim(),\n costCenter: costCenter.trim() || null,\n currency: currency.trim() || 'USD',\n maxBookingAmount: maxBookingAmount.trim() ? Number(maxBookingAmount) : null,\n maxMonthlyPerTraveler: maxMonthlyPerTraveler.trim() ? Number(maxMonthlyPerTraveler) : null,\n blockedDestinations: blockedDestinationsText\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean),\n allowedTravelClasses: allowedTravelClassesText\n .split(',')\n .map((entry) => entry.trim().toUpperCase())\n .filter(Boolean),\n requireApprovalAlways,\n };\n\n try {\n const result = await createTravelPolicy({ variables: { input } });\n if (result.error) {\n notify.error(\n t('ggnomad.travelPolicy.create.errorTitle', 'Could not create policy'),\n result.error.message\n );\n return;\n }\n notify.success(\n t('ggnomad.travelPolicy.create.successTitle', 'Travel policy created'),\n result.data?.createGgnomadTravelPolicy.name ?? name\n );\n resetForm();\n onOpenChange(false);\n onCreated?.();\n } catch (err) {\n notify.error(\n t('ggnomad.travelPolicy.create.errorTitle', 'Could not create policy'),\n err instanceof Error ? err.message : String(err)\n );\n }\n };\n\n return (\n <AlertDialog\n open={open}\n onOpenChange={(next) => {\n if (!next) resetForm();\n onOpenChange(next);\n }}\n >\n <AlertDialogContent className=\"max-w-2xl\">\n <AlertDialogHeader>\n <AlertDialogTitle className=\"flex items-center gap-2\">\n <ShieldCheck className=\"size-4\" />\n {t('ggnomad.travelPolicy.create.title', 'New travel policy')}\n </AlertDialogTitle>\n <AlertDialogDescription>\n {t(\n 'ggnomad.travelPolicy.create.description',\n 'Bookings that violate an active policy are held for manager approval instead of confirming automatically.'\n )}\n </AlertDialogDescription>\n </AlertDialogHeader>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"sm:col-span-2\">\n <label htmlFor=\"policy-name\" className={labelClass}>\n {t('ggnomad.travelPolicy.create.nameLabel', 'Policy name')}\n </label>\n <input\n id=\"policy-name\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n disabled={loading}\n className={fieldClass}\n placeholder={t(\n 'ggnomad.travelPolicy.create.namePlaceholder',\n 'e.g. Sales Team Travel Policy'\n )}\n />\n </div>\n\n <div>\n <label htmlFor=\"policy-cost-center\" className={labelClass}>\n {t('ggnomad.travelPolicy.create.costCenterLabel', 'Cost center (optional)')}\n </label>\n <input\n id=\"policy-cost-center\"\n type=\"text\"\n value={costCenter}\n onChange={(e) => setCostCenter(e.target.value)}\n disabled={loading}\n className={fieldClass}\n placeholder={t(\n 'ggnomad.travelPolicy.create.costCenterPlaceholder',\n 'Blank = whole workspace'\n )}\n />\n </div>\n\n <div>\n <label htmlFor=\"policy-currency\" className={labelClass}>\n {t('ggnomad.travelPolicy.create.currencyLabel', 'Currency')}\n </label>\n <input\n id=\"policy-currency\"\n type=\"text\"\n value={currency}\n onChange={(e) => setCurrency(e.target.value.toUpperCase())}\n disabled={loading}\n maxLength={10}\n className={fieldClass}\n />\n </div>\n\n <div>\n <label htmlFor=\"policy-max-booking\" className={labelClass}>\n {t('ggnomad.travelPolicy.create.maxBookingLabel', 'Max per booking (optional)')}\n </label>\n <input\n id=\"policy-max-booking\"\n type=\"number\"\n step=\"0.01\"\n min=\"0\"\n value={maxBookingAmount}\n onChange={(e) => setMaxBookingAmount(e.target.value)}\n disabled={loading}\n className={fieldClass}\n placeholder=\"500.00\"\n />\n </div>\n\n <div>\n <label htmlFor=\"policy-max-monthly\" className={labelClass}>\n {t(\n 'ggnomad.travelPolicy.create.maxMonthlyLabel',\n 'Max per traveler / month (optional)'\n )}\n </label>\n <input\n id=\"policy-max-monthly\"\n type=\"number\"\n step=\"0.01\"\n min=\"0\"\n value={maxMonthlyPerTraveler}\n onChange={(e) => setMaxMonthlyPerTraveler(e.target.value)}\n disabled={loading}\n className={fieldClass}\n placeholder=\"2000.00\"\n />\n </div>\n\n <div className=\"sm:col-span-2\">\n <label htmlFor=\"policy-blocked-destinations\" className={labelClass}>\n {t(\n 'ggnomad.travelPolicy.create.blockedDestinationsLabel',\n 'Blocked destinations (comma-separated)'\n )}\n </label>\n <input\n id=\"policy-blocked-destinations\"\n type=\"text\"\n value={blockedDestinationsText}\n onChange={(e) => setBlockedDestinationsText(e.target.value)}\n disabled={loading}\n className={fieldClass}\n placeholder=\"Dubai, Moscow\"\n />\n </div>\n\n <div className=\"sm:col-span-2\">\n <label htmlFor=\"policy-allowed-classes\" className={labelClass}>\n {t(\n 'ggnomad.travelPolicy.create.allowedClassesLabel',\n 'Allowed travel classes (comma-separated, optional)'\n )}\n </label>\n <input\n id=\"policy-allowed-classes\"\n type=\"text\"\n value={allowedTravelClassesText}\n onChange={(e) => setAllowedTravelClassesText(e.target.value)}\n disabled={loading}\n className={fieldClass}\n placeholder=\"ECONOMY, PREMIUM_ECONOMY\"\n />\n </div>\n\n <label className=\"flex items-center gap-2 sm:col-span-2\">\n <input\n type=\"checkbox\"\n checked={requireApprovalAlways}\n onChange={(e) => setRequireApprovalAlways(e.target.checked)}\n disabled={loading}\n className=\"size-4 rounded border-border-seam\"\n />\n <span className=\"text-sm text-text-primary\">\n {t(\n 'ggnomad.travelPolicy.create.requireApprovalAlwaysLabel',\n 'Always require manager approval under this policy'\n )}\n </span>\n </label>\n </div>\n\n <AlertDialogFooter>\n <AlertDialogCancel disabled={loading}>\n {t('ggnomad.travelPolicy.create.cancel', 'Cancel')}\n </AlertDialogCancel>\n <AlertDialogAction\n onClick={(event) => {\n event.preventDefault();\n void handleCreate();\n }}\n disabled={loading}\n className=\"bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bgHover\"\n >\n {loading\n ? t('ggnomad.travelPolicy.create.saving', 'Creating…')\n : t('ggnomad.travelPolicy.create.save', 'Create policy')}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n"],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ export { DetailHero } from './DetailHero';
|
|
|
8
8
|
export { BookingPanel } from './BookingPanel';
|
|
9
9
|
export { ReviewsSection } from './ReviewsSection';
|
|
10
10
|
export { ListingEditDialog } from './ListingEditDialog';
|
|
11
|
+
export { CreateTravelPolicyDialog } from './CreateTravelPolicyDialog';
|
|
11
12
|
export { TicketDialog } from './TicketDialog';
|
|
12
13
|
export type { GgnomadTicket } from './TicketDialog';
|
|
13
14
|
export { RedeemTicketPanel } from './RedeemTicketPanel';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ggnomad/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ggnomad/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -48,4 +48,12 @@ export declare const UPDATE_GGNOMAD_PROPERTY_MUTATION: import('graphql').Documen
|
|
|
48
48
|
export declare const UPDATE_GGNOMAD_TOUR_MUTATION: import('graphql').DocumentNode;
|
|
49
49
|
export declare const UPDATE_GGNOMAD_EVENT_MUTATION: import('graphql').DocumentNode;
|
|
50
50
|
export declare const UPDATE_GGNOMAD_ACTIVITY_MUTATION: import('graphql').DocumentNode;
|
|
51
|
+
export declare const GGNOMAD_TRAVEL_POLICIES_QUERY: import('graphql').DocumentNode;
|
|
52
|
+
export declare const CREATE_GGNOMAD_TRAVEL_POLICY_MUTATION: import('graphql').DocumentNode;
|
|
53
|
+
export declare const UPDATE_GGNOMAD_TRAVEL_POLICY_MUTATION: import('graphql').DocumentNode;
|
|
54
|
+
export declare const DELETE_GGNOMAD_TRAVEL_POLICY_MUTATION: import('graphql').DocumentNode;
|
|
55
|
+
export declare const GGNOMAD_BOOKING_APPROVALS_QUERY: import('graphql').DocumentNode;
|
|
56
|
+
export declare const APPROVE_GGNOMAD_BOOKING_APPROVAL_MUTATION: import('graphql').DocumentNode;
|
|
57
|
+
export declare const REJECT_GGNOMAD_BOOKING_APPROVAL_MUTATION: import('graphql').DocumentNode;
|
|
58
|
+
export declare const GGNOMAD_SPEND_SUMMARY_QUERY: import('graphql').DocumentNode;
|
|
51
59
|
//# sourceMappingURL=graphql.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphql.d.ts","sourceRoot":"","sources":["../../src/ggnomad/graphql.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sBAAsB,gCAgBlC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,gCA2BzC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,gCAmB1C,CAAC;AAEF,eAAO,MAAM,uBAAuB,gCAenC,CAAC;AAEF,eAAO,MAAM,wBAAwB,gCAkBpC,CAAC;AAEF,eAAO,MAAM,sBAAsB,gCA4BlC,CAAC;AAGF,eAAO,MAAM,kCAAkC,gCAS9C,CAAC;AAEF,eAAO,MAAM,mBAAmB,gCAkB/B,CAAC;AAEF,eAAO,MAAM,kBAAkB,gCAwB9B,CAAC;AAEF,eAAO,MAAM,oBAAoB,gCAiBhC,CAAC;AAEF,eAAO,MAAM,mBAAmB,gCAuB/B,CAAC;AAEF,eAAO,MAAM,wBAAwB,gCAoBpC,CAAC;AAEF,eAAO,MAAM,sBAAsB,gCA0BlC,CAAC;AAEF,eAAO,MAAM,mBAAmB,gCAoB/B,CAAC;AAEF,eAAO,MAAM,sBAAsB,gCAwBlC,CAAC;AAEF,eAAO,MAAM,uBAAuB,gCAInC,CAAC;AAEF,eAAO,MAAM,+BAA+B,gCAe3C,CAAC;AAEF,eAAO,MAAM,gCAAgC,gCAI5C,CAAC;AAEF,eAAO,MAAM,+BAA+B,gCAO3C,CAAC;AAGF,eAAO,MAAM,qBAAqB,gCAejC,CAAC;AAEF,eAAO,MAAM,6BAA6B,gCAWzC,CAAC;AAEF,eAAO,MAAM,8BAA8B,gCAW1C,CAAC;AAEF,eAAO,MAAM,8BAA8B,gCAS1C,CAAC;AAGF,eAAO,MAAM,wBAAwB,gCAepC,CAAC;AAEF,eAAO,MAAM,uBAAuB,gCA2BnC,CAAC;AAGF,eAAO,MAAM,iCAAiC,gCAe7C,CAAC;AAEF,eAAO,MAAM,iCAAiC,gCAe7C,CAAC;AAEF,eAAO,MAAM,iCAAiC,gCAI7C,CAAC;AAEF,eAAO,MAAM,mCAAmC,gCAc/C,CAAC;AAEF,eAAO,MAAM,sCAAsC,gCAIlD,CAAC;AAGF,eAAO,MAAM,4BAA4B,gCAQxC,CAAC;AAEF,eAAO,MAAM,qBAAqB,gCAwBjC,CAAC;AAGF,eAAO,MAAM,8BAA8B,gCAS1C,CAAC;AAEF,eAAO,MAAM,+BAA+B,gCAQ3C,CAAC;AAGF,eAAO,MAAM,gCAAgC,gCAW5C,CAAC;AAEF,eAAO,MAAM,4BAA4B,gCAWxC,CAAC;AAEF,eAAO,MAAM,6BAA6B,gCAWzC,CAAC;AAEF,eAAO,MAAM,gCAAgC,gCAW5C,CAAC"}
|
|
1
|
+
{"version":3,"file":"graphql.d.ts","sourceRoot":"","sources":["../../src/ggnomad/graphql.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sBAAsB,gCAgBlC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,gCA2BzC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,gCAmB1C,CAAC;AAEF,eAAO,MAAM,uBAAuB,gCAenC,CAAC;AAEF,eAAO,MAAM,wBAAwB,gCAkBpC,CAAC;AAEF,eAAO,MAAM,sBAAsB,gCA4BlC,CAAC;AAGF,eAAO,MAAM,kCAAkC,gCAS9C,CAAC;AAEF,eAAO,MAAM,mBAAmB,gCAkB/B,CAAC;AAEF,eAAO,MAAM,kBAAkB,gCAwB9B,CAAC;AAEF,eAAO,MAAM,oBAAoB,gCAiBhC,CAAC;AAEF,eAAO,MAAM,mBAAmB,gCAuB/B,CAAC;AAEF,eAAO,MAAM,wBAAwB,gCAoBpC,CAAC;AAEF,eAAO,MAAM,sBAAsB,gCA0BlC,CAAC;AAEF,eAAO,MAAM,mBAAmB,gCAoB/B,CAAC;AAEF,eAAO,MAAM,sBAAsB,gCAwBlC,CAAC;AAEF,eAAO,MAAM,uBAAuB,gCAInC,CAAC;AAEF,eAAO,MAAM,+BAA+B,gCAe3C,CAAC;AAEF,eAAO,MAAM,gCAAgC,gCAI5C,CAAC;AAEF,eAAO,MAAM,+BAA+B,gCAO3C,CAAC;AAGF,eAAO,MAAM,qBAAqB,gCAejC,CAAC;AAEF,eAAO,MAAM,6BAA6B,gCAWzC,CAAC;AAEF,eAAO,MAAM,8BAA8B,gCAW1C,CAAC;AAEF,eAAO,MAAM,8BAA8B,gCAS1C,CAAC;AAGF,eAAO,MAAM,wBAAwB,gCAepC,CAAC;AAEF,eAAO,MAAM,uBAAuB,gCA2BnC,CAAC;AAGF,eAAO,MAAM,iCAAiC,gCAe7C,CAAC;AAEF,eAAO,MAAM,iCAAiC,gCAe7C,CAAC;AAEF,eAAO,MAAM,iCAAiC,gCAI7C,CAAC;AAEF,eAAO,MAAM,mCAAmC,gCAc/C,CAAC;AAEF,eAAO,MAAM,sCAAsC,gCAIlD,CAAC;AAGF,eAAO,MAAM,4BAA4B,gCAQxC,CAAC;AAEF,eAAO,MAAM,qBAAqB,gCAwBjC,CAAC;AAGF,eAAO,MAAM,8BAA8B,gCAS1C,CAAC;AAEF,eAAO,MAAM,+BAA+B,gCAQ3C,CAAC;AAGF,eAAO,MAAM,gCAAgC,gCAW5C,CAAC;AAEF,eAAO,MAAM,4BAA4B,gCAWxC,CAAC;AAEF,eAAO,MAAM,6BAA6B,gCAWzC,CAAC;AAEF,eAAO,MAAM,gCAAgC,gCAW5C,CAAC;AAGF,eAAO,MAAM,6BAA6B,gCAgBzC,CAAC;AAEF,eAAO,MAAM,qCAAqC,gCAejD,CAAC;AAEF,eAAO,MAAM,qCAAqC,gCAOjD,CAAC;AAEF,eAAO,MAAM,qCAAqC,gCAIjD,CAAC;AAEF,eAAO,MAAM,+BAA+B,gCAwB3C,CAAC;AAEF,eAAO,MAAM,yCAAyC,gCASrD,CAAC;AAEF,eAAO,MAAM,wCAAwC,gCAUpD,CAAC;AAEF,eAAO,MAAM,2BAA2B,gCAUvC,CAAC"}
|
package/dist/ggnomad/graphql.js
CHANGED
|
@@ -575,8 +575,105 @@ var j = e`
|
|
|
575
575
|
images
|
|
576
576
|
}
|
|
577
577
|
}
|
|
578
|
+
`, F = e`
|
|
579
|
+
query GGNomadTravelPolicies($limit: Int, $offset: Int) {
|
|
580
|
+
ggnomadTravelPolicies(pagination: { limit: $limit, offset: $offset }) {
|
|
581
|
+
id
|
|
582
|
+
name
|
|
583
|
+
isActive
|
|
584
|
+
costCenter
|
|
585
|
+
currency
|
|
586
|
+
maxBookingAmount
|
|
587
|
+
maxMonthlyPerTraveler
|
|
588
|
+
blockedDestinations
|
|
589
|
+
allowedTravelClasses
|
|
590
|
+
requireApprovalAlways
|
|
591
|
+
createdAt
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
`, I = e`
|
|
595
|
+
mutation CreateGGNomadTravelPolicy($input: CreateGgnomadTravelPolicyInput!) {
|
|
596
|
+
createGgnomadTravelPolicy(input: $input) {
|
|
597
|
+
id
|
|
598
|
+
name
|
|
599
|
+
isActive
|
|
600
|
+
costCenter
|
|
601
|
+
currency
|
|
602
|
+
maxBookingAmount
|
|
603
|
+
maxMonthlyPerTraveler
|
|
604
|
+
blockedDestinations
|
|
605
|
+
allowedTravelClasses
|
|
606
|
+
requireApprovalAlways
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
`;
|
|
610
|
+
e`
|
|
611
|
+
mutation UpdateGGNomadTravelPolicy($id: ID!, $input: UpdateGgnomadTravelPolicyInput!) {
|
|
612
|
+
updateGgnomadTravelPolicy(id: $id, input: $input) {
|
|
613
|
+
id
|
|
614
|
+
isActive
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
`;
|
|
618
|
+
var L = e`
|
|
619
|
+
mutation DeleteGGNomadTravelPolicy($id: ID!) {
|
|
620
|
+
deleteGgnomadTravelPolicy(id: $id)
|
|
621
|
+
}
|
|
622
|
+
`, R = e`
|
|
623
|
+
query GGNomadBookingApprovals($status: GgnomadApprovalStatus, $limit: Int, $offset: Int) {
|
|
624
|
+
ggnomadBookingApprovals(status: $status, pagination: { limit: $limit, offset: $offset }) {
|
|
625
|
+
id
|
|
626
|
+
bookingId
|
|
627
|
+
requestedBy
|
|
628
|
+
costCenter
|
|
629
|
+
reasons
|
|
630
|
+
status
|
|
631
|
+
reviewedBy
|
|
632
|
+
reviewedAt
|
|
633
|
+
reviewNote
|
|
634
|
+
createdAt
|
|
635
|
+
booking {
|
|
636
|
+
id
|
|
637
|
+
referenceCode
|
|
638
|
+
itemName
|
|
639
|
+
totalPrice
|
|
640
|
+
currency
|
|
641
|
+
status
|
|
642
|
+
paymentStatus
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
`, z = e`
|
|
647
|
+
mutation ApproveGGNomadBookingApproval($id: ID!, $note: String) {
|
|
648
|
+
approveGgnomadBookingApproval(id: $id, note: $note) {
|
|
649
|
+
id
|
|
650
|
+
status
|
|
651
|
+
reviewedBy
|
|
652
|
+
reviewedAt
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
`, B = e`
|
|
656
|
+
mutation RejectGGNomadBookingApproval($id: ID!, $reason: String!) {
|
|
657
|
+
rejectGgnomadBookingApproval(id: $id, reason: $reason) {
|
|
658
|
+
id
|
|
659
|
+
status
|
|
660
|
+
reviewedBy
|
|
661
|
+
reviewedAt
|
|
662
|
+
reviewNote
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
`, V = e`
|
|
666
|
+
query GGNomadSpendSummary($costCenter: String) {
|
|
667
|
+
ggnomadSpendSummary(costCenter: $costCenter) {
|
|
668
|
+
totalSpend
|
|
669
|
+
bookingCount
|
|
670
|
+
pendingApprovalCount
|
|
671
|
+
pendingApprovalAmount
|
|
672
|
+
byCostCenter
|
|
673
|
+
}
|
|
674
|
+
}
|
|
578
675
|
`;
|
|
579
676
|
//#endregion
|
|
580
|
-
export { E as ADD_GGNOMAD_TRIP_PLAN_ITEM_MUTATION, v as CANCEL_GGNOMAD_BOOKING_MUTATION, g as CREATE_GGNOMAD_BOOKING_MUTATION, A as CREATE_GGNOMAD_REVIEW_MUTATION, w as CREATE_GGNOMAD_TRIP_PLAN_MUTATION, d as GGNOMAD_ACTIVITIES_QUERY, f as GGNOMAD_ACTIVITY_QUERY, n as GGNOMAD_BOOKABLE_SAMPLE_QUERY, m as GGNOMAD_BOOKINGS_QUERY, l as GGNOMAD_EVENTS_QUERY, u as GGNOMAD_EVENT_QUERY, h as GGNOMAD_FAVORITES_QUERY, r as GGNOMAD_FAVORITE_TARGETS_QUERY, t as GGNOMAD_OVERVIEW_QUERY, a as GGNOMAD_PROPERTIES_QUERY, o as GGNOMAD_PROPERTY_QUERY, i as GGNOMAD_PROVIDERS_QUERY, k as GGNOMAD_REVIEWS_QUERY, O as GGNOMAD_REVIEW_SUMMARY_QUERY, y as GGNOMAD_TICKETS_QUERY, s as GGNOMAD_TOURS_QUERY, c as GGNOMAD_TOUR_QUERY, p as GGNOMAD_TRIPS_QUERY, S as GGNOMAD_TRIP_PLANS_QUERY, C as GGNOMAD_TRIP_PLAN_QUERY, b as ISSUE_GGNOMAD_TICKET_MUTATION, x as REDEEM_GGNOMAD_TICKET_MUTATION, D as REMOVE_GGNOMAD_TRIP_PLAN_ITEM_MUTATION, _ as TOGGLE_GGNOMAD_FAVORITE_MUTATION, P as UPDATE_GGNOMAD_ACTIVITY_MUTATION, N as UPDATE_GGNOMAD_EVENT_MUTATION, j as UPDATE_GGNOMAD_PROPERTY_MUTATION, M as UPDATE_GGNOMAD_TOUR_MUTATION, T as UPDATE_GGNOMAD_TRIP_PLAN_MUTATION };
|
|
677
|
+
export { E as ADD_GGNOMAD_TRIP_PLAN_ITEM_MUTATION, z as APPROVE_GGNOMAD_BOOKING_APPROVAL_MUTATION, v as CANCEL_GGNOMAD_BOOKING_MUTATION, g as CREATE_GGNOMAD_BOOKING_MUTATION, A as CREATE_GGNOMAD_REVIEW_MUTATION, I as CREATE_GGNOMAD_TRAVEL_POLICY_MUTATION, w as CREATE_GGNOMAD_TRIP_PLAN_MUTATION, L as DELETE_GGNOMAD_TRAVEL_POLICY_MUTATION, d as GGNOMAD_ACTIVITIES_QUERY, f as GGNOMAD_ACTIVITY_QUERY, n as GGNOMAD_BOOKABLE_SAMPLE_QUERY, m as GGNOMAD_BOOKINGS_QUERY, R as GGNOMAD_BOOKING_APPROVALS_QUERY, l as GGNOMAD_EVENTS_QUERY, u as GGNOMAD_EVENT_QUERY, h as GGNOMAD_FAVORITES_QUERY, r as GGNOMAD_FAVORITE_TARGETS_QUERY, t as GGNOMAD_OVERVIEW_QUERY, a as GGNOMAD_PROPERTIES_QUERY, o as GGNOMAD_PROPERTY_QUERY, i as GGNOMAD_PROVIDERS_QUERY, k as GGNOMAD_REVIEWS_QUERY, O as GGNOMAD_REVIEW_SUMMARY_QUERY, V as GGNOMAD_SPEND_SUMMARY_QUERY, y as GGNOMAD_TICKETS_QUERY, s as GGNOMAD_TOURS_QUERY, c as GGNOMAD_TOUR_QUERY, F as GGNOMAD_TRAVEL_POLICIES_QUERY, p as GGNOMAD_TRIPS_QUERY, S as GGNOMAD_TRIP_PLANS_QUERY, C as GGNOMAD_TRIP_PLAN_QUERY, b as ISSUE_GGNOMAD_TICKET_MUTATION, x as REDEEM_GGNOMAD_TICKET_MUTATION, B as REJECT_GGNOMAD_BOOKING_APPROVAL_MUTATION, D as REMOVE_GGNOMAD_TRIP_PLAN_ITEM_MUTATION, _ as TOGGLE_GGNOMAD_FAVORITE_MUTATION, P as UPDATE_GGNOMAD_ACTIVITY_MUTATION, N as UPDATE_GGNOMAD_EVENT_MUTATION, j as UPDATE_GGNOMAD_PROPERTY_MUTATION, M as UPDATE_GGNOMAD_TOUR_MUTATION, T as UPDATE_GGNOMAD_TRIP_PLAN_MUTATION };
|
|
581
678
|
|
|
582
679
|
//# sourceMappingURL=graphql.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphql.js","names":[],"sources":["../../src/ggnomad/graphql.ts"],"sourcesContent":["import { gql } from '@apollo/client/core';\n\nexport const GGNOMAD_OVERVIEW_QUERY = gql`\n query GGNomadOverview {\n ggnomadOverviewStats {\n users\n listings\n bookings\n monthlyRevenue\n }\n ggnomadAnalytics {\n totalRevenue\n totalBookings\n totalUsers\n conversionRate\n revenueByCategory\n }\n }\n`;\n\n/**\n * One bookable item of each type (properties are priced per night, the rest\n * carry a flat price). Used to seed the Bookings \"create demo booking\" action\n * with a REAL listing id so the mutation passes the backend's\n * assertTargetInWorkspace check instead of failing on a synthetic id.\n */\nexport const GGNOMAD_BOOKABLE_SAMPLE_QUERY = gql`\n query GGNomadBookableSample {\n ggnomadProperties(pagination: { limit: 1, offset: 0 }) {\n id\n name\n pricePerNight\n currency\n }\n ggnomadTours(pagination: { limit: 1, offset: 0 }) {\n id\n name\n price\n currency\n }\n ggnomadEvents(pagination: { limit: 1, offset: 0 }) {\n id\n name\n price\n currency\n }\n ggnomadActivities(pagination: { limit: 1, offset: 0 }) {\n id\n name\n price\n currency\n }\n }\n`;\n\n/**\n * id + name for every favouritable listing type, used to (a) resolve the real\n * entity name for a saved favorite (which the backend only exposes as\n * targetType + targetId) and (b) seed the \"toggle demo favorite\" action with a\n * real target id.\n */\nexport const GGNOMAD_FAVORITE_TARGETS_QUERY = gql`\n query GGNomadFavoriteTargets {\n ggnomadProperties(pagination: { limit: 100, offset: 0 }) {\n id\n name\n }\n ggnomadTours(pagination: { limit: 100, offset: 0 }) {\n id\n name\n }\n ggnomadEvents(pagination: { limit: 100, offset: 0 }) {\n id\n name\n }\n ggnomadActivities(pagination: { limit: 100, offset: 0 }) {\n id\n name\n }\n }\n`;\n\nexport const GGNOMAD_PROVIDERS_QUERY = gql`\n query GGNomadProviders($limit: Int, $offset: Int) {\n ggnomadProviders(pagination: { limit: $limit, offset: $offset }) {\n id\n name\n type\n status\n listingCount\n totalRevenue\n rating\n reviewCount\n contactEmail\n website\n }\n }\n`;\n\nexport const GGNOMAD_PROPERTIES_QUERY = gql`\n query GGNomadProperties($limit: Int, $offset: Int) {\n ggnomadProperties(pagination: { limit: $limit, offset: $offset }) {\n id\n name\n type\n status\n description\n pricePerNight\n currency\n rating\n reviewCount\n maxGuests\n amenities\n images\n providerId\n }\n }\n`;\n\nexport const GGNOMAD_PROPERTY_QUERY = gql`\n query GGNomadProperty($id: ID!) {\n ggnomadProperty(id: $id) {\n id\n name\n type\n status\n description\n address\n pricePerNight\n currency\n rating\n reviewCount\n bedrooms\n bathrooms\n maxGuests\n checkInTime\n checkOutTime\n amenities\n images\n provider {\n id\n name\n type\n rating\n }\n }\n }\n`;\n\n// Query to get property details for booking - ensures id is included\nexport const GGNOMAD_PROPERTY_FOR_BOOKING_QUERY = gql`\n query GGNomadPropertyForBooking($id: ID!) {\n ggnomadProperty(id: $id) {\n id\n name\n pricePerNight\n currency\n }\n }\n`;\n\nexport const GGNOMAD_TOURS_QUERY = gql`\n query GGNomadTours($limit: Int, $offset: Int) {\n ggnomadTours(pagination: { limit: $limit, offset: $offset }) {\n id\n name\n description\n type\n status\n duration\n difficulty\n price\n currency\n rating\n reviewCount\n highlights\n images\n }\n }\n`;\n\nexport const GGNOMAD_TOUR_QUERY = gql`\n query GGNomadTour($id: ID!) {\n ggnomadTour(id: $id) {\n id\n name\n description\n type\n status\n duration\n difficulty\n price\n currency\n rating\n reviewCount\n highlights\n images\n languages\n guideName\n provider {\n id\n name\n }\n }\n }\n`;\n\nexport const GGNOMAD_EVENTS_QUERY = gql`\n query GGNomadEvents($limit: Int, $offset: Int) {\n ggnomadEvents(pagination: { limit: $limit, offset: $offset }) {\n id\n name\n description\n category\n status\n startsAt\n price\n currency\n rating\n reviewCount\n performers\n images\n }\n }\n`;\n\nexport const GGNOMAD_EVENT_QUERY = gql`\n query GGNomadEvent($id: ID!) {\n ggnomadEvent(id: $id) {\n id\n name\n description\n category\n status\n startsAt\n endsAt\n venue\n price\n currency\n rating\n reviewCount\n performers\n images\n provider {\n id\n name\n }\n }\n }\n`;\n\nexport const GGNOMAD_ACTIVITIES_QUERY = gql`\n query GGNomadActivities($limit: Int, $offset: Int) {\n ggnomadActivities(pagination: { limit: $limit, offset: $offset }) {\n id\n name\n description\n category\n status\n duration\n difficulty\n price\n currency\n rating\n reviewCount\n maxParticipants\n includes\n requirements\n images\n }\n }\n`;\n\nexport const GGNOMAD_ACTIVITY_QUERY = gql`\n query GGNomadActivity($id: ID!) {\n ggnomadActivity(id: $id) {\n id\n name\n description\n category\n status\n location\n duration\n difficulty\n price\n currency\n rating\n reviewCount\n maxParticipants\n includes\n requirements\n safetyInfo\n images\n provider {\n id\n name\n }\n }\n }\n`;\n\nexport const GGNOMAD_TRIPS_QUERY = gql`\n query GGNomadTrips($limit: Int, $offset: Int) {\n ggnomadTrips(pagination: { limit: $limit, offset: $offset }) {\n id\n name\n transportMode\n status\n origin\n destination\n departureAt\n arrivalAt\n isRoundTrip\n carrier\n class\n price\n currency\n passengers\n ecoFriendly\n }\n }\n`;\n\nexport const GGNOMAD_BOOKINGS_QUERY = gql`\n query GGNomadBookings($limit: Int, $offset: Int) {\n ggnomadBookings(pagination: { limit: $limit, offset: $offset }) {\n id\n referenceCode\n bookingType\n status\n itemId\n itemName\n guestName\n guestEmail\n guestPhone\n guests\n checkIn\n checkOut\n eventDate\n totalPrice\n currency\n paymentStatus\n paymentMethod\n specialRequests\n createdAt\n }\n }\n`;\n\nexport const GGNOMAD_FAVORITES_QUERY = gql`\n query GGNomadFavorites {\n ggnomadFavorites\n }\n`;\n\nexport const CREATE_GGNOMAD_BOOKING_MUTATION = gql`\n mutation CreateGGNomadBooking($input: CreateGgnomadBookingInput!) {\n createGgnomadBooking(input: $input) {\n id\n referenceCode\n bookingType\n status\n itemId\n itemName\n guestName\n totalPrice\n currency\n createdAt\n }\n }\n`;\n\nexport const TOGGLE_GGNOMAD_FAVORITE_MUTATION = gql`\n mutation ToggleGGNomadFavorite($input: ToggleGgnomadFavoriteInput!) {\n toggleGgnomadFavorite(input: $input)\n }\n`;\n\nexport const CANCEL_GGNOMAD_BOOKING_MUTATION = gql`\n mutation CancelGGNomadBooking($id: ID!, $reason: String) {\n cancelGgnomadBooking(id: $id, reason: $reason) {\n id\n status\n }\n }\n`;\n\n// Mobile tickets / QR-code redemption (BOFF-4362)\nexport const GGNOMAD_TICKETS_QUERY = gql`\n query GGNomadTickets($bookingId: String) {\n ggnomadTickets(bookingId: $bookingId) {\n id\n bookingId\n ticketCode\n qrCodeDataUrl\n status\n issuedAt\n redeemedAt\n redeemedBy\n revokedAt\n revokedReason\n }\n }\n`;\n\nexport const ISSUE_GGNOMAD_TICKET_MUTATION = gql`\n mutation IssueGGNomadTicket($bookingId: ID!) {\n issueGgnomadTicket(bookingId: $bookingId) {\n id\n bookingId\n ticketCode\n qrCodeDataUrl\n status\n issuedAt\n }\n }\n`;\n\nexport const REDEEM_GGNOMAD_TICKET_MUTATION = gql`\n mutation RedeemGGNomadTicket($token: String!) {\n redeemGgnomadTicket(token: $token) {\n id\n bookingId\n ticketCode\n status\n redeemedAt\n redeemedBy\n }\n }\n`;\n\nexport const REVOKE_GGNOMAD_TICKET_MUTATION = gql`\n mutation RevokeGGNomadTicket($id: ID!, $reason: String) {\n revokeGgnomadTicket(id: $id, reason: $reason) {\n id\n status\n revokedAt\n revokedReason\n }\n }\n`;\n\n// Trip Plan Queries\nexport const GGNOMAD_TRIP_PLANS_QUERY = gql`\n query GGNomadTripPlans($limit: Int, $offset: Int) {\n ggnomadTripPlans(pagination: { limit: $limit, offset: $offset }) {\n id\n name\n description\n startDate\n endDate\n travelers\n status\n total\n itemCount\n createdAt\n }\n }\n`;\n\nexport const GGNOMAD_TRIP_PLAN_QUERY = gql`\n query GGNomadTripPlan($id: ID!) {\n ggnomadTripPlan(id: $id) {\n id\n name\n description\n startDate\n endDate\n travelers\n status\n total\n itemCount\n items {\n id\n itemType\n itemId\n itemName\n day\n scheduledAt\n price\n currency\n notes\n }\n createdAt\n updatedAt\n }\n }\n`;\n\n// Trip Plan Mutations\nexport const CREATE_GGNOMAD_TRIP_PLAN_MUTATION = gql`\n mutation CreateGGNomadTripPlan($input: CreateGgnomadTripPlanInput!) {\n createGgnomadTripPlan(input: $input) {\n id\n name\n description\n startDate\n endDate\n travelers\n status\n total\n itemCount\n createdAt\n }\n }\n`;\n\nexport const UPDATE_GGNOMAD_TRIP_PLAN_MUTATION = gql`\n mutation UpdateGGNomadTripPlan($id: ID!, $input: UpdateGgnomadTripPlanInput!) {\n updateGgnomadTripPlan(id: $id, input: $input) {\n id\n name\n description\n startDate\n endDate\n travelers\n status\n total\n itemCount\n updatedAt\n }\n }\n`;\n\nexport const DELETE_GGNOMAD_TRIP_PLAN_MUTATION = gql`\n mutation DeleteGGNomadTripPlan($id: ID!) {\n deleteGgnomadTripPlan(id: $id)\n }\n`;\n\nexport const ADD_GGNOMAD_TRIP_PLAN_ITEM_MUTATION = gql`\n mutation AddGGNomadTripPlanItem($tripPlanId: ID!, $input: AddGgnomadTripPlanItemInput!) {\n addGgnomadTripPlanItem(tripPlanId: $tripPlanId, input: $input) {\n id\n itemType\n itemId\n itemName\n day\n scheduledAt\n price\n currency\n notes\n }\n }\n`;\n\nexport const REMOVE_GGNOMAD_TRIP_PLAN_ITEM_MUTATION = gql`\n mutation RemoveGGNomadTripPlanItem($id: ID!) {\n removeGgnomadTripPlanItem(id: $id)\n }\n`;\n\n// Review Queries\nexport const GGNOMAD_REVIEW_SUMMARY_QUERY = gql`\n query GGNomadReviewSummary($targetType: GgnomadBookingType!, $targetId: String!) {\n ggnomadReviewSummary(targetType: $targetType, targetId: $targetId) {\n average\n count\n distribution\n }\n }\n`;\n\nexport const GGNOMAD_REVIEWS_QUERY = gql`\n query GGNomadReviews(\n $targetType: GgnomadBookingType!\n $targetId: String!\n $limit: Int\n $offset: Int\n ) {\n ggnomadReviews(\n targetType: $targetType\n targetId: $targetId\n pagination: { limit: $limit, offset: $offset }\n ) {\n id\n rating\n title\n content\n images\n isVerified\n helpfulCount\n response\n respondedAt\n createdAt\n }\n }\n`;\n\n// Review Mutations\nexport const CREATE_GGNOMAD_REVIEW_MUTATION = gql`\n mutation CreateGGNomadReview($input: CreateGgnomadReviewInput!) {\n createGgnomadReview(input: $input) {\n id\n rating\n title\n content\n }\n }\n`;\n\nexport const RESPOND_GGNOMAD_REVIEW_MUTATION = gql`\n mutation RespondGGNomadReview($id: ID!, $response: String!) {\n respondGgnomadReview(id: $id, response: $response) {\n id\n response\n respondedAt\n }\n }\n`;\n\n// Listing Edit Mutations\nexport const UPDATE_GGNOMAD_PROPERTY_MUTATION = gql`\n mutation UpdateGGNomadProperty($id: ID!, $input: UpdateGgnomadPropertyInput!) {\n updateGgnomadProperty(id: $id, input: $input) {\n id\n name\n description\n pricePerNight\n status\n images\n }\n }\n`;\n\nexport const UPDATE_GGNOMAD_TOUR_MUTATION = gql`\n mutation UpdateGGNomadTour($id: ID!, $input: UpdateGgnomadTourInput!) {\n updateGgnomadTour(id: $id, input: $input) {\n id\n name\n description\n price\n status\n images\n }\n }\n`;\n\nexport const UPDATE_GGNOMAD_EVENT_MUTATION = gql`\n mutation UpdateGGNomadEvent($id: ID!, $input: UpdateGgnomadEventInput!) {\n updateGgnomadEvent(id: $id, input: $input) {\n id\n name\n description\n price\n status\n images\n }\n }\n`;\n\nexport const UPDATE_GGNOMAD_ACTIVITY_MUTATION = gql`\n mutation UpdateGGNomadActivity($id: ID!, $input: UpdateGgnomadActivityInput!) {\n updateGgnomadActivity(id: $id, input: $input) {\n id\n name\n description\n price\n status\n images\n }\n }\n`;\n"],"mappings":";;AAEA,IAAa,IAAyB,CAAG;;;;;;;;;;;;;;;;GAwB5B,IAAgC,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCnC,IAAiC,CAAG;;;;;;;;;;;;;;;;;;;GAqBpC,IAA0B,CAAG;;;;;;;;;;;;;;;GAiB7B,IAA2B,CAAG;;;;;;;;;;;;;;;;;;GAoB9B,IAAyB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BS,CAAG;;;;;;;;;;AAWrD,IAAa,IAAsB,CAAG;;;;;;;;;;;;;;;;;;GAoBzB,IAAqB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;GA0BxB,IAAuB,CAAG;;;;;;;;;;;;;;;;;GAmB1B,IAAsB,CAAG;;;;;;;;;;;;;;;;;;;;;;;GAyBzB,IAA2B,CAAG;;;;;;;;;;;;;;;;;;;;GAsB9B,IAAyB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;GA4B5B,IAAsB,CAAG;;;;;;;;;;;;;;;;;;;;GAsBzB,IAAyB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;GA0B5B,IAA0B,CAAG;;;;GAM7B,IAAkC,CAAG;;;;;;;;;;;;;;;GAiBrC,IAAmC,CAAG;;;;GAMtC,IAAkC,CAAG;;;;;;;GAUrC,IAAwB,CAAG;;;;;;;;;;;;;;;GAiB3B,IAAgC,CAAG;;;;;;;;;;;GAanC,IAAiC,CAAG;;;;;;;;;;;;AAaH,CAAG;;;;;;;;;;AAYjD,IAAa,IAA2B,CAAG;;;;;;;;;;;;;;;GAiB9B,IAA0B,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8B7B,IAAoC,CAAG;;;;;;;;;;;;;;;GAiBvC,IAAoC,CAAG;;;;;;;;;;;;;;;;AAiBH,CAAG;;;;;AAMpD,IAAa,IAAsC,CAAG;;;;;;;;;;;;;;GAgBzC,IAAyC,CAAG;;;;GAO5C,IAA+B,CAAG;;;;;;;;GAUlC,IAAwB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;GA2B3B,IAAiC,CAAG;;;;;;;;;;AAWF,CAAG;;;;;;;;;AAWlD,IAAa,IAAmC,CAAG;;;;;;;;;;;GAatC,IAA+B,CAAG;;;;;;;;;;;GAalC,IAAgC,CAAG;;;;;;;;;;;GAanC,IAAmC,CAAG"}
|
|
1
|
+
{"version":3,"file":"graphql.js","names":[],"sources":["../../src/ggnomad/graphql.ts"],"sourcesContent":["import { gql } from '@apollo/client/core';\n\nexport const GGNOMAD_OVERVIEW_QUERY = gql`\n query GGNomadOverview {\n ggnomadOverviewStats {\n users\n listings\n bookings\n monthlyRevenue\n }\n ggnomadAnalytics {\n totalRevenue\n totalBookings\n totalUsers\n conversionRate\n revenueByCategory\n }\n }\n`;\n\n/**\n * One bookable item of each type (properties are priced per night, the rest\n * carry a flat price). Used to seed the Bookings \"create demo booking\" action\n * with a REAL listing id so the mutation passes the backend's\n * assertTargetInWorkspace check instead of failing on a synthetic id.\n */\nexport const GGNOMAD_BOOKABLE_SAMPLE_QUERY = gql`\n query GGNomadBookableSample {\n ggnomadProperties(pagination: { limit: 1, offset: 0 }) {\n id\n name\n pricePerNight\n currency\n }\n ggnomadTours(pagination: { limit: 1, offset: 0 }) {\n id\n name\n price\n currency\n }\n ggnomadEvents(pagination: { limit: 1, offset: 0 }) {\n id\n name\n price\n currency\n }\n ggnomadActivities(pagination: { limit: 1, offset: 0 }) {\n id\n name\n price\n currency\n }\n }\n`;\n\n/**\n * id + name for every favouritable listing type, used to (a) resolve the real\n * entity name for a saved favorite (which the backend only exposes as\n * targetType + targetId) and (b) seed the \"toggle demo favorite\" action with a\n * real target id.\n */\nexport const GGNOMAD_FAVORITE_TARGETS_QUERY = gql`\n query GGNomadFavoriteTargets {\n ggnomadProperties(pagination: { limit: 100, offset: 0 }) {\n id\n name\n }\n ggnomadTours(pagination: { limit: 100, offset: 0 }) {\n id\n name\n }\n ggnomadEvents(pagination: { limit: 100, offset: 0 }) {\n id\n name\n }\n ggnomadActivities(pagination: { limit: 100, offset: 0 }) {\n id\n name\n }\n }\n`;\n\nexport const GGNOMAD_PROVIDERS_QUERY = gql`\n query GGNomadProviders($limit: Int, $offset: Int) {\n ggnomadProviders(pagination: { limit: $limit, offset: $offset }) {\n id\n name\n type\n status\n listingCount\n totalRevenue\n rating\n reviewCount\n contactEmail\n website\n }\n }\n`;\n\nexport const GGNOMAD_PROPERTIES_QUERY = gql`\n query GGNomadProperties($limit: Int, $offset: Int) {\n ggnomadProperties(pagination: { limit: $limit, offset: $offset }) {\n id\n name\n type\n status\n description\n pricePerNight\n currency\n rating\n reviewCount\n maxGuests\n amenities\n images\n providerId\n }\n }\n`;\n\nexport const GGNOMAD_PROPERTY_QUERY = gql`\n query GGNomadProperty($id: ID!) {\n ggnomadProperty(id: $id) {\n id\n name\n type\n status\n description\n address\n pricePerNight\n currency\n rating\n reviewCount\n bedrooms\n bathrooms\n maxGuests\n checkInTime\n checkOutTime\n amenities\n images\n provider {\n id\n name\n type\n rating\n }\n }\n }\n`;\n\n// Query to get property details for booking - ensures id is included\nexport const GGNOMAD_PROPERTY_FOR_BOOKING_QUERY = gql`\n query GGNomadPropertyForBooking($id: ID!) {\n ggnomadProperty(id: $id) {\n id\n name\n pricePerNight\n currency\n }\n }\n`;\n\nexport const GGNOMAD_TOURS_QUERY = gql`\n query GGNomadTours($limit: Int, $offset: Int) {\n ggnomadTours(pagination: { limit: $limit, offset: $offset }) {\n id\n name\n description\n type\n status\n duration\n difficulty\n price\n currency\n rating\n reviewCount\n highlights\n images\n }\n }\n`;\n\nexport const GGNOMAD_TOUR_QUERY = gql`\n query GGNomadTour($id: ID!) {\n ggnomadTour(id: $id) {\n id\n name\n description\n type\n status\n duration\n difficulty\n price\n currency\n rating\n reviewCount\n highlights\n images\n languages\n guideName\n provider {\n id\n name\n }\n }\n }\n`;\n\nexport const GGNOMAD_EVENTS_QUERY = gql`\n query GGNomadEvents($limit: Int, $offset: Int) {\n ggnomadEvents(pagination: { limit: $limit, offset: $offset }) {\n id\n name\n description\n category\n status\n startsAt\n price\n currency\n rating\n reviewCount\n performers\n images\n }\n }\n`;\n\nexport const GGNOMAD_EVENT_QUERY = gql`\n query GGNomadEvent($id: ID!) {\n ggnomadEvent(id: $id) {\n id\n name\n description\n category\n status\n startsAt\n endsAt\n venue\n price\n currency\n rating\n reviewCount\n performers\n images\n provider {\n id\n name\n }\n }\n }\n`;\n\nexport const GGNOMAD_ACTIVITIES_QUERY = gql`\n query GGNomadActivities($limit: Int, $offset: Int) {\n ggnomadActivities(pagination: { limit: $limit, offset: $offset }) {\n id\n name\n description\n category\n status\n duration\n difficulty\n price\n currency\n rating\n reviewCount\n maxParticipants\n includes\n requirements\n images\n }\n }\n`;\n\nexport const GGNOMAD_ACTIVITY_QUERY = gql`\n query GGNomadActivity($id: ID!) {\n ggnomadActivity(id: $id) {\n id\n name\n description\n category\n status\n location\n duration\n difficulty\n price\n currency\n rating\n reviewCount\n maxParticipants\n includes\n requirements\n safetyInfo\n images\n provider {\n id\n name\n }\n }\n }\n`;\n\nexport const GGNOMAD_TRIPS_QUERY = gql`\n query GGNomadTrips($limit: Int, $offset: Int) {\n ggnomadTrips(pagination: { limit: $limit, offset: $offset }) {\n id\n name\n transportMode\n status\n origin\n destination\n departureAt\n arrivalAt\n isRoundTrip\n carrier\n class\n price\n currency\n passengers\n ecoFriendly\n }\n }\n`;\n\nexport const GGNOMAD_BOOKINGS_QUERY = gql`\n query GGNomadBookings($limit: Int, $offset: Int) {\n ggnomadBookings(pagination: { limit: $limit, offset: $offset }) {\n id\n referenceCode\n bookingType\n status\n itemId\n itemName\n guestName\n guestEmail\n guestPhone\n guests\n checkIn\n checkOut\n eventDate\n totalPrice\n currency\n paymentStatus\n paymentMethod\n specialRequests\n createdAt\n }\n }\n`;\n\nexport const GGNOMAD_FAVORITES_QUERY = gql`\n query GGNomadFavorites {\n ggnomadFavorites\n }\n`;\n\nexport const CREATE_GGNOMAD_BOOKING_MUTATION = gql`\n mutation CreateGGNomadBooking($input: CreateGgnomadBookingInput!) {\n createGgnomadBooking(input: $input) {\n id\n referenceCode\n bookingType\n status\n itemId\n itemName\n guestName\n totalPrice\n currency\n createdAt\n }\n }\n`;\n\nexport const TOGGLE_GGNOMAD_FAVORITE_MUTATION = gql`\n mutation ToggleGGNomadFavorite($input: ToggleGgnomadFavoriteInput!) {\n toggleGgnomadFavorite(input: $input)\n }\n`;\n\nexport const CANCEL_GGNOMAD_BOOKING_MUTATION = gql`\n mutation CancelGGNomadBooking($id: ID!, $reason: String) {\n cancelGgnomadBooking(id: $id, reason: $reason) {\n id\n status\n }\n }\n`;\n\n// Mobile tickets / QR-code redemption (BOFF-4362)\nexport const GGNOMAD_TICKETS_QUERY = gql`\n query GGNomadTickets($bookingId: String) {\n ggnomadTickets(bookingId: $bookingId) {\n id\n bookingId\n ticketCode\n qrCodeDataUrl\n status\n issuedAt\n redeemedAt\n redeemedBy\n revokedAt\n revokedReason\n }\n }\n`;\n\nexport const ISSUE_GGNOMAD_TICKET_MUTATION = gql`\n mutation IssueGGNomadTicket($bookingId: ID!) {\n issueGgnomadTicket(bookingId: $bookingId) {\n id\n bookingId\n ticketCode\n qrCodeDataUrl\n status\n issuedAt\n }\n }\n`;\n\nexport const REDEEM_GGNOMAD_TICKET_MUTATION = gql`\n mutation RedeemGGNomadTicket($token: String!) {\n redeemGgnomadTicket(token: $token) {\n id\n bookingId\n ticketCode\n status\n redeemedAt\n redeemedBy\n }\n }\n`;\n\nexport const REVOKE_GGNOMAD_TICKET_MUTATION = gql`\n mutation RevokeGGNomadTicket($id: ID!, $reason: String) {\n revokeGgnomadTicket(id: $id, reason: $reason) {\n id\n status\n revokedAt\n revokedReason\n }\n }\n`;\n\n// Trip Plan Queries\nexport const GGNOMAD_TRIP_PLANS_QUERY = gql`\n query GGNomadTripPlans($limit: Int, $offset: Int) {\n ggnomadTripPlans(pagination: { limit: $limit, offset: $offset }) {\n id\n name\n description\n startDate\n endDate\n travelers\n status\n total\n itemCount\n createdAt\n }\n }\n`;\n\nexport const GGNOMAD_TRIP_PLAN_QUERY = gql`\n query GGNomadTripPlan($id: ID!) {\n ggnomadTripPlan(id: $id) {\n id\n name\n description\n startDate\n endDate\n travelers\n status\n total\n itemCount\n items {\n id\n itemType\n itemId\n itemName\n day\n scheduledAt\n price\n currency\n notes\n }\n createdAt\n updatedAt\n }\n }\n`;\n\n// Trip Plan Mutations\nexport const CREATE_GGNOMAD_TRIP_PLAN_MUTATION = gql`\n mutation CreateGGNomadTripPlan($input: CreateGgnomadTripPlanInput!) {\n createGgnomadTripPlan(input: $input) {\n id\n name\n description\n startDate\n endDate\n travelers\n status\n total\n itemCount\n createdAt\n }\n }\n`;\n\nexport const UPDATE_GGNOMAD_TRIP_PLAN_MUTATION = gql`\n mutation UpdateGGNomadTripPlan($id: ID!, $input: UpdateGgnomadTripPlanInput!) {\n updateGgnomadTripPlan(id: $id, input: $input) {\n id\n name\n description\n startDate\n endDate\n travelers\n status\n total\n itemCount\n updatedAt\n }\n }\n`;\n\nexport const DELETE_GGNOMAD_TRIP_PLAN_MUTATION = gql`\n mutation DeleteGGNomadTripPlan($id: ID!) {\n deleteGgnomadTripPlan(id: $id)\n }\n`;\n\nexport const ADD_GGNOMAD_TRIP_PLAN_ITEM_MUTATION = gql`\n mutation AddGGNomadTripPlanItem($tripPlanId: ID!, $input: AddGgnomadTripPlanItemInput!) {\n addGgnomadTripPlanItem(tripPlanId: $tripPlanId, input: $input) {\n id\n itemType\n itemId\n itemName\n day\n scheduledAt\n price\n currency\n notes\n }\n }\n`;\n\nexport const REMOVE_GGNOMAD_TRIP_PLAN_ITEM_MUTATION = gql`\n mutation RemoveGGNomadTripPlanItem($id: ID!) {\n removeGgnomadTripPlanItem(id: $id)\n }\n`;\n\n// Review Queries\nexport const GGNOMAD_REVIEW_SUMMARY_QUERY = gql`\n query GGNomadReviewSummary($targetType: GgnomadBookingType!, $targetId: String!) {\n ggnomadReviewSummary(targetType: $targetType, targetId: $targetId) {\n average\n count\n distribution\n }\n }\n`;\n\nexport const GGNOMAD_REVIEWS_QUERY = gql`\n query GGNomadReviews(\n $targetType: GgnomadBookingType!\n $targetId: String!\n $limit: Int\n $offset: Int\n ) {\n ggnomadReviews(\n targetType: $targetType\n targetId: $targetId\n pagination: { limit: $limit, offset: $offset }\n ) {\n id\n rating\n title\n content\n images\n isVerified\n helpfulCount\n response\n respondedAt\n createdAt\n }\n }\n`;\n\n// Review Mutations\nexport const CREATE_GGNOMAD_REVIEW_MUTATION = gql`\n mutation CreateGGNomadReview($input: CreateGgnomadReviewInput!) {\n createGgnomadReview(input: $input) {\n id\n rating\n title\n content\n }\n }\n`;\n\nexport const RESPOND_GGNOMAD_REVIEW_MUTATION = gql`\n mutation RespondGGNomadReview($id: ID!, $response: String!) {\n respondGgnomadReview(id: $id, response: $response) {\n id\n response\n respondedAt\n }\n }\n`;\n\n// Listing Edit Mutations\nexport const UPDATE_GGNOMAD_PROPERTY_MUTATION = gql`\n mutation UpdateGGNomadProperty($id: ID!, $input: UpdateGgnomadPropertyInput!) {\n updateGgnomadProperty(id: $id, input: $input) {\n id\n name\n description\n pricePerNight\n status\n images\n }\n }\n`;\n\nexport const UPDATE_GGNOMAD_TOUR_MUTATION = gql`\n mutation UpdateGGNomadTour($id: ID!, $input: UpdateGgnomadTourInput!) {\n updateGgnomadTour(id: $id, input: $input) {\n id\n name\n description\n price\n status\n images\n }\n }\n`;\n\nexport const UPDATE_GGNOMAD_EVENT_MUTATION = gql`\n mutation UpdateGGNomadEvent($id: ID!, $input: UpdateGgnomadEventInput!) {\n updateGgnomadEvent(id: $id, input: $input) {\n id\n name\n description\n price\n status\n images\n }\n }\n`;\n\nexport const UPDATE_GGNOMAD_ACTIVITY_MUTATION = gql`\n mutation UpdateGGNomadActivity($id: ID!, $input: UpdateGgnomadActivityInput!) {\n updateGgnomadActivity(id: $id, input: $input) {\n id\n name\n description\n price\n status\n images\n }\n }\n`;\n\n// Corporate travel management — policy, budgets, approvals (BOFF-4365)\nexport const GGNOMAD_TRAVEL_POLICIES_QUERY = gql`\n query GGNomadTravelPolicies($limit: Int, $offset: Int) {\n ggnomadTravelPolicies(pagination: { limit: $limit, offset: $offset }) {\n id\n name\n isActive\n costCenter\n currency\n maxBookingAmount\n maxMonthlyPerTraveler\n blockedDestinations\n allowedTravelClasses\n requireApprovalAlways\n createdAt\n }\n }\n`;\n\nexport const CREATE_GGNOMAD_TRAVEL_POLICY_MUTATION = gql`\n mutation CreateGGNomadTravelPolicy($input: CreateGgnomadTravelPolicyInput!) {\n createGgnomadTravelPolicy(input: $input) {\n id\n name\n isActive\n costCenter\n currency\n maxBookingAmount\n maxMonthlyPerTraveler\n blockedDestinations\n allowedTravelClasses\n requireApprovalAlways\n }\n }\n`;\n\nexport const UPDATE_GGNOMAD_TRAVEL_POLICY_MUTATION = gql`\n mutation UpdateGGNomadTravelPolicy($id: ID!, $input: UpdateGgnomadTravelPolicyInput!) {\n updateGgnomadTravelPolicy(id: $id, input: $input) {\n id\n isActive\n }\n }\n`;\n\nexport const DELETE_GGNOMAD_TRAVEL_POLICY_MUTATION = gql`\n mutation DeleteGGNomadTravelPolicy($id: ID!) {\n deleteGgnomadTravelPolicy(id: $id)\n }\n`;\n\nexport const GGNOMAD_BOOKING_APPROVALS_QUERY = gql`\n query GGNomadBookingApprovals($status: GgnomadApprovalStatus, $limit: Int, $offset: Int) {\n ggnomadBookingApprovals(status: $status, pagination: { limit: $limit, offset: $offset }) {\n id\n bookingId\n requestedBy\n costCenter\n reasons\n status\n reviewedBy\n reviewedAt\n reviewNote\n createdAt\n booking {\n id\n referenceCode\n itemName\n totalPrice\n currency\n status\n paymentStatus\n }\n }\n }\n`;\n\nexport const APPROVE_GGNOMAD_BOOKING_APPROVAL_MUTATION = gql`\n mutation ApproveGGNomadBookingApproval($id: ID!, $note: String) {\n approveGgnomadBookingApproval(id: $id, note: $note) {\n id\n status\n reviewedBy\n reviewedAt\n }\n }\n`;\n\nexport const REJECT_GGNOMAD_BOOKING_APPROVAL_MUTATION = gql`\n mutation RejectGGNomadBookingApproval($id: ID!, $reason: String!) {\n rejectGgnomadBookingApproval(id: $id, reason: $reason) {\n id\n status\n reviewedBy\n reviewedAt\n reviewNote\n }\n }\n`;\n\nexport const GGNOMAD_SPEND_SUMMARY_QUERY = gql`\n query GGNomadSpendSummary($costCenter: String) {\n ggnomadSpendSummary(costCenter: $costCenter) {\n totalSpend\n bookingCount\n pendingApprovalCount\n pendingApprovalAmount\n byCostCenter\n }\n }\n`;\n"],"mappings":";;AAEA,IAAa,IAAyB,CAAG;;;;;;;;;;;;;;;;GAwB5B,IAAgC,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCnC,IAAiC,CAAG;;;;;;;;;;;;;;;;;;;GAqBpC,IAA0B,CAAG;;;;;;;;;;;;;;;GAiB7B,IAA2B,CAAG;;;;;;;;;;;;;;;;;;GAoB9B,IAAyB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BS,CAAG;;;;;;;;;;AAWrD,IAAa,IAAsB,CAAG;;;;;;;;;;;;;;;;;;GAoBzB,IAAqB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;GA0BxB,IAAuB,CAAG;;;;;;;;;;;;;;;;;GAmB1B,IAAsB,CAAG;;;;;;;;;;;;;;;;;;;;;;;GAyBzB,IAA2B,CAAG;;;;;;;;;;;;;;;;;;;;GAsB9B,IAAyB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;GA4B5B,IAAsB,CAAG;;;;;;;;;;;;;;;;;;;;GAsBzB,IAAyB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;GA0B5B,IAA0B,CAAG;;;;GAM7B,IAAkC,CAAG;;;;;;;;;;;;;;;GAiBrC,IAAmC,CAAG;;;;GAMtC,IAAkC,CAAG;;;;;;;GAUrC,IAAwB,CAAG;;;;;;;;;;;;;;;GAiB3B,IAAgC,CAAG;;;;;;;;;;;GAanC,IAAiC,CAAG;;;;;;;;;;;;AAaH,CAAG;;;;;;;;;;AAYjD,IAAa,IAA2B,CAAG;;;;;;;;;;;;;;;GAiB9B,IAA0B,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8B7B,IAAoC,CAAG;;;;;;;;;;;;;;;GAiBvC,IAAoC,CAAG;;;;;;;;;;;;;;;;AAiBH,CAAG;;;;;AAMpD,IAAa,IAAsC,CAAG;;;;;;;;;;;;;;GAgBzC,IAAyC,CAAG;;;;GAO5C,IAA+B,CAAG;;;;;;;;GAUlC,IAAwB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;GA2B3B,IAAiC,CAAG;;;;;;;;;;AAWF,CAAG;;;;;;;;;AAWlD,IAAa,IAAmC,CAAG;;;;;;;;;;;GAatC,IAA+B,CAAG;;;;;;;;;;;GAalC,IAAgC,CAAG;;;;;;;;;;;GAanC,IAAmC,CAAG;;;;;;;;;;;GActC,IAAgC,CAAG;;;;;;;;;;;;;;;;GAkBnC,IAAwC,CAAG;;;;;;;;;;;;;;;;AAiBH,CAAG;;;;;;;;AASxD,IAAa,IAAwC,CAAG;;;;GAM3C,IAAkC,CAAG;;;;;;;;;;;;;;;;;;;;;;;;GA0BrC,IAA4C,CAAG;;;;;;;;;GAW/C,IAA2C,CAAG;;;;;;;;;;GAY9C,IAA8B,CAAG"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manager dashboard for corporate travel governance (BOFF-4365): consolidated
|
|
3
|
+
* spend, the pending-approval queue for bookings that violated policy, and
|
|
4
|
+
* the travel policies themselves (budget caps, blocked destinations, class
|
|
5
|
+
* rules). Approve/reject and policy CRUD are gated server-side by the
|
|
6
|
+
* `ggnomad:manage` RBAC action — a traveler or host-operator cannot act here.
|
|
7
|
+
*/
|
|
8
|
+
export declare function TravelPolicyPage(): import("react").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=TravelPolicyPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TravelPolicyPage.d.ts","sourceRoot":"","sources":["../../../src/ggnomad/pages/TravelPolicyPage.tsx"],"names":[],"mappings":"AA+EA;;;;;;GAMG;AACH,wBAAgB,gBAAgB,gCA+Z/B"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { APPROVE_GGNOMAD_BOOKING_APPROVAL_MUTATION as e, DELETE_GGNOMAD_TRAVEL_POLICY_MUTATION as t, GGNOMAD_BOOKING_APPROVALS_QUERY as ee, GGNOMAD_SPEND_SUMMARY_QUERY as n, GGNOMAD_TRAVEL_POLICIES_QUERY as r, REJECT_GGNOMAD_BOOKING_APPROVAL_MUTATION as i } from "../graphql.js";
|
|
2
|
+
import { PageShell as te } from "./PageShell.js";
|
|
3
|
+
import { StatCard as a } from "../components/StatCard.js";
|
|
4
|
+
import { StatusBadge as o } from "../components/StatusBadge.js";
|
|
5
|
+
import { SectionCard as s } from "../components/SectionCard.js";
|
|
6
|
+
import { EntityCard as c } from "../components/EntityCard.js";
|
|
7
|
+
import { notify as l } from "../utils/notify.js";
|
|
8
|
+
import { CreateTravelPolicyDialog as ne } from "../components/CreateTravelPolicyDialog.js";
|
|
9
|
+
import "../components/index.js";
|
|
10
|
+
import { useMemo as u, useState as d } from "react";
|
|
11
|
+
import { AlertCircle as f, Check as re, DollarSign as p, Plus as m, ShieldCheck as h, Trash2 as g, Wallet as ie, X as ae } from "lucide-react";
|
|
12
|
+
import { useI18n as _ } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
13
|
+
import { useMutation as v, useQuery as y } from "@apollo/client/react";
|
|
14
|
+
import { AlertDialog as b, AlertDialogAction as x, AlertDialogCancel as S, AlertDialogContent as C, AlertDialogDescription as w, AlertDialogFooter as T, AlertDialogHeader as E, AlertDialogTitle as D, CTAOverflowMenu as O, IllustratedEmptyState as k, PagePurpose as A } from "@burdenoff/fe-libs/ui";
|
|
15
|
+
import { jsx as j, jsxs as M } from "react/jsx-runtime";
|
|
16
|
+
//#region src/ggnomad/pages/TravelPolicyPage.tsx
|
|
17
|
+
function N() {
|
|
18
|
+
let { t: N } = _(), [oe, P] = d(!1), [F, I] = d(null), [L, R] = d(""), [z, B] = d(null), { data: V, refetch: H } = y(n), U = V?.ggnomadSpendSummary, { data: W, refetch: G, loading: K } = y(ee, { variables: {
|
|
19
|
+
status: "PENDING",
|
|
20
|
+
limit: 20,
|
|
21
|
+
offset: 0
|
|
22
|
+
} }), q = u(() => W?.ggnomadBookingApprovals ?? [], [W?.ggnomadBookingApprovals]), { data: J, refetch: Y } = y(r, { variables: {
|
|
23
|
+
limit: 50,
|
|
24
|
+
offset: 0
|
|
25
|
+
} }), X = u(() => J?.ggnomadTravelPolicies ?? [], [J?.ggnomadTravelPolicies]), [se, { loading: ce }] = v(e), [le, { loading: Z }] = v(i), [ue, { loading: Q }] = v(t), $ = async () => {
|
|
26
|
+
await Promise.all([
|
|
27
|
+
H(),
|
|
28
|
+
G(),
|
|
29
|
+
Y()
|
|
30
|
+
]);
|
|
31
|
+
}, de = async (e) => {
|
|
32
|
+
try {
|
|
33
|
+
let t = await se({ variables: { id: e.id } });
|
|
34
|
+
if (t.error) {
|
|
35
|
+
l.error(N("ggnomad.travelPolicy.approve.errorTitle", "Could not approve booking"), t.error.message);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
l.success(N("ggnomad.travelPolicy.approve.successTitle", "Booking approved"), e.booking?.referenceCode ?? e.bookingId), await $();
|
|
39
|
+
} catch (e) {
|
|
40
|
+
l.error(N("ggnomad.travelPolicy.approve.errorTitle", "Could not approve booking"), e instanceof Error ? e.message : String(e));
|
|
41
|
+
}
|
|
42
|
+
}, fe = async () => {
|
|
43
|
+
if (F) {
|
|
44
|
+
if (!L.trim()) {
|
|
45
|
+
l.warning(N("ggnomad.travelPolicy.reject.reasonRequiredTitle", "A reason is required"), N("ggnomad.travelPolicy.reject.reasonRequiredBody", "Let the traveler know why this was rejected."));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
let e = await le({ variables: {
|
|
50
|
+
id: F.id,
|
|
51
|
+
reason: L.trim()
|
|
52
|
+
} });
|
|
53
|
+
if (e.error) {
|
|
54
|
+
l.error(N("ggnomad.travelPolicy.reject.errorTitle", "Could not reject booking"), e.error.message);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
l.success(N("ggnomad.travelPolicy.reject.successTitle", "Booking rejected"), F.booking?.referenceCode ?? F.bookingId), await $();
|
|
58
|
+
} catch (e) {
|
|
59
|
+
l.error(N("ggnomad.travelPolicy.reject.errorTitle", "Could not reject booking"), e instanceof Error ? e.message : String(e));
|
|
60
|
+
} finally {
|
|
61
|
+
I(null), R("");
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}, pe = async () => {
|
|
65
|
+
if (z) try {
|
|
66
|
+
let e = await ue({ variables: { id: z.id } });
|
|
67
|
+
if (e.error) {
|
|
68
|
+
l.error(N("ggnomad.travelPolicy.delete.errorTitle", "Could not remove policy"), e.error.message);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
l.success(N("ggnomad.travelPolicy.delete.successTitle", "Policy removed"), z.name), await Y();
|
|
72
|
+
} catch (e) {
|
|
73
|
+
l.error(N("ggnomad.travelPolicy.delete.errorTitle", "Could not remove policy"), e instanceof Error ? e.message : String(e));
|
|
74
|
+
} finally {
|
|
75
|
+
B(null);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
return /* @__PURE__ */ M(te, {
|
|
79
|
+
title: N("ggnomad.travelPolicy.title", "Travel Policy"),
|
|
80
|
+
titleAccent: N("ggnomad.travelPolicy.title.accent", "Policy"),
|
|
81
|
+
subtitle: N("ggnomad.travelPolicy.subtitle", "Corporate travel guardrails: budgets, blocked destinations, class rules, and booking approvals"),
|
|
82
|
+
actions: /* @__PURE__ */ j(O, {
|
|
83
|
+
primary: {
|
|
84
|
+
label: N("ggnomad.travelPolicy.actions.newPolicy", "New policy"),
|
|
85
|
+
onSelect: () => P(!0),
|
|
86
|
+
icon: /* @__PURE__ */ j(m, {})
|
|
87
|
+
},
|
|
88
|
+
actions: []
|
|
89
|
+
}),
|
|
90
|
+
children: [
|
|
91
|
+
/* @__PURE__ */ j(A, {
|
|
92
|
+
icon: /* @__PURE__ */ j(h, { className: "size-4" }),
|
|
93
|
+
children: N("ggnomad.travelPolicy.purpose", "Managers define budget caps, blocked destinations and class rules here. A booking that violates the applicable policy is held for your approval instead of confirming automatically — travelers and hosts cannot approve their own over-budget bookings.")
|
|
94
|
+
}),
|
|
95
|
+
/* @__PURE__ */ M("section", {
|
|
96
|
+
className: "grid gap-4 sm:grid-cols-2 xl:grid-cols-4",
|
|
97
|
+
children: [
|
|
98
|
+
/* @__PURE__ */ j(a, {
|
|
99
|
+
hero: !0,
|
|
100
|
+
label: N("ggnomad.travelPolicy.stats.totalSpend", "Total spend"),
|
|
101
|
+
value: `$${Number(U?.totalSpend ?? 0).toLocaleString()}`,
|
|
102
|
+
icon: /* @__PURE__ */ j(p, {})
|
|
103
|
+
}),
|
|
104
|
+
/* @__PURE__ */ j(a, {
|
|
105
|
+
label: N("ggnomad.travelPolicy.stats.bookingCount", "Bookings"),
|
|
106
|
+
value: Number(U?.bookingCount ?? 0).toLocaleString(),
|
|
107
|
+
icon: /* @__PURE__ */ j(ie, {})
|
|
108
|
+
}),
|
|
109
|
+
/* @__PURE__ */ j(a, {
|
|
110
|
+
label: N("ggnomad.travelPolicy.stats.pendingCount", "Pending approvals"),
|
|
111
|
+
value: Number(U?.pendingApprovalCount ?? 0).toLocaleString(),
|
|
112
|
+
icon: /* @__PURE__ */ j(f, {})
|
|
113
|
+
}),
|
|
114
|
+
/* @__PURE__ */ j(a, {
|
|
115
|
+
label: N("ggnomad.travelPolicy.stats.pendingAmount", "Pending amount"),
|
|
116
|
+
value: `$${Number(U?.pendingApprovalAmount ?? 0).toLocaleString()}`,
|
|
117
|
+
icon: /* @__PURE__ */ j(h, {})
|
|
118
|
+
})
|
|
119
|
+
]
|
|
120
|
+
}),
|
|
121
|
+
/* @__PURE__ */ j(s, {
|
|
122
|
+
title: N("ggnomad.travelPolicy.approvalsTitle", "Pending approvals"),
|
|
123
|
+
children: !K && q.length === 0 ? /* @__PURE__ */ j(k, {
|
|
124
|
+
illustration: "empty-data",
|
|
125
|
+
title: N("ggnomad.travelPolicy.approvalsEmptyTitle", "Nothing waiting on you"),
|
|
126
|
+
description: N("ggnomad.travelPolicy.approvalsEmptyDescription", "Bookings that exceed a travel policy will show up here for your decision.")
|
|
127
|
+
}) : /* @__PURE__ */ j("div", {
|
|
128
|
+
className: "grid gap-3 sm:grid-cols-2",
|
|
129
|
+
children: q.map((e) => /* @__PURE__ */ j(c, {
|
|
130
|
+
title: e.booking?.referenceCode ?? e.bookingId,
|
|
131
|
+
meta: e.reasons.join(" · ") || e.booking?.itemName,
|
|
132
|
+
price: e.booking ? `${e.booking.currency} ${Number(e.booking.totalPrice).toFixed(2)}` : void 0,
|
|
133
|
+
badge: /* @__PURE__ */ j(o, {
|
|
134
|
+
status: e.status,
|
|
135
|
+
live: !0
|
|
136
|
+
}),
|
|
137
|
+
footer: /* @__PURE__ */ j(O, {
|
|
138
|
+
align: "end",
|
|
139
|
+
actions: [{
|
|
140
|
+
label: N("ggnomad.travelPolicy.actions.approve", "Approve"),
|
|
141
|
+
onSelect: () => void de(e),
|
|
142
|
+
disabled: ce,
|
|
143
|
+
icon: /* @__PURE__ */ j(re, {})
|
|
144
|
+
}, {
|
|
145
|
+
label: N("ggnomad.travelPolicy.actions.reject", "Reject"),
|
|
146
|
+
onSelect: () => {
|
|
147
|
+
I(e), R("");
|
|
148
|
+
},
|
|
149
|
+
intent: "destructive",
|
|
150
|
+
icon: /* @__PURE__ */ j(ae, {})
|
|
151
|
+
}]
|
|
152
|
+
})
|
|
153
|
+
}, e.id))
|
|
154
|
+
})
|
|
155
|
+
}),
|
|
156
|
+
/* @__PURE__ */ j(s, {
|
|
157
|
+
title: N("ggnomad.travelPolicy.policiesTitle", "Travel policies"),
|
|
158
|
+
children: X.length === 0 ? /* @__PURE__ */ j(k, {
|
|
159
|
+
illustration: "empty-data",
|
|
160
|
+
title: N("ggnomad.travelPolicy.policiesEmptyTitle", "No travel policy defined yet"),
|
|
161
|
+
description: N("ggnomad.travelPolicy.policiesEmptyDescription", "Create one to enforce budget caps, blocked destinations, and class rules on future bookings.")
|
|
162
|
+
}) : /* @__PURE__ */ j("div", {
|
|
163
|
+
className: "grid gap-3 sm:grid-cols-2",
|
|
164
|
+
children: X.map((e) => /* @__PURE__ */ j(c, {
|
|
165
|
+
title: e.name,
|
|
166
|
+
meta: e.costCenter ? N("ggnomad.travelPolicy.card.costCenter", "Cost center: {{cc}}").replace("{{cc}}", e.costCenter) : N("ggnomad.travelPolicy.card.workspaceWide", "Workspace-wide default"),
|
|
167
|
+
price: e.maxBookingAmount == null ? N("ggnomad.travelPolicy.card.noCap", "No per-booking cap") : `${e.currency} ${Number(e.maxBookingAmount).toFixed(2)} / booking`,
|
|
168
|
+
badge: /* @__PURE__ */ j(o, {
|
|
169
|
+
status: e.isActive ? "ACTIVE" : "PAUSED",
|
|
170
|
+
live: e.isActive
|
|
171
|
+
}),
|
|
172
|
+
footer: /* @__PURE__ */ j(O, {
|
|
173
|
+
align: "end",
|
|
174
|
+
actions: [{
|
|
175
|
+
label: N("ggnomad.travelPolicy.actions.deletePolicy", "Remove policy"),
|
|
176
|
+
onSelect: () => B(e),
|
|
177
|
+
intent: "destructive",
|
|
178
|
+
icon: /* @__PURE__ */ j(g, {})
|
|
179
|
+
}]
|
|
180
|
+
})
|
|
181
|
+
}, e.id))
|
|
182
|
+
})
|
|
183
|
+
}),
|
|
184
|
+
/* @__PURE__ */ j(ne, {
|
|
185
|
+
open: oe,
|
|
186
|
+
onOpenChange: P,
|
|
187
|
+
onCreated: () => void Y()
|
|
188
|
+
}),
|
|
189
|
+
/* @__PURE__ */ j(b, {
|
|
190
|
+
open: F !== null,
|
|
191
|
+
onOpenChange: (e) => {
|
|
192
|
+
e || (I(null), R(""));
|
|
193
|
+
},
|
|
194
|
+
children: /* @__PURE__ */ M(C, { children: [
|
|
195
|
+
/* @__PURE__ */ M(E, { children: [/* @__PURE__ */ j(D, { children: N("ggnomad.travelPolicy.rejectDialog.title", "Reject this booking?") }), /* @__PURE__ */ j(w, { children: N("ggnomad.travelPolicy.rejectDialog.body", "This cancels {{ref}} and revokes any issued ticket. The traveler sees your reason.").replace("{{ref}}", F?.booking?.referenceCode ?? F?.bookingId ?? "") })] }),
|
|
196
|
+
/* @__PURE__ */ M("div", { children: [/* @__PURE__ */ j("label", {
|
|
197
|
+
htmlFor: "reject-reason",
|
|
198
|
+
className: "block text-sm font-medium text-text-primary",
|
|
199
|
+
children: N("ggnomad.travelPolicy.rejectDialog.reasonLabel", "Reason")
|
|
200
|
+
}), /* @__PURE__ */ j("textarea", {
|
|
201
|
+
id: "reject-reason",
|
|
202
|
+
value: L,
|
|
203
|
+
onChange: (e) => R(e.target.value),
|
|
204
|
+
disabled: Z,
|
|
205
|
+
rows: 3,
|
|
206
|
+
className: "mt-1 w-full rounded-md border border-border-seam bg-bg-canvas px-3 py-2 text-sm text-text-primary placeholder-text-secondary focus:border-action-primary-bg focus:outline-none focus:ring-1 focus:ring-action-primary-bg disabled:opacity-50",
|
|
207
|
+
placeholder: N("ggnomad.travelPolicy.rejectDialog.reasonPlaceholder", "e.g. Over quarterly budget")
|
|
208
|
+
})] }),
|
|
209
|
+
/* @__PURE__ */ M(T, { children: [/* @__PURE__ */ j(S, {
|
|
210
|
+
disabled: Z,
|
|
211
|
+
children: N("ggnomad.travelPolicy.rejectDialog.cancel", "Keep pending")
|
|
212
|
+
}), /* @__PURE__ */ j(x, {
|
|
213
|
+
className: "bg-action-danger-bg text-action-danger-text hover:bg-action-danger-bgHover",
|
|
214
|
+
disabled: Z,
|
|
215
|
+
onClick: (e) => {
|
|
216
|
+
e.preventDefault(), fe();
|
|
217
|
+
},
|
|
218
|
+
children: Z ? N("ggnomad.travelPolicy.rejectDialog.rejecting", "Rejecting…") : N("ggnomad.travelPolicy.rejectDialog.confirm", "Reject booking")
|
|
219
|
+
})] })
|
|
220
|
+
] })
|
|
221
|
+
}),
|
|
222
|
+
/* @__PURE__ */ j(b, {
|
|
223
|
+
open: z !== null,
|
|
224
|
+
onOpenChange: (e) => {
|
|
225
|
+
e || B(null);
|
|
226
|
+
},
|
|
227
|
+
children: /* @__PURE__ */ M(C, { children: [/* @__PURE__ */ M(E, { children: [/* @__PURE__ */ j(D, { children: N("ggnomad.travelPolicy.deleteDialog.title", "Remove this policy?") }), /* @__PURE__ */ j(w, { children: N("ggnomad.travelPolicy.deleteDialog.body", "Bookings already approved or rejected under {{name}} are unaffected. New bookings stop being checked against it.").replace("{{name}}", z?.name ?? "") })] }), /* @__PURE__ */ M(T, { children: [/* @__PURE__ */ j(S, {
|
|
228
|
+
disabled: Q,
|
|
229
|
+
children: N("ggnomad.travelPolicy.deleteDialog.cancel", "Keep policy")
|
|
230
|
+
}), /* @__PURE__ */ j(x, {
|
|
231
|
+
className: "bg-action-danger-bg text-action-danger-text hover:bg-action-danger-bgHover",
|
|
232
|
+
disabled: Q,
|
|
233
|
+
onClick: (e) => {
|
|
234
|
+
e.preventDefault(), pe();
|
|
235
|
+
},
|
|
236
|
+
children: Q ? N("ggnomad.travelPolicy.deleteDialog.removing", "Removing…") : N("ggnomad.travelPolicy.deleteDialog.confirm", "Remove policy")
|
|
237
|
+
})] })] })
|
|
238
|
+
})
|
|
239
|
+
]
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
//#endregion
|
|
243
|
+
export { N as TravelPolicyPage };
|
|
244
|
+
|
|
245
|
+
//# sourceMappingURL=TravelPolicyPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TravelPolicyPage.js","names":[],"sources":["../../../src/ggnomad/pages/TravelPolicyPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport type { TypedDocumentNode } from '@apollo/client';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { AlertCircle, Check, DollarSign, Plus, ShieldCheck, Trash2, Wallet, X } from 'lucide-react';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n CTAOverflowMenu,\n IllustratedEmptyState,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\n\nimport {\n APPROVE_GGNOMAD_BOOKING_APPROVAL_MUTATION,\n DELETE_GGNOMAD_TRAVEL_POLICY_MUTATION,\n GGNOMAD_BOOKING_APPROVALS_QUERY,\n GGNOMAD_SPEND_SUMMARY_QUERY,\n GGNOMAD_TRAVEL_POLICIES_QUERY,\n REJECT_GGNOMAD_BOOKING_APPROVAL_MUTATION,\n} from '../graphql';\nimport { PageShell } from './PageShell';\nimport {\n CreateTravelPolicyDialog,\n EntityCard,\n SectionCard,\n StatCard,\n StatusBadge,\n} from '../components';\nimport { notify } from '../utils/notify';\n\ntype BookingApproval = {\n id: string;\n bookingId: string;\n requestedBy: string;\n costCenter: string | null;\n reasons: string[];\n status: string;\n reviewedBy: string | null;\n reviewedAt: string | null;\n reviewNote: string | null;\n booking: {\n id: string;\n referenceCode: string;\n itemName: string;\n totalPrice: number;\n currency: string;\n status: string;\n paymentStatus: string;\n } | null;\n};\n\ntype TravelPolicy = {\n id: string;\n name: string;\n isActive: boolean;\n costCenter: string | null;\n currency: string;\n maxBookingAmount: number | null;\n maxMonthlyPerTraveler: number | null;\n blockedDestinations: string[];\n allowedTravelClasses: string[];\n requireApprovalAlways: boolean;\n};\n\ntype SpendSummary = {\n totalSpend: number;\n bookingCount: number;\n pendingApprovalCount: number;\n pendingApprovalAmount: number;\n byCostCenter: Record<string, { spend: number; count: number }>;\n};\n\n/**\n * Manager dashboard for corporate travel governance (BOFF-4365): consolidated\n * spend, the pending-approval queue for bookings that violated policy, and\n * the travel policies themselves (budget caps, blocked destinations, class\n * rules). Approve/reject and policy CRUD are gated server-side by the\n * `ggnomad:manage` RBAC action — a traveler or host-operator cannot act here.\n */\nexport function TravelPolicyPage() {\n const { t } = useI18n();\n const [createPolicyOpen, setCreatePolicyOpen] = useState(false);\n const [rejectTarget, setRejectTarget] = useState<BookingApproval | null>(null);\n const [rejectReason, setRejectReason] = useState('');\n const [deleteTarget, setDeleteTarget] = useState<TravelPolicy | null>(null);\n\n const { data: summaryData, refetch: refetchSummary } = useQuery(\n GGNOMAD_SPEND_SUMMARY_QUERY as TypedDocumentNode<\n { ggnomadSpendSummary: SpendSummary },\n { costCenter?: string | null }\n >\n );\n const summary = summaryData?.ggnomadSpendSummary;\n\n const {\n data: approvalsData,\n refetch: refetchApprovals,\n loading: approvalsLoading,\n } = useQuery(\n GGNOMAD_BOOKING_APPROVALS_QUERY as TypedDocumentNode<\n { ggnomadBookingApprovals: BookingApproval[] },\n { status?: string | null; limit?: number; offset?: number }\n >,\n { variables: { status: 'PENDING', limit: 20, offset: 0 } }\n );\n const pendingApprovals = useMemo(\n () => approvalsData?.ggnomadBookingApprovals ?? [],\n [approvalsData?.ggnomadBookingApprovals]\n );\n\n const { data: policiesData, refetch: refetchPolicies } = useQuery(\n GGNOMAD_TRAVEL_POLICIES_QUERY as TypedDocumentNode<\n { ggnomadTravelPolicies: TravelPolicy[] },\n { limit?: number; offset?: number }\n >,\n { variables: { limit: 50, offset: 0 } }\n );\n const policies = useMemo(\n () => policiesData?.ggnomadTravelPolicies ?? [],\n [policiesData?.ggnomadTravelPolicies]\n );\n\n const [approveApproval, { loading: approving }] = useMutation(\n APPROVE_GGNOMAD_BOOKING_APPROVAL_MUTATION as TypedDocumentNode<\n { approveGgnomadBookingApproval: { id: string; status: string } },\n { id: string; note?: string }\n >\n );\n const [rejectApproval, { loading: rejecting }] = useMutation(\n REJECT_GGNOMAD_BOOKING_APPROVAL_MUTATION as TypedDocumentNode<\n { rejectGgnomadBookingApproval: { id: string; status: string } },\n { id: string; reason: string }\n >\n );\n const [deleteTravelPolicy, { loading: deletingPolicy }] = useMutation(\n DELETE_GGNOMAD_TRAVEL_POLICY_MUTATION as TypedDocumentNode<\n { deleteGgnomadTravelPolicy: boolean },\n { id: string }\n >\n );\n\n const refetchAll = async () => {\n await Promise.all([refetchSummary(), refetchApprovals(), refetchPolicies()]);\n };\n\n const handleApprove = async (approval: BookingApproval) => {\n try {\n const result = await approveApproval({ variables: { id: approval.id } });\n if (result.error) {\n notify.error(\n t('ggnomad.travelPolicy.approve.errorTitle', 'Could not approve booking'),\n result.error.message\n );\n return;\n }\n notify.success(\n t('ggnomad.travelPolicy.approve.successTitle', 'Booking approved'),\n approval.booking?.referenceCode ?? approval.bookingId\n );\n await refetchAll();\n } catch (err) {\n notify.error(\n t('ggnomad.travelPolicy.approve.errorTitle', 'Could not approve booking'),\n err instanceof Error ? err.message : String(err)\n );\n }\n };\n\n const confirmReject = async () => {\n if (!rejectTarget) return;\n if (!rejectReason.trim()) {\n notify.warning(\n t('ggnomad.travelPolicy.reject.reasonRequiredTitle', 'A reason is required'),\n t(\n 'ggnomad.travelPolicy.reject.reasonRequiredBody',\n 'Let the traveler know why this was rejected.'\n )\n );\n return;\n }\n try {\n const result = await rejectApproval({\n variables: { id: rejectTarget.id, reason: rejectReason.trim() },\n });\n if (result.error) {\n notify.error(\n t('ggnomad.travelPolicy.reject.errorTitle', 'Could not reject booking'),\n result.error.message\n );\n return;\n }\n notify.success(\n t('ggnomad.travelPolicy.reject.successTitle', 'Booking rejected'),\n rejectTarget.booking?.referenceCode ?? rejectTarget.bookingId\n );\n await refetchAll();\n } catch (err) {\n notify.error(\n t('ggnomad.travelPolicy.reject.errorTitle', 'Could not reject booking'),\n err instanceof Error ? err.message : String(err)\n );\n } finally {\n setRejectTarget(null);\n setRejectReason('');\n }\n };\n\n const confirmDeletePolicy = async () => {\n if (!deleteTarget) return;\n try {\n const result = await deleteTravelPolicy({ variables: { id: deleteTarget.id } });\n if (result.error) {\n notify.error(\n t('ggnomad.travelPolicy.delete.errorTitle', 'Could not remove policy'),\n result.error.message\n );\n return;\n }\n notify.success(\n t('ggnomad.travelPolicy.delete.successTitle', 'Policy removed'),\n deleteTarget.name\n );\n await refetchPolicies();\n } catch (err) {\n notify.error(\n t('ggnomad.travelPolicy.delete.errorTitle', 'Could not remove policy'),\n err instanceof Error ? err.message : String(err)\n );\n } finally {\n setDeleteTarget(null);\n }\n };\n\n return (\n <PageShell\n title={t('ggnomad.travelPolicy.title', 'Travel Policy')}\n titleAccent={t('ggnomad.travelPolicy.title.accent', 'Policy')}\n subtitle={t(\n 'ggnomad.travelPolicy.subtitle',\n 'Corporate travel guardrails: budgets, blocked destinations, class rules, and booking approvals'\n )}\n actions={\n <CTAOverflowMenu\n primary={{\n label: t('ggnomad.travelPolicy.actions.newPolicy', 'New policy'),\n onSelect: () => setCreatePolicyOpen(true),\n icon: <Plus />,\n }}\n actions={[]}\n />\n }\n >\n <PagePurpose icon={<ShieldCheck className=\"size-4\" />}>\n {t(\n 'ggnomad.travelPolicy.purpose',\n 'Managers define budget caps, blocked destinations and class rules here. A booking that violates the applicable policy is held for your approval instead of confirming automatically — travelers and hosts cannot approve their own over-budget bookings.'\n )}\n </PagePurpose>\n\n <section className=\"grid gap-4 sm:grid-cols-2 xl:grid-cols-4\">\n <StatCard\n hero\n label={t('ggnomad.travelPolicy.stats.totalSpend', 'Total spend')}\n value={`$${Number(summary?.totalSpend ?? 0).toLocaleString()}`}\n icon={<DollarSign />}\n />\n <StatCard\n label={t('ggnomad.travelPolicy.stats.bookingCount', 'Bookings')}\n value={Number(summary?.bookingCount ?? 0).toLocaleString()}\n icon={<Wallet />}\n />\n <StatCard\n label={t('ggnomad.travelPolicy.stats.pendingCount', 'Pending approvals')}\n value={Number(summary?.pendingApprovalCount ?? 0).toLocaleString()}\n icon={<AlertCircle />}\n />\n <StatCard\n label={t('ggnomad.travelPolicy.stats.pendingAmount', 'Pending amount')}\n value={`$${Number(summary?.pendingApprovalAmount ?? 0).toLocaleString()}`}\n icon={<ShieldCheck />}\n />\n </section>\n\n <SectionCard title={t('ggnomad.travelPolicy.approvalsTitle', 'Pending approvals')}>\n {!approvalsLoading && pendingApprovals.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('ggnomad.travelPolicy.approvalsEmptyTitle', 'Nothing waiting on you')}\n description={t(\n 'ggnomad.travelPolicy.approvalsEmptyDescription',\n 'Bookings that exceed a travel policy will show up here for your decision.'\n )}\n />\n ) : (\n <div className=\"grid gap-3 sm:grid-cols-2\">\n {pendingApprovals.map((approval) => (\n <EntityCard\n key={approval.id}\n title={approval.booking?.referenceCode ?? approval.bookingId}\n meta={approval.reasons.join(' · ') || approval.booking?.itemName}\n price={\n approval.booking\n ? `${approval.booking.currency} ${Number(approval.booking.totalPrice).toFixed(2)}`\n : undefined\n }\n badge={<StatusBadge status={approval.status} live />}\n footer={\n <CTAOverflowMenu\n align=\"end\"\n actions={[\n {\n label: t('ggnomad.travelPolicy.actions.approve', 'Approve'),\n onSelect: () => void handleApprove(approval),\n disabled: approving,\n icon: <Check />,\n },\n {\n label: t('ggnomad.travelPolicy.actions.reject', 'Reject'),\n onSelect: () => {\n setRejectTarget(approval);\n setRejectReason('');\n },\n intent: 'destructive',\n icon: <X />,\n },\n ]}\n />\n }\n />\n ))}\n </div>\n )}\n </SectionCard>\n\n <SectionCard title={t('ggnomad.travelPolicy.policiesTitle', 'Travel policies')}>\n {policies.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('ggnomad.travelPolicy.policiesEmptyTitle', 'No travel policy defined yet')}\n description={t(\n 'ggnomad.travelPolicy.policiesEmptyDescription',\n 'Create one to enforce budget caps, blocked destinations, and class rules on future bookings.'\n )}\n />\n ) : (\n <div className=\"grid gap-3 sm:grid-cols-2\">\n {policies.map((policy) => (\n <EntityCard\n key={policy.id}\n title={policy.name}\n meta={\n policy.costCenter\n ? t('ggnomad.travelPolicy.card.costCenter', 'Cost center: {{cc}}').replace(\n '{{cc}}',\n policy.costCenter\n )\n : t('ggnomad.travelPolicy.card.workspaceWide', 'Workspace-wide default')\n }\n price={\n policy.maxBookingAmount != null\n ? `${policy.currency} ${Number(policy.maxBookingAmount).toFixed(2)} / booking`\n : t('ggnomad.travelPolicy.card.noCap', 'No per-booking cap')\n }\n badge={\n <StatusBadge\n status={policy.isActive ? 'ACTIVE' : 'PAUSED'}\n live={policy.isActive}\n />\n }\n footer={\n <CTAOverflowMenu\n align=\"end\"\n actions={[\n {\n label: t('ggnomad.travelPolicy.actions.deletePolicy', 'Remove policy'),\n onSelect: () => setDeleteTarget(policy),\n intent: 'destructive',\n icon: <Trash2 />,\n },\n ]}\n />\n }\n />\n ))}\n </div>\n )}\n </SectionCard>\n\n <CreateTravelPolicyDialog\n open={createPolicyOpen}\n onOpenChange={setCreatePolicyOpen}\n onCreated={() => void refetchPolicies()}\n />\n\n <AlertDialog\n open={rejectTarget !== null}\n onOpenChange={(open) => {\n if (!open) {\n setRejectTarget(null);\n setRejectReason('');\n }\n }}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>\n {t('ggnomad.travelPolicy.rejectDialog.title', 'Reject this booking?')}\n </AlertDialogTitle>\n <AlertDialogDescription>\n {t(\n 'ggnomad.travelPolicy.rejectDialog.body',\n 'This cancels {{ref}} and revokes any issued ticket. The traveler sees your reason.'\n ).replace(\n '{{ref}}',\n rejectTarget?.booking?.referenceCode ?? rejectTarget?.bookingId ?? ''\n )}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <div>\n <label htmlFor=\"reject-reason\" className=\"block text-sm font-medium text-text-primary\">\n {t('ggnomad.travelPolicy.rejectDialog.reasonLabel', 'Reason')}\n </label>\n <textarea\n id=\"reject-reason\"\n value={rejectReason}\n onChange={(e) => setRejectReason(e.target.value)}\n disabled={rejecting}\n rows={3}\n className=\"mt-1 w-full rounded-md border border-border-seam bg-bg-canvas px-3 py-2 text-sm text-text-primary placeholder-text-secondary focus:border-action-primary-bg focus:outline-none focus:ring-1 focus:ring-action-primary-bg disabled:opacity-50\"\n placeholder={t(\n 'ggnomad.travelPolicy.rejectDialog.reasonPlaceholder',\n 'e.g. Over quarterly budget'\n )}\n />\n </div>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={rejecting}>\n {t('ggnomad.travelPolicy.rejectDialog.cancel', 'Keep pending')}\n </AlertDialogCancel>\n <AlertDialogAction\n className=\"bg-action-danger-bg text-action-danger-text hover:bg-action-danger-bgHover\"\n disabled={rejecting}\n onClick={(event) => {\n event.preventDefault();\n void confirmReject();\n }}\n >\n {rejecting\n ? t('ggnomad.travelPolicy.rejectDialog.rejecting', 'Rejecting…')\n : t('ggnomad.travelPolicy.rejectDialog.confirm', 'Reject booking')}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n\n <AlertDialog\n open={deleteTarget !== null}\n onOpenChange={(open) => {\n if (!open) setDeleteTarget(null);\n }}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>\n {t('ggnomad.travelPolicy.deleteDialog.title', 'Remove this policy?')}\n </AlertDialogTitle>\n <AlertDialogDescription>\n {t(\n 'ggnomad.travelPolicy.deleteDialog.body',\n 'Bookings already approved or rejected under {{name}} are unaffected. New bookings stop being checked against it.'\n ).replace('{{name}}', deleteTarget?.name ?? '')}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={deletingPolicy}>\n {t('ggnomad.travelPolicy.deleteDialog.cancel', 'Keep policy')}\n </AlertDialogCancel>\n <AlertDialogAction\n className=\"bg-action-danger-bg text-action-danger-text hover:bg-action-danger-bgHover\"\n disabled={deletingPolicy}\n onClick={(event) => {\n event.preventDefault();\n void confirmDeletePolicy();\n }}\n >\n {deletingPolicy\n ? t('ggnomad.travelPolicy.deleteDialog.removing', 'Removing…')\n : t('ggnomad.travelPolicy.deleteDialog.confirm', 'Remove policy')}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </PageShell>\n );\n}\n"],"mappings":"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"}
|