@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.
- package/dist/generated/wspace-operations.js +996 -816
- package/dist/generated/wspace-operations.js.map +1 -1
- 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/TimeCampusRoutes.js +16 -12
- package/dist/timecampus/TimeCampusRoutes.js.map +1 -1
- 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 +374 -92
- 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 +461 -87
- 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 +156 -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 +315 -110
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.js.map +1 -1
- package/dist/timecampus/pages/timeline/TimelinePage.js +250 -0
- package/dist/timecampus/pages/timeline/TimelinePage.js.map +1 -0
- 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/dist/timecampus/utils/helpers.js +20 -10
- package/dist/timecampus/utils/helpers.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { MeetingActionItemStatus as e } from "../../../generated/wspace-types.js";
|
|
2
|
+
import { Modal as t } from "../../components/Modal.js";
|
|
3
|
+
import { useState as n } from "react";
|
|
4
|
+
import { Fragment as r, jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
5
|
+
//#region src/timecampus/pages/meetings/ActionItemFormModal.tsx
|
|
6
|
+
var o = "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", s = "block text-sm font-medium text-text-primary", c = [
|
|
7
|
+
{
|
|
8
|
+
value: e.Pending,
|
|
9
|
+
label: "Pending"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
value: e.InProgress,
|
|
13
|
+
label: "In progress"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
value: e.Completed,
|
|
17
|
+
label: "Completed"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
value: e.Cancelled,
|
|
21
|
+
label: "Cancelled"
|
|
22
|
+
}
|
|
23
|
+
];
|
|
24
|
+
function l(e) {
|
|
25
|
+
if (!e) return "";
|
|
26
|
+
let t = new Date(e);
|
|
27
|
+
return Number.isNaN(t.getTime()) ? "" : t.toISOString().slice(0, 10);
|
|
28
|
+
}
|
|
29
|
+
var u = ({ open: u, onClose: d, item: f, submitting: p, error: m, onCreate: h, onUpdate: g }) => {
|
|
30
|
+
let _ = !!f, [v, y] = n(f?.title ?? ""), [b, x] = n(f?.assigneeId ?? ""), [S, C] = n(l(f?.dueDate)), [w, T] = n(f?.notes ?? ""), [E, D] = n(f?.status ?? e.Pending), O = !!v.trim() && !p;
|
|
31
|
+
return /* @__PURE__ */ a(t, {
|
|
32
|
+
open: u,
|
|
33
|
+
onClose: d,
|
|
34
|
+
title: _ ? "Edit action item" : "Add action item",
|
|
35
|
+
description: "Capture a follow-up so commitments from the meeting don't get lost.",
|
|
36
|
+
footer: /* @__PURE__ */ a(r, { children: [/* @__PURE__ */ i("button", {
|
|
37
|
+
onClick: d,
|
|
38
|
+
className: "rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
|
|
39
|
+
children: "Cancel"
|
|
40
|
+
}), /* @__PURE__ */ i("button", {
|
|
41
|
+
onClick: async () => {
|
|
42
|
+
if (!O) return;
|
|
43
|
+
let e = S ? new Date(S).toISOString() : void 0;
|
|
44
|
+
_ && g ? await g({
|
|
45
|
+
title: v.trim(),
|
|
46
|
+
assigneeId: b.trim() || void 0,
|
|
47
|
+
dueDate: e,
|
|
48
|
+
notes: w.trim() || void 0,
|
|
49
|
+
status: E
|
|
50
|
+
}) : h && await h({
|
|
51
|
+
title: v.trim(),
|
|
52
|
+
assigneeId: b.trim() || void 0,
|
|
53
|
+
dueDate: e,
|
|
54
|
+
notes: w.trim() || void 0
|
|
55
|
+
});
|
|
56
|
+
},
|
|
57
|
+
disabled: !O,
|
|
58
|
+
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",
|
|
59
|
+
children: p ? "Saving..." : _ ? "Save Changes" : "Add action item"
|
|
60
|
+
})] }),
|
|
61
|
+
children: [m && /* @__PURE__ */ i("div", {
|
|
62
|
+
className: "mb-4 rounded-lg border border-status-error-bg/40 bg-status-error-bg p-3 text-sm text-status-error-text",
|
|
63
|
+
children: "Failed to save action item. Please try again."
|
|
64
|
+
}), /* @__PURE__ */ a("div", {
|
|
65
|
+
className: "space-y-4",
|
|
66
|
+
children: [
|
|
67
|
+
/* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("label", {
|
|
68
|
+
className: s,
|
|
69
|
+
children: "Title"
|
|
70
|
+
}), /* @__PURE__ */ i("input", {
|
|
71
|
+
type: "text",
|
|
72
|
+
placeholder: "What needs to happen?",
|
|
73
|
+
value: v,
|
|
74
|
+
onChange: (e) => y(e.target.value),
|
|
75
|
+
className: o
|
|
76
|
+
})] }),
|
|
77
|
+
/* @__PURE__ */ a("div", {
|
|
78
|
+
className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
|
|
79
|
+
children: [/* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("label", {
|
|
80
|
+
className: s,
|
|
81
|
+
children: "Assignee (User ID)"
|
|
82
|
+
}), /* @__PURE__ */ i("input", {
|
|
83
|
+
type: "text",
|
|
84
|
+
placeholder: "User ID",
|
|
85
|
+
value: b,
|
|
86
|
+
onChange: (e) => x(e.target.value),
|
|
87
|
+
className: o
|
|
88
|
+
})] }), /* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("label", {
|
|
89
|
+
className: s,
|
|
90
|
+
children: "Due date"
|
|
91
|
+
}), /* @__PURE__ */ i("input", {
|
|
92
|
+
type: "date",
|
|
93
|
+
value: S,
|
|
94
|
+
onChange: (e) => C(e.target.value),
|
|
95
|
+
className: o
|
|
96
|
+
})] })]
|
|
97
|
+
}),
|
|
98
|
+
_ && /* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("label", {
|
|
99
|
+
className: s,
|
|
100
|
+
children: "Status"
|
|
101
|
+
}), /* @__PURE__ */ i("select", {
|
|
102
|
+
value: E,
|
|
103
|
+
onChange: (e) => D(e.target.value),
|
|
104
|
+
className: o,
|
|
105
|
+
children: c.map((e) => /* @__PURE__ */ i("option", {
|
|
106
|
+
value: e.value,
|
|
107
|
+
children: e.label
|
|
108
|
+
}, e.value))
|
|
109
|
+
})] }),
|
|
110
|
+
/* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("label", {
|
|
111
|
+
className: s,
|
|
112
|
+
children: "Notes"
|
|
113
|
+
}), /* @__PURE__ */ i("textarea", {
|
|
114
|
+
placeholder: "Additional context...",
|
|
115
|
+
rows: 3,
|
|
116
|
+
value: w,
|
|
117
|
+
onChange: (e) => T(e.target.value),
|
|
118
|
+
className: o
|
|
119
|
+
})] })
|
|
120
|
+
]
|
|
121
|
+
})]
|
|
122
|
+
});
|
|
123
|
+
};
|
|
124
|
+
//#endregion
|
|
125
|
+
export { u as ActionItemFormModal };
|
|
126
|
+
|
|
127
|
+
//# sourceMappingURL=ActionItemFormModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActionItemFormModal.js","names":[],"sources":["../../../../src/timecampus/pages/meetings/ActionItemFormModal.tsx"],"sourcesContent":["import { useState, type FC } from \"react\";\nimport { Modal } from \"../../components/Modal\";\nimport {\n MeetingActionItemStatus,\n type CreateActionItemInput,\n type UpdateActionItemInput,\n} from \"@/generated/wspace-types\";\nimport type { MeetingActionItemFieldsFragment } from \"@/generated/wspace-operations\";\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 STATUSES: { value: MeetingActionItemStatus; label: string }[] = [\n { value: MeetingActionItemStatus.Pending, label: \"Pending\" },\n { value: MeetingActionItemStatus.InProgress, label: \"In progress\" },\n { value: MeetingActionItemStatus.Completed, label: \"Completed\" },\n { value: MeetingActionItemStatus.Cancelled, label: \"Cancelled\" },\n];\n\n/** Convert an ISO string to a value usable by a date input. */\nfunction toDateInput(iso?: string | null): string {\n if (!iso) return \"\";\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return \"\";\n return d.toISOString().slice(0, 10);\n}\n\ninterface ActionItemFormModalProps {\n open: boolean;\n onClose: () => void;\n item?: MeetingActionItemFieldsFragment;\n submitting: boolean;\n error?: boolean;\n onCreate?: (input: CreateActionItemInput) => Promise<void> | void;\n onUpdate?: (input: UpdateActionItemInput) => Promise<void> | void;\n}\n\nexport const ActionItemFormModal: FC<ActionItemFormModalProps> = ({\n open,\n onClose,\n item,\n submitting,\n error,\n onCreate,\n onUpdate,\n}) => {\n const isEdit = Boolean(item);\n const [title, setTitle] = useState(item?.title ?? \"\");\n const [assigneeId, setAssigneeId] = useState(item?.assigneeId ?? \"\");\n const [dueDate, setDueDate] = useState(toDateInput(item?.dueDate));\n const [notes, setNotes] = useState(item?.notes ?? \"\");\n const [status, setStatus] = useState<MeetingActionItemStatus>(\n (item?.status as MeetingActionItemStatus | undefined) ??\n MeetingActionItemStatus.Pending,\n );\n\n const canSubmit = Boolean(title.trim()) && !submitting;\n\n const handleSubmit = async () => {\n if (!canSubmit) return;\n const dueIso = dueDate ? new Date(dueDate).toISOString() : undefined;\n if (isEdit && onUpdate) {\n await onUpdate({\n title: title.trim(),\n assigneeId: assigneeId.trim() || undefined,\n dueDate: dueIso,\n notes: notes.trim() || undefined,\n status,\n });\n } else if (onCreate) {\n await onCreate({\n title: title.trim(),\n assigneeId: assigneeId.trim() || undefined,\n dueDate: dueIso,\n notes: notes.trim() || undefined,\n });\n }\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={isEdit ? \"Edit action item\" : \"Add action item\"}\n description=\"Capture a follow-up so commitments from the meeting don't get lost.\"\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\n ? \"Saving...\"\n : isEdit\n ? \"Save Changes\"\n : \"Add action item\"}\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 save action item. Please try again.\n </div>\n )}\n <div className=\"space-y-4\">\n <div>\n <label className={labelClass}>Title</label>\n <input\n type=\"text\"\n placeholder=\"What needs to happen?\"\n value={title}\n onChange={(e) => setTitle(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}>Assignee (User ID)</label>\n <input\n type=\"text\"\n placeholder=\"User ID\"\n value={assigneeId}\n onChange={(e) => setAssigneeId(e.target.value)}\n className={inputClass}\n />\n </div>\n <div>\n <label className={labelClass}>Due date</label>\n <input\n type=\"date\"\n value={dueDate}\n onChange={(e) => setDueDate(e.target.value)}\n className={inputClass}\n />\n </div>\n </div>\n {isEdit && (\n <div>\n <label className={labelClass}>Status</label>\n <select\n value={status}\n onChange={(e) =>\n setStatus(e.target.value as MeetingActionItemStatus)\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 )}\n <div>\n <label className={labelClass}>Notes</label>\n <textarea\n placeholder=\"Additional context...\"\n rows={3}\n value={notes}\n onChange={(e) => setNotes(e.target.value)}\n className={inputClass}\n />\n </div>\n </div>\n </Modal>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1,105 +1,115 @@
|
|
|
1
|
-
import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
|
|
2
|
-
import { useCreateMeetingMutation as
|
|
3
|
-
import { PageLayout as
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
1
|
+
import { useTimeCampus as e, useTimeCampusNavigate as t } from "../../providers/TimeCampusProvider.js";
|
|
2
|
+
import { useCreateMeetingMutation as n } from "../../../generated/wspace-operations.js";
|
|
3
|
+
import { PageLayout as r } from "../../components/PageLayout.js";
|
|
4
|
+
import { MeetingType as i } from "../../../generated/wspace-types.js";
|
|
5
|
+
import { useCallback as a, useState as o } from "react";
|
|
6
|
+
import { ArrowLeft as s } from "lucide-react";
|
|
7
|
+
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
8
|
+
import { GlassCard as u } from "@burdenoff/fe-libs/ui";
|
|
8
9
|
//#region src/timecampus/pages/meetings/MeetingCreatePage.tsx
|
|
9
|
-
function
|
|
10
|
-
let { workspaceId:
|
|
11
|
-
!
|
|
10
|
+
function d() {
|
|
11
|
+
let { workspaceId: d = "" } = e(), f = t(), [p, { loading: m, error: h }] = n(), [g, _] = o(""), [v, y] = o(""), [b, x] = o(30), [S, C] = o(""), w = a(() => f("/meetings"), [f]), T = a(async () => {
|
|
12
|
+
if (!d || !g || !v) return;
|
|
13
|
+
let e = new Date(v).toISOString(), t = b > 0 ? new Date(new Date(v).getTime() + b * 6e4).toISOString() : void 0;
|
|
14
|
+
await p({
|
|
12
15
|
variables: { input: {
|
|
13
|
-
workspaceId:
|
|
14
|
-
title:
|
|
15
|
-
meetingType:
|
|
16
|
-
startTime:
|
|
17
|
-
|
|
18
|
-
notes:
|
|
16
|
+
workspaceId: d,
|
|
17
|
+
title: g.trim(),
|
|
18
|
+
meetingType: i.Team,
|
|
19
|
+
startTime: e,
|
|
20
|
+
endTime: t,
|
|
21
|
+
notes: S.trim() || void 0
|
|
19
22
|
} },
|
|
20
23
|
refetchQueries: ["ListMeetings"]
|
|
21
|
-
}),
|
|
24
|
+
}), f("/meetings");
|
|
22
25
|
}, [
|
|
23
|
-
|
|
24
|
-
f,
|
|
25
|
-
m,
|
|
26
|
+
d,
|
|
26
27
|
g,
|
|
27
28
|
v,
|
|
28
|
-
|
|
29
|
+
b,
|
|
30
|
+
S,
|
|
31
|
+
p,
|
|
32
|
+
f
|
|
29
33
|
]);
|
|
30
|
-
return /* @__PURE__ */
|
|
34
|
+
return /* @__PURE__ */ c(r, {
|
|
31
35
|
title: "Schedule Meeting",
|
|
32
36
|
description: "Create a new meeting",
|
|
33
37
|
purpose: "Book a meeting with its time and agenda so it's tracked alongside your work — letting TimeCampus account for the hours it consumes and surface its cost and action items afterwards.",
|
|
34
|
-
actions: /* @__PURE__ */
|
|
38
|
+
actions: /* @__PURE__ */ l("button", {
|
|
39
|
+
onClick: w,
|
|
35
40
|
className: "inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
|
|
36
|
-
children: [/* @__PURE__ */
|
|
41
|
+
children: [/* @__PURE__ */ c(s, { className: "h-4 w-4" }), "Back"]
|
|
37
42
|
}),
|
|
38
|
-
children: /* @__PURE__ */
|
|
43
|
+
children: /* @__PURE__ */ l(u, {
|
|
39
44
|
treatment: "glass",
|
|
40
45
|
glow: !0,
|
|
41
46
|
className: "mx-auto max-w-2xl p-6",
|
|
42
|
-
children: /* @__PURE__ */
|
|
47
|
+
children: [h && /* @__PURE__ */ c("div", {
|
|
48
|
+
className: "mb-4 rounded-lg border border-status-error-bg/40 bg-status-error-bg p-3 text-sm text-status-error-text",
|
|
49
|
+
children: "Failed to schedule meeting. Please try again."
|
|
50
|
+
}), /* @__PURE__ */ l("div", {
|
|
43
51
|
className: "space-y-4",
|
|
44
52
|
children: [
|
|
45
|
-
/* @__PURE__ */
|
|
53
|
+
/* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("label", {
|
|
46
54
|
className: "block text-sm font-medium text-text-primary",
|
|
47
55
|
children: "Meeting Title"
|
|
48
|
-
}), /* @__PURE__ */
|
|
56
|
+
}), /* @__PURE__ */ c("input", {
|
|
49
57
|
type: "text",
|
|
50
58
|
placeholder: "Enter meeting title",
|
|
51
|
-
value:
|
|
52
|
-
onChange: (e) =>
|
|
59
|
+
value: g,
|
|
60
|
+
onChange: (e) => _(e.target.value),
|
|
53
61
|
className: "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"
|
|
54
62
|
})] }),
|
|
55
|
-
/* @__PURE__ */
|
|
56
|
-
className: "grid grid-cols-
|
|
57
|
-
children: [/* @__PURE__ */
|
|
63
|
+
/* @__PURE__ */ l("div", {
|
|
64
|
+
className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
|
|
65
|
+
children: [/* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("label", {
|
|
58
66
|
className: "block text-sm font-medium text-text-primary",
|
|
59
67
|
children: "Date"
|
|
60
|
-
}), /* @__PURE__ */
|
|
68
|
+
}), /* @__PURE__ */ c("input", {
|
|
61
69
|
type: "date",
|
|
62
|
-
value:
|
|
63
|
-
onChange: (e) =>
|
|
70
|
+
value: v,
|
|
71
|
+
onChange: (e) => y(e.target.value),
|
|
64
72
|
className: "mt-1 w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary"
|
|
65
|
-
})] }), /* @__PURE__ */
|
|
73
|
+
})] }), /* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("label", {
|
|
66
74
|
className: "block text-sm font-medium text-text-primary",
|
|
67
75
|
children: "Duration (minutes)"
|
|
68
|
-
}), /* @__PURE__ */
|
|
76
|
+
}), /* @__PURE__ */ c("input", {
|
|
69
77
|
type: "number",
|
|
70
|
-
|
|
71
|
-
|
|
78
|
+
min: 0,
|
|
79
|
+
value: b,
|
|
80
|
+
onChange: (e) => x(Number(e.target.value)),
|
|
72
81
|
className: "mt-1 w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary"
|
|
73
82
|
})] })]
|
|
74
83
|
}),
|
|
75
|
-
/* @__PURE__ */
|
|
84
|
+
/* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("label", {
|
|
76
85
|
className: "block text-sm font-medium text-text-primary",
|
|
77
86
|
children: "Description"
|
|
78
|
-
}), /* @__PURE__ */
|
|
87
|
+
}), /* @__PURE__ */ c("textarea", {
|
|
79
88
|
placeholder: "Meeting agenda...",
|
|
80
89
|
rows: 3,
|
|
81
|
-
value:
|
|
82
|
-
onChange: (e) =>
|
|
90
|
+
value: S,
|
|
91
|
+
onChange: (e) => C(e.target.value),
|
|
83
92
|
className: "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"
|
|
84
93
|
})] }),
|
|
85
|
-
/* @__PURE__ */
|
|
94
|
+
/* @__PURE__ */ l("div", {
|
|
86
95
|
className: "flex justify-end gap-2 pt-4",
|
|
87
|
-
children: [/* @__PURE__ */
|
|
96
|
+
children: [/* @__PURE__ */ c("button", {
|
|
97
|
+
onClick: w,
|
|
88
98
|
className: "rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
|
|
89
99
|
children: "Cancel"
|
|
90
|
-
}), /* @__PURE__ */
|
|
91
|
-
onClick:
|
|
92
|
-
disabled:
|
|
100
|
+
}), /* @__PURE__ */ c("button", {
|
|
101
|
+
onClick: T,
|
|
102
|
+
disabled: m || !g || !v,
|
|
93
103
|
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",
|
|
94
|
-
children:
|
|
104
|
+
children: m ? "Scheduling..." : "Schedule"
|
|
95
105
|
})]
|
|
96
106
|
})
|
|
97
107
|
]
|
|
98
|
-
})
|
|
108
|
+
})]
|
|
99
109
|
})
|
|
100
110
|
});
|
|
101
111
|
}
|
|
102
112
|
//#endregion
|
|
103
|
-
export {
|
|
113
|
+
export { d as MeetingCreatePage };
|
|
104
114
|
|
|
105
115
|
//# sourceMappingURL=MeetingCreatePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MeetingCreatePage.js","names":[],"sources":["../../../../src/timecampus/pages/meetings/MeetingCreatePage.tsx"],"sourcesContent":["import { useState, useCallback } from \"react\";\nimport { ArrowLeft } from \"lucide-react\";\nimport { GlassCard } from \"@burdenoff/fe-libs/ui\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport {
|
|
1
|
+
{"version":3,"file":"MeetingCreatePage.js","names":[],"sources":["../../../../src/timecampus/pages/meetings/MeetingCreatePage.tsx"],"sourcesContent":["import { useState, useCallback } from \"react\";\nimport { ArrowLeft } from \"lucide-react\";\nimport { GlassCard } from \"@burdenoff/fe-libs/ui\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport {\n useTimeCampus,\n useTimeCampusNavigate,\n} from \"../../providers/TimeCampusProvider\";\nimport { useCreateMeetingMutation } from \"@/generated/wspace-operations\";\nimport { MeetingType } from \"@/generated/wspace-types\";\n\nexport function MeetingCreatePage() {\n const { workspaceId = \"\" } = useTimeCampus();\n const navigate = useTimeCampusNavigate();\n const [createMeeting, { loading: creating, error }] =\n useCreateMeetingMutation();\n\n const [title, setTitle] = useState(\"\");\n const [date, setDate] = useState(\"\");\n const [duration, setDuration] = useState(30);\n const [description, setDescription] = useState(\"\");\n\n const goBack = useCallback(() => navigate(\"/meetings\"), [navigate]);\n\n const handleSubmit = useCallback(async () => {\n if (!workspaceId || !title || !date) return;\n const startTime = new Date(date).toISOString();\n const endTime =\n duration > 0\n ? new Date(new Date(date).getTime() + duration * 60_000).toISOString()\n : undefined;\n await createMeeting({\n variables: {\n input: {\n workspaceId,\n title: title.trim(),\n meetingType: MeetingType.Team,\n startTime,\n endTime,\n notes: description.trim() || undefined,\n },\n },\n refetchQueries: [\"ListMeetings\"],\n });\n navigate(\"/meetings\");\n }, [\n workspaceId,\n title,\n date,\n duration,\n description,\n createMeeting,\n navigate,\n ]);\n\n return (\n <PageLayout\n title=\"Schedule Meeting\"\n description=\"Create a new meeting\"\n purpose=\"Book a meeting with its time and agenda so it's tracked alongside your work — letting TimeCampus account for the hours it consumes and surface its cost and action items afterwards.\"\n actions={\n <button\n onClick={goBack}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back\n </button>\n }\n >\n <GlassCard treatment=\"glass\" glow className=\"mx-auto max-w-2xl p-6\">\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 schedule meeting. Please try again.\n </div>\n )}\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\n Meeting Title\n </label>\n <input\n type=\"text\"\n placeholder=\"Enter meeting title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n className=\"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\"\n />\n </div>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\n Date\n </label>\n <input\n type=\"date\"\n value={date}\n onChange={(e) => setDate(e.target.value)}\n className=\"mt-1 w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\n Duration (minutes)\n </label>\n <input\n type=\"number\"\n min={0}\n value={duration}\n onChange={(e) => setDuration(Number(e.target.value))}\n className=\"mt-1 w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\n Description\n </label>\n <textarea\n placeholder=\"Meeting agenda...\"\n rows={3}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n className=\"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\"\n />\n </div>\n <div className=\"flex justify-end gap-2 pt-4\">\n <button\n onClick={goBack}\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={creating || !title || !date}\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 {creating ? \"Scheduling...\" : \"Schedule\"}\n </button>\n </div>\n </div>\n </GlassCard>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AAWA,SAAgB,IAAoB;CAClC,IAAM,EAAE,iBAAc,OAAO,GAAe,EACtC,IAAW,GAAuB,EAClC,CAAC,GAAe,EAAE,SAAS,GAAU,cACzC,GAA0B,EAEtB,CAAC,GAAO,KAAY,EAAS,GAAG,EAChC,CAAC,GAAM,KAAW,EAAS,GAAG,EAC9B,CAAC,GAAU,KAAe,EAAS,GAAG,EACtC,CAAC,GAAa,KAAkB,EAAS,GAAG,EAE5C,IAAS,QAAkB,EAAS,YAAY,EAAE,CAAC,EAAS,CAAC,EAE7D,IAAe,EAAY,YAAY;AAC3C,MAAI,CAAC,KAAe,CAAC,KAAS,CAAC,EAAM;EACrC,IAAM,IAAY,IAAI,KAAK,EAAK,CAAC,aAAa,EACxC,IACJ,IAAW,IACP,IAAI,KAAK,IAAI,KAAK,EAAK,CAAC,SAAS,GAAG,IAAW,IAAO,CAAC,aAAa,GACpE,KAAA;AAcN,EAbA,MAAM,EAAc;GAClB,WAAW,EACT,OAAO;IACL;IACA,OAAO,EAAM,MAAM;IACnB,aAAa,EAAY;IACzB;IACA;IACA,OAAO,EAAY,MAAM,IAAI,KAAA;IAC9B,EACF;GACD,gBAAgB,CAAC,eAAe;GACjC,CAAC,EACF,EAAS,YAAY;IACpB;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;AAEF,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SAAQ;EACR,SACE,kBAAC,UAAD;GACE,SAAS;GACT,WAAU;aAFZ,CAIE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,OAE1B;;YAGX,kBAAC,GAAD;GAAW,WAAU;GAAQ,MAAA;GAAK,WAAU;aAA5C,CACG,KACC,kBAAC,OAAD;IAAK,WAAU;cAAyG;IAElH,CAAA,EAER,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;MAAO,WAAU;gBAA8C;MAEvD,CAAA,EACR,kBAAC,SAAD;MACE,MAAK;MACL,aAAY;MACZ,OAAO;MACP,WAAW,MAAM,EAAS,EAAE,OAAO,MAAM;MACzC,WAAU;MACV,CAAA,CACE,EAAA,CAAA;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;OAAO,WAAU;iBAA8C;OAEvD,CAAA,EACR,kBAAC,SAAD;OACE,MAAK;OACL,OAAO;OACP,WAAW,MAAM,EAAQ,EAAE,OAAO,MAAM;OACxC,WAAU;OACV,CAAA,CACE,EAAA,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;OAAO,WAAU;iBAA8C;OAEvD,CAAA,EACR,kBAAC,SAAD;OACE,MAAK;OACL,KAAK;OACL,OAAO;OACP,WAAW,MAAM,EAAY,OAAO,EAAE,OAAO,MAAM,CAAC;OACpD,WAAU;OACV,CAAA,CACE,EAAA,CAAA,CACF;;KACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;MAAO,WAAU;gBAA8C;MAEvD,CAAA,EACR,kBAAC,YAAD;MACE,aAAY;MACZ,MAAM;MACN,OAAO;MACP,WAAW,MAAM,EAAe,EAAE,OAAO,MAAM;MAC/C,WAAU;MACV,CAAA,CACE,EAAA,CAAA;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,UAAD;OACE,SAAS;OACT,WAAU;iBACX;OAEQ,CAAA,EACT,kBAAC,UAAD;OACE,SAAS;OACT,UAAU,KAAY,CAAC,KAAS,CAAC;OACjC,WAAU;iBAET,IAAW,kBAAkB;OACvB,CAAA,CACL;;KACF;MACI;;EACD,CAAA"}
|