@burdenoff/microfe-timecampus 2026.624.1 → 2026.626.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.
Files changed (109) hide show
  1. package/dist/timecampus/components/EmptyState.js +14 -0
  2. package/dist/timecampus/components/EmptyState.js.map +1 -0
  3. package/dist/timecampus/components/ErrorBoundary.js +2 -2
  4. package/dist/timecampus/components/ErrorBoundary.js.map +1 -1
  5. package/dist/timecampus/components/LoadingSkeleton.js +1 -1
  6. package/dist/timecampus/components/LoadingSkeleton.js.map +1 -1
  7. package/dist/timecampus/components/PageLayout.js +26 -14
  8. package/dist/timecampus/components/PageLayout.js.map +1 -1
  9. package/dist/timecampus/components/StatCard.js +19 -16
  10. package/dist/timecampus/components/StatCard.js.map +1 -1
  11. package/dist/timecampus/pages/HomePage.js +169 -149
  12. package/dist/timecampus/pages/HomePage.js.map +1 -1
  13. package/dist/timecampus/pages/applets/AppletStorePage.js +38 -35
  14. package/dist/timecampus/pages/applets/AppletStorePage.js.map +1 -1
  15. package/dist/timecampus/pages/applets/InstalledAppletsPage.js +42 -36
  16. package/dist/timecampus/pages/applets/InstalledAppletsPage.js.map +1 -1
  17. package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js +57 -53
  18. package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js.map +1 -1
  19. package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js +40 -36
  20. package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js.map +1 -1
  21. package/dist/timecampus/pages/channels/ChannelsPage.js +32 -29
  22. package/dist/timecampus/pages/channels/ChannelsPage.js.map +1 -1
  23. package/dist/timecampus/pages/client-portal/ClientPortalPage.js +52 -44
  24. package/dist/timecampus/pages/client-portal/ClientPortalPage.js.map +1 -1
  25. package/dist/timecampus/pages/dashboard/AnalyticsPage.js +65 -38
  26. package/dist/timecampus/pages/dashboard/AnalyticsPage.js.map +1 -1
  27. package/dist/timecampus/pages/dashboard/ReportsPage.js +47 -41
  28. package/dist/timecampus/pages/dashboard/ReportsPage.js.map +1 -1
  29. package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js +16 -14
  30. package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js.map +1 -1
  31. package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js +40 -36
  32. package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js.map +1 -1
  33. package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js +34 -28
  34. package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js.map +1 -1
  35. package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js +49 -41
  36. package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js.map +1 -1
  37. package/dist/timecampus/pages/focus-score/FocusScorePage.js +66 -62
  38. package/dist/timecampus/pages/focus-score/FocusScorePage.js.map +1 -1
  39. package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js +37 -33
  40. package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js.map +1 -1
  41. package/dist/timecampus/pages/geofencing/GeofencingPage.js +37 -30
  42. package/dist/timecampus/pages/geofencing/GeofencingPage.js.map +1 -1
  43. package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js +35 -31
  44. package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js.map +1 -1
  45. package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js +37 -34
  46. package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js.map +1 -1
  47. package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js +35 -31
  48. package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js.map +1 -1
  49. package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js +45 -41
  50. package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js.map +1 -1
  51. package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js +17 -15
  52. package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js.map +1 -1
  53. package/dist/timecampus/pages/meetings/MeetingCreatePage.js +36 -32
  54. package/dist/timecampus/pages/meetings/MeetingCreatePage.js.map +1 -1
  55. package/dist/timecampus/pages/meetings/MeetingDetailPage.js +120 -102
  56. package/dist/timecampus/pages/meetings/MeetingDetailPage.js.map +1 -1
  57. package/dist/timecampus/pages/meetings/MeetingsPage.js +46 -36
  58. package/dist/timecampus/pages/meetings/MeetingsPage.js.map +1 -1
  59. package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js +19 -17
  60. package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js.map +1 -1
  61. package/dist/timecampus/pages/pomodoro/PomodoroPage.js +143 -112
  62. package/dist/timecampus/pages/pomodoro/PomodoroPage.js.map +1 -1
  63. package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js +55 -51
  64. package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js.map +1 -1
  65. package/dist/timecampus/pages/projects/ProjectCreatePage.js +32 -28
  66. package/dist/timecampus/pages/projects/ProjectCreatePage.js.map +1 -1
  67. package/dist/timecampus/pages/projects/ProjectDetailPage.js +107 -76
  68. package/dist/timecampus/pages/projects/ProjectDetailPage.js.map +1 -1
  69. package/dist/timecampus/pages/projects/ProjectsPage.js +21 -17
  70. package/dist/timecampus/pages/projects/ProjectsPage.js.map +1 -1
  71. package/dist/timecampus/pages/projects/TasksPage.js +44 -34
  72. package/dist/timecampus/pages/projects/TasksPage.js.map +1 -1
  73. package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js +59 -55
  74. package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js.map +1 -1
  75. package/dist/timecampus/pages/team/TeamAnalyticsPage.js +24 -20
  76. package/dist/timecampus/pages/team/TeamAnalyticsPage.js.map +1 -1
  77. package/dist/timecampus/pages/team/TeamMembersPage.js +47 -41
  78. package/dist/timecampus/pages/team/TeamMembersPage.js.map +1 -1
  79. package/dist/timecampus/pages/team/TeamPage.js +89 -59
  80. package/dist/timecampus/pages/team/TeamPage.js.map +1 -1
  81. package/dist/timecampus/pages/team-activity/TeamActivityPage.js +47 -43
  82. package/dist/timecampus/pages/team-activity/TeamActivityPage.js.map +1 -1
  83. package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js +39 -35
  84. package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js.map +1 -1
  85. package/dist/timecampus/pages/templates/TemplateApplicationPage.js +24 -20
  86. package/dist/timecampus/pages/templates/TemplateApplicationPage.js.map +1 -1
  87. package/dist/timecampus/pages/templates/TemplateDetailPage.js +66 -48
  88. package/dist/timecampus/pages/templates/TemplateDetailPage.js.map +1 -1
  89. package/dist/timecampus/pages/templates/TemplatesPage.js +39 -36
  90. package/dist/timecampus/pages/templates/TemplatesPage.js.map +1 -1
  91. package/dist/timecampus/pages/time/TimeEntriesPage.js +53 -44
  92. package/dist/timecampus/pages/time/TimeEntriesPage.js.map +1 -1
  93. package/dist/timecampus/pages/time/TimeTrackingPage.js +72 -71
  94. package/dist/timecampus/pages/time/TimeTrackingPage.js.map +1 -1
  95. package/dist/timecampus/pages/time/TimerPage.js +100 -66
  96. package/dist/timecampus/pages/time/TimerPage.js.map +1 -1
  97. package/dist/timecampus/pages/time-approval/TimeApprovalPage.js +63 -59
  98. package/dist/timecampus/pages/time-approval/TimeApprovalPage.js.map +1 -1
  99. package/dist/timecampus/pages/widgets/WidgetDetailPage.js +64 -46
  100. package/dist/timecampus/pages/widgets/WidgetDetailPage.js.map +1 -1
  101. package/dist/timecampus/pages/widgets/WidgetsPage.js +44 -37
  102. package/dist/timecampus/pages/widgets/WidgetsPage.js.map +1 -1
  103. package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js +18 -16
  104. package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js.map +1 -1
  105. package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js +40 -36
  106. package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js.map +1 -1
  107. package/dist/timecampus/pages/workflows/WorkflowsPage.js +47 -37
  108. package/dist/timecampus/pages/workflows/WorkflowsPage.js.map +1 -1
  109. package/package.json +2 -2
@@ -1,38 +1,42 @@
1
1
  import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
