@burdenoff/microfe-timecampus 2026.624.1 → 2026.626.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/dist/timecampus/components/EmptyState.js +14 -0
  2. package/dist/timecampus/components/EmptyState.js.map +1 -0
  3. package/dist/timecampus/components/ErrorBoundary.js +2 -2
  4. package/dist/timecampus/components/ErrorBoundary.js.map +1 -1
  5. package/dist/timecampus/components/LoadingSkeleton.js +1 -1
  6. package/dist/timecampus/components/LoadingSkeleton.js.map +1 -1
  7. package/dist/timecampus/components/PageLayout.js +26 -14
  8. package/dist/timecampus/components/PageLayout.js.map +1 -1
  9. package/dist/timecampus/components/StatCard.js +19 -16
  10. package/dist/timecampus/components/StatCard.js.map +1 -1
  11. package/dist/timecampus/pages/HomePage.js +169 -149
  12. package/dist/timecampus/pages/HomePage.js.map +1 -1
  13. package/dist/timecampus/pages/applets/AppletStorePage.js +38 -35
  14. package/dist/timecampus/pages/applets/AppletStorePage.js.map +1 -1
  15. package/dist/timecampus/pages/applets/InstalledAppletsPage.js +42 -36
  16. package/dist/timecampus/pages/applets/InstalledAppletsPage.js.map +1 -1
  17. package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js +57 -53
  18. package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js.map +1 -1
  19. package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js +40 -36
  20. package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js.map +1 -1
  21. package/dist/timecampus/pages/channels/ChannelsPage.js +32 -29
  22. package/dist/timecampus/pages/channels/ChannelsPage.js.map +1 -1
  23. package/dist/timecampus/pages/client-portal/ClientPortalPage.js +52 -44
  24. package/dist/timecampus/pages/client-portal/ClientPortalPage.js.map +1 -1
  25. package/dist/timecampus/pages/dashboard/AnalyticsPage.js +65 -38
  26. package/dist/timecampus/pages/dashboard/AnalyticsPage.js.map +1 -1
  27. package/dist/timecampus/pages/dashboard/ReportsPage.js +47 -41
  28. package/dist/timecampus/pages/dashboard/ReportsPage.js.map +1 -1
  29. package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js +16 -14
  30. package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js.map +1 -1
  31. package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js +40 -36
  32. package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js.map +1 -1
  33. package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js +34 -28
  34. package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js.map +1 -1
  35. package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js +49 -41
  36. package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js.map +1 -1
  37. package/dist/timecampus/pages/focus-score/FocusScorePage.js +66 -62
  38. package/dist/timecampus/pages/focus-score/FocusScorePage.js.map +1 -1
  39. package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js +37 -33
  40. package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js.map +1 -1
  41. package/dist/timecampus/pages/geofencing/GeofencingPage.js +37 -30
  42. package/dist/timecampus/pages/geofencing/GeofencingPage.js.map +1 -1
  43. package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js +35 -31
  44. package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js.map +1 -1
  45. package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js +37 -34
  46. package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js.map +1 -1
  47. package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js +35 -31
  48. package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js.map +1 -1
  49. package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js +45 -41
  50. package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js.map +1 -1
  51. package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js +17 -15
  52. package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js.map +1 -1
  53. package/dist/timecampus/pages/meetings/MeetingCreatePage.js +36 -32
  54. package/dist/timecampus/pages/meetings/MeetingCreatePage.js.map +1 -1
  55. package/dist/timecampus/pages/meetings/MeetingDetailPage.js +120 -102
  56. package/dist/timecampus/pages/meetings/MeetingDetailPage.js.map +1 -1
  57. package/dist/timecampus/pages/meetings/MeetingsPage.js +46 -36
  58. package/dist/timecampus/pages/meetings/MeetingsPage.js.map +1 -1
  59. package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js +19 -17
  60. package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js.map +1 -1
  61. package/dist/timecampus/pages/pomodoro/PomodoroPage.js +143 -112
  62. package/dist/timecampus/pages/pomodoro/PomodoroPage.js.map +1 -1
  63. package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js +55 -51
  64. package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js.map +1 -1
  65. package/dist/timecampus/pages/projects/ProjectCreatePage.js +32 -28
  66. package/dist/timecampus/pages/projects/ProjectCreatePage.js.map +1 -1
  67. package/dist/timecampus/pages/projects/ProjectDetailPage.js +107 -76
  68. package/dist/timecampus/pages/projects/ProjectDetailPage.js.map +1 -1
  69. package/dist/timecampus/pages/projects/ProjectsPage.js +21 -17
  70. package/dist/timecampus/pages/projects/ProjectsPage.js.map +1 -1
  71. package/dist/timecampus/pages/projects/TasksPage.js +44 -34
  72. package/dist/timecampus/pages/projects/TasksPage.js.map +1 -1
  73. package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js +59 -55
  74. package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js.map +1 -1
  75. package/dist/timecampus/pages/team/TeamAnalyticsPage.js +24 -20
  76. package/dist/timecampus/pages/team/TeamAnalyticsPage.js.map +1 -1
  77. package/dist/timecampus/pages/team/TeamMembersPage.js +47 -41
  78. package/dist/timecampus/pages/team/TeamMembersPage.js.map +1 -1
  79. package/dist/timecampus/pages/team/TeamPage.js +89 -59
  80. package/dist/timecampus/pages/team/TeamPage.js.map +1 -1
  81. package/dist/timecampus/pages/team-activity/TeamActivityPage.js +47 -43
  82. package/dist/timecampus/pages/team-activity/TeamActivityPage.js.map +1 -1
  83. package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js +39 -35
  84. package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js.map +1 -1
  85. package/dist/timecampus/pages/templates/TemplateApplicationPage.js +24 -20
  86. package/dist/timecampus/pages/templates/TemplateApplicationPage.js.map +1 -1
  87. package/dist/timecampus/pages/templates/TemplateDetailPage.js +66 -48
  88. package/dist/timecampus/pages/templates/TemplateDetailPage.js.map +1 -1
  89. package/dist/timecampus/pages/templates/TemplatesPage.js +39 -36
  90. package/dist/timecampus/pages/templates/TemplatesPage.js.map +1 -1
  91. package/dist/timecampus/pages/time/TimeEntriesPage.js +53 -44
  92. package/dist/timecampus/pages/time/TimeEntriesPage.js.map +1 -1
  93. package/dist/timecampus/pages/time/TimeTrackingPage.js +72 -71
  94. package/dist/timecampus/pages/time/TimeTrackingPage.js.map +1 -1
  95. package/dist/timecampus/pages/time/TimerPage.js +100 -66
  96. package/dist/timecampus/pages/time/TimerPage.js.map +1 -1
  97. package/dist/timecampus/pages/time-approval/TimeApprovalPage.js +63 -59
  98. package/dist/timecampus/pages/time-approval/TimeApprovalPage.js.map +1 -1
  99. package/dist/timecampus/pages/widgets/WidgetDetailPage.js +64 -46
  100. package/dist/timecampus/pages/widgets/WidgetDetailPage.js.map +1 -1
  101. package/dist/timecampus/pages/widgets/WidgetsPage.js +44 -37
  102. package/dist/timecampus/pages/widgets/WidgetsPage.js.map +1 -1
  103. package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js +18 -16
  104. package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js.map +1 -1
  105. package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js +40 -36
  106. package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js.map +1 -1
  107. package/dist/timecampus/pages/workflows/WorkflowsPage.js +47 -37
  108. package/dist/timecampus/pages/workflows/WorkflowsPage.js.map +1 -1
  109. package/package.json +2 -2
