@burdenoff/microfe-timecampus 2026.703.6 → 2026.707.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 (66) hide show
  1. package/dist/generated/wspace-operations.js +1023 -1514
  2. package/dist/generated/wspace-operations.js.map +1 -1
  3. package/dist/generated/wspace-types.js +12 -18
  4. package/dist/generated/wspace-types.js.map +1 -1
  5. package/dist/index.js +4 -4
  6. package/dist/timecampus/TimeCampusRoot.js +130 -198
  7. package/dist/timecampus/TimeCampusRoot.js.map +1 -1
  8. package/dist/timecampus/TimeCampusRoutes.js +96 -164
  9. package/dist/timecampus/TimeCampusRoutes.js.map +1 -1
  10. package/dist/timecampus/components/index.js +2 -2
  11. package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js +7 -7
  12. package/dist/timecampus/pages/client-portal/ClientPortalPage.js +6 -6
  13. package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js +8 -8
  14. package/dist/timecampus/pages/geofencing/GeofencingPage.js +6 -6
  15. package/dist/timecampus/pages/lifetime/FiniteLifePage.js +91 -91
  16. package/dist/timecampus/pages/lifetime/FiniteLifePage.js.map +1 -1
  17. package/dist/timecampus/pages/lifetime/LifeBalancePage.js +18 -18
  18. package/dist/timecampus/pages/lifetime/LifeTimelinePage.js +7 -7
  19. package/dist/timecampus/pages/lifetime/ValuesGoalsPage.js +1 -1
  20. package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js +6 -6
  21. package/dist/timecampus/pages/projects/ProjectDetailPage.js +7 -7
  22. package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js +212 -212
  23. package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js.map +1 -1
  24. package/dist/timecampus/pages/team/TeamMembersPage.js +4 -4
  25. package/dist/timecampus/pages/time/TimeTrackingPage.js +143 -143
  26. package/dist/timecampus/pages/time/TimeTrackingPage.js.map +1 -1
  27. package/dist/timecampus/pages/time-approval/TimeApprovalPage.js +1 -1
  28. package/dist/timecampus/pages/timeline/TimelinePage.js +1 -1
  29. package/dist/timecampus/pages/timeline/TimelinePage.js.map +1 -1
  30. package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js +87 -93
  31. package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js.map +1 -1
  32. package/package.json +1 -1
  33. package/dist/timecampus/pages/applets/AppletStorePage.js +0 -167
  34. package/dist/timecampus/pages/applets/AppletStorePage.js.map +0 -1
  35. package/dist/timecampus/pages/applets/InstalledAppletsPage.js +0 -162
  36. package/dist/timecampus/pages/applets/InstalledAppletsPage.js.map +0 -1
  37. package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js +0 -133
  38. package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js.map +0 -1
  39. package/dist/timecampus/pages/channels/ChannelsPage.js +0 -418
  40. package/dist/timecampus/pages/channels/ChannelsPage.js.map +0 -1
  41. package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js +0 -142
  42. package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js.map +0 -1
  43. package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js +0 -119
  44. package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js.map +0 -1
  45. package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js +0 -110
  46. package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js.map +0 -1
  47. package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js +0 -83
  48. package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js.map +0 -1
  49. package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js +0 -198
  50. package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js.map +0 -1
  51. package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js +0 -124
  52. package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js.map +0 -1
  53. package/dist/timecampus/pages/templates/TemplateApplicationPage.js +0 -88
  54. package/dist/timecampus/pages/templates/TemplateApplicationPage.js.map +0 -1
  55. package/dist/timecampus/pages/templates/TemplateDetailPage.js +0 -135
  56. package/dist/timecampus/pages/templates/TemplateDetailPage.js.map +0 -1
  57. package/dist/timecampus/pages/templates/TemplatesPage.js +0 -191
  58. package/dist/timecampus/pages/templates/TemplatesPage.js.map +0 -1
  59. package/dist/timecampus/pages/widgets/WidgetDetailPage.js +0 -196
  60. package/dist/timecampus/pages/widgets/WidgetDetailPage.js.map +0 -1
  61. package/dist/timecampus/pages/widgets/WidgetsPage.js +0 -297
  62. package/dist/timecampus/pages/widgets/WidgetsPage.js.map +0 -1
  63. package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js +0 -133
  64. package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js.map +0 -1
  65. package/dist/timecampus/pages/workflows/WorkflowsPage.js +0 -311
  66. package/dist/timecampus/pages/workflows/WorkflowsPage.js.map +0 -1