- import { PageLayout as t } from "../../components/PageLayout.js";
3
- import { LoadingSkeleton as n } from "../../components/LoadingSkeleton.js";
4
- import { useGetConfigurationByKeyQuery as r, useSetConfigurationMutation as i } from "../../../generated/wspace-operations.js";
2
+ import { LoadingSkeleton as t } from "../../components/LoadingSkeleton.js";
3
+ import { useGetConfigurationByKeyQuery as n, useSetConfigurationMutation as r } from "../../../generated/wspace-operations.js";
4
+ import { PageLayout as i } from "../../components/PageLayout.js";
5
5
  import { useEffect as a, useState as o } from "react";
6
6
  import { Settings as s } from "lucide-react";
7
7
  import { jsx as c, jsxs as l } from "react/jsx-runtime";
8
+ import { GlassCard as u } from "@burdenoff/fe-libs/ui";
8
9
  //#region src/timecampus/pages/geofencing/GeofencingSettingsPage.tsx
9
- var u = "geofencing.settings";
10
- function d() {
11
- let { workspaceId: d = "" } = e(), { data: f, loading: p, error: m } = r({ variables: { key: u } }), [h, { loading: g }] = i(), _ = f?.configurationByKey?.value ?? {}, [v, y] = o(!0), [b, x] = o(!0), [S, C] = o(!0);
10
+ var d = "geofencing.settings";
11
+ function f() {
12
+ let { workspaceId: f = "" } = e(), { data: p, loading: m, error: h } = n({ variables: { key: d } }), [g, { loading: _ }] = r(), v = p?.configurationByKey?.value ?? {}, [y, b] = o(!0), [x, S] = o(!0), [C, w] = o(!0);
12
13
  return a(() => {
13
- _ && (y(_.autoStartOnEntry ?? !0), x(_.autoStopOnExit ?? !0), C(_.notificationsOnEvents ?? !0));
14
+ v && (b(v.autoStartOnEntry ?? !0), S(v.autoStopOnExit ?? !0), w(v.notificationsOnEvents ?? !0));
14
15
  }, [
15
- _.autoStartOnEntry,
16
- _.autoStopOnExit,
17
- _.notificationsOnEvents
18
- ]), p ? /* @__PURE__ */ c(t, {
16
+ v.autoStartOnEntry,
17
+ v.autoStopOnExit,
18
+ v.notificationsOnEvents
19
+ ]), m ? /* @__PURE__ */ c(i, {
19
20
  title: "Geofencing Settings",
20
21
  description: "Configure geofencing preferences",
21
- children: /* @__PURE__ */ c(n, { variant: "detail" })
22
- }) : m ? /* @__PURE__ */ c(t, {
22
+ children: /* @__PURE__ */ c(t, { variant: "detail" })
23
+ }) : h ? /* @__PURE__ */ c(i, {
23
24
  title: "Geofencing Settings",
24
25
  description: "Configure geofencing preferences",
25
26
  children: /* @__PURE__ */ c("div", {
26
- className: "rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-600 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400",
27
+ className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
27
28
  children: "Failed to load geofencing settings. Please try again later."
28
29
  })
29
- }) : /* @__PURE__ */ c(t, {
30
+ }) : /* @__PURE__ */ c(i, {
30
31
  title: "Geofencing Settings",
31
32
  description: "Configure geofencing preferences",
33
+ purpose: "Make your timer follow you between locations — start it automatically when you arrive at a worksite and stop it when you leave — so on-site time is captured hands-free without manual punches.",
32
34
  children: /* @__PURE__ */ l("div", {
33
35
  className: "mx-auto max-w-2xl space-y-6",
34
- children: [/* @__PURE__ */ l("div", {
35
- className: "rounded-xl border border-border-subtle bg-bg-surface p-6",
36
+ children: [/* @__PURE__ */ l(u, {
37
+ treatment: "glass",
38
+ glow: !0,
39
+ className: "p-6",
36
40
  children: [/* @__PURE__ */ l("h3", {
37
41
  className: "mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary",
38
42
  children: [/* @__PURE__ */ c(s, { className: "h-4 w-4" }), "Trigger Settings"]
@@ -46,8 +50,8 @@ function d() {
46
50
  children: "Auto-start timer on entry"
47
51
  }), /* @__PURE__ */ c("input", {
48
52
  type: "checkbox",
49
- checked: v,
50
- onChange: (e) => y(e.target.checked),
53
+ checked: y,
54
+ onChange: (e) => b(e.target.checked),
51
55
  className: "h-4 w-4 rounded border-border-subtle"
52
56
  })]
53
57
  }),
@@ -58,8 +62,8 @@ function d() {
58
62
  children: "Auto-stop timer on exit"
59
63
  }), /* @__PURE__ */ c("input", {
60
64
  type: "checkbox",
61
- checked: b,
62
- onChange: (e) => x(e.target.checked),
65
+ checked: x,
66
+ onChange: (e) => S(e.target.checked),
63
67
  className: "h-4 w-4 rounded border-border-subtle"
64
68
  })]
65
69
  }),
@@ -70,8 +74,8 @@ function d() {
70
74
  children: "Notifications on events"
71
75
  }), /* @__PURE__ */ c("input", {
72
76
  type: "checkbox",
73
- checked: S,
74
- onChange: (e) => C(e.target.checked),
77
+ checked: C,
78
+ onChange: (e) => w(e.target.checked),
75
79
  className: "h-4 w-4 rounded border-border-subtle"
76
80
  })]
77
81
  })
@@ -81,26 +85,26 @@ function d() {
81
85
  className: "flex justify-end",
82
86
  children: /* @__PURE__ */ c("button", {
83
87
  onClick: async () => {
84
- await h({ variables: { input: {
85
- key: u,
88
+ await g({ variables: { input: {
89
+ key: d,
86
90
  value: {
87
- autoStartOnEntry: v,
88
- autoStopOnExit: b,
89
- notificationsOnEvents: S
91
+ autoStartOnEntry: y,
92
+ autoStopOnExit: x,
93
+ notificationsOnEvents: C
90
94
  },
91
95
  description: "Geofencing trigger settings",
92
96
  scope: "USER"
93
97
  } } });
94
98
  },
95
- disabled: g,
99
+ disabled: _,
96
100
  className: "rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 disabled:opacity-50",
97
- children: g ? "Saving..." : "Save Settings"
101
+ children: _ ? "Saving..." : "Save Settings"
98
102
  })
99
103
  })]
100
104
  })
101
105
  });
102
106
  }
103
107
  //#endregion
104
- export { d as GeofencingSettingsPage };
108
+ export { f as GeofencingSettingsPage };
105
109
 
