@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.
- package/dist/atheletebridge/AthleteBridgeRoot.js +50 -53
- package/dist/atheletebridge/AthleteBridgeRoot.js.map +1 -1
- package/dist/atheletebridge/AthleteBridgeRoutes.d.ts.map +1 -1
- package/dist/atheletebridge/AthleteBridgeRoutes.js +29 -25
- package/dist/atheletebridge/AthleteBridgeRoutes.js.map +1 -1
- package/dist/atheletebridge/admin/AdminDashboardPage.d.ts +4 -0
- package/dist/atheletebridge/admin/AdminDashboardPage.d.ts.map +1 -0
- package/dist/atheletebridge/admin/AdminDashboardPage.js +553 -0
- package/dist/atheletebridge/admin/AdminDashboardPage.js.map +1 -0
- package/dist/atheletebridge/admin/AdminRoot.d.ts +9 -0
- package/dist/atheletebridge/admin/AdminRoot.d.ts.map +1 -0
- package/dist/atheletebridge/admin/AdminRoot.js +23 -0
- package/dist/atheletebridge/admin/AdminRoot.js.map +1 -0
- package/dist/atheletebridge/admin/index.d.ts +11 -0
- package/dist/atheletebridge/admin/index.d.ts.map +1 -0
- package/dist/atheletebridge/admin/index.js +2 -0
- package/dist/atheletebridge/components/DrillVideoLink.js +1 -1
- package/dist/atheletebridge/components/DrillVideoLink.js.map +1 -1
- package/dist/atheletebridge/components/ProgramCard.js +1 -1
- package/dist/atheletebridge/components/ProgramCard.js.map +1 -1
- package/dist/atheletebridge/components/TeamCard.js +1 -1
- package/dist/atheletebridge/components/TeamCard.js.map +1 -1
- package/dist/atheletebridge/components/UserSearchSelect.js +2 -2
- package/dist/atheletebridge/components/UserSearchSelect.js.map +1 -1
- package/dist/atheletebridge/components/domain.js +3 -3
- package/dist/atheletebridge/components/domain.js.map +1 -1
- package/dist/atheletebridge/hooks/index.js +1 -0
- package/dist/atheletebridge/hooks/useAthleteBridgeApi.d.ts.map +1 -1
- package/dist/atheletebridge/hooks/useAthleteBridgeApi.js +39 -39
- package/dist/atheletebridge/hooks/useAthleteBridgeApi.js.map +1 -1
- package/dist/atheletebridge/i18n.d.ts +26 -0
- package/dist/atheletebridge/i18n.d.ts.map +1 -0
- package/dist/atheletebridge/i18n.js +14 -0
- package/dist/atheletebridge/i18n.js.map +1 -0
- package/dist/atheletebridge/index.d.ts +1 -0
- package/dist/atheletebridge/index.d.ts.map +1 -1
- package/dist/atheletebridge/index.js +3 -0
- package/dist/atheletebridge/pages/DashboardPage.d.ts.map +1 -1
- package/dist/atheletebridge/pages/DashboardPage.js +166 -144
- package/dist/atheletebridge/pages/DashboardPage.js.map +1 -1
- package/dist/atheletebridge/pages/StandingsPage.d.ts.map +1 -1
- package/dist/atheletebridge/pages/StandingsPage.js +98 -92
- package/dist/atheletebridge/pages/StandingsPage.js.map +1 -1
- package/dist/atheletebridge/pages/fixtures/FixturesListPage.d.ts.map +1 -1
- package/dist/atheletebridge/pages/fixtures/FixturesListPage.js +6 -4
- package/dist/atheletebridge/pages/fixtures/FixturesListPage.js.map +1 -1
- package/dist/atheletebridge/pages/onboarding/OnboardingPage.d.ts +4 -0
- package/dist/atheletebridge/pages/onboarding/OnboardingPage.d.ts.map +1 -0
- package/dist/atheletebridge/pages/onboarding/OnboardingPage.js +371 -0
- package/dist/atheletebridge/pages/onboarding/OnboardingPage.js.map +1 -0
- package/dist/atheletebridge/pages/performance/PerformancePage.d.ts.map +1 -1
- package/dist/atheletebridge/pages/performance/PerformancePage.js +42 -41
- package/dist/atheletebridge/pages/performance/PerformancePage.js.map +1 -1
- package/dist/atheletebridge/pages/programs/ProgramDetailPage.js +3 -3
- package/dist/atheletebridge/pages/programs/ProgramDetailPage.js.map +1 -1
- package/dist/atheletebridge/pages/programs/ProgramsListPage.d.ts.map +1 -1
- package/dist/atheletebridge/pages/programs/ProgramsListPage.js +9 -7
- package/dist/atheletebridge/pages/programs/ProgramsListPage.js.map +1 -1
- package/dist/atheletebridge/pages/sessions/SessionDetailPage.js +1 -1
- package/dist/atheletebridge/pages/sessions/SessionDetailPage.js.map +1 -1
- package/dist/atheletebridge/pages/sessions/SessionsListPage.d.ts.map +1 -1
- package/dist/atheletebridge/pages/sessions/SessionsListPage.js +6 -4
- package/dist/atheletebridge/pages/sessions/SessionsListPage.js.map +1 -1
- package/dist/atheletebridge/pages/teams/TeamDetailPage.js +1 -1
- package/dist/atheletebridge/pages/teams/TeamDetailPage.js.map +1 -1
- package/dist/atheletebridge/pages/teams/TeamsListPage.d.ts.map +1 -1
- package/dist/atheletebridge/pages/teams/TeamsListPage.js +8 -6
- package/dist/atheletebridge/pages/teams/TeamsListPage.js.map +1 -1
- package/dist/atheletebridge/types/index.d.ts +19 -3
- package/dist/atheletebridge/types/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/package.json +13 -2
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { AthleteBridgeProvider as e } from "../context/AthleteBridgeContext.js";
|
|
2
|
+
import "../context/index.js";
|
|
3
|
+
import { AdminDashboardPage as t } from "./AdminDashboardPage.js";
|
|
4
|
+
import { QueryClient as n, QueryClientProvider as r } from "@tanstack/react-query";
|
|
5
|
+
import { jsx as i } from "react/jsx-runtime";
|
|
6
|
+
//#region src/atheletebridge/admin/AdminRoot.tsx
|
|
7
|
+
var a = new n({ defaultOptions: { queries: {
|
|
8
|
+
staleTime: 60 * 1e3,
|
|
9
|
+
retry: 1
|
|
10
|
+
} } }), o = (n) => {
|
|
11
|
+
let { workspaceToken: o, ...s } = n;
|
|
12
|
+
return /* @__PURE__ */ i(r, {
|
|
13
|
+
client: a,
|
|
14
|
+
children: /* @__PURE__ */ i(e, {
|
|
15
|
+
...s,
|
|
16
|
+
children: /* @__PURE__ */ i(t, {})
|
|
17
|
+
})
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
//#endregion
|
|
21
|
+
export { o as AdminRoot };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=AdminRoot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminRoot.js","names":[],"sources":["../../../src/atheletebridge/admin/AdminRoot.tsx"],"sourcesContent":["/**\n * AthleteBridge Admin Root\n * @module atheletebridge/admin\n *\n * Host-contract entry point for the AthleteBridge admin surface inside\n * `admin-app` (BOFF-3258). It mirrors the provider/query-client setup of\n * `AthleteBridgeRoot` but deliberately differs in two ways:\n *\n * 1. It does NOT register product-shell nav/footer items — `admin-app` owns\n * its own sidebar via `NavRegistration.tsx`.\n * 2. It does NOT mount `FeatureFlagProvider`. The admin surface is an\n * operations/support view over AthleteBridge's own nouns; per-workspace\n * product gates must not hide rows from an operator investigating them.\n * (No `FeatureGate` is used below this root, so no provider is required.)\n *\n * SCOPE (BOFF-3258 RULINGS R4): this surface covers AthleteBridge's OWN domain\n * entities only — teams, programs, fixtures/standings and sessions. Tenant and\n * workspace administration is product-agnostic, owned by `global-tenant-svc`,\n * and already served generically by `microfe-admin` at the `/admin/*` route.\n * Re-implementing it per product would fork that surface 39 ways.\n */\n\nimport type { FC } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\n\nimport { AthleteBridgeProvider } from '../context';\nimport type { AthleteBridgeRootProps } from '../types';\nimport { AdminDashboardPage } from './AdminDashboardPage';\n\nconst adminQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 60 * 1000,\n retry: 1,\n },\n },\n});\n\nexport interface AthleteBridgeAdminRootProps extends AthleteBridgeRootProps {\n /** Workspace-scoped token supplied by `admin-app` for workspace gateway calls. */\n workspaceToken?: string;\n}\n\nexport const AdminRoot: FC<AthleteBridgeAdminRootProps> = (props) => {\n // `workspaceToken` is consumed by the host shell's `GatewayRoute` / fe-libs\n // graphql transport (`graphqlFetch({ gateway: 'workspace', workspaceToken: true })`\n // reads it from the shared store, not from props). It is intentionally not\n // forwarded to the product context, which only accepts the standard\n // microfrontend root props.\n const { workspaceToken, ...providerProps } = props;\n void workspaceToken;\n\n return (\n <QueryClientProvider client={adminQueryClient}>\n <AthleteBridgeProvider {...providerProps}>\n <AdminDashboardPage />\n </AthleteBridgeProvider>\n </QueryClientProvider>\n );\n};\n"],"mappings":";;;;;;AA6BA,IAAM,IAAmB,IAAI,EAAY,EACvC,gBAAgB,EACd,SAAS;CACP,WAAW,KAAK;CAChB,OAAO;CACR,EACF,EACF,CAAC,EAOW,KAA8C,MAAU;CAMnE,IAAM,EAAE,mBAAgB,GAAG,MAAkB;AAG7C,QACE,kBAAC,GAAD;EAAqB,QAAQ;YAC3B,kBAAC,GAAD;GAAuB,GAAI;aACzB,kBAAC,GAAD,EAAsB,CAAA;GACA,CAAA;EACJ,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AthleteBridge Admin Exports
|
|
3
|
+
* @module atheletebridge/admin
|
|
4
|
+
*
|
|
5
|
+
* The admin surface consumed by `admin-app` at `/admin/atheletebridge` (BOFF-3258).
|
|
6
|
+
* `AdminRoot` is the host-contract entry point; the export name matches the
|
|
7
|
+
* convention already used by `microfe-subscriberbot` and `microfe-bigconsole`.
|
|
8
|
+
*/
|
|
9
|
+
export { AdminRoot, type AthleteBridgeAdminRootProps } from './AdminRoot';
|
|
10
|
+
export { AdminDashboardPage } from './AdminDashboardPage';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atheletebridge/admin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -8,7 +8,7 @@ function o({ fileId: o }) {
|
|
|
8
8
|
href: c,
|
|
9
9
|
target: "_blank",
|
|
10
10
|
rel: "noreferrer",
|
|
11
|
-
className: "mt-1.5 inline-flex items-center gap-1 text-xs font-medium text-
|
|
11
|
+
className: "mt-1.5 inline-flex items-center gap-1 text-xs font-medium text-text-link hover:underline",
|
|
12
12
|
children: [
|
|
13
13
|
/* @__PURE__ */ i(n, { className: "h-3.5 w-3.5" }),
|
|
14
14
|
/* @__PURE__ */ i("span", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DrillVideoLink.js","names":[],"sources":["../../../src/atheletebridge/components/DrillVideoLink.tsx"],"sourcesContent":["/**\n * Drill demo-video reference\n * @module atheletebridge/components\n *\n * A drill's `video` is a reference into wspace-files-svc (blobs live there). We\n * resolve the playable URL lazily and in isolation, so a missing/expired blob\n * degrades to a quiet badge instead of ever breaking the program page.\n */\n\nimport { ExternalLink, FileVideo, Loader2 } from 'lucide-react';\nimport { useFile } from '../hooks/useAthleteBridgeApi';\n\nexport function DrillVideoLink({ fileId }: { fileId: string }) {\n const file = useFile(fileId);\n const url = file.data?.downloadUrl ?? undefined;\n const label = file.data?.name ?? 'Demo video';\n\n if (url) {\n return (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"mt-1.5 inline-flex items-center gap-1 text-xs font-medium text-
|
|
1
|
+
{"version":3,"file":"DrillVideoLink.js","names":[],"sources":["../../../src/atheletebridge/components/DrillVideoLink.tsx"],"sourcesContent":["/**\n * Drill demo-video reference\n * @module atheletebridge/components\n *\n * A drill's `video` is a reference into wspace-files-svc (blobs live there). We\n * resolve the playable URL lazily and in isolation, so a missing/expired blob\n * degrades to a quiet badge instead of ever breaking the program page.\n */\n\nimport { ExternalLink, FileVideo, Loader2 } from 'lucide-react';\nimport { useFile } from '../hooks/useAthleteBridgeApi';\n\nexport function DrillVideoLink({ fileId }: { fileId: string }) {\n const file = useFile(fileId);\n const url = file.data?.downloadUrl ?? undefined;\n const label = file.data?.name ?? 'Demo video';\n\n if (url) {\n return (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"mt-1.5 inline-flex items-center gap-1 text-xs font-medium text-text-link hover:underline\"\n >\n <FileVideo className=\"h-3.5 w-3.5\" />\n <span className=\"max-w-[16rem] truncate\">{label}</span>\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n );\n }\n\n return (\n <span className=\"mt-1.5 inline-flex items-center gap-1 text-xs text-text-secondary\">\n {file.isLoading ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <FileVideo className=\"h-3.5 w-3.5\" />\n )}\n Demo video\n </span>\n );\n}\n"],"mappings":";;;;AAYA,SAAgB,EAAe,EAAE,aAA8B;CAC7D,IAAM,IAAO,EAAQ,EAAO,EACtB,IAAM,EAAK,MAAM,eAAe,KAAA,GAChC,IAAQ,EAAK,MAAM,QAAQ;AAiBjC,QAfI,IAEA,kBAAC,KAAD;EACE,MAAM;EACN,QAAO;EACP,KAAI;EACJ,WAAU;YAJZ;GAME,kBAAC,GAAD,EAAW,WAAU,eAAgB,CAAA;GACrC,kBAAC,QAAD;IAAM,WAAU;cAA0B;IAAa,CAAA;GACvD,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA;GAClC;MAKN,kBAAC,QAAD;EAAM,WAAU;YAAhB,CACG,EAAK,YACJ,kBAAC,GAAD,EAAS,WAAU,4BAA6B,CAAA,GAEhD,kBAAC,GAAD,EAAW,WAAU,eAAgB,CAAA,EACrC,aAEG"}
|
|
@@ -11,7 +11,7 @@ var f = {
|
|
|
11
11
|
ADVANCED: "warning",
|
|
12
12
|
ELITE: "default"
|
|
13
13
|
}, p = ({ program: p, onClick: m, drillCount: h }) => {
|
|
14
|
-
let g = r[p.sport], _ = h ?? p.drills?.length;
|
|
14
|
+
let g = r[p.sport], _ = h ?? p.drills?.items.length;
|
|
15
15
|
return /* @__PURE__ */ l(d, {
|
|
16
16
|
treatment: "metric",
|
|
17
17
|
role: "button",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProgramCard.js","names":[],"sources":["../../../src/atheletebridge/components/ProgramCard.tsx"],"sourcesContent":["/**\n * Program Card\n * @module atheletebridge/components\n *\n * A training-program tile with a sport-icon tile, a level Badge tinted per tier\n * (green Beginner / blue Intermediate / amber Advanced / brand Elite), a status\n * pill, and a footer stat row of weeks + drill counts. Semantic tokens only.\n */\n\nimport type { FC } from 'react';\nimport { CalendarRange, Copy, Dumbbell } from 'lucide-react';\nimport { GlassCard, Badge, type BadgeProps } from '@burdenoff/fe-libs/ui';\nimport { StatusBadge } from './StatusBadge';\nimport { SPORT_ICONS, SPORT_LABELS, PROGRAM_LEVEL_LABELS } from './domain';\nimport { cn } from '../utils/cn';\nimport type { AthProgram, AthProgramLevel } from '../types';\n\ninterface ProgramCardProps {\n program: AthProgram;\n onClick?: () => void;\n /**\n * Drill count for the footer chip. Falls back to `program.drills?.length`\n * when the query selected drills; omit the chip if neither is available.\n */\n drillCount?: number;\n}\n\nconst LEVEL_VARIANT: Record<AthProgramLevel, BadgeProps['variant']> = {\n BEGINNER: 'success',\n INTERMEDIATE: 'info',\n ADVANCED: 'warning',\n ELITE: 'default',\n};\n\nexport const ProgramCard: FC<ProgramCardProps> = ({ program, onClick, drillCount }) => {\n const SportIcon = SPORT_ICONS[program.sport];\n const drills = drillCount ?? program.drills?.length;\n\n return (\n <GlassCard\n treatment=\"metric\"\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }}\n className={cn(\n 'cursor-pointer p-5 transition-transform duration-200 hover:-translate-y-0.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]'\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <div className=\"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-[var(--color-accent-soft)] text-text-primary\">\n <SportIcon className=\"h-5 w-5\" aria-hidden=\"true\" />\n </div>\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-text-primary\">{program.name}</h3>\n <div className=\"mt-1 flex flex-wrap items-center gap-1.5\">\n <Badge variant={LEVEL_VARIANT[program.level]}>\n {PROGRAM_LEVEL_LABELS[program.level]}\n </Badge>\n <span className=\"text-xs text-text-secondary\">{SPORT_LABELS[program.sport]}</span>\n </div>\n </div>\n </div>\n <StatusBadge status={program.status} />\n </div>\n\n {program.summary && (\n <p className=\"mt-3 line-clamp-2 text-sm text-text-secondary\">{program.summary}</p>\n )}\n\n <div className=\"mt-4 flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <CalendarRange className=\"h-3.5 w-3.5\" aria-hidden=\"true\" /> {program.weeks}{' '}\n {program.weeks === 1 ? 'week' : 'weeks'}\n </span>\n {drills !== undefined && (\n <span className=\"flex items-center gap-1\">\n <Dumbbell className=\"h-3.5 w-3.5\" aria-hidden=\"true\" /> {drills}{' '}\n {drills === 1 ? 'drill' : 'drills'}\n </span>\n )}\n {program.isTemplate && (\n <span className=\"flex items-center gap-1\">\n <Copy className=\"h-3.5 w-3.5\" aria-hidden=\"true\" /> Template\n </span>\n )}\n </div>\n </GlassCard>\n );\n};\n"],"mappings":";;;;;;;AA2BA,IAAM,IAAgE;CACpE,UAAU;CACV,cAAc;CACd,UAAU;CACV,OAAO;CACR,EAEY,KAAqC,EAAE,YAAS,YAAS,oBAAiB;CACrF,IAAM,IAAY,EAAY,EAAQ,QAChC,IAAS,KAAc,EAAQ,QAAQ;
|
|
1
|
+
{"version":3,"file":"ProgramCard.js","names":[],"sources":["../../../src/atheletebridge/components/ProgramCard.tsx"],"sourcesContent":["/**\n * Program Card\n * @module atheletebridge/components\n *\n * A training-program tile with a sport-icon tile, a level Badge tinted per tier\n * (green Beginner / blue Intermediate / amber Advanced / brand Elite), a status\n * pill, and a footer stat row of weeks + drill counts. Semantic tokens only.\n */\n\nimport type { FC } from 'react';\nimport { CalendarRange, Copy, Dumbbell } from 'lucide-react';\nimport { GlassCard, Badge, type BadgeProps } from '@burdenoff/fe-libs/ui';\nimport { StatusBadge } from './StatusBadge';\nimport { SPORT_ICONS, SPORT_LABELS, PROGRAM_LEVEL_LABELS } from './domain';\nimport { cn } from '../utils/cn';\nimport type { AthProgram, AthProgramLevel } from '../types';\n\ninterface ProgramCardProps {\n program: AthProgram;\n onClick?: () => void;\n /**\n * Drill count for the footer chip. Falls back to `program.drills?.length`\n * when the query selected drills; omit the chip if neither is available.\n */\n drillCount?: number;\n}\n\nconst LEVEL_VARIANT: Record<AthProgramLevel, BadgeProps['variant']> = {\n BEGINNER: 'success',\n INTERMEDIATE: 'info',\n ADVANCED: 'warning',\n ELITE: 'default',\n};\n\nexport const ProgramCard: FC<ProgramCardProps> = ({ program, onClick, drillCount }) => {\n const SportIcon = SPORT_ICONS[program.sport];\n const drills = drillCount ?? program.drills?.items.length;\n\n return (\n <GlassCard\n treatment=\"metric\"\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }}\n className={cn(\n 'cursor-pointer p-5 transition-transform duration-200 hover:-translate-y-0.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]'\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <div className=\"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-[var(--color-accent-soft)] text-text-primary\">\n <SportIcon className=\"h-5 w-5\" aria-hidden=\"true\" />\n </div>\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-text-primary\">{program.name}</h3>\n <div className=\"mt-1 flex flex-wrap items-center gap-1.5\">\n <Badge variant={LEVEL_VARIANT[program.level]}>\n {PROGRAM_LEVEL_LABELS[program.level]}\n </Badge>\n <span className=\"text-xs text-text-secondary\">{SPORT_LABELS[program.sport]}</span>\n </div>\n </div>\n </div>\n <StatusBadge status={program.status} />\n </div>\n\n {program.summary && (\n <p className=\"mt-3 line-clamp-2 text-sm text-text-secondary\">{program.summary}</p>\n )}\n\n <div className=\"mt-4 flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <CalendarRange className=\"h-3.5 w-3.5\" aria-hidden=\"true\" /> {program.weeks}{' '}\n {program.weeks === 1 ? 'week' : 'weeks'}\n </span>\n {drills !== undefined && (\n <span className=\"flex items-center gap-1\">\n <Dumbbell className=\"h-3.5 w-3.5\" aria-hidden=\"true\" /> {drills}{' '}\n {drills === 1 ? 'drill' : 'drills'}\n </span>\n )}\n {program.isTemplate && (\n <span className=\"flex items-center gap-1\">\n <Copy className=\"h-3.5 w-3.5\" aria-hidden=\"true\" /> Template\n </span>\n )}\n </div>\n </GlassCard>\n );\n};\n"],"mappings":";;;;;;;AA2BA,IAAM,IAAgE;CACpE,UAAU;CACV,cAAc;CACd,UAAU;CACV,OAAO;CACR,EAEY,KAAqC,EAAE,YAAS,YAAS,oBAAiB;CACrF,IAAM,IAAY,EAAY,EAAQ,QAChC,IAAS,KAAc,EAAQ,QAAQ,MAAM;AAEnD,QACE,kBAAC,GAAD;EACE,WAAU;EACV,MAAK;EACL,UAAU;EACD;EACT,YAAY,MAAM;AAChB,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,gBAAgB,EAClB,KAAW;;EAGf,WAAW,EACT,2KACD;YAbH;GAeE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD;OAAW,WAAU;OAAU,eAAY;OAAS,CAAA;MAChD,CAAA,EACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,MAAD;OAAI,WAAU;iBAAsD,EAAQ;OAAU,CAAA,EACtF,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD;QAAO,SAAS,EAAc,EAAQ;kBACnC,EAAqB,EAAQ;QACxB,CAAA,EACR,kBAAC,QAAD;QAAM,WAAU;kBAA+B,EAAa,EAAQ;QAAc,CAAA,CAC9E;SACF;QACF;QACN,kBAAC,GAAD,EAAa,QAAQ,EAAQ,QAAU,CAAA,CACnC;;GAEL,EAAQ,WACP,kBAAC,KAAD;IAAG,WAAU;cAAiD,EAAQ;IAAY,CAAA;GAGpF,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD;QAAe,WAAU;QAAc,eAAY;QAAS,CAAA;;OAAE,EAAQ;OAAO;OAC5E,EAAQ,UAAU,IAAI,SAAS;OAC3B;;KACN,MAAW,KAAA,KACV,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD;QAAU,WAAU;QAAc,eAAY;QAAS,CAAA;;OAAE;OAAQ;OAChE,MAAW,IAAI,UAAU;OACrB;;KAER,EAAQ,cACP,kBAAC,QAAD;MAAM,WAAU;gBAAhB,CACE,kBAAC,GAAD;OAAM,WAAU;OAAc,eAAY;OAAS,CAAA,EAAA,YAC9C;;KAEL;;GACI"}
|
|
@@ -7,7 +7,7 @@ import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
|
7
7
|
import { Badge as u, GlassCard as d } from "@burdenoff/fe-libs/ui";
|
|
8
8
|
//#region src/atheletebridge/components/TeamCard.tsx
|
|
9
9
|
var f = ({ team: f, onClick: p, memberCount: m }) => {
|
|
10
|
-
let h = n[f.sport], g = m ?? f.members?.length;
|
|
10
|
+
let h = n[f.sport], g = m ?? f.members?.items.length;
|
|
11
11
|
return /* @__PURE__ */ l(d, {
|
|
12
12
|
treatment: "metric",
|
|
13
13
|
role: "button",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TeamCard.js","names":[],"sources":["../../../src/atheletebridge/components/TeamCard.tsx"],"sourcesContent":["/**\n * Team Card\n * @module atheletebridge/components\n *\n * A team tile fronted by a deterministic gradient monogram crest, with a sport\n * Badge, a StatusBadge (green Active / amber Forming / grey Inactive·Archived),\n * a member-count chip and a hover lift. Semantic tokens only.\n */\n\nimport type { FC } from 'react';\nimport { Users, MapPin, CalendarDays } from 'lucide-react';\nimport { GlassCard, Badge } from '@burdenoff/fe-libs/ui';\nimport { StatusBadge } from './StatusBadge';\nimport { Crest } from './Crest';\nimport { SPORT_ICONS, SPORT_LABELS } from './domain';\nimport { cn } from '../utils/cn';\nimport type { AthTeam } from '../types';\n\ninterface TeamCardProps {\n team: AthTeam;\n onClick?: () => void;\n /**\n * Member count for the footer chip. Falls back to `team.members?.length`\n * when the list query selected members; omit the chip entirely if neither is\n * available (never guess).\n */\n memberCount?: number;\n}\n\nexport const TeamCard: FC<TeamCardProps> = ({ team, onClick, memberCount }) => {\n const SportIcon = SPORT_ICONS[team.sport];\n const count = memberCount ?? team.members?.length;\n\n return (\n <GlassCard\n treatment=\"metric\"\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }}\n className={cn(\n 'cursor-pointer p-5 transition-transform duration-200 hover:-translate-y-0.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]'\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <Crest name={team.name} sport={team.sport} size={44} />\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-text-primary\">{team.name}</h3>\n <div className=\"mt-1\">\n <Badge variant=\"secondary\" className=\"gap-1\">\n <SportIcon className=\"h-3 w-3\" aria-hidden=\"true\" />\n {SPORT_LABELS[team.sport]}\n </Badge>\n </div>\n </div>\n </div>\n <StatusBadge status={team.status} />\n </div>\n\n <div className=\"mt-4 flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-text-secondary\">\n {team.ageGroup && (\n <span className=\"flex items-center gap-1\">\n <Users className=\"h-3.5 w-3.5\" aria-hidden=\"true\" /> {team.ageGroup}\n </span>\n )}\n {team.season && (\n <span className=\"flex items-center gap-1\">\n <CalendarDays className=\"h-3.5 w-3.5\" aria-hidden=\"true\" /> {team.season}\n </span>\n )}\n {team.homeVenue && (\n <span className=\"flex items-center gap-1 truncate\">\n <MapPin className=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\" /> {team.homeVenue}\n </span>\n )}\n </div>\n\n {team.tags.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n {team.tags.slice(0, 4).map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary\"\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n\n {count !== undefined && (\n <div className=\"mt-4 flex items-center gap-1.5 border-t border-border-seam pt-3 text-xs font-medium text-text-secondary\">\n <Users className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n {count} {count === 1 ? 'member' : 'members'}\n </div>\n )}\n </GlassCard>\n );\n};\n"],"mappings":";;;;;;;;AA6BA,IAAa,KAA+B,EAAE,SAAM,YAAS,qBAAkB;CAC7E,IAAM,IAAY,EAAY,EAAK,QAC7B,IAAQ,KAAe,EAAK,SAAS;
|
|
1
|
+
{"version":3,"file":"TeamCard.js","names":[],"sources":["../../../src/atheletebridge/components/TeamCard.tsx"],"sourcesContent":["/**\n * Team Card\n * @module atheletebridge/components\n *\n * A team tile fronted by a deterministic gradient monogram crest, with a sport\n * Badge, a StatusBadge (green Active / amber Forming / grey Inactive·Archived),\n * a member-count chip and a hover lift. Semantic tokens only.\n */\n\nimport type { FC } from 'react';\nimport { Users, MapPin, CalendarDays } from 'lucide-react';\nimport { GlassCard, Badge } from '@burdenoff/fe-libs/ui';\nimport { StatusBadge } from './StatusBadge';\nimport { Crest } from './Crest';\nimport { SPORT_ICONS, SPORT_LABELS } from './domain';\nimport { cn } from '../utils/cn';\nimport type { AthTeam } from '../types';\n\ninterface TeamCardProps {\n team: AthTeam;\n onClick?: () => void;\n /**\n * Member count for the footer chip. Falls back to `team.members?.length`\n * when the list query selected members; omit the chip entirely if neither is\n * available (never guess).\n */\n memberCount?: number;\n}\n\nexport const TeamCard: FC<TeamCardProps> = ({ team, onClick, memberCount }) => {\n const SportIcon = SPORT_ICONS[team.sport];\n const count = memberCount ?? team.members?.items.length;\n\n return (\n <GlassCard\n treatment=\"metric\"\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }}\n className={cn(\n 'cursor-pointer p-5 transition-transform duration-200 hover:-translate-y-0.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]'\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <Crest name={team.name} sport={team.sport} size={44} />\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-text-primary\">{team.name}</h3>\n <div className=\"mt-1\">\n <Badge variant=\"secondary\" className=\"gap-1\">\n <SportIcon className=\"h-3 w-3\" aria-hidden=\"true\" />\n {SPORT_LABELS[team.sport]}\n </Badge>\n </div>\n </div>\n </div>\n <StatusBadge status={team.status} />\n </div>\n\n <div className=\"mt-4 flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-text-secondary\">\n {team.ageGroup && (\n <span className=\"flex items-center gap-1\">\n <Users className=\"h-3.5 w-3.5\" aria-hidden=\"true\" /> {team.ageGroup}\n </span>\n )}\n {team.season && (\n <span className=\"flex items-center gap-1\">\n <CalendarDays className=\"h-3.5 w-3.5\" aria-hidden=\"true\" /> {team.season}\n </span>\n )}\n {team.homeVenue && (\n <span className=\"flex items-center gap-1 truncate\">\n <MapPin className=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\" /> {team.homeVenue}\n </span>\n )}\n </div>\n\n {team.tags.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n {team.tags.slice(0, 4).map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary\"\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n\n {count !== undefined && (\n <div className=\"mt-4 flex items-center gap-1.5 border-t border-border-seam pt-3 text-xs font-medium text-text-secondary\">\n <Users className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n {count} {count === 1 ? 'member' : 'members'}\n </div>\n )}\n </GlassCard>\n );\n};\n"],"mappings":";;;;;;;;AA6BA,IAAa,KAA+B,EAAE,SAAM,YAAS,qBAAkB;CAC7E,IAAM,IAAY,EAAY,EAAK,QAC7B,IAAQ,KAAe,EAAK,SAAS,MAAM;AAEjD,QACE,kBAAC,GAAD;EACE,WAAU;EACV,MAAK;EACL,UAAU;EACD;EACT,YAAY,MAAM;AAChB,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,gBAAgB,EAClB,KAAW;;EAGf,WAAW,EACT,2KACD;YAbH;GAeE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MAAO,MAAM,EAAK;MAAM,OAAO,EAAK;MAAO,MAAM;MAAM,CAAA,EACvD,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,MAAD;OAAI,WAAU;iBAAsD,EAAK;OAAU,CAAA,EACnF,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,GAAD;QAAO,SAAQ;QAAY,WAAU;kBAArC,CACE,kBAAC,GAAD;SAAW,WAAU;SAAU,eAAY;SAAS,CAAA,EACnD,EAAa,EAAK,OACb;;OACJ,CAAA,CACF;QACF;QACN,kBAAC,GAAD,EAAa,QAAQ,EAAK,QAAU,CAAA,CAChC;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACG,EAAK,YACJ,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD;QAAO,WAAU;QAAc,eAAY;QAAS,CAAA;;OAAE,EAAK;OACtD;;KAER,EAAK,UACJ,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD;QAAc,WAAU;QAAc,eAAY;QAAS,CAAA;;OAAE,EAAK;OAC7D;;KAER,EAAK,aACJ,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD;QAAQ,WAAU;QAAuB,eAAY;QAAS,CAAA;;OAAE,EAAK;OAChE;;KAEL;;GAEL,EAAK,KAAK,SAAS,KAClB,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAK,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,MAC1B,kBAAC,QAAD;KAEE,WAAU;eAET;KACI,EAJA,EAIA,CACP;IACE,CAAA;GAGP,MAAU,KAAA,KACT,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MAAO,WAAU;MAAc,eAAY;MAAS,CAAA;KACnD;KAAM;KAAE,MAAU,IAAI,WAAW;KAC9B;;GAEE"}
|
|
@@ -29,7 +29,7 @@ function p({ userId: p, displayName: m, onSelect: h, required: g = !1 }) {
|
|
|
29
29
|
}), !T && /* @__PURE__ */ d("button", {
|
|
30
30
|
type: "button",
|
|
31
31
|
onClick: () => b(!1),
|
|
32
|
-
className: "mt-1 self-start text-xs font-medium text-
|
|
32
|
+
className: "mt-1 self-start text-xs font-medium text-text-link hover:underline",
|
|
33
33
|
children: "Search the directory instead"
|
|
34
34
|
})]
|
|
35
35
|
}) : /* @__PURE__ */ d(r, {
|
|
@@ -116,7 +116,7 @@ function p({ userId: p, displayName: m, onSelect: h, required: g = !1 }) {
|
|
|
116
116
|
/* @__PURE__ */ d("button", {
|
|
117
117
|
type: "button",
|
|
118
118
|
onClick: () => b(!0),
|
|
119
|
-
className: "text-xs font-medium text-
|
|
119
|
+
className: "text-xs font-medium text-text-link hover:underline",
|
|
120
120
|
children: "Enter a user ID manually"
|
|
121
121
|
})
|
|
122
122
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserSearchSelect.js","names":[],"sources":["../../../src/atheletebridge/components/UserSearchSelect.tsx"],"sourcesContent":["/**\n * User picker\n * @module atheletebridge/components\n *\n * Resolves a real workspace/tenant user by name or email (global user\n * directory) so a coach can add a team member without knowing a raw UUID.\n * Degrades gracefully: if the directory is unavailable the coach can still paste\n * a user id manually. Semantic tokens only.\n */\n\nimport { useState } from 'react';\nimport { Check, Loader2, Search, User as UserIcon, X } from 'lucide-react';\nimport { FormField, fieldInputClass } from './form';\nimport { cn } from '../utils/cn';\nimport { directoryUserName, useUserSearch, type DirectoryUser } from '../hooks/useAthleteBridgeApi';\n\nexport interface UserSelectValue {\n userId: string;\n displayName: string;\n}\n\ninterface UserSearchSelectProps {\n /** Currently selected user id. */\n userId: string;\n /** Display name currently chosen (echoed back so the parent can prefill). */\n displayName: string;\n onSelect: (value: UserSelectValue) => void;\n required?: boolean;\n}\n\nexport function UserSearchSelect({\n userId,\n displayName,\n onSelect,\n required = false,\n}: UserSearchSelectProps) {\n const [term, setTerm] = useState('');\n const [manual, setManual] = useState(false);\n\n const search = useUserSearch(term);\n const results = search.data ?? [];\n const active = term.trim().length >= 2;\n\n const pick = (user: DirectoryUser) => {\n onSelect({ userId: user.id, displayName: directoryUserName(user) });\n setTerm('');\n };\n\n // If the directory query fails (e.g. RBAC), offer manual entry automatically.\n const searchUnavailable = search.isError;\n\n if (manual || searchUnavailable) {\n return (\n <FormField\n label=\"User ID\"\n htmlFor=\"member-user-id\"\n required={required}\n hint={\n searchUnavailable\n ? 'User search is unavailable here — paste the auth-svc user id.'\n : 'Paste the auth-svc user id.'\n }\n >\n <input\n id=\"member-user-id\"\n className={fieldInputClass}\n value={userId}\n onChange={(e) => onSelect({ userId: e.target.value, displayName })}\n placeholder=\"user-uuid\"\n />\n {!searchUnavailable && (\n <button\n type=\"button\"\n onClick={() => setManual(false)}\n className=\"mt-1 self-start text-xs font-medium text-
|
|
1
|
+
{"version":3,"file":"UserSearchSelect.js","names":[],"sources":["../../../src/atheletebridge/components/UserSearchSelect.tsx"],"sourcesContent":["/**\n * User picker\n * @module atheletebridge/components\n *\n * Resolves a real workspace/tenant user by name or email (global user\n * directory) so a coach can add a team member without knowing a raw UUID.\n * Degrades gracefully: if the directory is unavailable the coach can still paste\n * a user id manually. Semantic tokens only.\n */\n\nimport { useState } from 'react';\nimport { Check, Loader2, Search, User as UserIcon, X } from 'lucide-react';\nimport { FormField, fieldInputClass } from './form';\nimport { cn } from '../utils/cn';\nimport { directoryUserName, useUserSearch, type DirectoryUser } from '../hooks/useAthleteBridgeApi';\n\nexport interface UserSelectValue {\n userId: string;\n displayName: string;\n}\n\ninterface UserSearchSelectProps {\n /** Currently selected user id. */\n userId: string;\n /** Display name currently chosen (echoed back so the parent can prefill). */\n displayName: string;\n onSelect: (value: UserSelectValue) => void;\n required?: boolean;\n}\n\nexport function UserSearchSelect({\n userId,\n displayName,\n onSelect,\n required = false,\n}: UserSearchSelectProps) {\n const [term, setTerm] = useState('');\n const [manual, setManual] = useState(false);\n\n const search = useUserSearch(term);\n const results = search.data ?? [];\n const active = term.trim().length >= 2;\n\n const pick = (user: DirectoryUser) => {\n onSelect({ userId: user.id, displayName: directoryUserName(user) });\n setTerm('');\n };\n\n // If the directory query fails (e.g. RBAC), offer manual entry automatically.\n const searchUnavailable = search.isError;\n\n if (manual || searchUnavailable) {\n return (\n <FormField\n label=\"User ID\"\n htmlFor=\"member-user-id\"\n required={required}\n hint={\n searchUnavailable\n ? 'User search is unavailable here — paste the auth-svc user id.'\n : 'Paste the auth-svc user id.'\n }\n >\n <input\n id=\"member-user-id\"\n className={fieldInputClass}\n value={userId}\n onChange={(e) => onSelect({ userId: e.target.value, displayName })}\n placeholder=\"user-uuid\"\n />\n {!searchUnavailable && (\n <button\n type=\"button\"\n onClick={() => setManual(false)}\n className=\"mt-1 self-start text-xs font-medium text-text-link hover:underline\"\n >\n Search the directory instead\n </button>\n )}\n </FormField>\n );\n }\n\n return (\n <FormField label=\"Athlete / user\" required={required}>\n {userId ? (\n <div className=\"flex items-center gap-2 rounded-lg border border-border-seam bg-bg-surface px-3 py-2\">\n <span className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-bg-sunken text-text-secondary\">\n <UserIcon className=\"h-4 w-4\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n {displayName || 'Selected user'}\n </p>\n <p className=\"truncate text-xs text-text-secondary\">{userId}</p>\n </div>\n <button\n type=\"button\"\n aria-label=\"Clear selected user\"\n onClick={() => onSelect({ userId: '', displayName: '' })}\n className=\"rounded-md p-1 text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n ) : (\n <div className=\"space-y-2\">\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <input\n className={cn(fieldInputClass, 'pl-9')}\n value={term}\n onChange={(e) => setTerm(e.target.value)}\n placeholder=\"Search by name or email…\"\n aria-label=\"Search users by name or email\"\n />\n {search.isFetching && (\n <Loader2 className=\"absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2 animate-spin text-text-secondary\" />\n )}\n </div>\n\n {active && !search.isFetching && results.length === 0 && (\n <p className=\"text-xs text-text-secondary\">No users match “{term.trim()}”.</p>\n )}\n\n {results.length > 0 && (\n <ul className=\"max-h-56 divide-y divide-border-seam overflow-auto rounded-lg border border-border-seam bg-bg-surface\">\n {results.map((user) => (\n <li key={user.id}>\n <button\n type=\"button\"\n onClick={() => pick(user)}\n className=\"flex w-full items-center gap-2 px-3 py-2 text-left transition-colors hover:bg-bg-sunken\"\n >\n <span className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-bg-sunken text-text-secondary\">\n <UserIcon className=\"h-4 w-4\" />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium text-text-primary\">\n {directoryUserName(user)}\n </span>\n <span className=\"block truncate text-xs text-text-secondary\">\n {user.email}\n </span>\n </span>\n <Check className=\"h-4 w-4 shrink-0 text-text-secondary opacity-0\" />\n </button>\n </li>\n ))}\n </ul>\n )}\n\n <button\n type=\"button\"\n onClick={() => setManual(true)}\n className=\"text-xs font-medium text-text-link hover:underline\"\n >\n Enter a user ID manually\n </button>\n </div>\n )}\n </FormField>\n );\n}\n"],"mappings":";;;;;;;AA8BA,SAAgB,EAAiB,EAC/B,WACA,gBACA,aACA,cAAW,MACa;CACxB,IAAM,CAAC,GAAM,KAAW,EAAS,GAAG,EAC9B,CAAC,GAAQ,KAAa,EAAS,GAAM,EAErC,IAAS,EAAc,EAAK,EAC5B,IAAU,EAAO,QAAQ,EAAE,EAC3B,IAAS,EAAK,MAAM,CAAC,UAAU,GAE/B,KAAQ,MAAwB;AAEpC,EADA,EAAS;GAAE,QAAQ,EAAK;GAAI,aAAa,EAAkB,EAAK;GAAE,CAAC,EACnE,EAAQ,GAAG;IAIP,IAAoB,EAAO;AAkCjC,QAhCI,KAAU,IAEV,kBAAC,GAAD;EACE,OAAM;EACN,SAAQ;EACE;EACV,MACE,IACI,kEACA;YAPR,CAUE,kBAAC,SAAD;GACE,IAAG;GACH,WAAW;GACX,OAAO;GACP,WAAW,MAAM,EAAS;IAAE,QAAQ,EAAE,OAAO;IAAO;IAAa,CAAC;GAClE,aAAY;GACZ,CAAA,EACD,CAAC,KACA,kBAAC,UAAD;GACE,MAAK;GACL,eAAe,EAAU,GAAM;GAC/B,WAAU;aACX;GAEQ,CAAA,CAED;MAKd,kBAAC,GAAD;EAAW,OAAM;EAA2B;YACzC,IACC,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,QAAD;KAAM,WAAU;eACd,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;KAC3B,CAAA;IACP,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,KAAD;MAAG,WAAU;gBACV,KAAe;MACd,CAAA,EACJ,kBAAC,KAAD;MAAG,WAAU;gBAAwC;MAAW,CAAA,CAC5D;;IACN,kBAAC,UAAD;KACE,MAAK;KACL,cAAW;KACX,eAAe,EAAS;MAAE,QAAQ;MAAI,aAAa;MAAI,CAAC;KACxD,WAAU;eAEV,kBAAC,GAAD,EAAG,WAAU,WAAY,CAAA;KAClB,CAAA;IACL;OAEN,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD,EAAQ,WAAU,4FAA6F,CAAA;MAC/G,kBAAC,SAAD;OACE,WAAW,EAAG,GAAiB,OAAO;OACtC,OAAO;OACP,WAAW,MAAM,EAAQ,EAAE,OAAO,MAAM;OACxC,aAAY;OACZ,cAAW;OACX,CAAA;MACD,EAAO,cACN,kBAAC,GAAD,EAAS,WAAU,sFAAuF,CAAA;MAExG;;IAEL,KAAU,CAAC,EAAO,cAAc,EAAQ,WAAW,KAClD,kBAAC,KAAD;KAAG,WAAU;eAAb;MAA2C;MAAiB,EAAK,MAAM;MAAC;MAAM;;IAG/E,EAAQ,SAAS,KAChB,kBAAC,MAAD;KAAI,WAAU;eACX,EAAQ,KAAK,MACZ,kBAAC,MAAD,EAAA,UACE,kBAAC,UAAD;MACE,MAAK;MACL,eAAe,EAAK,EAAK;MACzB,WAAU;gBAHZ;OAKE,kBAAC,QAAD;QAAM,WAAU;kBACd,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;QAC3B,CAAA;OACP,kBAAC,QAAD;QAAM,WAAU;kBAAhB,CACE,kBAAC,QAAD;SAAM,WAAU;mBACb,EAAkB,EAAK;SACnB,CAAA,EACP,kBAAC,QAAD;SAAM,WAAU;mBACb,EAAK;SACD,CAAA,CACF;;OACP,kBAAC,GAAD,EAAO,WAAU,kDAAmD,CAAA;OAC7D;SACN,EAnBI,EAAK,GAmBT,CACL;KACC,CAAA;IAGP,kBAAC,UAAD;KACE,MAAK;KACL,eAAe,EAAU,GAAK;KAC9B,WAAU;eACX;KAEQ,CAAA;IACL;;EAEE,CAAA"}
|
|
@@ -49,11 +49,11 @@ var s = {
|
|
|
49
49
|
WEIGHT: "Weight",
|
|
50
50
|
HEART_RATE: "Heart Rate",
|
|
51
51
|
CUSTOM: "Custom"
|
|
52
|
-
}, m = Object.keys(d);
|
|
53
|
-
function
|
|
52
|
+
}, m = Object.keys(c), h = Object.keys(u), g = Object.keys(d);
|
|
53
|
+
function _(e) {
|
|
54
54
|
return e.replace(/_/g, " ").toLowerCase().replace(/\b\w/g, (e) => e.toUpperCase());
|
|
55
55
|
}
|
|
56
56
|
//#endregion
|
|
57
|
-
export { d as FIXTURE_TYPE_LABELS,
|
|
57
|
+
export { d as FIXTURE_TYPE_LABELS, g as FIXTURE_TYPE_OPTIONS, u as MEMBER_ROLE_LABELS, h as MEMBER_ROLE_OPTIONS, p as METRIC_TYPE_LABELS, l as PROGRAM_LEVEL_LABELS, f as SESSION_TYPE_LABELS, s as SPORT_ICONS, c as SPORT_LABELS, m as SPORT_OPTIONS, _ as humanizeEnum };
|
|
58
58
|
|
|
59
59
|
//# sourceMappingURL=domain.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain.js","names":[],"sources":["../../../src/atheletebridge/components/domain.ts"],"sourcesContent":["/**\n * Domain display helpers\n * @module atheletebridge/components\n *\n * Centralized, type-safe labels and icon mappings for the AthleteBridge\n * enums so list/detail/form pages render them consistently.\n */\n\nimport {\n Activity,\n Dumbbell,\n Trophy,\n Volleyball,\n Waves,\n Gamepad2,\n Footprints,\n type LucideIcon,\n} from 'lucide-react';\nimport type {\n AthFixtureType,\n AthMemberRole,\n AthMetricType,\n AthProgramLevel,\n AthSessionType,\n AthSport,\n} from '../types';\n\nexport const SPORT_ICONS: Record<AthSport, LucideIcon> = {\n ATHLETICS: Footprints,\n BASKETBALL: Volleyball,\n CRICKET: Trophy,\n ESPORTS: Gamepad2,\n FOOTBALL: Volleyball,\n OTHER: Activity,\n SWIMMING: Waves,\n TENNIS: Dumbbell,\n};\n\nexport const SPORT_LABELS: Record<AthSport, string> = {\n ATHLETICS: 'Athletics',\n BASKETBALL: 'Basketball',\n CRICKET: 'Cricket',\n ESPORTS: 'Esports',\n FOOTBALL: 'Football',\n OTHER: 'Other',\n SWIMMING: 'Swimming',\n TENNIS: 'Tennis',\n};\n\nexport const PROGRAM_LEVEL_LABELS: Record<AthProgramLevel, string> = {\n BEGINNER: 'Beginner',\n INTERMEDIATE: 'Intermediate',\n ADVANCED: 'Advanced',\n ELITE: 'Elite',\n};\n\nexport const MEMBER_ROLE_LABELS: Record<AthMemberRole, string> = {\n PLAYER: 'Player',\n CAPTAIN: 'Captain',\n COACH: 'Coach',\n ASSISTANT_COACH: 'Assistant Coach',\n PHYSIO: 'Physio',\n MANAGER: 'Manager',\n};\n\nexport const FIXTURE_TYPE_LABELS: Record<AthFixtureType, string> = {\n FRIENDLY: 'Friendly',\n LEAGUE: 'League',\n CUP: 'Cup',\n TOURNAMENT: 'Tournament',\n SCRIMMAGE: 'Scrimmage',\n};\n\nexport const SESSION_TYPE_LABELS: Record<AthSessionType, string> = {\n IN_PERSON: 'In Person',\n ONLINE: 'Online',\n HYBRID: 'Hybrid',\n};\n\nexport const METRIC_TYPE_LABELS: Record<AthMetricType, string> = {\n SPEED: 'Speed',\n ENDURANCE: 'Endurance',\n STRENGTH: 'Strength',\n AGILITY: 'Agility',\n ACCURACY: 'Accuracy',\n WEIGHT: 'Weight',\n HEART_RATE: 'Heart Rate',\n CUSTOM: 'Custom',\n};\n\nexport const SPORT_OPTIONS = Object.keys(SPORT_LABELS) as AthSport[];\nexport const PROGRAM_LEVEL_OPTIONS = Object.keys(PROGRAM_LEVEL_LABELS) as AthProgramLevel[];\nexport const MEMBER_ROLE_OPTIONS = Object.keys(MEMBER_ROLE_LABELS) as AthMemberRole[];\nexport const FIXTURE_TYPE_OPTIONS = Object.keys(FIXTURE_TYPE_LABELS) as AthFixtureType[];\nexport const SESSION_TYPE_OPTIONS = Object.keys(SESSION_TYPE_LABELS) as AthSessionType[];\n\n/** Humanize an enum value for display (fallback when no explicit label exists). */\nexport function humanizeEnum(value: string): string {\n return value\n .replace(/_/g, ' ')\n .toLowerCase()\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n"],"mappings":";;AA2BA,IAAa,IAA4C;CACvD,WAAW;CACX,YAAY;CACZ,SAAS;CACT,SAAS;CACT,UAAU;CACV,OAAO;CACP,UAAU;CACV,QAAQ;CACT,EAEY,IAAyC;CACpD,WAAW;CACX,YAAY;CACZ,SAAS;CACT,SAAS;CACT,UAAU;CACV,OAAO;CACP,UAAU;CACV,QAAQ;CACT,EAEY,IAAwD;CACnE,UAAU;CACV,cAAc;CACd,UAAU;CACV,OAAO;CACR,EAEY,IAAoD;CAC/D,QAAQ;CACR,SAAS;CACT,OAAO;CACP,iBAAiB;CACjB,QAAQ;CACR,SAAS;CACV,EAEY,IAAsD;CACjE,UAAU;CACV,QAAQ;CACR,KAAK;CACL,YAAY;CACZ,WAAW;CACZ,EAEY,IAAsD;CACjE,WAAW;CACX,QAAQ;CACR,QAAQ;CACT,EAEY,IAAoD;CAC/D,OAAO;CACP,WAAW;CACX,UAAU;CACV,SAAS;CACT,UAAU;CACV,QAAQ;CACR,YAAY;CACZ,QAAQ;CACT,
|
|
1
|
+
{"version":3,"file":"domain.js","names":[],"sources":["../../../src/atheletebridge/components/domain.ts"],"sourcesContent":["/**\n * Domain display helpers\n * @module atheletebridge/components\n *\n * Centralized, type-safe labels and icon mappings for the AthleteBridge\n * enums so list/detail/form pages render them consistently.\n */\n\nimport {\n Activity,\n Dumbbell,\n Trophy,\n Volleyball,\n Waves,\n Gamepad2,\n Footprints,\n type LucideIcon,\n} from 'lucide-react';\nimport type {\n AthFixtureType,\n AthMemberRole,\n AthMetricType,\n AthProgramLevel,\n AthSessionType,\n AthSport,\n} from '../types';\n\nexport const SPORT_ICONS: Record<AthSport, LucideIcon> = {\n ATHLETICS: Footprints,\n BASKETBALL: Volleyball,\n CRICKET: Trophy,\n ESPORTS: Gamepad2,\n FOOTBALL: Volleyball,\n OTHER: Activity,\n SWIMMING: Waves,\n TENNIS: Dumbbell,\n};\n\nexport const SPORT_LABELS: Record<AthSport, string> = {\n ATHLETICS: 'Athletics',\n BASKETBALL: 'Basketball',\n CRICKET: 'Cricket',\n ESPORTS: 'Esports',\n FOOTBALL: 'Football',\n OTHER: 'Other',\n SWIMMING: 'Swimming',\n TENNIS: 'Tennis',\n};\n\nexport const PROGRAM_LEVEL_LABELS: Record<AthProgramLevel, string> = {\n BEGINNER: 'Beginner',\n INTERMEDIATE: 'Intermediate',\n ADVANCED: 'Advanced',\n ELITE: 'Elite',\n};\n\nexport const MEMBER_ROLE_LABELS: Record<AthMemberRole, string> = {\n PLAYER: 'Player',\n CAPTAIN: 'Captain',\n COACH: 'Coach',\n ASSISTANT_COACH: 'Assistant Coach',\n PHYSIO: 'Physio',\n MANAGER: 'Manager',\n};\n\nexport const FIXTURE_TYPE_LABELS: Record<AthFixtureType, string> = {\n FRIENDLY: 'Friendly',\n LEAGUE: 'League',\n CUP: 'Cup',\n TOURNAMENT: 'Tournament',\n SCRIMMAGE: 'Scrimmage',\n};\n\nexport const SESSION_TYPE_LABELS: Record<AthSessionType, string> = {\n IN_PERSON: 'In Person',\n ONLINE: 'Online',\n HYBRID: 'Hybrid',\n};\n\nexport const METRIC_TYPE_LABELS: Record<AthMetricType, string> = {\n SPEED: 'Speed',\n ENDURANCE: 'Endurance',\n STRENGTH: 'Strength',\n AGILITY: 'Agility',\n ACCURACY: 'Accuracy',\n WEIGHT: 'Weight',\n HEART_RATE: 'Heart Rate',\n CUSTOM: 'Custom',\n};\n\nexport const SPORT_OPTIONS = Object.keys(SPORT_LABELS) as AthSport[];\nexport const PROGRAM_LEVEL_OPTIONS = Object.keys(PROGRAM_LEVEL_LABELS) as AthProgramLevel[];\nexport const MEMBER_ROLE_OPTIONS = Object.keys(MEMBER_ROLE_LABELS) as AthMemberRole[];\nexport const FIXTURE_TYPE_OPTIONS = Object.keys(FIXTURE_TYPE_LABELS) as AthFixtureType[];\nexport const SESSION_TYPE_OPTIONS = Object.keys(SESSION_TYPE_LABELS) as AthSessionType[];\n\n/** Humanize an enum value for display (fallback when no explicit label exists). */\nexport function humanizeEnum(value: string): string {\n return value\n .replace(/_/g, ' ')\n .toLowerCase()\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n"],"mappings":";;AA2BA,IAAa,IAA4C;CACvD,WAAW;CACX,YAAY;CACZ,SAAS;CACT,SAAS;CACT,UAAU;CACV,OAAO;CACP,UAAU;CACV,QAAQ;CACT,EAEY,IAAyC;CACpD,WAAW;CACX,YAAY;CACZ,SAAS;CACT,SAAS;CACT,UAAU;CACV,OAAO;CACP,UAAU;CACV,QAAQ;CACT,EAEY,IAAwD;CACnE,UAAU;CACV,cAAc;CACd,UAAU;CACV,OAAO;CACR,EAEY,IAAoD;CAC/D,QAAQ;CACR,SAAS;CACT,OAAO;CACP,iBAAiB;CACjB,QAAQ;CACR,SAAS;CACV,EAEY,IAAsD;CACjE,UAAU;CACV,QAAQ;CACR,KAAK;CACL,YAAY;CACZ,WAAW;CACZ,EAEY,IAAsD;CACjE,WAAW;CACX,QAAQ;CACR,QAAQ;CACT,EAEY,IAAoD;CAC/D,OAAO;CACP,WAAW;CACX,UAAU;CACV,SAAS;CACT,UAAU;CACV,QAAQ;CACR,YAAY;CACZ,QAAQ;CACT,EAEY,IAAgB,OAAO,KAAK,EAAa,EAEzC,IAAsB,OAAO,KAAK,EAAmB,EACrD,IAAuB,OAAO,KAAK,EAAoB;AAIpE,SAAgB,EAAa,GAAuB;AAClD,QAAO,EACJ,QAAQ,MAAM,IAAI,CAClB,aAAa,CACb,QAAQ,UAAU,MAAM,EAAE,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "./useAthleteBridgeApi.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAthleteBridgeApi.d.ts","sourceRoot":"","sources":["../../../src/atheletebridge/hooks/useAthleteBridgeApi.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,OAAO,KAAK,EACV,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,QAAQ,EACR,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,
|
|
1
|
+
{"version":3,"file":"useAthleteBridgeApi.d.ts","sourceRoot":"","sources":["../../../src/atheletebridge/hooks/useAthleteBridgeApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,7 +35,7 @@ var c = async (e, t, n) => {
|
|
|
35
35
|
],
|
|
36
36
|
queryFn: async () => (await c(`query AthListTeams($sport: AthSport, $status: AthTeamStatus, $pagination: PaginationInput) {
|
|
37
37
|
athListTeams(sport: $sport, status: $status, pagination: $pagination) {
|
|
38
|
-
items { ${u} members { id } }
|
|
38
|
+
items { ${u} members { items { id } } }
|
|
39
39
|
pageInfo { cursor hasMore }
|
|
40
40
|
}
|
|
41
41
|
}`, {
|
|
@@ -55,8 +55,8 @@ var c = async (e, t, n) => {
|
|
|
55
55
|
queryFn: async () => (await c(`query AthTeam($id: ID!) {
|
|
56
56
|
athTeam(id: $id) {
|
|
57
57
|
${u}
|
|
58
|
-
members { ${d} }
|
|
59
|
-
fixtures { ${f} }
|
|
58
|
+
members { items { ${d} } }
|
|
59
|
+
fixtures { items { ${f} } }
|
|
60
60
|
}
|
|
61
61
|
}`, { id: t }, n)).athTeam,
|
|
62
62
|
enabled: !!t
|
|
@@ -71,11 +71,11 @@ var c = async (e, t, n) => {
|
|
|
71
71
|
n
|
|
72
72
|
],
|
|
73
73
|
queryFn: async () => (await c(`query AthListMembers($teamId: ID!, $status: AthMemberStatus) {
|
|
74
|
-
athListMembers(teamId: $teamId, status: $status) { ${d} }
|
|
74
|
+
athListMembers(teamId: $teamId, status: $status) { items { ${d} } }
|
|
75
75
|
}`, {
|
|
76
76
|
teamId: t,
|
|
77
77
|
status: n
|
|
78
|
-
}, r)).athListMembers,
|
|
78
|
+
}, r)).athListMembers.items,
|
|
79
79
|
enabled: !!t
|
|
80
80
|
});
|
|
81
81
|
}, S = () => {
|
|
@@ -188,8 +188,8 @@ var c = async (e, t, n) => {
|
|
|
188
188
|
t
|
|
189
189
|
],
|
|
190
190
|
queryFn: async () => (await c(`query AthStandings($competition: String!) {
|
|
191
|
-
athStandings(competition: $competition) { ${p} }
|
|
192
|
-
}`, { competition: t }, n)).athStandings,
|
|
191
|
+
athStandings(competition: $competition) { items { ${p} } }
|
|
192
|
+
}`, { competition: t }, n)).athStandings.items,
|
|
193
193
|
enabled: !!t
|
|
194
194
|
});
|
|
195
195
|
}, A = () => {
|
|
@@ -229,7 +229,7 @@ var c = async (e, t, n) => {
|
|
|
229
229
|
],
|
|
230
230
|
queryFn: async () => (await c(`query AthListPrograms($sport: AthSport, $level: AthProgramLevel, $status: AthProgramStatus, $pagination: PaginationInput) {
|
|
231
231
|
athListPrograms(sport: $sport, level: $level, status: $status, pagination: $pagination) {
|
|
232
|
-
items { ${h} drills { id } }
|
|
232
|
+
items { ${h} drills { items { id } } }
|
|
233
233
|
pageInfo { cursor hasMore }
|
|
234
234
|
}
|
|
235
235
|
}`, {
|
|
@@ -250,7 +250,7 @@ var c = async (e, t, n) => {
|
|
|
250
250
|
queryFn: async () => (await c(`query AthProgram($id: ID!) {
|
|
251
251
|
athProgram(id: $id) {
|
|
252
252
|
${h}
|
|
253
|
-
drills { ${m} }
|
|
253
|
+
drills { items { ${m} } }
|
|
254
254
|
}
|
|
255
255
|
}`, { id: t }, n)).athProgram,
|
|
256
256
|
enabled: !!t
|
|
@@ -265,7 +265,7 @@ var c = async (e, t, n) => {
|
|
|
265
265
|
t.invalidateQueries({ queryKey: ["atheletebridge", "programs"] });
|
|
266
266
|
}
|
|
267
267
|
});
|
|
268
|
-
},
|
|
268
|
+
}, te = () => {
|
|
269
269
|
let t = a(), { apiGatewayUrl: n } = e();
|
|
270
270
|
return r({
|
|
271
271
|
mutationFn: async ({ id: e, input: t }) => (await c(`mutation AthUpdateProgram($id: ID!, $input: AthUpdateProgramInput!) {
|
|
@@ -282,7 +282,7 @@ var c = async (e, t, n) => {
|
|
|
282
282
|
] });
|
|
283
283
|
}
|
|
284
284
|
});
|
|
285
|
-
},
|
|
285
|
+
}, P = () => {
|
|
286
286
|
let t = a(), { apiGatewayUrl: n } = e();
|
|
287
287
|
return r({
|
|
288
288
|
mutationFn: async ({ id: e, status: t }) => (await c(`mutation AthTransitionProgram($id: ID!, $status: AthProgramStatus!) {
|
|
@@ -299,7 +299,7 @@ var c = async (e, t, n) => {
|
|
|
299
299
|
] });
|
|
300
300
|
}
|
|
301
301
|
});
|
|
302
|
-
},
|
|
302
|
+
}, F = () => {
|
|
303
303
|
let t = a(), { apiGatewayUrl: n } = e();
|
|
304
304
|
return r({
|
|
305
305
|
mutationFn: async (e) => (await c("mutation AthArchiveProgram($id: ID!) { athArchiveProgram(id: $id) }", { id: e }, n)).athArchiveProgram,
|
|
@@ -307,7 +307,7 @@ var c = async (e, t, n) => {
|
|
|
307
307
|
t.invalidateQueries({ queryKey: ["atheletebridge", "programs"] });
|
|
308
308
|
}
|
|
309
309
|
});
|
|
310
|
-
},
|
|
310
|
+
}, I = () => {
|
|
311
311
|
let t = a(), { apiGatewayUrl: n } = e();
|
|
312
312
|
return r({
|
|
313
313
|
mutationFn: async (e) => (await c(`mutation AthAddDrill($input: AthAddDrillInput!) {
|
|
@@ -321,7 +321,7 @@ var c = async (e, t, n) => {
|
|
|
321
321
|
] });
|
|
322
322
|
}
|
|
323
323
|
});
|
|
324
|
-
},
|
|
324
|
+
}, L = (t) => {
|
|
325
325
|
let n = a(), { apiGatewayUrl: i } = e();
|
|
326
326
|
return r({
|
|
327
327
|
mutationFn: async (e) => (await c("mutation AthRemoveDrill($id: ID!) { athRemoveDrill(id: $id) }", { id: e }, i)).athRemoveDrill,
|
|
@@ -333,7 +333,7 @@ var c = async (e, t, n) => {
|
|
|
333
333
|
] });
|
|
334
334
|
}
|
|
335
335
|
});
|
|
336
|
-
},
|
|
336
|
+
}, R = (t = {}) => {
|
|
337
337
|
let { apiGatewayUrl: n } = e();
|
|
338
338
|
return i({
|
|
339
339
|
queryKey: [
|
|
@@ -353,7 +353,7 @@ var c = async (e, t, n) => {
|
|
|
353
353
|
pagination: t.pagination
|
|
354
354
|
}, n)).athListSessions
|
|
355
355
|
});
|
|
356
|
-
},
|
|
356
|
+
}, z = (t) => {
|
|
357
357
|
let { apiGatewayUrl: n } = e();
|
|
358
358
|
return i({
|
|
359
359
|
queryKey: [
|
|
@@ -366,7 +366,7 @@ var c = async (e, t, n) => {
|
|
|
366
366
|
}`, { id: t }, n)).athSession,
|
|
367
367
|
enabled: !!t
|
|
368
368
|
});
|
|
369
|
-
},
|
|
369
|
+
}, B = () => {
|
|
370
370
|
let t = a(), { apiGatewayUrl: n } = e();
|
|
371
371
|
return r({
|
|
372
372
|
mutationFn: async (e) => (await c(`mutation AthBookSession($input: AthBookSessionInput!) {
|
|
@@ -376,7 +376,7 @@ var c = async (e, t, n) => {
|
|
|
376
376
|
t.invalidateQueries({ queryKey: ["atheletebridge", "sessions"] });
|
|
377
377
|
}
|
|
378
378
|
});
|
|
379
|
-
},
|
|
379
|
+
}, V = () => {
|
|
380
380
|
let t = a(), { apiGatewayUrl: n } = e();
|
|
381
381
|
return r({
|
|
382
382
|
mutationFn: async (e) => (await c(`mutation AthConfirmSession($id: ID!) {
|
|
@@ -390,7 +390,7 @@ var c = async (e, t, n) => {
|
|
|
390
390
|
] });
|
|
391
391
|
}
|
|
392
392
|
});
|
|
393
|
-
},
|
|
393
|
+
}, H = () => {
|
|
394
394
|
let t = a(), { apiGatewayUrl: n } = e();
|
|
395
395
|
return r({
|
|
396
396
|
mutationFn: async ({ id: e, input: t }) => (await c(`mutation AthCompleteSession($id: ID!, $input: AthCompleteSessionInput) {
|
|
@@ -407,7 +407,7 @@ var c = async (e, t, n) => {
|
|
|
407
407
|
] });
|
|
408
408
|
}
|
|
409
409
|
});
|
|
410
|
-
},
|
|
410
|
+
}, U = () => {
|
|
411
411
|
let t = a(), { apiGatewayUrl: n } = e();
|
|
412
412
|
return r({
|
|
413
413
|
mutationFn: async (e) => (await c(`mutation AthCancelSession($id: ID!) {
|
|
@@ -421,7 +421,7 @@ var c = async (e, t, n) => {
|
|
|
421
421
|
] });
|
|
422
422
|
}
|
|
423
423
|
});
|
|
424
|
-
},
|
|
424
|
+
}, W = (t = {}) => {
|
|
425
425
|
let { apiGatewayUrl: n } = e();
|
|
426
426
|
return i({
|
|
427
427
|
queryKey: [
|
|
@@ -440,7 +440,7 @@ var c = async (e, t, n) => {
|
|
|
440
440
|
pagination: t.pagination
|
|
441
441
|
}, n)).athListWorkoutLogs
|
|
442
442
|
});
|
|
443
|
-
},
|
|
443
|
+
}, G = (t) => {
|
|
444
444
|
let { apiGatewayUrl: n } = e();
|
|
445
445
|
return i({
|
|
446
446
|
queryKey: [
|
|
@@ -449,11 +449,11 @@ var c = async (e, t, n) => {
|
|
|
449
449
|
t
|
|
450
450
|
],
|
|
451
451
|
queryFn: async () => (await c(`query AthPerformanceMetrics($athleteId: ID!) {
|
|
452
|
-
athPerformanceMetrics(athleteId: $athleteId) { ${v} }
|
|
453
|
-
}`, { athleteId: t }, n)).athPerformanceMetrics,
|
|
452
|
+
athPerformanceMetrics(athleteId: $athleteId) { items { ${v} } }
|
|
453
|
+
}`, { athleteId: t }, n)).athPerformanceMetrics.items,
|
|
454
454
|
enabled: !!t
|
|
455
455
|
});
|
|
456
|
-
},
|
|
456
|
+
}, K = () => {
|
|
457
457
|
let t = a(), { apiGatewayUrl: n } = e();
|
|
458
458
|
return r({
|
|
459
459
|
mutationFn: async (e) => (await c(`mutation AthLogWorkout($input: AthLogWorkoutInput!) {
|
|
@@ -463,7 +463,7 @@ var c = async (e, t, n) => {
|
|
|
463
463
|
t.invalidateQueries({ queryKey: ["atheletebridge", "workout-logs"] });
|
|
464
464
|
}
|
|
465
465
|
});
|
|
466
|
-
},
|
|
466
|
+
}, q = () => {
|
|
467
467
|
let t = a(), { apiGatewayUrl: n } = e();
|
|
468
468
|
return r({
|
|
469
469
|
mutationFn: async (e) => (await c(`mutation AthRecordMetric($input: AthRecordMetricInput!) {
|
|
@@ -473,15 +473,15 @@ var c = async (e, t, n) => {
|
|
|
473
473
|
t.invalidateQueries({ queryKey: ["atheletebridge", "metrics"] });
|
|
474
474
|
}
|
|
475
475
|
});
|
|
476
|
-
},
|
|
476
|
+
}, J = (e) => {
|
|
477
477
|
let t = e.lastIndexOf(".");
|
|
478
478
|
return t >= 0 ? e.slice(t + 1).toLowerCase() : "bin";
|
|
479
|
-
},
|
|
479
|
+
}, Y = () => {
|
|
480
480
|
let { apiGatewayUrl: n } = e();
|
|
481
481
|
return t(async (e) => {
|
|
482
482
|
let t = await c("mutation AthInitiateUpload($input: InitiateUploadInput!) {\n initiateUpload(input: $input) { uploadUrl session { id } }\n }", { input: {
|
|
483
483
|
fileName: e.name,
|
|
484
|
-
extension:
|
|
484
|
+
extension: J(e.name),
|
|
485
485
|
fileSize: e.size,
|
|
486
486
|
mimeType: e.type || "application/octet-stream",
|
|
487
487
|
visibility: "WORKSPACE"
|
|
@@ -495,7 +495,7 @@ var c = async (e, t, n) => {
|
|
|
495
495
|
if (!a.ok) throw Error(`Storage rejected the upload (HTTP ${a.status}).`);
|
|
496
496
|
return (await c("mutation AthCompleteUpload($input: CompleteUploadInput!) {\n completeUpload(input: $input) { fileId }\n }", { input: { sessionId: i } }, n)).completeUpload.fileId;
|
|
497
497
|
}, [n]);
|
|
498
|
-
},
|
|
498
|
+
}, X = (t) => {
|
|
499
499
|
let { apiGatewayUrl: n } = e();
|
|
500
500
|
return i({
|
|
501
501
|
queryKey: [
|
|
@@ -507,7 +507,7 @@ var c = async (e, t, n) => {
|
|
|
507
507
|
enabled: !!t,
|
|
508
508
|
staleTime: 6e4
|
|
509
509
|
});
|
|
510
|
-
},
|
|
510
|
+
}, Z = (e) => e.name?.trim() ? e.name.trim() : [e.firstName, e.lastName].filter(Boolean).join(" ").trim() || (e.username?.trim() ? e.username.trim() : e.email), ne = (e) => {
|
|
511
511
|
let t = e.trim();
|
|
512
512
|
return i({
|
|
513
513
|
queryKey: [
|
|
@@ -526,7 +526,7 @@ var c = async (e, t, n) => {
|
|
|
526
526
|
staleTime: 3e4,
|
|
527
527
|
retry: !1
|
|
528
528
|
});
|
|
529
|
-
},
|
|
529
|
+
}, Q = (e) => {
|
|
530
530
|
let t = n(() => Array.from(new Set(e.filter((e) => !!(e && e.trim())))).sort(), [e]);
|
|
531
531
|
return i({
|
|
532
532
|
queryKey: [
|
|
@@ -548,7 +548,7 @@ var c = async (e, t, n) => {
|
|
|
548
548
|
})).data ?? {}, a = {};
|
|
549
549
|
for (let e of Object.values(i)) e && e.id && (a[e.id] = {
|
|
550
550
|
id: e.id,
|
|
551
|
-
name:
|
|
551
|
+
name: Z(e),
|
|
552
552
|
email: e.email ?? null
|
|
553
553
|
});
|
|
554
554
|
return a;
|
|
@@ -558,7 +558,7 @@ var c = async (e, t, n) => {
|
|
|
558
558
|
retry: !1
|
|
559
559
|
});
|
|
560
560
|
}, re = (e) => {
|
|
561
|
-
let t =
|
|
561
|
+
let t = Q(e), n = t.data ?? {};
|
|
562
562
|
return {
|
|
563
563
|
byId: n,
|
|
564
564
|
isLoading: t.isLoading,
|
|
@@ -577,7 +577,7 @@ var c = async (e, t, n) => {
|
|
|
577
577
|
entityId: t.id,
|
|
578
578
|
entityKind: "team"
|
|
579
579
|
});
|
|
580
|
-
for (let e of t.members ?? []) n.push({
|
|
580
|
+
for (let e of t.members?.items ?? []) n.push({
|
|
581
581
|
id: `member-${e.id}`,
|
|
582
582
|
type: "member-added",
|
|
583
583
|
title: `${e.displayName} added to ${t.name}`,
|
|
@@ -623,10 +623,10 @@ var c = async (e, t, n) => {
|
|
|
623
623
|
i,
|
|
624
624
|
a
|
|
625
625
|
]), ae = (e, t) => {
|
|
626
|
-
let r = x(e), i = n(() => (r.data ?? []).find((e) => e.id === t) ?? null, [r.data, t]), a = i?.userId, o =
|
|
626
|
+
let r = x(e), i = n(() => (r.data ?? []).find((e) => e.id === t) ?? null, [r.data, t]), a = i?.userId, o = G(a), s = W({
|
|
627
627
|
athleteId: a,
|
|
628
628
|
pagination: { limit: 100 }
|
|
629
|
-
}), c =
|
|
629
|
+
}), c = R({
|
|
630
630
|
athleteId: a,
|
|
631
631
|
pagination: { limit: 100 }
|
|
632
632
|
});
|
|
@@ -659,7 +659,7 @@ function $(e, t, n, r = 8) {
|
|
|
659
659
|
});
|
|
660
660
|
}
|
|
661
661
|
var oe = (e = {}) => {
|
|
662
|
-
let { competition: t, sampleLimit: r = 200 } = e, i =
|
|
662
|
+
let { competition: t, sampleLimit: r = 200 } = e, i = R({ pagination: { limit: r } }), a = W({ pagination: { limit: r } }), o = D({ pagination: { limit: r } }), s = n(() => i.data?.items ?? [], [i.data]), c = n(() => a.data?.items ?? [], [a.data]), l = n(() => o.data?.items ?? [], [o.data]), u = n(() => {
|
|
663
663
|
if (t) return t;
|
|
664
664
|
let e = /* @__PURE__ */ new Map();
|
|
665
665
|
for (let t of l) t.competition && e.set(t.competition, (e.get(t.competition) ?? 0) + 1);
|
|
@@ -734,6 +734,6 @@ var oe = (e = {}) => {
|
|
|
734
734
|
]);
|
|
735
735
|
};
|
|
736
736
|
//#endregion
|
|
737
|
-
export {
|
|
737
|
+
export { Z as directoryUserName, I as useAddDrill, T as useAddMember, F as useArchiveProgram, w as useArchiveTeam, ae as useAthleteProfile, B as useBookSession, U as useCancelSession, oe as useCoachAnalytics, H as useCompleteSession, V as useConfirmSession, ee as useCreateProgram, S as useCreateTeam, X as useFile, O as useFixture, D as useFixtures, K as useLogWorkout, G as usePerformanceMetrics, N as useProgram, M as usePrograms, ie as useRecentActivity, j as useRecordFixtureResult, q as useRecordMetric, L as useRemoveDrill, E as useRemoveMember, A as useScheduleFixture, z as useSession, R as useSessions, k as useStandings, b as useTeam, x as useTeamMembers, y as useTeams, P as useTransitionProgram, te as useUpdateProgram, C as useUpdateTeam, Y as useUploadFile, re as useUserDirectory, ne as useUserSearch, Q as useUsersByIds, W as useWorkoutLogs };
|
|
738
738
|
|
|
739
739
|
//# sourceMappingURL=useAthleteBridgeApi.js.map
|