@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.
- package/dist/timecampus/components/EmptyState.js +14 -0
- package/dist/timecampus/components/EmptyState.js.map +1 -0
- package/dist/timecampus/components/ErrorBoundary.js +2 -2
- package/dist/timecampus/components/ErrorBoundary.js.map +1 -1
- package/dist/timecampus/components/LoadingSkeleton.js +1 -1
- package/dist/timecampus/components/LoadingSkeleton.js.map +1 -1
- package/dist/timecampus/components/PageLayout.js +26 -14
- package/dist/timecampus/components/PageLayout.js.map +1 -1
- package/dist/timecampus/components/StatCard.js +19 -16
- package/dist/timecampus/components/StatCard.js.map +1 -1
- package/dist/timecampus/pages/HomePage.js +169 -149
- package/dist/timecampus/pages/HomePage.js.map +1 -1
- package/dist/timecampus/pages/applets/AppletStorePage.js +38 -35
- package/dist/timecampus/pages/applets/AppletStorePage.js.map +1 -1
- package/dist/timecampus/pages/applets/InstalledAppletsPage.js +42 -36
- package/dist/timecampus/pages/applets/InstalledAppletsPage.js.map +1 -1
- package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js +57 -53
- package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js.map +1 -1
- package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js +40 -36
- package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/channels/ChannelsPage.js +32 -29
- package/dist/timecampus/pages/channels/ChannelsPage.js.map +1 -1
- package/dist/timecampus/pages/client-portal/ClientPortalPage.js +52 -44
- package/dist/timecampus/pages/client-portal/ClientPortalPage.js.map +1 -1
- package/dist/timecampus/pages/dashboard/AnalyticsPage.js +65 -38
- package/dist/timecampus/pages/dashboard/AnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/dashboard/ReportsPage.js +47 -41
- package/dist/timecampus/pages/dashboard/ReportsPage.js.map +1 -1
- package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js +16 -14
- package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js +40 -36
- package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js +34 -28
- package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js +49 -41
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/focus-score/FocusScorePage.js +66 -62
- package/dist/timecampus/pages/focus-score/FocusScorePage.js.map +1 -1
- package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js +37 -33
- package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/geofencing/GeofencingPage.js +37 -30
- package/dist/timecampus/pages/geofencing/GeofencingPage.js.map +1 -1
- package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js +35 -31
- package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js +37 -34
- package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js.map +1 -1
- package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js +35 -31
- package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js.map +1 -1
- package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js +45 -41
- package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js +17 -15
- package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingCreatePage.js +36 -32
- package/dist/timecampus/pages/meetings/MeetingCreatePage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingDetailPage.js +120 -102
- package/dist/timecampus/pages/meetings/MeetingDetailPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingsPage.js +46 -36
- package/dist/timecampus/pages/meetings/MeetingsPage.js.map +1 -1
- package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js +19 -17
- package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/pomodoro/PomodoroPage.js +143 -112
- package/dist/timecampus/pages/pomodoro/PomodoroPage.js.map +1 -1
- package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js +55 -51
- package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/projects/ProjectCreatePage.js +32 -28
- package/dist/timecampus/pages/projects/ProjectCreatePage.js.map +1 -1
- package/dist/timecampus/pages/projects/ProjectDetailPage.js +107 -76
- package/dist/timecampus/pages/projects/ProjectDetailPage.js.map +1 -1
- package/dist/timecampus/pages/projects/ProjectsPage.js +21 -17
- package/dist/timecampus/pages/projects/ProjectsPage.js.map +1 -1
- package/dist/timecampus/pages/projects/TasksPage.js +44 -34
- package/dist/timecampus/pages/projects/TasksPage.js.map +1 -1
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js +59 -55
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamAnalyticsPage.js +24 -20
- package/dist/timecampus/pages/team/TeamAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamMembersPage.js +47 -41
- package/dist/timecampus/pages/team/TeamMembersPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamPage.js +89 -59
- package/dist/timecampus/pages/team/TeamPage.js.map +1 -1
- package/dist/timecampus/pages/team-activity/TeamActivityPage.js +47 -43
- package/dist/timecampus/pages/team-activity/TeamActivityPage.js.map +1 -1
- package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js +39 -35
- package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js.map +1 -1
- package/dist/timecampus/pages/templates/TemplateApplicationPage.js +24 -20
- package/dist/timecampus/pages/templates/TemplateApplicationPage.js.map +1 -1
- package/dist/timecampus/pages/templates/TemplateDetailPage.js +66 -48
- package/dist/timecampus/pages/templates/TemplateDetailPage.js.map +1 -1
- package/dist/timecampus/pages/templates/TemplatesPage.js +39 -36
- package/dist/timecampus/pages/templates/TemplatesPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimeEntriesPage.js +53 -44
- package/dist/timecampus/pages/time/TimeEntriesPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimeTrackingPage.js +72 -71
- package/dist/timecampus/pages/time/TimeTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimerPage.js +100 -66
- package/dist/timecampus/pages/time/TimerPage.js.map +1 -1
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.js +63 -59
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.js.map +1 -1
- package/dist/timecampus/pages/widgets/WidgetDetailPage.js +64 -46
- package/dist/timecampus/pages/widgets/WidgetDetailPage.js.map +1 -1
- package/dist/timecampus/pages/widgets/WidgetsPage.js +44 -37
- package/dist/timecampus/pages/widgets/WidgetsPage.js.map +1 -1
- package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js +18 -16
- package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js.map +1 -1
- package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js +40 -36
- package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/workflows/WorkflowsPage.js +47 -37
- package/dist/timecampus/pages/workflows/WorkflowsPage.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,38 +1,42 @@
|
|
|
1
1
|
import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
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
|
|
10
|
-
function
|
|
11
|
-
let { workspaceId:
|
|
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
|
-
|
|
14
|
+
v && (b(v.autoStartOnEntry ?? !0), S(v.autoStopOnExit ?? !0), w(v.notificationsOnEvents ?? !0));
|
|
14
15
|
}, [
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
]),
|
|
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(
|
|
22
|
-
}) :
|
|
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-
|
|
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(
|
|
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(
|
|
35
|
-
|
|
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:
|
|
50
|
-
onChange: (e) =>
|
|
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:
|
|
62
|
-
onChange: (e) =>
|
|
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:
|
|
74
|
-
onChange: (e) =>
|
|
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
|
|
85
|
-
key:
|
|
88
|
+
await g({ variables: { input: {
|
|
89
|
+
key: d,
|
|
86
90
|
value: {
|
|
87
|
-
autoStartOnEntry:
|
|
88
|
-
autoStopOnExit:
|
|
89
|
-
notificationsOnEvents:
|
|
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:
|
|
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:
|
|
101
|
+
children: _ ? "Saving..." : "Save Settings"
|
|
98
102
|
})
|
|
99
103
|
})]
|
|
100
104
|
})
|
|
101
105
|
});
|
|
102
106
|
}
|
|
103
107
|
//#endregion
|
|
104
|
-
export {
|
|
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-
|
|
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 {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
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
|
|
9
|
-
let { workspaceId:
|
|
10
|
-
return
|
|
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__ */
|
|
14
|
+
children: /* @__PURE__ */ s(t, {
|
|
14
15
|
variant: "card",
|
|
15
16
|
count: 6
|
|
16
17
|
})
|
|
17
|
-
}) :
|
|
18
|
+
}) : f ? /* @__PURE__ */ s(r, {
|
|
18
19
|
title: "Industry Solutions",
|
|
19
20
|
description: "Time tracking solutions tailored to your industry",
|
|
20
|
-
children: /* @__PURE__ */
|
|
21
|
-
className: "rounded-lg border border-
|
|
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__ */
|
|
25
|
+
}) : /* @__PURE__ */ s(r, {
|
|
25
26
|
title: "Industry Solutions",
|
|
26
27
|
description: "Time tracking solutions tailored to your industry",
|
|
27
|
-
|
|
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:
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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__ */
|
|
40
|
+
/* @__PURE__ */ c("div", {
|
|
38
41
|
className: "flex items-start gap-3",
|
|
39
|
-
children: [/* @__PURE__ */
|
|
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
|
|
42
|
-
}), /* @__PURE__ */
|
|
44
|
+
children: /* @__PURE__ */ s(o, { className: "h-6 w-6 text-primary" })
|
|
45
|
+
}), /* @__PURE__ */ c("div", {
|
|
43
46
|
className: "flex-1",
|
|
44
|
-
children: [/* @__PURE__ */
|
|
47
|
+
children: [/* @__PURE__ */ s("p", {
|
|
45
48
|
className: "text-sm font-semibold text-text-primary",
|
|
46
49
|
children: n
|
|
47
|
-
}), /* @__PURE__ */
|
|
50
|
+
}), /* @__PURE__ */ s("p", {
|
|
48
51
|
className: "text-xs text-text-secondary",
|
|
49
52
|
children: r
|
|
50
53
|
})]
|
|
51
54
|
})]
|
|
52
55
|
}),
|
|
53
|
-
/* @__PURE__ */
|
|
56
|
+
/* @__PURE__ */ s("p", {
|
|
54
57
|
className: "mt-3 text-xs text-text-secondary",
|
|
55
|
-
children:
|
|
58
|
+
children: i
|
|
56
59
|
}),
|
|
57
|
-
/* @__PURE__ */
|
|
60
|
+
/* @__PURE__ */ s("div", {
|
|
58
61
|
className: "mt-3 flex flex-wrap gap-1",
|
|
59
|
-
children: l.map((e) => /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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 {
|
|
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-
|
|
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 {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
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
|
|
10
|
-
function
|
|
11
|
-
let { workspaceId:
|
|
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
|
-
|
|
14
|
+
v && (b(v.trackingEnabled ?? !0), S(v.shareWithTeam ?? !1), w(v.preciseLocation ?? !1));
|
|
14
15
|
}, [
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
]),
|
|
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(
|
|
22
|
-
}) :
|
|
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-
|
|
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(
|
|
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(
|
|
35
|
-
|
|
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:
|
|
53
|
-
onChange: (e) =>
|
|
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:
|
|
68
|
-
onChange: (e) =>
|
|
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:
|
|
83
|
-
onChange: (e) =>
|
|
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
|
|
94
|
-
key:
|
|
97
|
+
await g({ variables: { input: {
|
|
98
|
+
key: d,
|
|
95
99
|
value: {
|
|
96
|
-
trackingEnabled:
|
|
97
|
-
shareWithTeam:
|
|
98
|
-
preciseLocation:
|
|
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:
|
|
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:
|
|
110
|
+
children: _ ? "Saving..." : "Save Settings"
|
|
107
111
|
})
|
|
108
112
|
})]
|
|
109
113
|
})
|
|
110
114
|
});
|
|
111
115
|
}
|
|
112
116
|
//#endregion
|
|
113
|
-
export {
|
|
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-
|
|
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"}
|