@burdenoff/microfe-timecampus 2026.626.2 → 2026.703.2

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 (93) hide show
  1. package/dist/generated/wspace-operations.js +996 -816
  2. package/dist/generated/wspace-operations.js.map +1 -1
  3. package/dist/generated/wspace-types.js +28 -0
  4. package/dist/generated/wspace-types.js.map +1 -0
  5. package/dist/index.js +4 -4
  6. package/dist/timecampus/TimeCampusRoutes.js +16 -12
  7. package/dist/timecampus/TimeCampusRoutes.js.map +1 -1
  8. package/dist/timecampus/components/Modal.js +65 -0
  9. package/dist/timecampus/components/Modal.js.map +1 -0
  10. package/dist/timecampus/components/StatusBadge.js +28 -0
  11. package/dist/timecampus/components/StatusBadge.js.map +1 -0
  12. package/dist/timecampus/components/Toast.js +87 -0
  13. package/dist/timecampus/components/Toast.js.map +1 -0
  14. package/dist/timecampus/index.js +1 -1
  15. package/dist/timecampus/pages/HomePage.js +143 -135
  16. package/dist/timecampus/pages/HomePage.js.map +1 -1
  17. package/dist/timecampus/pages/applets/AppletStorePage.js +14 -19
  18. package/dist/timecampus/pages/applets/AppletStorePage.js.map +1 -1
  19. package/dist/timecampus/pages/applets/InstalledAppletsPage.js +49 -37
  20. package/dist/timecampus/pages/applets/InstalledAppletsPage.js.map +1 -1
  21. package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js +315 -87
  22. package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js.map +1 -1
  23. package/dist/timecampus/pages/channels/ChannelsPage.js +340 -46
  24. package/dist/timecampus/pages/channels/ChannelsPage.js.map +1 -1
  25. package/dist/timecampus/pages/client-portal/ClientPortalPage.js +374 -92
  26. package/dist/timecampus/pages/client-portal/ClientPortalPage.js.map +1 -1
  27. package/dist/timecampus/pages/dashboard/ReportsPage.js +70 -37
  28. package/dist/timecampus/pages/dashboard/ReportsPage.js.map +1 -1
  29. package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js +366 -60
  30. package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js.map +1 -1
  31. package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js +461 -87
  32. package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js.map +1 -1
  33. package/dist/timecampus/pages/geofencing/GeofencingPage.js +314 -55
  34. package/dist/timecampus/pages/geofencing/GeofencingPage.js.map +1 -1
  35. package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js +30 -27
  36. package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js.map +1 -1
  37. package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js +269 -74
  38. package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js.map +1 -1
  39. package/dist/timecampus/pages/meetings/ActionItemFormModal.js +127 -0
  40. package/dist/timecampus/pages/meetings/ActionItemFormModal.js.map +1 -0
  41. package/dist/timecampus/pages/meetings/MeetingCreatePage.js +62 -52
  42. package/dist/timecampus/pages/meetings/MeetingCreatePage.js.map +1 -1
  43. package/dist/timecampus/pages/meetings/MeetingDetailPage.js +361 -74
  44. package/dist/timecampus/pages/meetings/MeetingDetailPage.js.map +1 -1
  45. package/dist/timecampus/pages/meetings/MeetingFormModal.js +156 -0
  46. package/dist/timecampus/pages/meetings/MeetingFormModal.js.map +1 -0
  47. package/dist/timecampus/pages/meetings/MeetingsPage.js +175 -74
  48. package/dist/timecampus/pages/meetings/MeetingsPage.js.map +1 -1
  49. package/dist/timecampus/pages/meetings/ParticipantFormModal.js +105 -0
  50. package/dist/timecampus/pages/meetings/ParticipantFormModal.js.map +1 -0
  51. package/dist/timecampus/pages/pomodoro/PomodoroPage.js +307 -67
  52. package/dist/timecampus/pages/pomodoro/PomodoroPage.js.map +1 -1
  53. package/dist/timecampus/pages/projects/ProjectCreatePage.js +51 -48
  54. package/dist/timecampus/pages/projects/ProjectCreatePage.js.map +1 -1
  55. package/dist/timecampus/pages/projects/ProjectDetailPage.js +248 -51
  56. package/dist/timecampus/pages/projects/ProjectDetailPage.js.map +1 -1
  57. package/dist/timecampus/pages/projects/ProjectsPage.js +354 -87
  58. package/dist/timecampus/pages/projects/ProjectsPage.js.map +1 -1
  59. package/dist/timecampus/pages/projects/TasksPage.js +367 -65
  60. package/dist/timecampus/pages/projects/TasksPage.js.map +1 -1
  61. package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js +674 -104
  62. package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js.map +1 -1
  63. package/dist/timecampus/pages/team/TeamAnalyticsPage.js +46 -34
  64. package/dist/timecampus/pages/team/TeamAnalyticsPage.js.map +1 -1
  65. package/dist/timecampus/pages/team/TeamMembersPage.js +93 -69
  66. package/dist/timecampus/pages/team/TeamMembersPage.js.map +1 -1
  67. package/dist/timecampus/pages/team/TeamPage.js +4 -3
  68. package/dist/timecampus/pages/team/TeamPage.js.map +1 -1
  69. package/dist/timecampus/pages/templates/TemplateDetailPage.js +72 -53
  70. package/dist/timecampus/pages/templates/TemplateDetailPage.js.map +1 -1
  71. package/dist/timecampus/pages/templates/TemplatesPage.js +40 -35
  72. package/dist/timecampus/pages/templates/TemplatesPage.js.map +1 -1
  73. package/dist/timecampus/pages/time/TimeEntriesPage.js +484 -97
  74. package/dist/timecampus/pages/time/TimeEntriesPage.js.map +1 -1
  75. package/dist/timecampus/pages/time/TimeTrackingPage.js +210 -99
  76. package/dist/timecampus/pages/time/TimeTrackingPage.js.map +1 -1
  77. package/dist/timecampus/pages/time/TimerPage.js +229 -97
  78. package/dist/timecampus/pages/time/TimerPage.js.map +1 -1
  79. package/dist/timecampus/pages/time-approval/TimeApprovalPage.js +315 -110
  80. package/dist/timecampus/pages/time-approval/TimeApprovalPage.js.map +1 -1
  81. package/dist/timecampus/pages/timeline/TimelinePage.js +250 -0
  82. package/dist/timecampus/pages/timeline/TimelinePage.js.map +1 -0
  83. package/dist/timecampus/pages/widgets/WidgetDetailPage.js +158 -76
  84. package/dist/timecampus/pages/widgets/WidgetDetailPage.js.map +1 -1
  85. package/dist/timecampus/pages/widgets/WidgetsPage.js +181 -52
  86. package/dist/timecampus/pages/widgets/WidgetsPage.js.map +1 -1
  87. package/dist/timecampus/pages/workflows/WorkflowsPage.js +212 -61
  88. package/dist/timecampus/pages/workflows/WorkflowsPage.js.map +1 -1
  89. package/dist/timecampus/store/timecampusStore.js +13 -1
  90. package/dist/timecampus/store/timecampusStore.js.map +1 -1
  91. package/dist/timecampus/utils/helpers.js +20 -10
  92. package/dist/timecampus/utils/helpers.js.map +1 -1
  93. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AppletStorePage.js","names":[],"sources":["../../../../src/timecampus/pages/applets/AppletStorePage.tsx"],"sourcesContent":["import { Puzzle, Star, Download } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { EmptyState } from \"../../components/EmptyState\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListConfigurationsQuery,\n type ConfigurationFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function AppletStorePage() {\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 store/available applets (key starts with 'applet.store.')\n const storeApplets = configurations.filter((c: ConfigurationFieldsFragment) =>\n c.key.startsWith(\"applet.store.\"),\n );\n\n if (loading) {\n return (\n <PageLayout\n title=\"Applet Store\"\n description=\"Browse and install applets to extend TimeCampus\"\n >\n <LoadingSkeleton variant=\"card\" count={6} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Applet Store\"\n description=\"Browse and install applets to extend TimeCampus\"\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 applet store data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Applet Store\"\n description=\"Browse and install applets to extend TimeCampus\"\n purpose=\"Discover optional add-ons that extend TimeCampus — integrations, extra trackers and views — and install the ones your workflow needs instead of living with a one-size-fits-all setup.\"\n >\n {storeApplets.length === 0 ? (\n <EmptyState\n illustration=\"empty-generic\"\n title=\"No applets available yet\"\n description=\"Store applets are managed as workspace configurations with the 'applet.store.' key prefix — once published, they'll appear here to browse and install.\"\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {storeApplets.map((applet: ConfigurationFieldsFragment) => {\n const val = applet.value as Record<string, unknown>;\n const name =\n (val.name as string) ?? applet.key.replace(\"applet.store.\", \"\");\n const description =\n applet.description ?? (val.description as string) ?? \"\";\n const category = (val.category as string) ?? \"general\";\n const rating = (val.rating as number) ?? 0;\n const downloads = (val.downloads as number) ?? 0;\n\n return (\n <div\n key={applet.id}\n className=\"rounded-xl border border-border-seam bg-gloss-card shadow-pop p-5 transition-colors hover:bg-bg-sunken/50 cursor-pointer\"\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-xl bg-action-primary-bg/10\">\n <Puzzle className=\"h-6 w-6 text-primary\" />\n </div>\n <div className=\"flex-1\">\n <p className=\"text-sm font-semibold text-text-primary\">\n {name}\n </p>\n <p className=\"text-xs text-text-secondary\">{description}</p>\n </div>\n </div>\n <div className=\"mt-3 flex items-center justify-between\">\n <div className=\"flex items-center gap-3 text-xs text-text-secondary\">\n <div className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 fill-amber-400 text-status-warning-text\" />\n <span>{rating}</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <Download className=\"h-3 w-3\" />\n <span>{downloads}</span>\n </div>\n </div>\n <button className=\"rounded-md bg-action-primary-bg px-3 py-1 text-xs font-medium text-action-primary-text hover:bg-action-primary-bg/90\">\n Install\n </button>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAUA,SAAgB,IAAkB;CAChC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAA2B,EAC1D,WAAW,EAAE,OAAO,aAAoB,EACzC,CAAC,EAKI,KAHiB,GAAM,kBAAkB,EAAE,EAGb,QAAQ,MAC1C,EAAE,IAAI,WAAW,gBAAgB,CAClC;AA0BD,QAxBI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SAAQ;YAEP,EAAa,WAAW,IACvB,kBAAC,GAAD;GACE,cAAa;GACb,OAAM;GACN,aAAY;GACZ,CAAA,GAEF,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAa,KAAK,MAAwC;IACzD,IAAM,IAAM,EAAO,OACb,IACH,EAAI,QAAmB,EAAO,IAAI,QAAQ,iBAAiB,GAAG,EAC3D,IACJ,EAAO,eAAgB,EAAI,eAA0B;AACrC,MAAI;IACtB,IAAM,IAAU,EAAI,UAAqB,GACnC,IAAa,EAAI,aAAwB;AAE/C,WACE,kBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,GAAD,EAAQ,WAAU,wBAAyB,CAAA;OACvC,CAAA,EACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV;QACC,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBAA+B;QAAgB,CAAA,CACxD;SACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD,EAAM,WAAU,mDAAoD,CAAA,EACpE,kBAAC,QAAD,EAAA,UAAO,GAAc,CAAA,CACjB;WACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAChC,kBAAC,QAAD,EAAA,UAAO,GAAiB,CAAA,CACpB;UACF;UACN,kBAAC,UAAD;OAAQ,WAAU;iBAAuH;OAEhI,CAAA,CACL;QACF;OA7BC,EAAO,GA6BR;KAER;GACE,CAAA;EAEG,CAAA"}