@@ -1,63 +1,67 @@
1
1
  import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
- import { PageLayout as t } from "../../components/PageLayout.js";
3
- import { LoadingSkeleton as n } from "../../components/LoadingSkeleton.js";
4
- import { useListConfigurationsQuery as r, useSetConfigurationMutation as i } from "../../../generated/wspace-operations.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
5
  import { useCallback as a, useEffect as o, useState as s } from "react";
6
6
  import { Settings as c } from "lucide-react";
7
7
  import { jsx as l, jsxs as u } from "react/jsx-runtime";
8
+ import { GlassCard as d } from "@burdenoff/fe-libs/ui";
8
9
  //#region src/timecampus/pages/work-patterns/WorkPatternsSettingsPage.tsx
9
- var d = "timecampus.workpatterns.settings", f = {
10
+ var f = "timecampus.workpatterns.settings", p = {
10
11
  trackEnergyLevels: !0,
11
12
  trackMood: !0,
12
13
  interruptionTracking: !0
13
14
  };
14
- function p() {
15
- let { workspaceId: p = "" } = e(), { data: m, loading: h, error: g } = r({
15
+ function m() {
16
+ let { workspaceId: m = "" } = e(), { data: h, loading: g, error: _ } = n({
16
17
  variables: {
17
18
  scope: "WORKSPACE",
18
19
  limit: 100
19
20
  },
20
- skip: !p
21
- }), [_, { loading: v }] = i(), [y, b] = s(f);
21
+ skip: !m
22
+ }), [v, { loading: y }] = r(), [b, x] = s(p);
22
23
  o(() => {
23
- if (m?.configurations) {
24
- let e = m.configurations.find((e) => e.key === d);
24
+ if (h?.configurations) {
25
+ let e = h.configurations.find((e) => e.key === f);
25
26
  if (e?.value) {
26
27
  let t = e.value;
27
- b({
28
- trackEnergyLevels: t.trackEnergyLevels ?? f.trackEnergyLevels,
29
- trackMood: t.trackMood ?? f.trackMood,
30
- interruptionTracking: t.interruptionTracking ?? f.interruptionTracking
28
+ x({
29
+ trackEnergyLevels: t.trackEnergyLevels ?? p.trackEnergyLevels,
30
+ trackMood: t.trackMood ?? p.trackMood,
31
+ interruptionTracking: t.interruptionTracking ?? p.interruptionTracking
31
32
  });
32
33
  }
33
34
  }
34
- }, [m]);
35
- let x = a(async () => {
36
- await _({ variables: { input: {
37
- key: d,
38
- value: y,
35
+ }, [h]);
36
+ let S = a(async () => {
37
+ await v({ variables: { input: {
38
+ key: f,
39
+ value: b,
39
40
  description: "Work patterns tracking settings",
40
41
  scope: "WORKSPACE"
41
42
  } } });
42
- }, [_, y]);
43
- return h ? /* @__PURE__ */ l(t, {
43
+ }, [v, b]);
44
+ return g ? /* @__PURE__ */ l(i, {
44
45
  title: "Work Patterns Settings",
45
46
  description: "Configure work pattern tracking",
46
- children: /* @__PURE__ */ l(n, { variant: "detail" })
47
- }) : g ? /* @__PURE__ */ l(t, {
47
+ children: /* @__PURE__ */ l(t, { variant: "detail" })
48
+ }) : _ ? /* @__PURE__ */ l(i, {
48
49
  title: "Work Patterns Settings",
49
50
  description: "Configure work pattern tracking",
50
51
  children: /* @__PURE__ */ l("div", {
51
52
  className: "rounded-xl border border-status-error-border/50 bg-status-error-bg/10 p-4 text-sm text-status-error-text",
52
53
  children: "Failed to load settings. Please try again later."
53
54
  })
54
- }) : /* @__PURE__ */ l(t, {
55
+ }) : /* @__PURE__ */ l(i, {
55
56
  title: "Work Patterns Settings",
56
57
  description: "Configure work pattern tracking",
58
+ purpose: "Choose how much TimeCampus learns about your workday — energy, mood and interruptions — so the work-pattern insights it gives back are based on the signals you're comfortable sharing.",
57
59
  children: /* @__PURE__ */ u("div", {
58
60
  className: "mx-auto max-w-2xl space-y-6",
59
- children: [/* @__PURE__ */ u("div", {
60
- className: "rounded-xl border border-border-subtle bg-bg-surface p-6",
61
+ children: [/* @__PURE__ */ u(d, {
62
+ treatment: "glass",
63
+ glow: !0,
64
+ className: "p-6",
61
65
  children: [/* @__PURE__ */ u("h3", {
62
66
  className: "mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary",
63
67
  children: [/* @__PURE__ */ l(c, { className: "h-4 w-4" }), "Tracking Preferences"]
@@ -71,8 +75,8 @@ function p() {
71
75
  children: "Track energy levels"
72
76
  }), /* @__PURE__ */ l("input", {
73
77
  type: "checkbox",
74
- checked: y.trackEnergyLevels,
75
- onChange: (e) => b((t) => ({
78
+ checked: b.trackEnergyLevels,
79
+ onChange: (e) => x((t) => ({
76
80
  ...t,
77
81
  trackEnergyLevels: e.target.checked
78
82
  })),
@@ -86,8 +90,8 @@ function p() {
86
90
  children: "Track mood"
87
91
  }), /* @__PURE__ */ l("input", {
88
92
  type: "checkbox",
89
- checked: y.trackMood,
90
- onChange: (e) => b((t) => ({
93
+ checked: b.trackMood,
94
+ onChange: (e) => x((t) => ({
91
95
  ...t,
92
96
  trackMood: e.target.checked
93
97
  })),
@@ -101,8 +105,8 @@ function p() {
101
105
  children: "Interruption tracking"
102
106
  }), /* @__PURE__ */ l("input", {
103
107
  type: "checkbox",
104
- checked: y.interruptionTracking,
105
- onChange: (e) => b((t) => ({
108
+ checked: b.interruptionTracking,
109
+ onChange: (e) => x((t) => ({
106
110
  ...t,
107
111
  interruptionTracking: e.target.checked
108
112
  })),
@@ -114,16 +118,16 @@ function p() {
114
118
  }), /* @__PURE__ */ l("div", {
115
119
  className: "flex justify-end",
116
120
  children: /* @__PURE__ */ l("button", {
117
- onClick: x,
118
- disabled: v,
121
+ onClick: S,
122
+ disabled: y,
119
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",
120
- children: v ? "Saving..." : "Save Settings"
124
+ children: y ? "Saving..." : "Save Settings"
121
125
  })
122
126
  })]
123
127
  })
124
128
  });
125
129
  }
126
130
  //#endregion
127
- export { p as WorkPatternsSettingsPage };
131
+ export { m as WorkPatternsSettingsPage };
128
132
 
129
133
  //# sourceMappingURL=WorkPatternsSettingsPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkPatternsSettingsPage.js","names":[],"sources":["../../../../src/timecampus/pages/work-patterns/WorkPatternsSettingsPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from \"react\";\nimport { Settings } from \"lucide-react\";\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 WORK_PATTERNS_SETTINGS_KEY = \"timecampus.workpatterns.settings\";\n\ninterface WorkPatternsSettings {\n trackEnergyLevels: boolean;\n trackMood: boolean;\n interruptionTracking: boolean;\n}\n\nconst DEFAULT_SETTINGS: WorkPatternsSettings = {\n trackEnergyLevels: true,\n trackMood: true,\n interruptionTracking: true,\n};\n\nexport function WorkPatternsSettingsPage() {\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] =\n useState<WorkPatternsSettings>(DEFAULT_SETTINGS);\n\n useEffect(() => {\n if (data?.configurations) {\n const config = data.configurations.find(\n (c: ConfigurationFieldsFragment) =>\n c.key === WORK_PATTERNS_SETTINGS_KEY,\n );\n if (config?.value) {\n const val = config.value as Partial<WorkPatternsSettings>;\n setSettings({\n trackEnergyLevels:\n val.trackEnergyLevels ?? DEFAULT_SETTINGS.trackEnergyLevels,\n trackMood: val.trackMood ?? DEFAULT_SETTINGS.trackMood,\n interruptionTracking:\n val.interruptionTracking ?? DEFAULT_SETTINGS.interruptionTracking,\n });\n }\n }\n }, [data]);\n\n const handleSave = useCallback(async () => {\n await setConfiguration({\n variables: {\n input: {\n key: WORK_PATTERNS_SETTINGS_KEY,\n value: settings as unknown as Record<string, unknown>,\n description: \"Work patterns tracking settings\",\n scope: \"WORKSPACE\" as never,\n },\n },\n });\n }, [setConfiguration, settings]);\n\n if (loading) {\n return (\n <PageLayout\n title=\"Work Patterns Settings\"\n description=\"Configure work pattern tracking\"\n >\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Work Patterns Settings\"\n description=\"Configure work pattern tracking\"\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=\"Work Patterns Settings\"\n description=\"Configure work pattern tracking\"\n >\n <div className=\"mx-auto max-w-2xl space-y-6\">\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-6\">\n <h3 className=\"mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary\">\n <Settings className=\"h-4 w-4\" />\n Tracking Preferences\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 Track energy levels\n </span>\n <input\n type=\"checkbox\"\n checked={settings.trackEnergyLevels}\n onChange={(e) =>\n setSettings((s) => ({\n ...s,\n trackEnergyLevels: 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 <span className=\"text-sm text-text-primary\">Track mood</span>\n <input\n type=\"checkbox\"\n checked={settings.trackMood}\n onChange={(e) =>\n setSettings((s) => ({ ...s, trackMood: 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 <span className=\"text-sm text-text-primary\">\n Interruption tracking\n </span>\n <input\n type=\"checkbox\"\n checked={settings.interruptionTracking}\n onChange={(e) =>\n setSettings((s) => ({\n ...s,\n interruptionTracking: e.target.checked,\n }))\n }\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </label>\n </div>\n </div>\n <div className=\"flex justify-end\">\n <button\n onClick={handleSave}\n disabled={saving}\n className=\"rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 disabled:opacity-50\"\n >\n {saving ? \"Saving...\" : \"Save Settings\"}\n </button>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAWA,IAAM,IAA6B,oCAQ7B,IAAyC;CAC7C,mBAAmB;CACnB,WAAW;CACX,sBAAsB;CACvB;AAED,SAAgB,IAA2B;CACzC,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,KACf,EAA+B,EAAiB;AAElD,SAAgB;AACd,MAAI,GAAM,gBAAgB;GACxB,IAAM,IAAS,EAAK,eAAe,MAChC,MACC,EAAE,QAAQ,EACb;AACD,OAAI,GAAQ,OAAO;IACjB,IAAM,IAAM,EAAO;AACnB,MAAY;KACV,mBACE,EAAI,qBAAqB,EAAiB;KAC5C,WAAW,EAAI,aAAa,EAAiB;KAC7C,sBACE,EAAI,wBAAwB,EAAiB;KAChD,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;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAAd,CACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAAA,uBAE7B;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,EAAS;QAClB,WAAW,MACT,GAAa,OAAO;SAClB,GAAG;SACH,mBAAmB,EAAE,OAAO;SAC7B,EAAE;QAEL,WAAU;QACV,CAAA,CACI;;MACR,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,QAAD;QAAM,WAAU;kBAA4B;QAAiB,CAAA,EAC7D,kBAAC,SAAD;QACE,MAAK;QACL,SAAS,EAAS;QAClB,WAAW,MACT,GAAa,OAAO;SAAE,GAAG;SAAG,WAAW,EAAE,OAAO;SAAS,EAAE;QAE7D,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,EAAS;QAClB,WAAW,MACT,GAAa,OAAO;SAClB,GAAG;SACH,sBAAsB,EAAE,OAAO;SAChC,EAAE;QAEL,WAAU;QACV,CAAA,CACI;;MACJ;OACF;OACN,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,UAAD;KACE,SAAS;KACT,UAAU;KACV,WAAU;eAET,IAAS,cAAc;KACjB,CAAA;IACL,CAAA,CACF;;EACK,CAAA"}
1
+ {"version":3,"file":"WorkPatternsSettingsPage.js","names":[],"sources":["../../../../src/timecampus/pages/work-patterns/WorkPatternsSettingsPage.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 WORK_PATTERNS_SETTINGS_KEY = \"timecampus.workpatterns.settings\";\n\ninterface WorkPatternsSettings {\n trackEnergyLevels: boolean;\n trackMood: boolean;\n interruptionTracking: boolean;\n}\n\nconst DEFAULT_SETTINGS: WorkPatternsSettings = {\n trackEnergyLevels: true,\n trackMood: true,\n interruptionTracking: true,\n};\n\nexport function WorkPatternsSettingsPage() {\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] =\n useState<WorkPatternsSettings>(DEFAULT_SETTINGS);\n\n useEffect(() => {\n if (data?.configurations) {\n const config = data.configurations.find(\n (c: ConfigurationFieldsFragment) =>\n c.key === WORK_PATTERNS_SETTINGS_KEY,\n );\n if (config?.value) {\n const val = config.value as Partial<WorkPatternsSettings>;\n setSettings({\n trackEnergyLevels:\n val.trackEnergyLevels ?? DEFAULT_SETTINGS.trackEnergyLevels,\n trackMood: val.trackMood ?? DEFAULT_SETTINGS.trackMood,\n interruptionTracking:\n val.interruptionTracking ?? DEFAULT_SETTINGS.interruptionTracking,\n });\n }\n }\n }, [data]);\n\n const handleSave = useCallback(async () => {\n await setConfiguration({\n variables: {\n input: {\n key: WORK_PATTERNS_SETTINGS_KEY,\n value: settings as unknown as Record<string, unknown>,\n description: \"Work patterns tracking settings\",\n scope: \"WORKSPACE\" as never,\n },\n },\n });\n }, [setConfiguration, settings]);\n\n if (loading) {\n return (\n <PageLayout\n title=\"Work Patterns Settings\"\n description=\"Configure work pattern tracking\"\n >\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Work Patterns Settings\"\n description=\"Configure work pattern tracking\"\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=\"Work Patterns Settings\"\n description=\"Configure work pattern tracking\"\n purpose=\"Choose how much TimeCampus learns about your workday — energy, mood and interruptions — so the work-pattern insights it gives back are based on the signals you're comfortable sharing.\"\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 Preferences\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 Track energy levels\n </span>\n <input\n type=\"checkbox\"\n checked={settings.trackEnergyLevels}\n onChange={(e) =>\n setSettings((s) => ({\n ...s,\n trackEnergyLevels: 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 <span className=\"text-sm text-text-primary\">Track mood</span>\n <input\n type=\"checkbox\"\n checked={settings.trackMood}\n onChange={(e) =>\n setSettings((s) => ({ ...s, trackMood: 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 <span className=\"text-sm text-text-primary\">\n Interruption tracking\n </span>\n <input\n type=\"checkbox\"\n checked={settings.interruptionTracking}\n onChange={(e) =>\n setSettings((s) => ({\n ...s,\n interruptionTracking: 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":";;;;;;;;;AAYA,IAAM,IAA6B,oCAQ7B,IAAyC;CAC7C,mBAAmB;CACnB,WAAW;CACX,sBAAsB;CACvB;AAED,SAAgB,IAA2B;CACzC,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,KACf,EAA+B,EAAiB;AAElD,SAAgB;AACd,MAAI,GAAM,gBAAgB;GACxB,IAAM,IAAS,EAAK,eAAe,MAChC,MACC,EAAE,QAAQ,EACb;AACD,OAAI,GAAQ,OAAO;IACjB,IAAM,IAAM,EAAO;AACnB,MAAY;KACV,mBACE,EAAI,qBAAqB,EAAiB;KAC5C,WAAW,EAAI,aAAa,EAAiB;KAC7C,sBACE,EAAI,wBAAwB,EAAiB;KAChD,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,uBAE7B;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,EAAS;QAClB,WAAW,MACT,GAAa,OAAO;SAClB,GAAG;SACH,mBAAmB,EAAE,OAAO;SAC7B,EAAE;QAEL,WAAU;QACV,CAAA,CACI;;MACR,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,QAAD;QAAM,WAAU;kBAA4B;QAAiB,CAAA,EAC7D,kBAAC,SAAD;QACE,MAAK;QACL,SAAS,EAAS;QAClB,WAAW,MACT,GAAa,OAAO;SAAE,GAAG;SAAG,WAAW,EAAE,OAAO;SAAS,EAAE;QAE7D,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,EAAS;QAClB,WAAW,MACT,GAAa,OAAO;SAClB,GAAG;SACH,sBAAsB,EAAE,OAAO;SAChC,EAAE;QAEL,WAAU;QACV,CAAA,CACI;;MACJ;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,69 +1,79 @@
1
1
  import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
2
  import { getStatusColor as t } from "../../utils/helpers.js";
3
- import { PageLayout as n } from "../../components/PageLayout.js";
4
- import { LoadingSkeleton as r } from "../../components/LoadingSkeleton.js";
5
- import { useListConfigurationsQuery as i } from "../../../generated/wspace-operations.js";
6
- import { GitBranch as a, Plus as o, Zap as s } from "lucide-react";
7
- import { jsx as c, jsxs as l } from "react/jsx-runtime";
3
+ import { LoadingSkeleton as n } from "../../components/LoadingSkeleton.js";
4
+ import { useListConfigurationsQuery as r } from "../../../generated/wspace-operations.js";
5
+ import { PageLayout as i } from "../../components/PageLayout.js";
6
+ import { EmptyState as a } from "../../components/EmptyState.js";
7
+ import { GitBranch as o, Plus as s, Zap as c } from "lucide-react";
8
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
9
+ import { GlassCard as d } from "@burdenoff/fe-libs/ui";
8
10
  //#region src/timecampus/pages/workflows/WorkflowsPage.tsx
9
- function u() {
10
- let { workspaceId: u = "" } = e(), { data: d, loading: f, error: p } = i({ variables: { scope: "WORKSPACE" } }), m = (d?.configurations ?? []).filter((e) => e.key.startsWith("workflow."));
11
- return f ? /* @__PURE__ */ c(n, {
11
+ function f() {
12
+ let { workspaceId: f = "" } = e(), { data: p, loading: m, error: h } = r({ variables: { scope: "WORKSPACE" } }), g = (p?.configurations ?? []).filter((e) => e.key.startsWith("workflow."));
13
+ return m ? /* @__PURE__ */ l(i, {
12
14
  title: "Workflows",
13
15
  description: "Automate repetitive tasks",
14
- children: /* @__PURE__ */ c(r, {
16
+ children: /* @__PURE__ */ l(n, {
15
17
  variant: "list",
16
18
  count: 5
17
19
  })
18
- }) : p ? /* @__PURE__ */ c(n, {
20
+ }) : h ? /* @__PURE__ */ l(i, {
19
21
  title: "Workflows",
20
22
  description: "Automate repetitive tasks",
21
- children: /* @__PURE__ */ c("div", {
22
- className: "rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400",
23
+ children: /* @__PURE__ */ l("div", {
24
+ className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
23
25
  children: "Failed to load workflow configurations. Please try again later."
24
26
  })
25
- }) : /* @__PURE__ */ c(n, {
27
+ }) : /* @__PURE__ */ l(i, {
26
28
  title: "Workflows",
27
29
  description: "Automate repetitive tasks",
28
- actions: /* @__PURE__ */ l("button", {
30
+ purpose: "Put the busywork on autopilot — auto-start timers, submit timesheets, notify on overruns — by wiring up rules that react to what happens in TimeCampus, so the routine handles itself.",
31
+ actions: /* @__PURE__ */ u("button", {
29
32
  className: "inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90",
30
- children: [/* @__PURE__ */ c(o, { className: "h-4 w-4" }), "Create Workflow"]
33
+ children: [/* @__PURE__ */ l(s, { className: "h-4 w-4" }), "Create Workflow"]
31
34
  }),
32
- children: /* @__PURE__ */ c("div", {
33
- className: "rounded-xl border border-border-subtle bg-bg-surface",
34
- children: /* @__PURE__ */ c("div", {
35
+ children: g.length === 0 ? /* @__PURE__ */ l(a, {
36
+ illustration: "empty-generic",
37
+ title: "No workflows configured yet",
38
+ description: "Create your first automation to handle repetitive time-tracking tasks — workflows are stored as workspace configurations and appear here.",
39
+ action: /* @__PURE__ */ u("button", {
40
+ className: "inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90",
41
+ children: [/* @__PURE__ */ l(s, { className: "h-4 w-4" }), "Create Workflow"]
42
+ })
43
+ }) : /* @__PURE__ */ l(d, {
44
+ treatment: "glass",
45
+ glow: !0,
46
+ className: "overflow-hidden",
47
+ children: /* @__PURE__ */ l("div", {
35
48
  className: "divide-y divide-border",
36
- children: m.length === 0 ? /* @__PURE__ */ c("div", {
37
- className: "p-8 text-center text-sm text-text-secondary",
38
- children: "No workflows configured yet. Workflows are stored as workspace configurations with the \"workflow.\" key prefix."
39
- }) : m.map((e) => {
40
- let n = e.value, r = n.name ?? e.key.replace("workflow.", ""), i = n.status ?? "inactive", o = n.trigger ?? "Manual", u = n.lastRun ?? "Never", d = n.runCount ?? 0, f = n.successRate ?? 0;
41
- return /* @__PURE__ */ l("div", {
49
+ children: g.map((e) => {
50
+ let n = e.value, r = n.name ?? e.key.replace("workflow.", ""), i = n.status ?? "inactive", a = n.trigger ?? "Manual", s = n.lastRun ?? "Never", d = n.runCount ?? 0, f = n.successRate ?? 0;
51
+ return /* @__PURE__ */ u("div", {
42
52
  className: "flex items-center justify-between p-4 hover:bg-bg-sunken/50 transition-colors cursor-pointer",
43
- children: [/* @__PURE__ */ l("div", {
53
+ children: [/* @__PURE__ */ u("div", {
44
54
  className: "flex items-center gap-3",
45
- children: [/* @__PURE__ */ c("div", {
55
+ children: [/* @__PURE__ */ l("div", {
46
56
  className: "flex h-9 w-9 items-center justify-center rounded-lg bg-action-primary-bg/10",
47
- children: /* @__PURE__ */ c(a, { className: "h-4 w-4 text-primary" })
48
- }), /* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("p", {
57
+ children: /* @__PURE__ */ l(o, { className: "h-4 w-4 text-primary" })
58
+ }), /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("p", {
49
59
  className: "text-sm font-medium text-text-primary",
50
60
  children: r
51
- }), /* @__PURE__ */ l("p", {
61
+ }), /* @__PURE__ */ u("p", {
52
62
  className: "text-xs text-text-secondary",
53
63
  children: [
54
- /* @__PURE__ */ c(s, { className: "inline h-3 w-3" }),
64
+ /* @__PURE__ */ l(c, { className: "inline h-3 w-3" }),
55
65
  " ",
56
- o,
66
+ a,
57
67
  " · Last run: ",
58
- u
68
+ s
59
69
  ]
60
70
  })] })]
61
- }), /* @__PURE__ */ l("div", {
71
+ }), /* @__PURE__ */ u("div", {
62
72
  className: "flex items-center gap-4",
63
- children: [/* @__PURE__ */ l("div", {
73
+ children: [/* @__PURE__ */ u("div", {
64
74
  className: "text-right text-xs text-text-secondary",
65
- children: [/* @__PURE__ */ l("p", { children: [d, " runs"] }), /* @__PURE__ */ l("p", { children: [f, "% success"] })]
66
- }), /* @__PURE__ */ c("span", {
75
+ children: [/* @__PURE__ */ u("p", { children: [d, " runs"] }), /* @__PURE__ */ u("p", { children: [f, "% success"] })]
76
+ }), /* @__PURE__ */ l("span", {
67
77
  className: `inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${t(i)}`,
68
78
  children: i
69
79
  })]
@@ -75,6 +85,6 @@ function u() {
75
85
  });
76
86
  }
77
87
  //#endregion
78
- export { u as WorkflowsPage };
88
+ export { f as WorkflowsPage };
79
89
 
80
90
  //# sourceMappingURL=WorkflowsPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowsPage.js","names":[],"sources":["../../../../src/timecampus/pages/workflows/WorkflowsPage.tsx"],"sourcesContent":["import { GitBranch, Plus, Zap } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { getStatusColor } from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListConfigurationsQuery,\n type ConfigurationFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function WorkflowsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useListConfigurationsQuery({\n variables: { scope: \"WORKSPACE\" as any },\n });\n\n const configurations = data?.configurations ?? [];\n\n // Filter configurations that represent workflows (key starts with 'workflow.')\n const workflows = configurations.filter((c: ConfigurationFieldsFragment) =>\n c.key.startsWith(\"workflow.\"),\n );\n\n if (loading) {\n return (\n <PageLayout title=\"Workflows\" description=\"Automate repetitive tasks\">\n <LoadingSkeleton variant=\"list\" count={5} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout title=\"Workflows\" description=\"Automate repetitive tasks\">\n <div className=\"rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400\">\n Failed to load workflow configurations. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Workflows\"\n description=\"Automate repetitive tasks\"\n actions={\n <button className=\"inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\">\n <Plus className=\"h-4 w-4\" />\n Create Workflow\n </button>\n }\n >\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface\">\n <div className=\"divide-y divide-border\">\n {workflows.length === 0 ? (\n <div className=\"p-8 text-center text-sm text-text-secondary\">\n No workflows configured yet. Workflows are stored as workspace\n configurations with the \"workflow.\" key prefix.\n </div>\n ) : (\n workflows.map((wf: ConfigurationFieldsFragment) => {\n const val = wf.value as Record<string, unknown>;\n const name =\n (val.name as string) ?? wf.key.replace(\"workflow.\", \"\");\n const status = (val.status as string) ?? \"inactive\";\n const trigger = (val.trigger as string) ?? \"Manual\";\n const lastRun = (val.lastRun as string) ?? \"Never\";\n const runCount = (val.runCount as number) ?? 0;\n const successRate = (val.successRate as number) ?? 0;\n\n return (\n <div\n key={wf.id}\n className=\"flex items-center justify-between p-4 hover:bg-bg-sunken/50 transition-colors cursor-pointer\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-9 w-9 items-center justify-center rounded-lg bg-action-primary-bg/10\">\n <GitBranch className=\"h-4 w-4 text-primary\" />\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">\n {name}\n </p>\n <p className=\"text-xs text-text-secondary\">\n <Zap className=\"inline h-3 w-3\" /> {trigger} &middot;\n Last run: {lastRun}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-4\">\n <div className=\"text-right text-xs text-text-secondary\">\n <p>{runCount} runs</p>\n <p>{successRate}% success</p>\n </div>\n <span\n className={`inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${getStatusColor(status)}`}\n >\n {status}\n </span>\n </div>\n </div>\n );\n })\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAUA,SAAgB,IAAgB;CAC9B,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAA2B,EAC1D,WAAW,EAAE,OAAO,aAAoB,EACzC,CAAC,EAKI,KAHiB,GAAM,kBAAkB,EAAE,EAGhB,QAAQ,MACvC,EAAE,IAAI,WAAW,YAAY,CAC9B;AAoBD,QAlBI,IAEA,kBAAC,GAAD;EAAY,OAAM;EAAY,aAAY;YACxC,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,IAEA,kBAAC,GAAD;EAAY,OAAM;EAAY,aAAY;YACxC,kBAAC,OAAD;GAAK,WAAU;aAA+H;GAExI,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,kBAErB;;YAGX,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAU,WAAW,IACpB,kBAAC,OAAD;KAAK,WAAU;eAA8C;KAGvD,CAAA,GAEN,EAAU,KAAK,MAAoC;KACjD,IAAM,IAAM,EAAG,OACT,IACH,EAAI,QAAmB,EAAG,IAAI,QAAQ,aAAa,GAAG,EACnD,IAAU,EAAI,UAAqB,YACnC,IAAW,EAAI,WAAsB,UACrC,IAAW,EAAI,WAAsB,SACrC,IAAY,EAAI,YAAuB,GACvC,IAAe,EAAI,eAA0B;AAEnD,YACE,kBAAC,OAAD;MAEE,WAAU;gBAFZ,CAIE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD,EAAW,WAAU,wBAAyB,CAAA;QAC1C,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV;QACC,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBAAb;SACE,kBAAC,GAAD,EAAK,WAAU,kBAAmB,CAAA;;SAAE;SAAQ;SACjC;SACT;UACA,EAAA,CAAA,CACF;UACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,KAAD,EAAA,UAAA,CAAI,GAAS,QAAS,EAAA,CAAA,EACtB,kBAAC,KAAD,EAAA,UAAA,CAAI,GAAY,YAAa,EAAA,CAAA,CACzB;WACN,kBAAC,QAAD;QACE,WAAW,4DAA4D,EAAe,EAAO;kBAE5F;QACI,CAAA,CACH;SACF;QA5BC,EAAG,GA4BJ;MAER;IAEA,CAAA;GACF,CAAA;EACK,CAAA"}
1
+ {"version":3,"file":"WorkflowsPage.js","names":[],"sources":["../../../../src/timecampus/pages/workflows/WorkflowsPage.tsx"],"sourcesContent":["import { GitBranch, Plus, Zap } from \"lucide-react\";\nimport { GlassCard } from \"@burdenoff/fe-libs/ui\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { EmptyState } from \"../../components/EmptyState\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { getStatusColor } from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListConfigurationsQuery,\n type ConfigurationFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function WorkflowsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useListConfigurationsQuery({\n variables: { scope: \"WORKSPACE\" as any },\n });\n\n const configurations = data?.configurations ?? [];\n\n // Filter configurations that represent workflows (key starts with 'workflow.')\n const workflows = configurations.filter((c: ConfigurationFieldsFragment) =>\n c.key.startsWith(\"workflow.\"),\n );\n\n if (loading) {\n return (\n <PageLayout title=\"Workflows\" description=\"Automate repetitive tasks\">\n <LoadingSkeleton variant=\"list\" count={5} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout title=\"Workflows\" description=\"Automate repetitive tasks\">\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 workflow configurations. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Workflows\"\n description=\"Automate repetitive tasks\"\n purpose=\"Put the busywork on autopilot — auto-start timers, submit timesheets, notify on overruns — by wiring up rules that react to what happens in TimeCampus, so the routine handles itself.\"\n actions={\n <button className=\"inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\">\n <Plus className=\"h-4 w-4\" />\n Create Workflow\n </button>\n }\n >\n {workflows.length === 0 ? (\n <EmptyState\n illustration=\"empty-generic\"\n title=\"No workflows configured yet\"\n description=\"Create your first automation to handle repetitive time-tracking tasks — workflows are stored as workspace configurations and appear here.\"\n action={\n <button className=\"inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\">\n <Plus className=\"h-4 w-4\" />\n Create Workflow\n </button>\n }\n />\n ) : (\n <GlassCard treatment=\"glass\" glow className=\"overflow-hidden\">\n <div className=\"divide-y divide-border\">\n {workflows.map((wf: ConfigurationFieldsFragment) => {\n const val = wf.value as Record<string, unknown>;\n const name =\n (val.name as string) ?? wf.key.replace(\"workflow.\", \"\");\n const status = (val.status as string) ?? \"inactive\";\n const trigger = (val.trigger as string) ?? \"Manual\";\n const lastRun = (val.lastRun as string) ?? \"Never\";\n const runCount = (val.runCount as number) ?? 0;\n const successRate = (val.successRate as number) ?? 0;\n\n return (\n <div\n key={wf.id}\n className=\"flex items-center justify-between p-4 hover:bg-bg-sunken/50 transition-colors cursor-pointer\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-9 w-9 items-center justify-center rounded-lg bg-action-primary-bg/10\">\n <GitBranch className=\"h-4 w-4 text-primary\" />\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">\n {name}\n </p>\n <p className=\"text-xs text-text-secondary\">\n <Zap className=\"inline h-3 w-3\" /> {trigger} &middot;\n Last run: {lastRun}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-4\">\n <div className=\"text-right text-xs text-text-secondary\">\n <p>{runCount} runs</p>\n <p>{successRate}% success</p>\n </div>\n <span\n className={`inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${getStatusColor(status)}`}\n >\n {status}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n </GlassCard>\n )}\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;AAYA,SAAgB,IAAgB;CAC9B,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAA2B,EAC1D,WAAW,EAAE,OAAO,aAAoB,EACzC,CAAC,EAKI,KAHiB,GAAM,kBAAkB,EAAE,EAGhB,QAAQ,MACvC,EAAE,IAAI,WAAW,YAAY,CAC9B;AAoBD,QAlBI,IAEA,kBAAC,GAAD;EAAY,OAAM;EAAY,aAAY;YACxC,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,IAEA,kBAAC,GAAD;EAAY,OAAM;EAAY,aAAY;YACxC,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SAAQ;EACR,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,kBAErB;;YAGV,EAAU,WAAW,IACpB,kBAAC,GAAD;GACE,cAAa;GACb,OAAM;GACN,aAAY;GACZ,QACE,kBAAC,UAAD;IAAQ,WAAU;cAAlB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,kBAErB;;GAEX,CAAA,GAEF,kBAAC,GAAD;GAAW,WAAU;GAAQ,MAAA;GAAK,WAAU;aAC1C,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAU,KAAK,MAAoC;KAClD,IAAM,IAAM,EAAG,OACT,IACH,EAAI,QAAmB,EAAG,IAAI,QAAQ,aAAa,GAAG,EACnD,IAAU,EAAI,UAAqB,YACnC,IAAW,EAAI,WAAsB,UACrC,IAAW,EAAI,WAAsB,SACrC,IAAY,EAAI,YAAuB,GACvC,IAAe,EAAI,eAA0B;AAEnD,YACE,kBAAC,OAAD;MAEE,WAAU;gBAFZ,CAIE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD,EAAW,WAAU,wBAAyB,CAAA;QAC1C,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV;QACC,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBAAb;SACE,kBAAC,GAAD,EAAK,WAAU,kBAAmB,CAAA;;SAAE;SAAQ;SACjC;SACT;UACA,EAAA,CAAA,CACF;UACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,KAAD,EAAA,UAAA,CAAI,GAAS,QAAS,EAAA,CAAA,EACtB,kBAAC,KAAD,EAAA,UAAA,CAAI,GAAY,YAAa,EAAA,CAAA,CACzB;WACN,kBAAC,QAAD;QACE,WAAW,4DAA4D,EAAe,EAAO;kBAE5F;QACI,CAAA,CACH;SACF;QA5BC,EAAG,GA4BJ;MAER;IACE,CAAA;GACI,CAAA;EAEH,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-timecampus",
3
- "version": "2026.624.1",
3
+ "version": "2026.626.1",
4
4
  "description": "Burdenoff TimeCampus Microfrontend - AI-powered time management and productivity platform",
5
5
  "type": "module",
6
6
  "files": [
@@ -40,7 +40,7 @@
40
40
  },
41
41
  "dependencies": {
42
42
  "@apollo/client": "^4.0.11",
43
- "@burdenoff/fe-libs": "2026.518.7",
43
+ "@burdenoff/fe-libs": "2026.625.5",
44
44
  "clsx": "^2.1.1",
45
45
  "date-fns": "^4.1.0",
46
46
  "graphql": "^16.12.0",