@@ -1,142 +0,0 @@
1
- import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
- import { LoadingSkeleton as t } from "../../components/LoadingSkeleton.js";
3
- import { useListConfigurationsQuery as n, useSetConfigurationMutation as r } from "../../../generated/wspace-operations.js";
4
- import { PageLayout as i } from "../../components/PageLayout.js";
5
- import { useCallback as a, useEffect as o, useState as s } from "react";
6
- import { Settings as c } from "lucide-react";
7
- import { jsx as l, jsxs as u } from "react/jsx-runtime";
8
- import { GlassCard as d } from "@burdenoff/fe-libs/ui";
9
- //#region src/timecampus/pages/email-tracking/EmailSettingsPage.tsx
10
- var f = "timecampus.email.settings", p = {
11
- autoTrack: !0,
12
- categorizeByProject: !0,
13
- responseTimeAlerts: !1
14
- };
15
- function m() {
16
- let { workspaceId: m = "" } = e(), { data: h, loading: g, error: _ } = n({
17
- variables: {
18
- scope: "WORKSPACE",
19
- limit: 100
20
- },
21
- skip: !m
22
- }), [v, { loading: y }] = r(), [b, x] = s(p);
23
- o(() => {
24
- if (h?.configurations) {
25
- let e = h.configurations.find((e) => e.key === f);
26
- if (e?.value) {
27
- let t = e.value;
28
- x({
29
- autoTrack: t.autoTrack ?? p.autoTrack,
30
- categorizeByProject: t.categorizeByProject ?? p.categorizeByProject,
31
- responseTimeAlerts: t.responseTimeAlerts ?? p.responseTimeAlerts
32
- });
33
- }
34
- }
35
- }, [h]);
36
- let S = a(async () => {
37
- await v({ variables: { input: {
38
- key: f,
39
- value: b,
40
- description: "Email tracking settings",
41
- scope: "WORKSPACE"
42
- } } });
43
- }, [v, b]);
44
- return g ? /* @__PURE__ */ l(i, {
45
- title: "Email Settings",
46
- description: "Configure email tracking preferences",
47
- children: /* @__PURE__ */ l(t, { variant: "detail" })
48
- }) : _ ? /* @__PURE__ */ l(i, {
49
- title: "Email Settings",
50
- description: "Configure email tracking preferences",
51
- children: /* @__PURE__ */ l("div", {
52
- className: "rounded-xl border border-status-error-border/50 bg-status-error-bg/10 p-4 text-sm text-status-error-text",
53
- children: "Failed to load settings. Please try again later."
54
- })
55
- }) : /* @__PURE__ */ l(i, {
56
- title: "Email Settings",
57
- description: "Configure email tracking preferences",
58
- purpose: "Control how email time is captured and attributed — auto-track reading and replies, tie messages to the right project, and get nudged about slow responses — so email effort shows up in your reports.",
59
- children: /* @__PURE__ */ u("div", {
60
- className: "mx-auto max-w-2xl space-y-6",
61
- children: [/* @__PURE__ */ u(d, {
62
- treatment: "glass",
63
- glow: !0,
64
- className: "p-6",
65
- children: [/* @__PURE__ */ u("h3", {
66
- className: "mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary",
67
- children: [/* @__PURE__ */ l(c, { className: "h-4 w-4" }), "Tracking Configuration"]
68
- }), /* @__PURE__ */ u("div", {
69
- className: "space-y-3",
70
- children: [
71
- /* @__PURE__ */ u("label", {
72
- className: "flex items-center justify-between",
73
- children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("span", {
74
- className: "text-sm font-medium text-text-primary",
75
- children: "Auto-track emails"
76
- }), /* @__PURE__ */ l("p", {
77
- className: "text-xs text-text-secondary",
78
- children: "Automatically track time spent reading and responding"
79
- })] }), /* @__PURE__ */ l("input", {
80
- type: "checkbox",
81
- checked: b.autoTrack,
82
- onChange: (e) => x((t) => ({
83
- ...t,
84
- autoTrack: e.target.checked
85
- })),
86
- className: "h-4 w-4 rounded border-border-subtle"
87
- })]
88
- }),
89
- /* @__PURE__ */ u("label", {
90
- className: "flex items-center justify-between",
91
- children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("span", {
92
- className: "text-sm font-medium text-text-primary",
93
- children: "Categorize by project"
94
- }), /* @__PURE__ */ l("p", {
95
- className: "text-xs text-text-secondary",
96
- children: "Link emails to projects automatically"
97
- })] }), /* @__PURE__ */ l("input", {
98
- type: "checkbox",
99
- checked: b.categorizeByProject,
100
- onChange: (e) => x((t) => ({
101
- ...t,
102
- categorizeByProject: e.target.checked
103
- })),
104
- className: "h-4 w-4 rounded border-border-subtle"
105
- })]
106
- }),
107
- /* @__PURE__ */ u("label", {
108
- className: "flex items-center justify-between",
109
- children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("span", {
110
- className: "text-sm font-medium text-text-primary",
111
- children: "Response time alerts"
112
- }), /* @__PURE__ */ l("p", {
113
- className: "text-xs text-text-secondary",
114
- children: "Notify when response time exceeds threshold"
115
- })] }), /* @__PURE__ */ l("input", {
116
- type: "checkbox",
117
- checked: b.responseTimeAlerts,
118
- onChange: (e) => x((t) => ({
119
- ...t,
120
- responseTimeAlerts: e.target.checked
121
- })),
122
- className: "h-4 w-4 rounded border-border-subtle"
123
- })]
124
- })
125
- ]
126
- })]
127
- }), /* @__PURE__ */ l("div", {
128
- className: "flex justify-end",
129
- children: /* @__PURE__ */ l("button", {
130
- onClick: S,
131
- disabled: y,
132
- 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",
133
- children: y ? "Saving..." : "Save Settings"
134
- })
135
- })]
136
- })
137
- });
138
- }
139
- //#endregion
140
- export { m as EmailSettingsPage };
141
-
142
- //# sourceMappingURL=EmailSettingsPage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EmailSettingsPage.js","names":[],"sources":["../../../../src/timecampus/pages/email-tracking/EmailSettingsPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } 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 useListConfigurationsQuery,\n useSetConfigurationMutation,\n type ConfigurationFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nconst EMAIL_SETTINGS_KEY = \"timecampus.email.settings\";\n\ninterface EmailSettings {\n autoTrack: boolean;\n categorizeByProject: boolean;\n responseTimeAlerts: boolean;\n}\n\nconst DEFAULT_SETTINGS: EmailSettings = {\n autoTrack: true,\n categorizeByProject: true,\n responseTimeAlerts: false,\n};\n\nexport function EmailSettingsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n const { data, loading, error } = useListConfigurationsQuery({\n variables: { scope: \"WORKSPACE\" as never, limit: 100 },\n skip: !workspaceId,\n });\n\n const [setConfiguration, { loading: saving }] = useSetConfigurationMutation();\n const [settings, setSettings] = useState<EmailSettings>(DEFAULT_SETTINGS);\n\n useEffect(() => {\n if (data?.configurations) {\n const emailConfig = data.configurations.find(\n (c: ConfigurationFieldsFragment) => c.key === EMAIL_SETTINGS_KEY,\n );\n if (emailConfig?.value) {\n const val = emailConfig.value as Partial<EmailSettings>;\n setSettings({\n autoTrack: val.autoTrack ?? DEFAULT_SETTINGS.autoTrack,\n categorizeByProject:\n val.categorizeByProject ?? DEFAULT_SETTINGS.categorizeByProject,\n responseTimeAlerts:\n val.responseTimeAlerts ?? DEFAULT_SETTINGS.responseTimeAlerts,\n });\n }\n }\n }, [data]);\n\n const handleSave = useCallback(async () => {\n await setConfiguration({\n variables: {\n input: {\n key: EMAIL_SETTINGS_KEY,\n value: settings as unknown as Record<string, unknown>,\n description: \"Email tracking settings\",\n scope: \"WORKSPACE\" as never,\n },\n },\n });\n }, [setConfiguration, settings]);\n\n if (loading) {\n return (\n <PageLayout\n title=\"Email Settings\"\n description=\"Configure email tracking preferences\"\n >\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Email Settings\"\n description=\"Configure email tracking preferences\"\n >\n <div className=\"rounded-xl border border-status-error-border/50 bg-status-error-bg/10 p-4 text-sm text-status-error-text\">\n Failed to load settings. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Email Settings\"\n description=\"Configure email tracking preferences\"\n purpose=\"Control how email time is captured and attributed — auto-track reading and replies, tie messages to the right project, and get nudged about slow responses — so email effort shows up in your reports.\"\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 Tracking Configuration\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 Auto-track emails\n </span>\n <p className=\"text-xs text-text-secondary\">\n Automatically track time spent reading and responding\n </p>\n </div>\n <input\n type=\"checkbox\"\n checked={settings.autoTrack}\n onChange={(e) =>\n setSettings((s) => ({ ...s, autoTrack: e.target.checked }))\n }\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 Categorize by project\n </span>\n <p className=\"text-xs text-text-secondary\">\n Link emails to projects automatically\n </p>\n </div>\n <input\n type=\"checkbox\"\n checked={settings.categorizeByProject}\n onChange={(e) =>\n setSettings((s) => ({\n ...s,\n categorizeByProject: e.target.checked,\n }))\n }\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 Response time alerts\n </span>\n <p className=\"text-xs text-text-secondary\">\n Notify when response time exceeds threshold\n </p>\n </div>\n <input\n type=\"checkbox\"\n checked={settings.responseTimeAlerts}\n onChange={(e) =>\n setSettings((s) => ({\n ...s,\n responseTimeAlerts: e.target.checked,\n }))\n }\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":"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"}
@@ -1,119 +0,0 @@
1
- import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
- import { LoadingSkeleton as t } from "../../components/LoadingSkeleton.js";
3
- import { useListConfigurationsQuery as n, useSetConfigurationMutation as r } from "../../../generated/wspace-operations.js";
4
- import { PageLayout as i } from "../../components/PageLayout.js";
5
- import { useCallback as a, useEffect as o, useState as s } from "react";
6
- import { Settings as c } from "lucide-react";
7
- import { jsx as l, jsxs as u } from "react/jsx-runtime";
8
- import { GlassCard as d } from "@burdenoff/fe-libs/ui";
9
- //#region src/timecampus/pages/focus-score/FocusScoreSettingsPage.tsx
10
- var f = "timecampus.focus.settings", p = {
11
- dailyFocusTarget: 4,
12
- minSessionLength: 25
13
- };
14
- function m() {
15
- let { workspaceId: m = "" } = e(), { data: h, loading: g, error: _ } = n({
16
- variables: {
17
- scope: "WORKSPACE",
18
- limit: 100
19
- },
20
- skip: !m
21
- }), [v, { loading: y }] = r(), [b, x] = s(p);
22
- o(() => {
23
- if (h?.configurations) {
24
- let e = h.configurations.find((e) => e.key === f);
25
- if (e?.value) {
26
- let t = e.value;
27
- x({
28
- dailyFocusTarget: t.dailyFocusTarget ?? p.dailyFocusTarget,
29
- minSessionLength: t.minSessionLength ?? p.minSessionLength
30
- });
31
- }
32
- }
33
- }, [h]);
34
- let S = a(async () => {
35
- await v({ variables: { input: {
36
- key: f,
37
- value: b,
38
- description: "Focus score settings",
39
- scope: "WORKSPACE"
40
- } } });
41
- }, [v, b]);
42
- return g ? /* @__PURE__ */ l(i, {
43
- title: "Focus Score Settings",
44
- description: "Configure focus tracking preferences",
45
- children: /* @__PURE__ */ l(t, { variant: "detail" })
46
- }) : _ ? /* @__PURE__ */ l(i, {
47
- title: "Focus Score Settings",
48
- description: "Configure focus tracking preferences",
49
- children: /* @__PURE__ */ l("div", {
50
- className: "rounded-xl border border-status-error-border/50 bg-status-error-bg/10 p-4 text-sm text-status-error-text",
51
- children: "Failed to load settings. Please try again later."
52
- })
53
- }) : /* @__PURE__ */ l(i, {
54
- title: "Focus Score Settings",
55
- description: "Configure focus tracking preferences",
56
- purpose: "Set what 'a good focus day' means for you — a daily deep-work target and the minimum length that counts as a real focus session — so your focus score reflects your own goals, not generic defaults.",
57
- children: /* @__PURE__ */ u("div", {
58
- className: "mx-auto max-w-2xl space-y-6",
59
- children: [/* @__PURE__ */ u(d, {
60
- treatment: "glass",
61
- glow: !0,
62
- className: "p-6",
63
- children: [/* @__PURE__ */ u("h3", {
64
- className: "mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary",
65
- children: [/* @__PURE__ */ l(c, { className: "h-4 w-4" }), "Focus Goals"]
66
- }), /* @__PURE__ */ u("div", {
67
- className: "space-y-4",
68
- children: [/* @__PURE__ */ u("div", {
69
- className: "flex items-center justify-between",
70
- children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("p", {
71
- className: "text-sm font-medium text-text-primary",
72
- children: "Daily focus target"
73
- }), /* @__PURE__ */ l("p", {
74
- className: "text-xs text-text-secondary",
75
- children: "Hours of deep focus per day"
76
- })] }), /* @__PURE__ */ l("input", {
77
- type: "number",
78
- value: b.dailyFocusTarget,
79
- onChange: (e) => x((t) => ({
80
- ...t,
81
- dailyFocusTarget: Number(e.target.value)
82
- })),
83
- className: "w-20 rounded-md border border-border-subtle bg-bg-surface px-3 py-1.5 text-sm text-text-primary text-right"
84
- })]
85
- }), /* @__PURE__ */ u("div", {
86
- className: "flex items-center justify-between",
87
- children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("p", {
88
- className: "text-sm font-medium text-text-primary",
89
- children: "Min. session length"
90
- }), /* @__PURE__ */ l("p", {
91
- className: "text-xs text-text-secondary",
92
- children: "Minimum minutes for a focus session"
93
- })] }), /* @__PURE__ */ l("input", {
94
- type: "number",
95
- value: b.minSessionLength,
96
- onChange: (e) => x((t) => ({
97
- ...t,
98
- minSessionLength: Number(e.target.value)
99
- })),
100
- className: "w-20 rounded-md border border-border-subtle bg-bg-surface px-3 py-1.5 text-sm text-text-primary text-right"
101
- })]
102
- })]
103
- })]
104
- }), /* @__PURE__ */ l("div", {
105
- className: "flex justify-end",
106
- children: /* @__PURE__ */ l("button", {
107
- onClick: S,
108
- disabled: y,
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",
110
- children: y ? "Saving..." : "Save Settings"
111
- })
112
- })]
113
- })
114
- });
115
- }
116
- //#endregion
117
- export { m as FocusScoreSettingsPage };
118
-
119
- //# sourceMappingURL=FocusScoreSettingsPage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FocusScoreSettingsPage.js","names":[],"sources":["../../../../src/timecampus/pages/focus-score/FocusScoreSettingsPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } 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 useListConfigurationsQuery,\n useSetConfigurationMutation,\n type ConfigurationFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nconst FOCUS_SETTINGS_KEY = \"timecampus.focus.settings\";\n\ninterface FocusSettings {\n dailyFocusTarget: number;\n minSessionLength: number;\n}\n\nconst DEFAULT_SETTINGS: FocusSettings = {\n dailyFocusTarget: 4,\n minSessionLength: 25,\n};\n\nexport function FocusScoreSettingsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n const { data, loading, error } = useListConfigurationsQuery({\n variables: { scope: \"WORKSPACE\" as never, limit: 100 },\n skip: !workspaceId,\n });\n\n const [setConfiguration, { loading: saving }] = useSetConfigurationMutation();\n const [settings, setSettings] = useState<FocusSettings>(DEFAULT_SETTINGS);\n\n useEffect(() => {\n if (data?.configurations) {\n const config = data.configurations.find(\n (c: ConfigurationFieldsFragment) => c.key === FOCUS_SETTINGS_KEY,\n );\n if (config?.value) {\n const val = config.value as Partial<FocusSettings>;\n setSettings({\n dailyFocusTarget:\n val.dailyFocusTarget ?? DEFAULT_SETTINGS.dailyFocusTarget,\n minSessionLength:\n val.minSessionLength ?? DEFAULT_SETTINGS.minSessionLength,\n });\n }\n }\n }, [data]);\n\n const handleSave = useCallback(async () => {\n await setConfiguration({\n variables: {\n input: {\n key: FOCUS_SETTINGS_KEY,\n value: settings as unknown as Record<string, unknown>,\n description: \"Focus score settings\",\n scope: \"WORKSPACE\" as never,\n },\n },\n });\n }, [setConfiguration, settings]);\n\n if (loading) {\n return (\n <PageLayout\n title=\"Focus Score Settings\"\n description=\"Configure focus tracking preferences\"\n >\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Focus Score Settings\"\n description=\"Configure focus tracking preferences\"\n >\n <div className=\"rounded-xl border border-status-error-border/50 bg-status-error-bg/10 p-4 text-sm text-status-error-text\">\n Failed to load settings. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Focus Score Settings\"\n description=\"Configure focus tracking preferences\"\n purpose=\"Set what 'a good focus day' means for you — a daily deep-work target and the minimum length that counts as a real focus session — so your focus score reflects your own goals, not generic defaults.\"\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 Focus Goals\n </h3>\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm font-medium text-text-primary\">\n Daily focus target\n </p>\n <p className=\"text-xs text-text-secondary\">\n Hours of deep focus per day\n </p>\n </div>\n <input\n type=\"number\"\n value={settings.dailyFocusTarget}\n onChange={(e) =>\n setSettings((s) => ({\n ...s,\n dailyFocusTarget: Number(e.target.value),\n }))\n }\n className=\"w-20 rounded-md border border-border-subtle bg-bg-surface px-3 py-1.5 text-sm text-text-primary text-right\"\n />\n </div>\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm font-medium text-text-primary\">\n Min. session length\n </p>\n <p className=\"text-xs text-text-secondary\">\n Minimum minutes for a focus session\n </p>\n </div>\n <input\n type=\"number\"\n value={settings.minSessionLength}\n onChange={(e) =>\n setSettings((s) => ({\n ...s,\n minSessionLength: Number(e.target.value),\n }))\n }\n className=\"w-20 rounded-md border border-border-subtle bg-bg-surface px-3 py-1.5 text-sm text-text-primary text-right\"\n />\n </div>\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":";;;;;;;;;AAYA,IAAM,IAAqB,6BAOrB,IAAkC;CACtC,kBAAkB;CAClB,kBAAkB;CACnB;AAED,SAAgB,IAAyB;CACvC,IAAM,EAAE,iBAAc,OAAO,GAAe,EACtC,EAAE,SAAM,YAAS,aAAU,EAA2B;EAC1D,WAAW;GAAE,OAAO;GAAsB,OAAO;GAAK;EACtD,MAAM,CAAC;EACR,CAAC,EAEI,CAAC,GAAkB,EAAE,SAAS,OAAY,GAA6B,EACvE,CAAC,GAAU,KAAe,EAAwB,EAAiB;AAEzE,SAAgB;AACd,MAAI,GAAM,gBAAgB;GACxB,IAAM,IAAS,EAAK,eAAe,MAChC,MAAmC,EAAE,QAAQ,EAC/C;AACD,OAAI,GAAQ,OAAO;IACjB,IAAM,IAAM,EAAO;AACnB,MAAY;KACV,kBACE,EAAI,oBAAoB,EAAiB;KAC3C,kBACE,EAAI,oBAAoB,EAAiB;KAC5C,CAAC;;;IAGL,CAAC,EAAK,CAAC;CAEV,IAAM,IAAa,EAAY,YAAY;AACzC,QAAM,EAAiB,EACrB,WAAW,EACT,OAAO;GACL,KAAK;GACL,OAAO;GACP,aAAa;GACb,OAAO;GACR,EACF,EACF,CAAC;IACD,CAAC,GAAkB,EAAS,CAAC;AA0BhC,QAxBI,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;aAA2G;GAEpH,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,cAE7B;QACL,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAwC;OAEjD,CAAA,EACJ,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAEvC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,SAAD;OACE,MAAK;OACL,OAAO,EAAS;OAChB,WAAW,MACT,GAAa,OAAO;QAClB,GAAG;QACH,kBAAkB,OAAO,EAAE,OAAO,MAAM;QACzC,EAAE;OAEL,WAAU;OACV,CAAA,CACE;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAwC;OAEjD,CAAA,EACJ,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAEvC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,SAAD;OACE,MAAK;OACL,OAAO,EAAS;OAChB,WAAW,MACT,GAAa,OAAO;QAClB,GAAG;QACH,kBAAkB,OAAO,EAAE,OAAO,MAAM;QACzC,EAAE;OAEL,WAAU;OACV,CAAA,CACE;QACF;OACI;OACZ,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,UAAD;KACE,SAAS;KACT,UAAU;KACV,WAAU;eAET,IAAS,cAAc;KACjB,CAAA;IACL,CAAA,CACF;;EACK,CAAA"}
@@ -1,110 +0,0 @@
1
- import { useTimeCampus as e } from "../../providers/TimeCampusProvider.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
- import { useEffect as a, useState as o } from "react";
6
- import { Settings as s } from "lucide-react";
7
- import { jsx as c, jsxs as l } from "react/jsx-runtime";
8
- import { GlassCard as u } from "@burdenoff/fe-libs/ui";
9
- //#region src/timecampus/pages/geofencing/GeofencingSettingsPage.tsx
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);
13
- return a(() => {
14
- v && (b(v.autoStartOnEntry ?? !0), S(v.autoStopOnExit ?? !0), w(v.notificationsOnEvents ?? !0));
15
- }, [
16
- v.autoStartOnEntry,
17
- v.autoStopOnExit,
18
- v.notificationsOnEvents
19
- ]), m ? /* @__PURE__ */ c(i, {
20
- title: "Geofencing Settings",
21
- description: "Configure geofencing preferences",
22
- children: /* @__PURE__ */ c(t, { variant: "detail" })
23
- }) : h ? /* @__PURE__ */ c(i, {
24
- title: "Geofencing Settings",
25
- description: "Configure geofencing preferences",
26
- children: /* @__PURE__ */ c("div", {
27
- className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
28
- children: "Failed to load geofencing settings. Please try again later."
29
- })
30
- }) : /* @__PURE__ */ c(i, {
31
- title: "Geofencing Settings",
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.",
34
- children: /* @__PURE__ */ l("div", {
35
- className: "mx-auto max-w-2xl space-y-6",
36
- children: [/* @__PURE__ */ l(u, {
37
- treatment: "glass",
38
- glow: !0,
39
- className: "p-6",
40
- children: [/* @__PURE__ */ l("h3", {
41
- className: "mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary",
42
- children: [/* @__PURE__ */ c(s, { className: "h-4 w-4" }), "Trigger Settings"]
43
- }), /* @__PURE__ */ l("div", {
44
- className: "space-y-3",
45
- children: [
46
- /* @__PURE__ */ l("label", {
47
- className: "flex items-center justify-between",
48
- children: [/* @__PURE__ */ c("span", {
49
- className: "text-sm text-text-primary",
50
- children: "Auto-start timer on entry"
51
- }), /* @__PURE__ */ c("input", {
52
- type: "checkbox",
53
- checked: y,
54
- onChange: (e) => b(e.target.checked),
55
- className: "h-4 w-4 rounded border-border-subtle"
56
- })]
57
- }),
58
- /* @__PURE__ */ l("label", {
59
- className: "flex items-center justify-between",
60
- children: [/* @__PURE__ */ c("span", {
61
- className: "text-sm text-text-primary",
62
- children: "Auto-stop timer on exit"
63
- }), /* @__PURE__ */ c("input", {
64
- type: "checkbox",
65
- checked: x,
66
- onChange: (e) => S(e.target.checked),
67
- className: "h-4 w-4 rounded border-border-subtle"
68
- })]
69
- }),
70
- /* @__PURE__ */ l("label", {
71
- className: "flex items-center justify-between",
72
- children: [/* @__PURE__ */ c("span", {
73
- className: "text-sm text-text-primary",
74
- children: "Notifications on events"
75
- }), /* @__PURE__ */ c("input", {
76
- type: "checkbox",
77
- checked: C,
78
- onChange: (e) => w(e.target.checked),
79
- className: "h-4 w-4 rounded border-border-subtle"
80
- })]
81
- })
82
- ]
83
- })]
84
- }), /* @__PURE__ */ c("div", {
85
- className: "flex justify-end",
86
- children: /* @__PURE__ */ c("button", {
87
- onClick: async () => {
88
- await g({ variables: { input: {
89
- key: d,
90
- value: {
91
- autoStartOnEntry: y,
92
- autoStopOnExit: x,
93
- notificationsOnEvents: C
94
- },
95
- description: "Geofencing trigger settings",
96
- scope: "USER"
97
- } } });
98
- },
99
- disabled: _,
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",
101
- children: _ ? "Saving..." : "Save Settings"
102
- })
103
- })]
104
- })
105
- });
106
- }
107
- //#endregion
108
- export { f as GeofencingSettingsPage };
109
-
110
- //# sourceMappingURL=GeofencingSettingsPage.js.map
@@ -1 +0,0 @@
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,83 +0,0 @@
1
- import { useTimeCampusNavigate as e } from "../../providers/TimeCampusProvider.js";
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 { TimeCampusConfigScope as a } from "../../../generated/wspace-types.js";
7
- import { ArrowRight as o, Factory as s } from "lucide-react";
8
- import { jsx as c, jsxs as l } from "react/jsx-runtime";
9
- //#region src/timecampus/pages/industry-solutions/IndustrySolutionsPage.tsx
10
- function u() {
11
- let u = e(), { data: d, loading: f, error: p } = n({ variables: { scope: a.Workspace } }), m = (d?.configurations ?? []).filter((e) => e.key.startsWith("industry."));
12
- return f ? /* @__PURE__ */ c(r, {
13
- title: "Industry Solutions",
14
- description: "Time tracking solutions tailored to your industry",
15
- children: /* @__PURE__ */ c(t, {
16
- variant: "card",
17
- count: 6
18
- })
19
- }) : p ? /* @__PURE__ */ c(r, {
20
- title: "Industry Solutions",
21
- description: "Time tracking solutions tailored to your industry",
22
- children: /* @__PURE__ */ c("div", {
23
- className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
24
- children: "Failed to load industry solutions. Please try again later."
25
- })
26
- }) : /* @__PURE__ */ c(r, {
27
- title: "Industry Solutions",
28
- description: "Time tracking solutions tailored to your industry",
29
- 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.",
30
- children: m.length === 0 ? /* @__PURE__ */ c(i, {
31
- illustration: "empty-generic",
32
- title: "No industry solutions configured yet",
33
- description: "Industry templates are stored as workspace configurations with the 'industry.' key prefix — once added, ready-made setups for your sector appear here."
34
- }) : /* @__PURE__ */ c("div", {
35
- className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
36
- children: m.map((e) => {
37
- let t = e.value, n = t.name ?? e.key.replace("industry.", ""), r = t.industry ?? "General", i = e.description ?? t.description ?? "", a = t.features ?? [];
38
- return /* @__PURE__ */ l("div", {
39
- className: "rounded-xl border border-border-seam bg-gloss-card shadow-pop p-5 transition-colors hover:bg-bg-sunken/50 cursor-pointer",
40
- children: [
41
- /* @__PURE__ */ l("div", {
42
- className: "flex items-start gap-3",
43
- children: [/* @__PURE__ */ c("div", {
44
- className: "flex h-12 w-12 items-center justify-center rounded-xl bg-action-primary-bg/10",
45
- children: /* @__PURE__ */ c(s, { className: "h-6 w-6 text-primary" })
46
- }), /* @__PURE__ */ l("div", {
47
- className: "flex-1",
48
- children: [/* @__PURE__ */ c("p", {
49
- className: "text-sm font-semibold text-text-primary",
50
- children: n
51
- }), /* @__PURE__ */ c("p", {
52
- className: "text-xs text-text-secondary",
53
- children: r
54
- })]
55
- })]
56
- }),
57
- /* @__PURE__ */ c("p", {
58
- className: "mt-3 text-xs text-text-secondary",
59
- children: i
60
- }),
61
- /* @__PURE__ */ c("div", {
62
- className: "mt-3 flex flex-wrap gap-1",
63
- children: a.map((e) => /* @__PURE__ */ c("span", {
64
- className: "inline-flex rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary",
65
- children: e
66
- }, e))
67
- }),
68
- /* @__PURE__ */ l("button", {
69
- type: "button",
70
- onClick: () => u("/templates"),
71
- className: "mt-3 flex items-center gap-1 text-xs font-medium text-primary hover:underline",
72
- children: ["Explore templates ", /* @__PURE__ */ c(o, { className: "h-3 w-3" })]
73
- })
74
- ]
75
- }, e.id);
76
- })
77
- })
78
- });
79
- }
80
- //#endregion
81
- export { u as IndustrySolutionsPage };
82
-
83
- //# sourceMappingURL=IndustrySolutionsPage.js.map
@@ -1 +0,0 @@
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 { useTimeCampusNavigate } from \"../../providers/TimeCampusProvider\";\nimport {\n useListConfigurationsQuery,\n type ConfigurationFieldsFragment,\n} from \"@/generated/wspace-operations\";\nimport { TimeCampusConfigScope } from \"@/generated/wspace-types\";\n\nexport function IndustrySolutionsPage() {\n const navigate = useTimeCampusNavigate();\n\n const { data, loading, error } = useListConfigurationsQuery({\n variables: { scope: TimeCampusConfigScope.Workspace },\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\n type=\"button\"\n onClick={() => navigate(\"/templates\")}\n className=\"mt-3 flex items-center gap-1 text-xs font-medium text-primary hover:underline\"\n >\n Explore templates <ArrowRight className=\"h-3 w-3\" />\n </button>\n </div>\n );\n })}\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AAWA,SAAgB,IAAwB;CACtC,IAAM,IAAW,GAAuB,EAElC,EAAE,SAAM,YAAS,aAAU,EAA2B,EAC1D,WAAW,EAAE,OAAO,EAAsB,WAAW,EACtD,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;OACE,MAAK;OACL,eAAe,EAAS,aAAa;OACrC,WAAU;iBAHZ,CAIC,sBACmB,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA,CAC7C;;MACL;OAlCC,EAAS,GAkCV;KAER;GACE,CAAA;EAEG,CAAA"}