1
+ {"version":3,"file":"AppletStorePage.js","names":[],"sources":["../../../../src/timecampus/pages/applets/AppletStorePage.tsx"],"sourcesContent":["import { Puzzle, Store as StoreIcon } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { EmptyState } from \"../../components/EmptyState\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampusNavigate } from \"../../providers/TimeCampusProvider\";\nimport {\n useListConfigurationsQuery,\n type ConfigurationFieldsFragment,\n} from \"@/generated/wspace-operations\";\nimport { TimeCampusConfigScope } from \"@/generated/wspace-types\";\n\nexport function AppletStorePage() {\n const navigate = useTimeCampusNavigate();\n\n const { data, loading, error } = useListConfigurationsQuery({\n variables: { scope: TimeCampusConfigScope.Workspace },\n });\n\n const configurations = data?.configurations ?? [];\n\n // Filter configurations that represent store/available applets (key starts with 'applet.store.')\n const storeApplets = configurations.filter((c: ConfigurationFieldsFragment) =>\n c.key.startsWith(\"applet.store.\"),\n );\n\n if (loading) {\n return (\n <PageLayout\n title=\"Applet Store\"\n description=\"Browse and install applets to extend TimeCampus\"\n >\n <LoadingSkeleton variant=\"card\" count={6} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Applet Store\"\n description=\"Browse and install applets to extend TimeCampus\"\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 applet store data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Applet Store\"\n description=\"Browse and install applets to extend TimeCampus\"\n purpose=\"Discover optional add-ons that extend TimeCampus — integrations, extra trackers and views — and install the ones your workflow needs instead of living with a one-size-fits-all setup.\"\n >\n {storeApplets.length === 0 ? (\n <EmptyState\n illustration=\"empty-generic\"\n title=\"No applets available yet\"\n description=\"Store applets are managed as workspace configurations with the 'applet.store.' key prefix — once published, they'll appear here to browse and install.\"\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {storeApplets.map((applet: ConfigurationFieldsFragment) => {\n const val = applet.value as Record<string, unknown>;\n const name =\n (val.name as string) ?? applet.key.replace(\"applet.store.\", \"\");\n const description =\n applet.description ?? (val.description as string) ?? \"\";\n const category = (val.category as string) ?? \"general\";\n\n return (\n <div\n key={applet.id}\n className=\"rounded-xl border border-border-seam bg-gloss-card shadow-pop p-5 transition-colors hover:bg-bg-sunken/50\"\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-xl bg-action-primary-bg/10\">\n <Puzzle className=\"h-6 w-6 text-primary\" />\n </div>\n <div className=\"flex-1\">\n <p className=\"text-sm font-semibold text-text-primary\">\n {name}\n </p>\n <p className=\"text-xs text-text-secondary\">{description}</p>\n </div>\n </div>\n <div className=\"mt-3 flex items-center justify-between\">\n <span className=\"inline-flex rounded-full bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary\">\n {category}\n </span>\n <button\n type=\"button\"\n onClick={() => navigate(\"/store\")}\n className=\"inline-flex items-center gap-1 rounded-md bg-action-primary-bg px-3 py-1 text-xs font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n <StoreIcon className=\"h-3 w-3\" />\n Get it\n </button>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AAWA,SAAgB,IAAkB;CAChC,IAAM,IAAW,GAAuB,EAElC,EAAE,SAAM,YAAS,aAAU,EAA2B,EAC1D,WAAW,EAAE,OAAO,EAAsB,WAAW,EACtD,CAAC,EAKI,KAHiB,GAAM,kBAAkB,EAAE,EAGb,QAAQ,MAC1C,EAAE,IAAI,WAAW,gBAAgB,CAClC;AA0BD,QAxBI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SAAQ;YAEP,EAAa,WAAW,IACvB,kBAAC,GAAD;GACE,cAAa;GACb,OAAM;GACN,aAAY;GACZ,CAAA,GAEF,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAa,KAAK,MAAwC;IACzD,IAAM,IAAM,EAAO,OACb,IACH,EAAI,QAAmB,EAAO,IAAI,QAAQ,iBAAiB,GAAG,EAC3D,IACJ,EAAO,eAAgB,EAAI,eAA0B,IACjD,IAAY,EAAI,YAAuB;AAE7C,WACE,kBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,GAAD,EAAQ,WAAU,wBAAyB,CAAA;OACvC,CAAA,EACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV;QACC,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBAA+B;QAAgB,CAAA,CACxD;SACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBACb;OACI,CAAA,EACP,kBAAC,UAAD;OACE,MAAK;OACL,eAAe,EAAS,SAAS;OACjC,WAAU;iBAHZ,CAKE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,SAE1B;SACL;QACF;OA3BC,EAAO,GA2BR;KAER;GACE,CAAA;EAEG,CAAA"}
@@ -1,89 +1,101 @@
1
- import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
- import { getStatusColor as t } from "../../utils/helpers.js";
3
- import { LoadingSkeleton as n } from "../../components/LoadingSkeleton.js";
4
- import { useListConfigurationsQuery as r } from "../../../generated/wspace-operations.js";
1
+ import { getStatusColor as e } from "../../utils/helpers.js";
2
+ import { LoadingSkeleton as t } from "../../components/LoadingSkeleton.js";
3
+ import { useDeleteConfigurationMutation as n, useListConfigurationsQuery as r } from "../../../generated/wspace-operations.js";
5
4
  import { PageLayout as i } from "../../components/PageLayout.js";
6
5
  import { EmptyState as a } from "../../components/EmptyState.js";
7
- import { Puzzle as o, Settings as s } from "lucide-react";
8
- import { jsx as c, jsxs as l } from "react/jsx-runtime";
9
- import { GlassCard as u } from "@burdenoff/fe-libs/ui";
6
+ import { TimeCampusConfigScope as o } from "../../../generated/wspace-types.js";
7
+ import { useState as s } from "react";
8
+ import { Puzzle as c, Trash2 as l } from "lucide-react";
9
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
10
+ import { GlassCard as f } from "@burdenoff/fe-libs/ui";
10
11
  //#region src/timecampus/pages/applets/InstalledAppletsPage.tsx
11
- function d() {
12
- let { workspaceId: d = "" } = e(), { data: f, loading: p, error: m } = r({ variables: { scope: "WORKSPACE" } }), h = (f?.configurations ?? []).filter((e) => e.key.startsWith("applet.installed."));
13
- return p ? /* @__PURE__ */ c(i, {
12
+ function p() {
13
+ let { data: p, loading: m, error: h, refetch: g } = r({ variables: { scope: o.Workspace } }), [_] = n(), [v, y] = s(null), b = async (e) => {
14
+ y(e);
15
+ try {
16
+ await _({ variables: { id: e } }), await g();
17
+ } finally {
18
+ y(null);
19
+ }
20
+ }, x = (p?.configurations ?? []).filter((e) => e.key.startsWith("applet.installed."));
21
+ return m ? /* @__PURE__ */ u(i, {
14
22
  title: "Installed Applets",
15
23
  description: "Manage your installed applets and integrations",
16
- children: /* @__PURE__ */ c(n, {
24
+ children: /* @__PURE__ */ u(t, {
17
25
  variant: "list",
18
26
  count: 5
19
27
  })
20
- }) : m ? /* @__PURE__ */ c(i, {
28
+ }) : h ? /* @__PURE__ */ u(i, {
21
29
  title: "Installed Applets",
22
30
  description: "Manage your installed applets and integrations",
23
- children: /* @__PURE__ */ c("div", {
31
+ children: /* @__PURE__ */ u("div", {
24
32
  className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
25
33
  children: "Failed to load installed applets. Please try again later."
26
34
  })
27
- }) : /* @__PURE__ */ c(i, {
35
+ }) : /* @__PURE__ */ u(i, {
28
36
  title: "Installed Applets",
29
37
  description: "Manage your installed applets and integrations",
30
38
  purpose: "See and manage every add-on running in your workspace — enable, configure or update them in one place so you stay in control of how TimeCampus is extended.",
31
- children: h.length === 0 ? /* @__PURE__ */ c(a, {
39
+ children: x.length === 0 ? /* @__PURE__ */ u(a, {
32
40
  illustration: "empty-generic",
33
41
  title: "No applets installed yet",
34
42
  description: "Browse the applet store to add integrations and trackers — installed applets are stored as workspace configurations and appear here."
35
- }) : /* @__PURE__ */ c(u, {
43
+ }) : /* @__PURE__ */ u(f, {
36
44
  treatment: "glass",
37
45
  glow: !0,
38
46
  className: "overflow-hidden",
39
- children: /* @__PURE__ */ c("div", {
47
+ children: /* @__PURE__ */ u("div", {
40
48
  className: "divide-y divide-border",
41
- children: h.map((e) => {
42
- let n = e.value, r = n.name ?? e.key.replace("applet.installed.", ""), i = n.category ?? "general", a = n.version ?? "1.0.0", u = n.author ?? "Unknown", d = n.isActive ?? !0, f = n.updateAvailable ?? !1;
43
- return /* @__PURE__ */ l("div", {
49
+ children: x.map((t) => {
50
+ let n = t.value, r = n.name ?? t.key.replace("applet.installed.", ""), i = n.category ?? "general", a = n.version ?? "1.0.0", o = n.author ?? "Unknown", s = n.isActive ?? !0, f = n.updateAvailable ?? !1;
51
+ return /* @__PURE__ */ d("div", {
44
52
  className: "flex items-center justify-between p-4 hover:bg-bg-sunken/50 transition-colors",
45
- children: [/* @__PURE__ */ l("div", {
53
+ children: [/* @__PURE__ */ d("div", {
46
54
  className: "flex items-center gap-3",
47
- children: [/* @__PURE__ */ c("div", {
55
+ children: [/* @__PURE__ */ u("div", {
48
56
  className: "flex h-10 w-10 items-center justify-center rounded-lg bg-action-primary-bg/10",
49
- children: /* @__PURE__ */ c(o, { className: "h-5 w-5 text-primary" })
50
- }), /* @__PURE__ */ l("div", { children: [/* @__PURE__ */ l("div", {
57
+ children: /* @__PURE__ */ u(c, { className: "h-5 w-5 text-primary" })
58
+ }), /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ d("div", {
51
59
  className: "flex items-center gap-2",
52
- children: [/* @__PURE__ */ c("p", {
60
+ children: [/* @__PURE__ */ u("p", {
53
61
  className: "text-sm font-medium text-text-primary",
54
62
  children: r
55
- }), f && /* @__PURE__ */ c("span", {
63
+ }), f && /* @__PURE__ */ u("span", {
56
64
  className: "inline-flex rounded-full bg-status-info-bg px-2 py-0.5 text-xs font-medium text-status-info-text",
57
65
  children: "Update"
58
66
  })]
59
- }), /* @__PURE__ */ l("p", {
67
+ }), /* @__PURE__ */ d("p", {
60
68
  className: "text-xs text-text-secondary",
61
69
  children: [
62
70
  "v",
63
71
  a,
64
72
  " · by ",
65
- u,
73
+ o,
66
74
  " · ",
67
75
  i
68
76
  ]
69
77
  })] })]
70
- }), /* @__PURE__ */ l("div", {
78
+ }), /* @__PURE__ */ d("div", {
71
79
  className: "flex items-center gap-2",
72
- children: [/* @__PURE__ */ c("span", {
73
- className: `inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${t(d ? "active" : "inactive")}`,
74
- children: d ? "Active" : "Disabled"
75
- }), /* @__PURE__ */ c("button", {
76
- className: "rounded-md p-1.5 hover:bg-bg-sunken",
77
- children: /* @__PURE__ */ c(s, { className: "h-4 w-4 text-text-secondary" })
80
+ children: [/* @__PURE__ */ u("span", {
81
+ className: `inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${e(s ? "active" : "inactive")}`,
82
+ children: s ? "Active" : "Disabled"
83
+ }), /* @__PURE__ */ u("button", {
84
+ type: "button",
85
+ "aria-label": `Uninstall ${r}`,
86
+ disabled: v === t.id,
87
+ onClick: () => void b(t.id),
88
+ className: "rounded-md p-1.5 text-text-secondary hover:bg-bg-sunken hover:text-status-error-text disabled:opacity-50",
89
+ children: /* @__PURE__ */ u(l, { className: "h-4 w-4" })
78
90
  })]
79
91
  })]
80
- }, e.id);
92
+ }, t.id);
81
93
  })
82
94
  })
83
95
  })
84
96
  });
85
97
  }
86
98
  //#endregion
87
- export { d as InstalledAppletsPage };
99
+ export { p as InstalledAppletsPage };
88
100
 
89
101
  //# sourceMappingURL=InstalledAppletsPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InstalledAppletsPage.js","names":[],"sources":["../../../../src/timecampus/pages/applets/InstalledAppletsPage.tsx"],"sourcesContent":["import { Puzzle, Settings } 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 InstalledAppletsPage() {\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 installed applets (key starts with 'applet.installed.')\n const applets = configurations.filter((c: ConfigurationFieldsFragment) =>\n c.key.startsWith(\"applet.installed.\"),\n );\n\n if (loading) {\n return (\n <PageLayout\n title=\"Installed Applets\"\n description=\"Manage your installed applets and integrations\"\n >\n <LoadingSkeleton variant=\"list\" count={5} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Installed Applets\"\n description=\"Manage your installed applets and integrations\"\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 installed applets. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Installed Applets\"\n description=\"Manage your installed applets and integrations\"\n purpose=\"See and manage every add-on running in your workspace — enable, configure or update them in one place so you stay in control of how TimeCampus is extended.\"\n >\n {applets.length === 0 ? (\n <EmptyState\n illustration=\"empty-generic\"\n title=\"No applets installed yet\"\n description=\"Browse the applet store to add integrations and trackers — installed applets are stored as workspace configurations and appear here.\"\n />\n ) : (\n <GlassCard treatment=\"glass\" glow className=\"overflow-hidden\">\n <div className=\"divide-y divide-border\">\n {applets.map((applet: ConfigurationFieldsFragment) => {\n const val = applet.value as Record<string, unknown>;\n const name =\n (val.name as string) ??\n applet.key.replace(\"applet.installed.\", \"\");\n const category = (val.category as string) ?? \"general\";\n const version = (val.version as string) ?? \"1.0.0\";\n const author = (val.author as string) ?? \"Unknown\";\n const isActive = (val.isActive as boolean) ?? true;\n const hasUpdate = (val.updateAvailable as boolean) ?? false;\n\n return (\n <div\n key={applet.id}\n className=\"flex items-center justify-between p-4 hover:bg-bg-sunken/50 transition-colors\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-action-primary-bg/10\">\n <Puzzle className=\"h-5 w-5 text-primary\" />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium text-text-primary\">\n {name}\n </p>\n {hasUpdate && (\n <span className=\"inline-flex rounded-full bg-status-info-bg px-2 py-0.5 text-xs font-medium text-status-info-text\">\n Update\n </span>\n )}\n </div>\n <p className=\"text-xs text-text-secondary\">\n v{version} &middot; by {author} &middot; {category}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <span\n className={`inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${getStatusColor(isActive ? \"active\" : \"inactive\")}`}\n >\n {isActive ? \"Active\" : \"Disabled\"}\n </span>\n <button className=\"rounded-md p-1.5 hover:bg-bg-sunken\">\n <Settings className=\"h-4 w-4 text-text-secondary\" />\n </button>\n </div>\n </div>\n );\n })}\n </div>\n </GlassCard>\n )}\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;AAYA,SAAgB,IAAuB;CACrC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAA2B,EAC1D,WAAW,EAAE,OAAO,aAAoB,EACzC,CAAC,EAKI,KAHiB,GAAM,kBAAkB,EAAE,EAGlB,QAAQ,MACrC,EAAE,IAAI,WAAW,oBAAoB,CACtC;AA0BD,QAxBI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SAAQ;YAEP,EAAQ,WAAW,IAClB,kBAAC,GAAD;GACE,cAAa;GACb,OAAM;GACN,aAAY;GACZ,CAAA,GAEF,kBAAC,GAAD;GAAW,WAAU;GAAQ,MAAA;GAAK,WAAU;aAC1C,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAQ,KAAK,MAAwC;KACpD,IAAM,IAAM,EAAO,OACb,IACH,EAAI,QACL,EAAO,IAAI,QAAQ,qBAAqB,GAAG,EACvC,IAAY,EAAI,YAAuB,WACvC,IAAW,EAAI,WAAsB,SACrC,IAAU,EAAI,UAAqB,WACnC,IAAY,EAAI,YAAwB,IACxC,IAAa,EAAI,mBAA+B;AAEtD,YACE,kBAAC,OAAD;MAEE,WAAU;gBAFZ,CAIE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD,EAAQ,WAAU,wBAAyB,CAAA;QACvC,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,KAAD;SAAG,WAAU;mBACV;SACC,CAAA,EACH,KACC,kBAAC,QAAD;SAAM,WAAU;mBAAmG;SAE5G,CAAA,CAEL;WACN,kBAAC,KAAD;QAAG,WAAU;kBAAb;SAA2C;SACvC;SAAQ;SAAc;SAAO;SAAW;SACxC;UACA,EAAA,CAAA,CACF;UACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QACE,WAAW,4DAA4D,EAAe,IAAW,WAAW,WAAW;kBAEtH,IAAW,WAAW;QAClB,CAAA,EACP,kBAAC,UAAD;QAAQ,WAAU;kBAChB,kBAAC,GAAD,EAAU,WAAU,+BAAgC,CAAA;QAC7C,CAAA,CACL;SACF;QAjCC,EAAO,GAiCR;MAER;IACE,CAAA;GACI,CAAA;EAEH,CAAA"}
1
+ {"version":3,"file":"InstalledAppletsPage.js","names":[],"sources":["../../../../src/timecampus/pages/applets/InstalledAppletsPage.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { Puzzle, Trash2 } 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 {\n useListConfigurationsQuery,\n useDeleteConfigurationMutation,\n type ConfigurationFieldsFragment,\n} from \"@/generated/wspace-operations\";\nimport { TimeCampusConfigScope } from \"@/generated/wspace-types\";\n\nexport function InstalledAppletsPage() {\n const { data, loading, error, refetch } = useListConfigurationsQuery({\n variables: { scope: TimeCampusConfigScope.Workspace },\n });\n const [deleteConfiguration] = useDeleteConfigurationMutation();\n const [uninstallingId, setUninstallingId] = useState<string | null>(null);\n\n const handleUninstall = async (id: string) => {\n setUninstallingId(id);\n try {\n await deleteConfiguration({ variables: { id } });\n await refetch();\n } finally {\n setUninstallingId(null);\n }\n };\n\n const configurations = data?.configurations ?? [];\n\n // Filter configurations that represent installed applets (key starts with 'applet.installed.')\n const applets = configurations.filter((c: ConfigurationFieldsFragment) =>\n c.key.startsWith(\"applet.installed.\"),\n );\n\n if (loading) {\n return (\n <PageLayout\n title=\"Installed Applets\"\n description=\"Manage your installed applets and integrations\"\n >\n <LoadingSkeleton variant=\"list\" count={5} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Installed Applets\"\n description=\"Manage your installed applets and integrations\"\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 installed applets. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Installed Applets\"\n description=\"Manage your installed applets and integrations\"\n purpose=\"See and manage every add-on running in your workspace — enable, configure or update them in one place so you stay in control of how TimeCampus is extended.\"\n >\n {applets.length === 0 ? (\n <EmptyState\n illustration=\"empty-generic\"\n title=\"No applets installed yet\"\n description=\"Browse the applet store to add integrations and trackers — installed applets are stored as workspace configurations and appear here.\"\n />\n ) : (\n <GlassCard treatment=\"glass\" glow className=\"overflow-hidden\">\n <div className=\"divide-y divide-border\">\n {applets.map((applet: ConfigurationFieldsFragment) => {\n const val = applet.value as Record<string, unknown>;\n const name =\n (val.name as string) ??\n applet.key.replace(\"applet.installed.\", \"\");\n const category = (val.category as string) ?? \"general\";\n const version = (val.version as string) ?? \"1.0.0\";\n const author = (val.author as string) ?? \"Unknown\";\n const isActive = (val.isActive as boolean) ?? true;\n const hasUpdate = (val.updateAvailable as boolean) ?? false;\n\n return (\n <div\n key={applet.id}\n className=\"flex items-center justify-between p-4 hover:bg-bg-sunken/50 transition-colors\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-action-primary-bg/10\">\n <Puzzle className=\"h-5 w-5 text-primary\" />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium text-text-primary\">\n {name}\n </p>\n {hasUpdate && (\n <span className=\"inline-flex rounded-full bg-status-info-bg px-2 py-0.5 text-xs font-medium text-status-info-text\">\n Update\n </span>\n )}\n </div>\n <p className=\"text-xs text-text-secondary\">\n v{version} &middot; by {author} &middot; {category}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <span\n className={`inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${getStatusColor(isActive ? \"active\" : \"inactive\")}`}\n >\n {isActive ? \"Active\" : \"Disabled\"}\n </span>\n <button\n type=\"button\"\n aria-label={`Uninstall ${name}`}\n disabled={uninstallingId === applet.id}\n onClick={() => void handleUninstall(applet.id)}\n className=\"rounded-md p-1.5 text-text-secondary hover:bg-bg-sunken hover:text-status-error-text disabled:opacity-50\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n );\n })}\n </div>\n </GlassCard>\n )}\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;AAcA,SAAgB,IAAuB;CACrC,IAAM,EAAE,SAAM,YAAS,UAAO,eAAY,EAA2B,EACnE,WAAW,EAAE,OAAO,EAAsB,WAAW,EACtD,CAAC,EACI,CAAC,KAAuB,GAAgC,EACxD,CAAC,GAAgB,KAAqB,EAAwB,KAAK,EAEnE,IAAkB,OAAO,MAAe;AAC5C,IAAkB,EAAG;AACrB,MAAI;AAEF,GADA,MAAM,EAAoB,EAAE,WAAW,EAAE,OAAI,EAAE,CAAC,EAChD,MAAM,GAAS;YACP;AACR,KAAkB,KAAK;;IAOrB,KAHiB,GAAM,kBAAkB,EAAE,EAGlB,QAAQ,MACrC,EAAE,IAAI,WAAW,oBAAoB,CACtC;AA0BD,QAxBI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SAAQ;YAEP,EAAQ,WAAW,IAClB,kBAAC,GAAD;GACE,cAAa;GACb,OAAM;GACN,aAAY;GACZ,CAAA,GAEF,kBAAC,GAAD;GAAW,WAAU;GAAQ,MAAA;GAAK,WAAU;aAC1C,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAQ,KAAK,MAAwC;KACpD,IAAM,IAAM,EAAO,OACb,IACH,EAAI,QACL,EAAO,IAAI,QAAQ,qBAAqB,GAAG,EACvC,IAAY,EAAI,YAAuB,WACvC,IAAW,EAAI,WAAsB,SACrC,IAAU,EAAI,UAAqB,WACnC,IAAY,EAAI,YAAwB,IACxC,IAAa,EAAI,mBAA+B;AAEtD,YACE,kBAAC,OAAD;MAEE,WAAU;gBAFZ,CAIE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD,EAAQ,WAAU,wBAAyB,CAAA;QACvC,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,KAAD;SAAG,WAAU;mBACV;SACC,CAAA,EACH,KACC,kBAAC,QAAD;SAAM,WAAU;mBAAmG;SAE5G,CAAA,CAEL;WACN,kBAAC,KAAD;QAAG,WAAU;kBAAb;SAA2C;SACvC;SAAQ;SAAc;SAAO;SAAW;SACxC;UACA,EAAA,CAAA,CACF;UACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QACE,WAAW,4DAA4D,EAAe,IAAW,WAAW,WAAW;kBAEtH,IAAW,WAAW;QAClB,CAAA,EACP,kBAAC,UAAD;QACE,MAAK;QACL,cAAY,aAAa;QACzB,UAAU,MAAmB,EAAO;QACpC,eAAe,KAAK,EAAgB,EAAO,GAAG;QAC9C,WAAU;kBAEV,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;QACvB,CAAA,CACL;SACF;QAvCC,EAAO,GAuCR;MAER;IACE,CAAA;GACI,CAAA;EAEH,CAAA"}