@burdenoff/microfe-timecampus 2026.703.7 → 2026.707.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generated/wspace-operations.js +1023 -1514
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/generated/wspace-types.js +12 -18
- package/dist/generated/wspace-types.js.map +1 -1
- package/dist/index.js +4 -4
- package/dist/timecampus/TimeCampusRoot.js +82 -150
- package/dist/timecampus/TimeCampusRoot.js.map +1 -1
- package/dist/timecampus/TimeCampusRoutes.js +96 -164
- package/dist/timecampus/TimeCampusRoutes.js.map +1 -1
- package/dist/timecampus/components/index.js +2 -2
- package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js +7 -7
- package/dist/timecampus/pages/client-portal/ClientPortalPage.js +6 -6
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js +8 -8
- package/dist/timecampus/pages/geofencing/GeofencingPage.js +6 -6
- package/dist/timecampus/pages/lifetime/FiniteLifePage.js +91 -91
- package/dist/timecampus/pages/lifetime/FiniteLifePage.js.map +1 -1
- package/dist/timecampus/pages/lifetime/LifeBalancePage.js +18 -18
- package/dist/timecampus/pages/lifetime/LifeTimelinePage.js +7 -7
- package/dist/timecampus/pages/lifetime/ValuesGoalsPage.js +1 -1
- package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js +6 -6
- package/dist/timecampus/pages/projects/ProjectDetailPage.js +7 -7
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js +212 -212
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamMembersPage.js +4 -4
- package/dist/timecampus/pages/time/TimeTrackingPage.js +143 -143
- package/dist/timecampus/pages/time/TimeTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.js +1 -1
- package/dist/timecampus/pages/timeline/TimelinePage.js +1 -1
- package/dist/timecampus/pages/timeline/TimelinePage.js.map +1 -1
- package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js +87 -93
- package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js.map +1 -1
- package/package.json +1 -1
- package/dist/timecampus/pages/applets/AppletStorePage.js +0 -167
- package/dist/timecampus/pages/applets/AppletStorePage.js.map +0 -1
- package/dist/timecampus/pages/applets/InstalledAppletsPage.js +0 -162
- package/dist/timecampus/pages/applets/InstalledAppletsPage.js.map +0 -1
- package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js +0 -133
- package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js.map +0 -1
- package/dist/timecampus/pages/channels/ChannelsPage.js +0 -418
- package/dist/timecampus/pages/channels/ChannelsPage.js.map +0 -1
- package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js +0 -142
- package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js.map +0 -1
- package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js +0 -119
- package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js.map +0 -1
- package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js +0 -110
- package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js.map +0 -1
- package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js +0 -83
- package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js.map +0 -1
- package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js +0 -198
- package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js.map +0 -1
- package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js +0 -124
- package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js.map +0 -1
- package/dist/timecampus/pages/templates/TemplateApplicationPage.js +0 -88
- package/dist/timecampus/pages/templates/TemplateApplicationPage.js.map +0 -1
- package/dist/timecampus/pages/templates/TemplateDetailPage.js +0 -135
- package/dist/timecampus/pages/templates/TemplateDetailPage.js.map +0 -1
- package/dist/timecampus/pages/templates/TemplatesPage.js +0 -191
- package/dist/timecampus/pages/templates/TemplatesPage.js.map +0 -1
- package/dist/timecampus/pages/widgets/WidgetDetailPage.js +0 -196
- package/dist/timecampus/pages/widgets/WidgetDetailPage.js.map +0 -1
- package/dist/timecampus/pages/widgets/WidgetsPage.js +0 -297
- package/dist/timecampus/pages/widgets/WidgetsPage.js.map +0 -1
- package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js +0 -133
- package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js.map +0 -1
- package/dist/timecampus/pages/workflows/WorkflowsPage.js +0 -311
- package/dist/timecampus/pages/workflows/WorkflowsPage.js.map +0 -1
|
@@ -1,311 +0,0 @@
|
|
|
1
|
-
import { cn as e } from "../../utils/helpers.js";
|
|
2
|
-
import { StatCard as t } from "../../components/StatCard.js";
|
|
3
|
-
import { LoadingSkeleton as n } from "../../components/LoadingSkeleton.js";
|
|
4
|
-
import { useDeleteConfigurationMutation as r, useListConfigurationsQuery as i, useSetConfigurationMutation as a } from "../../../generated/wspace-operations.js";
|
|
5
|
-
import { PageLayout as o } from "../../components/PageLayout.js";
|
|
6
|
-
import { StatusBadge as s } from "../../components/StatusBadge.js";
|
|
7
|
-
import { EmptyState as c } from "../../components/EmptyState.js";
|
|
8
|
-
import { ChartCard as l } from "../../components/ChartCard.js";
|
|
9
|
-
import { Modal as u } from "../../components/Modal.js";
|
|
10
|
-
import { DonutChart as d } from "../../components/charts/DonutChart.js";
|
|
11
|
-
import "../../components/index.js";
|
|
12
|
-
import { TimeCampusConfigScope as f } from "../../../generated/wspace-types.js";
|
|
13
|
-
import { useState as p } from "react";
|
|
14
|
-
import { AlertTriangle as m, CalendarClock as h, Clock as g, FileText as _, GitBranch as v, MousePointerClick as y, PauseCircle as b, Plus as ee, Power as x, Timer as S, Trash2 as C, Workflow as w, Zap as T } from "lucide-react";
|
|
15
|
-
import { Fragment as E, jsx as D, jsxs as O } from "react/jsx-runtime";
|
|
16
|
-
import { GlassCard as k } from "@burdenoff/fe-libs/ui";
|
|
17
|
-
//#region src/timecampus/pages/workflows/WorkflowsPage.tsx
|
|
18
|
-
var A = [
|
|
19
|
-
{
|
|
20
|
-
value: "timer.started",
|
|
21
|
-
label: "When a timer starts"
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
value: "timer.stopped",
|
|
25
|
-
label: "When a timer stops"
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
value: "entry.created",
|
|
29
|
-
label: "When a time entry is created"
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
value: "timesheet.due",
|
|
33
|
-
label: "When a timesheet is due"
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
value: "budget.overrun",
|
|
37
|
-
label: "When a project runs over budget"
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
value: "manual",
|
|
41
|
-
label: "Manually"
|
|
42
|
-
}
|
|
43
|
-
], j = {
|
|
44
|
-
"timer.started": S,
|
|
45
|
-
"timer.stopped": g,
|
|
46
|
-
"entry.created": _,
|
|
47
|
-
"timesheet.due": h,
|
|
48
|
-
"budget.overrun": m,
|
|
49
|
-
manual: y
|
|
50
|
-
};
|
|
51
|
-
function M(e) {
|
|
52
|
-
return A.find((t) => t.value === e)?.label ?? e;
|
|
53
|
-
}
|
|
54
|
-
function N(e) {
|
|
55
|
-
return j[e] ?? T;
|
|
56
|
-
}
|
|
57
|
-
function P() {
|
|
58
|
-
let { data: m, loading: h, error: g, refetch: _ } = i({ variables: { scope: f.Workspace } }), [y, { loading: S, error: T }] = a(), [j] = r(), [P, F] = p(!1), [I, L] = p(""), [R, z] = p(A[0].value), [B, V] = p(""), [H, U] = p(null), W = (m?.timeCampusConfigurations ?? []).filter((e) => e.key.startsWith("workflow.")), G = W.filter((e) => (e.value ?? {}).status === "active").length, K = W.length - G, q = W.reduce((e, t) => {
|
|
59
|
-
let n = (t.value ?? {}).trigger ?? "manual";
|
|
60
|
-
return e[n] = (e[n] ?? 0) + 1, e;
|
|
61
|
-
}, {}), J = Object.entries(q).sort((e, t) => t[1] - e[1]).map(([e, t]) => ({
|
|
62
|
-
name: M(e),
|
|
63
|
-
value: t
|
|
64
|
-
})), Y = () => {
|
|
65
|
-
L(""), z(A[0].value), V("");
|
|
66
|
-
}, X = () => {
|
|
67
|
-
Y(), F(!0);
|
|
68
|
-
}, Z = async () => {
|
|
69
|
-
if (!I.trim()) return;
|
|
70
|
-
let e = typeof crypto < "u" && "randomUUID" in crypto ? crypto.randomUUID() : `${Date.now()}`, t = B.trim();
|
|
71
|
-
await y({ variables: { input: {
|
|
72
|
-
key: `workflow.${e}`,
|
|
73
|
-
scope: f.Workspace,
|
|
74
|
-
value: {
|
|
75
|
-
name: I.trim(),
|
|
76
|
-
trigger: R,
|
|
77
|
-
status: "active",
|
|
78
|
-
description: t || void 0,
|
|
79
|
-
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
80
|
-
},
|
|
81
|
-
description: t || void 0
|
|
82
|
-
} } }), await _(), F(!1), Y();
|
|
83
|
-
}, Q = async (e) => {
|
|
84
|
-
U(e.id);
|
|
85
|
-
try {
|
|
86
|
-
let t = e.value ?? {}, n = t.status === "active" ? "inactive" : "active";
|
|
87
|
-
await y({ variables: { input: {
|
|
88
|
-
key: e.key,
|
|
89
|
-
scope: f.Workspace,
|
|
90
|
-
value: {
|
|
91
|
-
...t,
|
|
92
|
-
status: n
|
|
93
|
-
},
|
|
94
|
-
description: e.description ?? void 0
|
|
95
|
-
} } }), await _();
|
|
96
|
-
} finally {
|
|
97
|
-
U(null);
|
|
98
|
-
}
|
|
99
|
-
}, te = async (e) => {
|
|
100
|
-
U(e);
|
|
101
|
-
try {
|
|
102
|
-
await j({ variables: { id: e } }), await _();
|
|
103
|
-
} finally {
|
|
104
|
-
U(null);
|
|
105
|
-
}
|
|
106
|
-
};
|
|
107
|
-
if (h) return /* @__PURE__ */ D(o, {
|
|
108
|
-
title: "Workflows",
|
|
109
|
-
description: "Automate repetitive tasks",
|
|
110
|
-
children: /* @__PURE__ */ D(n, {
|
|
111
|
-
variant: "list",
|
|
112
|
-
count: 5
|
|
113
|
-
})
|
|
114
|
-
});
|
|
115
|
-
if (g) return /* @__PURE__ */ D(o, {
|
|
116
|
-
title: "Workflows",
|
|
117
|
-
description: "Automate repetitive tasks",
|
|
118
|
-
children: /* @__PURE__ */ D("div", {
|
|
119
|
-
className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
|
|
120
|
-
children: "Failed to load workflow configurations. Please try again later."
|
|
121
|
-
})
|
|
122
|
-
});
|
|
123
|
-
let $ = /* @__PURE__ */ O("button", {
|
|
124
|
-
type: "button",
|
|
125
|
-
onClick: X,
|
|
126
|
-
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",
|
|
127
|
-
children: [/* @__PURE__ */ D(ee, { className: "h-4 w-4" }), "Create Workflow"]
|
|
128
|
-
});
|
|
129
|
-
return /* @__PURE__ */ O(o, {
|
|
130
|
-
title: "Workflows",
|
|
131
|
-
description: "Automate repetitive tasks",
|
|
132
|
-
purpose: "Put the busywork on autopilot — auto-start timers, submit timesheets, flag overruns — by wiring up rules that react to what happens in TimeCampus. Each workflow you define is saved to your workspace; the advanced trigger/condition builder is on the roadmap.",
|
|
133
|
-
actions: $,
|
|
134
|
-
children: [W.length === 0 ? /* @__PURE__ */ D(c, {
|
|
135
|
-
illustration: "empty-generic",
|
|
136
|
-
title: "No workflows configured yet",
|
|
137
|
-
description: "Create your first automation to handle repetitive time-tracking tasks — workflows are stored as workspace configurations and appear here.",
|
|
138
|
-
action: $
|
|
139
|
-
}) : /* @__PURE__ */ O("div", {
|
|
140
|
-
className: "space-y-6",
|
|
141
|
-
children: [/* @__PURE__ */ O("div", {
|
|
142
|
-
className: "grid grid-cols-1 gap-4 sm:grid-cols-3",
|
|
143
|
-
children: [
|
|
144
|
-
/* @__PURE__ */ D(t, {
|
|
145
|
-
featured: !0,
|
|
146
|
-
title: "Automations",
|
|
147
|
-
value: W.length,
|
|
148
|
-
icon: /* @__PURE__ */ D(w, { className: "h-5 w-5" }),
|
|
149
|
-
description: "Rules defined"
|
|
150
|
-
}),
|
|
151
|
-
/* @__PURE__ */ D(t, {
|
|
152
|
-
title: "Active",
|
|
153
|
-
value: G,
|
|
154
|
-
icon: /* @__PURE__ */ D(x, { className: "h-5 w-5" }),
|
|
155
|
-
description: "Currently running",
|
|
156
|
-
iconBgColor: "bg-status-success-bg text-status-success-text"
|
|
157
|
-
}),
|
|
158
|
-
/* @__PURE__ */ D(t, {
|
|
159
|
-
title: "Paused",
|
|
160
|
-
value: K,
|
|
161
|
-
icon: /* @__PURE__ */ D(b, { className: "h-5 w-5" }),
|
|
162
|
-
description: "Turned off",
|
|
163
|
-
iconBgColor: "bg-status-warning-bg text-status-warning-text"
|
|
164
|
-
})
|
|
165
|
-
]
|
|
166
|
-
}), /* @__PURE__ */ O("div", {
|
|
167
|
-
className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
|
|
168
|
-
children: [/* @__PURE__ */ D(l, {
|
|
169
|
-
title: "By trigger",
|
|
170
|
-
description: "What fires each automation",
|
|
171
|
-
className: "lg:col-span-1",
|
|
172
|
-
children: /* @__PURE__ */ D(d, {
|
|
173
|
-
data: J,
|
|
174
|
-
centerLabel: "Automations",
|
|
175
|
-
centerValue: W.length,
|
|
176
|
-
height: 240,
|
|
177
|
-
ariaLabel: "Automations grouped by trigger type",
|
|
178
|
-
emptyLabel: "No automations to summarise yet."
|
|
179
|
-
})
|
|
180
|
-
}), /* @__PURE__ */ D("div", {
|
|
181
|
-
className: "lg:col-span-2",
|
|
182
|
-
children: /* @__PURE__ */ D("div", {
|
|
183
|
-
className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
|
|
184
|
-
children: W.map((t) => {
|
|
185
|
-
let n = t.value ?? {}, r = n.name ?? t.key.replace("workflow.", ""), i = n.status ?? "inactive", a = i === "active", o = n.trigger ?? "manual", c = n.description ?? t.description ?? "";
|
|
186
|
-
return /* @__PURE__ */ O(k, {
|
|
187
|
-
treatment: "glass",
|
|
188
|
-
glow: a,
|
|
189
|
-
className: "flex flex-col p-5",
|
|
190
|
-
children: [
|
|
191
|
-
/* @__PURE__ */ O("div", {
|
|
192
|
-
className: "flex items-start justify-between gap-3",
|
|
193
|
-
children: [/* @__PURE__ */ O("div", {
|
|
194
|
-
className: "flex min-w-0 items-center gap-2 text-xs font-medium text-text-secondary",
|
|
195
|
-
children: [/* @__PURE__ */ D(N(o), { className: "h-4 w-4 shrink-0 text-primary" }), /* @__PURE__ */ D("span", {
|
|
196
|
-
className: "truncate",
|
|
197
|
-
children: M(o)
|
|
198
|
-
})]
|
|
199
|
-
}), /* @__PURE__ */ D("button", {
|
|
200
|
-
type: "button",
|
|
201
|
-
role: "switch",
|
|
202
|
-
"aria-checked": a,
|
|
203
|
-
"aria-label": a ? `Deactivate ${r}` : `Activate ${r}`,
|
|
204
|
-
disabled: H === t.id,
|
|
205
|
-
onClick: () => void Q(t),
|
|
206
|
-
className: e("relative inline-flex h-5 w-9 shrink-0 items-center rounded-full transition-colors disabled:opacity-50", a ? "bg-action-primary-bg" : "bg-bg-sunken border border-border-subtle"),
|
|
207
|
-
children: /* @__PURE__ */ D("span", { className: e("inline-block h-4 w-4 transform rounded-full bg-bg-surface shadow-sm transition-transform", a ? "translate-x-4" : "translate-x-0.5") })
|
|
208
|
-
})]
|
|
209
|
-
}),
|
|
210
|
-
/* @__PURE__ */ O("div", {
|
|
211
|
-
className: "mt-3 flex min-w-0 items-center gap-2",
|
|
212
|
-
children: [/* @__PURE__ */ D("div", {
|
|
213
|
-
className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-action-primary-bg/10",
|
|
214
|
-
children: /* @__PURE__ */ D(v, { className: "h-4 w-4 text-primary" })
|
|
215
|
-
}), /* @__PURE__ */ D("p", {
|
|
216
|
-
className: "truncate text-sm font-semibold text-text-primary",
|
|
217
|
-
children: r
|
|
218
|
-
})]
|
|
219
|
-
}),
|
|
220
|
-
c && /* @__PURE__ */ D("p", {
|
|
221
|
-
className: "mt-2 line-clamp-2 text-xs text-text-secondary",
|
|
222
|
-
children: c
|
|
223
|
-
}),
|
|
224
|
-
/* @__PURE__ */ O("div", {
|
|
225
|
-
className: "mt-4 flex items-center justify-between border-t border-border-seam pt-3",
|
|
226
|
-
children: [/* @__PURE__ */ D(s, {
|
|
227
|
-
status: i,
|
|
228
|
-
dot: a,
|
|
229
|
-
label: a ? "Active" : "Paused"
|
|
230
|
-
}), /* @__PURE__ */ D("button", {
|
|
231
|
-
type: "button",
|
|
232
|
-
"aria-label": `Delete ${r}`,
|
|
233
|
-
disabled: H === t.id,
|
|
234
|
-
onClick: () => void te(t.id),
|
|
235
|
-
className: "rounded-md p-1.5 text-text-secondary hover:bg-bg-sunken hover:text-status-error-text disabled:opacity-50",
|
|
236
|
-
children: /* @__PURE__ */ D(C, { className: "h-4 w-4" })
|
|
237
|
-
})]
|
|
238
|
-
})
|
|
239
|
-
]
|
|
240
|
-
}, t.id);
|
|
241
|
-
})
|
|
242
|
-
})
|
|
243
|
-
})]
|
|
244
|
-
})]
|
|
245
|
-
}), /* @__PURE__ */ O(u, {
|
|
246
|
-
open: P,
|
|
247
|
-
onClose: () => F(!1),
|
|
248
|
-
title: "Create Workflow",
|
|
249
|
-
description: "Define an automation rule for your workspace.",
|
|
250
|
-
footer: /* @__PURE__ */ O(E, { children: [/* @__PURE__ */ D("button", {
|
|
251
|
-
type: "button",
|
|
252
|
-
onClick: () => F(!1),
|
|
253
|
-
className: "rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
|
|
254
|
-
children: "Cancel"
|
|
255
|
-
}), /* @__PURE__ */ D("button", {
|
|
256
|
-
type: "button",
|
|
257
|
-
onClick: Z,
|
|
258
|
-
disabled: S || !I.trim(),
|
|
259
|
-
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",
|
|
260
|
-
children: S ? "Creating..." : "Create Workflow"
|
|
261
|
-
})] }),
|
|
262
|
-
children: [T && /* @__PURE__ */ D("div", {
|
|
263
|
-
className: "mb-4 rounded-lg border border-status-error-bg/40 bg-status-error-bg p-3 text-sm text-status-error-text",
|
|
264
|
-
children: "Failed to create workflow. Please try again."
|
|
265
|
-
}), /* @__PURE__ */ O("div", {
|
|
266
|
-
className: "space-y-4",
|
|
267
|
-
children: [
|
|
268
|
-
/* @__PURE__ */ O("div", { children: [/* @__PURE__ */ D("label", {
|
|
269
|
-
className: "block text-sm font-medium text-text-primary",
|
|
270
|
-
children: "Workflow Name"
|
|
271
|
-
}), /* @__PURE__ */ D("input", {
|
|
272
|
-
type: "text",
|
|
273
|
-
placeholder: "e.g. Auto-submit my weekly timesheet",
|
|
274
|
-
value: I,
|
|
275
|
-
onChange: (e) => L(e.target.value),
|
|
276
|
-
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"
|
|
277
|
-
})] }),
|
|
278
|
-
/* @__PURE__ */ O("div", { children: [/* @__PURE__ */ D("label", {
|
|
279
|
-
className: "block text-sm font-medium text-text-primary",
|
|
280
|
-
children: "Trigger"
|
|
281
|
-
}), /* @__PURE__ */ D("select", {
|
|
282
|
-
value: R,
|
|
283
|
-
onChange: (e) => z(e.target.value),
|
|
284
|
-
className: "mt-1 w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary",
|
|
285
|
-
children: A.map((e) => /* @__PURE__ */ D("option", {
|
|
286
|
-
value: e.value,
|
|
287
|
-
children: e.label
|
|
288
|
-
}, e.value))
|
|
289
|
-
})] }),
|
|
290
|
-
/* @__PURE__ */ O("div", { children: [/* @__PURE__ */ O("label", {
|
|
291
|
-
className: "block text-sm font-medium text-text-primary",
|
|
292
|
-
children: ["Description", /* @__PURE__ */ D("span", {
|
|
293
|
-
className: "ml-1 font-normal text-text-secondary",
|
|
294
|
-
children: "(optional)"
|
|
295
|
-
})]
|
|
296
|
-
}), /* @__PURE__ */ D("textarea", {
|
|
297
|
-
placeholder: "What this workflow should do",
|
|
298
|
-
rows: 3,
|
|
299
|
-
value: B,
|
|
300
|
-
onChange: (e) => V(e.target.value),
|
|
301
|
-
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"
|
|
302
|
-
})] })
|
|
303
|
-
]
|
|
304
|
-
})]
|
|
305
|
-
})]
|
|
306
|
-
});
|
|
307
|
-
}
|
|
308
|
-
//#endregion
|
|
309
|
-
export { P as WorkflowsPage };
|
|
310
|
-
|
|
311
|
-
//# sourceMappingURL=WorkflowsPage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowsPage.js","names":[],"sources":["../../../../src/timecampus/pages/workflows/WorkflowsPage.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport {\n GitBranch,\n Plus,\n Trash2,\n Zap,\n Timer,\n Clock,\n FileText,\n CalendarClock,\n AlertTriangle,\n MousePointerClick,\n Workflow as WorkflowIcon,\n Power,\n PauseCircle,\n type LucideIcon,\n} from \"lucide-react\";\nimport { GlassCard } from \"@burdenoff/fe-libs/ui\";\nimport {\n PageLayout,\n EmptyState,\n LoadingSkeleton,\n Modal,\n StatCard,\n StatusBadge,\n ChartCard,\n DonutChart,\n} from \"../../components\";\nimport { cn } from \"../../utils/helpers\";\nimport {\n useListConfigurationsQuery,\n useSetConfigurationMutation,\n useDeleteConfigurationMutation,\n type ConfigurationFieldsFragment,\n} from \"@/generated/wspace-operations\";\nimport { TimeCampusConfigScope } from \"@/generated/wspace-types\";\n\nconst TRIGGERS = [\n { value: \"timer.started\", label: \"When a timer starts\" },\n { value: \"timer.stopped\", label: \"When a timer stops\" },\n { value: \"entry.created\", label: \"When a time entry is created\" },\n { value: \"timesheet.due\", label: \"When a timesheet is due\" },\n { value: \"budget.overrun\", label: \"When a project runs over budget\" },\n { value: \"manual\", label: \"Manually\" },\n];\n\nconst TRIGGER_ICONS: Record<string, LucideIcon> = {\n \"timer.started\": Timer,\n \"timer.stopped\": Clock,\n \"entry.created\": FileText,\n \"timesheet.due\": CalendarClock,\n \"budget.overrun\": AlertTriangle,\n manual: MousePointerClick,\n};\n\nfunction triggerLabel(value: string): string {\n return TRIGGERS.find((t) => t.value === value)?.label ?? value;\n}\n\nfunction triggerIcon(value: string): LucideIcon {\n return TRIGGER_ICONS[value] ?? Zap;\n}\n\nexport function WorkflowsPage() {\n const { data, loading, error, refetch } = useListConfigurationsQuery({\n variables: { scope: TimeCampusConfigScope.Workspace },\n });\n\n const [setConfiguration, { loading: creating, error: createError }] =\n useSetConfigurationMutation();\n const [deleteConfiguration] = useDeleteConfigurationMutation();\n\n const [modalOpen, setModalOpen] = useState(false);\n const [name, setName] = useState(\"\");\n const [trigger, setTrigger] = useState(TRIGGERS[0].value);\n const [description, setDescription] = useState(\"\");\n const [busyId, setBusyId] = useState<string | null>(null);\n\n const configurations: ConfigurationFieldsFragment[] =\n data?.timeCampusConfigurations ?? [];\n const workflows = configurations.filter((c: ConfigurationFieldsFragment) =>\n c.key.startsWith(\"workflow.\"),\n );\n\n // Real, derived aggregates over the automation rules the page already loads.\n const activeCount = workflows.filter((wf) => {\n const val = (wf.value as Record<string, unknown>) ?? {};\n return (val.status as string) === \"active\";\n }).length;\n const pausedCount = workflows.length - activeCount;\n const triggerCounts = workflows.reduce<Record<string, number>>((acc, wf) => {\n const val = (wf.value as Record<string, unknown>) ?? {};\n const t = (val.trigger as string) ?? \"manual\";\n acc[t] = (acc[t] ?? 0) + 1;\n return acc;\n }, {});\n const triggerMix = Object.entries(triggerCounts)\n .sort((a, b) => b[1] - a[1])\n .map(([t, count]) => ({ name: triggerLabel(t), value: count }));\n\n const resetForm = () => {\n setName(\"\");\n setTrigger(TRIGGERS[0].value);\n setDescription(\"\");\n };\n\n const openModal = () => {\n resetForm();\n setModalOpen(true);\n };\n\n const handleCreate = async () => {\n if (!name.trim()) return;\n const id =\n typeof crypto !== \"undefined\" && \"randomUUID\" in crypto\n ? crypto.randomUUID()\n : `${Date.now()}`;\n const trimmedDescription = description.trim();\n await setConfiguration({\n variables: {\n input: {\n key: `workflow.${id}`,\n scope: TimeCampusConfigScope.Workspace,\n value: {\n name: name.trim(),\n trigger,\n status: \"active\",\n description: trimmedDescription || undefined,\n createdAt: new Date().toISOString(),\n },\n description: trimmedDescription || undefined,\n },\n },\n });\n await refetch();\n setModalOpen(false);\n resetForm();\n };\n\n const handleToggle = async (wf: ConfigurationFieldsFragment) => {\n setBusyId(wf.id);\n try {\n const val = (wf.value as Record<string, unknown>) ?? {};\n const nextStatus =\n (val.status as string) === \"active\" ? \"inactive\" : \"active\";\n await setConfiguration({\n variables: {\n input: {\n key: wf.key,\n scope: TimeCampusConfigScope.Workspace,\n value: { ...val, status: nextStatus },\n description: wf.description ?? undefined,\n },\n },\n });\n await refetch();\n } finally {\n setBusyId(null);\n }\n };\n\n const handleDelete = async (id: string) => {\n setBusyId(id);\n try {\n await deleteConfiguration({ variables: { id } });\n await refetch();\n } finally {\n setBusyId(null);\n }\n };\n\n if (loading) {\n return (\n <PageLayout title=\"Workflows\" description=\"Automate repetitive tasks\">\n <LoadingSkeleton variant=\"list\" count={5} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout title=\"Workflows\" description=\"Automate repetitive tasks\">\n <div className=\"rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text\">\n Failed to load workflow configurations. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n const createButton = (\n <button\n type=\"button\"\n onClick={openModal}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n <Plus className=\"h-4 w-4\" />\n Create Workflow\n </button>\n );\n\n return (\n <PageLayout\n title=\"Workflows\"\n description=\"Automate repetitive tasks\"\n purpose=\"Put the busywork on autopilot — auto-start timers, submit timesheets, flag overruns — by wiring up rules that react to what happens in TimeCampus. Each workflow you define is saved to your workspace; the advanced trigger/condition builder is on the roadmap.\"\n actions={createButton}\n >\n {workflows.length === 0 ? (\n <EmptyState\n illustration=\"empty-generic\"\n title=\"No workflows configured yet\"\n description=\"Create your first automation to handle repetitive time-tracking tasks — workflows are stored as workspace configurations and appear here.\"\n action={createButton}\n />\n ) : (\n <div className=\"space-y-6\">\n {/* KPI summary — derived from the automation rules below */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-3\">\n <StatCard\n featured\n title=\"Automations\"\n value={workflows.length}\n icon={<WorkflowIcon className=\"h-5 w-5\" />}\n description=\"Rules defined\"\n />\n <StatCard\n title=\"Active\"\n value={activeCount}\n icon={<Power className=\"h-5 w-5\" />}\n description=\"Currently running\"\n iconBgColor=\"bg-status-success-bg text-status-success-text\"\n />\n <StatCard\n title=\"Paused\"\n value={pausedCount}\n icon={<PauseCircle className=\"h-5 w-5\" />}\n description=\"Turned off\"\n iconBgColor=\"bg-status-warning-bg text-status-warning-text\"\n />\n </div>\n\n {/* Trigger mix ring + automation cards */}\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <ChartCard\n title=\"By trigger\"\n description=\"What fires each automation\"\n className=\"lg:col-span-1\"\n >\n <DonutChart\n data={triggerMix}\n centerLabel=\"Automations\"\n centerValue={workflows.length}\n height={240}\n ariaLabel=\"Automations grouped by trigger type\"\n emptyLabel=\"No automations to summarise yet.\"\n />\n </ChartCard>\n\n <div className=\"lg:col-span-2\">\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n {workflows.map((wf: ConfigurationFieldsFragment) => {\n const val = (wf.value as Record<string, unknown>) ?? {};\n const wfName =\n (val.name as string) ?? wf.key.replace(\"workflow.\", \"\");\n const status = (val.status as string) ?? \"inactive\";\n const isActive = status === \"active\";\n const wfTrigger = (val.trigger as string) ?? \"manual\";\n const wfDescription =\n (val.description as string) ?? wf.description ?? \"\";\n const TriggerIcon = triggerIcon(wfTrigger);\n\n return (\n <GlassCard\n key={wf.id}\n treatment=\"glass\"\n glow={isActive}\n className=\"flex flex-col p-5\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-2 text-xs font-medium text-text-secondary\">\n <TriggerIcon className=\"h-4 w-4 shrink-0 text-primary\" />\n <span className=\"truncate\">\n {triggerLabel(wfTrigger)}\n </span>\n </div>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={isActive}\n aria-label={\n isActive\n ? `Deactivate ${wfName}`\n : `Activate ${wfName}`\n }\n disabled={busyId === wf.id}\n onClick={() => void handleToggle(wf)}\n className={cn(\n \"relative inline-flex h-5 w-9 shrink-0 items-center rounded-full transition-colors disabled:opacity-50\",\n isActive\n ? \"bg-action-primary-bg\"\n : \"bg-bg-sunken border border-border-subtle\",\n )}\n >\n <span\n className={cn(\n \"inline-block h-4 w-4 transform rounded-full bg-bg-surface shadow-sm transition-transform\",\n isActive ? \"translate-x-4\" : \"translate-x-0.5\",\n )}\n />\n </button>\n </div>\n\n <div className=\"mt-3 flex min-w-0 items-center gap-2\">\n <div className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-action-primary-bg/10\">\n <GitBranch className=\"h-4 w-4 text-primary\" />\n </div>\n <p className=\"truncate text-sm font-semibold text-text-primary\">\n {wfName}\n </p>\n </div>\n\n {wfDescription && (\n <p className=\"mt-2 line-clamp-2 text-xs text-text-secondary\">\n {wfDescription}\n </p>\n )}\n\n <div className=\"mt-4 flex items-center justify-between border-t border-border-seam pt-3\">\n <StatusBadge\n status={status}\n dot={isActive}\n label={isActive ? \"Active\" : \"Paused\"}\n />\n <button\n type=\"button\"\n aria-label={`Delete ${wfName}`}\n disabled={busyId === wf.id}\n onClick={() => void handleDelete(wf.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 </GlassCard>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n )}\n\n <Modal\n open={modalOpen}\n onClose={() => setModalOpen(false)}\n title=\"Create Workflow\"\n description=\"Define an automation rule for your workspace.\"\n footer={\n <>\n <button\n type=\"button\"\n onClick={() => setModalOpen(false)}\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 type=\"button\"\n onClick={handleCreate}\n disabled={creating || !name.trim()}\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 ? \"Creating...\" : \"Create Workflow\"}\n </button>\n </>\n }\n >\n {createError && (\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 create workflow. 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 Workflow Name\n </label>\n <input\n type=\"text\"\n placeholder=\"e.g. Auto-submit my weekly timesheet\"\n value={name}\n onChange={(e) => setName(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>\n <label className=\"block text-sm font-medium text-text-primary\">\n Trigger\n </label>\n <select\n value={trigger}\n onChange={(e) => setTrigger(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 {TRIGGERS.map((t) => (\n <option key={t.value} value={t.value}>\n {t.label}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\n Description\n <span className=\"ml-1 font-normal text-text-secondary\">\n (optional)\n </span>\n </label>\n <textarea\n placeholder=\"What this workflow should do\"\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>\n </Modal>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAqCA,IAAM,IAAW;CACf;EAAE,OAAO;EAAiB,OAAO;EAAuB;CACxD;EAAE,OAAO;EAAiB,OAAO;EAAsB;CACvD;EAAE,OAAO;EAAiB,OAAO;EAAgC;CACjE;EAAE,OAAO;EAAiB,OAAO;EAA2B;CAC5D;EAAE,OAAO;EAAkB,OAAO;EAAmC;CACrE;EAAE,OAAO;EAAU,OAAO;EAAY;CACvC,EAEK,IAA4C;CAChD,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,kBAAkB;CAClB,QAAQ;CACT;AAED,SAAS,EAAa,GAAuB;AAC3C,QAAO,EAAS,MAAM,MAAM,EAAE,UAAU,EAAM,EAAE,SAAS;;AAG3D,SAAS,EAAY,GAA2B;AAC9C,QAAO,EAAc,MAAU;;AAGjC,SAAgB,IAAgB;CAC9B,IAAM,EAAE,SAAM,YAAS,UAAO,eAAY,EAA2B,EACnE,WAAW,EAAE,OAAO,EAAsB,WAAW,EACtD,CAAC,EAEI,CAAC,GAAkB,EAAE,SAAS,GAAU,OAAO,OACnD,GAA6B,EACzB,CAAC,KAAuB,GAAgC,EAExD,CAAC,GAAW,KAAgB,EAAS,GAAM,EAC3C,CAAC,GAAM,KAAW,EAAS,GAAG,EAC9B,CAAC,GAAS,KAAc,EAAS,EAAS,GAAG,MAAM,EACnD,CAAC,GAAa,KAAkB,EAAS,GAAG,EAC5C,CAAC,GAAQ,KAAa,EAAwB,KAAK,EAInD,KADJ,GAAM,4BAA4B,EAAE,EACL,QAAQ,MACvC,EAAE,IAAI,WAAW,YAAY,CAC9B,EAGK,IAAc,EAAU,QAAQ,OACvB,EAAG,SAAqC,EAAE,EAC3C,WAAsB,SAClC,CAAC,QACG,IAAc,EAAU,SAAS,GACjC,IAAgB,EAAU,QAAgC,GAAK,MAAO;EAE1E,IAAM,KADO,EAAG,SAAqC,EAAE,EACxC,WAAsB;AAErC,SADA,EAAI,MAAM,EAAI,MAAM,KAAK,GAClB;IACN,EAAE,CAAC,EACA,IAAa,OAAO,QAAQ,EAAc,CAC7C,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,GAAG,CAC3B,KAAK,CAAC,GAAG,QAAY;EAAE,MAAM,EAAa,EAAE;EAAE,OAAO;EAAO,EAAE,EAE3D,UAAkB;AAGtB,EAFA,EAAQ,GAAG,EACX,EAAW,EAAS,GAAG,MAAM,EAC7B,EAAe,GAAG;IAGd,UAAkB;AAEtB,EADA,GAAW,EACX,EAAa,GAAK;IAGd,IAAe,YAAY;AAC/B,MAAI,CAAC,EAAK,MAAM,CAAE;EAClB,IAAM,IACJ,OAAO,SAAW,OAAe,gBAAgB,SAC7C,OAAO,YAAY,GACnB,GAAG,KAAK,KAAK,IACb,IAAqB,EAAY,MAAM;AAmB7C,EAlBA,MAAM,EAAiB,EACrB,WAAW,EACT,OAAO;GACL,KAAK,YAAY;GACjB,OAAO,EAAsB;GAC7B,OAAO;IACL,MAAM,EAAK,MAAM;IACjB;IACA,QAAQ;IACR,aAAa,KAAsB,KAAA;IACnC,4BAAW,IAAI,MAAM,EAAC,aAAa;IACpC;GACD,aAAa,KAAsB,KAAA;GACpC,EACF,EACF,CAAC,EACF,MAAM,GAAS,EACf,EAAa,GAAM,EACnB,GAAW;IAGP,IAAe,OAAO,MAAoC;AAC9D,IAAU,EAAG,GAAG;AAChB,MAAI;GACF,IAAM,IAAO,EAAG,SAAqC,EAAE,EACjD,IACH,EAAI,WAAsB,WAAW,aAAa;AAWrD,GAVA,MAAM,EAAiB,EACrB,WAAW,EACT,OAAO;IACL,KAAK,EAAG;IACR,OAAO,EAAsB;IAC7B,OAAO;KAAE,GAAG;KAAK,QAAQ;KAAY;IACrC,aAAa,EAAG,eAAe,KAAA;IAChC,EACF,EACF,CAAC,EACF,MAAM,GAAS;YACP;AACR,KAAU,KAAK;;IAIb,KAAe,OAAO,MAAe;AACzC,IAAU,EAAG;AACb,MAAI;AAEF,GADA,MAAM,EAAoB,EAAE,WAAW,EAAE,OAAI,EAAE,CAAC,EAChD,MAAM,GAAS;YACP;AACR,KAAU,KAAK;;;AAInB,KAAI,EACF,QACE,kBAAC,GAAD;EAAY,OAAM;EAAY,aAAY;YACxC,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA;AAIjB,KAAI,EACF,QACE,kBAAC,GAAD;EAAY,OAAM;EAAY,aAAY;YACxC,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA;CAIjB,IAAM,IACJ,kBAAC,UAAD;EACE,MAAK;EACL,SAAS;EACT,WAAU;YAHZ,CAKE,kBAAC,IAAD,EAAM,WAAU,WAAY,CAAA,EAAA,kBAErB;;AAGX,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SAAQ;EACR,SAAS;YAJX,CAMG,EAAU,WAAW,IACpB,kBAAC,GAAD;GACE,cAAa;GACb,OAAM;GACN,aAAY;GACZ,QAAQ;GACR,CAAA,GAEF,kBAAC,OAAD;GAAK,WAAU;aAAf,CAEE,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MACE,UAAA;MACA,OAAM;MACN,OAAO,EAAU;MACjB,MAAM,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA;MAC1C,aAAY;MACZ,CAAA;KACF,kBAAC,GAAD;MACE,OAAM;MACN,OAAO;MACP,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;MACnC,aAAY;MACZ,aAAY;MACZ,CAAA;KACF,kBAAC,GAAD;MACE,OAAM;MACN,OAAO;MACP,MAAM,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA;MACzC,aAAY;MACZ,aAAY;MACZ,CAAA;KACE;OAGN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KACE,OAAM;KACN,aAAY;KACZ,WAAU;eAEV,kBAAC,GAAD;MACE,MAAM;MACN,aAAY;MACZ,aAAa,EAAU;MACvB,QAAQ;MACR,WAAU;MACV,YAAW;MACX,CAAA;KACQ,CAAA,EAEZ,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAU,KAAK,MAAoC;OAClD,IAAM,IAAO,EAAG,SAAqC,EAAE,EACjD,IACH,EAAI,QAAmB,EAAG,IAAI,QAAQ,aAAa,GAAG,EACnD,IAAU,EAAI,UAAqB,YACnC,IAAW,MAAW,UACtB,IAAa,EAAI,WAAsB,UACvC,IACH,EAAI,eAA0B,EAAG,eAAe;AAGnD,cACE,kBAAC,GAAD;QAEE,WAAU;QACV,MAAM;QACN,WAAU;kBAJZ;SAME,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAXY,EAAY,EAAU,EAWlC,EAAa,WAAU,iCAAkC,CAAA,EACzD,kBAAC,QAAD;YAAM,WAAU;sBACb,EAAa,EAAU;YACnB,CAAA,CACH;cACN,kBAAC,UAAD;WACE,MAAK;WACL,MAAK;WACL,gBAAc;WACd,cACE,IACI,cAAc,MACd,YAAY;WAElB,UAAU,MAAW,EAAG;WACxB,eAAe,KAAK,EAAa,EAAG;WACpC,WAAW,EACT,yGACA,IACI,yBACA,2CACL;qBAED,kBAAC,QAAD,EACE,WAAW,EACT,4FACA,IAAW,kBAAkB,kBAC9B,EACD,CAAA;WACK,CAAA,CACL;;SAEN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,OAAD;WAAK,WAAU;qBACb,kBAAC,GAAD,EAAW,WAAU,wBAAyB,CAAA;WAC1C,CAAA,EACN,kBAAC,KAAD;WAAG,WAAU;qBACV;WACC,CAAA,CACA;;SAEL,KACC,kBAAC,KAAD;UAAG,WAAU;oBACV;UACC,CAAA;SAGN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD;WACU;WACR,KAAK;WACL,OAAO,IAAW,WAAW;WAC7B,CAAA,EACF,kBAAC,UAAD;WACE,MAAK;WACL,cAAY,UAAU;WACtB,UAAU,MAAW,EAAG;WACxB,eAAe,KAAK,GAAa,EAAG,GAAG;WACvC,WAAU;qBAEV,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;WACvB,CAAA,CACL;;SACI;UAtEL,EAAG,GAsEE;QAEd;MACE,CAAA;KACF,CAAA,CACF;MACF;MAGR,kBAAC,GAAD;GACE,MAAM;GACN,eAAe,EAAa,GAAM;GAClC,OAAM;GACN,aAAY;GACZ,QACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,UAAD;IACE,MAAK;IACL,eAAe,EAAa,GAAM;IAClC,WAAU;cACX;IAEQ,CAAA,EACT,kBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,UAAU,KAAY,CAAC,EAAK,MAAM;IAClC,WAAU;cAET,IAAW,gBAAgB;IACrB,CAAA,CACR,EAAA,CAAA;aAtBP,CAyBG,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,EAAQ,EAAE,OAAO,MAAM;MACxC,WAAU;MACV,CAAA,CACE,EAAA,CAAA;KACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;MAAO,WAAU;gBAA8C;MAEvD,CAAA,EACR,kBAAC,UAAD;MACE,OAAO;MACP,WAAW,MAAM,EAAW,EAAE,OAAO,MAAM;MAC3C,WAAU;gBAET,EAAS,KAAK,MACb,kBAAC,UAAD;OAAsB,OAAO,EAAE;iBAC5B,EAAE;OACI,EAFI,EAAE,MAEN,CACT;MACK,CAAA,CACL,EAAA,CAAA;KACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;MAAO,WAAU;gBAAjB,CAA+D,eAE7D,kBAAC,QAAD;OAAM,WAAU;iBAAuC;OAEhD,CAAA,CACD;SACR,kBAAC,YAAD;MACE,aAAY;MACZ,MAAM;MACN,OAAO;MACP,WAAW,MAAM,EAAe,EAAE,OAAO,MAAM;MAC/C,WAAU;MACV,CAAA,CACE,EAAA,CAAA;KACF;MACA;KACG"}
|