@pablo2410/shared-ui 0.8.0 → 0.9.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/chunk-4ATPOBMZ.js +442 -0
- package/dist/chunk-4ATPOBMZ.js.map +1 -0
- package/dist/{chunk-GU3OMCTY.js → chunk-64IHOOPN.js} +229 -159
- package/dist/chunk-64IHOOPN.js.map +1 -0
- package/dist/hierarchy/index.d.ts +9 -1
- package/dist/hierarchy/index.js +7 -431
- package/dist/hierarchy/index.js.map +1 -1
- package/dist/layout/index.d.ts +17 -1
- package/dist/layout/index.js +5 -1
- package/dist/shell/index.js +3 -1
- package/dist/shell/index.js.map +1 -1
- package/dist/shell/oplytics-shell.css +1 -1
- package/package.json +1 -1
- package/dist/chunk-GU3OMCTY.js.map +0 -1
package/dist/hierarchy/index.js
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import {
|
|
2
|
+
HierarchyNavigator,
|
|
3
|
+
createOrgHierarchyContext,
|
|
4
|
+
readActiveEnterpriseCookie
|
|
5
|
+
} from "../chunk-4ATPOBMZ.js";
|
|
1
6
|
import {
|
|
2
7
|
ACTIVE_ENTERPRISE_COOKIE,
|
|
3
8
|
ORG_HIERARCHY_DATA_EMPTY,
|
|
@@ -7,437 +12,7 @@ import {
|
|
|
7
12
|
applyEnterpriseOverride,
|
|
8
13
|
scopeHierarchyToEnterprise
|
|
9
14
|
} from "../chunk-NXSFRNI7.js";
|
|
10
|
-
import
|
|
11
|
-
cn
|
|
12
|
-
} from "../chunk-JT3XLKKD.js";
|
|
13
|
-
|
|
14
|
-
// src/hierarchy/OrgHierarchyContext.tsx
|
|
15
|
-
import {
|
|
16
|
-
createContext,
|
|
17
|
-
useContext,
|
|
18
|
-
useCallback,
|
|
19
|
-
useMemo,
|
|
20
|
-
useState,
|
|
21
|
-
useEffect
|
|
22
|
-
} from "react";
|
|
23
|
-
import { jsx } from "react/jsx-runtime";
|
|
24
|
-
function readActiveEnterpriseCookie() {
|
|
25
|
-
if (typeof document === "undefined") return null;
|
|
26
|
-
const match = document.cookie.split(";").map((c) => c.trim()).find((c) => c.startsWith(`${ACTIVE_ENTERPRISE_COOKIE}=`));
|
|
27
|
-
if (!match) return null;
|
|
28
|
-
const value = decodeURIComponent(match.slice(ACTIVE_ENTERPRISE_COOKIE.length + 1));
|
|
29
|
-
return value.length ? value : null;
|
|
30
|
-
}
|
|
31
|
-
function createOrgHierarchyContext(options) {
|
|
32
|
-
const { storageKey, useHierarchyData } = options;
|
|
33
|
-
const OrgHierarchyCtx = createContext({
|
|
34
|
-
selection: ORG_HIERARCHY_EMPTY,
|
|
35
|
-
enterprises: [],
|
|
36
|
-
businessUnits: [],
|
|
37
|
-
sites: [],
|
|
38
|
-
areas: [],
|
|
39
|
-
assets: [],
|
|
40
|
-
selectEnterprise: () => {
|
|
41
|
-
},
|
|
42
|
-
selectBusinessUnit: () => {
|
|
43
|
-
},
|
|
44
|
-
selectSite: () => {
|
|
45
|
-
},
|
|
46
|
-
selectArea: () => {
|
|
47
|
-
},
|
|
48
|
-
selectAsset: () => {
|
|
49
|
-
},
|
|
50
|
-
canSwitchEnterprise: false,
|
|
51
|
-
loading: true,
|
|
52
|
-
breadcrumbs: []
|
|
53
|
-
});
|
|
54
|
-
function OrgHierarchyProvider({
|
|
55
|
-
children,
|
|
56
|
-
canSwitchEnterprise = false,
|
|
57
|
-
onEnterpriseSwitched
|
|
58
|
-
}) {
|
|
59
|
-
const [selection, setSelection] = useState(ORG_HIERARCHY_EMPTY);
|
|
60
|
-
useEffect(() => {
|
|
61
|
-
try {
|
|
62
|
-
sessionStorage.removeItem(storageKey);
|
|
63
|
-
} catch {
|
|
64
|
-
}
|
|
65
|
-
const activeAtMount = readActiveEnterpriseCookie();
|
|
66
|
-
const reloadIfEnterpriseChanged = () => {
|
|
67
|
-
if (typeof window !== "undefined" && readActiveEnterpriseCookie() !== activeAtMount) {
|
|
68
|
-
window.location.reload();
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
if (typeof window !== "undefined") {
|
|
72
|
-
window.addEventListener("focus", reloadIfEnterpriseChanged);
|
|
73
|
-
document.addEventListener("visibilitychange", reloadIfEnterpriseChanged);
|
|
74
|
-
return () => {
|
|
75
|
-
window.removeEventListener("focus", reloadIfEnterpriseChanged);
|
|
76
|
-
document.removeEventListener("visibilitychange", reloadIfEnterpriseChanged);
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
return void 0;
|
|
80
|
-
}, []);
|
|
81
|
-
const { data: hierarchy, isLoading } = useHierarchyData();
|
|
82
|
-
const enterprises = useMemo(() => {
|
|
83
|
-
if (!hierarchy?.enterprises) return [];
|
|
84
|
-
return hierarchy.enterprises.map((e) => ({
|
|
85
|
-
id: e.id,
|
|
86
|
-
name: e.name,
|
|
87
|
-
code: e.code
|
|
88
|
-
}));
|
|
89
|
-
}, [hierarchy]);
|
|
90
|
-
const businessUnits = useMemo(() => {
|
|
91
|
-
if (!hierarchy?.businessUnits || !selection.enterprise) return [];
|
|
92
|
-
return hierarchy.businessUnits.filter((bu) => bu.enterpriseId === selection.enterprise.id).map((bu) => ({ id: bu.id, name: bu.name, code: bu.code }));
|
|
93
|
-
}, [hierarchy, selection.enterprise]);
|
|
94
|
-
const sites = useMemo(() => {
|
|
95
|
-
if (!hierarchy?.sites || !selection.enterprise) return [];
|
|
96
|
-
let filtered = hierarchy.sites.filter(
|
|
97
|
-
(s) => s.enterpriseId === selection.enterprise.id
|
|
98
|
-
);
|
|
99
|
-
if (selection.businessUnit) {
|
|
100
|
-
filtered = filtered.filter(
|
|
101
|
-
(s) => s.businessUnitId === selection.businessUnit.id
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
return filtered.map((s) => ({ id: s.id, name: s.name, code: s.code }));
|
|
105
|
-
}, [hierarchy, selection.enterprise, selection.businessUnit]);
|
|
106
|
-
const areas = useMemo(() => {
|
|
107
|
-
if (!hierarchy?.areas || !selection.site) return [];
|
|
108
|
-
return hierarchy.areas.filter((a) => a.siteId === selection.site.id).map((a) => ({ id: a.id, name: a.name, code: a.code }));
|
|
109
|
-
}, [hierarchy, selection.site]);
|
|
110
|
-
const assets = useMemo(() => {
|
|
111
|
-
if (!hierarchy?.assets || !selection.area) return [];
|
|
112
|
-
return hierarchy.assets.filter((a) => a.areaId === selection.area.id).map((a) => ({ id: a.id, name: a.name, code: a.code }));
|
|
113
|
-
}, [hierarchy, selection.area]);
|
|
114
|
-
useEffect(() => {
|
|
115
|
-
if (isLoading || enterprises.length === 0) return;
|
|
116
|
-
if (!selection.enterprise) {
|
|
117
|
-
if (!canSwitchEnterprise || enterprises.length === 1) {
|
|
118
|
-
setSelection((prev) => ({ ...prev, enterprise: enterprises[0] }));
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}, [isLoading, enterprises, selection.enterprise, canSwitchEnterprise]);
|
|
122
|
-
const selectEnterprise = useCallback((node) => {
|
|
123
|
-
setSelection({
|
|
124
|
-
enterprise: node,
|
|
125
|
-
businessUnit: null,
|
|
126
|
-
site: null,
|
|
127
|
-
area: null,
|
|
128
|
-
asset: null
|
|
129
|
-
});
|
|
130
|
-
if (canSwitchEnterprise && onEnterpriseSwitched) {
|
|
131
|
-
onEnterpriseSwitched(node?.id ?? null);
|
|
132
|
-
}
|
|
133
|
-
}, [canSwitchEnterprise, onEnterpriseSwitched]);
|
|
134
|
-
const selectBusinessUnit = useCallback((node) => {
|
|
135
|
-
setSelection((prev) => ({
|
|
136
|
-
...prev,
|
|
137
|
-
businessUnit: node,
|
|
138
|
-
site: null,
|
|
139
|
-
area: null,
|
|
140
|
-
asset: null
|
|
141
|
-
}));
|
|
142
|
-
}, []);
|
|
143
|
-
const selectSite = useCallback((node) => {
|
|
144
|
-
setSelection((prev) => ({
|
|
145
|
-
...prev,
|
|
146
|
-
site: node,
|
|
147
|
-
area: null,
|
|
148
|
-
asset: null
|
|
149
|
-
}));
|
|
150
|
-
}, []);
|
|
151
|
-
const selectArea = useCallback((node) => {
|
|
152
|
-
setSelection((prev) => ({
|
|
153
|
-
...prev,
|
|
154
|
-
area: node,
|
|
155
|
-
asset: null
|
|
156
|
-
}));
|
|
157
|
-
}, []);
|
|
158
|
-
const selectAsset = useCallback((node) => {
|
|
159
|
-
setSelection((prev) => ({
|
|
160
|
-
...prev,
|
|
161
|
-
asset: node
|
|
162
|
-
}));
|
|
163
|
-
}, []);
|
|
164
|
-
const breadcrumbs = useMemo(() => {
|
|
165
|
-
const crumbs = [];
|
|
166
|
-
if (selection.enterprise)
|
|
167
|
-
crumbs.push({ level: "Enterprise", node: selection.enterprise });
|
|
168
|
-
if (selection.businessUnit)
|
|
169
|
-
crumbs.push({ level: "Business Unit", node: selection.businessUnit });
|
|
170
|
-
if (selection.site)
|
|
171
|
-
crumbs.push({ level: "Site", node: selection.site });
|
|
172
|
-
if (selection.area)
|
|
173
|
-
crumbs.push({ level: "Area", node: selection.area });
|
|
174
|
-
if (selection.asset)
|
|
175
|
-
crumbs.push({ level: "Asset", node: selection.asset });
|
|
176
|
-
return crumbs;
|
|
177
|
-
}, [selection]);
|
|
178
|
-
const value = useMemo(
|
|
179
|
-
() => ({
|
|
180
|
-
selection,
|
|
181
|
-
enterprises,
|
|
182
|
-
businessUnits,
|
|
183
|
-
sites,
|
|
184
|
-
areas,
|
|
185
|
-
assets,
|
|
186
|
-
selectEnterprise,
|
|
187
|
-
selectBusinessUnit,
|
|
188
|
-
selectSite,
|
|
189
|
-
selectArea,
|
|
190
|
-
selectAsset,
|
|
191
|
-
canSwitchEnterprise,
|
|
192
|
-
loading: isLoading,
|
|
193
|
-
breadcrumbs
|
|
194
|
-
}),
|
|
195
|
-
[
|
|
196
|
-
selection,
|
|
197
|
-
enterprises,
|
|
198
|
-
businessUnits,
|
|
199
|
-
sites,
|
|
200
|
-
areas,
|
|
201
|
-
assets,
|
|
202
|
-
selectEnterprise,
|
|
203
|
-
selectBusinessUnit,
|
|
204
|
-
selectSite,
|
|
205
|
-
selectArea,
|
|
206
|
-
selectAsset,
|
|
207
|
-
canSwitchEnterprise,
|
|
208
|
-
isLoading,
|
|
209
|
-
breadcrumbs
|
|
210
|
-
]
|
|
211
|
-
);
|
|
212
|
-
return /* @__PURE__ */ jsx(OrgHierarchyCtx.Provider, { value, children });
|
|
213
|
-
}
|
|
214
|
-
function useOrgHierarchy() {
|
|
215
|
-
return useContext(OrgHierarchyCtx);
|
|
216
|
-
}
|
|
217
|
-
return { OrgHierarchyProvider, useOrgHierarchy };
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// src/hierarchy/HierarchyNavigator.tsx
|
|
221
|
-
import { ChevronRight, ChevronDown, Building2, Network, MapPin, LayoutGrid, Box } from "lucide-react";
|
|
222
|
-
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
223
|
-
function BreadcrumbLevel({
|
|
224
|
-
config,
|
|
225
|
-
isLast,
|
|
226
|
-
compact,
|
|
227
|
-
renderDropdown
|
|
228
|
-
}) {
|
|
229
|
-
const nodes = config.getNodes();
|
|
230
|
-
const selected = config.getSelected();
|
|
231
|
-
const Icon = config.icon;
|
|
232
|
-
const canSwitch = config.canSwitch !== false;
|
|
233
|
-
const hasMultiple = nodes.length > 1;
|
|
234
|
-
if (!selected) return null;
|
|
235
|
-
if (!hasMultiple || !canSwitch) {
|
|
236
|
-
return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
237
|
-
/* @__PURE__ */ jsxs(
|
|
238
|
-
"div",
|
|
239
|
-
{
|
|
240
|
-
className: cn(
|
|
241
|
-
"flex items-center gap-1.5 px-2 py-1 rounded-md text-sm",
|
|
242
|
-
"text-[#E2E8F0]",
|
|
243
|
-
compact && "px-1.5 py-0.5 text-xs"
|
|
244
|
-
),
|
|
245
|
-
children: [
|
|
246
|
-
/* @__PURE__ */ jsx2(Icon, { className: cn("shrink-0 text-[#8890A0]", compact ? "h-3 w-3" : "h-3.5 w-3.5") }),
|
|
247
|
-
/* @__PURE__ */ jsx2("span", { className: "truncate max-w-[120px]", children: selected.name })
|
|
248
|
-
]
|
|
249
|
-
}
|
|
250
|
-
),
|
|
251
|
-
!isLast && /* @__PURE__ */ jsx2(ChevronRight, { className: cn("shrink-0 text-[#596475]", compact ? "h-3 w-3" : "h-3.5 w-3.5") })
|
|
252
|
-
] });
|
|
253
|
-
}
|
|
254
|
-
const trigger = /* @__PURE__ */ jsxs(
|
|
255
|
-
"button",
|
|
256
|
-
{
|
|
257
|
-
className: cn(
|
|
258
|
-
"flex items-center gap-1.5 px-2 py-1 rounded-md text-sm",
|
|
259
|
-
"text-[#E2E8F0] hover:bg-[#1E2738] hover:text-white",
|
|
260
|
-
"transition-colors cursor-pointer outline-none",
|
|
261
|
-
"focus-visible:ring-1 focus-visible:ring-[#8C34E9]",
|
|
262
|
-
compact && "px-1.5 py-0.5 text-xs"
|
|
263
|
-
),
|
|
264
|
-
children: [
|
|
265
|
-
/* @__PURE__ */ jsx2(Icon, { className: cn("shrink-0 text-[#8890A0]", compact ? "h-3 w-3" : "h-3.5 w-3.5") }),
|
|
266
|
-
/* @__PURE__ */ jsx2("span", { className: "truncate max-w-[120px]", children: selected.name }),
|
|
267
|
-
/* @__PURE__ */ jsx2(ChevronDown, { className: cn("shrink-0 text-[#596475]", compact ? "h-2.5 w-2.5" : "h-3 w-3") })
|
|
268
|
-
]
|
|
269
|
-
}
|
|
270
|
-
);
|
|
271
|
-
const items = nodes.map((node) => ({
|
|
272
|
-
key: node.id,
|
|
273
|
-
label: node.name,
|
|
274
|
-
code: node.code,
|
|
275
|
-
icon: Icon,
|
|
276
|
-
isActive: selected.id === node.id,
|
|
277
|
-
onClick: () => config.onSelect(node)
|
|
278
|
-
}));
|
|
279
|
-
return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
280
|
-
renderDropdown ? renderDropdown({ trigger, items, align: "start" }) : (
|
|
281
|
-
// Fallback: simple select-style rendering
|
|
282
|
-
/* @__PURE__ */ jsx2("div", { className: "relative group", children: trigger })
|
|
283
|
-
),
|
|
284
|
-
!isLast && /* @__PURE__ */ jsx2(ChevronRight, { className: cn("shrink-0 text-[#596475]", compact ? "h-3 w-3" : "h-3.5 w-3.5") })
|
|
285
|
-
] });
|
|
286
|
-
}
|
|
287
|
-
function DrillDownPrompt({
|
|
288
|
-
label,
|
|
289
|
-
icon: Icon,
|
|
290
|
-
nodes,
|
|
291
|
-
onSelect,
|
|
292
|
-
compact,
|
|
293
|
-
renderDropdown
|
|
294
|
-
}) {
|
|
295
|
-
if (nodes.length === 0) return null;
|
|
296
|
-
if (nodes.length === 1) {
|
|
297
|
-
return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
298
|
-
/* @__PURE__ */ jsx2(ChevronRight, { className: cn("shrink-0 text-[#596475]", compact ? "h-3 w-3" : "h-3.5 w-3.5") }),
|
|
299
|
-
/* @__PURE__ */ jsxs(
|
|
300
|
-
"button",
|
|
301
|
-
{
|
|
302
|
-
onClick: () => onSelect(nodes[0]),
|
|
303
|
-
className: cn(
|
|
304
|
-
"flex items-center gap-1.5 px-2 py-1 rounded-md text-sm",
|
|
305
|
-
"text-[#596475] hover:bg-[#1E2738] hover:text-[#8890A0]",
|
|
306
|
-
"transition-colors cursor-pointer",
|
|
307
|
-
compact && "px-1.5 py-0.5 text-xs"
|
|
308
|
-
),
|
|
309
|
-
children: [
|
|
310
|
-
/* @__PURE__ */ jsx2(Icon, { className: cn("shrink-0", compact ? "h-3 w-3" : "h-3.5 w-3.5") }),
|
|
311
|
-
/* @__PURE__ */ jsx2("span", { className: "truncate", children: nodes[0].name })
|
|
312
|
-
]
|
|
313
|
-
}
|
|
314
|
-
)
|
|
315
|
-
] });
|
|
316
|
-
}
|
|
317
|
-
const trigger = /* @__PURE__ */ jsxs(
|
|
318
|
-
"button",
|
|
319
|
-
{
|
|
320
|
-
className: cn(
|
|
321
|
-
"flex items-center gap-1.5 px-2 py-1 rounded-md text-sm",
|
|
322
|
-
"text-[#596475] hover:bg-[#1E2738] hover:text-[#8890A0]",
|
|
323
|
-
"transition-colors cursor-pointer outline-none",
|
|
324
|
-
"border border-dashed border-[#2A2A3E] hover:border-[#596475]",
|
|
325
|
-
compact && "px-1.5 py-0.5 text-xs"
|
|
326
|
-
),
|
|
327
|
-
children: [
|
|
328
|
-
/* @__PURE__ */ jsx2(Icon, { className: cn("shrink-0", compact ? "h-3 w-3" : "h-3.5 w-3.5") }),
|
|
329
|
-
/* @__PURE__ */ jsxs("span", { className: "truncate", children: [
|
|
330
|
-
"Select ",
|
|
331
|
-
label
|
|
332
|
-
] }),
|
|
333
|
-
/* @__PURE__ */ jsx2(ChevronDown, { className: cn("shrink-0", compact ? "h-2.5 w-2.5" : "h-3 w-3") })
|
|
334
|
-
]
|
|
335
|
-
}
|
|
336
|
-
);
|
|
337
|
-
const items = nodes.map((node) => ({
|
|
338
|
-
key: node.id,
|
|
339
|
-
label: node.name,
|
|
340
|
-
code: node.code,
|
|
341
|
-
icon: Icon,
|
|
342
|
-
isActive: false,
|
|
343
|
-
onClick: () => onSelect(node)
|
|
344
|
-
}));
|
|
345
|
-
return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
346
|
-
/* @__PURE__ */ jsx2(ChevronRight, { className: cn("shrink-0 text-[#596475]", compact ? "h-3 w-3" : "h-3.5 w-3.5") }),
|
|
347
|
-
renderDropdown ? renderDropdown({ trigger, items, align: "start" }) : /* @__PURE__ */ jsx2("div", { className: "relative group", children: trigger })
|
|
348
|
-
] });
|
|
349
|
-
}
|
|
350
|
-
function HierarchyNavigator({
|
|
351
|
-
hierarchy: ctx,
|
|
352
|
-
compact = false,
|
|
353
|
-
maxDepth = 5,
|
|
354
|
-
className,
|
|
355
|
-
renderDropdown
|
|
356
|
-
}) {
|
|
357
|
-
if (ctx.loading) {
|
|
358
|
-
return /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-2 animate-pulse", className), children: [
|
|
359
|
-
/* @__PURE__ */ jsx2("div", { className: "h-6 w-24 rounded bg-[#1E2738]" }),
|
|
360
|
-
/* @__PURE__ */ jsx2(ChevronRight, { className: "h-3.5 w-3.5 text-[#596475]" }),
|
|
361
|
-
/* @__PURE__ */ jsx2("div", { className: "h-6 w-20 rounded bg-[#1E2738]" })
|
|
362
|
-
] });
|
|
363
|
-
}
|
|
364
|
-
const levels = [
|
|
365
|
-
{
|
|
366
|
-
key: "enterprise",
|
|
367
|
-
label: "Enterprise",
|
|
368
|
-
icon: Building2,
|
|
369
|
-
getNodes: () => ctx.enterprises,
|
|
370
|
-
getSelected: () => ctx.selection.enterprise,
|
|
371
|
-
onSelect: ctx.selectEnterprise,
|
|
372
|
-
canSwitch: ctx.canSwitchEnterprise
|
|
373
|
-
},
|
|
374
|
-
{
|
|
375
|
-
key: "businessUnit",
|
|
376
|
-
label: "Business Unit",
|
|
377
|
-
icon: Network,
|
|
378
|
-
getNodes: () => ctx.businessUnits,
|
|
379
|
-
getSelected: () => ctx.selection.businessUnit,
|
|
380
|
-
onSelect: ctx.selectBusinessUnit
|
|
381
|
-
},
|
|
382
|
-
{
|
|
383
|
-
key: "site",
|
|
384
|
-
label: "Site",
|
|
385
|
-
icon: MapPin,
|
|
386
|
-
getNodes: () => ctx.sites,
|
|
387
|
-
getSelected: () => ctx.selection.site,
|
|
388
|
-
onSelect: ctx.selectSite
|
|
389
|
-
},
|
|
390
|
-
{
|
|
391
|
-
key: "area",
|
|
392
|
-
label: "Area",
|
|
393
|
-
icon: LayoutGrid,
|
|
394
|
-
getNodes: () => ctx.areas,
|
|
395
|
-
getSelected: () => ctx.selection.area,
|
|
396
|
-
onSelect: ctx.selectArea
|
|
397
|
-
},
|
|
398
|
-
{
|
|
399
|
-
key: "asset",
|
|
400
|
-
label: "Asset",
|
|
401
|
-
icon: Box,
|
|
402
|
-
getNodes: () => ctx.assets,
|
|
403
|
-
getSelected: () => ctx.selection.asset,
|
|
404
|
-
onSelect: ctx.selectAsset
|
|
405
|
-
}
|
|
406
|
-
].slice(0, maxDepth);
|
|
407
|
-
const selectedLevels = levels.filter((l) => l.getSelected() !== null);
|
|
408
|
-
const nextLevel = levels.find((l) => l.getSelected() === null && l.getNodes().length > 0);
|
|
409
|
-
return /* @__PURE__ */ jsxs(
|
|
410
|
-
"nav",
|
|
411
|
-
{
|
|
412
|
-
className: cn("flex items-center flex-wrap gap-0.5", className),
|
|
413
|
-
"aria-label": "Hierarchy navigation",
|
|
414
|
-
children: [
|
|
415
|
-
selectedLevels.map((level, idx) => /* @__PURE__ */ jsx2(
|
|
416
|
-
BreadcrumbLevel,
|
|
417
|
-
{
|
|
418
|
-
config: level,
|
|
419
|
-
isLast: idx === selectedLevels.length - 1 && !nextLevel,
|
|
420
|
-
compact,
|
|
421
|
-
renderDropdown
|
|
422
|
-
},
|
|
423
|
-
level.key
|
|
424
|
-
)),
|
|
425
|
-
nextLevel && /* @__PURE__ */ jsx2(
|
|
426
|
-
DrillDownPrompt,
|
|
427
|
-
{
|
|
428
|
-
label: nextLevel.label,
|
|
429
|
-
icon: nextLevel.icon,
|
|
430
|
-
nodes: nextLevel.getNodes(),
|
|
431
|
-
onSelect: nextLevel.onSelect,
|
|
432
|
-
compact,
|
|
433
|
-
renderDropdown
|
|
434
|
-
}
|
|
435
|
-
),
|
|
436
|
-
selectedLevels.length === 0 && !nextLevel && /* @__PURE__ */ jsx2("span", { className: "text-sm text-[#596475] italic", children: "No hierarchy data available" })
|
|
437
|
-
]
|
|
438
|
-
}
|
|
439
|
-
);
|
|
440
|
-
}
|
|
15
|
+
import "../chunk-JT3XLKKD.js";
|
|
441
16
|
export {
|
|
442
17
|
ACTIVE_ENTERPRISE_COOKIE,
|
|
443
18
|
HierarchyNavigator,
|
|
@@ -447,6 +22,7 @@ export {
|
|
|
447
22
|
ORG_HIERARCHY_LEVELS,
|
|
448
23
|
applyEnterpriseOverride,
|
|
449
24
|
createOrgHierarchyContext,
|
|
25
|
+
readActiveEnterpriseCookie,
|
|
450
26
|
scopeHierarchyToEnterprise
|
|
451
27
|
};
|
|
452
28
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hierarchy/OrgHierarchyContext.tsx","../../src/hierarchy/HierarchyNavigator.tsx"],"sourcesContent":["/**\n * OrgHierarchyContext — shared React context factory for the Organisational Hierarchy.\n *\n * Usage:\n * const { OrgHierarchyProvider, useOrgHierarchy } = createOrgHierarchyContext({\n * storageKey: \"oplytics-portal-org-hierarchy\",\n * useHierarchyData: () => {\n * const { data, isLoading } = trpc.hierarchy.flat.useQuery(...);\n * return { data: data ?? null, isLoading };\n * },\n * });\n *\n * All selection state, cascade setters, breadcrumbs, and session persistence\n * are handled here — no per-subdomain duplication.\n */\nimport {\n createContext,\n useContext,\n useCallback,\n useMemo,\n useState,\n useEffect,\n type ReactNode,\n} from \"react\";\nimport type {\n OrgHierarchyData,\n OrgHierarchyNode,\n OrgHierarchySelection,\n OrgHierarchyContextValue,\n} from \"./orgHierarchy\";\nimport { ORG_HIERARCHY_EMPTY } from \"./orgHierarchy\";\nimport { ACTIVE_ENTERPRISE_COOKIE } from \"./enterpriseOverride\";\n\n/* ── Active-enterprise cookie (the single cross-subdomain channel) ── */\n\n/**\n * Read the Portal-set active-enterprise cookie on the client. This is the only\n * signal a subdomain has that the platform admin switched enterprise; the value\n * is the active enterprise id (or null if unset). Server-side, the same cookie\n * drives applyEnterpriseOverride + scopeHierarchyToEnterprise, so the fetched\n * hierarchy is already scoped to it — the client only needs to react to changes.\n */\nfunction readActiveEnterpriseCookie(): string | null {\n if (typeof document === \"undefined\") return null;\n const match = document.cookie\n .split(\";\")\n .map((c) => c.trim())\n .find((c) => c.startsWith(`${ACTIVE_ENTERPRISE_COOKIE}=`));\n if (!match) return null;\n const value = decodeURIComponent(match.slice(ACTIVE_ENTERPRISE_COOKIE.length + 1));\n return value.length ? value : null;\n}\n\n/* ── Factory options ── */\n\nexport interface CreateOrgHierarchyContextOptions {\n /**\n * Unique sessionStorage key for this subdomain's selection persistence.\n * e.g. \"oplytics-portal-org-hierarchy\", \"oplytics-sqdcp-org-hierarchy\"\n */\n storageKey: string;\n\n /**\n * React hook that fetches the flat hierarchy data.\n * Must return { data, isLoading } where data is OrgHierarchyData | null.\n */\n useHierarchyData: () => {\n data: OrgHierarchyData | null;\n isLoading: boolean;\n };\n}\n\n/* ── Factory ── */\n\nexport function createOrgHierarchyContext(options: CreateOrgHierarchyContextOptions) {\n const { storageKey, useHierarchyData } = options;\n\n const OrgHierarchyCtx = createContext<OrgHierarchyContextValue>({\n selection: ORG_HIERARCHY_EMPTY,\n enterprises: [],\n businessUnits: [],\n sites: [],\n areas: [],\n assets: [],\n selectEnterprise: () => {},\n selectBusinessUnit: () => {},\n selectSite: () => {},\n selectArea: () => {},\n selectAsset: () => {},\n canSwitchEnterprise: false,\n loading: true,\n breadcrumbs: [],\n });\n\n function OrgHierarchyProvider({\n children,\n canSwitchEnterprise = false,\n onEnterpriseSwitched,\n }: {\n children: ReactNode;\n canSwitchEnterprise?: boolean;\n /**\n * Callback fired when a platform_admin switches enterprise.\n * Used to persist the switch to the backend (e.g. via auth.switchEnterprise mutation).\n * Only called when canSwitchEnterprise is true and the user explicitly changes enterprise.\n */\n onEnterpriseSwitched?: (enterpriseId: number | null) => void;\n }) {\n // Single source of truth = the server-scoped hierarchy. We deliberately do\n // NOT restore a persisted selection on load — that is exactly what let one\n // tab/subdomain show a different enterprise than another. We always\n // re-derive from the server (which is scoped to the active enterprise).\n const [selection, setSelection] = useState<OrgHierarchySelection>(ORG_HIERARCHY_EMPTY);\n\n // On mount: drop any legacy persisted selection, and hard-reload if the\n // active enterprise changes under us (i.e. the Portal admin switched).\n // Reloading lets the server re-scope this app to the new enterprise — the\n // single, identical propagation path for every subdomain. Cookies emit no\n // change event, so we re-check whenever the tab regains focus/visibility.\n useEffect(() => {\n try {\n sessionStorage.removeItem(storageKey);\n } catch {\n // ignore storage errors\n }\n\n const activeAtMount = readActiveEnterpriseCookie();\n const reloadIfEnterpriseChanged = () => {\n if (typeof window !== \"undefined\" && readActiveEnterpriseCookie() !== activeAtMount) {\n window.location.reload();\n }\n };\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"focus\", reloadIfEnterpriseChanged);\n document.addEventListener(\"visibilitychange\", reloadIfEnterpriseChanged);\n return () => {\n window.removeEventListener(\"focus\", reloadIfEnterpriseChanged);\n document.removeEventListener(\"visibilitychange\", reloadIfEnterpriseChanged);\n };\n }\n return undefined;\n // storageKey is stable for the lifetime of a factory instance.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Fetch hierarchy data via the provided hook\n const { data: hierarchy, isLoading } = useHierarchyData();\n\n // ── Derive filtered lists from flat data ──\n\n const enterprises = useMemo<OrgHierarchyNode[]>(() => {\n if (!hierarchy?.enterprises) return [];\n return hierarchy.enterprises.map((e) => ({\n id: e.id,\n name: e.name,\n code: e.code,\n }));\n }, [hierarchy]);\n\n const businessUnits = useMemo<OrgHierarchyNode[]>(() => {\n if (!hierarchy?.businessUnits || !selection.enterprise) return [];\n return hierarchy.businessUnits\n .filter((bu) => bu.enterpriseId === selection.enterprise!.id)\n .map((bu) => ({ id: bu.id, name: bu.name, code: bu.code }));\n }, [hierarchy, selection.enterprise]);\n\n const sites = useMemo<OrgHierarchyNode[]>(() => {\n if (!hierarchy?.sites || !selection.enterprise) return [];\n let filtered = hierarchy.sites.filter(\n (s) => s.enterpriseId === selection.enterprise!.id\n );\n if (selection.businessUnit) {\n filtered = filtered.filter(\n (s) => s.businessUnitId === selection.businessUnit!.id\n );\n }\n return filtered.map((s) => ({ id: s.id, name: s.name, code: s.code }));\n }, [hierarchy, selection.enterprise, selection.businessUnit]);\n\n const areas = useMemo<OrgHierarchyNode[]>(() => {\n if (!hierarchy?.areas || !selection.site) return [];\n return hierarchy.areas\n .filter((a) => a.siteId === selection.site!.id)\n .map((a) => ({ id: a.id, name: a.name, code: a.code }));\n }, [hierarchy, selection.site]);\n\n const assets = useMemo<OrgHierarchyNode[]>(() => {\n if (!hierarchy?.assets || !selection.area) return [];\n return hierarchy.assets\n .filter((a) => a.areaId === selection.area!.id)\n .map((a) => ({ id: a.id, name: a.name, code: a.code }));\n }, [hierarchy, selection.area]);\n\n // Auto-select first enterprise for non-platform_admin users\n useEffect(() => {\n if (isLoading || enterprises.length === 0) return;\n if (!selection.enterprise) {\n if (!canSwitchEnterprise || enterprises.length === 1) {\n setSelection((prev) => ({ ...prev, enterprise: enterprises[0] }));\n }\n }\n }, [isLoading, enterprises, selection.enterprise, canSwitchEnterprise]);\n\n // ── Cascade setters ──\n\n const selectEnterprise = useCallback((node: OrgHierarchyNode | null) => {\n setSelection({\n enterprise: node,\n businessUnit: null,\n site: null,\n area: null,\n asset: null,\n });\n // Notify backend of enterprise switch (platform_admin only)\n if (canSwitchEnterprise && onEnterpriseSwitched) {\n onEnterpriseSwitched(node?.id ?? null);\n }\n }, [canSwitchEnterprise, onEnterpriseSwitched]);\n\n const selectBusinessUnit = useCallback((node: OrgHierarchyNode | null) => {\n setSelection((prev) => ({\n ...prev,\n businessUnit: node,\n site: null,\n area: null,\n asset: null,\n }));\n }, []);\n\n const selectSite = useCallback((node: OrgHierarchyNode | null) => {\n setSelection((prev) => ({\n ...prev,\n site: node,\n area: null,\n asset: null,\n }));\n }, []);\n\n const selectArea = useCallback((node: OrgHierarchyNode | null) => {\n setSelection((prev) => ({\n ...prev,\n area: node,\n asset: null,\n }));\n }, []);\n\n const selectAsset = useCallback((node: OrgHierarchyNode | null) => {\n setSelection((prev) => ({\n ...prev,\n asset: node,\n }));\n }, []);\n\n // ── Breadcrumbs ──\n\n const breadcrumbs = useMemo(() => {\n const crumbs: { level: string; node: OrgHierarchyNode }[] = [];\n if (selection.enterprise)\n crumbs.push({ level: \"Enterprise\", node: selection.enterprise });\n if (selection.businessUnit)\n crumbs.push({ level: \"Business Unit\", node: selection.businessUnit });\n if (selection.site)\n crumbs.push({ level: \"Site\", node: selection.site });\n if (selection.area)\n crumbs.push({ level: \"Area\", node: selection.area });\n if (selection.asset)\n crumbs.push({ level: \"Asset\", node: selection.asset });\n return crumbs;\n }, [selection]);\n\n // ── Context value ──\n\n const value = useMemo<OrgHierarchyContextValue>(\n () => ({\n selection,\n enterprises,\n businessUnits,\n sites,\n areas,\n assets,\n selectEnterprise,\n selectBusinessUnit,\n selectSite,\n selectArea,\n selectAsset,\n canSwitchEnterprise,\n loading: isLoading,\n breadcrumbs,\n }),\n [\n selection,\n enterprises,\n businessUnits,\n sites,\n areas,\n assets,\n selectEnterprise,\n selectBusinessUnit,\n selectSite,\n selectArea,\n selectAsset,\n canSwitchEnterprise,\n isLoading,\n breadcrumbs,\n ]\n );\n\n return (\n <OrgHierarchyCtx.Provider value={value}>\n {children}\n </OrgHierarchyCtx.Provider>\n );\n }\n\n function useOrgHierarchy(): OrgHierarchyContextValue {\n return useContext(OrgHierarchyCtx);\n }\n\n return { OrgHierarchyProvider, useOrgHierarchy };\n}\n\n/* ── Re-export types for convenience ── */\nexport type {\n OrgHierarchyNode,\n OrgHierarchyData,\n OrgHierarchySelection,\n OrgHierarchyContextValue,\n} from \"./orgHierarchy\";\n","/**\n * HierarchyNavigator — breadcrumb-style hierarchy switcher.\n *\n * Displays: Enterprise / BU / Site / Area / Asset\n * Each level is a clickable dropdown to switch context.\n * Platform admins can switch enterprises; others see their scoped enterprise.\n *\n * NOTE: This component requires the consuming app to provide:\n * - A hierarchy context via useHierarchy prop\n * - shadcn/ui DropdownMenu components via the renderDropdown prop\n *\n * For apps using the createOrgHierarchyContext factory, pass the useOrgHierarchy hook.\n *\n * Oplytics dark theme: #0A0E1A bg, #8C34E9 accent, #E2E8F0 text, #8890A0 muted\n */\nimport { cn } from \"../utils/cn\";\nimport type { OrgHierarchyNode, OrgHierarchyContextValue } from \"./orgHierarchy\";\nimport { ChevronRight, ChevronDown, Building2, Network, MapPin, LayoutGrid, Box } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\n/* ── Level config ── */\n\ninterface LevelConfig {\n key: string;\n label: string;\n icon: React.ElementType;\n getNodes: () => OrgHierarchyNode[];\n getSelected: () => OrgHierarchyNode | null;\n onSelect: (node: OrgHierarchyNode | null) => void;\n canSwitch?: boolean;\n}\n\n/* ── Dropdown render prop types ── */\n\nexport interface DropdownRenderProps {\n trigger: ReactNode;\n items: Array<{\n key: number;\n label: string;\n code?: string;\n icon: React.ElementType;\n isActive: boolean;\n onClick: () => void;\n }>;\n align?: \"start\" | \"end\";\n}\n\n/* ── Single breadcrumb level ── */\n\nfunction BreadcrumbLevel({\n config,\n isLast,\n compact,\n renderDropdown,\n}: {\n config: LevelConfig;\n isLast: boolean;\n compact?: boolean;\n renderDropdown?: (props: DropdownRenderProps) => ReactNode;\n}) {\n const nodes = config.getNodes();\n const selected = config.getSelected();\n const Icon = config.icon;\n const canSwitch = config.canSwitch !== false;\n const hasMultiple = nodes.length > 1;\n\n if (!selected) return null;\n\n // If only one option or can't switch, show as static text\n if (!hasMultiple || !canSwitch) {\n return (\n <div className=\"flex items-center gap-1\">\n <div\n className={cn(\n \"flex items-center gap-1.5 px-2 py-1 rounded-md text-sm\",\n \"text-[#E2E8F0]\",\n compact && \"px-1.5 py-0.5 text-xs\"\n )}\n >\n <Icon className={cn(\"shrink-0 text-[#8890A0]\", compact ? \"h-3 w-3\" : \"h-3.5 w-3.5\")} />\n <span className=\"truncate max-w-[120px]\">{selected.name}</span>\n </div>\n {!isLast && (\n <ChevronRight className={cn(\"shrink-0 text-[#596475]\", compact ? \"h-3 w-3\" : \"h-3.5 w-3.5\")} />\n )}\n </div>\n );\n }\n\n // Multiple options — use renderDropdown if provided, otherwise basic button\n const trigger = (\n <button\n className={cn(\n \"flex items-center gap-1.5 px-2 py-1 rounded-md text-sm\",\n \"text-[#E2E8F0] hover:bg-[#1E2738] hover:text-white\",\n \"transition-colors cursor-pointer outline-none\",\n \"focus-visible:ring-1 focus-visible:ring-[#8C34E9]\",\n compact && \"px-1.5 py-0.5 text-xs\"\n )}\n >\n <Icon className={cn(\"shrink-0 text-[#8890A0]\", compact ? \"h-3 w-3\" : \"h-3.5 w-3.5\")} />\n <span className=\"truncate max-w-[120px]\">{selected.name}</span>\n <ChevronDown className={cn(\"shrink-0 text-[#596475]\", compact ? \"h-2.5 w-2.5\" : \"h-3 w-3\")} />\n </button>\n );\n\n const items = nodes.map((node) => ({\n key: node.id,\n label: node.name,\n code: node.code,\n icon: Icon,\n isActive: selected.id === node.id,\n onClick: () => config.onSelect(node),\n }));\n\n return (\n <div className=\"flex items-center gap-1\">\n {renderDropdown ? (\n renderDropdown({ trigger, items, align: \"start\" })\n ) : (\n // Fallback: simple select-style rendering\n <div className=\"relative group\">\n {trigger}\n </div>\n )}\n {!isLast && (\n <ChevronRight className={cn(\"shrink-0 text-[#596475]\", compact ? \"h-3 w-3\" : \"h-3.5 w-3.5\")} />\n )}\n </div>\n );\n}\n\n/* ── Drill-down prompt ── */\n\nfunction DrillDownPrompt({\n label,\n icon: Icon,\n nodes,\n onSelect,\n compact,\n renderDropdown,\n}: {\n label: string;\n icon: React.ElementType;\n nodes: OrgHierarchyNode[];\n onSelect: (node: OrgHierarchyNode) => void;\n compact?: boolean;\n renderDropdown?: (props: DropdownRenderProps) => ReactNode;\n}) {\n if (nodes.length === 0) return null;\n\n // Auto-select if only one option\n if (nodes.length === 1) {\n return (\n <div className=\"flex items-center gap-1\">\n <ChevronRight className={cn(\"shrink-0 text-[#596475]\", compact ? \"h-3 w-3\" : \"h-3.5 w-3.5\")} />\n <button\n onClick={() => onSelect(nodes[0])}\n className={cn(\n \"flex items-center gap-1.5 px-2 py-1 rounded-md text-sm\",\n \"text-[#596475] hover:bg-[#1E2738] hover:text-[#8890A0]\",\n \"transition-colors cursor-pointer\",\n compact && \"px-1.5 py-0.5 text-xs\"\n )}\n >\n <Icon className={cn(\"shrink-0\", compact ? \"h-3 w-3\" : \"h-3.5 w-3.5\")} />\n <span className=\"truncate\">{nodes[0].name}</span>\n </button>\n </div>\n );\n }\n\n const trigger = (\n <button\n className={cn(\n \"flex items-center gap-1.5 px-2 py-1 rounded-md text-sm\",\n \"text-[#596475] hover:bg-[#1E2738] hover:text-[#8890A0]\",\n \"transition-colors cursor-pointer outline-none\",\n \"border border-dashed border-[#2A2A3E] hover:border-[#596475]\",\n compact && \"px-1.5 py-0.5 text-xs\"\n )}\n >\n <Icon className={cn(\"shrink-0\", compact ? \"h-3 w-3\" : \"h-3.5 w-3.5\")} />\n <span className=\"truncate\">Select {label}</span>\n <ChevronDown className={cn(\"shrink-0\", compact ? \"h-2.5 w-2.5\" : \"h-3 w-3\")} />\n </button>\n );\n\n const items = nodes.map((node) => ({\n key: node.id,\n label: node.name,\n code: node.code,\n icon: Icon,\n isActive: false,\n onClick: () => onSelect(node),\n }));\n\n return (\n <div className=\"flex items-center gap-1\">\n <ChevronRight className={cn(\"shrink-0 text-[#596475]\", compact ? \"h-3 w-3\" : \"h-3.5 w-3.5\")} />\n {renderDropdown ? (\n renderDropdown({ trigger, items, align: \"start\" })\n ) : (\n <div className=\"relative group\">\n {trigger}\n </div>\n )}\n </div>\n );\n}\n\n/* ── Main component ── */\n\nexport interface HierarchyNavigatorProps {\n /** The hierarchy context value — pass from useOrgHierarchy() */\n hierarchy: OrgHierarchyContextValue;\n /** Show in compact mode (smaller text, tighter spacing) */\n compact?: boolean;\n /** Maximum depth to show (default: all 5 levels) */\n maxDepth?: number;\n /** CSS class for the container */\n className?: string;\n /**\n * Render prop for dropdown menus. If not provided, dropdowns won't open.\n * Consuming apps should pass a function that renders their shadcn/ui DropdownMenu.\n */\n renderDropdown?: (props: DropdownRenderProps) => ReactNode;\n}\n\nexport function HierarchyNavigator({\n hierarchy: ctx,\n compact = false,\n maxDepth = 5,\n className,\n renderDropdown,\n}: HierarchyNavigatorProps) {\n if (ctx.loading) {\n return (\n <div className={cn(\"flex items-center gap-2 animate-pulse\", className)}>\n <div className=\"h-6 w-24 rounded bg-[#1E2738]\" />\n <ChevronRight className=\"h-3.5 w-3.5 text-[#596475]\" />\n <div className=\"h-6 w-20 rounded bg-[#1E2738]\" />\n </div>\n );\n }\n\n // Build the level configs\n const levels: LevelConfig[] = [\n {\n key: \"enterprise\",\n label: \"Enterprise\",\n icon: Building2,\n getNodes: () => ctx.enterprises,\n getSelected: () => ctx.selection.enterprise,\n onSelect: ctx.selectEnterprise,\n canSwitch: ctx.canSwitchEnterprise,\n },\n {\n key: \"businessUnit\",\n label: \"Business Unit\",\n icon: Network,\n getNodes: () => ctx.businessUnits,\n getSelected: () => ctx.selection.businessUnit,\n onSelect: ctx.selectBusinessUnit,\n },\n {\n key: \"site\",\n label: \"Site\",\n icon: MapPin,\n getNodes: () => ctx.sites,\n getSelected: () => ctx.selection.site,\n onSelect: ctx.selectSite,\n },\n {\n key: \"area\",\n label: \"Area\",\n icon: LayoutGrid,\n getNodes: () => ctx.areas,\n getSelected: () => ctx.selection.area,\n onSelect: ctx.selectArea,\n },\n {\n key: \"asset\",\n label: \"Asset\",\n icon: Box,\n getNodes: () => ctx.assets,\n getSelected: () => ctx.selection.asset,\n onSelect: ctx.selectAsset,\n },\n ].slice(0, maxDepth);\n\n // Determine which levels are selected and which is the next drill-down\n const selectedLevels = levels.filter((l) => l.getSelected() !== null);\n const nextLevel = levels.find((l) => l.getSelected() === null && l.getNodes().length > 0);\n\n return (\n <nav\n className={cn(\"flex items-center flex-wrap gap-0.5\", className)}\n aria-label=\"Hierarchy navigation\"\n >\n {selectedLevels.map((level, idx) => (\n <BreadcrumbLevel\n key={level.key}\n config={level}\n isLast={idx === selectedLevels.length - 1 && !nextLevel}\n compact={compact}\n renderDropdown={renderDropdown}\n />\n ))}\n {nextLevel && (\n <DrillDownPrompt\n label={nextLevel.label}\n icon={nextLevel.icon}\n nodes={nextLevel.getNodes()}\n onSelect={nextLevel.onSelect}\n compact={compact}\n renderDropdown={renderDropdown}\n />\n )}\n {selectedLevels.length === 0 && !nextLevel && (\n <span className=\"text-sm text-[#596475] italic\">No hierarchy data available</span>\n )}\n </nav>\n );\n}\n"],"mappings":"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","names":["jsx"]}
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/layout/index.d.ts
CHANGED
|
@@ -32,6 +32,22 @@ interface SharedPageHeaderProps {
|
|
|
32
32
|
}
|
|
33
33
|
declare function SharedPageHeader({ title, subtitle, icon, onBack, actions, breadcrumbs, showBorder, compact, className, children, }: SharedPageHeaderProps): react_jsx_runtime.JSX.Element;
|
|
34
34
|
|
|
35
|
+
interface EnterpriseDebugLabelProps {
|
|
36
|
+
/**
|
|
37
|
+
* The selection's enterprise id, if the host app can supply it (e.g. from
|
|
38
|
+
* useOrgHierarchy().selection.enterprise?.id). Optional — when omitted, only
|
|
39
|
+
* the cookie id is shown. Passing it enables the cookie-vs-selection mismatch
|
|
40
|
+
* check, which is the most useful diagnostic.
|
|
41
|
+
*/
|
|
42
|
+
selectionEnterpriseId?: number | null;
|
|
43
|
+
/**
|
|
44
|
+
* Optional enterprise name to show alongside the cookie id for readability.
|
|
45
|
+
*/
|
|
46
|
+
cookieEnterpriseName?: string | null;
|
|
47
|
+
className?: string;
|
|
48
|
+
}
|
|
49
|
+
declare function EnterpriseDebugLabel({ selectionEnterpriseId, cookieEnterpriseName, className, }: EnterpriseDebugLabelProps): react_jsx_runtime.JSX.Element;
|
|
50
|
+
|
|
35
51
|
interface FooterService {
|
|
36
52
|
name: string;
|
|
37
53
|
slug: string;
|
|
@@ -203,4 +219,4 @@ declare const SERVICE_CONFIGS: {
|
|
|
203
219
|
};
|
|
204
220
|
type ServiceKey = keyof typeof SERVICE_CONFIGS;
|
|
205
221
|
|
|
206
|
-
export { DashboardLayoutSkeleton, type DashboardLayoutSkeletonProps, FOOTER_SERVICES, type FooterService, type MenuItemConfig, type MenuSectionConfig, SERVICE_CONFIGS, type ServiceConfig, ServiceFooter, type ServiceFooterProps, type ServiceKey, type ServiceLayoutConfig, SharedFooter, type SharedFooterProps, SharedPageHeader, type SharedPageHeaderProps, SharedSidebarConfig, SharedSidebarConfig as SidebarConfig, actionManagerConfig, businessHubConfig, defineServiceLayout, oeeManagerConfig, policyDeploymentConfig, sqdcpConfig };
|
|
222
|
+
export { DashboardLayoutSkeleton, type DashboardLayoutSkeletonProps, EnterpriseDebugLabel, type EnterpriseDebugLabelProps, FOOTER_SERVICES, type FooterService, type MenuItemConfig, type MenuSectionConfig, SERVICE_CONFIGS, type ServiceConfig, ServiceFooter, type ServiceFooterProps, type ServiceKey, type ServiceLayoutConfig, SharedFooter, type SharedFooterProps, SharedPageHeader, type SharedPageHeaderProps, SharedSidebarConfig, SharedSidebarConfig as SidebarConfig, actionManagerConfig, businessHubConfig, defineServiceLayout, oeeManagerConfig, policyDeploymentConfig, sqdcpConfig };
|
package/dist/layout/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DashboardLayout,
|
|
3
3
|
DashboardLayoutSkeleton,
|
|
4
|
+
EnterpriseDebugLabel,
|
|
4
5
|
FOOTER_SERVICES,
|
|
5
6
|
HealthFooter,
|
|
6
7
|
SERVICE_CONFIGS,
|
|
@@ -17,12 +18,15 @@ import {
|
|
|
17
18
|
policyDeploymentConfig,
|
|
18
19
|
sqdcpConfig,
|
|
19
20
|
useSidebarResize
|
|
20
|
-
} from "../chunk-
|
|
21
|
+
} from "../chunk-64IHOOPN.js";
|
|
22
|
+
import "../chunk-4ATPOBMZ.js";
|
|
23
|
+
import "../chunk-NXSFRNI7.js";
|
|
21
24
|
import "../chunk-LTUYIBMA.js";
|
|
22
25
|
import "../chunk-JT3XLKKD.js";
|
|
23
26
|
export {
|
|
24
27
|
DashboardLayout,
|
|
25
28
|
DashboardLayoutSkeleton,
|
|
29
|
+
EnterpriseDebugLabel,
|
|
26
30
|
FOOTER_SERVICES,
|
|
27
31
|
HealthFooter,
|
|
28
32
|
SERVICE_CONFIGS,
|
package/dist/shell/index.js
CHANGED
package/dist/shell/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/shell/index.ts"],"sourcesContent":["/**\n * @pablo2410/shared-ui/shell — Oplytics Service Shell\n *\n * The single composed chrome (sidebar + header + breadcrumb + reporting +\n * footer + user menu) used by every Oplytics subdomain. Subdomains become\n * a ~50-line adapter that supplies *data and identity*, nothing visual.\n * One PR to shared-ui + a coordinated version bump propagates a chrome\n * change to every service.\n *\n * Composition: re-exports the existing `DashboardLayout` from\n * `@pablo2410/shared-ui/layout` under the clearer canonical name\n * `OplyticsServiceShell`. The two are the same component; consumers\n * should prefer `/shell` going forward — `/layout` will be marked\n * `@deprecated` once every subdomain has migrated and removed in\n * shared-ui v1.0 (see oplytics-subdomains tracking epic).\n *\n * CSS: ship `dist/shell/oplytics-shell.css` containing every Tailwind v4\n * utility this shell uses (built by `pnpm build:shell-css`). Consumers\n * `@import` it once in their own `index.css` and never need an\n * `@source` directive.\n *\n * ```css\n * @import \"tailwindcss\";\n * @import \"@pablo2410/shared-ui/theme/oplytics-theme.css\";\n * @import \"@pablo2410/shared-ui/shell/oplytics-shell.css\";\n * ```\n *\n * Usage:\n *\n * ```tsx\n * import { OplyticsServiceShell } from \"@pablo2410/shared-ui/shell\";\n *\n * <OplyticsServiceShell\n * serviceName=\"Connect\"\n * serviceIcon={<Zap />}\n * menuSections={menuSections}\n * adminSections={adminSections}\n * isAdmin={user?.role === \"platform_admin\"}\n * activePath={location}\n * onNavigate={setLocation}\n * user={user}\n * onLogout={logout}\n * enterprise={selection.enterprise}\n * hierarchyNavigator={<HierarchyNavigator hierarchy={hierarchy} />}\n * reportingToolbar={<ReportingToolbar … />}\n * >\n * <Routes />\n * </OplyticsServiceShell>\n * ```\n */\n\nimport {\n DashboardLayout,\n type DashboardLayoutProps,\n type DashboardLayoutUser,\n type DashboardLayoutEnterprise,\n type MenuItem,\n type MenuSection,\n HealthFooter,\n type HealthFooterProps,\n type HealthFooterUser,\n type HealthFooterEnterprise,\n} from \"../layout\";\n\n/**\n * The canonical composed Oplytics chrome.\n *\n * This is the same React component as `DashboardLayout` in\n * `@pablo2410/shared-ui/layout`, re-exported under a clearer name.\n * Consumers should prefer `OplyticsServiceShell` going forward.\n */\nconst OplyticsServiceShell = DashboardLayout;\n\n/**\n * Props accepted by `OplyticsServiceShell`.\n * (Alias of `DashboardLayoutProps`.)\n */\ntype ServiceShellProps = DashboardLayoutProps;\n\n/**\n * Authenticated user passed to the shell. Small enough to fit both\n * stateless-JWT subdomains (Connect, Policy Deployment) and DB-backed\n * ones (OEE Manager).\n */\ntype ServiceShellUser = DashboardLayoutUser;\n\n/**\n * Currently-scoped enterprise — drives the header enterprise badge.\n */\ntype ServiceShellEnterprise = DashboardLayoutEnterprise;\n\nexport {\n OplyticsServiceShell,\n type ServiceShellProps,\n type ServiceShellUser,\n type ServiceShellEnterprise,\n type MenuItem,\n type MenuSection,\n HealthFooter,\n type HealthFooterProps,\n type HealthFooterUser,\n type HealthFooterEnterprise,\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/shell/index.ts"],"sourcesContent":["/**\n * @pablo2410/shared-ui/shell — Oplytics Service Shell\n *\n * The single composed chrome (sidebar + header + breadcrumb + reporting +\n * footer + user menu) used by every Oplytics subdomain. Subdomains become\n * a ~50-line adapter that supplies *data and identity*, nothing visual.\n * One PR to shared-ui + a coordinated version bump propagates a chrome\n * change to every service.\n *\n * Composition: re-exports the existing `DashboardLayout` from\n * `@pablo2410/shared-ui/layout` under the clearer canonical name\n * `OplyticsServiceShell`. The two are the same component; consumers\n * should prefer `/shell` going forward — `/layout` will be marked\n * `@deprecated` once every subdomain has migrated and removed in\n * shared-ui v1.0 (see oplytics-subdomains tracking epic).\n *\n * CSS: ship `dist/shell/oplytics-shell.css` containing every Tailwind v4\n * utility this shell uses (built by `pnpm build:shell-css`). Consumers\n * `@import` it once in their own `index.css` and never need an\n * `@source` directive.\n *\n * ```css\n * @import \"tailwindcss\";\n * @import \"@pablo2410/shared-ui/theme/oplytics-theme.css\";\n * @import \"@pablo2410/shared-ui/shell/oplytics-shell.css\";\n * ```\n *\n * Usage:\n *\n * ```tsx\n * import { OplyticsServiceShell } from \"@pablo2410/shared-ui/shell\";\n *\n * <OplyticsServiceShell\n * serviceName=\"Connect\"\n * serviceIcon={<Zap />}\n * menuSections={menuSections}\n * adminSections={adminSections}\n * isAdmin={user?.role === \"platform_admin\"}\n * activePath={location}\n * onNavigate={setLocation}\n * user={user}\n * onLogout={logout}\n * enterprise={selection.enterprise}\n * hierarchyNavigator={<HierarchyNavigator hierarchy={hierarchy} />}\n * reportingToolbar={<ReportingToolbar … />}\n * >\n * <Routes />\n * </OplyticsServiceShell>\n * ```\n */\n\nimport {\n DashboardLayout,\n type DashboardLayoutProps,\n type DashboardLayoutUser,\n type DashboardLayoutEnterprise,\n type MenuItem,\n type MenuSection,\n HealthFooter,\n type HealthFooterProps,\n type HealthFooterUser,\n type HealthFooterEnterprise,\n} from \"../layout\";\n\n/**\n * The canonical composed Oplytics chrome.\n *\n * This is the same React component as `DashboardLayout` in\n * `@pablo2410/shared-ui/layout`, re-exported under a clearer name.\n * Consumers should prefer `OplyticsServiceShell` going forward.\n */\nconst OplyticsServiceShell = DashboardLayout;\n\n/**\n * Props accepted by `OplyticsServiceShell`.\n * (Alias of `DashboardLayoutProps`.)\n */\ntype ServiceShellProps = DashboardLayoutProps;\n\n/**\n * Authenticated user passed to the shell. Small enough to fit both\n * stateless-JWT subdomains (Connect, Policy Deployment) and DB-backed\n * ones (OEE Manager).\n */\ntype ServiceShellUser = DashboardLayoutUser;\n\n/**\n * Currently-scoped enterprise — drives the header enterprise badge.\n */\ntype ServiceShellEnterprise = DashboardLayoutEnterprise;\n\nexport {\n OplyticsServiceShell,\n type ServiceShellProps,\n type ServiceShellUser,\n type ServiceShellEnterprise,\n type MenuItem,\n type MenuSection,\n HealthFooter,\n type HealthFooterProps,\n type HealthFooterUser,\n type HealthFooterEnterprise,\n};\n"],"mappings":";;;;;;;;;;AAuEA,IAAM,uBAAuB;","names":[]}
|