106
110
  //# sourceMappingURL=GeofencingSettingsPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GeofencingSettingsPage.js","names":[],"sources":["../../../../src/timecampus/pages/geofencing/GeofencingSettingsPage.tsx"],"sourcesContent":["import { useState, useEffect } from \"react\";\nimport { Settings } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetConfigurationByKeyQuery,\n useSetConfigurationMutation,\n} from \"@/generated/wspace-operations\";\n\nconst CONFIG_KEY = \"geofencing.settings\";\n\nexport function GeofencingSettingsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useGetConfigurationByKeyQuery({\n variables: { key: CONFIG_KEY },\n });\n\n const [setConfiguration, { loading: saving }] = useSetConfigurationMutation();\n\n const configValue = (data?.configurationByKey?.value ?? {}) as Record<\n string,\n boolean\n >;\n\n const [autoStartOnEntry, setAutoStartOnEntry] = useState(true);\n const [autoStopOnExit, setAutoStopOnExit] = useState(true);\n const [notificationsOnEvents, setNotificationsOnEvents] = useState(true);\n\n useEffect(() => {\n if (configValue) {\n setAutoStartOnEntry(configValue.autoStartOnEntry ?? true);\n setAutoStopOnExit(configValue.autoStopOnExit ?? true);\n setNotificationsOnEvents(configValue.notificationsOnEvents ?? true);\n }\n }, [\n configValue.autoStartOnEntry,\n configValue.autoStopOnExit,\n configValue.notificationsOnEvents,\n ]);\n\n const handleSave = async () => {\n await setConfiguration({\n variables: {\n input: {\n key: CONFIG_KEY,\n value: { autoStartOnEntry, autoStopOnExit, notificationsOnEvents },\n description: \"Geofencing trigger settings\",\n scope: \"USER\" as never,\n },\n },\n });\n };\n\n if (loading) {\n return (\n <PageLayout\n title=\"Geofencing Settings\"\n description=\"Configure geofencing preferences\"\n >\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Geofencing Settings\"\n description=\"Configure geofencing preferences\"\n >\n <div className=\"rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-600 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400\">\n Failed to load geofencing settings. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Geofencing Settings\"\n description=\"Configure geofencing preferences\"\n >\n <div className=\"mx-auto max-w-2xl space-y-6\">\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-6\">\n <h3 className=\"mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary\">\n <Settings className=\"h-4 w-4\" />\n Trigger Settings\n </h3>\n <div className=\"space-y-3\">\n <label className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">\n Auto-start timer on entry\n </span>\n <input\n type=\"checkbox\"\n checked={autoStartOnEntry}\n onChange={(e) => setAutoStartOnEntry(e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </label>\n <label className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">\n Auto-stop timer on exit\n </span>\n <input\n type=\"checkbox\"\n checked={autoStopOnExit}\n onChange={(e) => setAutoStopOnExit(e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </label>\n <label className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">\n Notifications on events\n </span>\n <input\n type=\"checkbox\"\n checked={notificationsOnEvents}\n onChange={(e) => setNotificationsOnEvents(e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </label>\n </div>\n </div>\n <div className=\"flex justify-end\">\n <button\n onClick={handleSave}\n disabled={saving}\n className=\"rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 disabled:opacity-50\"\n >\n {saving ? \"Saving...\" : \"Save Settings\"}\n </button>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAUA,IAAM,IAAa;AAEnB,SAAgB,IAAyB;CACvC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAA8B,EAC7D,WAAW,EAAE,KAAK,GAAY,EAC/B,CAAC,EAEI,CAAC,GAAkB,EAAE,SAAS,OAAY,GAA6B,EAEvE,IAAe,GAAM,oBAAoB,SAAS,EAAE,EAKpD,CAAC,GAAkB,KAAuB,EAAS,GAAK,EACxD,CAAC,GAAgB,KAAqB,EAAS,GAAK,EACpD,CAAC,GAAuB,KAA4B,EAAS,GAAK;AAmDxE,QAjDA,QAAgB;AACd,EAAI,MACF,EAAoB,EAAY,oBAAoB,GAAK,EACzD,EAAkB,EAAY,kBAAkB,GAAK,EACrD,EAAyB,EAAY,yBAAyB,GAAK;IAEpE;EACD,EAAY;EACZ,EAAY;EACZ,EAAY;EACb,CAAC,EAeE,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD,EAAiB,SAAQ,UAAW,CAAA;EACzB,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAA+H;GAExI,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAAd,CACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAAA,mBAE7B;QACL,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,QAAD;QAAM,WAAU;kBAA4B;QAErC,CAAA,EACP,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAoB,EAAE,OAAO,QAAQ;QACtD,WAAU;QACV,CAAA,CACI;;MACR,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,QAAD;QAAM,WAAU;kBAA4B;QAErC,CAAA,EACP,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAkB,EAAE,OAAO,QAAQ;QACpD,WAAU;QACV,CAAA,CACI;;MACR,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,QAAD;QAAM,WAAU;kBAA4B;QAErC,CAAA,EACP,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAyB,EAAE,OAAO,QAAQ;QAC3D,WAAU;QACV,CAAA,CACI;;MACJ;OACF;OACN,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,UAAD;KACE,SAtFS,YAAY;AAC7B,YAAM,EAAiB,EACrB,WAAW,EACT,OAAO;OACL,KAAK;OACL,OAAO;QAAE;QAAkB;QAAgB;QAAuB;OAClE,aAAa;OACb,OAAO;OACR,EACF,EACF,CAAC;;KA6EM,UAAU;KACV,WAAU;eAET,IAAS,cAAc;KACjB,CAAA;IACL,CAAA,CACF;;EACK,CAAA"}
