@burdenoff/microfe-timecampus 2026.703.1 → 2026.703.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generated/wspace-types.js +28 -0
- package/dist/generated/wspace-types.js.map +1 -0
- package/dist/index.js +4 -4
- package/dist/timecampus/components/Modal.js +65 -0
- package/dist/timecampus/components/Modal.js.map +1 -0
- package/dist/timecampus/components/StatusBadge.js +28 -0
- package/dist/timecampus/components/StatusBadge.js.map +1 -0
- package/dist/timecampus/components/Toast.js +87 -0
- package/dist/timecampus/components/Toast.js.map +1 -0
- package/dist/timecampus/index.js +1 -1
- package/dist/timecampus/pages/HomePage.js +143 -135
- package/dist/timecampus/pages/HomePage.js.map +1 -1
- package/dist/timecampus/pages/applets/AppletStorePage.js +14 -19
- package/dist/timecampus/pages/applets/AppletStorePage.js.map +1 -1
- package/dist/timecampus/pages/applets/InstalledAppletsPage.js +49 -37
- package/dist/timecampus/pages/applets/InstalledAppletsPage.js.map +1 -1
- package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js +315 -87
- package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js.map +1 -1
- package/dist/timecampus/pages/channels/ChannelsPage.js +340 -46
- package/dist/timecampus/pages/channels/ChannelsPage.js.map +1 -1
- package/dist/timecampus/pages/client-portal/ClientPortalPage.js +432 -118
- package/dist/timecampus/pages/client-portal/ClientPortalPage.js.map +1 -1
- package/dist/timecampus/pages/dashboard/ReportsPage.js +70 -37
- package/dist/timecampus/pages/dashboard/ReportsPage.js.map +1 -1
- package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js +366 -60
- package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js +562 -85
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/geofencing/GeofencingPage.js +314 -55
- package/dist/timecampus/pages/geofencing/GeofencingPage.js.map +1 -1
- package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js +30 -27
- package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js.map +1 -1
- package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js +269 -74
- package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/ActionItemFormModal.js +127 -0
- package/dist/timecampus/pages/meetings/ActionItemFormModal.js.map +1 -0
- package/dist/timecampus/pages/meetings/MeetingCreatePage.js +62 -52
- package/dist/timecampus/pages/meetings/MeetingCreatePage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingDetailPage.js +361 -74
- package/dist/timecampus/pages/meetings/MeetingDetailPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingFormModal.js +208 -0
- package/dist/timecampus/pages/meetings/MeetingFormModal.js.map +1 -0
- package/dist/timecampus/pages/meetings/MeetingsPage.js +175 -74
- package/dist/timecampus/pages/meetings/MeetingsPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/ParticipantFormModal.js +105 -0
- package/dist/timecampus/pages/meetings/ParticipantFormModal.js.map +1 -0
- package/dist/timecampus/pages/pomodoro/PomodoroPage.js +307 -67
- package/dist/timecampus/pages/pomodoro/PomodoroPage.js.map +1 -1
- package/dist/timecampus/pages/projects/ProjectCreatePage.js +51 -48
- package/dist/timecampus/pages/projects/ProjectCreatePage.js.map +1 -1
- package/dist/timecampus/pages/projects/ProjectDetailPage.js +248 -51
- package/dist/timecampus/pages/projects/ProjectDetailPage.js.map +1 -1
- package/dist/timecampus/pages/projects/ProjectsPage.js +354 -87
- package/dist/timecampus/pages/projects/ProjectsPage.js.map +1 -1
- package/dist/timecampus/pages/projects/TasksPage.js +367 -65
- package/dist/timecampus/pages/projects/TasksPage.js.map +1 -1
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js +674 -104
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamAnalyticsPage.js +46 -34
- package/dist/timecampus/pages/team/TeamAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamMembersPage.js +93 -69
- package/dist/timecampus/pages/team/TeamMembersPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamPage.js +4 -3
- package/dist/timecampus/pages/team/TeamPage.js.map +1 -1
- package/dist/timecampus/pages/templates/TemplateDetailPage.js +72 -53
- package/dist/timecampus/pages/templates/TemplateDetailPage.js.map +1 -1
- package/dist/timecampus/pages/templates/TemplatesPage.js +40 -35
- package/dist/timecampus/pages/templates/TemplatesPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimeEntriesPage.js +484 -97
- package/dist/timecampus/pages/time/TimeEntriesPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimeTrackingPage.js +210 -99
- package/dist/timecampus/pages/time/TimeTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimerPage.js +229 -97
- package/dist/timecampus/pages/time/TimerPage.js.map +1 -1
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.js +339 -110
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.js.map +1 -1
- package/dist/timecampus/pages/widgets/WidgetDetailPage.js +158 -76
- package/dist/timecampus/pages/widgets/WidgetDetailPage.js.map +1 -1
- package/dist/timecampus/pages/widgets/WidgetsPage.js +181 -52
- package/dist/timecampus/pages/widgets/WidgetsPage.js.map +1 -1
- package/dist/timecampus/pages/workflows/WorkflowsPage.js +212 -61
- package/dist/timecampus/pages/workflows/WorkflowsPage.js.map +1 -1
- package/dist/timecampus/store/timecampusStore.js +13 -1
- package/dist/timecampus/store/timecampusStore.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,89 +1,101 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
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 {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
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
|
|
12
|
-
let {
|
|
13
|
-
|
|
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__ */
|
|
24
|
+
children: /* @__PURE__ */ u(t, {
|
|
17
25
|
variant: "list",
|
|
18
26
|
count: 5
|
|
19
27
|
})
|
|
20
|
-
}) :
|
|
28
|
+
}) : h ? /* @__PURE__ */ u(i, {
|
|
21
29
|
title: "Installed Applets",
|
|
22
30
|
description: "Manage your installed applets and integrations",
|
|
23
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
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:
|
|
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__ */
|
|
43
|
+
}) : /* @__PURE__ */ u(f, {
|
|
36
44
|
treatment: "glass",
|
|
37
45
|
glow: !0,
|
|
38
46
|
className: "overflow-hidden",
|
|
39
|
-
children: /* @__PURE__ */
|
|
47
|
+
children: /* @__PURE__ */ u("div", {
|
|
40
48
|
className: "divide-y divide-border",
|
|
41
|
-
children:
|
|
42
|
-
let n =
|
|
43
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
53
|
+
children: [/* @__PURE__ */ d("div", {
|
|
46
54
|
className: "flex items-center gap-3",
|
|
47
|
-
children: [/* @__PURE__ */
|
|
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
|
|
50
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
60
|
+
children: [/* @__PURE__ */ u("p", {
|
|
53
61
|
className: "text-sm font-medium text-text-primary",
|
|
54
62
|
children: r
|
|
55
|
-
}), f && /* @__PURE__ */
|
|
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__ */
|
|
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
|
-
|
|
73
|
+
o,
|
|
66
74
|
" · ",
|
|
67
75
|
i
|
|
68
76
|
]
|
|
69
77
|
})] })]
|
|
70
|
-
}), /* @__PURE__ */
|
|
78
|
+
}), /* @__PURE__ */ d("div", {
|
|
71
79
|
className: "flex items-center gap-2",
|
|
72
|
-
children: [/* @__PURE__ */
|
|
73
|
-
className: `inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${
|
|
74
|
-
children:
|
|
75
|
-
}), /* @__PURE__ */
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
},
|
|
92
|
+
}, t.id);
|
|
81
93
|
})
|
|
82
94
|
})
|
|
83
95
|
})
|
|
84
96
|
});
|
|
85
97
|
}
|
|
86
98
|
//#endregion
|
|
87
|
-
export {
|
|
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,
|
|
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} · by {author} · {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"}
|
|
@@ -2,121 +2,349 @@ import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
|
|
|
2
2
|
import { formatHours as t } from "../../utils/helpers.js";
|
|
3
3
|
import { StatCard as n } from "../../components/StatCard.js";
|
|
4
4
|
import { LoadingSkeleton as r } from "../../components/LoadingSkeleton.js";
|
|
5
|
-
import { useGetAppUsageSummaryQuery as i, useListApplicationUsagesQuery as a } from "../../../generated/wspace-operations.js";
|
|
5
|
+
import { useCategorizeApplicationMutation as ee, useDeleteApplicationUsageMutation as te, useGetAppUsageSummaryQuery as i, useListApplicationUsagesQuery as a, useRecordApplicationUsageMutation as ne } from "../../../generated/wspace-operations.js";
|
|
6
6
|
import { PageLayout as o } from "../../components/PageLayout.js";
|
|
7
|
-
import { EmptyState as
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
7
|
+
import { EmptyState as re } from "../../components/EmptyState.js";
|
|
8
|
+
import { Modal as s } from "../../components/Modal.js";
|
|
9
|
+
import { useState as c } from "react";
|
|
10
|
+
import { Clock as ie, Monitor as l, Plus as u, Tag as d, Trash2 as f } from "lucide-react";
|
|
11
|
+
import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
10
12
|
//#region src/timecampus/pages/application-usage/ApplicationUsagePage.tsx
|
|
11
|
-
var
|
|
13
|
+
var g = 50, _ = [
|
|
14
|
+
"productive",
|
|
15
|
+
"neutral",
|
|
16
|
+
"communication",
|
|
17
|
+
"distracting"
|
|
18
|
+
], ae = {
|
|
12
19
|
productive: "bg-status-success-bg text-status-success-text",
|
|
13
20
|
neutral: "bg-bg-sunken text-text-secondary",
|
|
14
21
|
communication: "bg-status-info-bg text-status-info-text",
|
|
15
22
|
distracting: "bg-status-error-bg text-status-error-text"
|
|
16
|
-
};
|
|
17
|
-
function
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
+
}, v = "mt-1 w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary", y = "block text-sm font-medium text-text-primary";
|
|
24
|
+
function oe() {
|
|
25
|
+
return (/* @__PURE__ */ new Date()).toISOString();
|
|
26
|
+
}
|
|
27
|
+
function b() {
|
|
28
|
+
let { workspaceId: b = "" } = e(), { data: x, loading: S, error: C, fetchMore: w, refetch: T } = a({
|
|
29
|
+
variables: {
|
|
30
|
+
limit: g,
|
|
31
|
+
offset: 0
|
|
32
|
+
},
|
|
33
|
+
skip: !b,
|
|
34
|
+
notifyOnNetworkStatusChange: !0
|
|
35
|
+
}), { data: E, loading: se, error: ce, refetch: le } = i({ skip: !b }), ue = S || se, de = C || ce, D = x?.applicationUsages ?? [], O = E?.appUsageSummary, fe = D.length > 0 && D.length % g === 0, [k, A] = c(!1), [j, M] = c(!1), [N, P] = c(""), [F, I] = c("productive"), [L, R] = c(""), [z, B] = c(""), [V, H] = c(null), [U, W] = c("productive"), [G, K] = c(null), [pe, { loading: q, error: me }] = ne(), [he, { loading: J, error: ge }] = ee(), [_e, { loading: Y, error: ve }] = te(), X = async () => {
|
|
36
|
+
await Promise.all([T(), le()]);
|
|
37
|
+
}, Z = () => {
|
|
38
|
+
P(""), I("productive"), R(""), B(""), M(!0);
|
|
39
|
+
}, ye = async () => {
|
|
40
|
+
!N.trim() || !L || (await pe({ variables: { input: {
|
|
41
|
+
applicationName: N.trim(),
|
|
42
|
+
category: F,
|
|
43
|
+
timeSpent: Math.round(Number(L) * 60),
|
|
44
|
+
sessions: z ? Number(z) : void 0,
|
|
45
|
+
date: oe()
|
|
46
|
+
} } }), M(!1), await X());
|
|
47
|
+
}, be = (e) => {
|
|
48
|
+
H(e), W(e.category);
|
|
49
|
+
}, xe = async () => {
|
|
50
|
+
V && (await he({ variables: {
|
|
51
|
+
applicationName: V.applicationName,
|
|
52
|
+
category: U
|
|
53
|
+
} }), H(null), await X());
|
|
54
|
+
}, Se = async () => {
|
|
55
|
+
G && (await _e({ variables: { id: G.id } }), K(null), await X());
|
|
56
|
+
}, Ce = async () => {
|
|
57
|
+
A(!0);
|
|
58
|
+
try {
|
|
59
|
+
await w({
|
|
60
|
+
variables: { offset: D.length },
|
|
61
|
+
updateQuery: (e, { fetchMoreResult: t }) => t ? {
|
|
62
|
+
...e,
|
|
63
|
+
applicationUsages: [...e.applicationUsages, ...t.applicationUsages]
|
|
64
|
+
} : e
|
|
65
|
+
});
|
|
66
|
+
} finally {
|
|
67
|
+
A(!1);
|
|
68
|
+
}
|
|
69
|
+
}, Q = D.reduce((e, t) => e + t.timeSpent, 0), $ = D.reduce((e, t) => e + t.switches, 0), we = O?.productivityRatio == null ? "--" : `${Math.round(O.productivityRatio * 100)}%`, Te = D.filter((e) => e.timeSpent >= 5400).length;
|
|
70
|
+
return ue ? /* @__PURE__ */ m(o, {
|
|
23
71
|
title: "App Usage",
|
|
24
72
|
description: "Track application usage and productivity",
|
|
25
|
-
children: /* @__PURE__ */
|
|
73
|
+
children: /* @__PURE__ */ m(r, {
|
|
26
74
|
variant: "card",
|
|
27
75
|
count: 4
|
|
28
76
|
})
|
|
29
|
-
}) :
|
|
77
|
+
}) : de ? /* @__PURE__ */ m(o, {
|
|
30
78
|
title: "App Usage",
|
|
31
79
|
description: "Track application usage and productivity",
|
|
32
|
-
children: /* @__PURE__ */
|
|
80
|
+
children: /* @__PURE__ */ m("div", {
|
|
33
81
|
className: "rounded-xl border border-status-error-border/50 bg-status-error-bg/10 p-4 text-sm text-status-error-text",
|
|
34
82
|
children: "Failed to load application usage. Please try again later."
|
|
35
83
|
})
|
|
36
|
-
}) : /* @__PURE__ */
|
|
84
|
+
}) : /* @__PURE__ */ h(o, {
|
|
37
85
|
title: "App Usage",
|
|
38
86
|
description: "Track application usage and productivity",
|
|
39
87
|
purpose: "See where your screen time actually goes — which apps are productive, how often you context-switch, and how many real focus sessions you get — so you can cut the digital distractions eating your day.",
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
88
|
+
actions: /* @__PURE__ */ h("button", {
|
|
89
|
+
onClick: Z,
|
|
90
|
+
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",
|
|
91
|
+
children: [/* @__PURE__ */ m(u, { className: "h-4 w-4" }), "Add Usage"]
|
|
92
|
+
}),
|
|
93
|
+
children: [
|
|
94
|
+
/* @__PURE__ */ h("div", {
|
|
95
|
+
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
96
|
+
children: [
|
|
97
|
+
/* @__PURE__ */ m(n, {
|
|
98
|
+
featured: !0,
|
|
99
|
+
title: "Total Screen Time",
|
|
100
|
+
value: t(Q / 3600),
|
|
101
|
+
icon: /* @__PURE__ */ m(l, { className: "h-5 w-5" })
|
|
102
|
+
}),
|
|
103
|
+
/* @__PURE__ */ m(n, {
|
|
104
|
+
title: "Productive Time",
|
|
105
|
+
value: we,
|
|
106
|
+
trend: O?.productivityRatio == null ? void 0 : {
|
|
107
|
+
value: 5,
|
|
108
|
+
label: "vs last week"
|
|
109
|
+
}
|
|
110
|
+
}),
|
|
111
|
+
/* @__PURE__ */ m(n, {
|
|
112
|
+
title: "App Switches",
|
|
113
|
+
value: String($),
|
|
114
|
+
description: `Avg. ${D.length > 0 ? Math.round($ / D.length) : 0}/app`
|
|
115
|
+
}),
|
|
116
|
+
/* @__PURE__ */ m(n, {
|
|
117
|
+
title: "Focus Sessions",
|
|
118
|
+
value: String(Te),
|
|
119
|
+
icon: /* @__PURE__ */ m(ie, { className: "h-5 w-5" }),
|
|
120
|
+
description: "90+ min each"
|
|
121
|
+
})
|
|
122
|
+
]
|
|
123
|
+
}),
|
|
124
|
+
D.length === 0 ? /* @__PURE__ */ m(re, {
|
|
125
|
+
illustration: "empty-data",
|
|
126
|
+
title: "No application usage data found",
|
|
127
|
+
description: "Record app usage manually or connect the desktop tracker, and your apps will appear here ranked by time spent.",
|
|
128
|
+
action: /* @__PURE__ */ h("button", {
|
|
129
|
+
onClick: Z,
|
|
130
|
+
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",
|
|
131
|
+
children: [/* @__PURE__ */ m(u, { className: "h-4 w-4" }), "Add Usage"]
|
|
67
132
|
})
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
children: [
|
|
91
|
-
/* @__PURE__ */ u("div", {
|
|
92
|
-
className: "text-right",
|
|
93
|
-
children: /* @__PURE__ */ u("p", {
|
|
133
|
+
}) : /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ m("div", {
|
|
134
|
+
className: "rounded-xl border border-border-seam bg-gloss-card shadow-pop",
|
|
135
|
+
children: /* @__PURE__ */ m("div", {
|
|
136
|
+
className: "divide-y divide-border",
|
|
137
|
+
children: D.map((e) => /* @__PURE__ */ h("div", {
|
|
138
|
+
className: "flex items-center justify-between gap-3 p-4 transition-colors hover:bg-bg-sunken/50",
|
|
139
|
+
children: [/* @__PURE__ */ h("div", {
|
|
140
|
+
className: "flex min-w-0 items-center gap-3",
|
|
141
|
+
children: [/* @__PURE__ */ m(l, { className: "h-5 w-5 shrink-0 text-text-secondary" }), /* @__PURE__ */ h("div", {
|
|
142
|
+
className: "min-w-0",
|
|
143
|
+
children: [/* @__PURE__ */ m("p", {
|
|
144
|
+
className: "truncate text-sm font-medium text-text-primary",
|
|
145
|
+
children: e.applicationName
|
|
146
|
+
}), /* @__PURE__ */ h("p", {
|
|
147
|
+
className: "text-xs text-text-secondary",
|
|
148
|
+
children: [e.sessions, " sessions"]
|
|
149
|
+
})]
|
|
150
|
+
})]
|
|
151
|
+
}), /* @__PURE__ */ h("div", {
|
|
152
|
+
className: "flex shrink-0 items-center gap-3 sm:gap-4",
|
|
153
|
+
children: [
|
|
154
|
+
/* @__PURE__ */ m("p", {
|
|
94
155
|
className: "text-sm font-mono font-medium text-text-primary",
|
|
95
156
|
children: t(e.timeSpent / 3600)
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
157
|
+
}),
|
|
158
|
+
/* @__PURE__ */ m("span", {
|
|
159
|
+
className: `hidden rounded-full px-2 py-0.5 text-xs font-medium sm:inline-flex ${ae[e.category] || "bg-bg-sunken text-text-secondary"}`,
|
|
160
|
+
children: e.category
|
|
161
|
+
}),
|
|
162
|
+
/* @__PURE__ */ m("div", {
|
|
163
|
+
className: "hidden w-16 lg:block",
|
|
164
|
+
children: /* @__PURE__ */ m("div", {
|
|
165
|
+
className: "h-2 rounded-full bg-bg-sunken",
|
|
166
|
+
children: /* @__PURE__ */ m("div", {
|
|
167
|
+
className: "h-2 rounded-full bg-action-primary-bg",
|
|
168
|
+
style: { width: `${Math.min(100, Math.round(e.timeSpent / (Q || 1) * 100))}%` }
|
|
169
|
+
})
|
|
109
170
|
})
|
|
171
|
+
}),
|
|
172
|
+
/* @__PURE__ */ m("button", {
|
|
173
|
+
onClick: () => be(e),
|
|
174
|
+
className: "rounded-md p-1.5 text-text-secondary hover:bg-bg-sunken hover:text-text-primary",
|
|
175
|
+
"aria-label": "Recategorize application",
|
|
176
|
+
children: /* @__PURE__ */ m(d, { className: "h-4 w-4" })
|
|
177
|
+
}),
|
|
178
|
+
/* @__PURE__ */ m("button", {
|
|
179
|
+
onClick: () => K(e),
|
|
180
|
+
className: "rounded-md p-1.5 text-text-secondary hover:bg-status-error-bg hover:text-status-error-text",
|
|
181
|
+
"aria-label": "Delete usage entry",
|
|
182
|
+
children: /* @__PURE__ */ m(f, { className: "h-4 w-4" })
|
|
110
183
|
})
|
|
111
|
-
|
|
184
|
+
]
|
|
185
|
+
})]
|
|
186
|
+
}, e.id))
|
|
187
|
+
})
|
|
188
|
+
}), fe && /* @__PURE__ */ m("div", {
|
|
189
|
+
className: "mt-4 flex justify-center",
|
|
190
|
+
children: /* @__PURE__ */ m("button", {
|
|
191
|
+
onClick: Ce,
|
|
192
|
+
disabled: k,
|
|
193
|
+
className: "rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50 disabled:opacity-50",
|
|
194
|
+
children: k ? "Loading..." : "Load more"
|
|
195
|
+
})
|
|
196
|
+
})] }),
|
|
197
|
+
/* @__PURE__ */ h(s, {
|
|
198
|
+
open: j,
|
|
199
|
+
onClose: () => M(!1),
|
|
200
|
+
title: "Record App Usage",
|
|
201
|
+
description: "Manually log time spent in an application",
|
|
202
|
+
footer: /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ m("button", {
|
|
203
|
+
onClick: () => M(!1),
|
|
204
|
+
className: "rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
|
|
205
|
+
children: "Cancel"
|
|
206
|
+
}), /* @__PURE__ */ m("button", {
|
|
207
|
+
onClick: ye,
|
|
208
|
+
disabled: q || !N.trim() || !L,
|
|
209
|
+
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",
|
|
210
|
+
children: q ? "Saving..." : "Record"
|
|
211
|
+
})] }),
|
|
212
|
+
children: [me && /* @__PURE__ */ m("div", {
|
|
213
|
+
className: "mb-4 rounded-lg border border-status-error-bg/40 bg-status-error-bg p-3 text-sm text-status-error-text",
|
|
214
|
+
children: "Failed to record usage. Please try again."
|
|
215
|
+
}), /* @__PURE__ */ h("div", {
|
|
216
|
+
className: "space-y-4",
|
|
217
|
+
children: [
|
|
218
|
+
/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
|
|
219
|
+
className: y,
|
|
220
|
+
children: "Application Name"
|
|
221
|
+
}), /* @__PURE__ */ m("input", {
|
|
222
|
+
type: "text",
|
|
223
|
+
placeholder: "e.g. Visual Studio Code",
|
|
224
|
+
value: N,
|
|
225
|
+
onChange: (e) => P(e.target.value),
|
|
226
|
+
className: v
|
|
227
|
+
})] }),
|
|
228
|
+
/* @__PURE__ */ h("div", {
|
|
229
|
+
className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
|
|
230
|
+
children: [/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
|
|
231
|
+
className: y,
|
|
232
|
+
children: "Category"
|
|
233
|
+
}), /* @__PURE__ */ m("select", {
|
|
234
|
+
value: F,
|
|
235
|
+
onChange: (e) => I(e.target.value),
|
|
236
|
+
className: v,
|
|
237
|
+
children: _.map((e) => /* @__PURE__ */ m("option", {
|
|
238
|
+
value: e,
|
|
239
|
+
className: "capitalize",
|
|
240
|
+
children: e
|
|
241
|
+
}, e))
|
|
242
|
+
})] }), /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
|
|
243
|
+
className: y,
|
|
244
|
+
children: "Time Spent (minutes)"
|
|
245
|
+
}), /* @__PURE__ */ m("input", {
|
|
246
|
+
type: "number",
|
|
247
|
+
min: "0",
|
|
248
|
+
placeholder: "0",
|
|
249
|
+
value: L,
|
|
250
|
+
onChange: (e) => R(e.target.value),
|
|
251
|
+
className: v
|
|
252
|
+
})] })]
|
|
253
|
+
}),
|
|
254
|
+
/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
|
|
255
|
+
className: y,
|
|
256
|
+
children: "Sessions"
|
|
257
|
+
}), /* @__PURE__ */ m("input", {
|
|
258
|
+
type: "number",
|
|
259
|
+
min: "0",
|
|
260
|
+
placeholder: "0",
|
|
261
|
+
value: z,
|
|
262
|
+
onChange: (e) => B(e.target.value),
|
|
263
|
+
className: v
|
|
264
|
+
})] })
|
|
265
|
+
]
|
|
266
|
+
})]
|
|
267
|
+
}),
|
|
268
|
+
/* @__PURE__ */ h(s, {
|
|
269
|
+
open: V !== null,
|
|
270
|
+
onClose: () => H(null),
|
|
271
|
+
title: "Recategorize Application",
|
|
272
|
+
description: V?.applicationName,
|
|
273
|
+
size: "sm",
|
|
274
|
+
footer: /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ m("button", {
|
|
275
|
+
onClick: () => H(null),
|
|
276
|
+
className: "rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
|
|
277
|
+
children: "Cancel"
|
|
278
|
+
}), /* @__PURE__ */ m("button", {
|
|
279
|
+
onClick: xe,
|
|
280
|
+
disabled: J,
|
|
281
|
+
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",
|
|
282
|
+
children: J ? "Saving..." : "Save"
|
|
283
|
+
})] }),
|
|
284
|
+
children: [
|
|
285
|
+
ge && /* @__PURE__ */ m("div", {
|
|
286
|
+
className: "mb-4 rounded-lg border border-status-error-bg/40 bg-status-error-bg p-3 text-sm text-status-error-text",
|
|
287
|
+
children: "Failed to recategorize. Please try again."
|
|
288
|
+
}),
|
|
289
|
+
/* @__PURE__ */ m("label", {
|
|
290
|
+
className: y,
|
|
291
|
+
children: "Category"
|
|
292
|
+
}),
|
|
293
|
+
/* @__PURE__ */ m("select", {
|
|
294
|
+
value: U,
|
|
295
|
+
onChange: (e) => W(e.target.value),
|
|
296
|
+
className: v,
|
|
297
|
+
children: _.map((e) => /* @__PURE__ */ m("option", {
|
|
298
|
+
value: e,
|
|
299
|
+
className: "capitalize",
|
|
300
|
+
children: e
|
|
301
|
+
}, e))
|
|
302
|
+
}),
|
|
303
|
+
/* @__PURE__ */ h("p", {
|
|
304
|
+
className: "mt-3 text-xs text-text-secondary",
|
|
305
|
+
children: [
|
|
306
|
+
"This updates the category for all usage of “",
|
|
307
|
+
V?.applicationName,
|
|
308
|
+
"”."
|
|
112
309
|
]
|
|
113
|
-
})
|
|
114
|
-
|
|
310
|
+
})
|
|
311
|
+
]
|
|
312
|
+
}),
|
|
313
|
+
/* @__PURE__ */ h(s, {
|
|
314
|
+
open: G !== null,
|
|
315
|
+
onClose: () => K(null),
|
|
316
|
+
title: "Delete Usage Entry",
|
|
317
|
+
size: "sm",
|
|
318
|
+
footer: /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ m("button", {
|
|
319
|
+
onClick: () => K(null),
|
|
320
|
+
className: "rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
|
|
321
|
+
children: "Cancel"
|
|
322
|
+
}), /* @__PURE__ */ m("button", {
|
|
323
|
+
onClick: Se,
|
|
324
|
+
disabled: Y,
|
|
325
|
+
className: "rounded-md bg-status-error-bg px-4 py-2 text-sm font-medium text-status-error-text hover:bg-status-error-bg/90 disabled:opacity-50",
|
|
326
|
+
children: Y ? "Deleting..." : "Delete"
|
|
327
|
+
})] }),
|
|
328
|
+
children: [ve && /* @__PURE__ */ m("div", {
|
|
329
|
+
className: "mb-4 rounded-lg border border-status-error-bg/40 bg-status-error-bg p-3 text-sm text-status-error-text",
|
|
330
|
+
children: "Failed to delete entry. Please try again."
|
|
331
|
+
}), /* @__PURE__ */ h("p", {
|
|
332
|
+
className: "text-sm text-text-secondary",
|
|
333
|
+
children: [
|
|
334
|
+
"Are you sure you want to delete the usage entry for",
|
|
335
|
+
" ",
|
|
336
|
+
/* @__PURE__ */ m("span", {
|
|
337
|
+
className: "font-medium text-text-primary",
|
|
338
|
+
children: G?.applicationName
|
|
339
|
+
}),
|
|
340
|
+
"? This action cannot be undone."
|
|
341
|
+
]
|
|
342
|
+
})]
|
|
115
343
|
})
|
|
116
|
-
|
|
344
|
+
]
|
|
117
345
|
});
|
|
118
346
|
}
|
|
119
347
|
//#endregion
|
|
120
|
-
export {
|
|
348
|
+
export { b as ApplicationUsagePage };
|
|
121
349
|
|
|
122
350
|
//# sourceMappingURL=ApplicationUsagePage.js.map
|