@burdenoff/microfe-atheletebridge 2026.1031.2 → 2026.1102.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/atheletebridge/AthleteBridgeRoot.d.ts.map +1 -1
- package/dist/atheletebridge/AthleteBridgeRoot.js +63 -47
- package/dist/atheletebridge/AthleteBridgeRoot.js.map +1 -1
- package/dist/atheletebridge/AthleteBridgeRoutes.d.ts.map +1 -1
- package/dist/atheletebridge/AthleteBridgeRoutes.js +62 -6
- package/dist/atheletebridge/AthleteBridgeRoutes.js.map +1 -1
- package/dist/atheletebridge/components/StatusBadge.d.ts.map +1 -1
- package/dist/atheletebridge/components/StatusBadge.js +13 -1
- package/dist/atheletebridge/components/StatusBadge.js.map +1 -1
- package/dist/atheletebridge/components/registration/PaymentSummaryPanel.d.ts +6 -0
- package/dist/atheletebridge/components/registration/PaymentSummaryPanel.d.ts.map +1 -0
- package/dist/atheletebridge/components/registration/PaymentSummaryPanel.js +104 -0
- package/dist/atheletebridge/components/registration/PaymentSummaryPanel.js.map +1 -0
- package/dist/atheletebridge/components/registration/RegistrationEntryFields.d.ts +15 -0
- package/dist/atheletebridge/components/registration/RegistrationEntryFields.d.ts.map +1 -0
- package/dist/atheletebridge/components/registration/RegistrationEntryFields.js +236 -0
- package/dist/atheletebridge/components/registration/RegistrationEntryFields.js.map +1 -0
- package/dist/atheletebridge/components/registration/entryRules.d.ts +23 -0
- package/dist/atheletebridge/components/registration/entryRules.d.ts.map +1 -0
- package/dist/atheletebridge/components/registration/entryRules.js +29 -0
- package/dist/atheletebridge/components/registration/entryRules.js.map +1 -0
- package/dist/atheletebridge/hooks/useAthleteBridgeApi.d.ts +6 -2
- package/dist/atheletebridge/hooks/useAthleteBridgeApi.d.ts.map +1 -1
- package/dist/atheletebridge/hooks/useAthleteBridgeApi.js +297 -281
- package/dist/atheletebridge/hooks/useAthleteBridgeApi.js.map +1 -1
- package/dist/atheletebridge/hooks/useRegistrationApi.d.ts +54 -0
- package/dist/atheletebridge/hooks/useRegistrationApi.d.ts.map +1 -0
- package/dist/atheletebridge/hooks/useRegistrationApi.js +265 -0
- package/dist/atheletebridge/hooks/useRegistrationApi.js.map +1 -0
- package/dist/atheletebridge/pages/fixtures/FixtureDetailPage.d.ts.map +1 -1
- package/dist/atheletebridge/pages/fixtures/FixtureDetailPage.js +123 -416
- package/dist/atheletebridge/pages/fixtures/FixtureDetailPage.js.map +1 -1
- package/dist/atheletebridge/pages/registrations/MyRegistrationsPage.d.ts +10 -0
- package/dist/atheletebridge/pages/registrations/MyRegistrationsPage.d.ts.map +1 -0
- package/dist/atheletebridge/pages/registrations/MyRegistrationsPage.js +89 -0
- package/dist/atheletebridge/pages/registrations/MyRegistrationsPage.js.map +1 -0
- package/dist/atheletebridge/pages/registrations/RecordRegistrationPage.d.ts +10 -0
- package/dist/atheletebridge/pages/registrations/RecordRegistrationPage.d.ts.map +1 -0
- package/dist/atheletebridge/pages/registrations/RecordRegistrationPage.js +94 -0
- package/dist/atheletebridge/pages/registrations/RecordRegistrationPage.js.map +1 -0
- package/dist/atheletebridge/pages/registrations/RegisterPage.d.ts +11 -0
- package/dist/atheletebridge/pages/registrations/RegisterPage.d.ts.map +1 -0
- package/dist/atheletebridge/pages/registrations/RegisterPage.js +160 -0
- package/dist/atheletebridge/pages/registrations/RegisterPage.js.map +1 -0
- package/dist/atheletebridge/pages/registrations/RegistrationFormBuilderPage.d.ts +10 -0
- package/dist/atheletebridge/pages/registrations/RegistrationFormBuilderPage.d.ts.map +1 -0
- package/dist/atheletebridge/pages/registrations/RegistrationFormBuilderPage.js +602 -0
- package/dist/atheletebridge/pages/registrations/RegistrationFormBuilderPage.js.map +1 -0
- package/dist/atheletebridge/pages/registrations/RegistrationFormDetailPage.d.ts +9 -0
- package/dist/atheletebridge/pages/registrations/RegistrationFormDetailPage.d.ts.map +1 -0
- package/dist/atheletebridge/pages/registrations/RegistrationFormDetailPage.js +317 -0
- package/dist/atheletebridge/pages/registrations/RegistrationFormDetailPage.js.map +1 -0
- package/dist/atheletebridge/pages/registrations/RegistrationFormsListPage.d.ts +9 -0
- package/dist/atheletebridge/pages/registrations/RegistrationFormsListPage.d.ts.map +1 -0
- package/dist/atheletebridge/pages/registrations/RegistrationFormsListPage.js +127 -0
- package/dist/atheletebridge/pages/registrations/RegistrationFormsListPage.js.map +1 -0
- package/dist/atheletebridge/pages/registrations/RegistrationSubmissionPage.d.ts +11 -0
- package/dist/atheletebridge/pages/registrations/RegistrationSubmissionPage.d.ts.map +1 -0
- package/dist/atheletebridge/pages/registrations/RegistrationSubmissionPage.js +411 -0
- package/dist/atheletebridge/pages/registrations/RegistrationSubmissionPage.js.map +1 -0
- package/dist/atheletebridge/types/registration.d.ts +220 -0
- package/dist/atheletebridge/types/registration.d.ts.map +1 -0
- package/dist/atheletebridge/utils/fixtureCapabilities.d.ts +19 -0
- package/dist/atheletebridge/utils/fixtureCapabilities.d.ts.map +1 -0
- package/dist/atheletebridge/utils/fixtureCapabilities.js +21 -0
- package/dist/atheletebridge/utils/fixtureCapabilities.js.map +1 -0
- package/dist/atheletebridge/utils/money.d.ts +22 -0
- package/dist/atheletebridge/utils/money.d.ts.map +1 -0
- package/dist/atheletebridge/utils/money.js +38 -0
- package/dist/atheletebridge/utils/money.js.map +1 -0
- package/dist/atheletebridge/utils/registration.d.ts +17 -0
- package/dist/atheletebridge/utils/registration.d.ts.map +1 -0
- package/dist/atheletebridge/utils/registration.js +25 -0
- package/dist/atheletebridge/utils/registration.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PaymentSummaryPanel.js","names":[],"sources":["../../../../src/atheletebridge/components/registration/PaymentSummaryPanel.tsx"],"sourcesContent":["/**\n * Registration fee reconciliation panel (BOFF-4135)\n * @module atheletebridge/components/registration\n *\n * KPI tiles for one form or the whole workspace: what is owed, collected,\n * refunded and still outstanding (one row per currency — never summed across\n * currencies), plus how many registrations sit in each payment state. Renders\n * nothing when the viewer cannot read the payment ledger (e.g. a coach), so the\n * submissions view stays usable without leaking that a ledger exists.\n */\n\nimport type { FC } from 'react';\nimport { CircleDollarSign, ClipboardList, HandCoins, Hourglass } from 'lucide-react';\nimport { MetricsCard } from '../MetricsCard';\nimport { useRegistrationPaymentSummary } from '../../hooks/useRegistrationApi';\nimport { formatMoney } from '../../utils/money';\n\nexport const PaymentSummaryPanel: FC<{ formId?: string }> = ({ formId }) => {\n const summary = useRegistrationPaymentSummary(formId);\n if (!summary.data) return null;\n const data = summary.data;\n const totals = data.totals.length > 0 ? data.totals : null;\n\n return (\n <section\n aria-label=\"Fee reconciliation\"\n className=\"mb-6 space-y-3\"\n data-testid=\"registration-summary\"\n >\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n <MetricsCard\n icon={<ClipboardList className=\"h-5 w-5\" />}\n value={data.submissionCount}\n label={`Registrations (${data.acceptedCount} accepted)`}\n />\n <MetricsCard\n icon={<HandCoins className=\"h-5 w-5\" />}\n value={data.paidCount}\n label=\"Paid in full\"\n tone=\"success\"\n />\n <MetricsCard\n icon={<Hourglass className=\"h-5 w-5\" />}\n value={data.unpaidCount + data.partiallyPaidCount}\n label={`Awaiting payment (${data.partiallyPaidCount} partial)`}\n />\n <MetricsCard\n icon={<CircleDollarSign className=\"h-5 w-5\" />}\n value={data.notRequiredCount + data.refundedCount}\n label=\"Free or refunded\"\n />\n </div>\n {totals && (\n <div className=\"overflow-x-auto rounded-lg border border-border-seam\">\n <table className=\"w-full text-sm\">\n <thead className=\"bg-bg-sunken text-left text-xs uppercase tracking-wide text-text-secondary\">\n <tr>\n <th className=\"px-4 py-2 font-medium\">Currency</th>\n <th className=\"px-4 py-2 text-right font-medium\">Due</th>\n <th className=\"px-4 py-2 text-right font-medium\">Collected</th>\n <th className=\"px-4 py-2 text-right font-medium\">Refunded</th>\n <th className=\"px-4 py-2 text-right font-medium\">Outstanding</th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border-seam\">\n {totals.map((row) => (\n <tr key={row.currency} className=\"text-text-primary\">\n <td className=\"px-4 py-2 font-medium\">{row.currency}</td>\n <td className=\"px-4 py-2 text-right tabular-nums\">\n {formatMoney(row.amountDue, row.currency)}\n </td>\n <td className=\"px-4 py-2 text-right tabular-nums\">\n {formatMoney(row.amountCollected, row.currency)}\n </td>\n <td className=\"px-4 py-2 text-right tabular-nums\">\n {formatMoney(row.amountRefunded, row.currency)}\n </td>\n <td\n className=\"px-4 py-2 text-right font-semibold tabular-nums\"\n data-testid=\"summary-outstanding\"\n >\n {formatMoney(row.amountOutstanding, row.currency)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </section>\n );\n};\n"],"mappings":";;;;;;AAiBA,IAAa,KAAgD,EAAE,gBAAa;CAC1E,IAAM,IAAU,EAA8B,CAAM;CACpD,IAAI,CAAC,EAAQ,MAAM,OAAO;CAC1B,IAAM,IAAO,EAAQ,MACf,IAAS,EAAK,OAAO,SAAS,IAAI,EAAK,SAAS;CAEtD,OACE,kBAAC,WAAD;EACE,cAAW;EACX,WAAU;EACV,eAAY;YAHd,CAKE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,MAAM,kBAAC,GAAD,EAAe,WAAU,UAAW,CAAA;KAC1C,OAAO,EAAK;KACZ,OAAO,kBAAkB,EAAK,cAAc;IAC7C,CAAA;IACD,kBAAC,GAAD;KACE,MAAM,kBAAC,GAAD,EAAW,WAAU,UAAW,CAAA;KACtC,OAAO,EAAK;KACZ,OAAM;KACN,MAAK;IACN,CAAA;IACD,kBAAC,GAAD;KACE,MAAM,kBAAC,GAAD,EAAW,WAAU,UAAW,CAAA;KACtC,OAAO,EAAK,cAAc,EAAK;KAC/B,OAAO,qBAAqB,EAAK,mBAAmB;IACrD,CAAA;IACD,kBAAC,GAAD;KACE,MAAM,kBAAC,GAAD,EAAkB,WAAU,UAAW,CAAA;KAC7C,OAAO,EAAK,mBAAmB,EAAK;KACpC,OAAM;IACP,CAAA;GACE;MACJ,KACC,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,SAAD;IAAO,WAAU;cAAjB,CACE,kBAAC,SAAD;KAAO,WAAU;eACf,kBAAC,MAAD,EAAA,UAAA;MACE,kBAAC,MAAD;OAAI,WAAU;iBAAwB;MAAY,CAAA;MAClD,kBAAC,MAAD;OAAI,WAAU;iBAAmC;MAAO,CAAA;MACxD,kBAAC,MAAD;OAAI,WAAU;iBAAmC;MAAa,CAAA;MAC9D,kBAAC,MAAD;OAAI,WAAU;iBAAmC;MAAY,CAAA;MAC7D,kBAAC,MAAD;OAAI,WAAU;iBAAmC;MAAe,CAAA;KAC9D,EAAA,CAAA;IACC,CAAA,GACP,kBAAC,SAAD;KAAO,WAAU;eACd,EAAO,KAAK,MACX,kBAAC,MAAD;MAAuB,WAAU;gBAAjC;OACE,kBAAC,MAAD;QAAI,WAAU;kBAAyB,EAAI;OAAa,CAAA;OACxD,kBAAC,MAAD;QAAI,WAAU;kBACX,EAAY,EAAI,WAAW,EAAI,QAAQ;OACtC,CAAA;OACJ,kBAAC,MAAD;QAAI,WAAU;kBACX,EAAY,EAAI,iBAAiB,EAAI,QAAQ;OAC5C,CAAA;OACJ,kBAAC,MAAD;QAAI,WAAU;kBACX,EAAY,EAAI,gBAAgB,EAAI,QAAQ;OAC3C,CAAA;OACJ,kBAAC,MAAD;QACE,WAAU;QACV,eAAY;kBAEX,EAAY,EAAI,mBAAmB,EAAI,QAAQ;OAC9C,CAAA;MACF;QAjBK,EAAI,QAiBT,CACL;IACI,CAAA,CACF;;EACJ,CAAA,CAEA;;AAEb"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { AthRegistrationFee, AthRegistrationField } from '../../types/registration';
|
|
3
|
+
import { RegistrationEntryState } from './entryRules';
|
|
4
|
+
|
|
5
|
+
interface RegistrationEntryFieldsProps {
|
|
6
|
+
fields: AthRegistrationField[];
|
|
7
|
+
fees: AthRegistrationFee[];
|
|
8
|
+
currency: string;
|
|
9
|
+
waiverText: string | null;
|
|
10
|
+
state: RegistrationEntryState;
|
|
11
|
+
onChange: (next: RegistrationEntryState) => void;
|
|
12
|
+
}
|
|
13
|
+
export declare const RegistrationEntryFields: FC<RegistrationEntryFieldsProps>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=RegistrationEntryFields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RegistrationEntryFields.d.ts","sourceRoot":"","sources":["../../../../src/atheletebridge/components/registration/RegistrationEntryFields.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAGhC,OAAO,KAAK,EAEV,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,sBAAsB,EAAqB,MAAM,cAAc,CAAC;AAyF9E,UAAU,4BAA4B;IACpC,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,IAAI,EAAE,kBAAkB,EAAE,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,sBAAsB,CAAC;IAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,IAAI,CAAC;CAClD;AAED,eAAO,MAAM,uBAAuB,EAAE,EAAE,CAAC,4BAA4B,CAwJpE,CAAC"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { FormField as e, fieldInputClass as t } from "../form.js";
|
|
2
|
+
import { formatMoney as n } from "../../utils/money.js";
|
|
3
|
+
import { registrationTotal as r } from "./entryRules.js";
|
|
4
|
+
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
5
|
+
//#region src/atheletebridge/components/registration/RegistrationEntryFields.tsx
|
|
6
|
+
var o = ({ field: n, value: r, onChange: o }) => {
|
|
7
|
+
let s = `q-${n.key}`;
|
|
8
|
+
if (n.fieldType === "CHECKBOX") return /* @__PURE__ */ a("label", {
|
|
9
|
+
className: "flex items-start gap-2.5 text-sm text-text-primary",
|
|
10
|
+
htmlFor: s,
|
|
11
|
+
children: [/* @__PURE__ */ i("input", {
|
|
12
|
+
id: s,
|
|
13
|
+
type: "checkbox",
|
|
14
|
+
checked: r === !0,
|
|
15
|
+
onChange: (e) => o(e.target.checked),
|
|
16
|
+
className: "mt-0.5 h-4 w-4 rounded border-border-seam text-action-primary-bg focus:ring-[var(--color-focus-ring)]"
|
|
17
|
+
}), /* @__PURE__ */ a("span", { children: [
|
|
18
|
+
n.label,
|
|
19
|
+
n.required && /* @__PURE__ */ i("span", {
|
|
20
|
+
className: "ml-0.5 text-status-error-text",
|
|
21
|
+
children: "*"
|
|
22
|
+
}),
|
|
23
|
+
n.helpText && /* @__PURE__ */ i("span", {
|
|
24
|
+
className: "block text-xs text-text-secondary",
|
|
25
|
+
children: n.helpText
|
|
26
|
+
})
|
|
27
|
+
] })]
|
|
28
|
+
});
|
|
29
|
+
let c = r === void 0 ? "" : String(r), l;
|
|
30
|
+
return l = n.fieldType === "LONG_TEXT" ? /* @__PURE__ */ i("textarea", {
|
|
31
|
+
id: s,
|
|
32
|
+
rows: 3,
|
|
33
|
+
className: t,
|
|
34
|
+
value: c,
|
|
35
|
+
onChange: (e) => o(e.target.value)
|
|
36
|
+
}) : n.fieldType === "SELECT" ? /* @__PURE__ */ a("select", {
|
|
37
|
+
id: s,
|
|
38
|
+
className: t,
|
|
39
|
+
value: c,
|
|
40
|
+
onChange: (e) => o(e.target.value),
|
|
41
|
+
children: [/* @__PURE__ */ i("option", {
|
|
42
|
+
value: "",
|
|
43
|
+
children: "Select…"
|
|
44
|
+
}), n.options.map((e) => /* @__PURE__ */ i("option", {
|
|
45
|
+
value: e,
|
|
46
|
+
children: e
|
|
47
|
+
}, e))]
|
|
48
|
+
}) : /* @__PURE__ */ i("input", {
|
|
49
|
+
id: s,
|
|
50
|
+
type: {
|
|
51
|
+
EMAIL: "email",
|
|
52
|
+
PHONE: "tel",
|
|
53
|
+
NUMBER: "number",
|
|
54
|
+
DATE: "date"
|
|
55
|
+
}[n.fieldType] ?? "text",
|
|
56
|
+
className: t,
|
|
57
|
+
value: c,
|
|
58
|
+
onChange: (e) => o(e.target.value)
|
|
59
|
+
}), /* @__PURE__ */ i(e, {
|
|
60
|
+
label: n.label,
|
|
61
|
+
htmlFor: s,
|
|
62
|
+
required: n.required,
|
|
63
|
+
hint: n.helpText ?? void 0,
|
|
64
|
+
children: l
|
|
65
|
+
});
|
|
66
|
+
}, s = ({ fields: s, fees: c, currency: l, waiverText: u, state: d, onChange: f }) => {
|
|
67
|
+
let p = (e, t) => f({
|
|
68
|
+
...d,
|
|
69
|
+
[e]: t
|
|
70
|
+
}), m = r(c, d.optionalFeeIds);
|
|
71
|
+
return /* @__PURE__ */ a("div", {
|
|
72
|
+
className: "space-y-6",
|
|
73
|
+
children: [
|
|
74
|
+
/* @__PURE__ */ a("section", {
|
|
75
|
+
className: "space-y-4",
|
|
76
|
+
"aria-labelledby": "reg-participant",
|
|
77
|
+
children: [
|
|
78
|
+
/* @__PURE__ */ i("h2", {
|
|
79
|
+
id: "reg-participant",
|
|
80
|
+
className: "text-base font-semibold text-text-primary",
|
|
81
|
+
children: "Participant"
|
|
82
|
+
}),
|
|
83
|
+
/* @__PURE__ */ i(e, {
|
|
84
|
+
label: "Participant name",
|
|
85
|
+
htmlFor: "participantName",
|
|
86
|
+
required: !0,
|
|
87
|
+
children: /* @__PURE__ */ i("input", {
|
|
88
|
+
id: "participantName",
|
|
89
|
+
className: t,
|
|
90
|
+
value: d.participantName,
|
|
91
|
+
onChange: (e) => p("participantName", e.target.value),
|
|
92
|
+
placeholder: "Athlete's full name"
|
|
93
|
+
})
|
|
94
|
+
}),
|
|
95
|
+
/* @__PURE__ */ a("div", {
|
|
96
|
+
className: "grid grid-cols-1 gap-4 sm:grid-cols-3",
|
|
97
|
+
children: [
|
|
98
|
+
/* @__PURE__ */ i(e, {
|
|
99
|
+
label: "Contact name",
|
|
100
|
+
htmlFor: "contactName",
|
|
101
|
+
hint: "Parent or guardian, if applicable.",
|
|
102
|
+
children: /* @__PURE__ */ i("input", {
|
|
103
|
+
id: "contactName",
|
|
104
|
+
className: t,
|
|
105
|
+
value: d.contactName,
|
|
106
|
+
onChange: (e) => p("contactName", e.target.value)
|
|
107
|
+
})
|
|
108
|
+
}),
|
|
109
|
+
/* @__PURE__ */ i(e, {
|
|
110
|
+
label: "Contact email",
|
|
111
|
+
htmlFor: "contactEmail",
|
|
112
|
+
children: /* @__PURE__ */ i("input", {
|
|
113
|
+
id: "contactEmail",
|
|
114
|
+
type: "email",
|
|
115
|
+
className: t,
|
|
116
|
+
value: d.contactEmail,
|
|
117
|
+
onChange: (e) => p("contactEmail", e.target.value)
|
|
118
|
+
})
|
|
119
|
+
}),
|
|
120
|
+
/* @__PURE__ */ i(e, {
|
|
121
|
+
label: "Contact phone",
|
|
122
|
+
htmlFor: "contactPhone",
|
|
123
|
+
children: /* @__PURE__ */ i("input", {
|
|
124
|
+
id: "contactPhone",
|
|
125
|
+
type: "tel",
|
|
126
|
+
className: t,
|
|
127
|
+
value: d.contactPhone,
|
|
128
|
+
onChange: (e) => p("contactPhone", e.target.value)
|
|
129
|
+
})
|
|
130
|
+
})
|
|
131
|
+
]
|
|
132
|
+
})
|
|
133
|
+
]
|
|
134
|
+
}),
|
|
135
|
+
s.length > 0 && /* @__PURE__ */ a("section", {
|
|
136
|
+
className: "space-y-4",
|
|
137
|
+
"aria-labelledby": "reg-questions",
|
|
138
|
+
children: [/* @__PURE__ */ i("h2", {
|
|
139
|
+
id: "reg-questions",
|
|
140
|
+
className: "text-base font-semibold text-text-primary",
|
|
141
|
+
children: "Questions"
|
|
142
|
+
}), s.map((e) => /* @__PURE__ */ i(o, {
|
|
143
|
+
field: e,
|
|
144
|
+
value: d.answers[e.key],
|
|
145
|
+
onChange: (t) => p("answers", {
|
|
146
|
+
...d.answers,
|
|
147
|
+
[e.key]: t
|
|
148
|
+
})
|
|
149
|
+
}, e.id))]
|
|
150
|
+
}),
|
|
151
|
+
c.length > 0 && /* @__PURE__ */ a("section", {
|
|
152
|
+
className: "space-y-3",
|
|
153
|
+
"aria-labelledby": "reg-fees",
|
|
154
|
+
children: [/* @__PURE__ */ i("h2", {
|
|
155
|
+
id: "reg-fees",
|
|
156
|
+
className: "text-base font-semibold text-text-primary",
|
|
157
|
+
children: "Fees"
|
|
158
|
+
}), /* @__PURE__ */ a("ul", {
|
|
159
|
+
className: "divide-y divide-border-seam rounded-lg border border-border-seam",
|
|
160
|
+
children: [c.map((e) => {
|
|
161
|
+
let t = e.feeType === "OPTIONAL";
|
|
162
|
+
return /* @__PURE__ */ a("li", {
|
|
163
|
+
className: "flex items-center justify-between gap-3 px-4 py-3",
|
|
164
|
+
children: [/* @__PURE__ */ a("label", {
|
|
165
|
+
className: "flex items-start gap-2.5 text-sm text-text-primary",
|
|
166
|
+
children: [/* @__PURE__ */ i("input", {
|
|
167
|
+
type: "checkbox",
|
|
168
|
+
checked: !t || d.optionalFeeIds.includes(e.id),
|
|
169
|
+
disabled: !t,
|
|
170
|
+
"aria-label": `${e.name}${t ? " (optional)" : " (required)"}`,
|
|
171
|
+
onChange: (t) => p("optionalFeeIds", t.target.checked ? [...d.optionalFeeIds, e.id] : d.optionalFeeIds.filter((t) => t !== e.id)),
|
|
172
|
+
className: "mt-0.5 h-4 w-4 rounded border-border-seam text-action-primary-bg focus:ring-[var(--color-focus-ring)] disabled:opacity-60"
|
|
173
|
+
}), /* @__PURE__ */ a("span", { children: [
|
|
174
|
+
e.name,
|
|
175
|
+
/* @__PURE__ */ i("span", {
|
|
176
|
+
className: "ml-1.5 text-xs text-text-secondary",
|
|
177
|
+
children: t ? "Optional" : "Required"
|
|
178
|
+
}),
|
|
179
|
+
e.description && /* @__PURE__ */ i("span", {
|
|
180
|
+
className: "block text-xs text-text-secondary",
|
|
181
|
+
children: e.description
|
|
182
|
+
})
|
|
183
|
+
] })]
|
|
184
|
+
}), /* @__PURE__ */ i("span", {
|
|
185
|
+
className: "text-sm font-medium tabular-nums text-text-primary",
|
|
186
|
+
children: n(e.amount, l)
|
|
187
|
+
})]
|
|
188
|
+
}, e.id);
|
|
189
|
+
}), /* @__PURE__ */ a("li", {
|
|
190
|
+
className: "flex items-center justify-between px-4 py-3 text-sm font-semibold text-text-primary",
|
|
191
|
+
children: [/* @__PURE__ */ i("span", { children: "Total due" }), /* @__PURE__ */ i("span", {
|
|
192
|
+
className: "tabular-nums",
|
|
193
|
+
"data-testid": "registration-total",
|
|
194
|
+
children: n(m, l)
|
|
195
|
+
})]
|
|
196
|
+
})]
|
|
197
|
+
})]
|
|
198
|
+
}),
|
|
199
|
+
u && /* @__PURE__ */ a("section", {
|
|
200
|
+
className: "space-y-3",
|
|
201
|
+
"aria-labelledby": "reg-waiver",
|
|
202
|
+
children: [
|
|
203
|
+
/* @__PURE__ */ i("h2", {
|
|
204
|
+
id: "reg-waiver",
|
|
205
|
+
className: "text-base font-semibold text-text-primary",
|
|
206
|
+
children: "Waiver"
|
|
207
|
+
}),
|
|
208
|
+
/* @__PURE__ */ i("p", {
|
|
209
|
+
className: "whitespace-pre-line rounded-lg border border-border-seam bg-bg-sunken p-4 text-sm text-text-secondary",
|
|
210
|
+
children: u
|
|
211
|
+
}),
|
|
212
|
+
/* @__PURE__ */ a("label", {
|
|
213
|
+
className: "flex items-center gap-2.5 text-sm text-text-primary",
|
|
214
|
+
children: [
|
|
215
|
+
/* @__PURE__ */ i("input", {
|
|
216
|
+
type: "checkbox",
|
|
217
|
+
checked: d.waiverAccepted,
|
|
218
|
+
onChange: (e) => p("waiverAccepted", e.target.checked),
|
|
219
|
+
className: "h-4 w-4 rounded border-border-seam text-action-primary-bg focus:ring-[var(--color-focus-ring)]"
|
|
220
|
+
}),
|
|
221
|
+
"I have read and accept the waiver",
|
|
222
|
+
/* @__PURE__ */ i("span", {
|
|
223
|
+
className: "text-status-error-text",
|
|
224
|
+
children: "*"
|
|
225
|
+
})
|
|
226
|
+
]
|
|
227
|
+
})
|
|
228
|
+
]
|
|
229
|
+
})
|
|
230
|
+
]
|
|
231
|
+
});
|
|
232
|
+
};
|
|
233
|
+
//#endregion
|
|
234
|
+
export { s as RegistrationEntryFields };
|
|
235
|
+
|
|
236
|
+
//# sourceMappingURL=RegistrationEntryFields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RegistrationEntryFields.js","names":[],"sources":["../../../../src/atheletebridge/components/registration/RegistrationEntryFields.tsx"],"sourcesContent":["/**\n * Registration entry fields (BOFF-4135)\n * @module atheletebridge/components/registration\n *\n * Renders a registration form's participant/contact block, its questions, its\n * fees (REQUIRED always included, OPTIONAL opt-in) and its waiver. Shared by\n * the family-facing share-link page and the staff \"record a registration\"\n * page so both collect exactly what the server validates.\n */\n\nimport type { FC } from 'react';\nimport { FormField, fieldInputClass } from '../form';\nimport { formatMoney } from '../../utils/money';\nimport type {\n AthRegistrationAnswerValue,\n AthRegistrationFee,\n AthRegistrationField,\n} from '../../types/registration';\nimport { type RegistrationEntryState, registrationTotal } from './entryRules';\n\ninterface QuestionInputProps {\n field: AthRegistrationField;\n value: AthRegistrationAnswerValue | undefined;\n onChange: (value: AthRegistrationAnswerValue) => void;\n}\n\nconst QuestionInput: FC<QuestionInputProps> = ({ field, value, onChange }) => {\n const id = `q-${field.key}`;\n if (field.fieldType === 'CHECKBOX') {\n return (\n <label className=\"flex items-start gap-2.5 text-sm text-text-primary\" htmlFor={id}>\n <input\n id={id}\n type=\"checkbox\"\n checked={value === true}\n onChange={(e) => onChange(e.target.checked)}\n className=\"mt-0.5 h-4 w-4 rounded border-border-seam text-action-primary-bg focus:ring-[var(--color-focus-ring)]\"\n />\n <span>\n {field.label}\n {field.required && <span className=\"ml-0.5 text-status-error-text\">*</span>}\n {field.helpText && (\n <span className=\"block text-xs text-text-secondary\">{field.helpText}</span>\n )}\n </span>\n </label>\n );\n }\n\n const text = value === undefined ? '' : String(value);\n let control;\n if (field.fieldType === 'LONG_TEXT') {\n control = (\n <textarea\n id={id}\n rows={3}\n className={fieldInputClass}\n value={text}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n } else if (field.fieldType === 'SELECT') {\n control = (\n <select\n id={id}\n className={fieldInputClass}\n value={text}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\">Select…</option>\n {field.options.map((option) => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n );\n } else {\n const inputType: Record<string, string> = {\n EMAIL: 'email',\n PHONE: 'tel',\n NUMBER: 'number',\n DATE: 'date',\n };\n control = (\n <input\n id={id}\n type={inputType[field.fieldType] ?? 'text'}\n className={fieldInputClass}\n value={text}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n }\n\n return (\n <FormField\n label={field.label}\n htmlFor={id}\n required={field.required}\n hint={field.helpText ?? undefined}\n >\n {control}\n </FormField>\n );\n};\n\ninterface RegistrationEntryFieldsProps {\n fields: AthRegistrationField[];\n fees: AthRegistrationFee[];\n currency: string;\n waiverText: string | null;\n state: RegistrationEntryState;\n onChange: (next: RegistrationEntryState) => void;\n}\n\nexport const RegistrationEntryFields: FC<RegistrationEntryFieldsProps> = ({\n fields,\n fees,\n currency,\n waiverText,\n state,\n onChange,\n}) => {\n const set = <K extends keyof RegistrationEntryState>(key: K, value: RegistrationEntryState[K]) =>\n onChange({ ...state, [key]: value });\n const total = registrationTotal(fees, state.optionalFeeIds);\n\n return (\n <div className=\"space-y-6\">\n <section className=\"space-y-4\" aria-labelledby=\"reg-participant\">\n <h2 id=\"reg-participant\" className=\"text-base font-semibold text-text-primary\">\n Participant\n </h2>\n <FormField label=\"Participant name\" htmlFor=\"participantName\" required>\n <input\n id=\"participantName\"\n className={fieldInputClass}\n value={state.participantName}\n onChange={(e) => set('participantName', e.target.value)}\n placeholder=\"Athlete's full name\"\n />\n </FormField>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-3\">\n <FormField\n label=\"Contact name\"\n htmlFor=\"contactName\"\n hint=\"Parent or guardian, if applicable.\"\n >\n <input\n id=\"contactName\"\n className={fieldInputClass}\n value={state.contactName}\n onChange={(e) => set('contactName', e.target.value)}\n />\n </FormField>\n <FormField label=\"Contact email\" htmlFor=\"contactEmail\">\n <input\n id=\"contactEmail\"\n type=\"email\"\n className={fieldInputClass}\n value={state.contactEmail}\n onChange={(e) => set('contactEmail', e.target.value)}\n />\n </FormField>\n <FormField label=\"Contact phone\" htmlFor=\"contactPhone\">\n <input\n id=\"contactPhone\"\n type=\"tel\"\n className={fieldInputClass}\n value={state.contactPhone}\n onChange={(e) => set('contactPhone', e.target.value)}\n />\n </FormField>\n </div>\n </section>\n\n {fields.length > 0 && (\n <section className=\"space-y-4\" aria-labelledby=\"reg-questions\">\n <h2 id=\"reg-questions\" className=\"text-base font-semibold text-text-primary\">\n Questions\n </h2>\n {fields.map((field) => (\n <QuestionInput\n key={field.id}\n field={field}\n value={state.answers[field.key]}\n onChange={(value) => set('answers', { ...state.answers, [field.key]: value })}\n />\n ))}\n </section>\n )}\n\n {fees.length > 0 && (\n <section className=\"space-y-3\" aria-labelledby=\"reg-fees\">\n <h2 id=\"reg-fees\" className=\"text-base font-semibold text-text-primary\">\n Fees\n </h2>\n <ul className=\"divide-y divide-border-seam rounded-lg border border-border-seam\">\n {fees.map((fee) => {\n const optional = fee.feeType === 'OPTIONAL';\n const checked = !optional || state.optionalFeeIds.includes(fee.id);\n return (\n <li key={fee.id} className=\"flex items-center justify-between gap-3 px-4 py-3\">\n <label className=\"flex items-start gap-2.5 text-sm text-text-primary\">\n <input\n type=\"checkbox\"\n checked={checked}\n disabled={!optional}\n aria-label={`${fee.name}${optional ? ' (optional)' : ' (required)'}`}\n onChange={(e) =>\n set(\n 'optionalFeeIds',\n e.target.checked\n ? [...state.optionalFeeIds, fee.id]\n : state.optionalFeeIds.filter((feeId) => feeId !== fee.id)\n )\n }\n className=\"mt-0.5 h-4 w-4 rounded border-border-seam text-action-primary-bg focus:ring-[var(--color-focus-ring)] disabled:opacity-60\"\n />\n <span>\n {fee.name}\n <span className=\"ml-1.5 text-xs text-text-secondary\">\n {optional ? 'Optional' : 'Required'}\n </span>\n {fee.description && (\n <span className=\"block text-xs text-text-secondary\">{fee.description}</span>\n )}\n </span>\n </label>\n <span className=\"text-sm font-medium tabular-nums text-text-primary\">\n {formatMoney(fee.amount, currency)}\n </span>\n </li>\n );\n })}\n <li className=\"flex items-center justify-between px-4 py-3 text-sm font-semibold text-text-primary\">\n <span>Total due</span>\n <span className=\"tabular-nums\" data-testid=\"registration-total\">\n {formatMoney(total, currency)}\n </span>\n </li>\n </ul>\n </section>\n )}\n\n {waiverText && (\n <section className=\"space-y-3\" aria-labelledby=\"reg-waiver\">\n <h2 id=\"reg-waiver\" className=\"text-base font-semibold text-text-primary\">\n Waiver\n </h2>\n <p className=\"whitespace-pre-line rounded-lg border border-border-seam bg-bg-sunken p-4 text-sm text-text-secondary\">\n {waiverText}\n </p>\n <label className=\"flex items-center gap-2.5 text-sm text-text-primary\">\n <input\n type=\"checkbox\"\n checked={state.waiverAccepted}\n onChange={(e) => set('waiverAccepted', e.target.checked)}\n className=\"h-4 w-4 rounded border-border-seam text-action-primary-bg focus:ring-[var(--color-focus-ring)]\"\n />\n I have read and accept the waiver\n <span className=\"text-status-error-text\">*</span>\n </label>\n </section>\n )}\n </div>\n );\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { AthRegistrationAnswerValue, AthRegistrationFee, AthRegistrationField } from '../../types/registration';
|
|
2
|
+
|
|
3
|
+
export interface RegistrationEntryState {
|
|
4
|
+
participantName: string;
|
|
5
|
+
contactName: string;
|
|
6
|
+
contactEmail: string;
|
|
7
|
+
contactPhone: string;
|
|
8
|
+
answers: Record<string, AthRegistrationAnswerValue>;
|
|
9
|
+
optionalFeeIds: string[];
|
|
10
|
+
waiverAccepted: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare const EMPTY_REGISTRATION_ENTRY: RegistrationEntryState;
|
|
13
|
+
/** Total due for the current fee selection, in minor units. */
|
|
14
|
+
export declare function registrationTotal(fees: AthRegistrationFee[], optionalFeeIds: string[]): number;
|
|
15
|
+
/**
|
|
16
|
+
* Client-side pre-check mirroring the server's required-answer rule, so the
|
|
17
|
+
* family sees what is missing before a round trip. The server stays the
|
|
18
|
+
* authority on every rule.
|
|
19
|
+
*/
|
|
20
|
+
export declare function missingRequiredAnswer(fields: AthRegistrationField[], state: RegistrationEntryState): string | null;
|
|
21
|
+
/** Strip blank answers so optional unanswered questions are simply omitted. */
|
|
22
|
+
export declare function cleanAnswers(answers: Record<string, AthRegistrationAnswerValue>): Record<string, AthRegistrationAnswerValue>;
|
|
23
|
+
//# sourceMappingURL=entryRules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entryRules.d.ts","sourceRoot":"","sources":["../../../../src/atheletebridge/components/registration/entryRules.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,0BAA0B,EAC1B,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;IACpD,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,eAAO,MAAM,wBAAwB,EAAE,sBAQtC,CAAC;AAEF,+DAA+D;AAC/D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,MAAM,CAI9F;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,oBAAoB,EAAE,EAC9B,KAAK,EAAE,sBAAsB,GAC5B,MAAM,GAAG,IAAI,CAcf;AAED,+EAA+E;AAC/E,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,GAClD,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAM5C"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region src/atheletebridge/components/registration/entryRules.ts
|
|
2
|
+
var e = {
|
|
3
|
+
participantName: "",
|
|
4
|
+
contactName: "",
|
|
5
|
+
contactEmail: "",
|
|
6
|
+
contactPhone: "",
|
|
7
|
+
answers: {},
|
|
8
|
+
optionalFeeIds: [],
|
|
9
|
+
waiverAccepted: !1
|
|
10
|
+
};
|
|
11
|
+
function t(e, t) {
|
|
12
|
+
return e.filter((e) => e.feeType === "REQUIRED" || t.includes(e.id)).reduce((e, t) => e + t.amount, 0);
|
|
13
|
+
}
|
|
14
|
+
function n(e, t) {
|
|
15
|
+
if (!t.participantName.trim()) return "Participant name";
|
|
16
|
+
for (let n of e) {
|
|
17
|
+
if (!n.required) continue;
|
|
18
|
+
let e = t.answers[n.key];
|
|
19
|
+
if (n.fieldType === "CHECKBOX" ? e !== !0 : e === void 0 || String(e).trim() === "") return n.label;
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
function r(e) {
|
|
24
|
+
return Object.fromEntries(Object.entries(e).filter(([, e]) => !(typeof e == "string" && e.trim() === "")));
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
export { e as EMPTY_REGISTRATION_ENTRY, r as cleanAnswers, n as missingRequiredAnswer, t as registrationTotal };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=entryRules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entryRules.js","names":[],"sources":["../../../../src/atheletebridge/components/registration/entryRules.ts"],"sourcesContent":["/**\n * Pure rules for the registration entry form (BOFF-4135).\n * @module atheletebridge/components/registration\n */\n\nimport type {\n AthRegistrationAnswerValue,\n AthRegistrationFee,\n AthRegistrationField,\n} from '../../types/registration';\n\nexport interface RegistrationEntryState {\n participantName: string;\n contactName: string;\n contactEmail: string;\n contactPhone: string;\n answers: Record<string, AthRegistrationAnswerValue>;\n optionalFeeIds: string[];\n waiverAccepted: boolean;\n}\n\nexport const EMPTY_REGISTRATION_ENTRY: RegistrationEntryState = {\n participantName: '',\n contactName: '',\n contactEmail: '',\n contactPhone: '',\n answers: {},\n optionalFeeIds: [],\n waiverAccepted: false,\n};\n\n/** Total due for the current fee selection, in minor units. */\nexport function registrationTotal(fees: AthRegistrationFee[], optionalFeeIds: string[]): number {\n return fees\n .filter((fee) => fee.feeType === 'REQUIRED' || optionalFeeIds.includes(fee.id))\n .reduce((total, fee) => total + fee.amount, 0);\n}\n\n/**\n * Client-side pre-check mirroring the server's required-answer rule, so the\n * family sees what is missing before a round trip. The server stays the\n * authority on every rule.\n */\nexport function missingRequiredAnswer(\n fields: AthRegistrationField[],\n state: RegistrationEntryState\n): string | null {\n if (!state.participantName.trim()) return 'Participant name';\n for (const field of fields) {\n if (!field.required) continue;\n const value = state.answers[field.key];\n if (\n field.fieldType === 'CHECKBOX'\n ? value !== true\n : value === undefined || String(value).trim() === ''\n ) {\n return field.label;\n }\n }\n return null;\n}\n\n/** Strip blank answers so optional unanswered questions are simply omitted. */\nexport function cleanAnswers(\n answers: Record<string, AthRegistrationAnswerValue>\n): Record<string, AthRegistrationAnswerValue> {\n return Object.fromEntries(\n Object.entries(answers).filter(\n ([, value]) => !(typeof value === 'string' && value.trim() === '')\n )\n );\n}\n"],"mappings":";AAqBA,IAAa,IAAmD;CAC9D,iBAAiB;CACjB,aAAa;CACb,cAAc;CACd,cAAc;CACd,SAAS,CAAC;CACV,gBAAgB,CAAC;CACjB,gBAAgB;AAClB;AAGA,SAAgB,EAAkB,GAA4B,GAAkC;CAC9F,OAAO,EACJ,QAAQ,MAAQ,EAAI,YAAY,cAAc,EAAe,SAAS,EAAI,EAAE,CAAC,EAC7E,QAAQ,GAAO,MAAQ,IAAQ,EAAI,QAAQ,CAAC;AACjD;AAOA,SAAgB,EACd,GACA,GACe;CACf,IAAI,CAAC,EAAM,gBAAgB,KAAK,GAAG,OAAO;CAC1C,KAAK,IAAM,KAAS,GAAQ;EAC1B,IAAI,CAAC,EAAM,UAAU;EACrB,IAAM,IAAQ,EAAM,QAAQ,EAAM;EAClC,IACE,EAAM,cAAc,aAChB,MAAU,KACV,MAAU,KAAA,KAAa,OAAO,CAAK,EAAE,KAAK,MAAM,IAEpD,OAAO,EAAM;CAEjB;CACA,OAAO;AACT;AAGA,SAAgB,EACd,GAC4C;CAC5C,OAAO,OAAO,YACZ,OAAO,QAAQ,CAAO,EAAE,QACrB,GAAG,OAAW,EAAE,OAAO,KAAU,YAAY,EAAM,KAAK,MAAM,GACjE,CACF;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AthAgentRun, AthAgentRunConnection, AthAgentRunOverride, AthAiAssessment, AthAiModelInfo, AthAvailability, AthCompleteSessionInput, AthCreateFixtureInput, AthCreateProgramInput, AthCreateTeamInput, AthAddMemberInput, AthAddDrillInput, AthBookSessionInput, AthDrill, AthFixture,
|
|
1
|
+
import { AthAgentRun, AthAgentRunConnection, AthAgentRunOverride, AthAiAssessment, AthAiModelInfo, AthAvailability, AthCompleteSessionInput, AthCreateFixtureInput, AthCreateProgramInput, AthCreateTeamInput, AthAddMemberInput, AthAddDrillInput, AthBookSessionInput, AthDrill, AthFixture, AthFixtureStatus, AthGenerateProgramInput, AthGenerateProgramResult, AthLogWorkoutInput, AthMember, AthMemberStatus, AthPerformanceMetric, AthPlanAdjustment, AthProgram, AthProgramConnection, AthProgramLevel, AthProgramStatus, AthRecordMetricInput, AthRecordResultInput, AthSession, AthSessionConnection, AthSessionStatus, AthSetAvailabilityInput, AthSport, AthStanding, AthTeam, AthTeamConnection, AthTeamStatus, AthUpdateProgramInput, AthUpdateTeamInput, AthWorkoutLog, AthWorkoutLogConnection, AthWorkspaceAiConfig, PaginationInput } from '../types';
|
|
2
2
|
|
|
3
3
|
/** `extensions.code` for an upstream AI provider that is down or unconfigured. */
|
|
4
4
|
export declare const AI_PROVIDER_UNAVAILABLE = "AI_PROVIDER_UNAVAILABLE";
|
|
@@ -22,6 +22,7 @@ export declare class AthApiError extends Error {
|
|
|
22
22
|
}
|
|
23
23
|
/** Whether an unknown thrown value is an AI-provider outage we can explain. */
|
|
24
24
|
export declare const isAiProviderUnavailable: (error: unknown) => error is AthApiError;
|
|
25
|
+
export declare const athQuery: <TData>(query: string, variables: Record<string, unknown>, baseUrl?: string) => Promise<TData>;
|
|
25
26
|
export interface TeamFilters {
|
|
26
27
|
sport?: AthSport;
|
|
27
28
|
status?: AthTeamStatus;
|
|
@@ -43,7 +44,10 @@ export interface FixtureFilters {
|
|
|
43
44
|
teamId?: string;
|
|
44
45
|
pagination?: PaginationInput;
|
|
45
46
|
}
|
|
46
|
-
export declare const useFixtures: (filters?: FixtureFilters) => import('@tanstack/react-query').UseQueryResult<NoInfer<
|
|
47
|
+
export declare const useFixtures: (filters?: FixtureFilters) => import('@tanstack/react-query').UseQueryResult<NoInfer<{
|
|
48
|
+
items: AthFixture[];
|
|
49
|
+
pageInfo: import('../types').AthPageInfo;
|
|
50
|
+
}>, Error>;
|
|
47
51
|
export declare const useFixture: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<NoInfer<AthFixture | null>, Error>;
|
|
48
52
|
export declare const useStandings: (competition: string | undefined) => import('@tanstack/react-query').UseQueryResult<NoInfer<AthStanding[]>, Error>;
|
|
49
53
|
export declare const useScheduleFixture: () => import('@tanstack/react-query').UseMutationResult<AthFixture, Error, AthCreateFixtureInput, unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAthleteBridgeApi.d.ts","sourceRoot":"","sources":["../../../src/atheletebridge/hooks/useAthleteBridgeApi.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"useAthleteBridgeApi.d.ts","sourceRoot":"","sources":["../../../src/atheletebridge/hooks/useAthleteBridgeApi.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAcH,OAAO,KAAK,EACV,WAAW,EACX,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,eAAe,EAEf,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,QAAQ,EACR,UAAU,EAEV,gBAAgB,EAChB,uBAAuB,EACvB,wBAAwB,EACxB,kBAAkB,EAClB,SAAS,EAET,eAAe,EACf,oBAAoB,EAEpB,iBAAiB,EACjB,UAAU,EACV,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,EACvB,QAAQ,EACR,WAAW,EAEX,OAAO,EACP,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EACb,uBAAuB,EACvB,oBAAoB,EACpB,eAAe,EAChB,MAAM,UAAU,CAAC;AAMlB,kFAAkF;AAClF,eAAO,MAAM,uBAAuB,4BAA4B,CAAC;AAEjE;;;;;;;;;;GAUG;AACH,qBAAa,WAAY,SAAQ,KAAK;IACpC,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,yEAAyE;IACzE,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;gBAEvB,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAQlE;AAED,+EAA+E;AAC/E,eAAO,MAAM,uBAAuB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,WACM,CAAC;AAMzE,eAAO,MAAM,QAAQ,GAAU,KAAK,EAClC,OAAO,MAAM,EACb,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,UAAU,MAAM,KACf,OAAO,CAAC,KAAK,CA2Bf,CAAC;AAiGF,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,eAAO,MAAM,QAAQ,GAAI,UAAS,WAAgB,sFAsBjD,CAAC;AAEF,eAAO,MAAM,OAAO,GAAI,IAAI,MAAM,GAAG,SAAS,mFAyB7C,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,GAAG,SAAS,EAAE,SAAS,eAAe,gFAgBlF,CAAC;AAEF,eAAO,MAAM,aAAa,sGAkBzB,CAAC;AAEF,eAAO,MAAM,aAAa;QAIkB,MAAM;WAAS,kBAAkB;WAe5E,CAAC;AAEF,eAAO,MAAM,cAAc,0FAgB1B,CAAC;AAEF,eAAO,MAAM,YAAY,uGAqBxB,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,uFAiB9C,CAAC;AAMF,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,eAAO,MAAM,WAAW,GAAI,UAAS,cAAmB;;;UAyBvD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,IAAI,MAAM,GAAG,SAAS,sFAgBhD,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,aAAa,MAAM,GAAG,SAAS,kFAgB3D,CAAC;AAEF,eAAO,MAAM,kBAAkB,4GAkB9B,CAAC;AAEF,eAAO,MAAM,sBAAsB;QAIS,MAAM;WAAS,oBAAoB;WAgB9E,CAAC;AAMF,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,eAAO,MAAM,WAAW,GAAI,UAAS,cAAmB,yFAuBvD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,IAAI,MAAM,GAAG,SAAS,sFAmBhD,CAAC;AAEF,eAAO,MAAM,gBAAgB,4GAkB5B,CAAC;AAEF,eAAO,MAAM,gBAAgB;QAIe,MAAM;WAAS,qBAAqB;WAe/E,CAAC;AAEF,eAAO,MAAM,oBAAoB;QAIY,MAAM;YAAU,gBAAgB;WAe5E,CAAC;AAEF,eAAO,MAAM,iBAAiB,0FAgB7B,CAAC;AAEF,eAAO,MAAM,WAAW,qGAoBvB,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,YAAY,MAAM,uFAgBhD,CAAC;AAMF,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,eAAO,MAAM,WAAW,GAAI,UAAS,cAAmB,yFAuBvD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,IAAI,MAAM,GAAG,SAAS,sFAgBhD,CAAC;AAEF,eAAO,MAAM,cAAc,0GAkB1B,CAAC;AAEF,eAAO,MAAM,iBAAiB,6FAmB7B,CAAC;AAEF,eAAO,MAAM,kBAAkB;QAIa,MAAM;YAAU,uBAAuB;WAelF,CAAC;AAEF,eAAO,MAAM,gBAAgB,6FAmB5B,CAAC;AAMF,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,eAAO,MAAM,cAAc,GAAI,UAAS,iBAAsB,4FAsB7D,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAChC,WAAW,MAAM,GAAG,SAAS,EAC7B,aAAa,eAAe,2FAmB7B,CAAC;AAEF,eAAO,MAAM,aAAa,4GAkBzB,CAAC;AAEF,eAAO,MAAM,eAAe,qHAkB3B,CAAC;AAYF,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,+DAA+D;AAC/D,eAAO,MAAM,eAAe,GAAI,SAAS,mBAAmB,sFAoB3D,CAAC;AAEF,eAAO,MAAM,kBAAkB,mHAoB9B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB;gBAGU,MAAM;gBAAc,MAAM;WAWrE,CAAC;AAYF;;;;GAIG;AACH,eAAO,MAAM,aAAa,eAGT,IAAI,KAAG,OAAO,CAAC,MAAM,CA6CrC,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,IAAI,MAAM,GAAG,SAAS,4FAiB7C,CAAC;AAOF,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qFAAqF;AACrF,eAAO,MAAM,iBAAiB,GAAI,MAAM,aAAa,KAAG,MAMvD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,oFAsB3C,CAAC;AAUF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,KAAK,aAAa,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,iGAkD1E,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,mEAAmE;IACnE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,KAAK,MAAM,GAAG,SAAS,CAAC;IAC9D,4DAA4D;IAC5D,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACvE;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,KAAK,aAAa,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,KAAG,aAUhF,CAAC;AASF,MAAM,MAAM,YAAY,GACtB,cAAc,GAAG,cAAc,GAAG,iBAAiB,GAAG,mBAAmB,GAAG,mBAAmB,CAAC;AAElG,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;CACxD;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB,GAAI,iDAM/B,mBAAmB,KAAG,YAAY,EAyEa,CAAC;AAQnD,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,6DAA6D;IAC7D,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,MAAM,GAAG,SAAS,EAC1B,UAAU,MAAM,GAAG,SAAS,KAC3B,cA4BF,CAAC;AAOF,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,yDAAyD;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,kBAAkB,EAAE,CAAC;IACvC,aAAa,EAAE,aAAa,EAAE,CAAC;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,6EAA6E;IAC7E,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACvE,kFAAkF;IAClF,aAAa,EAAE,mBAAmB,EAAE,CAAC;IACrC,+EAA+E;IAC/E,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB;;;;OAIG;IACH,mBAAmB,EAAE,OAAO,CAAC;IAC7B,wEAAwE;IACxE,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,6CAA6C;IAC7C,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,uDAAuD;IACvD,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAgCD,gEAAgE;AAChE,eAAO,MAAM,iBAAiB,GAAI,UAAS,qBAA0B,KAAG,cAmMvE,CAAC;AAkBF,gFAAgF;AAChF,eAAO,MAAM,iBAAiB,wFAiB7B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,mGAehC,CAAC;AAEF,eAAO,MAAM,sBAAsB;cAIqB,MAAM;WAAS,MAAM;WAc5E,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,wGAkBpC,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAWD;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,UAAS,eAAoB,0FAoBzD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,IAAI,MAAM,GAAG,SAAS,uFAiBjD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAI,IAAI,MAAM,GAAG,SAAS;aAMqB,OAAO;kBAanF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,4HAyB9B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,4BAA4B;eASxB,MAAM;eACN,MAAM;wBACG,MAAM;WAqB/B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB;WAUnB,MAAM;eACF,MAAM;gBACL,eAAe;UACrB,MAAM;WAqBjB,CAAC;AAMF,eAAO,MAAM,SAAS,qEAarB,CAAC"}
|