1
+ {"version":3,"file":"GeofencingSettingsPage.js","names":[],"sources":["../../../../src/timecampus/pages/geofencing/GeofencingSettingsPage.tsx"],"sourcesContent":["import { useState, useEffect } from \"react\";\nimport { Settings } from \"lucide-react\";\nimport { GlassCard } from \"@burdenoff/fe-libs/ui\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetConfigurationByKeyQuery,\n useSetConfigurationMutation,\n} from \"@/generated/wspace-operations\";\n\nconst CONFIG_KEY = \"geofencing.settings\";\n\nexport function GeofencingSettingsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useGetConfigurationByKeyQuery({\n variables: { key: CONFIG_KEY },\n });\n\n const [setConfiguration, { loading: saving }] = useSetConfigurationMutation();\n\n const configValue = (data?.configurationByKey?.value ?? {}) as Record<\n string,\n boolean\n >;\n\n const [autoStartOnEntry, setAutoStartOnEntry] = useState(true);\n const [autoStopOnExit, setAutoStopOnExit] = useState(true);\n const [notificationsOnEvents, setNotificationsOnEvents] = useState(true);\n\n useEffect(() => {\n if (configValue) {\n setAutoStartOnEntry(configValue.autoStartOnEntry ?? true);\n setAutoStopOnExit(configValue.autoStopOnExit ?? true);\n setNotificationsOnEvents(configValue.notificationsOnEvents ?? true);\n }\n }, [\n configValue.autoStartOnEntry,\n configValue.autoStopOnExit,\n configValue.notificationsOnEvents,\n ]);\n\n const handleSave = async () => {\n await setConfiguration({\n variables: {\n input: {\n key: CONFIG_KEY,\n value: { autoStartOnEntry, autoStopOnExit, notificationsOnEvents },\n description: \"Geofencing trigger settings\",\n scope: \"USER\" as never,\n },\n },\n });\n };\n\n if (loading) {\n return (\n <PageLayout\n title=\"Geofencing Settings\"\n description=\"Configure geofencing preferences\"\n >\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Geofencing Settings\"\n description=\"Configure geofencing preferences\"\n >\n <div className=\"rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text\">\n Failed to load geofencing settings. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Geofencing Settings\"\n description=\"Configure geofencing preferences\"\n purpose=\"Make your timer follow you between locations — start it automatically when you arrive at a worksite and stop it when you leave — so on-site time is captured hands-free without manual punches.\"\n >\n <div className=\"mx-auto max-w-2xl space-y-6\">\n <GlassCard treatment=\"glass\" glow className=\"p-6\">\n <h3 className=\"mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary\">\n <Settings className=\"h-4 w-4\" />\n Trigger Settings\n </h3>\n <div className=\"space-y-3\">\n <label className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">\n Auto-start timer on entry\n </span>\n <input\n type=\"checkbox\"\n checked={autoStartOnEntry}\n onChange={(e) => setAutoStartOnEntry(e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </label>\n <label className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">\n Auto-stop timer on exit\n </span>\n <input\n type=\"checkbox\"\n checked={autoStopOnExit}\n onChange={(e) => setAutoStopOnExit(e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </label>\n <label className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">\n Notifications on events\n </span>\n <input\n type=\"checkbox\"\n checked={notificationsOnEvents}\n onChange={(e) => setNotificationsOnEvents(e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </label>\n </div>\n </GlassCard>\n <div className=\"flex justify-end\">\n <button\n onClick={handleSave}\n disabled={saving}\n className=\"rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 disabled:opacity-50\"\n >\n {saving ? \"Saving...\" : \"Save Settings\"}\n </button>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AAWA,IAAM,IAAa;AAEnB,SAAgB,IAAyB;CACvC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAA8B,EAC7D,WAAW,EAAE,KAAK,GAAY,EAC/B,CAAC,EAEI,CAAC,GAAkB,EAAE,SAAS,OAAY,GAA6B,EAEvE,IAAe,GAAM,oBAAoB,SAAS,EAAE,EAKpD,CAAC,GAAkB,KAAuB,EAAS,GAAK,EACxD,CAAC,GAAgB,KAAqB,EAAS,GAAK,EACpD,CAAC,GAAuB,KAA4B,EAAS,GAAK;AAmDxE,QAjDA,QAAgB;AACd,EAAI,MACF,EAAoB,EAAY,oBAAoB,GAAK,EACzD,EAAkB,EAAY,kBAAkB,GAAK,EACrD,EAAyB,EAAY,yBAAyB,GAAK;IAEpE;EACD,EAAY;EACZ,EAAY;EACZ,EAAY;EACb,CAAC,EAeE,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD,EAAiB,SAAQ,UAAW,CAAA;EACzB,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SAAQ;YAER,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD;IAAW,WAAU;IAAQ,MAAA;IAAK,WAAU;cAA5C,CACE,kBAAC,MAAD;KAAI,WAAU;eAAd,CACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAAA,mBAE7B;QACL,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,QAAD;QAAM,WAAU;kBAA4B;QAErC,CAAA,EACP,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAoB,EAAE,OAAO,QAAQ;QACtD,WAAU;QACV,CAAA,CACI;;MACR,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,QAAD;QAAM,WAAU;kBAA4B;QAErC,CAAA,EACP,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAkB,EAAE,OAAO,QAAQ;QACpD,WAAU;QACV,CAAA,CACI;;MACR,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,QAAD;QAAM,WAAU;kBAA4B;QAErC,CAAA,EACP,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAyB,EAAE,OAAO,QAAQ;QAC3D,WAAU;QACV,CAAA,CACI;;MACJ;OACI;OACZ,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,UAAD;KACE,SAvFS,YAAY;AAC7B,YAAM,EAAiB,EACrB,WAAW,EACT,OAAO;OACL,KAAK;OACL,OAAO;QAAE;QAAkB;QAAgB;QAAuB;OAClE,aAAa;OACb,OAAO;OACR,EACF,EACF,CAAC;;KA8EM,UAAU;KACV,WAAU;eAET,IAAS,cAAc;KACjB,CAAA;IACL,CAAA,CACF;;EACK,CAAA"}
@@ -1,69 +1,72 @@
1
1
  import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
- import { PageLayout as t } from "../../components/PageLayout.js";
3
- import { LoadingSkeleton as n } from "../../components/LoadingSkeleton.js";
4
- import { useListConfigurationsQuery as r } from "../../../generated/wspace-operations.js";
5
- import { ArrowRight as i, Factory as a } from "lucide-react";
6
- import { jsx as o, jsxs as s } from "react/jsx-runtime";
2
+ import { LoadingSkeleton as t } from "../../components/LoadingSkeleton.js";
3
+ import { useListConfigurationsQuery as n } from "../../../generated/wspace-operations.js";
4
+ import { PageLayout as r } from "../../components/PageLayout.js";
5
+ import { EmptyState as i } from "../../components/EmptyState.js";
6
+ import { ArrowRight as a, Factory as o } from "lucide-react";
7
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
7
8
  //#region src/timecampus/pages/industry-solutions/IndustrySolutionsPage.tsx
8
- function c() {
9
- let { workspaceId: c = "" } = e(), { data: l, loading: u, error: d } = r({ variables: { scope: "WORKSPACE" } }), f = (l?.configurations ?? []).filter((e) => e.key.startsWith("industry."));
10
- return u ? /* @__PURE__ */ o(t, {
9
+ function l() {
10
+ let { workspaceId: l = "" } = e(), { data: u, loading: d, error: f } = n({ variables: { scope: "WORKSPACE" } }), p = (u?.configurations ?? []).filter((e) => e.key.startsWith("industry."));
11
+ return d ? /* @__PURE__ */ s(r, {
11
12
  title: "Industry Solutions",
12
13
  description: "Time tracking solutions tailored to your industry",
13
- children: /* @__PURE__ */ o(n, {
14
+ children: /* @__PURE__ */ s(t, {
14
15
  variant: "card",
15
16
  count: 6
16
17
  })
17
- }) : d ? /* @__PURE__ */ o(t, {
18
+ }) : f ? /* @__PURE__ */ s(r, {
18
19
  title: "Industry Solutions",
19
20
  description: "Time tracking solutions tailored to your industry",
20
- children: /* @__PURE__ */ o("div", {
21
- className: "rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400",
21
+ children: /* @__PURE__ */ s("div", {
22
+ className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
22
23
  children: "Failed to load industry solutions. Please try again later."
23
24
  })
24
- }) : /* @__PURE__ */ o(t, {
25
+ }) : /* @__PURE__ */ s(r, {
25
26
  title: "Industry Solutions",
26
27
  description: "Time tracking solutions tailored to your industry",
27
- children: /* @__PURE__ */ o("div", {
28
+ purpose: "Start from a setup built for how your industry actually works — agencies, field services, manufacturing and more — instead of configuring time tracking from scratch.",
29
+ children: p.length === 0 ? /* @__PURE__ */ s(i, {
30
+ illustration: "empty-generic",
31
+ title: "No industry solutions configured yet",
32
+ description: "Industry templates are stored as workspace configurations with the 'industry.' key prefix — once added, ready-made setups for your sector appear here."
33
+ }) : /* @__PURE__ */ s("div", {
28
34
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
29
- children: f.length === 0 ? /* @__PURE__ */ o("div", {
30
- className: "col-span-full p-8 text-center text-sm text-text-secondary",
31
- children: "No industry solutions configured yet. Solutions are stored as workspace configurations with the \"industry.\" key prefix."
32
- }) : f.map((e) => {
33
- let t = e.value, n = t.name ?? e.key.replace("industry.", ""), r = t.industry ?? "General", c = e.description ?? t.description ?? "", l = t.features ?? [];
34
- return /* @__PURE__ */ s("div", {
35
- className: "rounded-xl border border-border-subtle bg-bg-surface p-5 transition-colors hover:bg-bg-sunken/50 cursor-pointer",
35
+ children: p.map((e) => {
36
+ let t = e.value, n = t.name ?? e.key.replace("industry.", ""), r = t.industry ?? "General", i = e.description ?? t.description ?? "", l = t.features ?? [];
37
+ return /* @__PURE__ */ c("div", {
38
+ className: "rounded-xl border border-border-seam bg-gloss-card shadow-pop p-5 transition-colors hover:bg-bg-sunken/50 cursor-pointer",
36
39
  children: [
37
- /* @__PURE__ */ s("div", {
40
+ /* @__PURE__ */ c("div", {
38
41
  className: "flex items-start gap-3",
39
- children: [/* @__PURE__ */ o("div", {
42
+ children: [/* @__PURE__ */ s("div", {
40
43
  className: "flex h-12 w-12 items-center justify-center rounded-xl bg-action-primary-bg/10",
41
- children: /* @__PURE__ */ o(a, { className: "h-6 w-6 text-primary" })
42
- }), /* @__PURE__ */ s("div", {
44
+ children: /* @__PURE__ */ s(o, { className: "h-6 w-6 text-primary" })
45
+ }), /* @__PURE__ */ c("div", {
43
46
  className: "flex-1",
44
- children: [/* @__PURE__ */ o("p", {
47
+ children: [/* @__PURE__ */ s("p", {
45
48
  className: "text-sm font-semibold text-text-primary",
46
49
  children: n
47
- }), /* @__PURE__ */ o("p", {
50
+ }), /* @__PURE__ */ s("p", {
48
51
  className: "text-xs text-text-secondary",
49
52
  children: r
50
53
  })]
51
54
  })]
52
55
  }),
53
- /* @__PURE__ */ o("p", {
56
+ /* @__PURE__ */ s("p", {
54
57
  className: "mt-3 text-xs text-text-secondary",
55
- children: c
58
+ children: i
56
59
  }),
57
- /* @__PURE__ */ o("div", {
60
+ /* @__PURE__ */ s("div", {
58
61
  className: "mt-3 flex flex-wrap gap-1",
59
- children: l.map((e) => /* @__PURE__ */ o("span", {
62
+ children: l.map((e) => /* @__PURE__ */ s("span", {
60
63
  className: "inline-flex rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary",
61
64
  children: e
62
65
  }, e))
63
66
  }),
64
- /* @__PURE__ */ s("button", {
67
+ /* @__PURE__ */ c("button", {
65
68
  className: "mt-3 flex items-center gap-1 text-xs font-medium text-primary hover:underline",
66
- children: ["Learn more ", /* @__PURE__ */ o(i, { className: "h-3 w-3" })]
69
+ children: ["Learn more ", /* @__PURE__ */ s(a, { className: "h-3 w-3" })]
67
70
  })
68
71
  ]
69
72
  }, e.id);
@@ -72,6 +75,6 @@ function c() {
72
75
  });
73
76
  }
74
77
  //#endregion
75
- export { c as IndustrySolutionsPage };
78
+ export { l as IndustrySolutionsPage };
76
79
 
77
80
  //# sourceMappingURL=IndustrySolutionsPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"IndustrySolutionsPage.js","names":[],"sources":["../../../../src/timecampus/pages/industry-solutions/IndustrySolutionsPage.tsx"],"sourcesContent":["import { Factory, ArrowRight } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListConfigurationsQuery,\n type ConfigurationFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function IndustrySolutionsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useListConfigurationsQuery({\n variables: { scope: \"WORKSPACE\" as any },\n });\n\n const configurations = data?.configurations ?? [];\n\n // Filter configurations that represent industry solutions (key starts with 'industry.')\n const solutions = configurations.filter((c: ConfigurationFieldsFragment) =>\n c.key.startsWith(\"industry.\"),\n );\n\n if (loading) {\n return (\n <PageLayout\n title=\"Industry Solutions\"\n description=\"Time tracking solutions tailored to your industry\"\n >\n <LoadingSkeleton variant=\"card\" count={6} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Industry Solutions\"\n description=\"Time tracking solutions tailored to your industry\"\n >\n <div className=\"rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400\">\n Failed to load industry solutions. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Industry Solutions\"\n description=\"Time tracking solutions tailored to your industry\"\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {solutions.length === 0 ? (\n <div className=\"col-span-full p-8 text-center text-sm text-text-secondary\">\n No industry solutions configured yet. Solutions are stored as\n workspace configurations with the \"industry.\" key prefix.\n </div>\n ) : (\n solutions.map((solution: ConfigurationFieldsFragment) => {\n const val = solution.value as Record<string, unknown>;\n const name =\n (val.name as string) ?? solution.key.replace(\"industry.\", \"\");\n const industry = (val.industry as string) ?? \"General\";\n const description =\n solution.description ?? (val.description as string) ?? \"\";\n const features = (val.features as string[]) ?? [];\n\n return (\n <div\n key={solution.id}\n className=\"rounded-xl border border-border-subtle bg-bg-surface p-5 transition-colors hover:bg-bg-sunken/50 cursor-pointer\"\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-xl bg-action-primary-bg/10\">\n <Factory className=\"h-6 w-6 text-primary\" />\n </div>\n <div className=\"flex-1\">\n <p className=\"text-sm font-semibold text-text-primary\">\n {name}\n </p>\n <p className=\"text-xs text-text-secondary\">{industry}</p>\n </div>\n </div>\n <p className=\"mt-3 text-xs text-text-secondary\">\n {description}\n </p>\n <div className=\"mt-3 flex flex-wrap gap-1\">\n {features.map((feature) => (\n <span\n key={feature}\n className=\"inline-flex rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary\"\n >\n {feature}\n </span>\n ))}\n </div>\n <button className=\"mt-3 flex items-center gap-1 text-xs font-medium text-primary hover:underline\">\n Learn more <ArrowRight className=\"h-3 w-3\" />\n </button>\n </div>\n );\n })\n )}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;AASA,SAAgB,IAAwB;CACtC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAA2B,EAC1D,WAAW,EAAE,OAAO,aAAoB,EACzC,CAAC,EAKI,KAHiB,GAAM,kBAAkB,EAAE,EAGhB,QAAQ,MACvC,EAAE,IAAI,WAAW,YAAY,CAC9B;AA0BD,QAxBI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAA+H;GAExI,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAU,WAAW,IACpB,kBAAC,OAAD;IAAK,WAAU;cAA4D;IAGrE,CAAA,GAEN,EAAU,KAAK,MAA0C;IACvD,IAAM,IAAM,EAAS,OACf,IACH,EAAI,QAAmB,EAAS,IAAI,QAAQ,aAAa,GAAG,EACzD,IAAY,EAAI,YAAuB,WACvC,IACJ,EAAS,eAAgB,EAAI,eAA0B,IACnD,IAAY,EAAI,YAAyB,EAAE;AAEjD,WACE,kBAAC,OAAD;KAEE,WAAU;eAFZ;MAIE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD,EAAS,WAAU,wBAAyB,CAAA;QACxC,CAAA,EACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,KAAD;SAAG,WAAU;mBACV;SACC,CAAA,EACJ,kBAAC,KAAD;SAAG,WAAU;mBAA+B;SAAa,CAAA,CACrD;UACF;;MACN,kBAAC,KAAD;OAAG,WAAU;iBACV;OACC,CAAA;MACJ,kBAAC,OAAD;OAAK,WAAU;iBACZ,EAAS,KAAK,MACb,kBAAC,QAAD;QAEE,WAAU;kBAET;QACI,EAJA,EAIA,CACP;OACE,CAAA;MACN,kBAAC,UAAD;OAAQ,WAAU;iBAAlB,CAAkG,eACrF,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA,CACtC;;MACL;OA9BC,EAAS,GA8BV;KAER;GAEA,CAAA;EACK,CAAA"}
1
+ {"version":3,"file":"IndustrySolutionsPage.js","names":[],"sources":["../../../../src/timecampus/pages/industry-solutions/IndustrySolutionsPage.tsx"],"sourcesContent":["import { Factory, ArrowRight } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { EmptyState } from \"../../components/EmptyState\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListConfigurationsQuery,\n type ConfigurationFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function IndustrySolutionsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useListConfigurationsQuery({\n variables: { scope: \"WORKSPACE\" as any },\n });\n\n const configurations = data?.configurations ?? [];\n\n // Filter configurations that represent industry solutions (key starts with 'industry.')\n const solutions = configurations.filter((c: ConfigurationFieldsFragment) =>\n c.key.startsWith(\"industry.\"),\n );\n\n if (loading) {\n return (\n <PageLayout\n title=\"Industry Solutions\"\n description=\"Time tracking solutions tailored to your industry\"\n >\n <LoadingSkeleton variant=\"card\" count={6} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Industry Solutions\"\n description=\"Time tracking solutions tailored to your industry\"\n >\n <div className=\"rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text\">\n Failed to load industry solutions. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Industry Solutions\"\n description=\"Time tracking solutions tailored to your industry\"\n purpose=\"Start from a setup built for how your industry actually works — agencies, field services, manufacturing and more — instead of configuring time tracking from scratch.\"\n >\n {solutions.length === 0 ? (\n <EmptyState\n illustration=\"empty-generic\"\n title=\"No industry solutions configured yet\"\n description=\"Industry templates are stored as workspace configurations with the 'industry.' key prefix — once added, ready-made setups for your sector appear here.\"\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {solutions.map((solution: ConfigurationFieldsFragment) => {\n const val = solution.value as Record<string, unknown>;\n const name =\n (val.name as string) ?? solution.key.replace(\"industry.\", \"\");\n const industry = (val.industry as string) ?? \"General\";\n const description =\n solution.description ?? (val.description as string) ?? \"\";\n const features = (val.features as string[]) ?? [];\n\n return (\n <div\n key={solution.id}\n className=\"rounded-xl border border-border-seam bg-gloss-card shadow-pop p-5 transition-colors hover:bg-bg-sunken/50 cursor-pointer\"\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-xl bg-action-primary-bg/10\">\n <Factory className=\"h-6 w-6 text-primary\" />\n </div>\n <div className=\"flex-1\">\n <p className=\"text-sm font-semibold text-text-primary\">\n {name}\n </p>\n <p className=\"text-xs text-text-secondary\">{industry}</p>\n </div>\n </div>\n <p className=\"mt-3 text-xs text-text-secondary\">\n {description}\n </p>\n <div className=\"mt-3 flex flex-wrap gap-1\">\n {features.map((feature) => (\n <span\n key={feature}\n className=\"inline-flex rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary\"\n >\n {feature}\n </span>\n ))}\n </div>\n <button className=\"mt-3 flex items-center gap-1 text-xs font-medium text-primary hover:underline\">\n Learn more <ArrowRight className=\"h-3 w-3\" />\n </button>\n </div>\n );\n })}\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAUA,SAAgB,IAAwB;CACtC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAA2B,EAC1D,WAAW,EAAE,OAAO,aAAoB,EACzC,CAAC,EAKI,KAHiB,GAAM,kBAAkB,EAAE,EAGhB,QAAQ,MACvC,EAAE,IAAI,WAAW,YAAY,CAC9B;AA0BD,QAxBI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SAAQ;YAEP,EAAU,WAAW,IACpB,kBAAC,GAAD;GACE,cAAa;GACb,OAAM;GACN,aAAY;GACZ,CAAA,GAEF,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAU,KAAK,MAA0C;IACxD,IAAM,IAAM,EAAS,OACf,IACH,EAAI,QAAmB,EAAS,IAAI,QAAQ,aAAa,GAAG,EACzD,IAAY,EAAI,YAAuB,WACvC,IACJ,EAAS,eAAgB,EAAI,eAA0B,IACnD,IAAY,EAAI,YAAyB,EAAE;AAEjD,WACE,kBAAC,OAAD;KAEE,WAAU;eAFZ;MAIE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD,EAAS,WAAU,wBAAyB,CAAA;QACxC,CAAA,EACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,KAAD;SAAG,WAAU;mBACV;SACC,CAAA,EACJ,kBAAC,KAAD;SAAG,WAAU;mBAA+B;SAAa,CAAA,CACrD;UACF;;MACN,kBAAC,KAAD;OAAG,WAAU;iBACV;OACC,CAAA;MACJ,kBAAC,OAAD;OAAK,WAAU;iBACZ,EAAS,KAAK,MACb,kBAAC,QAAD;QAEE,WAAU;kBAET;QACI,EAJA,EAIA,CACP;OACE,CAAA;MACN,kBAAC,UAAD;OAAQ,WAAU;iBAAlB,CAAkG,eACrF,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA,CACtC;;MACL;OA9BC,EAAS,GA8BV;KAER;GACE,CAAA;EAEG,CAAA"}
@@ -1,38 +1,42 @@
1
1
  import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
- import { PageLayout as t } from "../../components/PageLayout.js";
3
- import { LoadingSkeleton as n } from "../../components/LoadingSkeleton.js";
4
- import { useGetConfigurationByKeyQuery as r, useSetConfigurationMutation as i } from "../../../generated/wspace-operations.js";
2
+ import { LoadingSkeleton as t } from "../../components/LoadingSkeleton.js";
3
+ import { useGetConfigurationByKeyQuery as n, useSetConfigurationMutation as r } from "../../../generated/wspace-operations.js";
4
+ import { PageLayout as i } from "../../components/PageLayout.js";
5
5
  import { useEffect as a, useState as o } from "react";
6
6
  import { Shield as s } from "lucide-react";
7
7
  import { jsx as c, jsxs as l } from "react/jsx-runtime";
8
+ import { GlassCard as u } from "@burdenoff/fe-libs/ui";
8
9
  //#region src/timecampus/pages/location-tracking/LocationPrivacySettingsPage.tsx
9
- var u = "location.privacy";
10
- function d() {
11
- let { workspaceId: d = "" } = e(), { data: f, loading: p, error: m } = r({ variables: { key: u } }), [h, { loading: g }] = i(), _ = f?.configurationByKey?.value ?? {}, [v, y] = o(!0), [b, x] = o(!1), [S, C] = o(!1);
10
+ var d = "location.privacy";
11
+ function f() {
12
+ let { workspaceId: f = "" } = e(), { data: p, loading: m, error: h } = n({ variables: { key: d } }), [g, { loading: _ }] = r(), v = p?.configurationByKey?.value ?? {}, [y, b] = o(!0), [x, S] = o(!1), [C, w] = o(!1);
12
13
  return a(() => {
13
- _ && (y(_.trackingEnabled ?? !0), x(_.shareWithTeam ?? !1), C(_.preciseLocation ?? !1));
14
+ v && (b(v.trackingEnabled ?? !0), S(v.shareWithTeam ?? !1), w(v.preciseLocation ?? !1));
14
15
  }, [
15
- _.trackingEnabled,
16
- _.shareWithTeam,
17
- _.preciseLocation
18
- ]), p ? /* @__PURE__ */ c(t, {
16
+ v.trackingEnabled,
17
+ v.shareWithTeam,
18
+ v.preciseLocation
19
+ ]), m ? /* @__PURE__ */ c(i, {
19
20
  title: "Location Privacy Settings",
20
21
  description: "Control location tracking and data sharing",
21
- children: /* @__PURE__ */ c(n, { variant: "detail" })
22
- }) : m ? /* @__PURE__ */ c(t, {
22
+ children: /* @__PURE__ */ c(t, { variant: "detail" })
23
+ }) : h ? /* @__PURE__ */ c(i, {
23
24
  title: "Location Privacy Settings",
24
25
  description: "Control location tracking and data sharing",
25
26
  children: /* @__PURE__ */ c("div", {
26
- className: "rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-600 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400",
27
+ className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
27
28
  children: "Failed to load privacy settings. Please try again later."
28
29
  })
29
- }) : /* @__PURE__ */ c(t, {
30
+ }) : /* @__PURE__ */ c(i, {
30
31
  title: "Location Privacy Settings",
31
32
  description: "Control location tracking and data sharing",
33
+ purpose: "You're in charge of your location data here — turn tracking on or off, decide whether teammates can see where you are, and choose precise versus approximate positioning before any location is ever recorded.",
32
34
  children: /* @__PURE__ */ l("div", {
33
35
  className: "mx-auto max-w-2xl space-y-6",
34
- children: [/* @__PURE__ */ l("div", {
35
- className: "rounded-xl border border-border-subtle bg-bg-surface p-6",
36
+ children: [/* @__PURE__ */ l(u, {
37
+ treatment: "glass",
38
+ glow: !0,
39
+ className: "p-6",
36
40
  children: [/* @__PURE__ */ l("h3", {
37
41
  className: "mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary",
38
42
  children: [/* @__PURE__ */ c(s, { className: "h-4 w-4" }), "Privacy Controls"]
@@ -49,8 +53,8 @@ function d() {
49
53
  children: "Allow the app to track your work location"
50
54
  })] }), /* @__PURE__ */ c("input", {
51
55
  type: "checkbox",
52
- checked: v,
53
- onChange: (e) => y(e.target.checked),
56
+ checked: y,
57
+ onChange: (e) => b(e.target.checked),
54
58
  className: "h-4 w-4 rounded border-border-subtle"
55
59
  })]
56
60
  }),
@@ -64,8 +68,8 @@ function d() {
64
68
  children: "Let team members see your current location"
65
69
  })] }), /* @__PURE__ */ c("input", {
66
70
  type: "checkbox",
67
- checked: b,
68
- onChange: (e) => x(e.target.checked),
71
+ checked: x,
72
+ onChange: (e) => S(e.target.checked),
69
73
  className: "h-4 w-4 rounded border-border-subtle"
70
74
  })]
71
75
  }),
@@ -79,8 +83,8 @@ function d() {
79
83
  children: "Use precise GPS vs approximate location"
80
84
  })] }), /* @__PURE__ */ c("input", {
81
85
  type: "checkbox",
82
- checked: S,
83
- onChange: (e) => C(e.target.checked),
86
+ checked: C,
87
+ onChange: (e) => w(e.target.checked),
84
88
  className: "h-4 w-4 rounded border-border-subtle"
85
89
  })]
86
90
  })
@@ -90,26 +94,26 @@ function d() {
90
94
  className: "flex justify-end",
91
95
  children: /* @__PURE__ */ c("button", {
92
96
  onClick: async () => {
93
- await h({ variables: { input: {
94
- key: u,
97
+ await g({ variables: { input: {
98
+ key: d,
95
99
  value: {
96
- trackingEnabled: v,
97
- shareWithTeam: b,
98
- preciseLocation: S
100
+ trackingEnabled: y,
101
+ shareWithTeam: x,
102
+ preciseLocation: C
99
103
  },
100
104
  description: "Location privacy settings",
101
105
  scope: "USER"
102
106
  } } });
103
107
  },
104
- disabled: g,
108
+ disabled: _,
105
109
  className: "rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 disabled:opacity-50",
106
- children: g ? "Saving..." : "Save Settings"
110
+ children: _ ? "Saving..." : "Save Settings"
107
111
  })
108
112
  })]
109
113
  })
110
114
  });
111
115
  }
112
116
  //#endregion
113
- export { d as LocationPrivacySettingsPage };
117
+ export { f as LocationPrivacySettingsPage };
114
118
 
115
119
  //# sourceMappingURL=LocationPrivacySettingsPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LocationPrivacySettingsPage.js","names":[],"sources":["../../../../src/timecampus/pages/location-tracking/LocationPrivacySettingsPage.tsx"],"sourcesContent":["import { useState, useEffect } from \"react\";\nimport { Shield } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetConfigurationByKeyQuery,\n useSetConfigurationMutation,\n} from \"@/generated/wspace-operations\";\n\nconst CONFIG_KEY = \"location.privacy\";\n\nexport function LocationPrivacySettingsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useGetConfigurationByKeyQuery({\n variables: { key: CONFIG_KEY },\n });\n\n const [setConfiguration, { loading: saving }] = useSetConfigurationMutation();\n\n const configValue = (data?.configurationByKey?.value ?? {}) as Record<\n string,\n boolean\n >;\n\n const [trackingEnabled, setTrackingEnabled] = useState(true);\n const [shareWithTeam, setShareWithTeam] = useState(false);\n const [preciseLocation, setPreciseLocation] = useState(false);\n\n useEffect(() => {\n if (configValue) {\n setTrackingEnabled(configValue.trackingEnabled ?? true);\n setShareWithTeam(configValue.shareWithTeam ?? false);\n setPreciseLocation(configValue.preciseLocation ?? false);\n }\n }, [\n configValue.trackingEnabled,\n configValue.shareWithTeam,\n configValue.preciseLocation,\n ]);\n\n const handleSave = async () => {\n await setConfiguration({\n variables: {\n input: {\n key: CONFIG_KEY,\n value: { trackingEnabled, shareWithTeam, preciseLocation },\n description: \"Location privacy settings\",\n scope: \"USER\" as never,\n },\n },\n });\n };\n\n if (loading) {\n return (\n <PageLayout\n title=\"Location Privacy Settings\"\n description=\"Control location tracking and data sharing\"\n >\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Location Privacy Settings\"\n description=\"Control location tracking and data sharing\"\n >\n <div className=\"rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-600 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400\">\n Failed to load privacy settings. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Location Privacy Settings\"\n description=\"Control location tracking and data sharing\"\n >\n <div className=\"mx-auto max-w-2xl space-y-6\">\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-6\">\n <h3 className=\"mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary\">\n <Shield className=\"h-4 w-4\" />\n Privacy Controls\n </h3>\n <div className=\"space-y-3\">\n <label className=\"flex items-center justify-between\">\n <div>\n <span className=\"text-sm font-medium text-text-primary\">\n Enable location tracking\n </span>\n <p className=\"text-xs text-text-secondary\">\n Allow the app to track your work location\n </p>\n </div>\n <input\n type=\"checkbox\"\n checked={trackingEnabled}\n onChange={(e) => setTrackingEnabled(e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </label>\n <label className=\"flex items-center justify-between\">\n <div>\n <span className=\"text-sm font-medium text-text-primary\">\n Share with team\n </span>\n <p className=\"text-xs text-text-secondary\">\n Let team members see your current location\n </p>\n </div>\n <input\n type=\"checkbox\"\n checked={shareWithTeam}\n onChange={(e) => setShareWithTeam(e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </label>\n <label className=\"flex items-center justify-between\">\n <div>\n <span className=\"text-sm font-medium text-text-primary\">\n Precise location\n </span>\n <p className=\"text-xs text-text-secondary\">\n Use precise GPS vs approximate location\n </p>\n </div>\n <input\n type=\"checkbox\"\n checked={preciseLocation}\n onChange={(e) => setPreciseLocation(e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </label>\n </div>\n </div>\n <div className=\"flex justify-end\">\n <button\n onClick={handleSave}\n disabled={saving}\n className=\"rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 disabled:opacity-50\"\n >\n {saving ? \"Saving...\" : \"Save Settings\"}\n </button>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAUA,IAAM,IAAa;AAEnB,SAAgB,IAA8B;CAC5C,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAA8B,EAC7D,WAAW,EAAE,KAAK,GAAY,EAC/B,CAAC,EAEI,CAAC,GAAkB,EAAE,SAAS,OAAY,GAA6B,EAEvE,IAAe,GAAM,oBAAoB,SAAS,EAAE,EAKpD,CAAC,GAAiB,KAAsB,EAAS,GAAK,EACtD,CAAC,GAAe,KAAoB,EAAS,GAAM,EACnD,CAAC,GAAiB,KAAsB,EAAS,GAAM;AAmD7D,QAjDA,QAAgB;AACd,EAAI,MACF,EAAmB,EAAY,mBAAmB,GAAK,EACvD,EAAiB,EAAY,iBAAiB,GAAM,EACpD,EAAmB,EAAY,mBAAmB,GAAM;IAEzD;EACD,EAAY;EACZ,EAAY;EACZ,EAAY;EACb,CAAC,EAeE,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD,EAAiB,SAAQ,UAAW,CAAA;EACzB,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAA+H;GAExI,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAAd,CACE,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA,EAAA,mBAE3B;QACL,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAwC;QAEjD,CAAA,EACP,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAEvC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAmB,EAAE,OAAO,QAAQ;QACrD,WAAU;QACV,CAAA,CACI;;MACR,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAwC;QAEjD,CAAA,EACP,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAEvC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAiB,EAAE,OAAO,QAAQ;QACnD,WAAU;QACV,CAAA,CACI;;MACR,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAwC;QAEjD,CAAA,EACP,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAEvC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAmB,EAAE,OAAO,QAAQ;QACrD,WAAU;QACV,CAAA,CACI;;MACJ;OACF;OACN,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,UAAD;KACE,SArGS,YAAY;AAC7B,YAAM,EAAiB,EACrB,WAAW,EACT,OAAO;OACL,KAAK;OACL,OAAO;QAAE;QAAiB;QAAe;QAAiB;OAC1D,aAAa;OACb,OAAO;OACR,EACF,EACF,CAAC;;KA4FM,UAAU;KACV,WAAU;eAET,IAAS,cAAc;KACjB,CAAA;IACL,CAAA,CACF;;EACK,CAAA"}
1
+ {"version":3,"file":"LocationPrivacySettingsPage.js","names":[],"sources":["../../../../src/timecampus/pages/location-tracking/LocationPrivacySettingsPage.tsx"],"sourcesContent":["import { useState, useEffect } from \"react\";\nimport { Shield } from \"lucide-react\";\nimport { GlassCard } from \"@burdenoff/fe-libs/ui\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetConfigurationByKeyQuery,\n useSetConfigurationMutation,\n} from \"@/generated/wspace-operations\";\n\nconst CONFIG_KEY = \"location.privacy\";\n\nexport function LocationPrivacySettingsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useGetConfigurationByKeyQuery({\n variables: { key: CONFIG_KEY },\n });\n\n const [setConfiguration, { loading: saving }] = useSetConfigurationMutation();\n\n const configValue = (data?.configurationByKey?.value ?? {}) as Record<\n string,\n boolean\n >;\n\n const [trackingEnabled, setTrackingEnabled] = useState(true);\n const [shareWithTeam, setShareWithTeam] = useState(false);\n const [preciseLocation, setPreciseLocation] = useState(false);\n\n useEffect(() => {\n if (configValue) {\n setTrackingEnabled(configValue.trackingEnabled ?? true);\n setShareWithTeam(configValue.shareWithTeam ?? false);\n setPreciseLocation(configValue.preciseLocation ?? false);\n }\n }, [\n configValue.trackingEnabled,\n configValue.shareWithTeam,\n configValue.preciseLocation,\n ]);\n\n const handleSave = async () => {\n await setConfiguration({\n variables: {\n input: {\n key: CONFIG_KEY,\n value: { trackingEnabled, shareWithTeam, preciseLocation },\n description: \"Location privacy settings\",\n scope: \"USER\" as never,\n },\n },\n });\n };\n\n if (loading) {\n return (\n <PageLayout\n title=\"Location Privacy Settings\"\n description=\"Control location tracking and data sharing\"\n >\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Location Privacy Settings\"\n description=\"Control location tracking and data sharing\"\n >\n <div className=\"rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text\">\n Failed to load privacy settings. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Location Privacy Settings\"\n description=\"Control location tracking and data sharing\"\n purpose=\"You're in charge of your location data here — turn tracking on or off, decide whether teammates can see where you are, and choose precise versus approximate positioning before any location is ever recorded.\"\n >\n <div className=\"mx-auto max-w-2xl space-y-6\">\n <GlassCard treatment=\"glass\" glow className=\"p-6\">\n <h3 className=\"mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary\">\n <Shield className=\"h-4 w-4\" />\n Privacy Controls\n </h3>\n <div className=\"space-y-3\">\n <label className=\"flex items-center justify-between\">\n <div>\n <span className=\"text-sm font-medium text-text-primary\">\n Enable location tracking\n </span>\n <p className=\"text-xs text-text-secondary\">\n Allow the app to track your work location\n </p>\n </div>\n <input\n type=\"checkbox\"\n checked={trackingEnabled}\n onChange={(e) => setTrackingEnabled(e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </label>\n <label className=\"flex items-center justify-between\">\n <div>\n <span className=\"text-sm font-medium text-text-primary\">\n Share with team\n </span>\n <p className=\"text-xs text-text-secondary\">\n Let team members see your current location\n </p>\n </div>\n <input\n type=\"checkbox\"\n checked={shareWithTeam}\n onChange={(e) => setShareWithTeam(e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </label>\n <label className=\"flex items-center justify-between\">\n <div>\n <span className=\"text-sm font-medium text-text-primary\">\n Precise location\n </span>\n <p className=\"text-xs text-text-secondary\">\n Use precise GPS vs approximate location\n </p>\n </div>\n <input\n type=\"checkbox\"\n checked={preciseLocation}\n onChange={(e) => setPreciseLocation(e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </label>\n </div>\n </GlassCard>\n <div className=\"flex justify-end\">\n <button\n onClick={handleSave}\n disabled={saving}\n className=\"rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 disabled:opacity-50\"\n >\n {saving ? \"Saving...\" : \"Save Settings\"}\n </button>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AAWA,IAAM,IAAa;AAEnB,SAAgB,IAA8B;CAC5C,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAA8B,EAC7D,WAAW,EAAE,KAAK,GAAY,EAC/B,CAAC,EAEI,CAAC,GAAkB,EAAE,SAAS,OAAY,GAA6B,EAEvE,IAAe,GAAM,oBAAoB,SAAS,EAAE,EAKpD,CAAC,GAAiB,KAAsB,EAAS,GAAK,EACtD,CAAC,GAAe,KAAoB,EAAS,GAAM,EACnD,CAAC,GAAiB,KAAsB,EAAS,GAAM;AAmD7D,QAjDA,QAAgB;AACd,EAAI,MACF,EAAmB,EAAY,mBAAmB,GAAK,EACvD,EAAiB,EAAY,iBAAiB,GAAM,EACpD,EAAmB,EAAY,mBAAmB,GAAM;IAEzD;EACD,EAAY;EACZ,EAAY;EACZ,EAAY;EACb,CAAC,EAeE,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD,EAAiB,SAAQ,UAAW,CAAA;EACzB,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SAAQ;YAER,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD;IAAW,WAAU;IAAQ,MAAA;IAAK,WAAU;cAA5C,CACE,kBAAC,MAAD;KAAI,WAAU;eAAd,CACE,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA,EAAA,mBAE3B;QACL,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAwC;QAEjD,CAAA,EACP,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAEvC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAmB,EAAE,OAAO,QAAQ;QACrD,WAAU;QACV,CAAA,CACI;;MACR,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAwC;QAEjD,CAAA,EACP,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAEvC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAiB,EAAE,OAAO,QAAQ;QACnD,WAAU;QACV,CAAA,CACI;;MACR,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAwC;QAEjD,CAAA,EACP,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAEvC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAmB,EAAE,OAAO,QAAQ;QACrD,WAAU;QACV,CAAA,CACI;;MACJ;OACI;OACZ,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,UAAD;KACE,SAtGS,YAAY;AAC7B,YAAM,EAAiB,EACrB,WAAW,EACT,OAAO;OACL,KAAK;OACL,OAAO;QAAE;QAAiB;QAAe;QAAiB;OAC1D,aAAa;OACb,OAAO;OACR,EACF,EACF,CAAC;;KA6FM,UAAU;KACV,WAAU;eAET,IAAS,cAAc;KACjB,CAAA;IACL,CAAA,CACF;;EACK,CAAA"}