@burdenoff/microfe-timecampus 2026.703.7 → 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 +82 -150
  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,198 +0,0 @@
1
- import { cn as e } from "../../utils/helpers.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 { Crosshair as s, Lock as c, MapPin as l, ShieldCheck as u, Users as d } from "lucide-react";
7
- import { jsx as f, jsxs as p } from "react/jsx-runtime";
8
- import { GlassCard as m } from "@burdenoff/fe-libs/ui";
9
- //#region src/timecampus/pages/location-tracking/LocationPrivacySettingsPage.tsx
10
- var h = "location.privacy";
11
- function g({ checked: t, onChange: n, label: r, disabled: i }) {
12
- return /* @__PURE__ */ f("button", {
13
- type: "button",
14
- role: "switch",
15
- "aria-checked": t,
16
- "aria-label": r,
17
- disabled: i,
18
- onClick: () => n(!t),
19
- className: e("relative inline-flex h-6 w-11 shrink-0 items-center rounded-full border transition-colors disabled:cursor-not-allowed disabled:opacity-50", t ? "border-transparent bg-action-primary-bg" : "border-border-subtle bg-bg-sunken"),
20
- children: /* @__PURE__ */ f("span", { className: e("inline-block h-4 w-4 transform rounded-full shadow-sm transition-transform", t ? "translate-x-5 bg-action-primary-text" : "translate-x-1 bg-text-secondary") })
21
- });
22
- }
23
- function _({ icon: t, title: n, description: r, checked: i, onChange: a }) {
24
- return /* @__PURE__ */ p("div", {
25
- className: "flex items-center justify-between gap-4 rounded-lg border border-border-subtle bg-bg-surface/60 p-4",
26
- children: [/* @__PURE__ */ p("div", {
27
- className: "flex min-w-0 items-start gap-3",
28
- children: [/* @__PURE__ */ f("span", {
29
- className: e("mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-lg transition-colors", i ? "bg-action-primary-bg/15 text-primary" : "bg-bg-sunken text-text-secondary"),
30
- children: t
31
- }), /* @__PURE__ */ p("div", {
32
- className: "min-w-0",
33
- children: [/* @__PURE__ */ f("p", {
34
- className: "text-sm font-medium text-text-primary",
35
- children: n
36
- }), /* @__PURE__ */ f("p", {
37
- className: "mt-0.5 text-xs text-text-secondary",
38
- children: r
39
- })]
40
- })]
41
- }), /* @__PURE__ */ f(g, {
42
- checked: i,
43
- onChange: a,
44
- label: n
45
- })]
46
- });
47
- }
48
- function v() {
49
- let { data: e, loading: g, error: v } = n({ variables: { key: h } }), [y, { loading: b }] = r(), x = e?.configurationByKey?.value ?? {}, [S, C] = o(!0), [w, T] = o(!1), [E, D] = o(!1);
50
- return a(() => {
51
- x && (C(x.trackingEnabled ?? !0), T(x.shareWithTeam ?? !1), D(x.preciseLocation ?? !1));
52
- }, [
53
- x.trackingEnabled,
54
- x.shareWithTeam,
55
- x.preciseLocation
56
- ]), g ? /* @__PURE__ */ f(i, {
57
- title: "Location Privacy Settings",
58
- description: "Control location tracking and data sharing",
59
- children: /* @__PURE__ */ f(t, { variant: "detail" })
60
- }) : v ? /* @__PURE__ */ f(i, {
61
- title: "Location Privacy Settings",
62
- description: "Control location tracking and data sharing",
63
- children: /* @__PURE__ */ f("div", {
64
- className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
65
- children: "Failed to load privacy settings. Please try again later."
66
- })
67
- }) : /* @__PURE__ */ f(i, {
68
- title: "Location Privacy Settings",
69
- description: "Control location tracking and data sharing",
70
- 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.",
71
- children: /* @__PURE__ */ p("div", {
72
- className: "mx-auto max-w-3xl space-y-6",
73
- children: [
74
- /* @__PURE__ */ p(m, {
75
- treatment: "glass",
76
- glow: !0,
77
- className: "p-6 text-center sm:p-8",
78
- children: [
79
- /* @__PURE__ */ f("div", {
80
- className: "mx-auto flex h-12 w-12 items-center justify-center rounded-full bg-action-primary-bg/15 text-primary",
81
- children: /* @__PURE__ */ f(u, { className: "h-6 w-6" })
82
- }),
83
- /* @__PURE__ */ f("h2", {
84
- className: "mt-4 text-lg font-semibold text-text-primary sm:text-xl",
85
- children: "Your location, your rules."
86
- }),
87
- /* @__PURE__ */ f("p", {
88
- className: "mx-auto mt-2 max-w-xl text-sm text-text-secondary",
89
- children: "TimeCampus only records where you work when you allow it — never in the background, never sold, and never shared beyond the people you choose. Change any of these settings at any time."
90
- }),
91
- /* @__PURE__ */ f("div", {
92
- className: "mt-5 flex flex-wrap items-center justify-center gap-2",
93
- children: [
94
- {
95
- icon: /* @__PURE__ */ f(c, { className: "h-3.5 w-3.5" }),
96
- label: "Encrypted at rest"
97
- },
98
- {
99
- icon: /* @__PURE__ */ f(l, { className: "h-3.5 w-3.5" }),
100
- label: "Only recorded when tracking is on"
101
- },
102
- {
103
- icon: /* @__PURE__ */ f(d, { className: "h-3.5 w-3.5" }),
104
- label: "Hidden from teammates by default"
105
- }
106
- ].map((e) => /* @__PURE__ */ p("span", {
107
- className: "inline-flex items-center gap-1.5 rounded-full border border-border-subtle bg-bg-sunken/70 px-3 py-1 text-xs font-medium text-text-secondary",
108
- children: [/* @__PURE__ */ f("span", {
109
- className: "text-primary",
110
- children: e.icon
111
- }), e.label]
112
- }, e.label))
113
- })
114
- ]
115
- }),
116
- /* @__PURE__ */ p(m, {
117
- treatment: "insight",
118
- className: "p-5 sm:p-6",
119
- children: [/* @__PURE__ */ p("div", {
120
- className: "mb-4",
121
- children: [/* @__PURE__ */ p("h3", {
122
- className: "flex items-center gap-2 text-sm font-semibold text-text-primary",
123
- children: [/* @__PURE__ */ f(l, { className: "h-4 w-4 text-text-secondary" }), "Location tracking"]
124
- }), /* @__PURE__ */ f("p", {
125
- className: "mt-0.5 text-xs text-text-secondary",
126
- children: "Decide whether and how precisely your work location is recorded."
127
- })]
128
- }), /* @__PURE__ */ p("div", {
129
- className: "space-y-3",
130
- children: [/* @__PURE__ */ f(_, {
131
- icon: /* @__PURE__ */ f(l, { className: "h-4 w-4" }),
132
- title: "Enable location tracking",
133
- description: "Allow the app to record your work location while you're on the clock.",
134
- checked: S,
135
- onChange: C
136
- }), /* @__PURE__ */ f(_, {
137
- icon: /* @__PURE__ */ f(s, { className: "h-4 w-4" }),
138
- title: "Precise location",
139
- description: "Use precise GPS coordinates instead of an approximate area.",
140
- checked: E,
141
- onChange: D
142
- })]
143
- })]
144
- }),
145
- /* @__PURE__ */ p(m, {
146
- treatment: "insight",
147
- className: "p-5 sm:p-6",
148
- children: [/* @__PURE__ */ p("div", {
149
- className: "mb-4",
150
- children: [/* @__PURE__ */ p("h3", {
151
- className: "flex items-center gap-2 text-sm font-semibold text-text-primary",
152
- children: [/* @__PURE__ */ f(d, { className: "h-4 w-4 text-text-secondary" }), "Team visibility"]
153
- }), /* @__PURE__ */ f("p", {
154
- className: "mt-0.5 text-xs text-text-secondary",
155
- children: "Control who on your team can see where you are."
156
- })]
157
- }), /* @__PURE__ */ f("div", {
158
- className: "space-y-3",
159
- children: /* @__PURE__ */ f(_, {
160
- icon: /* @__PURE__ */ f(d, { className: "h-4 w-4" }),
161
- title: "Share with team",
162
- description: "Let team members see your current location. Off keeps it private to you.",
163
- checked: w,
164
- onChange: T
165
- })
166
- })]
167
- }),
168
- /* @__PURE__ */ p("div", {
169
- className: "flex flex-col gap-3 rounded-lg border border-border-seam bg-bg-surface/60 p-4 sm:flex-row sm:items-center sm:justify-between",
170
- children: [/* @__PURE__ */ f("p", {
171
- className: "text-xs text-text-secondary",
172
- children: "Changes apply across your TimeCampus workspace once you save."
173
- }), /* @__PURE__ */ f("button", {
174
- onClick: async () => {
175
- await y({ variables: { input: {
176
- key: h,
177
- value: {
178
- trackingEnabled: S,
179
- shareWithTeam: w,
180
- preciseLocation: E
181
- },
182
- description: "Location privacy settings",
183
- scope: "USER"
184
- } } });
185
- },
186
- disabled: b,
187
- className: "shrink-0 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",
188
- children: b ? "Saving..." : "Save Settings"
189
- })]
190
- })
191
- ]
192
- })
193
- });
194
- }
195
- //#endregion
196
- export { v as LocationPrivacySettingsPage };
197
-
198
- //# sourceMappingURL=LocationPrivacySettingsPage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LocationPrivacySettingsPage.js","names":[],"sources":["../../../../src/timecampus/pages/location-tracking/LocationPrivacySettingsPage.tsx"],"sourcesContent":["import { useState, useEffect, type ReactNode } from \"react\";\nimport { ShieldCheck, MapPin, Crosshair, Users, Lock } from \"lucide-react\";\nimport { GlassCard } from \"@burdenoff/fe-libs/ui\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { cn } from \"../../utils/helpers\";\nimport {\n useGetConfigurationByKeyQuery,\n useSetConfigurationMutation,\n} from \"@/generated/wspace-operations\";\n\nconst CONFIG_KEY = \"location.privacy\";\n\ninterface ToggleSwitchProps {\n checked: boolean;\n onChange: (next: boolean) => void;\n label: string;\n disabled?: boolean;\n}\n\n/**\n * Local, token-styled switch (no shared component is available in this MFE).\n * The knob translates on the checked state only — never on hover — to respect\n * the repo no-hover-movement mandate.\n */\nfunction ToggleSwitch({\n checked,\n onChange,\n label,\n disabled,\n}: ToggleSwitchProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={label}\n disabled={disabled}\n onClick={() => onChange(!checked)}\n className={cn(\n \"relative inline-flex h-6 w-11 shrink-0 items-center rounded-full border transition-colors disabled:cursor-not-allowed disabled:opacity-50\",\n checked\n ? \"border-transparent bg-action-primary-bg\"\n : \"border-border-subtle bg-bg-sunken\",\n )}\n >\n <span\n className={cn(\n \"inline-block h-4 w-4 transform rounded-full shadow-sm transition-transform\",\n checked\n ? \"translate-x-5 bg-action-primary-text\"\n : \"translate-x-1 bg-text-secondary\",\n )}\n />\n </button>\n );\n}\n\ninterface SettingRowProps {\n icon: ReactNode;\n title: string;\n description: string;\n checked: boolean;\n onChange: (next: boolean) => void;\n}\n\nfunction SettingRow({\n icon,\n title,\n description,\n checked,\n onChange,\n}: SettingRowProps) {\n return (\n <div className=\"flex items-center justify-between gap-4 rounded-lg border border-border-subtle bg-bg-surface/60 p-4\">\n <div className=\"flex min-w-0 items-start gap-3\">\n <span\n className={cn(\n \"mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-lg transition-colors\",\n checked\n ? \"bg-action-primary-bg/15 text-primary\"\n : \"bg-bg-sunken text-text-secondary\",\n )}\n >\n {icon}\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-text-primary\">{title}</p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">{description}</p>\n </div>\n </div>\n <ToggleSwitch checked={checked} onChange={onChange} label={title} />\n </div>\n );\n}\n\nexport function LocationPrivacySettingsPage() {\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 const assurances = [\n { icon: <Lock className=\"h-3.5 w-3.5\" />, label: \"Encrypted at rest\" },\n {\n icon: <MapPin className=\"h-3.5 w-3.5\" />,\n label: \"Only recorded when tracking is on\",\n },\n {\n icon: <Users className=\"h-3.5 w-3.5\" />,\n label: \"Hidden from teammates by default\",\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-3xl space-y-6\">\n <GlassCard treatment=\"glass\" glow className=\"p-6 text-center sm:p-8\">\n <div className=\"mx-auto flex h-12 w-12 items-center justify-center rounded-full bg-action-primary-bg/15 text-primary\">\n <ShieldCheck className=\"h-6 w-6\" />\n </div>\n <h2 className=\"mt-4 text-lg font-semibold text-text-primary sm:text-xl\">\n Your location, your rules.\n </h2>\n <p className=\"mx-auto mt-2 max-w-xl text-sm text-text-secondary\">\n TimeCampus only records where you work when you allow it — never in\n the background, never sold, and never shared beyond the people you\n choose. Change any of these settings at any time.\n </p>\n <div className=\"mt-5 flex flex-wrap items-center justify-center gap-2\">\n {assurances.map((item) => (\n <span\n key={item.label}\n className=\"inline-flex items-center gap-1.5 rounded-full border border-border-subtle bg-bg-sunken/70 px-3 py-1 text-xs font-medium text-text-secondary\"\n >\n <span className=\"text-primary\">{item.icon}</span>\n {item.label}\n </span>\n ))}\n </div>\n </GlassCard>\n\n <GlassCard treatment=\"insight\" className=\"p-5 sm:p-6\">\n <div className=\"mb-4\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-text-primary\">\n <MapPin className=\"h-4 w-4 text-text-secondary\" />\n Location tracking\n </h3>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n Decide whether and how precisely your work location is recorded.\n </p>\n </div>\n <div className=\"space-y-3\">\n <SettingRow\n icon={<MapPin className=\"h-4 w-4\" />}\n title=\"Enable location tracking\"\n description=\"Allow the app to record your work location while you're on the clock.\"\n checked={trackingEnabled}\n onChange={setTrackingEnabled}\n />\n <SettingRow\n icon={<Crosshair className=\"h-4 w-4\" />}\n title=\"Precise location\"\n description=\"Use precise GPS coordinates instead of an approximate area.\"\n checked={preciseLocation}\n onChange={setPreciseLocation}\n />\n </div>\n </GlassCard>\n\n <GlassCard treatment=\"insight\" className=\"p-5 sm:p-6\">\n <div className=\"mb-4\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-text-primary\">\n <Users className=\"h-4 w-4 text-text-secondary\" />\n Team visibility\n </h3>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n Control who on your team can see where you are.\n </p>\n </div>\n <div className=\"space-y-3\">\n <SettingRow\n icon={<Users className=\"h-4 w-4\" />}\n title=\"Share with team\"\n description=\"Let team members see your current location. Off keeps it private to you.\"\n checked={shareWithTeam}\n onChange={setShareWithTeam}\n />\n </div>\n </GlassCard>\n\n <div className=\"flex flex-col gap-3 rounded-lg border border-border-seam bg-bg-surface/60 p-4 sm:flex-row sm:items-center sm:justify-between\">\n <p className=\"text-xs text-text-secondary\">\n Changes apply across your TimeCampus workspace once you save.\n </p>\n <button\n onClick={handleSave}\n disabled={saving}\n className=\"shrink-0 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,124 +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/team-activity/TeamActivitySettingsPage.tsx
10
- var d = "team-activity.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), [T, E] = o(!0);
13
- return a(() => {
14
- v && (b(v.showTimerEvents ?? !0), S(v.showTaskCompletions ?? !0), w(v.showCheckIns ?? !0), E(v.realTimeUpdates ?? !0));
15
- }, [
16
- v.showTimerEvents,
17
- v.showTaskCompletions,
18
- v.showCheckIns,
19
- v.realTimeUpdates
20
- ]), m ? /* @__PURE__ */ c(i, {
21
- title: "Team Activity Settings",
22
- description: "Configure team activity tracking",
23
- children: /* @__PURE__ */ c(t, { variant: "detail" })
24
- }) : h ? /* @__PURE__ */ c(i, {
25
- title: "Team Activity Settings",
26
- description: "Configure team activity tracking",
27
- children: /* @__PURE__ */ c("div", {
28
- className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
29
- children: "Failed to load activity settings. Please try again later."
30
- })
31
- }) : /* @__PURE__ */ c(i, {
32
- title: "Team Activity Settings",
33
- description: "Configure team activity tracking",
34
- purpose: "Tune the team activity feed so it shows what matters and nothing more — pick which events appear and whether updates stream live — keeping the team informed without it becoming noise.",
35
- children: /* @__PURE__ */ l("div", {
36
- className: "mx-auto max-w-2xl space-y-6",
37
- children: [/* @__PURE__ */ l(u, {
38
- treatment: "glass",
39
- glow: !0,
40
- className: "p-6",
41
- children: [/* @__PURE__ */ l("h3", {
42
- className: "mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary",
43
- children: [/* @__PURE__ */ c(s, { className: "h-4 w-4" }), "Activity Feed Settings"]
44
- }), /* @__PURE__ */ l("div", {
45
- className: "space-y-3",
46
- children: [
47
- /* @__PURE__ */ l("label", {
48
- className: "flex items-center justify-between",
49
- children: [/* @__PURE__ */ c("span", {
50
- className: "text-sm text-text-primary",
51
- children: "Show timer events"
52
- }), /* @__PURE__ */ c("input", {
53
- type: "checkbox",
54
- checked: y,
55
- onChange: (e) => b(e.target.checked),
56
- className: "h-4 w-4 rounded border-border-subtle"
57
- })]
58
- }),
59
- /* @__PURE__ */ l("label", {
60
- className: "flex items-center justify-between",
61
- children: [/* @__PURE__ */ c("span", {
62
- className: "text-sm text-text-primary",
63
- children: "Show task completions"
64
- }), /* @__PURE__ */ c("input", {
65
- type: "checkbox",
66
- checked: x,
67
- onChange: (e) => S(e.target.checked),
68
- className: "h-4 w-4 rounded border-border-subtle"
69
- })]
70
- }),
71
- /* @__PURE__ */ l("label", {
72
- className: "flex items-center justify-between",
73
- children: [/* @__PURE__ */ c("span", {
74
- className: "text-sm text-text-primary",
75
- children: "Show check-ins"
76
- }), /* @__PURE__ */ c("input", {
77
- type: "checkbox",
78
- checked: C,
79
- onChange: (e) => w(e.target.checked),
80
- className: "h-4 w-4 rounded border-border-subtle"
81
- })]
82
- }),
83
- /* @__PURE__ */ l("label", {
84
- className: "flex items-center justify-between",
85
- children: [/* @__PURE__ */ c("span", {
86
- className: "text-sm text-text-primary",
87
- children: "Real-time updates"
88
- }), /* @__PURE__ */ c("input", {
89
- type: "checkbox",
90
- checked: T,
91
- onChange: (e) => E(e.target.checked),
92
- className: "h-4 w-4 rounded border-border-subtle"
93
- })]
94
- })
95
- ]
96
- })]
97
- }), /* @__PURE__ */ c("div", {
98
- className: "flex justify-end",
99
- children: /* @__PURE__ */ c("button", {
100
- onClick: async () => {
101
- await g({ variables: { input: {
102
- key: d,
103
- value: {
104
- showTimerEvents: y,
105
- showTaskCompletions: x,
106
- showCheckIns: C,
107
- realTimeUpdates: T
108
- },
109
- description: "Team activity feed settings",
110
- scope: "USER"
111
- } } });
112
- },
113
- disabled: _,
114
- 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",
115
- children: _ ? "Saving..." : "Save Settings"
116
- })
117
- })]
118
- })
119
- });
120
- }
121
- //#endregion
122
- export { f as TeamActivitySettingsPage };
123
-
124
- //# sourceMappingURL=TeamActivitySettingsPage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TeamActivitySettingsPage.js","names":[],"sources":["../../../../src/timecampus/pages/team-activity/TeamActivitySettingsPage.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 = \"team-activity.settings\";\n\nexport function TeamActivitySettingsPage() {\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 [showTimerEvents, setShowTimerEvents] = useState(true);\n const [showTaskCompletions, setShowTaskCompletions] = useState(true);\n const [showCheckIns, setShowCheckIns] = useState(true);\n const [realTimeUpdates, setRealTimeUpdates] = useState(true);\n\n useEffect(() => {\n if (configValue) {\n setShowTimerEvents(configValue.showTimerEvents ?? true);\n setShowTaskCompletions(configValue.showTaskCompletions ?? true);\n setShowCheckIns(configValue.showCheckIns ?? true);\n setRealTimeUpdates(configValue.realTimeUpdates ?? true);\n }\n }, [\n configValue.showTimerEvents,\n configValue.showTaskCompletions,\n configValue.showCheckIns,\n configValue.realTimeUpdates,\n ]);\n\n const handleSave = async () => {\n await setConfiguration({\n variables: {\n input: {\n key: CONFIG_KEY,\n value: {\n showTimerEvents,\n showTaskCompletions,\n showCheckIns,\n realTimeUpdates,\n },\n description: \"Team activity feed settings\",\n scope: \"USER\" as never,\n },\n },\n });\n };\n\n if (loading) {\n return (\n <PageLayout\n title=\"Team Activity Settings\"\n description=\"Configure team activity tracking\"\n >\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Team Activity Settings\"\n description=\"Configure team activity tracking\"\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 activity settings. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Team Activity Settings\"\n description=\"Configure team activity tracking\"\n purpose=\"Tune the team activity feed so it shows what matters and nothing more — pick which events appear and whether updates stream live — keeping the team informed without it becoming noise.\"\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 Activity Feed 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 Show timer events\n </span>\n <input\n type=\"checkbox\"\n checked={showTimerEvents}\n onChange={(e) => setShowTimerEvents(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 Show task completions\n </span>\n <input\n type=\"checkbox\"\n checked={showTaskCompletions}\n onChange={(e) => setShowTaskCompletions(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\">Show check-ins</span>\n <input\n type=\"checkbox\"\n checked={showCheckIns}\n onChange={(e) => setShowCheckIns(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 Real-time updates\n </span>\n <input\n type=\"checkbox\"\n checked={realTimeUpdates}\n onChange={(e) => setRealTimeUpdates(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,IAA2B;CACzC,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,GAAqB,KAA0B,EAAS,GAAK,EAC9D,CAAC,GAAc,KAAmB,EAAS,GAAK,EAChD,CAAC,GAAiB,KAAsB,EAAS,GAAK;AA0D5D,QAxDA,QAAgB;AACd,EAAI,MACF,EAAmB,EAAY,mBAAmB,GAAK,EACvD,EAAuB,EAAY,uBAAuB,GAAK,EAC/D,EAAgB,EAAY,gBAAgB,GAAK,EACjD,EAAmB,EAAY,mBAAmB,GAAK;IAExD;EACD,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;EACb,CAAC,EAoBE,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,yBAE7B;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,EAAmB,EAAE,OAAO,QAAQ;QACrD,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,EAAuB,EAAE,OAAO,QAAQ;QACzD,WAAU;QACV,CAAA,CACI;;MACR,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,QAAD;QAAM,WAAU;kBAA4B;QAAqB,CAAA,EACjE,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAgB,EAAE,OAAO,QAAQ;QAClD,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,EAAmB,EAAE,OAAO,QAAQ;QACrD,WAAU;QACV,CAAA,CACI;;MACJ;OACI;OACZ,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,UAAD;KACE,SArGS,YAAY;AAC7B,YAAM,EAAiB,EACrB,WAAW,EACT,OAAO;OACL,KAAK;OACL,OAAO;QACL;QACA;QACA;QACA;QACD;OACD,aAAa;OACb,OAAO;OACR,EACF,EACF,CAAC;;KAuFM,UAAU;KACV,WAAU;eAET,IAAS,cAAc;KACjB,CAAA;IACL,CAAA,CACF;;EACK,CAAA"}
@@ -1,88 +0,0 @@
1
- import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
- import { LoadingSkeleton as t } from "../../components/LoadingSkeleton.js";
3
- import { useGetConfigurationQuery as n } from "../../../generated/wspace-operations.js";
4
- import { PageLayout as r } from "../../components/PageLayout.js";
5
- import { CheckCircle as i, Loader2 as a, Sparkles as o } from "lucide-react";
6
- import { useParams as s } from "react-router-dom";
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/templates/TemplateApplicationPage.tsx
10
- function d() {
11
- let { applicationId: d } = s(), { workspaceId: f = "" } = e(), { data: p, loading: m, error: h } = n({
12
- variables: { id: d ?? "" },
13
- skip: !d
14
- }), g = (p?.configuration?.value ?? {}).applicationSteps ?? [
15
- {
16
- label: "Project structure",
17
- status: "pending"
18
- },
19
- {
20
- label: "Time categories",
21
- status: "pending"
22
- },
23
- {
24
- label: "Team roles",
25
- status: "pending"
26
- },
27
- {
28
- label: "Dashboard widgets",
29
- status: "pending"
30
- },
31
- {
32
- label: "Workflows",
33
- status: "pending"
34
- }
35
- ];
36
- return m ? /* @__PURE__ */ c(r, {
37
- title: "Applying Template",
38
- description: "Loading...",
39
- children: /* @__PURE__ */ c(t, { variant: "detail" })
40
- }) : h ? /* @__PURE__ */ c(r, {
41
- title: "Applying Template",
42
- description: `Application ID: ${d}`,
43
- children: /* @__PURE__ */ c("div", {
44
- className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
45
- children: "Failed to load template application data. Please try again later."
46
- })
47
- }) : /* @__PURE__ */ c(r, {
48
- title: "Applying Template",
49
- description: `Application ID: ${d}`,
50
- purpose: "Watch your chosen template build out your workspace step by step — projects, categories, roles, widgets and workflows — so you can see exactly what's being configured as it happens.",
51
- children: /* @__PURE__ */ c("div", {
52
- className: "mx-auto max-w-lg",
53
- children: /* @__PURE__ */ l(u, {
54
- treatment: "glass",
55
- glow: !0,
56
- className: "p-6 text-center",
57
- children: [
58
- /* @__PURE__ */ c("div", {
59
- className: "flex h-16 w-16 mx-auto items-center justify-center rounded-full bg-action-primary-bg/10",
60
- children: /* @__PURE__ */ c(o, { className: "h-8 w-8 text-primary" })
61
- }),
62
- /* @__PURE__ */ c("h2", {
63
- className: "mt-4 text-lg font-semibold text-text-primary",
64
- children: "Setting up your workspace"
65
- }),
66
- /* @__PURE__ */ c("p", {
67
- className: "mt-1 text-sm text-text-secondary",
68
- children: "Applying the template configuration..."
69
- }),
70
- /* @__PURE__ */ c("div", {
71
- className: "mt-6 space-y-3 text-left",
72
- children: g.map((e) => /* @__PURE__ */ l("div", {
73
- className: "flex items-center gap-3 rounded-lg border border-border-subtle p-3",
74
- children: [e.status === "completed" ? /* @__PURE__ */ c(i, { className: "h-5 w-5 text-status-success-text" }) : e.status === "in-progress" ? /* @__PURE__ */ c(a, { className: "h-5 w-5 text-primary animate-spin" }) : /* @__PURE__ */ c("div", { className: "h-5 w-5 rounded-full border-2 border-muted" }), /* @__PURE__ */ c("span", {
75
- className: `text-sm ${e.status === "completed" ? "text-text-secondary" : "text-text-primary"}`,
76
- children: e.label
77
- })]
78
- }, e.label))
79
- })
80
- ]
81
- })
82
- })
83
- });
84
- }
85
- //#endregion
86
- export { d as TemplateApplicationPage };
87
-
88
- //# sourceMappingURL=TemplateApplicationPage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TemplateApplicationPage.js","names":[],"sources":["../../../../src/timecampus/pages/templates/TemplateApplicationPage.tsx"],"sourcesContent":["import { useParams } from \"react-router-dom\";\nimport { Sparkles, CheckCircle, Loader2 } 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 { useGetConfigurationQuery } from \"@/generated/wspace-operations\";\n\nexport function TemplateApplicationPage() {\n const { applicationId } = useParams<{ applicationId: string }>();\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useGetConfigurationQuery({\n variables: { id: applicationId ?? \"\" },\n skip: !applicationId,\n });\n\n const config = data?.configuration;\n const val = (config?.value as Record<string, unknown>) ?? {};\n\n // Application steps from configuration or defaults\n const configuredSteps = val.applicationSteps as\n | Array<{ label: string; status: string }>\n | undefined;\n const steps = configuredSteps ?? [\n { label: \"Project structure\", status: \"pending\" },\n { label: \"Time categories\", status: \"pending\" },\n { label: \"Team roles\", status: \"pending\" },\n { label: \"Dashboard widgets\", status: \"pending\" },\n { label: \"Workflows\", status: \"pending\" },\n ];\n\n if (loading) {\n return (\n <PageLayout title=\"Applying Template\" description=\"Loading...\">\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Applying Template\"\n description={`Application ID: ${applicationId}`}\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 template application data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Applying Template\"\n description={`Application ID: ${applicationId}`}\n purpose=\"Watch your chosen template build out your workspace step by step — projects, categories, roles, widgets and workflows — so you can see exactly what's being configured as it happens.\"\n >\n <div className=\"mx-auto max-w-lg\">\n <GlassCard treatment=\"glass\" glow className=\"p-6 text-center\">\n <div className=\"flex h-16 w-16 mx-auto items-center justify-center rounded-full bg-action-primary-bg/10\">\n <Sparkles className=\"h-8 w-8 text-primary\" />\n </div>\n <h2 className=\"mt-4 text-lg font-semibold text-text-primary\">\n Setting up your workspace\n </h2>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Applying the template configuration...\n </p>\n\n <div className=\"mt-6 space-y-3 text-left\">\n {steps.map((step) => (\n <div\n key={step.label}\n className=\"flex items-center gap-3 rounded-lg border border-border-subtle p-3\"\n >\n {step.status === \"completed\" ? (\n <CheckCircle className=\"h-5 w-5 text-status-success-text\" />\n ) : step.status === \"in-progress\" ? (\n <Loader2 className=\"h-5 w-5 text-primary animate-spin\" />\n ) : (\n <div className=\"h-5 w-5 rounded-full border-2 border-muted\" />\n )}\n <span\n className={`text-sm ${step.status === \"completed\" ? \"text-text-secondary\" : \"text-text-primary\"}`}\n >\n {step.label}\n </span>\n </div>\n ))}\n </div>\n </GlassCard>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AAQA,SAAgB,IAA0B;CACxC,IAAM,EAAE,qBAAkB,GAAsC,EAC1D,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAAyB;EACxD,WAAW,EAAE,IAAI,KAAiB,IAAI;EACtC,MAAM,CAAC;EACR,CAAC,EASI,KAPS,GAAM,eACA,SAAqC,EAAE,EAGhC,oBAGK;EAC/B;GAAE,OAAO;GAAqB,QAAQ;GAAW;EACjD;GAAE,OAAO;GAAmB,QAAQ;GAAW;EAC/C;GAAE,OAAO;GAAc,QAAQ;GAAW;EAC1C;GAAE,OAAO;GAAqB,QAAQ;GAAW;EACjD;GAAE,OAAO;GAAa,QAAQ;GAAW;EAC1C;AAuBD,QArBI,IAEA,kBAAC,GAAD;EAAY,OAAM;EAAoB,aAAY;YAChD,kBAAC,GAAD,EAAiB,SAAQ,UAAW,CAAA;EACzB,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAa,mBAAmB;YAEhC,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAa,mBAAmB;EAChC,SAAQ;YAER,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD;IAAW,WAAU;IAAQ,MAAA;IAAK,WAAU;cAA5C;KACE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD,EAAU,WAAU,wBAAyB,CAAA;MACzC,CAAA;KACN,kBAAC,MAAD;MAAI,WAAU;gBAA+C;MAExD,CAAA;KACL,kBAAC,KAAD;MAAG,WAAU;gBAAmC;MAE5C,CAAA;KAEJ,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAM,KAAK,MACV,kBAAC,OAAD;OAEE,WAAU;iBAFZ,CAIG,EAAK,WAAW,cACf,kBAAC,GAAD,EAAa,WAAU,oCAAqC,CAAA,GAC1D,EAAK,WAAW,gBAClB,kBAAC,GAAD,EAAS,WAAU,qCAAsC,CAAA,GAEzD,kBAAC,OAAD,EAAK,WAAU,8CAA+C,CAAA,EAEhE,kBAAC,QAAD;QACE,WAAW,WAAW,EAAK,WAAW,cAAc,wBAAwB;kBAE3E,EAAK;QACD,CAAA,CACH;SAfC,EAAK,MAeN,CACN;MACE,CAAA;KACI;;GACR,CAAA;EACK,CAAA"}
@@ -1,135 +0,0 @@
1
- import { useTimeCampusNavigate as e } from "../../providers/TimeCampusProvider.js";
2
- import { LoadingSkeleton as t } from "../../components/LoadingSkeleton.js";
3
- import { useGetConfigurationQuery as n, useSetConfigurationMutation as r } from "../../../generated/wspace-operations.js";
4
- import { PageLayout as i } from "../../components/PageLayout.js";
5
- import { TimeCampusConfigScope as a } from "../../../generated/wspace-types.js";
6
- import { ArrowLeft as o, CheckCircle as s, Sparkles as c } from "lucide-react";
7
- import { useParams as l } from "react-router-dom";
8
- import { jsx as u, jsxs as d } from "react/jsx-runtime";
9
- import { GlassCard as f, NextSteps as p } from "@burdenoff/fe-libs/ui";
10
- //#region src/timecampus/pages/templates/TemplateDetailPage.tsx
11
- function m() {
12
- let { id: m } = l(), h = e(), { data: g, loading: _, error: v } = n({
13
- variables: { id: m ?? "" },
14
- skip: !m
15
- }), [y, { loading: b }] = r(), x = g?.configuration, S = x?.value ?? {}, C = S.name ?? x?.key?.replace("template.", "") ?? "Template", w = x?.description ?? S.description ?? "A pre-built workspace template for time tracking workflows.", T = S.category ?? "General", E = S.industry ?? "Any", D = S.features ?? [], O = async () => {
16
- m && (await y({ variables: { input: {
17
- key: `template.applied.${m}`,
18
- scope: a.Workspace,
19
- value: {
20
- templateId: m,
21
- name: C,
22
- appliedAt: (/* @__PURE__ */ new Date()).toISOString()
23
- },
24
- description: `Applied template: ${C}`
25
- } } }), h("/templates"));
26
- };
27
- return _ ? /* @__PURE__ */ u(i, {
28
- title: "Template Details",
29
- description: "Loading...",
30
- children: /* @__PURE__ */ u(t, { variant: "detail" })
31
- }) : v || !x ? /* @__PURE__ */ u(i, {
32
- title: "Template Details",
33
- description: `Template ID: ${m}`,
34
- actions: /* @__PURE__ */ d("button", {
35
- type: "button",
36
- onClick: () => h("/templates"),
37
- className: "inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
38
- children: [/* @__PURE__ */ u(o, { className: "h-4 w-4" }), "Back to Templates"]
39
- }),
40
- children: /* @__PURE__ */ u("div", {
41
- className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
42
- children: v ? "Failed to load template details. Please try again later." : "Template configuration not found."
43
- })
44
- }) : /* @__PURE__ */ u(i, {
45
- title: "Template Details",
46
- description: `Template ID: ${m}`,
47
- purpose: "Review exactly what this template sets up — its features and who it's built for — before you apply it, so you know what will land in your workspace and whether it fits how your team works.",
48
- actions: /* @__PURE__ */ d("button", {
49
- type: "button",
50
- onClick: () => h("/templates"),
51
- className: "inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
52
- children: [/* @__PURE__ */ u(o, { className: "h-4 w-4" }), "Back to Templates"]
53
- }),
54
- children: /* @__PURE__ */ d("div", {
55
- className: "mx-auto max-w-2xl",
56
- children: [/* @__PURE__ */ u(p, {
57
- storageKey: "timecampus-template-detail",
58
- className: "mb-6",
59
- steps: [{
60
- id: "apply",
61
- label: "Apply this template",
62
- description: "Set up your workspace with this configuration.",
63
- onClick: () => void O()
64
- }, {
65
- id: "browse",
66
- label: "Browse other templates",
67
- description: "Compare with templates for other workflows.",
68
- onClick: () => h("/templates")
69
- }]
70
- }), /* @__PURE__ */ d(f, {
71
- treatment: "glass",
72
- glow: !0,
73
- className: "p-6",
74
- children: [
75
- /* @__PURE__ */ d("div", {
76
- className: "flex items-start gap-4",
77
- children: [/* @__PURE__ */ u("div", {
78
- className: "flex h-16 w-16 items-center justify-center rounded-xl bg-action-primary-bg/10",
79
- children: /* @__PURE__ */ u(c, { className: "h-8 w-8 text-primary" })
80
- }), /* @__PURE__ */ d("div", {
81
- className: "flex-1",
82
- children: [
83
- /* @__PURE__ */ u("h2", {
84
- className: "text-lg font-semibold text-text-primary",
85
- children: C
86
- }),
87
- /* @__PURE__ */ u("p", {
88
- className: "text-sm text-text-secondary",
89
- children: w
90
- }),
91
- /* @__PURE__ */ d("div", {
92
- className: "mt-2 flex flex-wrap items-center gap-2 text-xs text-text-secondary",
93
- children: [/* @__PURE__ */ u("span", {
94
- className: "inline-flex rounded-full bg-bg-sunken px-2 py-0.5 font-medium",
95
- children: T
96
- }), /* @__PURE__ */ u("span", {
97
- className: "inline-flex rounded-full bg-bg-sunken px-2 py-0.5 font-medium",
98
- children: E
99
- })]
100
- })
101
- ]
102
- })]
103
- }),
104
- D.length > 0 && /* @__PURE__ */ d("div", {
105
- className: "mt-6",
106
- children: [/* @__PURE__ */ u("h3", {
107
- className: "text-sm font-semibold text-text-primary",
108
- children: "Features"
109
- }), /* @__PURE__ */ u("ul", {
110
- className: "mt-2 space-y-2",
111
- children: D.map((e) => /* @__PURE__ */ d("li", {
112
- className: "flex items-center gap-2 text-sm text-text-secondary",
113
- children: [/* @__PURE__ */ u(s, { className: "h-4 w-4 text-status-success-text" }), e]
114
- }, e))
115
- })]
116
- }),
117
- /* @__PURE__ */ u("div", {
118
- className: "mt-6 flex justify-end",
119
- children: /* @__PURE__ */ u("button", {
120
- type: "button",
121
- onClick: () => void O(),
122
- disabled: b,
123
- 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",
124
- children: b ? "Applying..." : "Apply Template"
125
- })
126
- })
127
- ]
128
- })]
129
- })
130
- });
131
- }
132
- //#endregion
133
- export { m as TemplateDetailPage };
134
-
135
- //# sourceMappingURL=TemplateDetailPage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TemplateDetailPage.js","names":[],"sources":["../../../../src/timecampus/pages/templates/TemplateDetailPage.tsx"],"sourcesContent":["import { useParams } from \"react-router-dom\";\nimport { Sparkles, ArrowLeft, CheckCircle } from \"lucide-react\";\nimport { GlassCard, NextSteps } from \"@burdenoff/fe-libs/ui\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampusNavigate } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetConfigurationQuery,\n useSetConfigurationMutation,\n} from \"@/generated/wspace-operations\";\nimport { TimeCampusConfigScope } from \"@/generated/wspace-types\";\n\nexport function TemplateDetailPage() {\n const { id } = useParams<{ id: string }>();\n const navigate = useTimeCampusNavigate();\n\n const { data, loading, error } = useGetConfigurationQuery({\n variables: { id: id ?? \"\" },\n skip: !id,\n });\n const [setConfiguration, { loading: applying }] =\n useSetConfigurationMutation();\n\n const config = data?.configuration;\n const val = (config?.value as Record<string, unknown>) ?? {};\n const name =\n (val.name as string) ?? config?.key?.replace(\"template.\", \"\") ?? \"Template\";\n const description =\n config?.description ??\n (val.description as string) ??\n \"A pre-built workspace template for time tracking workflows.\";\n const category = (val.category as string) ?? \"General\";\n const industry = (val.industry as string) ?? \"Any\";\n const features = (val.features as string[]) ?? [];\n\n const handleApply = async () => {\n if (!id) return;\n await setConfiguration({\n variables: {\n input: {\n key: `template.applied.${id}`,\n scope: TimeCampusConfigScope.Workspace,\n value: {\n templateId: id,\n name,\n appliedAt: new Date().toISOString(),\n },\n description: `Applied template: ${name}`,\n },\n },\n });\n navigate(\"/templates\");\n };\n\n if (loading) {\n return (\n <PageLayout title=\"Template Details\" description=\"Loading...\">\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error || !config) {\n return (\n <PageLayout\n title=\"Template Details\"\n description={`Template ID: ${id}`}\n actions={\n <button\n type=\"button\"\n onClick={() => navigate(\"/templates\")}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Templates\n </button>\n }\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 {error\n ? \"Failed to load template details. Please try again later.\"\n : \"Template configuration not found.\"}\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Template Details\"\n description={`Template ID: ${id}`}\n purpose=\"Review exactly what this template sets up — its features and who it's built for — before you apply it, so you know what will land in your workspace and whether it fits how your team works.\"\n actions={\n <button\n type=\"button\"\n onClick={() => navigate(\"/templates\")}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Templates\n </button>\n }\n >\n <div className=\"mx-auto max-w-2xl\">\n <NextSteps\n storageKey=\"timecampus-template-detail\"\n className=\"mb-6\"\n steps={[\n {\n id: \"apply\",\n label: \"Apply this template\",\n description: \"Set up your workspace with this configuration.\",\n onClick: () => void handleApply(),\n },\n {\n id: \"browse\",\n label: \"Browse other templates\",\n description: \"Compare with templates for other workflows.\",\n onClick: () => navigate(\"/templates\"),\n },\n ]}\n />\n <GlassCard treatment=\"glass\" glow className=\"p-6\">\n <div className=\"flex items-start gap-4\">\n <div className=\"flex h-16 w-16 items-center justify-center rounded-xl bg-action-primary-bg/10\">\n <Sparkles className=\"h-8 w-8 text-primary\" />\n </div>\n <div className=\"flex-1\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {name}\n </h2>\n <p className=\"text-sm text-text-secondary\">{description}</p>\n <div className=\"mt-2 flex flex-wrap items-center gap-2 text-xs text-text-secondary\">\n <span className=\"inline-flex rounded-full bg-bg-sunken px-2 py-0.5 font-medium\">\n {category}\n </span>\n <span className=\"inline-flex rounded-full bg-bg-sunken px-2 py-0.5 font-medium\">\n {industry}\n </span>\n </div>\n </div>\n </div>\n\n {features.length > 0 && (\n <div className=\"mt-6\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n Features\n </h3>\n <ul className=\"mt-2 space-y-2\">\n {features.map((feature) => (\n <li\n key={feature}\n className=\"flex items-center gap-2 text-sm text-text-secondary\"\n >\n <CheckCircle className=\"h-4 w-4 text-status-success-text\" />\n {feature}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n <div className=\"mt-6 flex justify-end\">\n <button\n type=\"button\"\n onClick={() => void handleApply()}\n disabled={applying}\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 {applying ? \"Applying...\" : \"Apply Template\"}\n </button>\n </div>\n </GlassCard>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}