@burdenoff/microfe-atheletebridge 2026.713.1 → 2026.716.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/atheletebridge/AthleteBridgeRoot.js +50 -53
  2. package/dist/atheletebridge/AthleteBridgeRoot.js.map +1 -1
  3. package/dist/atheletebridge/AthleteBridgeRoutes.d.ts.map +1 -1
  4. package/dist/atheletebridge/AthleteBridgeRoutes.js +29 -25
  5. package/dist/atheletebridge/AthleteBridgeRoutes.js.map +1 -1
  6. package/dist/atheletebridge/admin/AdminDashboardPage.d.ts +4 -0
  7. package/dist/atheletebridge/admin/AdminDashboardPage.d.ts.map +1 -0
  8. package/dist/atheletebridge/admin/AdminDashboardPage.js +553 -0
  9. package/dist/atheletebridge/admin/AdminDashboardPage.js.map +1 -0
  10. package/dist/atheletebridge/admin/AdminRoot.d.ts +9 -0
  11. package/dist/atheletebridge/admin/AdminRoot.d.ts.map +1 -0
  12. package/dist/atheletebridge/admin/AdminRoot.js +23 -0
  13. package/dist/atheletebridge/admin/AdminRoot.js.map +1 -0
  14. package/dist/atheletebridge/admin/index.d.ts +11 -0
  15. package/dist/atheletebridge/admin/index.d.ts.map +1 -0
  16. package/dist/atheletebridge/admin/index.js +2 -0
  17. package/dist/atheletebridge/components/DrillVideoLink.js +1 -1
  18. package/dist/atheletebridge/components/DrillVideoLink.js.map +1 -1
  19. package/dist/atheletebridge/components/ProgramCard.js +1 -1
  20. package/dist/atheletebridge/components/ProgramCard.js.map +1 -1
  21. package/dist/atheletebridge/components/TeamCard.js +1 -1
  22. package/dist/atheletebridge/components/TeamCard.js.map +1 -1
  23. package/dist/atheletebridge/components/UserSearchSelect.js +2 -2
  24. package/dist/atheletebridge/components/UserSearchSelect.js.map +1 -1
  25. package/dist/atheletebridge/components/domain.js +3 -3
  26. package/dist/atheletebridge/components/domain.js.map +1 -1
  27. package/dist/atheletebridge/hooks/index.js +1 -0
  28. package/dist/atheletebridge/hooks/useAthleteBridgeApi.d.ts.map +1 -1
  29. package/dist/atheletebridge/hooks/useAthleteBridgeApi.js +39 -39
  30. package/dist/atheletebridge/hooks/useAthleteBridgeApi.js.map +1 -1
  31. package/dist/atheletebridge/i18n.d.ts +26 -0
  32. package/dist/atheletebridge/i18n.d.ts.map +1 -0
  33. package/dist/atheletebridge/i18n.js +14 -0
  34. package/dist/atheletebridge/i18n.js.map +1 -0
  35. package/dist/atheletebridge/index.d.ts +1 -0
  36. package/dist/atheletebridge/index.d.ts.map +1 -1
  37. package/dist/atheletebridge/index.js +3 -0
  38. package/dist/atheletebridge/pages/DashboardPage.d.ts.map +1 -1
  39. package/dist/atheletebridge/pages/DashboardPage.js +166 -144
  40. package/dist/atheletebridge/pages/DashboardPage.js.map +1 -1
  41. package/dist/atheletebridge/pages/StandingsPage.d.ts.map +1 -1
  42. package/dist/atheletebridge/pages/StandingsPage.js +98 -92
  43. package/dist/atheletebridge/pages/StandingsPage.js.map +1 -1
  44. package/dist/atheletebridge/pages/fixtures/FixturesListPage.d.ts.map +1 -1
  45. package/dist/atheletebridge/pages/fixtures/FixturesListPage.js +6 -4
  46. package/dist/atheletebridge/pages/fixtures/FixturesListPage.js.map +1 -1
  47. package/dist/atheletebridge/pages/onboarding/OnboardingPage.d.ts +4 -0
  48. package/dist/atheletebridge/pages/onboarding/OnboardingPage.d.ts.map +1 -0
  49. package/dist/atheletebridge/pages/onboarding/OnboardingPage.js +371 -0
  50. package/dist/atheletebridge/pages/onboarding/OnboardingPage.js.map +1 -0
  51. package/dist/atheletebridge/pages/performance/PerformancePage.d.ts.map +1 -1
  52. package/dist/atheletebridge/pages/performance/PerformancePage.js +42 -41
  53. package/dist/atheletebridge/pages/performance/PerformancePage.js.map +1 -1
  54. package/dist/atheletebridge/pages/programs/ProgramDetailPage.js +3 -3
  55. package/dist/atheletebridge/pages/programs/ProgramDetailPage.js.map +1 -1
  56. package/dist/atheletebridge/pages/programs/ProgramsListPage.d.ts.map +1 -1
  57. package/dist/atheletebridge/pages/programs/ProgramsListPage.js +9 -7
  58. package/dist/atheletebridge/pages/programs/ProgramsListPage.js.map +1 -1
  59. package/dist/atheletebridge/pages/sessions/SessionDetailPage.js +1 -1
  60. package/dist/atheletebridge/pages/sessions/SessionDetailPage.js.map +1 -1
  61. package/dist/atheletebridge/pages/sessions/SessionsListPage.d.ts.map +1 -1
  62. package/dist/atheletebridge/pages/sessions/SessionsListPage.js +6 -4
  63. package/dist/atheletebridge/pages/sessions/SessionsListPage.js.map +1 -1
  64. package/dist/atheletebridge/pages/teams/TeamDetailPage.js +1 -1
  65. package/dist/atheletebridge/pages/teams/TeamDetailPage.js.map +1 -1
  66. package/dist/atheletebridge/pages/teams/TeamsListPage.d.ts.map +1 -1
  67. package/dist/atheletebridge/pages/teams/TeamsListPage.js +8 -6
  68. package/dist/atheletebridge/pages/teams/TeamsListPage.js.map +1 -1
  69. package/dist/atheletebridge/types/index.d.ts +19 -3
  70. package/dist/atheletebridge/types/index.d.ts.map +1 -1
  71. package/dist/index.js +5 -3
  72. package/package.json +13 -2
