@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
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { MeetingParticipantRole as e, MeetingParticipantStatus as t } from "../../../generated/wspace-types.js";
|
|
2
|
+
import { Modal as n } from "../../components/Modal.js";
|
|
3
|
+
import { useState as r } from "react";
|
|
4
|
+
import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
5
|
+
//#region src/timecampus/pages/meetings/ParticipantFormModal.tsx
|
|
6
|
+
var s = "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", c = "block text-sm font-medium text-text-primary", l = [
|
|
7
|
+
{
|
|
8
|
+
value: e.Required,
|
|
9
|
+
label: "Required"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
value: e.Optional,
|
|
13
|
+
label: "Optional"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
value: e.Organizer,
|
|
17
|
+
label: "Organizer"
|
|
18
|
+
}
|
|
19
|
+
], u = [
|
|
20
|
+
{
|
|
21
|
+
value: t.Pending,
|
|
22
|
+
label: "Pending"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
value: t.Accepted,
|
|
26
|
+
label: "Accepted"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
value: t.Tentative,
|
|
30
|
+
label: "Tentative"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
value: t.Declined,
|
|
34
|
+
label: "Declined"
|
|
35
|
+
}
|
|
36
|
+
], d = ({ open: d, onClose: f, defaultUserId: p, submitting: m, error: h, onSubmit: g }) => {
|
|
37
|
+
let [_, v] = r(p ?? ""), [y, b] = r(e.Required), [x, S] = r(t.Pending), C = !!_.trim() && !m;
|
|
38
|
+
return /* @__PURE__ */ o(n, {
|
|
39
|
+
open: d,
|
|
40
|
+
onClose: f,
|
|
41
|
+
title: "Add participant",
|
|
42
|
+
description: "Record who attended so their time counts toward this meeting's cost.",
|
|
43
|
+
footer: /* @__PURE__ */ o(i, { children: [/* @__PURE__ */ a("button", {
|
|
44
|
+
onClick: f,
|
|
45
|
+
className: "rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
|
|
46
|
+
children: "Cancel"
|
|
47
|
+
}), /* @__PURE__ */ a("button", {
|
|
48
|
+
onClick: async () => {
|
|
49
|
+
C && await g({
|
|
50
|
+
userId: _.trim(),
|
|
51
|
+
role: y,
|
|
52
|
+
status: x
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
disabled: !C,
|
|
56
|
+
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",
|
|
57
|
+
children: m ? "Adding..." : "Add participant"
|
|
58
|
+
})] }),
|
|
59
|
+
children: [h && /* @__PURE__ */ a("div", {
|
|
60
|
+
className: "mb-4 rounded-lg border border-status-error-bg/40 bg-status-error-bg p-3 text-sm text-status-error-text",
|
|
61
|
+
children: "Failed to add participant. Please try again."
|
|
62
|
+
}), /* @__PURE__ */ o("div", {
|
|
63
|
+
className: "space-y-4",
|
|
64
|
+
children: [/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("label", {
|
|
65
|
+
className: c,
|
|
66
|
+
children: "User ID"
|
|
67
|
+
}), /* @__PURE__ */ a("input", {
|
|
68
|
+
type: "text",
|
|
69
|
+
placeholder: "User ID",
|
|
70
|
+
value: _,
|
|
71
|
+
onChange: (e) => v(e.target.value),
|
|
72
|
+
className: s
|
|
73
|
+
})] }), /* @__PURE__ */ o("div", {
|
|
74
|
+
className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
|
|
75
|
+
children: [/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("label", {
|
|
76
|
+
className: c,
|
|
77
|
+
children: "Role"
|
|
78
|
+
}), /* @__PURE__ */ a("select", {
|
|
79
|
+
value: y,
|
|
80
|
+
onChange: (e) => b(e.target.value),
|
|
81
|
+
className: s,
|
|
82
|
+
children: l.map((e) => /* @__PURE__ */ a("option", {
|
|
83
|
+
value: e.value,
|
|
84
|
+
children: e.label
|
|
85
|
+
}, e.value))
|
|
86
|
+
})] }), /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("label", {
|
|
87
|
+
className: c,
|
|
88
|
+
children: "Status"
|
|
89
|
+
}), /* @__PURE__ */ a("select", {
|
|
90
|
+
value: x,
|
|
91
|
+
onChange: (e) => S(e.target.value),
|
|
92
|
+
className: s,
|
|
93
|
+
children: u.map((e) => /* @__PURE__ */ a("option", {
|
|
94
|
+
value: e.value,
|
|
95
|
+
children: e.label
|
|
96
|
+
}, e.value))
|
|
97
|
+
})] })]
|
|
98
|
+
})]
|
|
99
|
+
})]
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
//#endregion
|
|
103
|
+
export { d as ParticipantFormModal };
|
|
104
|
+
|
|
105
|
+
//# sourceMappingURL=ParticipantFormModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParticipantFormModal.js","names":[],"sources":["../../../../src/timecampus/pages/meetings/ParticipantFormModal.tsx"],"sourcesContent":["import { useState, type FC } from \"react\";\nimport { Modal } from \"../../components/Modal\";\nimport {\n MeetingParticipantRole,\n MeetingParticipantStatus,\n type AddMeetingParticipantInput,\n} from \"@/generated/wspace-types\";\n\nconst inputClass =\n \"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\";\nconst labelClass = \"block text-sm font-medium text-text-primary\";\n\nconst ROLES: { value: MeetingParticipantRole; label: string }[] = [\n { value: MeetingParticipantRole.Required, label: \"Required\" },\n { value: MeetingParticipantRole.Optional, label: \"Optional\" },\n { value: MeetingParticipantRole.Organizer, label: \"Organizer\" },\n];\n\nconst STATUSES: { value: MeetingParticipantStatus; label: string }[] = [\n { value: MeetingParticipantStatus.Pending, label: \"Pending\" },\n { value: MeetingParticipantStatus.Accepted, label: \"Accepted\" },\n { value: MeetingParticipantStatus.Tentative, label: \"Tentative\" },\n { value: MeetingParticipantStatus.Declined, label: \"Declined\" },\n];\n\ninterface ParticipantFormModalProps {\n open: boolean;\n onClose: () => void;\n defaultUserId?: string;\n submitting: boolean;\n error?: boolean;\n onSubmit: (input: AddMeetingParticipantInput) => Promise<void> | void;\n}\n\nexport const ParticipantFormModal: FC<ParticipantFormModalProps> = ({\n open,\n onClose,\n defaultUserId,\n submitting,\n error,\n onSubmit,\n}) => {\n const [userId, setUserId] = useState(defaultUserId ?? \"\");\n const [role, setRole] = useState<MeetingParticipantRole>(\n MeetingParticipantRole.Required,\n );\n const [status, setStatus] = useState<MeetingParticipantStatus>(\n MeetingParticipantStatus.Pending,\n );\n\n const canSubmit = Boolean(userId.trim()) && !submitting;\n\n const handleSubmit = async () => {\n if (!canSubmit) return;\n await onSubmit({ userId: userId.trim(), role, status });\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title=\"Add participant\"\n description=\"Record who attended so their time counts toward this meeting's cost.\"\n footer={\n <>\n <button\n onClick={onClose}\n className=\"rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50\"\n >\n Cancel\n </button>\n <button\n onClick={handleSubmit}\n disabled={!canSubmit}\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 {submitting ? \"Adding...\" : \"Add participant\"}\n </button>\n </>\n }\n >\n {error && (\n <div className=\"mb-4 rounded-lg border border-status-error-bg/40 bg-status-error-bg p-3 text-sm text-status-error-text\">\n Failed to add participant. Please try again.\n </div>\n )}\n <div className=\"space-y-4\">\n <div>\n <label className={labelClass}>User ID</label>\n <input\n type=\"text\"\n placeholder=\"User ID\"\n value={userId}\n onChange={(e) => setUserId(e.target.value)}\n className={inputClass}\n />\n </div>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className={labelClass}>Role</label>\n <select\n value={role}\n onChange={(e) =>\n setRole(e.target.value as MeetingParticipantRole)\n }\n className={inputClass}\n >\n {ROLES.map((r) => (\n <option key={r.value} value={r.value}>\n {r.label}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className={labelClass}>Status</label>\n <select\n value={status}\n onChange={(e) =>\n setStatus(e.target.value as MeetingParticipantStatus)\n }\n className={inputClass}\n >\n {STATUSES.map((s) => (\n <option key={s.value} value={s.value}>\n {s.label}\n </option>\n ))}\n </select>\n </div>\n </div>\n </div>\n </Modal>\n );\n};\n"],"mappings":";;;;;AAQA,IAAM,IACJ,wIACI,IAAa,+CAEb,IAA4D;CAChE;EAAE,OAAO,EAAuB;EAAU,OAAO;EAAY;CAC7D;EAAE,OAAO,EAAuB;EAAU,OAAO;EAAY;CAC7D;EAAE,OAAO,EAAuB;EAAW,OAAO;EAAa;CAChE,EAEK,IAAiE;CACrE;EAAE,OAAO,EAAyB;EAAS,OAAO;EAAW;CAC7D;EAAE,OAAO,EAAyB;EAAU,OAAO;EAAY;CAC/D;EAAE,OAAO,EAAyB;EAAW,OAAO;EAAa;CACjE;EAAE,OAAO,EAAyB;EAAU,OAAO;EAAY;CAChE,EAWY,KAAuD,EAClE,SACA,YACA,kBACA,eACA,UACA,kBACI;CACJ,IAAM,CAAC,GAAQ,KAAa,EAAS,KAAiB,GAAG,EACnD,CAAC,GAAM,KAAW,EACtB,EAAuB,SACxB,EACK,CAAC,GAAQ,KAAa,EAC1B,EAAyB,QAC1B,EAEK,IAAY,EAAQ,EAAO,MAAM,IAAK,CAAC;AAO7C,QACE,kBAAC,GAAD;EACQ;EACG;EACT,OAAM;EACN,aAAY;EACZ,QACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,UAAD;GACE,SAAS;GACT,WAAU;aACX;GAEQ,CAAA,EACT,kBAAC,UAAD;GACE,SApBW,YAAY;AAC1B,SACL,MAAM,EAAS;KAAE,QAAQ,EAAO,MAAM;KAAE;KAAM;KAAQ,CAAC;;GAmB/C,UAAU,CAAC;GACX,WAAU;aAET,IAAa,cAAc;GACrB,CAAA,CACR,EAAA,CAAA;YApBP,CAuBG,KACC,kBAAC,OAAD;GAAK,WAAU;aAAyG;GAElH,CAAA,EAER,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;IAAO,WAAW;cAAY;IAAe,CAAA,EAC7C,kBAAC,SAAD;IACE,MAAK;IACL,aAAY;IACZ,OAAO;IACP,WAAW,MAAM,EAAU,EAAE,OAAO,MAAM;IAC1C,WAAW;IACX,CAAA,CACE,EAAA,CAAA,EACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;KAAO,WAAW;eAAY;KAAY,CAAA,EAC1C,kBAAC,UAAD;KACE,OAAO;KACP,WAAW,MACT,EAAQ,EAAE,OAAO,MAAgC;KAEnD,WAAW;eAEV,EAAM,KAAK,MACV,kBAAC,UAAD;MAAsB,OAAO,EAAE;gBAC5B,EAAE;MACI,EAFI,EAAE,MAEN,CACT;KACK,CAAA,CACL,EAAA,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;KAAO,WAAW;eAAY;KAAc,CAAA,EAC5C,kBAAC,UAAD;KACE,OAAO;KACP,WAAW,MACT,EAAU,EAAE,OAAO,MAAkC;KAEvD,WAAW;eAEV,EAAS,KAAK,MACb,kBAAC,UAAD;MAAsB,OAAO,EAAE;gBAC5B,EAAE;MACI,EAFI,EAAE,MAEN,CACT;KACK,CAAA,CACL,EAAA,CAAA,CACF;MACF;KACA"}
|
|
@@ -1,70 +1,130 @@
|
|
|
1
1
|
import { useTimeCampus as e, useTimeCampusNavigate as t } from "../../providers/TimeCampusProvider.js";
|
|
2
2
|
import { StatCard as n } from "../../components/StatCard.js";
|
|
3
3
|
import { LoadingSkeleton as r } from "../../components/LoadingSkeleton.js";
|
|
4
|
-
import { useCompletePomodoroSessionMutation as i, useGetActivePomodoroSessionQuery as
|
|
4
|
+
import { useCompletePomodoroSessionMutation as i, useCreatePomodoroGoalMutation as ee, useDeletePomodoroGoalMutation as te, useGetActivePomodoroSessionQuery as ne, useGetPomodoroStatsQuery as re, useListPomodoroGoalsQuery as a, useStartPomodoroSessionMutation as o, useUpdatePomodoroGoalMutation as s } from "../../../generated/wspace-operations.js";
|
|
5
5
|
import { PageLayout as c } from "../../components/PageLayout.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
6
|
+
import { PomodoroGoalType as l } from "../../../generated/wspace-types.js";
|
|
7
|
+
import { Modal as u } from "../../components/Modal.js";
|
|
8
|
+
import { useCallback as d, useEffect as f, useState as p } from "react";
|
|
9
|
+
import { Pause as ie, Pencil as ae, Play as oe, Plus as se, RotateCcw as m, SkipForward as ce, Target as le, Trash2 as ue } from "lucide-react";
|
|
10
|
+
import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
11
|
+
import { GlassCard as v, NextSteps as de } from "@burdenoff/fe-libs/ui";
|
|
10
12
|
//#region src/timecampus/pages/pomodoro/PomodoroPage.tsx
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
13
|
+
var y = "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", b = "block text-sm font-medium text-text-primary";
|
|
14
|
+
function x(e) {
|
|
15
|
+
let t = new Date(e);
|
|
16
|
+
return Number.isNaN(t.getTime()) ? "" : (/* @__PURE__ */ new Date(t.getTime() - t.getTimezoneOffset() * 6e4)).toISOString().slice(0, 10);
|
|
17
|
+
}
|
|
18
|
+
function S() {
|
|
19
|
+
let e = /* @__PURE__ */ new Date();
|
|
20
|
+
return (/* @__PURE__ */ new Date(e.getTime() - e.getTimezoneOffset() * 6e4)).toISOString().slice(0, 10);
|
|
21
|
+
}
|
|
22
|
+
function C(e) {
|
|
23
|
+
let t = /* @__PURE__ */ new Date();
|
|
24
|
+
return t.setDate(t.getDate() + e), (/* @__PURE__ */ new Date(t.getTime() - t.getTimezoneOffset() * 6e4)).toISOString().slice(0, 10);
|
|
25
|
+
}
|
|
26
|
+
function w(e) {
|
|
27
|
+
return {
|
|
28
|
+
type: e?.type ?? l.Daily,
|
|
29
|
+
target: e?.target == null ? "8" : String(e.target),
|
|
30
|
+
period: e?.period ?? "DAILY",
|
|
31
|
+
startDate: e?.startDate ? x(e.startDate) : S(),
|
|
32
|
+
endDate: e?.endDate ? x(e.endDate) : C(0)
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function T() {
|
|
36
|
+
let { workspaceId: x = "" } = e(), S = t(), { data: T, loading: fe, error: pe } = re({
|
|
37
|
+
variables: { workspaceId: x },
|
|
38
|
+
skip: !x
|
|
39
|
+
}), { data: me, loading: he, error: ge } = ne({
|
|
40
|
+
variables: { workspaceId: x },
|
|
41
|
+
skip: !x
|
|
42
|
+
}), [E] = o(), [D] = i(), { data: O, refetch: k } = a({
|
|
43
|
+
variables: { workspaceId: x },
|
|
44
|
+
skip: !x
|
|
45
|
+
}), A = O?.pomodoroGoals ?? [], [j, { loading: M, error: N }] = ee(), [P, { loading: F, error: I }] = s(), [L, { loading: R, error: _e }] = te(), [ve, z] = p(!1), [B, V] = p(null), [H, U] = p(null), [W, G] = p(w()), K = (e, t) => G((n) => ({
|
|
46
|
+
...n,
|
|
47
|
+
[e]: t
|
|
48
|
+
})), ye = () => {
|
|
49
|
+
V(null), G(w()), z(!0);
|
|
50
|
+
}, be = (e) => {
|
|
51
|
+
V(e), G(w(e)), z(!0);
|
|
52
|
+
}, xe = async () => {
|
|
53
|
+
if (!x) return;
|
|
54
|
+
let e = Number(W.target);
|
|
55
|
+
!e || e <= 0 || (B ? await P({ variables: {
|
|
56
|
+
id: B.id,
|
|
57
|
+
workspaceId: x,
|
|
58
|
+
input: {
|
|
59
|
+
type: W.type,
|
|
60
|
+
target: e,
|
|
61
|
+
period: W.period.trim() || W.type,
|
|
62
|
+
startDate: new Date(W.startDate).toISOString(),
|
|
63
|
+
endDate: new Date(W.endDate).toISOString()
|
|
64
|
+
}
|
|
65
|
+
} }) : await j({ variables: { input: {
|
|
66
|
+
workspaceId: x,
|
|
67
|
+
type: W.type,
|
|
68
|
+
target: e,
|
|
69
|
+
period: W.period.trim() || W.type,
|
|
70
|
+
startDate: new Date(W.startDate).toISOString(),
|
|
71
|
+
endDate: new Date(W.endDate).toISOString()
|
|
72
|
+
} } }), z(!1), await k());
|
|
73
|
+
}, Se = async () => {
|
|
74
|
+
!H || !x || (await L({ variables: {
|
|
75
|
+
id: H.id,
|
|
76
|
+
workspaceId: x
|
|
77
|
+
} }), U(null), await k());
|
|
78
|
+
}, q = T?.pomodoroStats, J = me?.activePomodoroSession, [Y, X] = p(1500), [Z, Q] = p(!1);
|
|
79
|
+
f(() => {
|
|
80
|
+
if (J && !J.completed) {
|
|
81
|
+
let e = Math.floor((Date.now() - new Date(J.startTime).getTime()) / 1e3), t = J.duration ?? 1500, n = Math.max(0, t - e);
|
|
82
|
+
X(n), Q(n > 0);
|
|
23
83
|
}
|
|
24
|
-
}, [
|
|
25
|
-
if (!
|
|
84
|
+
}, [J]), f(() => {
|
|
85
|
+
if (!Z || Y <= 0) return;
|
|
26
86
|
let e = setInterval(() => {
|
|
27
|
-
|
|
87
|
+
X((e) => e <= 1 ? (Q(!1), 0) : e - 1);
|
|
28
88
|
}, 1e3);
|
|
29
89
|
return () => clearInterval(e);
|
|
30
|
-
}, [
|
|
31
|
-
let
|
|
90
|
+
}, [Z, Y]);
|
|
91
|
+
let Ce = (e) => {
|
|
32
92
|
let t = Math.floor(e / 60), n = e % 60;
|
|
33
93
|
return `${String(t).padStart(2, "0")}:${String(n).padStart(2, "0")}`;
|
|
34
|
-
},
|
|
35
|
-
if (
|
|
36
|
-
if (
|
|
37
|
-
|
|
94
|
+
}, $ = d(async () => {
|
|
95
|
+
if (x) {
|
|
96
|
+
if (J && !J.completed) {
|
|
97
|
+
Q(!0);
|
|
38
98
|
return;
|
|
39
99
|
}
|
|
40
|
-
await
|
|
100
|
+
await E({
|
|
41
101
|
variables: { input: {
|
|
42
|
-
workspaceId:
|
|
102
|
+
workspaceId: x,
|
|
43
103
|
type: "FOCUS"
|
|
44
104
|
} },
|
|
45
105
|
refetchQueries: ["GetActivePomodoroSession", "GetPomodoroStats"]
|
|
46
|
-
}),
|
|
106
|
+
}), X(1500), Q(!0);
|
|
47
107
|
}
|
|
48
108
|
}, [
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
]),
|
|
53
|
-
!
|
|
109
|
+
x,
|
|
110
|
+
J,
|
|
111
|
+
E
|
|
112
|
+
]), we = d(async () => {
|
|
113
|
+
!J || !x || (await D({
|
|
54
114
|
variables: {
|
|
55
|
-
id:
|
|
56
|
-
workspaceId:
|
|
115
|
+
id: J.id,
|
|
116
|
+
workspaceId: x
|
|
57
117
|
},
|
|
58
118
|
refetchQueries: ["GetActivePomodoroSession", "GetPomodoroStats"]
|
|
59
|
-
}),
|
|
119
|
+
}), Q(!1), X(1500));
|
|
60
120
|
}, [
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
]),
|
|
65
|
-
|
|
121
|
+
J,
|
|
122
|
+
x,
|
|
123
|
+
D
|
|
124
|
+
]), Te = () => {
|
|
125
|
+
Q(!1), X(1500);
|
|
66
126
|
};
|
|
67
|
-
if (
|
|
127
|
+
if (fe || he) return /* @__PURE__ */ g(c, {
|
|
68
128
|
title: "Pomodoro Timer",
|
|
69
129
|
description: "Focus with the Pomodoro Technique",
|
|
70
130
|
children: /* @__PURE__ */ g(r, {
|
|
@@ -72,7 +132,7 @@ function b() {
|
|
|
72
132
|
count: 3
|
|
73
133
|
})
|
|
74
134
|
});
|
|
75
|
-
if (
|
|
135
|
+
if (pe || ge) return /* @__PURE__ */ g(c, {
|
|
76
136
|
title: "Pomodoro Timer",
|
|
77
137
|
description: "Focus with the Pomodoro Technique",
|
|
78
138
|
children: /* @__PURE__ */ g("div", {
|
|
@@ -80,13 +140,13 @@ function b() {
|
|
|
80
140
|
children: "Failed to load pomodoro data. Please try again later."
|
|
81
141
|
})
|
|
82
142
|
});
|
|
83
|
-
let
|
|
143
|
+
let Ee = Math.floor((q?.totalFocusMinutes ?? 0) / 60), De = (q?.totalFocusMinutes ?? 0) % 60;
|
|
84
144
|
return /* @__PURE__ */ _(c, {
|
|
85
145
|
title: "Pomodoro Timer",
|
|
86
146
|
description: "Focus with the Pomodoro Technique",
|
|
87
147
|
purpose: "Work in focused 25-minute sprints with short breaks — the Pomodoro technique helps you beat procrastination and build a streak of deep-work sessions you can actually measure.",
|
|
88
148
|
children: [
|
|
89
|
-
/* @__PURE__ */ g(
|
|
149
|
+
/* @__PURE__ */ g(de, {
|
|
90
150
|
storageKey: "timecampus-pomodoro",
|
|
91
151
|
className: "mb-6",
|
|
92
152
|
steps: [
|
|
@@ -94,19 +154,19 @@ function b() {
|
|
|
94
154
|
id: "start",
|
|
95
155
|
label: "Start a focus session",
|
|
96
156
|
description: "Begin a 25-minute sprint on one task.",
|
|
97
|
-
onClick: () =>
|
|
157
|
+
onClick: () => $()
|
|
98
158
|
},
|
|
99
159
|
{
|
|
100
160
|
id: "analytics",
|
|
101
161
|
label: "Review your pomodoro stats",
|
|
102
162
|
description: "See streaks, completion rate and focus time.",
|
|
103
|
-
onClick: () =>
|
|
163
|
+
onClick: () => S("/pomodoro/analytics")
|
|
104
164
|
},
|
|
105
165
|
{
|
|
106
166
|
id: "settings",
|
|
107
167
|
label: "Tune your intervals",
|
|
108
168
|
description: "Adjust focus and break lengths to fit you.",
|
|
109
|
-
onClick: () =>
|
|
169
|
+
onClick: () => S("/pomodoro/settings")
|
|
110
170
|
}
|
|
111
171
|
]
|
|
112
172
|
}),
|
|
@@ -115,21 +175,21 @@ function b() {
|
|
|
115
175
|
children: [
|
|
116
176
|
/* @__PURE__ */ g(n, {
|
|
117
177
|
title: "Sessions Today",
|
|
118
|
-
value: String(
|
|
119
|
-
description: `Total: ${
|
|
178
|
+
value: String(q?.completedSessions ?? 0),
|
|
179
|
+
description: `Total: ${q?.totalSessions ?? 0} sessions`
|
|
120
180
|
}),
|
|
121
181
|
/* @__PURE__ */ g(n, {
|
|
122
182
|
title: "Focus Time",
|
|
123
|
-
value: `${
|
|
183
|
+
value: `${Ee}h ${De}m`,
|
|
124
184
|
trend: {
|
|
125
|
-
value:
|
|
185
|
+
value: q?.completionRate ?? 0,
|
|
126
186
|
label: "completion rate"
|
|
127
187
|
}
|
|
128
188
|
}),
|
|
129
189
|
/* @__PURE__ */ g(n, {
|
|
130
190
|
title: "Current Streak",
|
|
131
|
-
value: `${
|
|
132
|
-
description: `Avg: ${
|
|
191
|
+
value: `${q?.streakDays ?? 0} days`,
|
|
192
|
+
description: `Avg: ${q?.averageSessionMinutes ?? 0}m per session`
|
|
133
193
|
})
|
|
134
194
|
]
|
|
135
195
|
}),
|
|
@@ -144,36 +204,36 @@ function b() {
|
|
|
144
204
|
className: "mb-2",
|
|
145
205
|
children: /* @__PURE__ */ g("span", {
|
|
146
206
|
className: "inline-flex rounded-full bg-action-primary-bg/10 px-3 py-1 text-xs font-medium text-primary",
|
|
147
|
-
children:
|
|
207
|
+
children: J ? "Focus Session" : "Ready"
|
|
148
208
|
})
|
|
149
209
|
}),
|
|
150
210
|
/* @__PURE__ */ g("p", {
|
|
151
211
|
className: "text-7xl font-mono font-bold text-text-primary",
|
|
152
|
-
children:
|
|
212
|
+
children: Ce(Y)
|
|
153
213
|
}),
|
|
154
214
|
/* @__PURE__ */ g("p", {
|
|
155
215
|
className: "mt-2 text-sm text-text-secondary",
|
|
156
|
-
children:
|
|
216
|
+
children: q ? `${q.completedSessions} of ${q.totalSessions} sessions` : "No sessions yet"
|
|
157
217
|
}),
|
|
158
218
|
/* @__PURE__ */ _("div", {
|
|
159
219
|
className: "mt-6 flex items-center justify-center gap-3",
|
|
160
220
|
children: [
|
|
161
|
-
|
|
162
|
-
onClick: () =>
|
|
221
|
+
Z ? /* @__PURE__ */ _("button", {
|
|
222
|
+
onClick: () => Q(!1),
|
|
163
223
|
className: "inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-6 py-3 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90",
|
|
164
|
-
children: [/* @__PURE__ */ g(
|
|
224
|
+
children: [/* @__PURE__ */ g(ie, { className: "h-4 w-4" }), "Pause"]
|
|
165
225
|
}) : /* @__PURE__ */ _("button", {
|
|
166
|
-
onClick:
|
|
226
|
+
onClick: $,
|
|
167
227
|
className: "inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-6 py-3 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90",
|
|
168
|
-
children: [/* @__PURE__ */ g(
|
|
228
|
+
children: [/* @__PURE__ */ g(oe, { className: "h-4 w-4" }), "Start"]
|
|
169
229
|
}),
|
|
170
230
|
/* @__PURE__ */ _("button", {
|
|
171
|
-
onClick:
|
|
231
|
+
onClick: we,
|
|
172
232
|
className: "inline-flex items-center gap-2 rounded-md border border-border-subtle px-4 py-3 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
|
|
173
|
-
children: [/* @__PURE__ */ g(
|
|
233
|
+
children: [/* @__PURE__ */ g(ce, { className: "h-4 w-4" }), "Skip"]
|
|
174
234
|
}),
|
|
175
235
|
/* @__PURE__ */ _("button", {
|
|
176
|
-
onClick:
|
|
236
|
+
onClick: Te,
|
|
177
237
|
className: "inline-flex items-center gap-2 rounded-md border border-border-subtle px-4 py-3 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
|
|
178
238
|
children: [/* @__PURE__ */ g(m, { className: "h-4 w-4" }), "Reset"]
|
|
179
239
|
})
|
|
@@ -181,11 +241,191 @@ function b() {
|
|
|
181
241
|
})
|
|
182
242
|
]
|
|
183
243
|
})
|
|
244
|
+
}),
|
|
245
|
+
/* @__PURE__ */ _(v, {
|
|
246
|
+
treatment: "glass",
|
|
247
|
+
className: "p-6",
|
|
248
|
+
children: [/* @__PURE__ */ _("div", {
|
|
249
|
+
className: "mb-4 flex items-center justify-between",
|
|
250
|
+
children: [/* @__PURE__ */ _("h3", {
|
|
251
|
+
className: "flex items-center gap-2 text-sm font-semibold text-text-primary",
|
|
252
|
+
children: [/* @__PURE__ */ g(le, { className: "h-4 w-4" }), "Focus Goals"]
|
|
253
|
+
}), /* @__PURE__ */ _("button", {
|
|
254
|
+
onClick: ye,
|
|
255
|
+
className: "inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-1.5 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90",
|
|
256
|
+
children: [/* @__PURE__ */ g(se, { className: "h-4 w-4" }), "Add Goal"]
|
|
257
|
+
})]
|
|
258
|
+
}), A.length === 0 ? /* @__PURE__ */ g("p", {
|
|
259
|
+
className: "py-6 text-center text-sm text-text-secondary",
|
|
260
|
+
children: "No focus goals yet. Set a daily or weekly target to build a consistent focus habit."
|
|
261
|
+
}) : /* @__PURE__ */ g("div", {
|
|
262
|
+
className: "space-y-3",
|
|
263
|
+
children: A.map((e) => {
|
|
264
|
+
let t = e.target ? Math.min(100, Math.round(e.current / e.target * 100)) : 0;
|
|
265
|
+
return /* @__PURE__ */ _("div", {
|
|
266
|
+
className: "rounded-lg border border-border-subtle p-4",
|
|
267
|
+
children: [/* @__PURE__ */ _("div", {
|
|
268
|
+
className: "flex items-center justify-between",
|
|
269
|
+
children: [/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ _("p", {
|
|
270
|
+
className: "text-sm font-medium capitalize text-text-primary",
|
|
271
|
+
children: [e.type.toLowerCase(), " goal"]
|
|
272
|
+
}), /* @__PURE__ */ _("p", {
|
|
273
|
+
className: "text-xs text-text-secondary",
|
|
274
|
+
children: [
|
|
275
|
+
e.current,
|
|
276
|
+
" of ",
|
|
277
|
+
e.target,
|
|
278
|
+
" sessions"
|
|
279
|
+
]
|
|
280
|
+
})] }), /* @__PURE__ */ _("div", {
|
|
281
|
+
className: "flex items-center gap-2",
|
|
282
|
+
children: [
|
|
283
|
+
/* @__PURE__ */ _("span", {
|
|
284
|
+
className: "text-sm font-medium text-text-primary",
|
|
285
|
+
children: [t, "%"]
|
|
286
|
+
}),
|
|
287
|
+
/* @__PURE__ */ g("button", {
|
|
288
|
+
onClick: () => be(e),
|
|
289
|
+
className: "rounded-md p-1.5 text-text-secondary hover:bg-bg-sunken hover:text-text-primary",
|
|
290
|
+
"aria-label": "Edit goal",
|
|
291
|
+
children: /* @__PURE__ */ g(ae, { className: "h-4 w-4" })
|
|
292
|
+
}),
|
|
293
|
+
/* @__PURE__ */ g("button", {
|
|
294
|
+
onClick: () => U(e),
|
|
295
|
+
className: "rounded-md p-1.5 text-text-secondary hover:bg-status-error-bg hover:text-status-error-text",
|
|
296
|
+
"aria-label": "Delete goal",
|
|
297
|
+
children: /* @__PURE__ */ g(ue, { className: "h-4 w-4" })
|
|
298
|
+
})
|
|
299
|
+
]
|
|
300
|
+
})]
|
|
301
|
+
}), /* @__PURE__ */ g("div", {
|
|
302
|
+
className: "mt-3 h-2 w-full rounded-full bg-bg-sunken",
|
|
303
|
+
children: /* @__PURE__ */ g("div", {
|
|
304
|
+
className: "h-2 rounded-full bg-action-primary-bg",
|
|
305
|
+
style: { width: `${t}%` }
|
|
306
|
+
})
|
|
307
|
+
})]
|
|
308
|
+
}, e.id);
|
|
309
|
+
})
|
|
310
|
+
})]
|
|
311
|
+
}),
|
|
312
|
+
/* @__PURE__ */ _(u, {
|
|
313
|
+
open: ve,
|
|
314
|
+
onClose: () => z(!1),
|
|
315
|
+
title: B ? "Edit Focus Goal" : "Add Focus Goal",
|
|
316
|
+
description: "Set a target number of focus sessions",
|
|
317
|
+
footer: /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ g("button", {
|
|
318
|
+
onClick: () => z(!1),
|
|
319
|
+
className: "rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
|
|
320
|
+
children: "Cancel"
|
|
321
|
+
}), /* @__PURE__ */ g("button", {
|
|
322
|
+
onClick: xe,
|
|
323
|
+
disabled: M || F || Number(W.target) <= 0,
|
|
324
|
+
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",
|
|
325
|
+
children: M || F ? "Saving..." : B ? "Save Changes" : "Add Goal"
|
|
326
|
+
})] }),
|
|
327
|
+
children: [(N || I) && /* @__PURE__ */ g("div", {
|
|
328
|
+
className: "mb-4 rounded-lg border border-status-error-bg/40 bg-status-error-bg p-3 text-sm text-status-error-text",
|
|
329
|
+
children: "Failed to save goal. Please try again."
|
|
330
|
+
}), /* @__PURE__ */ _("div", {
|
|
331
|
+
className: "space-y-4",
|
|
332
|
+
children: [
|
|
333
|
+
/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("label", {
|
|
334
|
+
className: b,
|
|
335
|
+
children: "Goal Type"
|
|
336
|
+
}), /* @__PURE__ */ _("select", {
|
|
337
|
+
value: W.type,
|
|
338
|
+
onChange: (e) => {
|
|
339
|
+
let t = e.target.value;
|
|
340
|
+
G((e) => ({
|
|
341
|
+
...e,
|
|
342
|
+
type: t,
|
|
343
|
+
period: t,
|
|
344
|
+
endDate: t === l.Daily ? C(0) : t === l.Weekly ? C(7) : C(30)
|
|
345
|
+
}));
|
|
346
|
+
},
|
|
347
|
+
className: y,
|
|
348
|
+
children: [
|
|
349
|
+
/* @__PURE__ */ g("option", {
|
|
350
|
+
value: l.Daily,
|
|
351
|
+
children: "Daily"
|
|
352
|
+
}),
|
|
353
|
+
/* @__PURE__ */ g("option", {
|
|
354
|
+
value: l.Weekly,
|
|
355
|
+
children: "Weekly"
|
|
356
|
+
}),
|
|
357
|
+
/* @__PURE__ */ g("option", {
|
|
358
|
+
value: l.Monthly,
|
|
359
|
+
children: "Monthly"
|
|
360
|
+
})
|
|
361
|
+
]
|
|
362
|
+
})] }),
|
|
363
|
+
/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("label", {
|
|
364
|
+
className: b,
|
|
365
|
+
children: "Target Sessions"
|
|
366
|
+
}), /* @__PURE__ */ g("input", {
|
|
367
|
+
type: "number",
|
|
368
|
+
min: "1",
|
|
369
|
+
placeholder: "8",
|
|
370
|
+
value: W.target,
|
|
371
|
+
onChange: (e) => K("target", e.target.value),
|
|
372
|
+
className: y
|
|
373
|
+
})] }),
|
|
374
|
+
/* @__PURE__ */ _("div", {
|
|
375
|
+
className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
|
|
376
|
+
children: [/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("label", {
|
|
377
|
+
className: b,
|
|
378
|
+
children: "Start Date"
|
|
379
|
+
}), /* @__PURE__ */ g("input", {
|
|
380
|
+
type: "date",
|
|
381
|
+
value: W.startDate,
|
|
382
|
+
onChange: (e) => K("startDate", e.target.value),
|
|
383
|
+
className: y
|
|
384
|
+
})] }), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("label", {
|
|
385
|
+
className: b,
|
|
386
|
+
children: "End Date"
|
|
387
|
+
}), /* @__PURE__ */ g("input", {
|
|
388
|
+
type: "date",
|
|
389
|
+
value: W.endDate,
|
|
390
|
+
onChange: (e) => K("endDate", e.target.value),
|
|
391
|
+
className: y
|
|
392
|
+
})] })]
|
|
393
|
+
})
|
|
394
|
+
]
|
|
395
|
+
})]
|
|
396
|
+
}),
|
|
397
|
+
/* @__PURE__ */ _(u, {
|
|
398
|
+
open: H !== null,
|
|
399
|
+
onClose: () => U(null),
|
|
400
|
+
title: "Delete Focus Goal",
|
|
401
|
+
size: "sm",
|
|
402
|
+
footer: /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ g("button", {
|
|
403
|
+
onClick: () => U(null),
|
|
404
|
+
className: "rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
|
|
405
|
+
children: "Cancel"
|
|
406
|
+
}), /* @__PURE__ */ g("button", {
|
|
407
|
+
onClick: Se,
|
|
408
|
+
disabled: R,
|
|
409
|
+
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",
|
|
410
|
+
children: R ? "Deleting..." : "Delete"
|
|
411
|
+
})] }),
|
|
412
|
+
children: [_e && /* @__PURE__ */ g("div", {
|
|
413
|
+
className: "mb-4 rounded-lg border border-status-error-bg/40 bg-status-error-bg p-3 text-sm text-status-error-text",
|
|
414
|
+
children: "Failed to delete goal. Please try again."
|
|
415
|
+
}), /* @__PURE__ */ _("p", {
|
|
416
|
+
className: "text-sm text-text-secondary",
|
|
417
|
+
children: [
|
|
418
|
+
"Are you sure you want to delete this",
|
|
419
|
+
" ",
|
|
420
|
+
H?.type.toLowerCase(),
|
|
421
|
+
" focus goal? This action cannot be undone."
|
|
422
|
+
]
|
|
423
|
+
})]
|
|
184
424
|
})
|
|
185
425
|
]
|
|
186
426
|
});
|
|
187
427
|
}
|
|
188
428
|
//#endregion
|
|
189
|
-
export {
|
|
429
|
+
export { T as PomodoroPage };
|
|
190
430
|
|
|
191
431
|
//# sourceMappingURL=PomodoroPage.js.map
|