@pablo2410/shared-ui 0.18.0 → 0.18.2

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.
Files changed (44) hide show
  1. package/README.md +18 -15
  2. package/dist/{HealthFooter-C5K9s38i.d.ts → HealthFooter-BoOozbWG.d.ts} +4 -4
  3. package/dist/{chunk-G7XJLTNY.js → chunk-5RY3AJKI.js} +8 -9
  4. package/dist/{chunk-G7XJLTNY.js.map → chunk-5RY3AJKI.js.map} +1 -1
  5. package/dist/{chunk-3G43UG63.js → chunk-A6UTXAPS.js} +11 -3
  6. package/dist/chunk-A6UTXAPS.js.map +1 -0
  7. package/dist/{chunk-R4NOLCSI.js → chunk-BKGUIIN2.js} +1 -1
  8. package/dist/{chunk-R4NOLCSI.js.map → chunk-BKGUIIN2.js.map} +1 -1
  9. package/dist/{chunk-WTR6SNOE.js → chunk-CPRJSW7F.js} +158 -40
  10. package/dist/chunk-CPRJSW7F.js.map +1 -0
  11. package/dist/{chunk-IEBZGU6X.js → chunk-DMUQ5WNO.js} +2 -4
  12. package/dist/chunk-DMUQ5WNO.js.map +1 -0
  13. package/dist/{chunk-PLCWXXUE.js → chunk-NXE653CX.js} +4 -10
  14. package/dist/chunk-NXE653CX.js.map +1 -0
  15. package/dist/{chunk-KXUNOSMZ.js → chunk-TTDKZK6L.js} +193 -91
  16. package/dist/chunk-TTDKZK6L.js.map +1 -0
  17. package/dist/components/index.d.ts +7 -8
  18. package/dist/components/index.js +85 -63
  19. package/dist/components/index.js.map +1 -1
  20. package/dist/hierarchy/core.js +1 -1
  21. package/dist/hierarchy/index.d.ts +3 -3
  22. package/dist/hierarchy/index.js +5 -5
  23. package/dist/insights/index.d.ts +8 -8
  24. package/dist/insights/index.js +150 -61
  25. package/dist/insights/index.js.map +1 -1
  26. package/dist/layout/index.d.ts +8 -8
  27. package/dist/layout/index.js +6 -6
  28. package/dist/primitives/index.d.ts +286 -287
  29. package/dist/primitives/index.js +2 -2
  30. package/dist/rbac/index.js.map +1 -1
  31. package/dist/reporting/index.d.ts +2 -2
  32. package/dist/reporting/index.js +42 -8
  33. package/dist/reporting/index.js.map +1 -1
  34. package/dist/services/index.js +2 -2
  35. package/dist/shell/index.d.ts +2 -3
  36. package/dist/shell/index.js +7 -7
  37. package/dist/shell/oplytics-shell.css +2 -2
  38. package/dist/theme/oplytics-theme.css +4 -4
  39. package/package.json +46 -44
  40. package/dist/chunk-3G43UG63.js.map +0 -1
  41. package/dist/chunk-IEBZGU6X.js.map +0 -1
  42. package/dist/chunk-KXUNOSMZ.js.map +0 -1
  43. package/dist/chunk-PLCWXXUE.js.map +0 -1
  44. package/dist/chunk-WTR6SNOE.js.map +0 -1