@@ -0,0 +1,553 @@
1
+ import { PageLayout as e } from "../components/PageLayout.js";
2
+ import { StatusBadge as t } from "../components/StatusBadge.js";
3
+ import { FIXTURE_TYPE_LABELS as n, PROGRAM_LEVEL_LABELS as r, SESSION_TYPE_LABELS as i, SPORT_LABELS as a } from "../components/domain.js";
4
+ import { formatDate as o, formatDuration as s } from "../utils/formatters.js";
5
+ import { EmptyState as c } from "../components/EmptyState.js";
6
+ import { ErrorState as l, LoadingState as u } from "../components/LoadingState.js";
7
+ import { useFixtures as d, usePrograms as f, useSessions as p, useStandings as m, useTeams as h } from "../hooks/useAthleteBridgeApi.js";
8
+ import { CursorPager as g } from "../components/CursorPager.js";
9
+ import { FilterSelect as _ } from "../components/FilterSelect.js";
10
+ import "../hooks/index.js";
11
+ import { useMemo as v, useState as y } from "react";
12
+ import { CalendarDays as b, ClipboardCheck as x, Dumbbell as S, Trophy as C, Users as w } from "lucide-react";
13
+ import { Fragment as T, jsx as E, jsxs as D } from "react/jsx-runtime";
14
+ import { Card as O, CardContent as k, CardDescription as A, CardHeader as j, CardTitle as M, Table as N, TableBody as P, TableCell as F, TableHead as I, TableHeader as L, TableRow as R, Tabs as z, TabsContent as B, TabsList as V, TabsTrigger as H } from "@burdenoff/fe-libs/ui";
15
+ //#region src/atheletebridge/admin/AdminDashboardPage.tsx
16
+ var U = 20, W = Object.keys(a).map((e) => ({
17
+ value: e,
18
+ label: a[e]
19
+ })), G = [
20
+ {
21
+ value: "FORMING",
22
+ label: "Forming"
23
+ },
24
+ {
25
+ value: "ACTIVE",
26
+ label: "Active"
27
+ },
28
+ {
29
+ value: "INACTIVE",
30
+ label: "Inactive"
31
+ },
32
+ {
33
+ value: "ARCHIVED",
34
+ label: "Archived"
35
+ }
36
+ ], K = [
37
+ {
38
+ value: "DRAFT",
39
+ label: "Draft"
40
+ },
41
+ {
42
+ value: "PUBLISHED",
43
+ label: "Published"
44
+ },
45
+ {
46
+ value: "ARCHIVED",
47
+ label: "Archived"
48
+ }
49
+ ], q = [
50
+ {
51
+ value: "SCHEDULED",
52
+ label: "Scheduled"
53
+ },
54
+ {
55
+ value: "LIVE",
56
+ label: "Live"
57
+ },
58
+ {
59
+ value: "COMPLETED",
60
+ label: "Completed"
61
+ },
62
+ {
63
+ value: "POSTPONED",
64
+ label: "Postponed"
65
+ },
66
+ {
67
+ value: "CANCELLED",
68
+ label: "Cancelled"
69
+ }
70
+ ], J = [
71
+ {
72
+ value: "REQUESTED",
73
+ label: "Requested"
74
+ },
75
+ {
76
+ value: "CONFIRMED",
77
+ label: "Confirmed"
78
+ },
79
+ {
80
+ value: "COMPLETED",
81
+ label: "Completed"
82
+ },
83
+ {
84
+ value: "CANCELLED",
85
+ label: "Cancelled"
86
+ },
87
+ {
88
+ value: "NO_SHOW",
89
+ label: "No show"
90
+ }
91
+ ], Y = (e) => e == null || e === "" ? "—" : String(e), X = () => {
92
+ let [e, n] = y(""), [r, i] = y(""), [s, d] = y(0), f = h({
93
+ sport: e || void 0,
94
+ status: r || void 0,
95
+ pagination: {
96
+ limit: U,
97
+ offset: s * U
98
+ }
99
+ }), p = f.data?.items ?? [];
100
+ return /* @__PURE__ */ D(O, { children: [/* @__PURE__ */ D(j, { children: [/* @__PURE__ */ E(M, { children: "Teams" }), /* @__PURE__ */ E(A, { children: "Every squad, club side, academy group and esports roster in the active workspace." })] }), /* @__PURE__ */ D(k, { children: [/* @__PURE__ */ D("div", {
101
+ className: "mb-4 flex flex-wrap items-center gap-3",
102
+ children: [/* @__PURE__ */ E(_, {
103
+ ariaLabel: "Filter teams by sport",
104
+ allLabel: "All sports",
105
+ value: e,
106
+ onChange: (e) => {
107
+ n(e), d(0);
108
+ },
109
+ options: W
110
+ }), /* @__PURE__ */ E(_, {
111
+ ariaLabel: "Filter teams by status",
112
+ allLabel: "All statuses",
113
+ value: r,
114
+ onChange: (e) => {
115
+ i(e), d(0);
116
+ },
117
+ options: G
118
+ })]
119
+ }), f.isLoading ? /* @__PURE__ */ E(u, { label: "Loading teams…" }) : f.isError ? /* @__PURE__ */ E(l, { onRetry: () => void f.refetch() }) : p.length === 0 ? /* @__PURE__ */ E(c, {
120
+ icon: /* @__PURE__ */ E(w, { className: "h-6 w-6" }),
121
+ title: "No teams match these filters",
122
+ description: "Teams created in this workspace will appear here for oversight."
123
+ }) : /* @__PURE__ */ D(T, { children: [/* @__PURE__ */ E("div", {
124
+ className: "overflow-x-auto",
125
+ children: /* @__PURE__ */ D(N, { children: [/* @__PURE__ */ E(L, { children: /* @__PURE__ */ D(R, { children: [
126
+ /* @__PURE__ */ E(I, { children: "Name" }),
127
+ /* @__PURE__ */ E(I, { children: "Sport" }),
128
+ /* @__PURE__ */ E(I, { children: "Status" }),
129
+ /* @__PURE__ */ E(I, { children: "Age group" }),
130
+ /* @__PURE__ */ E(I, { children: "Season" }),
131
+ /* @__PURE__ */ E(I, {
132
+ className: "text-right",
133
+ children: "Members"
134
+ }),
135
+ /* @__PURE__ */ E(I, { children: "Created" })
136
+ ] }) }), /* @__PURE__ */ E(P, { children: p.map((e) => /* @__PURE__ */ D(R, { children: [
137
+ /* @__PURE__ */ E(F, {
138
+ className: "font-medium text-text-primary",
139
+ children: e.name
140
+ }),
141
+ /* @__PURE__ */ E(F, {
142
+ className: "text-text-secondary",
143
+ children: a[e.sport]
144
+ }),
145
+ /* @__PURE__ */ E(F, { children: /* @__PURE__ */ E(t, { status: e.status }) }),
146
+ /* @__PURE__ */ E(F, {
147
+ className: "text-text-secondary",
148
+ children: Y(e.ageGroup)
149
+ }),
150
+ /* @__PURE__ */ E(F, {
151
+ className: "text-text-secondary",
152
+ children: Y(e.season)
153
+ }),
154
+ /* @__PURE__ */ E(F, {
155
+ className: "text-right text-text-secondary",
156
+ children: e.members?.items.length ?? 0
157
+ }),
158
+ /* @__PURE__ */ E(F, {
159
+ className: "text-text-secondary",
160
+ children: o(e.createdAt)
161
+ })
162
+ ] }, e.id)) })] })
163
+ }), /* @__PURE__ */ E(g, {
164
+ page: s,
165
+ hasMore: f.data?.pageInfo.hasMore ?? !1,
166
+ onPrev: () => d((e) => Math.max(0, e - 1)),
167
+ onNext: () => d((e) => e + 1)
168
+ })] })] })] });
169
+ }, Z = () => {
170
+ let [e, n] = y(""), [i, s] = y(""), [d, p] = y(0), m = f({
171
+ sport: e || void 0,
172
+ status: i || void 0,
173
+ pagination: {
174
+ limit: U,
175
+ offset: d * U
176
+ }
177
+ }), h = m.data?.items ?? [];
178
+ return /* @__PURE__ */ D(O, { children: [/* @__PURE__ */ D(j, { children: [/* @__PURE__ */ E(M, { children: "Training programs" }), /* @__PURE__ */ E(A, { children: "Coaching programs and templates, with their drill counts and publication state." })] }), /* @__PURE__ */ D(k, { children: [/* @__PURE__ */ D("div", {
179
+ className: "mb-4 flex flex-wrap items-center gap-3",
180
+ children: [/* @__PURE__ */ E(_, {
181
+ ariaLabel: "Filter programs by sport",
182
+ allLabel: "All sports",
183
+ value: e,
184
+ onChange: (e) => {
185
+ n(e), p(0);
186
+ },
187
+ options: W
188
+ }), /* @__PURE__ */ E(_, {
189
+ ariaLabel: "Filter programs by status",
190
+ allLabel: "All statuses",
191
+ value: i,
192
+ onChange: (e) => {
193
+ s(e), p(0);
194
+ },
195
+ options: K
196
+ })]
197
+ }), m.isLoading ? /* @__PURE__ */ E(u, { label: "Loading programs…" }) : m.isError ? /* @__PURE__ */ E(l, { onRetry: () => void m.refetch() }) : h.length === 0 ? /* @__PURE__ */ E(c, {
198
+ icon: /* @__PURE__ */ E(S, { className: "h-6 w-6" }),
199
+ title: "No programs match these filters",
200
+ description: "Programs authored by coaches in this workspace will appear here."
201
+ }) : /* @__PURE__ */ D(T, { children: [/* @__PURE__ */ E("div", {
202
+ className: "overflow-x-auto",
203
+ children: /* @__PURE__ */ D(N, { children: [/* @__PURE__ */ E(L, { children: /* @__PURE__ */ D(R, { children: [
204
+ /* @__PURE__ */ E(I, { children: "Name" }),
205
+ /* @__PURE__ */ E(I, { children: "Sport" }),
206
+ /* @__PURE__ */ E(I, { children: "Level" }),
207
+ /* @__PURE__ */ E(I, { children: "Status" }),
208
+ /* @__PURE__ */ E(I, {
209
+ className: "text-right",
210
+ children: "Weeks"
211
+ }),
212
+ /* @__PURE__ */ E(I, {
213
+ className: "text-right",
214
+ children: "Drills"
215
+ }),
216
+ /* @__PURE__ */ E(I, { children: "Template" }),
217
+ /* @__PURE__ */ E(I, { children: "Created" })
218
+ ] }) }), /* @__PURE__ */ E(P, { children: h.map((e) => /* @__PURE__ */ D(R, { children: [
219
+ /* @__PURE__ */ E(F, {
220
+ className: "font-medium text-text-primary",
221
+ children: e.name
222
+ }),
223
+ /* @__PURE__ */ E(F, {
224
+ className: "text-text-secondary",
225
+ children: a[e.sport]
226
+ }),
227
+ /* @__PURE__ */ E(F, {
228
+ className: "text-text-secondary",
229
+ children: r[e.level]
230
+ }),
231
+ /* @__PURE__ */ E(F, { children: /* @__PURE__ */ E(t, { status: e.status }) }),
232
+ /* @__PURE__ */ E(F, {
233
+ className: "text-right text-text-secondary",
234
+ children: e.weeks
235
+ }),
236
+ /* @__PURE__ */ E(F, {
237
+ className: "text-right text-text-secondary",
238
+ children: e.drills?.items.length ?? 0
239
+ }),
240
+ /* @__PURE__ */ E(F, {
241
+ className: "text-text-secondary",
242
+ children: e.isTemplate ? "Yes" : "No"
243
+ }),
244
+ /* @__PURE__ */ E(F, {
245
+ className: "text-text-secondary",
246
+ children: o(e.createdAt)
247
+ })
248
+ ] }, e.id)) })] })
249
+ }), /* @__PURE__ */ E(g, {
250
+ page: d,
251
+ hasMore: m.data?.pageInfo.hasMore ?? !1,
252
+ onPrev: () => p((e) => Math.max(0, e - 1)),
253
+ onNext: () => p((e) => e + 1)
254
+ })] })] })] });
255
+ }, Q = () => {
256
+ let [e, r] = y(""), [i, a] = y(0), [s, f] = y(""), p = d({
257
+ status: e || void 0,
258
+ pagination: {
259
+ limit: U,
260
+ offset: i * U
261
+ }
262
+ }), h = v(() => p.data?.items ?? [], [p.data]), x = v(() => {
263
+ let e = /* @__PURE__ */ new Set();
264
+ for (let t of h) t.competition && e.add(t.competition);
265
+ return [...e].sort().map((e) => ({
266
+ value: e,
267
+ label: e
268
+ }));
269
+ }, [h]), S = m(s || void 0), w = S.data ?? [];
270
+ return /* @__PURE__ */ D("div", {
271
+ className: "flex flex-col gap-6",
272
+ children: [/* @__PURE__ */ D(O, { children: [/* @__PURE__ */ D(j, { children: [/* @__PURE__ */ E(M, { children: "Fixtures" }), /* @__PURE__ */ E(A, { children: "Scheduled, live and completed fixtures across every competition in this workspace." })] }), /* @__PURE__ */ D(k, { children: [/* @__PURE__ */ E("div", {
273
+ className: "mb-4 flex flex-wrap items-center gap-3",
274
+ children: /* @__PURE__ */ E(_, {
275
+ ariaLabel: "Filter fixtures by status",
276
+ allLabel: "All statuses",
277
+ value: e,
278
+ onChange: (e) => {
279
+ r(e), a(0);
280
+ },
281
+ options: q
282
+ })
283
+ }), p.isLoading ? /* @__PURE__ */ E(u, { label: "Loading fixtures…" }) : p.isError ? /* @__PURE__ */ E(l, { onRetry: () => void p.refetch() }) : h.length === 0 ? /* @__PURE__ */ E(c, {
284
+ icon: /* @__PURE__ */ E(b, { className: "h-6 w-6" }),
285
+ title: "No fixtures match these filters",
286
+ description: "Fixtures scheduled in this workspace will appear here."
287
+ }) : /* @__PURE__ */ D(T, { children: [/* @__PURE__ */ E("div", {
288
+ className: "overflow-x-auto",
289
+ children: /* @__PURE__ */ D(N, { children: [/* @__PURE__ */ E(L, { children: /* @__PURE__ */ D(R, { children: [
290
+ /* @__PURE__ */ E(I, { children: "Home" }),
291
+ /* @__PURE__ */ E(I, { children: "Away" }),
292
+ /* @__PURE__ */ E(I, { children: "Competition" }),
293
+ /* @__PURE__ */ E(I, { children: "Type" }),
294
+ /* @__PURE__ */ E(I, { children: "Status" }),
295
+ /* @__PURE__ */ E(I, {
296
+ className: "text-right",
297
+ children: "Score"
298
+ }),
299
+ /* @__PURE__ */ E(I, { children: "Scheduled" })
300
+ ] }) }), /* @__PURE__ */ E(P, { children: h.map((e) => /* @__PURE__ */ D(R, { children: [
301
+ /* @__PURE__ */ E(F, {
302
+ className: "font-medium text-text-primary",
303
+ children: Y(e.homeTeam?.name)
304
+ }),
305
+ /* @__PURE__ */ E(F, {
306
+ className: "font-medium text-text-primary",
307
+ children: Y(e.awayTeam?.name)
308
+ }),
309
+ /* @__PURE__ */ E(F, {
310
+ className: "text-text-secondary",
311
+ children: Y(e.competition)
312
+ }),
313
+ /* @__PURE__ */ E(F, {
314
+ className: "text-text-secondary",
315
+ children: n[e.type]
316
+ }),
317
+ /* @__PURE__ */ E(F, { children: /* @__PURE__ */ E(t, { status: e.status }) }),
318
+ /* @__PURE__ */ E(F, {
319
+ className: "text-right text-text-secondary",
320
+ children: e.homeScore === null || e.awayScore === null ? "—" : `${e.homeScore}–${e.awayScore}`
321
+ }),
322
+ /* @__PURE__ */ E(F, {
323
+ className: "text-text-secondary",
324
+ children: o(e.scheduledAt)
325
+ })
326
+ ] }, e.id)) })] })
327
+ }), /* @__PURE__ */ E(g, {
328
+ page: i,
329
+ hasMore: p.data?.pageInfo.hasMore ?? !1,
330
+ onPrev: () => a((e) => Math.max(0, e - 1)),
331
+ onNext: () => a((e) => e + 1)
332
+ })] })] })] }), /* @__PURE__ */ D(O, { children: [/* @__PURE__ */ D(j, { children: [/* @__PURE__ */ E(M, { children: "Standings" }), /* @__PURE__ */ E(A, { children: "League table for a competition, recomputed by the service when a fixture result is recorded. Pick a competition seen on the fixtures above." })] }), /* @__PURE__ */ E(k, { children: x.length === 0 ? /* @__PURE__ */ E(c, {
333
+ icon: /* @__PURE__ */ E(C, { className: "h-6 w-6" }),
334
+ title: "No competitions to show",
335
+ description: "Standings appear once fixtures in this workspace are assigned a competition."
336
+ }) : /* @__PURE__ */ D(T, { children: [/* @__PURE__ */ E("div", {
337
+ className: "mb-4 flex flex-wrap items-center gap-3",
338
+ children: /* @__PURE__ */ E(_, {
339
+ ariaLabel: "Select a competition",
340
+ allLabel: "Select a competition…",
341
+ value: s,
342
+ onChange: f,
343
+ options: x
344
+ })
345
+ }), s ? S.isLoading ? /* @__PURE__ */ E(u, { label: "Loading standings…" }) : S.isError ? /* @__PURE__ */ E(l, { onRetry: () => void S.refetch() }) : w.length === 0 ? /* @__PURE__ */ E(c, {
346
+ icon: /* @__PURE__ */ E(C, { className: "h-6 w-6" }),
347
+ title: "No standings recorded yet",
348
+ description: "Standings are computed once results are recorded for this competition."
349
+ }) : /* @__PURE__ */ E("div", {
350
+ className: "overflow-x-auto",
351
+ children: /* @__PURE__ */ D(N, { children: [/* @__PURE__ */ E(L, { children: /* @__PURE__ */ D(R, { children: [
352
+ /* @__PURE__ */ E(I, {
353
+ className: "text-right",
354
+ children: "#"
355
+ }),
356
+ /* @__PURE__ */ E(I, { children: "Team" }),
357
+ /* @__PURE__ */ E(I, {
358
+ className: "text-right",
359
+ children: "P"
360
+ }),
361
+ /* @__PURE__ */ E(I, {
362
+ className: "text-right",
363
+ children: "W"
364
+ }),
365
+ /* @__PURE__ */ E(I, {
366
+ className: "text-right",
367
+ children: "D"
368
+ }),
369
+ /* @__PURE__ */ E(I, {
370
+ className: "text-right",
371
+ children: "L"
372
+ }),
373
+ /* @__PURE__ */ E(I, {
374
+ className: "text-right",
375
+ children: "GF"
376
+ }),
377
+ /* @__PURE__ */ E(I, {
378
+ className: "text-right",
379
+ children: "GA"
380
+ }),
381
+ /* @__PURE__ */ E(I, {
382
+ className: "text-right",
383
+ children: "Pts"
384
+ })
385
+ ] }) }), /* @__PURE__ */ E(P, { children: w.map((e) => /* @__PURE__ */ D(R, { children: [
386
+ /* @__PURE__ */ E(F, {
387
+ className: "text-right text-text-secondary",
388
+ children: Y(e.rank)
389
+ }),
390
+ /* @__PURE__ */ E(F, {
391
+ className: "font-medium text-text-primary",
392
+ children: Y(e.team?.name)
393
+ }),
394
+ /* @__PURE__ */ E(F, {
395
+ className: "text-right text-text-secondary",
396
+ children: e.played
397
+ }),
398
+ /* @__PURE__ */ E(F, {
399
+ className: "text-right text-text-secondary",
400
+ children: e.won
401
+ }),
402
+ /* @__PURE__ */ E(F, {
403
+ className: "text-right text-text-secondary",
404
+ children: e.drawn
405
+ }),
406
+ /* @__PURE__ */ E(F, {
407
+ className: "text-right text-text-secondary",
408
+ children: e.lost
409
+ }),
410
+ /* @__PURE__ */ E(F, {
411
+ className: "text-right text-text-secondary",
412
+ children: e.goalsFor
413
+ }),
414
+ /* @__PURE__ */ E(F, {
415
+ className: "text-right text-text-secondary",
416
+ children: e.goalsAgainst
417
+ }),
418
+ /* @__PURE__ */ E(F, {
419
+ className: "text-right font-medium text-text-primary",
420
+ children: e.points
421
+ })
422
+ ] }, e.id)) })] })
423
+ }) : /* @__PURE__ */ E(c, {
424
+ icon: /* @__PURE__ */ E(C, { className: "h-6 w-6" }),
425
+ title: "Select a competition",
426
+ description: "Choose a competition above to load its standings."
427
+ })] }) })] })]
428
+ });
429
+ }, $ = () => {
430
+ let [e, n] = y(""), [r, a] = y(0), d = p({
431
+ status: e || void 0,
432
+ pagination: {
433
+ limit: U,
434
+ offset: r * U
435
+ }
436
+ }), f = d.data?.items ?? [];
437
+ return /* @__PURE__ */ D(O, { children: [/* @__PURE__ */ D(j, { children: [/* @__PURE__ */ E(M, { children: "Coaching sessions" }), /* @__PURE__ */ E(A, { children: "Booked, confirmed and completed one-to-one coaching sessions in this workspace." })] }), /* @__PURE__ */ D(k, { children: [/* @__PURE__ */ E("div", {
438
+ className: "mb-4 flex flex-wrap items-center gap-3",
439
+ children: /* @__PURE__ */ E(_, {
440
+ ariaLabel: "Filter sessions by status",
441
+ allLabel: "All statuses",
442
+ value: e,
443
+ onChange: (e) => {
444
+ n(e), a(0);
445
+ },
446
+ options: J
447
+ })
448
+ }), d.isLoading ? /* @__PURE__ */ E(u, { label: "Loading sessions…" }) : d.isError ? /* @__PURE__ */ E(l, { onRetry: () => void d.refetch() }) : f.length === 0 ? /* @__PURE__ */ E(c, {
449
+ icon: /* @__PURE__ */ E(x, { className: "h-6 w-6" }),
450
+ title: "No sessions match these filters",
451
+ description: "Coaching sessions booked in this workspace will appear here."
452
+ }) : /* @__PURE__ */ D(T, { children: [/* @__PURE__ */ E("div", {
453
+ className: "overflow-x-auto",
454
+ children: /* @__PURE__ */ D(N, { children: [/* @__PURE__ */ E(L, { children: /* @__PURE__ */ D(R, { children: [
455
+ /* @__PURE__ */ E(I, { children: "Title" }),
456
+ /* @__PURE__ */ E(I, { children: "Type" }),
457
+ /* @__PURE__ */ E(I, { children: "Status" }),
458
+ /* @__PURE__ */ E(I, { children: "Scheduled" }),
459
+ /* @__PURE__ */ E(I, { children: "Duration" }),
460
+ /* @__PURE__ */ E(I, {
461
+ className: "text-right",
462
+ children: "Rating"
463
+ })
464
+ ] }) }), /* @__PURE__ */ E(P, { children: f.map((e) => /* @__PURE__ */ D(R, { children: [
465
+ /* @__PURE__ */ E(F, {
466
+ className: "font-medium text-text-primary",
467
+ children: e.title
468
+ }),
469
+ /* @__PURE__ */ E(F, {
470
+ className: "text-text-secondary",
471
+ children: i[e.type]
472
+ }),
473
+ /* @__PURE__ */ E(F, { children: /* @__PURE__ */ E(t, { status: e.status }) }),
474
+ /* @__PURE__ */ E(F, {
475
+ className: "text-text-secondary",
476
+ children: o(e.scheduledAt)
477
+ }),
478
+ /* @__PURE__ */ E(F, {
479
+ className: "text-text-secondary",
480
+ children: s(e.durationMin)
481
+ }),
482
+ /* @__PURE__ */ E(F, {
483
+ className: "text-right text-text-secondary",
484
+ children: Y(e.rating)
485
+ })
486
+ ] }, e.id)) })] })
487
+ }), /* @__PURE__ */ E(g, {
488
+ page: r,
489
+ hasMore: d.data?.pageInfo.hasMore ?? !1,
490
+ onPrev: () => a((e) => Math.max(0, e - 1)),
491
+ onNext: () => a((e) => e + 1)
492
+ })] })] })] });
493
+ }, ee = () => {
494
+ let [t, n] = y("teams");
495
+ return /* @__PURE__ */ E(e, {
496
+ title: "AthleteBridge Admin",
497
+ description: "Operations oversight for AthleteBridge teams, programs, fixtures and sessions.",
498
+ hero: !0,
499
+ gradientTitle: !0,
500
+ children: /* @__PURE__ */ D(z, {
501
+ value: t,
502
+ onValueChange: n,
503
+ className: "w-full",
504
+ children: [
505
+ /* @__PURE__ */ D(V, {
506
+ className: "mb-4 grid w-full grid-cols-4 sm:w-auto sm:inline-flex",
507
+ children: [
508
+ /* @__PURE__ */ D(H, {
509
+ value: "teams",
510
+ className: "gap-2",
511
+ children: [/* @__PURE__ */ E(w, { size: 16 }), "Teams"]
512
+ }),
513
+ /* @__PURE__ */ D(H, {
514
+ value: "programs",
515
+ className: "gap-2",
516
+ children: [/* @__PURE__ */ E(S, { size: 16 }), "Programs"]
517
+ }),
518
+ /* @__PURE__ */ D(H, {
519
+ value: "fixtures",
520
+ className: "gap-2",
521
+ children: [/* @__PURE__ */ E(b, { size: 16 }), "Fixtures"]
522
+ }),
523
+ /* @__PURE__ */ D(H, {
524
+ value: "sessions",
525
+ className: "gap-2",
526
+ children: [/* @__PURE__ */ E(x, { size: 16 }), "Sessions"]
527
+ })
528
+ ]
529
+ }),
530
+ /* @__PURE__ */ E(B, {
531
+ value: "teams",
532
+ children: /* @__PURE__ */ E(X, {})
533
+ }),
534
+ /* @__PURE__ */ E(B, {
535
+ value: "programs",
536
+ children: /* @__PURE__ */ E(Z, {})
537
+ }),
538
+ /* @__PURE__ */ E(B, {
539
+ value: "fixtures",
540
+ children: /* @__PURE__ */ E(Q, {})
541
+ }),
542
+ /* @__PURE__ */ E(B, {
543
+ value: "sessions",
544
+ children: /* @__PURE__ */ E($, {})
545
+ })
546
+ ]
547
+ })
548
+ });
549
+ };
550
+ //#endregion
551
+ export { ee as AdminDashboardPage };
552
+
553
+ //# sourceMappingURL=AdminDashboardPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminDashboardPage.js","names":[],"sources":["../../../src/atheletebridge/admin/AdminDashboardPage.tsx"],"sourcesContent":["/**\n * AthleteBridge Admin Dashboard\n * @module atheletebridge/admin\n *\n * Product-specific governance surface mounted inside `admin-app` at\n * `/admin/atheletebridge` (BOFF-3258).\n *\n * Every tab below is backed by a REAL, shipped `wspace-atheletebridge-svc`\n * root field reached through the workspace gateway:\n *\n * Teams → athListTeams (useTeams)\n * Programs → athListPrograms (usePrograms)\n * Fixtures → athListFixtures (useFixtures) + athStandings (useStandings)\n * Sessions → athListSessions (useSessions)\n *\n * DELIBERATE OMISSION (RULINGS R6): governance surfaces that have no backing\n * query are OMITTED ENTIRELY rather than shipped with invented rows. This file\n * intentionally does NOT copy the `PLACEHOLDER_ADAPTERS` / `PLACEHOLDER_LISTINGS`\n * pattern from `microfe-subscriberbot/src/subscriberbot/admin/AdminDashboardPage.tsx`,\n * which renders fabricated data behind a \"backend not implemented\" banner. There\n * are zero hard-coded rows here.\n *\n * READ-ONLY BY DESIGN: this is an operations/support oversight view. Lifecycle\n * mutations (archive team, transition program, cancel session, …) already exist\n * in the product UI behind the same RBAC pairs; duplicating them here would add\n * a second write path to a service already on the duplication watch list\n * (05-OVERLAP-AND-DUPLICATION-REPORT.md:249) without a governance need.\n */\n\nimport { useMemo, useState, type FC } from 'react';\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@burdenoff/fe-libs/ui';\nimport { CalendarDays, ClipboardCheck, Dumbbell, Trophy, Users } from 'lucide-react';\n\nimport { CursorPager } from '../components/CursorPager';\nimport { EmptyState } from '../components/EmptyState';\nimport { FilterSelect } from '../components/FilterSelect';\nimport { LoadingState, ErrorState } from '../components/LoadingState';\nimport { PageLayout } from '../components/PageLayout';\nimport { StatusBadge } from '../components/StatusBadge';\nimport {\n FIXTURE_TYPE_LABELS,\n PROGRAM_LEVEL_LABELS,\n SESSION_TYPE_LABELS,\n SPORT_LABELS,\n} from '../components/domain';\nimport { useFixtures, usePrograms, useSessions, useStandings, useTeams } from '../hooks';\nimport { formatDate, formatDuration } from '../utils/formatters';\nimport type {\n AthFixtureStatus,\n AthProgramStatus,\n AthSessionStatus,\n AthSport,\n AthTeamStatus,\n} from '../types';\n\nconst PAGE_SIZE = 20;\n\nconst SPORT_OPTS = (Object.keys(SPORT_LABELS) as AthSport[]).map((value) => ({\n value,\n label: SPORT_LABELS[value],\n}));\n\nconst TEAM_STATUS_OPTS: ReadonlyArray<{ value: AthTeamStatus; label: string }> = [\n { value: 'FORMING', label: 'Forming' },\n { value: 'ACTIVE', label: 'Active' },\n { value: 'INACTIVE', label: 'Inactive' },\n { value: 'ARCHIVED', label: 'Archived' },\n];\n\nconst PROGRAM_STATUS_OPTS: ReadonlyArray<{ value: AthProgramStatus; label: string }> = [\n { value: 'DRAFT', label: 'Draft' },\n { value: 'PUBLISHED', label: 'Published' },\n { value: 'ARCHIVED', label: 'Archived' },\n];\n\nconst FIXTURE_STATUS_OPTS: ReadonlyArray<{ value: AthFixtureStatus; label: string }> = [\n { value: 'SCHEDULED', label: 'Scheduled' },\n { value: 'LIVE', label: 'Live' },\n { value: 'COMPLETED', label: 'Completed' },\n { value: 'POSTPONED', label: 'Postponed' },\n { value: 'CANCELLED', label: 'Cancelled' },\n];\n\nconst SESSION_STATUS_OPTS: ReadonlyArray<{ value: AthSessionStatus; label: string }> = [\n { value: 'REQUESTED', label: 'Requested' },\n { value: 'CONFIRMED', label: 'Confirmed' },\n { value: 'COMPLETED', label: 'Completed' },\n { value: 'CANCELLED', label: 'Cancelled' },\n { value: 'NO_SHOW', label: 'No show' },\n];\n\n/** Renders an em dash for absent values so empty cells never read as a bug. */\nconst orDash = (value: string | number | null | undefined): string =>\n value === null || value === undefined || value === '' ? '—' : String(value);\n\n// ============================================================================\n// Teams\n// ============================================================================\n\nconst TeamsTab: FC = () => {\n const [sport, setSport] = useState<AthSport | ''>('');\n const [status, setStatus] = useState<AthTeamStatus | ''>('');\n const [page, setPage] = useState(0);\n\n const teams = useTeams({\n sport: sport || undefined,\n status: status || undefined,\n pagination: { limit: PAGE_SIZE, offset: page * PAGE_SIZE },\n });\n\n const items = teams.data?.items ?? [];\n\n return (\n <Card>\n <CardHeader>\n <CardTitle>Teams</CardTitle>\n <CardDescription>\n Every squad, club side, academy group and esports roster in the active workspace.\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"mb-4 flex flex-wrap items-center gap-3\">\n <FilterSelect\n ariaLabel=\"Filter teams by sport\"\n allLabel=\"All sports\"\n value={sport}\n onChange={(v) => {\n setSport(v);\n setPage(0);\n }}\n options={SPORT_OPTS}\n />\n <FilterSelect\n ariaLabel=\"Filter teams by status\"\n allLabel=\"All statuses\"\n value={status}\n onChange={(v) => {\n setStatus(v);\n setPage(0);\n }}\n options={TEAM_STATUS_OPTS}\n />\n </div>\n\n {teams.isLoading ? (\n <LoadingState label=\"Loading teams…\" />\n ) : teams.isError ? (\n <ErrorState onRetry={() => void teams.refetch()} />\n ) : items.length === 0 ? (\n <EmptyState\n icon={<Users className=\"h-6 w-6\" />}\n title=\"No teams match these filters\"\n description=\"Teams created in this workspace will appear here for oversight.\"\n />\n ) : (\n <>\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Name</TableHead>\n <TableHead>Sport</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>Age group</TableHead>\n <TableHead>Season</TableHead>\n <TableHead className=\"text-right\">Members</TableHead>\n <TableHead>Created</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {items.map((team) => (\n <TableRow key={team.id}>\n <TableCell className=\"font-medium text-text-primary\">{team.name}</TableCell>\n <TableCell className=\"text-text-secondary\">\n {SPORT_LABELS[team.sport]}\n </TableCell>\n <TableCell>\n <StatusBadge status={team.status} />\n </TableCell>\n <TableCell className=\"text-text-secondary\">{orDash(team.ageGroup)}</TableCell>\n <TableCell className=\"text-text-secondary\">{orDash(team.season)}</TableCell>\n <TableCell className=\"text-right text-text-secondary\">\n {team.members?.items.length ?? 0}\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatDate(team.createdAt)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n <CursorPager\n page={page}\n hasMore={teams.data?.pageInfo.hasMore ?? false}\n onPrev={() => setPage((p) => Math.max(0, p - 1))}\n onNext={() => setPage((p) => p + 1)}\n />\n </>\n )}\n </CardContent>\n </Card>\n );\n};\n\n// ============================================================================\n// Programs\n// ============================================================================\n\nconst ProgramsTab: FC = () => {\n const [sport, setSport] = useState<AthSport | ''>('');\n const [status, setStatus] = useState<AthProgramStatus | ''>('');\n const [page, setPage] = useState(0);\n\n const programs = usePrograms({\n sport: sport || undefined,\n status: status || undefined,\n pagination: { limit: PAGE_SIZE, offset: page * PAGE_SIZE },\n });\n\n const items = programs.data?.items ?? [];\n\n return (\n <Card>\n <CardHeader>\n <CardTitle>Training programs</CardTitle>\n <CardDescription>\n Coaching programs and templates, with their drill counts and publication state.\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"mb-4 flex flex-wrap items-center gap-3\">\n <FilterSelect\n ariaLabel=\"Filter programs by sport\"\n allLabel=\"All sports\"\n value={sport}\n onChange={(v) => {\n setSport(v);\n setPage(0);\n }}\n options={SPORT_OPTS}\n />\n <FilterSelect\n ariaLabel=\"Filter programs by status\"\n allLabel=\"All statuses\"\n value={status}\n onChange={(v) => {\n setStatus(v);\n setPage(0);\n }}\n options={PROGRAM_STATUS_OPTS}\n />\n </div>\n\n {programs.isLoading ? (\n <LoadingState label=\"Loading programs…\" />\n ) : programs.isError ? (\n <ErrorState onRetry={() => void programs.refetch()} />\n ) : items.length === 0 ? (\n <EmptyState\n icon={<Dumbbell className=\"h-6 w-6\" />}\n title=\"No programs match these filters\"\n description=\"Programs authored by coaches in this workspace will appear here.\"\n />\n ) : (\n <>\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Name</TableHead>\n <TableHead>Sport</TableHead>\n <TableHead>Level</TableHead>\n <TableHead>Status</TableHead>\n <TableHead className=\"text-right\">Weeks</TableHead>\n <TableHead className=\"text-right\">Drills</TableHead>\n <TableHead>Template</TableHead>\n <TableHead>Created</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {items.map((program) => (\n <TableRow key={program.id}>\n <TableCell className=\"font-medium text-text-primary\">\n {program.name}\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {SPORT_LABELS[program.sport]}\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {PROGRAM_LEVEL_LABELS[program.level]}\n </TableCell>\n <TableCell>\n <StatusBadge status={program.status} />\n </TableCell>\n <TableCell className=\"text-right text-text-secondary\">\n {program.weeks}\n </TableCell>\n <TableCell className=\"text-right text-text-secondary\">\n {program.drills?.items.length ?? 0}\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {program.isTemplate ? 'Yes' : 'No'}\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatDate(program.createdAt)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n <CursorPager\n page={page}\n hasMore={programs.data?.pageInfo.hasMore ?? false}\n onPrev={() => setPage((p) => Math.max(0, p - 1))}\n onNext={() => setPage((p) => p + 1)}\n />\n </>\n )}\n </CardContent>\n </Card>\n );\n};\n\n// ============================================================================\n// Fixtures + standings\n// ============================================================================\n\nconst FixturesTab: FC = () => {\n const [status, setStatus] = useState<AthFixtureStatus | ''>('');\n const [page, setPage] = useState(0);\n const [competition, setCompetition] = useState<string | ''>('');\n\n const fixtures = useFixtures({\n status: status || undefined,\n pagination: { limit: PAGE_SIZE, offset: page * PAGE_SIZE },\n });\n\n const items = useMemo(() => fixtures.data?.items ?? [], [fixtures.data]);\n\n // Competition options are derived from the competitions actually present on\n // the loaded fixtures — never a hard-coded league list.\n const competitionOpts = useMemo(() => {\n const names = new Set<string>();\n for (const fixture of items) {\n if (fixture.competition) names.add(fixture.competition);\n }\n return [...names].sort().map((value) => ({ value, label: value }));\n }, [items]);\n\n const standings = useStandings(competition || undefined);\n const standingRows = standings.data ?? [];\n\n return (\n <div className=\"flex flex-col gap-6\">\n <Card>\n <CardHeader>\n <CardTitle>Fixtures</CardTitle>\n <CardDescription>\n Scheduled, live and completed fixtures across every competition in this workspace.\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"mb-4 flex flex-wrap items-center gap-3\">\n <FilterSelect\n ariaLabel=\"Filter fixtures by status\"\n allLabel=\"All statuses\"\n value={status}\n onChange={(v) => {\n setStatus(v);\n setPage(0);\n }}\n options={FIXTURE_STATUS_OPTS}\n />\n </div>\n\n {fixtures.isLoading ? (\n <LoadingState label=\"Loading fixtures…\" />\n ) : fixtures.isError ? (\n <ErrorState onRetry={() => void fixtures.refetch()} />\n ) : items.length === 0 ? (\n <EmptyState\n icon={<CalendarDays className=\"h-6 w-6\" />}\n title=\"No fixtures match these filters\"\n description=\"Fixtures scheduled in this workspace will appear here.\"\n />\n ) : (\n <>\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Home</TableHead>\n <TableHead>Away</TableHead>\n <TableHead>Competition</TableHead>\n <TableHead>Type</TableHead>\n <TableHead>Status</TableHead>\n <TableHead className=\"text-right\">Score</TableHead>\n <TableHead>Scheduled</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {items.map((fixture) => (\n <TableRow key={fixture.id}>\n <TableCell className=\"font-medium text-text-primary\">\n {orDash(fixture.homeTeam?.name)}\n </TableCell>\n <TableCell className=\"font-medium text-text-primary\">\n {orDash(fixture.awayTeam?.name)}\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {orDash(fixture.competition)}\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {FIXTURE_TYPE_LABELS[fixture.type]}\n </TableCell>\n <TableCell>\n <StatusBadge status={fixture.status} />\n </TableCell>\n <TableCell className=\"text-right text-text-secondary\">\n {fixture.homeScore === null || fixture.awayScore === null\n ? '—'\n : `${fixture.homeScore}–${fixture.awayScore}`}\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatDate(fixture.scheduledAt)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n <CursorPager\n page={page}\n hasMore={fixtures.data?.pageInfo.hasMore ?? false}\n onPrev={() => setPage((p) => Math.max(0, p - 1))}\n onNext={() => setPage((p) => p + 1)}\n />\n </>\n )}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Standings</CardTitle>\n <CardDescription>\n League table for a competition, recomputed by the service when a fixture result is\n recorded. Pick a competition seen on the fixtures above.\n </CardDescription>\n </CardHeader>\n <CardContent>\n {competitionOpts.length === 0 ? (\n <EmptyState\n icon={<Trophy className=\"h-6 w-6\" />}\n title=\"No competitions to show\"\n description=\"Standings appear once fixtures in this workspace are assigned a competition.\"\n />\n ) : (\n <>\n <div className=\"mb-4 flex flex-wrap items-center gap-3\">\n <FilterSelect\n ariaLabel=\"Select a competition\"\n allLabel=\"Select a competition…\"\n value={competition}\n onChange={setCompetition}\n options={competitionOpts}\n />\n </div>\n\n {!competition ? (\n <EmptyState\n icon={<Trophy className=\"h-6 w-6\" />}\n title=\"Select a competition\"\n description=\"Choose a competition above to load its standings.\"\n />\n ) : standings.isLoading ? (\n <LoadingState label=\"Loading standings…\" />\n ) : standings.isError ? (\n <ErrorState onRetry={() => void standings.refetch()} />\n ) : standingRows.length === 0 ? (\n <EmptyState\n icon={<Trophy className=\"h-6 w-6\" />}\n title=\"No standings recorded yet\"\n description=\"Standings are computed once results are recorded for this competition.\"\n />\n ) : (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"text-right\">#</TableHead>\n <TableHead>Team</TableHead>\n <TableHead className=\"text-right\">P</TableHead>\n <TableHead className=\"text-right\">W</TableHead>\n <TableHead className=\"text-right\">D</TableHead>\n <TableHead className=\"text-right\">L</TableHead>\n <TableHead className=\"text-right\">GF</TableHead>\n <TableHead className=\"text-right\">GA</TableHead>\n <TableHead className=\"text-right\">Pts</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {standingRows.map((row) => (\n <TableRow key={row.id}>\n <TableCell className=\"text-right text-text-secondary\">\n {orDash(row.rank)}\n </TableCell>\n <TableCell className=\"font-medium text-text-primary\">\n {orDash(row.team?.name)}\n </TableCell>\n <TableCell className=\"text-right text-text-secondary\">\n {row.played}\n </TableCell>\n <TableCell className=\"text-right text-text-secondary\">\n {row.won}\n </TableCell>\n <TableCell className=\"text-right text-text-secondary\">\n {row.drawn}\n </TableCell>\n <TableCell className=\"text-right text-text-secondary\">\n {row.lost}\n </TableCell>\n <TableCell className=\"text-right text-text-secondary\">\n {row.goalsFor}\n </TableCell>\n <TableCell className=\"text-right text-text-secondary\">\n {row.goalsAgainst}\n </TableCell>\n <TableCell className=\"text-right font-medium text-text-primary\">\n {row.points}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n )}\n </>\n )}\n </CardContent>\n </Card>\n </div>\n );\n};\n\n// ============================================================================\n// Sessions\n// ============================================================================\n\nconst SessionsTab: FC = () => {\n const [status, setStatus] = useState<AthSessionStatus | ''>('');\n const [page, setPage] = useState(0);\n\n const sessions = useSessions({\n status: status || undefined,\n pagination: { limit: PAGE_SIZE, offset: page * PAGE_SIZE },\n });\n\n const items = sessions.data?.items ?? [];\n\n return (\n <Card>\n <CardHeader>\n <CardTitle>Coaching sessions</CardTitle>\n <CardDescription>\n Booked, confirmed and completed one-to-one coaching sessions in this workspace.\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"mb-4 flex flex-wrap items-center gap-3\">\n <FilterSelect\n ariaLabel=\"Filter sessions by status\"\n allLabel=\"All statuses\"\n value={status}\n onChange={(v) => {\n setStatus(v);\n setPage(0);\n }}\n options={SESSION_STATUS_OPTS}\n />\n </div>\n\n {sessions.isLoading ? (\n <LoadingState label=\"Loading sessions…\" />\n ) : sessions.isError ? (\n <ErrorState onRetry={() => void sessions.refetch()} />\n ) : items.length === 0 ? (\n <EmptyState\n icon={<ClipboardCheck className=\"h-6 w-6\" />}\n title=\"No sessions match these filters\"\n description=\"Coaching sessions booked in this workspace will appear here.\"\n />\n ) : (\n <>\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Title</TableHead>\n <TableHead>Type</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>Scheduled</TableHead>\n <TableHead>Duration</TableHead>\n <TableHead className=\"text-right\">Rating</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {items.map((session) => (\n <TableRow key={session.id}>\n <TableCell className=\"font-medium text-text-primary\">\n {session.title}\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {SESSION_TYPE_LABELS[session.type]}\n </TableCell>\n <TableCell>\n <StatusBadge status={session.status} />\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatDate(session.scheduledAt)}\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatDuration(session.durationMin)}\n </TableCell>\n <TableCell className=\"text-right text-text-secondary\">\n {orDash(session.rating)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n <CursorPager\n page={page}\n hasMore={sessions.data?.pageInfo.hasMore ?? false}\n onPrev={() => setPage((p) => Math.max(0, p - 1))}\n onNext={() => setPage((p) => p + 1)}\n />\n </>\n )}\n </CardContent>\n </Card>\n );\n};\n\n// ============================================================================\n// Dashboard\n// ============================================================================\n\nexport const AdminDashboardPage: FC = () => {\n const [activeTab, setActiveTab] = useState('teams');\n\n return (\n <PageLayout\n title=\"AthleteBridge Admin\"\n description=\"Operations oversight for AthleteBridge teams, programs, fixtures and sessions.\"\n hero\n gradientTitle\n >\n <Tabs value={activeTab} onValueChange={setActiveTab} className=\"w-full\">\n <TabsList className=\"mb-4 grid w-full grid-cols-4 sm:w-auto sm:inline-flex\">\n <TabsTrigger value=\"teams\" className=\"gap-2\">\n <Users size={16} />\n Teams\n </TabsTrigger>\n <TabsTrigger value=\"programs\" className=\"gap-2\">\n <Dumbbell size={16} />\n Programs\n </TabsTrigger>\n <TabsTrigger value=\"fixtures\" className=\"gap-2\">\n <CalendarDays size={16} />\n Fixtures\n </TabsTrigger>\n <TabsTrigger value=\"sessions\" className=\"gap-2\">\n <ClipboardCheck size={16} />\n Sessions\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"teams\">\n <TeamsTab />\n </TabsContent>\n <TabsContent value=\"programs\">\n <ProgramsTab />\n </TabsContent>\n <TabsContent value=\"fixtures\">\n <FixturesTab />\n </TabsContent>\n <TabsContent value=\"sessions\">\n <SessionsTab />\n </TabsContent>\n </Tabs>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { FC } from 'react';
2
+ import { AthleteBridgeRootProps } from '../types';
3
+
4
+ export interface AthleteBridgeAdminRootProps extends AthleteBridgeRootProps {
5
+ /** Workspace-scoped token supplied by `admin-app` for workspace gateway calls. */
6
+ workspaceToken?: string;
7
+ }
8
+ export declare const AdminRoot: FC<AthleteBridgeAdminRootProps>;
9
+ //# sourceMappingURL=AdminRoot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminRoot.d.ts","sourceRoot":"","sources":["../../../src/atheletebridge/admin/AdminRoot.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAIhC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAYvD,MAAM,WAAW,2BAA4B,SAAQ,sBAAsB;IACzE,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,SAAS,EAAE,EAAE,CAAC,2BAA2B,CAgBrD,CAAC"}