@@ -269,7 +269,7 @@ import {
269
269
  useFormField,
270
270
  useIsMobile,
271
271
  useSidebar
272
- } from "../chunk-PLCWXXUE.js";
272
+ } from "../chunk-NXE653CX.js";
273
273
  import {
274
274
  Button,
275
275
  Dialog,
@@ -288,7 +288,7 @@ import {
288
288
  buttonVariants,
289
289
  cn,
290
290
  useDialogComposition
291
- } from "../chunk-R4NOLCSI.js";
291
+ } from "../chunk-BKGUIIN2.js";
292
292
  export {
293
293
  Accordion,
294
294
  AccordionContent,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/rbac/index.ts"],"sourcesContent":["/**\n * @oplytics/shared-ui/rbac\n *\n * Standardised Role-Based Access Control for all Oplytics.digital subdomains.\n * Single source of truth for the 7-role model, permission checks, and error messages.\n */\n\n// ─── Session & Transport Constants ───────────────────────────────────────────\n\nexport const COOKIE_NAME = \"app_session_id\";\nexport const ONE_YEAR_MS = 1000 * 60 * 60 * 24 * 365;\nexport const AXIOS_TIMEOUT_MS = 30_000;\n\n// ─── Error Message Constants ─────────────────────────────────────────────────\n\nexport const UNAUTHED_ERR_MSG = \"Please login (10001)\";\nexport const NOT_ADMIN_ERR_MSG =\n \"You do not have required permission (10002)\";\nexport const NOT_PLATFORM_ADMIN_ERR_MSG =\n \"Platform admin access required (10003)\";\nexport const NOT_ENTERPRISE_ADMIN_ERR_MSG =\n \"Enterprise admin access required (10004)\";\nexport const NO_ENTERPRISE_ERR_MSG =\n \"Enterprise context not resolved. Please ensure your account is linked to an enterprise in the portal. (10005)\";\nexport const NOT_SUPERUSER_ERR_MSG =\n \"This action requires superuser access or above (10006)\";\n\n// ─── Service Visibility ──────────────────────────────────────────────────────\n\n/**\n * Services restricted to platform_admin role only.\n * These services are NOT visible in ServiceHub, Portal, marketing pages, or footer.\n * They can only be assigned/revoked by platform_admin users.\n * Non-platform-admin users cannot see or interact with these services.\n */\nexport const PLATFORM_ADMIN_ONLY_SERVICES: readonly string[] = [\"business-hub\"];\n\n// ─── 7-Role Model ────────────────────────────────────────────────────────────\n\n/**\n * Standardised 7-role model (platform-wide, same in all subdomains).\n * Ordered from highest to lowest privilege.\n *\n * platform_admin — Oplytics staff, cross-enterprise, Business Hub\n * enterprise_admin — manages users/hierarchy/settings within their enterprise\n * superuser — cross-functional read-write within enterprise (all hierarchy levels);\n * can manage operational data but NOT users or enterprise settings\n * bu_user — scoped to assigned Business Unit(s) and children\n * site_user — scoped to assigned Site(s) and children\n * area_user — scoped to assigned Area(s) and children\n * asset_user — scoped to assigned Asset(s) only\n */\nexport const ALL_ROLES = [\n \"platform_admin\",\n \"enterprise_admin\",\n \"superuser\",\n \"bu_user\",\n \"site_user\",\n \"area_user\",\n \"asset_user\",\n] as const;\n\nexport type RoleType = (typeof ALL_ROLES)[number];\n\n/**\n * Role hierarchy from lowest to highest privilege.\n * Used for hasMinimumRole() checks.\n */\nexport const ROLE_HIERARCHY: readonly RoleType[] = [\n \"asset_user\",\n \"area_user\",\n \"site_user\",\n \"bu_user\",\n \"superuser\",\n \"enterprise_admin\",\n \"platform_admin\",\n];\n\n// ─── Permission Helpers ──────────────────────────────────────────────────────\n\n/** Check if a role meets or exceeds the minimum required role */\nexport function hasMinimumRole(\n userRole: RoleType,\n minimumRole: RoleType,\n): boolean {\n return ROLE_HIERARCHY.indexOf(userRole) >= ROLE_HIERARCHY.indexOf(minimumRole);\n}\n\n/** Check if a role is one of the admin roles */\nexport function isAdmin(role: RoleType): boolean {\n return ADMIN_ROLES.includes(role);\n}\n\n/** Check if a role is superuser-level or above */\nexport function isSuperuserOrAbove(role: RoleType): boolean {\n return SUPERUSER_ROLES.includes(role);\n}\n\n// ─── Role Groups ─────────────────────────────────────────────────────────────\n\n/** Roles that grant admin-level access (can manage users, hierarchy, etc.) */\nexport const ADMIN_ROLES: readonly RoleType[] = [\n \"platform_admin\",\n \"enterprise_admin\",\n];\n\n/** Roles that grant superuser-level access (can manage operational data across enterprise) */\nexport const SUPERUSER_ROLES: readonly RoleType[] = [\n \"platform_admin\",\n \"enterprise_admin\",\n \"superuser\",\n];\n\n/** Roles that require the area level to be enabled on the enterprise */\nexport const AREA_DEPENDENT_ROLES: readonly RoleType[] = [\"area_user\"];\n\n/** Roles that require the asset level to be enabled on the enterprise */\nexport const ASSET_DEPENDENT_ROLES: readonly RoleType[] = [\"asset_user\"];\n\n// ─── Access Levels ───────────────────────────────────────────────────────────\n\n/** Access levels for user_access_scopes */\nexport const ACCESS_LEVELS = [\n \"enterprise\",\n \"business_unit\",\n \"site\",\n \"area\",\n \"asset\",\n] as const;\n\nexport type AccessLevelType = (typeof ACCESS_LEVELS)[number];\n\n/** Access levels that depend on optional hierarchy toggles */\nexport const AREA_DEPENDENT_ACCESS_LEVELS: readonly AccessLevelType[] = [\n \"area\",\n];\nexport const ASSET_DEPENDENT_ACCESS_LEVELS: readonly AccessLevelType[] = [\n \"asset\",\n];\n"],"mappings":";AASO,IAAM,cAAc;AACpB,IAAM,cAAc,MAAO,KAAK,KAAK,KAAK;AAC1C,IAAM,mBAAmB;AAIzB,IAAM,mBAAmB;AACzB,IAAM,oBACX;AACK,IAAM,6BACX;AACK,IAAM,+BACX;AACK,IAAM,wBACX;AACK,IAAM,wBACX;AAUK,IAAM,+BAAkD,CAAC,cAAc;AAiBvE,IAAM,YAAY;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAQO,IAAM,iBAAsC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,SAAS,eACd,UACA,aACS;AACT,SAAO,eAAe,QAAQ,QAAQ,KAAK,eAAe,QAAQ,WAAW;AAC/E;AAGO,SAAS,QAAQ,MAAyB;AAC/C,SAAO,YAAY,SAAS,IAAI;AAClC;AAGO,SAAS,mBAAmB,MAAyB;AAC1D,SAAO,gBAAgB,SAAS,IAAI;AACtC;AAKO,IAAM,cAAmC;AAAA,EAC9C;AAAA,EACA;AACF;AAGO,IAAM,kBAAuC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,uBAA4C,CAAC,WAAW;AAG9D,IAAM,wBAA6C,CAAC,YAAY;AAKhE,IAAM,gBAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,IAAM,+BAA2D;AAAA,EACtE;AACF;AACO,IAAM,gCAA4D;AAAA,EACvE;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/rbac/index.ts"],"sourcesContent":["/**\n * @oplytics/shared-ui/rbac\n *\n * Standardised Role-Based Access Control for all Oplytics.digital subdomains.\n * Single source of truth for the 7-role model, permission checks, and error messages.\n */\n\n// ─── Session & Transport Constants ───────────────────────────────────────────\n\nexport const COOKIE_NAME = \"app_session_id\";\nexport const ONE_YEAR_MS = 1000 * 60 * 60 * 24 * 365;\nexport const AXIOS_TIMEOUT_MS = 30_000;\n\n// ─── Error Message Constants ─────────────────────────────────────────────────\n\nexport const UNAUTHED_ERR_MSG = \"Please login (10001)\";\nexport const NOT_ADMIN_ERR_MSG = \"You do not have required permission (10002)\";\nexport const NOT_PLATFORM_ADMIN_ERR_MSG =\n \"Platform admin access required (10003)\";\nexport const NOT_ENTERPRISE_ADMIN_ERR_MSG =\n \"Enterprise admin access required (10004)\";\nexport const NO_ENTERPRISE_ERR_MSG =\n \"Enterprise context not resolved. Please ensure your account is linked to an enterprise in the portal. (10005)\";\nexport const NOT_SUPERUSER_ERR_MSG =\n \"This action requires superuser access or above (10006)\";\n\n// ─── Service Visibility ──────────────────────────────────────────────────────\n\n/**\n * Services restricted to platform_admin role only.\n * These services are NOT visible in ServiceHub, Portal, marketing pages, or footer.\n * They can only be assigned/revoked by platform_admin users.\n * Non-platform-admin users cannot see or interact with these services.\n */\nexport const PLATFORM_ADMIN_ONLY_SERVICES: readonly string[] = [\"business-hub\"];\n\n// ─── 7-Role Model ────────────────────────────────────────────────────────────\n\n/**\n * Standardised 7-role model (platform-wide, same in all subdomains).\n * Ordered from highest to lowest privilege.\n *\n * platform_admin — Oplytics staff, cross-enterprise, Business Hub\n * enterprise_admin — manages users/hierarchy/settings within their enterprise\n * superuser — cross-functional read-write within enterprise (all hierarchy levels);\n * can manage operational data but NOT users or enterprise settings\n * bu_user — scoped to assigned Business Unit(s) and children\n * site_user — scoped to assigned Site(s) and children\n * area_user — scoped to assigned Area(s) and children\n * asset_user — scoped to assigned Asset(s) only\n */\nexport const ALL_ROLES = [\n \"platform_admin\",\n \"enterprise_admin\",\n \"superuser\",\n \"bu_user\",\n \"site_user\",\n \"area_user\",\n \"asset_user\",\n] as const;\n\nexport type RoleType = (typeof ALL_ROLES)[number];\n\n/**\n * Role hierarchy from lowest to highest privilege.\n * Used for hasMinimumRole() checks.\n */\nexport const ROLE_HIERARCHY: readonly RoleType[] = [\n \"asset_user\",\n \"area_user\",\n \"site_user\",\n \"bu_user\",\n \"superuser\",\n \"enterprise_admin\",\n \"platform_admin\",\n];\n\n// ─── Permission Helpers ──────────────────────────────────────────────────────\n\n/** Check if a role meets or exceeds the minimum required role */\nexport function hasMinimumRole(\n userRole: RoleType,\n minimumRole: RoleType\n): boolean {\n return (\n ROLE_HIERARCHY.indexOf(userRole) >= ROLE_HIERARCHY.indexOf(minimumRole)\n );\n}\n\n/** Check if a role is one of the admin roles */\nexport function isAdmin(role: RoleType): boolean {\n return ADMIN_ROLES.includes(role);\n}\n\n/** Check if a role is superuser-level or above */\nexport function isSuperuserOrAbove(role: RoleType): boolean {\n return SUPERUSER_ROLES.includes(role);\n}\n\n// ─── Role Groups ─────────────────────────────────────────────────────────────\n\n/** Roles that grant admin-level access (can manage users, hierarchy, etc.) */\nexport const ADMIN_ROLES: readonly RoleType[] = [\n \"platform_admin\",\n \"enterprise_admin\",\n];\n\n/** Roles that grant superuser-level access (can manage operational data across enterprise) */\nexport const SUPERUSER_ROLES: readonly RoleType[] = [\n \"platform_admin\",\n \"enterprise_admin\",\n \"superuser\",\n];\n\n/** Roles that require the area level to be enabled on the enterprise */\nexport const AREA_DEPENDENT_ROLES: readonly RoleType[] = [\"area_user\"];\n\n/** Roles that require the asset level to be enabled on the enterprise */\nexport const ASSET_DEPENDENT_ROLES: readonly RoleType[] = [\"asset_user\"];\n\n// ─── Access Levels ───────────────────────────────────────────────────────────\n\n/** Access levels for user_access_scopes */\nexport const ACCESS_LEVELS = [\n \"enterprise\",\n \"business_unit\",\n \"site\",\n \"area\",\n \"asset\",\n] as const;\n\nexport type AccessLevelType = (typeof ACCESS_LEVELS)[number];\n\n/** Access levels that depend on optional hierarchy toggles */\nexport const AREA_DEPENDENT_ACCESS_LEVELS: readonly AccessLevelType[] = [\n \"area\",\n];\nexport const ASSET_DEPENDENT_ACCESS_LEVELS: readonly AccessLevelType[] = [\n \"asset\",\n];\n"],"mappings":";AASO,IAAM,cAAc;AACpB,IAAM,cAAc,MAAO,KAAK,KAAK,KAAK;AAC1C,IAAM,mBAAmB;AAIzB,IAAM,mBAAmB;AACzB,IAAM,oBAAoB;AAC1B,IAAM,6BACX;AACK,IAAM,+BACX;AACK,IAAM,wBACX;AACK,IAAM,wBACX;AAUK,IAAM,+BAAkD,CAAC,cAAc;AAiBvE,IAAM,YAAY;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAQO,IAAM,iBAAsC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,SAAS,eACd,UACA,aACS;AACT,SACE,eAAe,QAAQ,QAAQ,KAAK,eAAe,QAAQ,WAAW;AAE1E;AAGO,SAAS,QAAQ,MAAyB;AAC/C,SAAO,YAAY,SAAS,IAAI;AAClC;AAGO,SAAS,mBAAmB,MAAyB;AAC1D,SAAO,gBAAgB,SAAS,IAAI;AACtC;AAKO,IAAM,cAAmC;AAAA,EAC9C;AAAA,EACA;AACF;AAGO,IAAM,kBAAuC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,uBAA4C,CAAC,WAAW;AAG9D,IAAM,wBAA6C,CAAC,YAAY;AAKhE,IAAM,gBAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,IAAM,+BAA2D;AAAA,EACtE;AACF;AACO,IAAM,gCAA4D;AAAA,EACvE;AACF;","names":[]}
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
 
3
3
  interface ReportingToolbarProps extends Omit<ReportingToolbarConfig, "moduleName"> {
4
4
  /** Service/module name (e.g. "Connect", "Policy Deployment"). Defaults to "Oplytics". */
@@ -15,7 +15,7 @@ interface ReportingToolbarProps extends Omit<ReportingToolbarConfig, "moduleName
15
15
  /** CSS class for the container. */
16
16
  className?: string;
17
17
  }
18
- declare function ReportingToolbar({ moduleName, showIncidentReporting, showFeedback, reportCategories, feedbackCategories, onReportSubmit, onFeedbackSubmit, defaultLocation, className, }: ReportingToolbarProps): react_jsx_runtime.JSX.Element;
18
+ declare function ReportingToolbar({ moduleName, showIncidentReporting, showFeedback, reportCategories, feedbackCategories, onReportSubmit, onFeedbackSubmit, defaultLocation, className, }: ReportingToolbarProps): React.JSX.Element;
19
19
 
20
20
  /**
21
21
  * @oplytics/shared-ui/reporting
@@ -13,7 +13,7 @@ import {
13
13
  SelectTrigger,
14
14
  SelectValue,
15
15
  Textarea
16
- } from "../chunk-PLCWXXUE.js";
16
+ } from "../chunk-NXE653CX.js";
17
17
  import {
18
18
  cn
19
19
  } from "../chunk-JT3XLKKD.js";
@@ -26,7 +26,7 @@ import {
26
26
  DialogHeader,
27
27
  DialogTitle,
28
28
  Label
29
- } from "../chunk-R4NOLCSI.js";
29
+ } from "../chunk-BKGUIIN2.js";
30
30
 
31
31
  // src/reporting/ReportingToolbar.tsx
32
32
  import { useState } from "react";
@@ -211,7 +211,13 @@ function ReportingToolbar({
211
211
  onClick: () => openReportDialog(opt.category),
212
212
  className: "gap-3 py-2.5",
213
213
  children: [
214
- /* @__PURE__ */ jsx(opt.icon, { className: "h-4 w-4", style: { color: opt.color } }),
214
+ /* @__PURE__ */ jsx(
215
+ opt.icon,
216
+ {
217
+ className: "h-4 w-4",
218
+ style: { color: opt.color }
219
+ }
220
+ ),
215
221
  /* @__PURE__ */ jsxs("div", { children: [
216
222
  /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: opt.label }),
217
223
  /* @__PURE__ */ jsx("p", { className: "text-[10px] text-muted-foreground", children: opt.description })
@@ -230,7 +236,13 @@ function ReportingToolbar({
230
236
  onClick: () => openFeedbackDialog(opt.category),
231
237
  className: "gap-3 py-2.5",
232
238
  children: [
233
- /* @__PURE__ */ jsx(opt.icon, { className: "h-4 w-4", style: { color: opt.color } }),
239
+ /* @__PURE__ */ jsx(
240
+ opt.icon,
241
+ {
242
+ className: "h-4 w-4",
243
+ style: { color: opt.color }
244
+ }
245
+ ),
234
246
  /* @__PURE__ */ jsxs("div", { children: [
235
247
  /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: opt.label }),
236
248
  /* @__PURE__ */ jsx("p", { className: "text-[10px] text-muted-foreground", children: opt.description })
@@ -245,7 +257,13 @@ function ReportingToolbar({
245
257
  /* @__PURE__ */ jsx(Dialog, { open: reportDialogOpen, onOpenChange: setReportDialogOpen, children: /* @__PURE__ */ jsxs(DialogContent, { className: "sm:max-w-[500px]", children: [
246
258
  /* @__PURE__ */ jsxs(DialogHeader, { children: [
247
259
  /* @__PURE__ */ jsxs(DialogTitle, { className: "flex items-center gap-2", children: [
248
- reportConfig && /* @__PURE__ */ jsx(reportConfig.icon, { className: "h-5 w-5", style: { color: reportConfig.color } }),
260
+ reportConfig && /* @__PURE__ */ jsx(
261
+ reportConfig.icon,
262
+ {
263
+ className: "h-5 w-5",
264
+ style: { color: reportConfig.color }
265
+ }
266
+ ),
249
267
  reportConfig?.label || "Report",
250
268
  selectedReportCategory === "stop-work" && /* @__PURE__ */ jsx(Badge, { className: "bg-[#F59E0B] text-white text-[9px] border-0", children: "URGENT" })
251
269
  ] }),
@@ -261,7 +279,9 @@ function ReportingToolbar({
261
279
  Select,
262
280
  {
263
281
  value: reportSeverity,
264
- onValueChange: (v) => setReportSeverity(v),
282
+ onValueChange: (v) => setReportSeverity(
283
+ v
284
+ ),
265
285
  children: [
266
286
  /* @__PURE__ */ jsx(SelectTrigger, { className: "h-9", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
267
287
  /* @__PURE__ */ jsx(SelectContent, { children: SEVERITY_OPTIONS.map((s) => /* @__PURE__ */ jsx(SelectItem, { value: s.value, children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
@@ -316,7 +336,14 @@ function ReportingToolbar({
316
336
  ] })
317
337
  ] }),
318
338
  /* @__PURE__ */ jsxs(DialogFooter, { children: [
319
- /* @__PURE__ */ jsx(Button, { variant: "outline", onClick: () => setReportDialogOpen(false), children: "Cancel" }),
339
+ /* @__PURE__ */ jsx(
340
+ Button,
341
+ {
342
+ variant: "outline",
343
+ onClick: () => setReportDialogOpen(false),
344
+ children: "Cancel"
345
+ }
346
+ ),
320
347
  /* @__PURE__ */ jsxs(
321
348
  Button,
322
349
  {
@@ -375,7 +402,14 @@ function ReportingToolbar({
375
402
  ] })
376
403
  ] }),
377
404
  /* @__PURE__ */ jsxs(DialogFooter, { children: [
378
- /* @__PURE__ */ jsx(Button, { variant: "outline", onClick: () => setFeedbackDialogOpen(false), children: "Cancel" }),
405
+ /* @__PURE__ */ jsx(
406
+ Button,
407
+ {
408
+ variant: "outline",
409
+ onClick: () => setFeedbackDialogOpen(false),
410
+ children: "Cancel"
411
+ }
412
+ ),
379
413
  /* @__PURE__ */ jsxs(
380
414
  Button,
381
415
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/reporting/ReportingToolbar.tsx","../../src/reporting/index.ts"],"sourcesContent":["/**\n * ReportingToolbar — standard Safety / Environmental / Stop Work incident\n * reporting and Problem / Suggestion feedback for all Oplytics subdomains.\n *\n * Visual model — a single grouped dropdown button in the top-right of the\n * header, so the header doesn't carry two separate buttons for what is, from\n * the user's perspective, one \"get help / raise something\" action:\n * ⚡ User Actions ▾ → Safety Incident | Environmental | Stop Work\n * ── (separator) ──\n * Report Problem | Suggestion\n *\n * Selecting an option opens a self-contained dialog with the right form for\n * that report/feedback type (severity / location / description / immediate\n * action for incidents; subject / description for feedback). On submit the\n * configured `onReportSubmit` / `onFeedbackSubmit` handler is called with\n * the canonical `IncidentReport` / `FeedbackReport` shape.\n *\n * Ported from the Policy Deployment subdomain — the canonical visual\n * reference. Originally two separate dropdown buttons (Report / Feedback);\n * merged into one \"User Actions\" menu to reduce header clutter.\n *\n * Oplytics dark theme: #0A0E1A bg, #8C34E9 accent.\n */\nimport { useState } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport {\n Button,\n Badge,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Input,\n Label,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../primitives\";\nimport {\n ShieldAlert,\n Leaf,\n OctagonX,\n Bug,\n Lightbulb,\n ChevronDown,\n Send,\n AlertTriangle,\n UserCog,\n} from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport type {\n ReportCategory,\n FeedbackCategory,\n IncidentReport,\n FeedbackReport,\n ReportingToolbarConfig,\n} from \"./index\";\n\n/* ── Report / feedback option catalogues ── */\n\ninterface ReportOption {\n category: ReportCategory;\n label: string;\n description: string;\n icon: React.ElementType;\n color: string;\n}\n\ninterface FeedbackOption {\n category: FeedbackCategory;\n label: string;\n description: string;\n icon: React.ElementType;\n color: string;\n}\n\nconst ALL_REPORT_OPTIONS: ReportOption[] = [\n {\n category: \"safety\",\n label: \"Safety Incident\",\n description: \"Report a safety hazard, near miss, or injury\",\n icon: ShieldAlert,\n color: \"#EF4444\",\n },\n {\n category: \"environmental\",\n label: \"Environmental\",\n description: \"Report an environmental concern or spill\",\n icon: Leaf,\n color: \"#22C55E\",\n },\n {\n category: \"stop-work\",\n label: \"Stop Work\",\n description: \"Raise a stop work authority — immediate halt\",\n icon: OctagonX,\n color: \"#F59E0B\",\n },\n];\n\nconst ALL_FEEDBACK_OPTIONS: FeedbackOption[] = [\n {\n category: \"problem\",\n label: \"Report Problem\",\n description: \"Something isn't working\",\n icon: Bug,\n color: \"#EF4444\",\n },\n {\n category: \"suggestion\",\n label: \"Suggestion\",\n description: \"Idea for improvement\",\n icon: Lightbulb,\n color: \"#8C34E9\",\n },\n];\n\nconst SEVERITY_OPTIONS: {\n value: NonNullable<IncidentReport[\"severity\"]>;\n label: string;\n color: string;\n}[] = [\n { value: \"critical\", label: \"Critical\", color: \"#EF4444\" },\n { value: \"high\", label: \"High\", color: \"#F59E0B\" },\n { value: \"medium\", label: \"Medium\", color: \"#3b82f6\" },\n { value: \"low\", label: \"Low\", color: \"#22C55E\" },\n];\n\n/* ── Props ── */\n\nexport interface ReportingToolbarProps extends Omit<ReportingToolbarConfig, \"moduleName\"> {\n /** Service/module name (e.g. \"Connect\", \"Policy Deployment\"). Defaults to \"Oplytics\". */\n moduleName?: string;\n /** Optional pre-fill for the report dialog's Location/Area field. */\n defaultLocation?: string;\n /**\n * Compact mode — currently a no-op (the new design always responsive-collapses\n * the labels at small breakpoints). Kept on the prop type so callers that\n * still pass it continue to type-check.\n * @deprecated The toolbar handles responsive collapse on its own.\n */\n compact?: boolean;\n /** CSS class for the container. */\n className?: string;\n}\n\n/* ── Component ── */\n\nexport function ReportingToolbar({\n moduleName = \"Oplytics\",\n showIncidentReporting = true,\n showFeedback = true,\n reportCategories = [\"safety\", \"environmental\", \"stop-work\"],\n feedbackCategories = [\"problem\", \"suggestion\"],\n onReportSubmit,\n onFeedbackSubmit,\n defaultLocation = \"\",\n className,\n}: ReportingToolbarProps) {\n const reportOptions = ALL_REPORT_OPTIONS.filter((opt) =>\n reportCategories.includes(opt.category),\n );\n const feedbackOptions = ALL_FEEDBACK_OPTIONS.filter((opt) =>\n feedbackCategories.includes(opt.category),\n );\n\n /* ── Report dialog state ── */\n const [reportDialogOpen, setReportDialogOpen] = useState(false);\n const [selectedReportCategory, setSelectedReportCategory] =\n useState<ReportCategory>(\"safety\");\n const [reportSeverity, setReportSeverity] =\n useState<NonNullable<IncidentReport[\"severity\"]>>(\"medium\");\n const [reportLocation, setReportLocation] = useState(defaultLocation);\n const [reportDescription, setReportDescription] = useState(\"\");\n const [reportImmediateAction, setReportImmediateAction] = useState(\"\");\n\n /* ── Feedback dialog state ── */\n const [feedbackDialogOpen, setFeedbackDialogOpen] = useState(false);\n const [selectedFeedbackCategory, setSelectedFeedbackCategory] =\n useState<FeedbackCategory>(\"problem\");\n const [feedbackSubject, setFeedbackSubject] = useState(\"\");\n const [feedbackDescription, setFeedbackDescription] = useState(\"\");\n\n const [submitting, setSubmitting] = useState(false);\n\n const openReportDialog = (category: ReportCategory) => {\n setSelectedReportCategory(category);\n setReportSeverity(category === \"stop-work\" ? \"critical\" : \"medium\");\n setReportLocation(defaultLocation);\n setReportDescription(\"\");\n setReportImmediateAction(\"\");\n setReportDialogOpen(true);\n };\n\n const openFeedbackDialog = (category: FeedbackCategory) => {\n setSelectedFeedbackCategory(category);\n setFeedbackSubject(\"\");\n setFeedbackDescription(\"\");\n setFeedbackDialogOpen(true);\n };\n\n const handleReportSubmit = async () => {\n if (!reportDescription.trim()) {\n toast.error(\"Please provide a description\");\n return;\n }\n setSubmitting(true);\n try {\n const report: IncidentReport = {\n category: selectedReportCategory,\n description: reportDescription,\n location: reportLocation || undefined,\n severity: reportSeverity,\n immediateAction: reportImmediateAction || undefined,\n moduleName,\n timestamp: new Date().toISOString(),\n };\n await onReportSubmit(report);\n toast.success(\"Report submitted successfully\", {\n description:\n selectedReportCategory === \"stop-work\"\n ? \"Stop Work authority raised — management has been notified\"\n : \"Your report has been logged and assigned for review\",\n });\n setReportDialogOpen(false);\n } catch (err) {\n console.error(\"[ReportingToolbar] report submit failed:\", err);\n toast.error(\"Failed to submit report. Please try again.\");\n } finally {\n setSubmitting(false);\n }\n };\n\n const handleFeedbackSubmit = async () => {\n if (!feedbackDescription.trim()) {\n toast.error(\"Please provide a description\");\n return;\n }\n setSubmitting(true);\n try {\n const feedback: FeedbackReport = {\n category: selectedFeedbackCategory,\n subject: feedbackSubject || undefined,\n description: feedbackDescription,\n moduleName,\n timestamp: new Date().toISOString(),\n pageContext:\n typeof window !== \"undefined\" ? window.location.pathname : undefined,\n };\n await onFeedbackSubmit(feedback);\n toast.success(\n selectedFeedbackCategory === \"problem\"\n ? \"Problem reported — Oplytics team will review\"\n : \"Suggestion submitted — thank you for your feedback\",\n );\n setFeedbackDialogOpen(false);\n } catch (err) {\n console.error(\"[ReportingToolbar] feedback submit failed:\", err);\n toast.error(\"Failed to submit feedback. Please try again.\");\n } finally {\n setSubmitting(false);\n }\n };\n\n const reportConfig = ALL_REPORT_OPTIONS.find(\n (r) => r.category === selectedReportCategory,\n );\n\n return (\n <>\n {/* Toolbar button — Report + Feedback merged into one menu */}\n <div className={cn(\"flex items-center gap-2\", className)}>\n {(showIncidentReporting && reportOptions.length > 0) ||\n (showFeedback && feedbackOptions.length > 0) ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-9 gap-1.5 text-xs font-medium text-[#8890A0] hover:bg-[#1E2738] hover:text-[#E2E8F0] border border-[#1E2738]\"\n >\n <UserCog className=\"h-3.5 w-3.5\" />\n <span className=\"shell-hidden shell-sm:inline\">User Actions</span>\n <ChevronDown className=\"h-3 w-3\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-56\">\n {showIncidentReporting && reportOptions.length > 0 && (\n <>\n <DropdownMenuLabel className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">\n Report\n </DropdownMenuLabel>\n {reportOptions.map((opt) => (\n <DropdownMenuItem\n key={opt.category}\n onClick={() => openReportDialog(opt.category)}\n className=\"gap-3 py-2.5\"\n >\n <opt.icon className=\"h-4 w-4\" style={{ color: opt.color }} />\n <div>\n <p className=\"text-sm font-medium\">{opt.label}</p>\n <p className=\"text-[10px] text-muted-foreground\">{opt.description}</p>\n </div>\n </DropdownMenuItem>\n ))}\n </>\n )}\n\n {showIncidentReporting &&\n reportOptions.length > 0 &&\n showFeedback &&\n feedbackOptions.length > 0 && <DropdownMenuSeparator />}\n\n {showFeedback && feedbackOptions.length > 0 && (\n <>\n <DropdownMenuLabel className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">\n Feedback\n </DropdownMenuLabel>\n {feedbackOptions.map((opt) => (\n <DropdownMenuItem\n key={opt.category}\n onClick={() => openFeedbackDialog(opt.category)}\n className=\"gap-3 py-2.5\"\n >\n <opt.icon className=\"h-4 w-4\" style={{ color: opt.color }} />\n <div>\n <p className=\"text-sm font-medium\">{opt.label}</p>\n <p className=\"text-[10px] text-muted-foreground\">{opt.description}</p>\n </div>\n </DropdownMenuItem>\n ))}\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n </div>\n\n {/* Report Dialog */}\n <Dialog open={reportDialogOpen} onOpenChange={setReportDialogOpen}>\n <DialogContent className=\"sm:max-w-[500px]\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n {reportConfig && (\n <reportConfig.icon className=\"h-5 w-5\" style={{ color: reportConfig.color }} />\n )}\n {reportConfig?.label || \"Report\"}\n {selectedReportCategory === \"stop-work\" && (\n <Badge className=\"bg-[#F59E0B] text-white text-[9px] border-0\">URGENT</Badge>\n )}\n </DialogTitle>\n <DialogDescription>\n {reportConfig?.description}. All reports are logged and tracked.\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4 py-2\">\n <div className=\"space-y-2\">\n <Label className=\"text-xs font-medium\">Severity</Label>\n <Select\n value={reportSeverity}\n onValueChange={(v) =>\n setReportSeverity(v as NonNullable<IncidentReport[\"severity\"]>)\n }\n >\n <SelectTrigger className=\"h-9\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {SEVERITY_OPTIONS.map((s) => (\n <SelectItem key={s.value} value={s.value}>\n <div className=\"flex items-center gap-2\">\n <div\n className=\"h-2 w-2 rounded-full\"\n style={{ backgroundColor: s.color }}\n />\n {s.label}\n </div>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-2\">\n <Label className=\"text-xs font-medium\">Location / Area</Label>\n <Input\n value={reportLocation}\n onChange={(e) => setReportLocation(e.target.value)}\n placeholder=\"e.g., Production Line 3, Warehouse B\"\n className=\"h-9\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label className=\"text-xs font-medium\">Description *</Label>\n <Textarea\n value={reportDescription}\n onChange={(e) => setReportDescription(e.target.value)}\n placeholder=\"Describe what happened or what you observed...\"\n rows={4}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label className=\"text-xs font-medium\">Immediate Action Taken</Label>\n <Textarea\n value={reportImmediateAction}\n onChange={(e) => setReportImmediateAction(e.target.value)}\n placeholder=\"Describe any immediate action taken to make the area safe...\"\n rows={2}\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setReportDialogOpen(false)}>\n Cancel\n </Button>\n <Button\n onClick={handleReportSubmit}\n disabled={submitting || !reportDescription.trim()}\n className=\"gap-2\"\n style={{\n backgroundColor: reportConfig?.color,\n color: \"white\",\n }}\n >\n <Send className=\"h-3.5 w-3.5\" />\n {submitting ? \"Submitting...\" : \"Submit Report\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n {/* Feedback Dialog */}\n <Dialog open={feedbackDialogOpen} onOpenChange={setFeedbackDialogOpen}>\n <DialogContent className=\"sm:max-w-[500px]\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n {selectedFeedbackCategory === \"problem\" ? (\n <Bug className=\"h-5 w-5 text-[#EF4444]\" />\n ) : (\n <Lightbulb className=\"h-5 w-5 text-[#8C34E9]\" />\n )}\n {selectedFeedbackCategory === \"problem\"\n ? \"Report a Problem\"\n : \"Submit a Suggestion\"}\n </DialogTitle>\n <DialogDescription>\n {selectedFeedbackCategory === \"problem\"\n ? \"Help us fix issues — describe what went wrong.\"\n : \"We'd love to hear your ideas for improving Oplytics.\"}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4 py-2\">\n <div className=\"space-y-2\">\n <Label className=\"text-xs font-medium\">Subject</Label>\n <Input\n value={feedbackSubject}\n onChange={(e) => setFeedbackSubject(e.target.value)}\n placeholder={\n selectedFeedbackCategory === \"problem\"\n ? \"Brief summary of the issue\"\n : \"Brief summary of your idea\"\n }\n className=\"h-9\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label className=\"text-xs font-medium\">Description *</Label>\n <Textarea\n value={feedbackDescription}\n onChange={(e) => setFeedbackDescription(e.target.value)}\n placeholder={\n selectedFeedbackCategory === \"problem\"\n ? \"What were you trying to do? What happened instead?\"\n : \"Describe your suggestion and how it would help...\"\n }\n rows={5}\n />\n </div>\n\n <div className=\"text-[10px] text-muted-foreground\">\n Module: {moduleName} — Feedback is reviewed by the Oplytics team\n </div>\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setFeedbackDialogOpen(false)}>\n Cancel\n </Button>\n <Button\n onClick={handleFeedbackSubmit}\n disabled={submitting || !feedbackDescription.trim()}\n className=\"gap-2\"\n style={{\n backgroundColor:\n selectedFeedbackCategory === \"problem\" ? \"#EF4444\" : \"#8C34E9\",\n color: \"white\",\n }}\n >\n <Send className=\"h-3.5 w-3.5\" />\n {submitting ? \"Submitting...\" : \"Submit\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n","/**\n * @oplytics/shared-ui/reporting\n *\n * Reporting and feedback toolbar types and configuration for all Oplytics subdomains.\n * Provides the standard Safety/Environmental/Stop Work incident reporting buttons\n * and Problem/Suggestion feedback buttons.\n *\n * The actual ReportingToolbar React component depends on shadcn/ui primitives\n * (Dialog, Button, Textarea, Select) which vary across subdomains until\n * consolidation. This module provides the types, configuration, and submission\n * logic that are shared.\n */\n\n// ─── Report Types ────────────────────────────────────────────────────────────\n\nexport type ReportCategory = \"safety\" | \"environmental\" | \"stop-work\";\nexport type FeedbackCategory = \"problem\" | \"suggestion\";\n\nexport interface IncidentReport {\n category: ReportCategory;\n description: string;\n location?: string;\n severity?: \"low\" | \"medium\" | \"high\" | \"critical\";\n /** Optional — what was done at the scene to make the area safe. */\n immediateAction?: string;\n moduleName: string;\n /** ISO timestamp */\n timestamp: string;\n /** User who submitted */\n submittedBy?: string;\n /** Hierarchy context at time of submission */\n hierarchyContext?: {\n enterpriseId?: number;\n businessUnitId?: number;\n siteId?: number;\n areaId?: number;\n assetId?: number;\n };\n}\n\nexport interface FeedbackReport {\n category: FeedbackCategory;\n /** Optional — short summary entered in the dialog before the description. */\n subject?: string;\n description: string;\n moduleName: string;\n /** ISO timestamp */\n timestamp: string;\n /** User who submitted */\n submittedBy?: string;\n /** Page/route where feedback was submitted */\n pageContext?: string;\n}\n\n// ─── Toolbar Configuration ───────────────────────────────────────────────────\n\nexport interface ReportingToolbarConfig {\n /** Service/module name (e.g., \"SQDCP\", \"OEE Manager\") */\n moduleName: string;\n /** Whether to show incident reporting buttons (default: true) */\n showIncidentReporting?: boolean;\n /** Whether to show feedback buttons (default: true) */\n showFeedback?: boolean;\n /** Custom report categories to show (default: all three) */\n reportCategories?: ReportCategory[];\n /** Custom feedback categories to show (default: both) */\n feedbackCategories?: FeedbackCategory[];\n /** Handler called when an incident report is submitted */\n onReportSubmit: (report: IncidentReport) => Promise<void> | void;\n /** Handler called when feedback is submitted */\n onFeedbackSubmit: (feedback: FeedbackReport) => Promise<void> | void;\n}\n\n// ─── Report Button Definitions ───────────────────────────────────────────────\n\nexport interface ReportButtonDef {\n category: ReportCategory;\n label: string;\n iconName: string;\n color: string;\n description: string;\n}\n\nexport interface FeedbackButtonDef {\n category: FeedbackCategory;\n label: string;\n iconName: string;\n color: string;\n description: string;\n}\n\n/** Standard incident report buttons — consistent across all subdomains */\nexport const REPORT_BUTTONS: ReportButtonDef[] = [\n {\n category: \"safety\",\n label: \"Safety\",\n iconName: \"ShieldAlert\",\n color: \"#ef4444\",\n description: \"Report a safety incident, near-miss, or hazard\",\n },\n {\n category: \"environmental\",\n label: \"Environmental\",\n iconName: \"Leaf\",\n color: \"#22c55e\",\n description: \"Report an environmental incident or concern\",\n },\n {\n category: \"stop-work\",\n label: \"Stop Work\",\n iconName: \"OctagonX\",\n color: \"#f59e0b\",\n description: \"Raise a stop work authority — immediate safety concern\",\n },\n];\n\n/** Standard feedback buttons — consistent across all subdomains */\nexport const FEEDBACK_BUTTONS: FeedbackButtonDef[] = [\n {\n category: \"problem\",\n label: \"Problem\",\n iconName: \"AlertTriangle\",\n color: \"#ef4444\",\n description: \"Report a problem with the platform\",\n },\n {\n category: \"suggestion\",\n label: \"Suggestion\",\n iconName: \"Lightbulb\",\n color: \"#8C34E9\",\n description: \"Suggest an improvement or new feature\",\n },\n];\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n/** Create a default ReportingToolbarConfig with sensible defaults */\nexport function createReportingConfig(\n moduleName: string,\n handlers: {\n onReportSubmit: (report: IncidentReport) => Promise<void> | void;\n onFeedbackSubmit: (feedback: FeedbackReport) => Promise<void> | void;\n },\n): ReportingToolbarConfig {\n return {\n moduleName,\n showIncidentReporting: true,\n showFeedback: true,\n reportCategories: [\"safety\", \"environmental\", \"stop-work\"],\n feedbackCategories: [\"problem\", \"suggestion\"],\n ...handlers,\n };\n}\n\n// ─── ReportingToolbar Component ─────────────────────────────────────────────\n\nexport {\n ReportingToolbar,\n type ReportingToolbarProps,\n} from \"./ReportingToolbar\";\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/reporting/ReportingToolbar.tsx","../../src/reporting/index.ts"],"sourcesContent":["/**\n * ReportingToolbar — standard Safety / Environmental / Stop Work incident\n * reporting and Problem / Suggestion feedback for all Oplytics subdomains.\n *\n * Visual model — a single grouped dropdown button in the top-right of the\n * header, so the header doesn't carry two separate buttons for what is, from\n * the user's perspective, one \"get help / raise something\" action:\n * ⚡ User Actions ▾ → Safety Incident | Environmental | Stop Work\n * ── (separator) ──\n * Report Problem | Suggestion\n *\n * Selecting an option opens a self-contained dialog with the right form for\n * that report/feedback type (severity / location / description / immediate\n * action for incidents; subject / description for feedback). On submit the\n * configured `onReportSubmit` / `onFeedbackSubmit` handler is called with\n * the canonical `IncidentReport` / `FeedbackReport` shape.\n *\n * Ported from the Policy Deployment subdomain — the canonical visual\n * reference. Originally two separate dropdown buttons (Report / Feedback);\n * merged into one \"User Actions\" menu to reduce header clutter.\n *\n * Oplytics dark theme: #0A0E1A bg, #8C34E9 accent.\n */\nimport { useState } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport {\n Button,\n Badge,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Input,\n Label,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../primitives\";\nimport {\n ShieldAlert,\n Leaf,\n OctagonX,\n Bug,\n Lightbulb,\n ChevronDown,\n Send,\n AlertTriangle,\n UserCog,\n} from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport type {\n ReportCategory,\n FeedbackCategory,\n IncidentReport,\n FeedbackReport,\n ReportingToolbarConfig,\n} from \"./index\";\n\n/* ── Report / feedback option catalogues ── */\n\ninterface ReportOption {\n category: ReportCategory;\n label: string;\n description: string;\n icon: React.ElementType;\n color: string;\n}\n\ninterface FeedbackOption {\n category: FeedbackCategory;\n label: string;\n description: string;\n icon: React.ElementType;\n color: string;\n}\n\nconst ALL_REPORT_OPTIONS: ReportOption[] = [\n {\n category: \"safety\",\n label: \"Safety Incident\",\n description: \"Report a safety hazard, near miss, or injury\",\n icon: ShieldAlert,\n color: \"#EF4444\",\n },\n {\n category: \"environmental\",\n label: \"Environmental\",\n description: \"Report an environmental concern or spill\",\n icon: Leaf,\n color: \"#22C55E\",\n },\n {\n category: \"stop-work\",\n label: \"Stop Work\",\n description: \"Raise a stop work authority — immediate halt\",\n icon: OctagonX,\n color: \"#F59E0B\",\n },\n];\n\nconst ALL_FEEDBACK_OPTIONS: FeedbackOption[] = [\n {\n category: \"problem\",\n label: \"Report Problem\",\n description: \"Something isn't working\",\n icon: Bug,\n color: \"#EF4444\",\n },\n {\n category: \"suggestion\",\n label: \"Suggestion\",\n description: \"Idea for improvement\",\n icon: Lightbulb,\n color: \"#8C34E9\",\n },\n];\n\nconst SEVERITY_OPTIONS: {\n value: NonNullable<IncidentReport[\"severity\"]>;\n label: string;\n color: string;\n}[] = [\n { value: \"critical\", label: \"Critical\", color: \"#EF4444\" },\n { value: \"high\", label: \"High\", color: \"#F59E0B\" },\n { value: \"medium\", label: \"Medium\", color: \"#3b82f6\" },\n { value: \"low\", label: \"Low\", color: \"#22C55E\" },\n];\n\n/* ── Props ── */\n\nexport interface ReportingToolbarProps extends Omit<\n ReportingToolbarConfig,\n \"moduleName\"\n> {\n /** Service/module name (e.g. \"Connect\", \"Policy Deployment\"). Defaults to \"Oplytics\". */\n moduleName?: string;\n /** Optional pre-fill for the report dialog's Location/Area field. */\n defaultLocation?: string;\n /**\n * Compact mode — currently a no-op (the new design always responsive-collapses\n * the labels at small breakpoints). Kept on the prop type so callers that\n * still pass it continue to type-check.\n * @deprecated The toolbar handles responsive collapse on its own.\n */\n compact?: boolean;\n /** CSS class for the container. */\n className?: string;\n}\n\n/* ── Component ── */\n\nexport function ReportingToolbar({\n moduleName = \"Oplytics\",\n showIncidentReporting = true,\n showFeedback = true,\n reportCategories = [\"safety\", \"environmental\", \"stop-work\"],\n feedbackCategories = [\"problem\", \"suggestion\"],\n onReportSubmit,\n onFeedbackSubmit,\n defaultLocation = \"\",\n className,\n}: ReportingToolbarProps) {\n const reportOptions = ALL_REPORT_OPTIONS.filter(opt =>\n reportCategories.includes(opt.category)\n );\n const feedbackOptions = ALL_FEEDBACK_OPTIONS.filter(opt =>\n feedbackCategories.includes(opt.category)\n );\n\n /* ── Report dialog state ── */\n const [reportDialogOpen, setReportDialogOpen] = useState(false);\n const [selectedReportCategory, setSelectedReportCategory] =\n useState<ReportCategory>(\"safety\");\n const [reportSeverity, setReportSeverity] =\n useState<NonNullable<IncidentReport[\"severity\"]>>(\"medium\");\n const [reportLocation, setReportLocation] = useState(defaultLocation);\n const [reportDescription, setReportDescription] = useState(\"\");\n const [reportImmediateAction, setReportImmediateAction] = useState(\"\");\n\n /* ── Feedback dialog state ── */\n const [feedbackDialogOpen, setFeedbackDialogOpen] = useState(false);\n const [selectedFeedbackCategory, setSelectedFeedbackCategory] =\n useState<FeedbackCategory>(\"problem\");\n const [feedbackSubject, setFeedbackSubject] = useState(\"\");\n const [feedbackDescription, setFeedbackDescription] = useState(\"\");\n\n const [submitting, setSubmitting] = useState(false);\n\n const openReportDialog = (category: ReportCategory) => {\n setSelectedReportCategory(category);\n setReportSeverity(category === \"stop-work\" ? \"critical\" : \"medium\");\n setReportLocation(defaultLocation);\n setReportDescription(\"\");\n setReportImmediateAction(\"\");\n setReportDialogOpen(true);\n };\n\n const openFeedbackDialog = (category: FeedbackCategory) => {\n setSelectedFeedbackCategory(category);\n setFeedbackSubject(\"\");\n setFeedbackDescription(\"\");\n setFeedbackDialogOpen(true);\n };\n\n const handleReportSubmit = async () => {\n if (!reportDescription.trim()) {\n toast.error(\"Please provide a description\");\n return;\n }\n setSubmitting(true);\n try {\n const report: IncidentReport = {\n category: selectedReportCategory,\n description: reportDescription,\n location: reportLocation || undefined,\n severity: reportSeverity,\n immediateAction: reportImmediateAction || undefined,\n moduleName,\n timestamp: new Date().toISOString(),\n };\n await onReportSubmit(report);\n toast.success(\"Report submitted successfully\", {\n description:\n selectedReportCategory === \"stop-work\"\n ? \"Stop Work authority raised — management has been notified\"\n : \"Your report has been logged and assigned for review\",\n });\n setReportDialogOpen(false);\n } catch (err) {\n console.error(\"[ReportingToolbar] report submit failed:\", err);\n toast.error(\"Failed to submit report. Please try again.\");\n } finally {\n setSubmitting(false);\n }\n };\n\n const handleFeedbackSubmit = async () => {\n if (!feedbackDescription.trim()) {\n toast.error(\"Please provide a description\");\n return;\n }\n setSubmitting(true);\n try {\n const feedback: FeedbackReport = {\n category: selectedFeedbackCategory,\n subject: feedbackSubject || undefined,\n description: feedbackDescription,\n moduleName,\n timestamp: new Date().toISOString(),\n pageContext:\n typeof window !== \"undefined\" ? window.location.pathname : undefined,\n };\n await onFeedbackSubmit(feedback);\n toast.success(\n selectedFeedbackCategory === \"problem\"\n ? \"Problem reported — Oplytics team will review\"\n : \"Suggestion submitted — thank you for your feedback\"\n );\n setFeedbackDialogOpen(false);\n } catch (err) {\n console.error(\"[ReportingToolbar] feedback submit failed:\", err);\n toast.error(\"Failed to submit feedback. Please try again.\");\n } finally {\n setSubmitting(false);\n }\n };\n\n const reportConfig = ALL_REPORT_OPTIONS.find(\n r => r.category === selectedReportCategory\n );\n\n return (\n <>\n {/* Toolbar button — Report + Feedback merged into one menu */}\n <div className={cn(\"flex items-center gap-2\", className)}>\n {(showIncidentReporting && reportOptions.length > 0) ||\n (showFeedback && feedbackOptions.length > 0) ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-9 gap-1.5 text-xs font-medium text-[#8890A0] hover:bg-[#1E2738] hover:text-[#E2E8F0] border border-[#1E2738]\"\n >\n <UserCog className=\"h-3.5 w-3.5\" />\n <span className=\"shell-hidden shell-sm:inline\">\n User Actions\n </span>\n <ChevronDown className=\"h-3 w-3\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-56\">\n {showIncidentReporting && reportOptions.length > 0 && (\n <>\n <DropdownMenuLabel className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">\n Report\n </DropdownMenuLabel>\n {reportOptions.map(opt => (\n <DropdownMenuItem\n key={opt.category}\n onClick={() => openReportDialog(opt.category)}\n className=\"gap-3 py-2.5\"\n >\n <opt.icon\n className=\"h-4 w-4\"\n style={{ color: opt.color }}\n />\n <div>\n <p className=\"text-sm font-medium\">{opt.label}</p>\n <p className=\"text-[10px] text-muted-foreground\">\n {opt.description}\n </p>\n </div>\n </DropdownMenuItem>\n ))}\n </>\n )}\n\n {showIncidentReporting &&\n reportOptions.length > 0 &&\n showFeedback &&\n feedbackOptions.length > 0 && <DropdownMenuSeparator />}\n\n {showFeedback && feedbackOptions.length > 0 && (\n <>\n <DropdownMenuLabel className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">\n Feedback\n </DropdownMenuLabel>\n {feedbackOptions.map(opt => (\n <DropdownMenuItem\n key={opt.category}\n onClick={() => openFeedbackDialog(opt.category)}\n className=\"gap-3 py-2.5\"\n >\n <opt.icon\n className=\"h-4 w-4\"\n style={{ color: opt.color }}\n />\n <div>\n <p className=\"text-sm font-medium\">{opt.label}</p>\n <p className=\"text-[10px] text-muted-foreground\">\n {opt.description}\n </p>\n </div>\n </DropdownMenuItem>\n ))}\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n </div>\n\n {/* Report Dialog */}\n <Dialog open={reportDialogOpen} onOpenChange={setReportDialogOpen}>\n <DialogContent className=\"sm:max-w-[500px]\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n {reportConfig && (\n <reportConfig.icon\n className=\"h-5 w-5\"\n style={{ color: reportConfig.color }}\n />\n )}\n {reportConfig?.label || \"Report\"}\n {selectedReportCategory === \"stop-work\" && (\n <Badge className=\"bg-[#F59E0B] text-white text-[9px] border-0\">\n URGENT\n </Badge>\n )}\n </DialogTitle>\n <DialogDescription>\n {reportConfig?.description}. All reports are logged and tracked.\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4 py-2\">\n <div className=\"space-y-2\">\n <Label className=\"text-xs font-medium\">Severity</Label>\n <Select\n value={reportSeverity}\n onValueChange={v =>\n setReportSeverity(\n v as NonNullable<IncidentReport[\"severity\"]>\n )\n }\n >\n <SelectTrigger className=\"h-9\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {SEVERITY_OPTIONS.map(s => (\n <SelectItem key={s.value} value={s.value}>\n <div className=\"flex items-center gap-2\">\n <div\n className=\"h-2 w-2 rounded-full\"\n style={{ backgroundColor: s.color }}\n />\n {s.label}\n </div>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-2\">\n <Label className=\"text-xs font-medium\">Location / Area</Label>\n <Input\n value={reportLocation}\n onChange={e => setReportLocation(e.target.value)}\n placeholder=\"e.g., Production Line 3, Warehouse B\"\n className=\"h-9\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label className=\"text-xs font-medium\">Description *</Label>\n <Textarea\n value={reportDescription}\n onChange={e => setReportDescription(e.target.value)}\n placeholder=\"Describe what happened or what you observed...\"\n rows={4}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label className=\"text-xs font-medium\">\n Immediate Action Taken\n </Label>\n <Textarea\n value={reportImmediateAction}\n onChange={e => setReportImmediateAction(e.target.value)}\n placeholder=\"Describe any immediate action taken to make the area safe...\"\n rows={2}\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button\n variant=\"outline\"\n onClick={() => setReportDialogOpen(false)}\n >\n Cancel\n </Button>\n <Button\n onClick={handleReportSubmit}\n disabled={submitting || !reportDescription.trim()}\n className=\"gap-2\"\n style={{\n backgroundColor: reportConfig?.color,\n color: \"white\",\n }}\n >\n <Send className=\"h-3.5 w-3.5\" />\n {submitting ? \"Submitting...\" : \"Submit Report\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n {/* Feedback Dialog */}\n <Dialog open={feedbackDialogOpen} onOpenChange={setFeedbackDialogOpen}>\n <DialogContent className=\"sm:max-w-[500px]\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n {selectedFeedbackCategory === \"problem\" ? (\n <Bug className=\"h-5 w-5 text-[#EF4444]\" />\n ) : (\n <Lightbulb className=\"h-5 w-5 text-[#8C34E9]\" />\n )}\n {selectedFeedbackCategory === \"problem\"\n ? \"Report a Problem\"\n : \"Submit a Suggestion\"}\n </DialogTitle>\n <DialogDescription>\n {selectedFeedbackCategory === \"problem\"\n ? \"Help us fix issues — describe what went wrong.\"\n : \"We'd love to hear your ideas for improving Oplytics.\"}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4 py-2\">\n <div className=\"space-y-2\">\n <Label className=\"text-xs font-medium\">Subject</Label>\n <Input\n value={feedbackSubject}\n onChange={e => setFeedbackSubject(e.target.value)}\n placeholder={\n selectedFeedbackCategory === \"problem\"\n ? \"Brief summary of the issue\"\n : \"Brief summary of your idea\"\n }\n className=\"h-9\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label className=\"text-xs font-medium\">Description *</Label>\n <Textarea\n value={feedbackDescription}\n onChange={e => setFeedbackDescription(e.target.value)}\n placeholder={\n selectedFeedbackCategory === \"problem\"\n ? \"What were you trying to do? What happened instead?\"\n : \"Describe your suggestion and how it would help...\"\n }\n rows={5}\n />\n </div>\n\n <div className=\"text-[10px] text-muted-foreground\">\n Module: {moduleName} — Feedback is reviewed by the Oplytics team\n </div>\n </div>\n\n <DialogFooter>\n <Button\n variant=\"outline\"\n onClick={() => setFeedbackDialogOpen(false)}\n >\n Cancel\n </Button>\n <Button\n onClick={handleFeedbackSubmit}\n disabled={submitting || !feedbackDescription.trim()}\n className=\"gap-2\"\n style={{\n backgroundColor:\n selectedFeedbackCategory === \"problem\"\n ? \"#EF4444\"\n : \"#8C34E9\",\n color: \"white\",\n }}\n >\n <Send className=\"h-3.5 w-3.5\" />\n {submitting ? \"Submitting...\" : \"Submit\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n","/**\n * @oplytics/shared-ui/reporting\n *\n * Reporting and feedback toolbar types and configuration for all Oplytics subdomains.\n * Provides the standard Safety/Environmental/Stop Work incident reporting buttons\n * and Problem/Suggestion feedback buttons.\n *\n * The actual ReportingToolbar React component depends on shadcn/ui primitives\n * (Dialog, Button, Textarea, Select) which vary across subdomains until\n * consolidation. This module provides the types, configuration, and submission\n * logic that are shared.\n */\n\n// ─── Report Types ────────────────────────────────────────────────────────────\n\nexport type ReportCategory = \"safety\" | \"environmental\" | \"stop-work\";\nexport type FeedbackCategory = \"problem\" | \"suggestion\";\n\nexport interface IncidentReport {\n category: ReportCategory;\n description: string;\n location?: string;\n severity?: \"low\" | \"medium\" | \"high\" | \"critical\";\n /** Optional — what was done at the scene to make the area safe. */\n immediateAction?: string;\n moduleName: string;\n /** ISO timestamp */\n timestamp: string;\n /** User who submitted */\n submittedBy?: string;\n /** Hierarchy context at time of submission */\n hierarchyContext?: {\n enterpriseId?: number;\n businessUnitId?: number;\n siteId?: number;\n areaId?: number;\n assetId?: number;\n };\n}\n\nexport interface FeedbackReport {\n category: FeedbackCategory;\n /** Optional — short summary entered in the dialog before the description. */\n subject?: string;\n description: string;\n moduleName: string;\n /** ISO timestamp */\n timestamp: string;\n /** User who submitted */\n submittedBy?: string;\n /** Page/route where feedback was submitted */\n pageContext?: string;\n}\n\n// ─── Toolbar Configuration ───────────────────────────────────────────────────\n\nexport interface ReportingToolbarConfig {\n /** Service/module name (e.g., \"SQDCP\", \"OEE Manager\") */\n moduleName: string;\n /** Whether to show incident reporting buttons (default: true) */\n showIncidentReporting?: boolean;\n /** Whether to show feedback buttons (default: true) */\n showFeedback?: boolean;\n /** Custom report categories to show (default: all three) */\n reportCategories?: ReportCategory[];\n /** Custom feedback categories to show (default: both) */\n feedbackCategories?: FeedbackCategory[];\n /** Handler called when an incident report is submitted */\n onReportSubmit: (report: IncidentReport) => Promise<void> | void;\n /** Handler called when feedback is submitted */\n onFeedbackSubmit: (feedback: FeedbackReport) => Promise<void> | void;\n}\n\n// ─── Report Button Definitions ───────────────────────────────────────────────\n\nexport interface ReportButtonDef {\n category: ReportCategory;\n label: string;\n iconName: string;\n color: string;\n description: string;\n}\n\nexport interface FeedbackButtonDef {\n category: FeedbackCategory;\n label: string;\n iconName: string;\n color: string;\n description: string;\n}\n\n/** Standard incident report buttons — consistent across all subdomains */\nexport const REPORT_BUTTONS: ReportButtonDef[] = [\n {\n category: \"safety\",\n label: \"Safety\",\n iconName: \"ShieldAlert\",\n color: \"#ef4444\",\n description: \"Report a safety incident, near-miss, or hazard\",\n },\n {\n category: \"environmental\",\n label: \"Environmental\",\n iconName: \"Leaf\",\n color: \"#22c55e\",\n description: \"Report an environmental incident or concern\",\n },\n {\n category: \"stop-work\",\n label: \"Stop Work\",\n iconName: \"OctagonX\",\n color: \"#f59e0b\",\n description: \"Raise a stop work authority — immediate safety concern\",\n },\n];\n\n/** Standard feedback buttons — consistent across all subdomains */\nexport const FEEDBACK_BUTTONS: FeedbackButtonDef[] = [\n {\n category: \"problem\",\n label: \"Problem\",\n iconName: \"AlertTriangle\",\n color: \"#ef4444\",\n description: \"Report a problem with the platform\",\n },\n {\n category: \"suggestion\",\n label: \"Suggestion\",\n iconName: \"Lightbulb\",\n color: \"#8C34E9\",\n description: \"Suggest an improvement or new feature\",\n },\n];\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n/** Create a default ReportingToolbarConfig with sensible defaults */\nexport function createReportingConfig(\n moduleName: string,\n handlers: {\n onReportSubmit: (report: IncidentReport) => Promise<void> | void;\n onFeedbackSubmit: (feedback: FeedbackReport) => Promise<void> | void;\n }\n): ReportingToolbarConfig {\n return {\n moduleName,\n showIncidentReporting: true,\n showFeedback: true,\n reportCategories: [\"safety\", \"environmental\", \"stop-work\"],\n feedbackCategories: [\"problem\", \"suggestion\"],\n ...handlers,\n };\n}\n\n// ─── ReportingToolbar Component ─────────────────────────────────────────────\n\nexport {\n ReportingToolbar,\n type ReportingToolbarProps,\n} from \"./ReportingToolbar\";\n"],"mappings":"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","names":[]}
@@ -11,14 +11,14 @@ import {
11
11
  inDevServices,
12
12
  liveServices,
13
13
  normalizeServiceSlug
14
- } from "../chunk-G7XJLTNY.js";
14
+ } from "../chunk-5RY3AJKI.js";
15
15
  import {
16
16
  DEFAULT_PLATFORM_DOMAIN,
17
17
  getPlatformDomain,
18
18
  platformUrl,
19
19
  portalUrl
20
20
  } from "../chunk-4QJMLQSH.js";
21
- import "../chunk-IEBZGU6X.js";
21
+ import "../chunk-DMUQ5WNO.js";
22
22
  import "../chunk-HLMIR5UV.js";
23
23
  export {
24
24
  ADMIN_SEE_ALL_ROLES,
@@ -1,7 +1,6 @@
1
- import { D as DashboardLayout, a as DashboardLayoutEnterprise, b as DashboardLayoutProps, c as DashboardLayoutUser } from '../HealthFooter-C5K9s38i.js';
2
- export { C as CrossServiceNav, d as CrossServiceNavProps, H as HealthFooter, e as HealthFooterEnterprise, f as HealthFooterProps, g as HealthFooterUser, M as MenuItem, h as MenuSection } from '../HealthFooter-C5K9s38i.js';
1
+ import { D as DashboardLayout, a as DashboardLayoutEnterprise, b as DashboardLayoutProps, c as DashboardLayoutUser } from '../HealthFooter-BoOozbWG.js';
2
+ export { C as CrossServiceNav, d as CrossServiceNavProps, H as HealthFooter, e as HealthFooterEnterprise, f as HealthFooterProps, g as HealthFooterUser, M as MenuItem, h as MenuSection } from '../HealthFooter-BoOozbWG.js';
3
3
  export { C as CrossServiceLink, b as buildCrossServiceLinks } from '../crossNav-Bz0RXU_F.js';
4
- import 'react/jsx-runtime';
5
4
  import 'react';
6
5
  import '../orgHierarchy-Buky69YP.js';
7
6
 
@@ -1,19 +1,19 @@
1
1
  import {
2
2
  buildCrossServiceLinks
3
- } from "../chunk-G7XJLTNY.js";
3
+ } from "../chunk-5RY3AJKI.js";
4
4
  import {
5
5
  CrossServiceNav,
6
6
  DashboardLayout,
7
7
  HealthFooter
8
- } from "../chunk-KXUNOSMZ.js";
8
+ } from "../chunk-TTDKZK6L.js";
9
9
  import "../chunk-4QJMLQSH.js";
10
- import "../chunk-WTR6SNOE.js";
11
- import "../chunk-IEBZGU6X.js";
12
- import "../chunk-3G43UG63.js";
10
+ import "../chunk-CPRJSW7F.js";
11
+ import "../chunk-DMUQ5WNO.js";
12
+ import "../chunk-A6UTXAPS.js";
13
13
  import "../chunk-HLMIR5UV.js";
14
- import "../chunk-PLCWXXUE.js";
14
+ import "../chunk-NXE653CX.js";
15
15
  import "../chunk-JT3XLKKD.js";
16
- import "../chunk-R4NOLCSI.js";
16
+ import "../chunk-BKGUIIN2.js";
17
17
 
18
18
  // src/shell/index.ts
19
19
  var OplyticsServiceShell = DashboardLayout;