@fuego-systems/react 0.1.6 → 0.1.8

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.
@@ -1,5 +1,5 @@
1
1
  import type { Duration } from '@medplum/fhirtypes';
2
- import type { JSX } from 'react';
2
+ import { type JSX } from 'react';
3
3
  /** A single protocol action entry to display in the card. */
4
4
  export interface HealthcareServiceAction {
5
5
  /** Unique identifier for this action. */
@@ -12,6 +12,12 @@ export interface HealthcareServiceAction {
12
12
  readonly question?: string;
13
13
  /** FHIR Duration for this action. */
14
14
  readonly duration?: Duration;
15
+ /**
16
+ * Whether this action is pre-selected in a configured protocol-group.
17
+ * When `true`, overrides `isDefault` for initial selection.
18
+ * `undefined` means the PD was not configured — fall back to `isDefault`.
19
+ */
20
+ readonly prechecked?: boolean;
15
21
  /** Optional addons (sub-actions with `any` selection). */
16
22
  readonly addons?: readonly HealthcareServiceAction[];
17
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"HealthcareServiceCard.d.ts","sourceRoot":"","sources":["../../src/HealthcareServiceCard/HealthcareServiceCard.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAKhC,6DAA6D;AAC7D,MAAM,WAAW,uBAAuB;IACtC,yCAAyC;IACzC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,0CAA0C;IAC1C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,wDAAwD;IACxD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,mDAAmD;IACnD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,uBAAuB,EAAE,CAAA;CACrD;AAED,MAAM,WAAW,0BAA0B;IACzC,4BAA4B;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,iDAAiD;IACjD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,yDAAyD;IACzD,QAAQ,CAAC,OAAO,EAAE,SAAS,uBAAuB,EAAE,CAAA;IACpD,uDAAuD;IACvD,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;IACpD,2CAA2C;IAC3C,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IAC9E,+EAA+E;IAC/E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACnC;AAiCD,wBAAgB,qBAAqB,CAAE,EACrC,IAAI,EACJ,SAAS,EACT,OAAO,EACP,cAAc,EACd,cAAc,EACd,gBAAgB,EACjB,EAAE,0BAA0B,GAAG,GAAG,CAAC,OAAO,CAwK1C"}
1
+ {"version":3,"file":"HealthcareServiceCard.d.ts","sourceRoot":"","sources":["../../src/HealthcareServiceCard/HealthcareServiceCard.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAc,EAAY,KAAK,GAAG,EAAE,MAAM,OAAO,CAAA;AAIjD,6DAA6D;AAC7D,MAAM,WAAW,uBAAuB;IACtC,yCAAyC;IACzC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,0CAA0C;IAC1C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,wDAAwD;IACxD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,mDAAmD;IACnD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,uBAAuB,EAAE,CAAA;CACrD;AAED,MAAM,WAAW,0BAA0B;IACzC,4BAA4B;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,iDAAiD;IACjD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,yDAAyD;IACzD,QAAQ,CAAC,OAAO,EAAE,SAAS,uBAAuB,EAAE,CAAA;IACpD,uDAAuD;IACvD,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;IACpD,2CAA2C;IAC3C,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IAC9E,+EAA+E;IAC/E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACnC;AAiCD,wBAAgB,qBAAqB,CAAE,EACrC,IAAI,EACJ,SAAS,EACT,OAAO,EACP,cAAc,EACd,cAAc,EACd,gBAAgB,EACjB,EAAE,0BAA0B,GAAG,GAAG,CAAC,OAAO,CAwL1C"}
@@ -16,10 +16,24 @@ function CheckIcon(props) {
16
16
  }
17
17
  // ─── Component ───────────────────────────────────────────────────────────────
18
18
  export function HealthcareServiceCard({ name, specialty, actions, onActionChange, onAddonsChange, selectedActionId }) {
19
- var _a, _b;
20
- const defaultAction = (_a = actions.find((a) => a.isDefault)) !== null && _a !== void 0 ? _a : actions[0];
21
- const [selected, setSelected] = useState((_b = selectedActionId !== null && selectedActionId !== void 0 ? selectedActionId : defaultAction === null || defaultAction === void 0 ? void 0 : defaultAction.id) !== null && _b !== void 0 ? _b : '');
22
- const [selectedAddons, setSelectedAddons] = useState({});
19
+ var _a, _b, _c;
20
+ // Prefer explicitly prechecked action, then isDefault, then first
21
+ const initialAction = (_b = (_a = actions.find((a) => a.prechecked === true)) !== null && _a !== void 0 ? _a : actions.find((a) => a.isDefault)) !== null && _b !== void 0 ? _b : actions[0];
22
+ const [selected, setSelected] = useState((_c = selectedActionId !== null && selectedActionId !== void 0 ? selectedActionId : initialAction === null || initialAction === void 0 ? void 0 : initialAction.id) !== null && _c !== void 0 ? _c : '');
23
+ // Derive initial addon state from prechecked sub-actions
24
+ const [selectedAddons, setSelectedAddons] = useState(() => {
25
+ var _a;
26
+ const initial = {};
27
+ for (const action of actions) {
28
+ const precheckedAddons = ((_a = action.addons) !== null && _a !== void 0 ? _a : [])
29
+ .filter((a) => a.prechecked === true)
30
+ .map((a) => a.id);
31
+ if (precheckedAddons.length > 0) {
32
+ initial[action.id] = precheckedAddons;
33
+ }
34
+ }
35
+ return initial;
36
+ });
23
37
  const handleChange = (value) => {
24
38
  setSelected(value);
25
39
  onActionChange === null || onActionChange === void 0 ? void 0 : onActionChange(value);
@@ -42,7 +56,7 @@ export function HealthcareServiceCard({ name, specialty, actions, onActionChange
42
56
  const dur = formatDuration(action.duration);
43
57
  const addons = (_a = action.addons) !== null && _a !== void 0 ? _a : [];
44
58
  const parentAddons = (_b = selectedAddons[action.id]) !== null && _b !== void 0 ? _b : [];
45
- return (_jsxs(Stack, { gap: 4, children: [_jsxs(Group, { gap: "sm", wrap: "nowrap", align: "center", children: [_jsx(Text, { component: "span", size: "sm", c: "dark", style: { flex: 1, minWidth: 0, display: 'block' }, truncate: true, children: action.label }), dur && (_jsx(Text, { component: "span", size: "xs", c: "dimmed", style: { flexShrink: 0 }, children: dur }))] }), action.question && (_jsx(Text, { component: "span", size: "xs", c: "dimmed", style: { display: 'block' }, children: action.question })), addons.length > 0 && (_jsx(Stack, { gap: 2, children: addons.map((addon) => (_jsx(Switch, { checked: parentAddons.includes(addon.id), onChange: (e) => handleAddonToggle(action.id, addon.id, e.currentTarget.checked), size: "xs", label: _jsxs("span", { children: [_jsx(Text, { component: "span", size: "xs", fw: 500, style: { display: 'block' }, children: addon.label }), addon.question && (_jsx(Text, { component: "span", size: "xs", c: "dimmed", style: { display: 'block' }, children: addon.question }))] }), styles: {
59
+ return (_jsxs(Stack, { gap: 4, children: [_jsxs(Group, { gap: "sm", wrap: "nowrap", align: "flex-start", children: [_jsx(Text, { component: "span", size: "sm", c: "dark", style: { flex: 1, minWidth: 0, display: 'block' }, children: action.label }), dur && (_jsx(Text, { component: "span", size: "xs", c: "dimmed", style: { flexShrink: 0 }, children: dur }))] }), action.question && (_jsx(Text, { component: "span", size: "xs", c: "dimmed", style: { display: 'block' }, children: action.question })), addons.length > 0 && (_jsx(Stack, { gap: 2, children: addons.map((addon) => (_jsx(Switch, { checked: parentAddons.includes(addon.id), onChange: (e) => handleAddonToggle(action.id, addon.id, e.currentTarget.checked), size: "xs", label: _jsxs("span", { children: [_jsx(Text, { component: "span", size: "xs", fw: 500, style: { display: 'block' }, children: addon.label }), addon.question && (_jsx(Text, { component: "span", size: "xs", c: "dimmed", style: { display: 'block' }, children: addon.question }))] }), styles: {
46
60
  root: { cursor: 'pointer' },
47
61
  track: { cursor: 'pointer' },
48
62
  label: { cursor: 'pointer', paddingLeft: 6 },
@@ -61,7 +75,7 @@ export function HealthcareServiceCard({ name, specialty, actions, onActionChange
61
75
  backgroundColor: isSelected
62
76
  ? 'var(--mantine-color-white)'
63
77
  : 'var(--mantine-color-gray-0)',
64
- }, children: [_jsxs(Stack, { gap: 2, children: [_jsxs(Group, { gap: "sm", wrap: "nowrap", align: "center", children: [_jsx(Radio.Indicator, { icon: CheckIcon, size: "xs", style: { flexShrink: 0 } }), _jsx(Text, { component: "span", size: "sm", c: "dark", style: { flex: 1, minWidth: 0, display: 'block' }, truncate: true, children: action.label }), dur && (_jsx(Text, { component: "span", size: "xs", c: "dimmed", style: { flexShrink: 0 }, children: dur }))] }), action.question && (_jsx(Text, { component: "span", size: "xs", c: "dimmed", ml: 28, style: { display: 'block' }, children: action.question }))] }), isSelected && addons.length > 0 && (_jsx(Stack, { gap: 2, mt: 6, ml: 28, children: addons.map((addon) => (_jsx(Switch, { checked: parentAddons.includes(addon.id), onChange: (e) => handleAddonToggle(action.id, addon.id, e.currentTarget.checked), size: "xs", label: _jsxs("span", { children: [_jsx(Text, { component: "span", size: "xs", fw: 500, style: { display: 'block' }, children: addon.label }), addon.question && (_jsx(Text, { component: "span", size: "xs", c: "dimmed", style: { display: 'block' }, children: addon.question }))] }), styles: {
78
+ }, children: [_jsxs(Stack, { gap: 2, children: [_jsxs(Group, { gap: "sm", wrap: "nowrap", align: "flex-start", children: [_jsx(Radio.Indicator, { icon: CheckIcon, size: "xs", style: { flexShrink: 0 } }), _jsx(Text, { component: "span", size: "sm", c: "dark", style: { flex: 1, minWidth: 0, display: 'block' }, children: action.label }), dur && (_jsx(Text, { component: "span", size: "xs", c: "dimmed", style: { flexShrink: 0 }, children: dur }))] }), action.question && (_jsx(Text, { component: "span", size: "xs", c: "dimmed", ml: 28, style: { display: 'block' }, children: action.question }))] }), isSelected && addons.length > 0 && (_jsx(Stack, { gap: 2, mt: 6, ml: 28, children: addons.map((addon) => (_jsx(Switch, { checked: parentAddons.includes(addon.id), onChange: (e) => handleAddonToggle(action.id, addon.id, e.currentTarget.checked), size: "xs", label: _jsxs("span", { children: [_jsx(Text, { component: "span", size: "xs", fw: 500, style: { display: 'block' }, children: addon.label }), addon.question && (_jsx(Text, { component: "span", size: "xs", c: "dimmed", style: { display: 'block' }, children: addon.question }))] }), styles: {
65
79
  root: { cursor: 'pointer' },
66
80
  track: { cursor: 'pointer' },
67
81
  label: { cursor: 'pointer', paddingLeft: 6 },
@@ -1 +1 @@
1
- {"version":3,"file":"HealthcareServiceCard.js","sourceRoot":"","sources":["../../src/HealthcareServiceCard/HealthcareServiceCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Badge, Card, Group, Radio, Stack, Switch, Text } from '@mantine/core'\nimport type { Duration } from '@medplum/fhirtypes'\nimport type { JSX } from 'react'\nimport React, { useState } from 'react'\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\n/** A single protocol action entry to display in the card. */\nexport interface HealthcareServiceAction {\n /** Unique identifier for this action. */\n readonly id: string\n /** Whether this is the default action. */\n readonly isDefault: boolean\n /** Display label for the action (e.g. \"Helicoidal\"). */\n readonly label: string\n /** User-facing question / hint for this action. */\n readonly question?: string\n /** FHIR Duration for this action. */\n readonly duration?: Duration\n /** Optional addons (sub-actions with `any` selection). */\n readonly addons?: readonly HealthcareServiceAction[]\n}\n\nexport interface HealthcareServiceCardProps {\n /** Service display name. */\n readonly name: string\n /** Specialty display name (shown as a badge). */\n readonly specialty?: string\n /** Protocol action variants the user can choose from. */\n readonly actions: readonly HealthcareServiceAction[]\n /** Called when the user selects a different action. */\n readonly onActionChange?: (actionId: string) => void\n /** Called when addon selection changes. */\n readonly onAddonsChange?: (parentActionId: string, addonIds: string[]) => void\n /** Override the initially selected action (defaults to the default action). */\n readonly selectedActionId?: string\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction formatDuration (d?: Duration): string | undefined {\n if (d?.value === undefined || d?.value === null) { return undefined }\n const unit = d.unit ?? d.code ?? ''\n return unit ? `${d.value} ${unit}` : String(d.value)\n}\n\nfunction CheckIcon (props: React.ComponentPropsWithoutRef<'svg'> & { size?: string | number }): JSX.Element {\n const { size, style, ...rest } = props\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? 14}\n height={size ?? 14}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={3}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={style}\n {...rest}\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n}\n\n// ─── Component ───────────────────────────────────────────────────────────────\n\nexport function HealthcareServiceCard ({\n name,\n specialty,\n actions,\n onActionChange,\n onAddonsChange,\n selectedActionId\n}: HealthcareServiceCardProps): JSX.Element {\n const defaultAction = actions.find((a) => a.isDefault) ?? actions[0]\n const [selected, setSelected] = useState<string>(\n selectedActionId ?? defaultAction?.id ?? ''\n )\n const [selectedAddons, setSelectedAddons] = useState<Record<string, string[]>>({})\n\n const handleChange = (value: string): void => {\n setSelected(value)\n onActionChange?.(value)\n }\n\n const handleAddonToggle = (parentId: string, addonId: string, checked: boolean): void => {\n setSelectedAddons((prev) => {\n const current = prev[parentId] ?? []\n const next = checked\n ? [...current, addonId]\n : current.filter((id) => id !== addonId)\n const updated = { ...prev, [parentId]: next }\n onAddonsChange?.(parentId, updated[parentId])\n return updated\n })\n }\n\n return (\n <Card withBorder radius=\"md\" padding=\"lg\">\n <Stack gap=\"sm\">\n {/* Header: name + specialty */}\n <Stack gap={4}>\n <Text fw={700} size=\"lg\">{name}</Text>\n {specialty && (\n <Badge variant=\"light\" color=\"blue\" radius=\"sm\" size=\"sm\" style={{ alignSelf: 'flex-start' }}>\n {specialty}\n </Badge>\n )}\n </Stack>\n\n {/* Action variants */}\n {actions.length === 1 && (() => {\n const action = actions[0]\n const dur = formatDuration(action.duration)\n const addons = action.addons ?? []\n const parentAddons = selectedAddons[action.id] ?? []\n return (\n <Stack gap={4}>\n <Group gap=\"sm\" wrap=\"nowrap\" align=\"center\">\n <Text component=\"span\" size=\"sm\" c=\"dark\" style={{ flex: 1, minWidth: 0, display: 'block' }} truncate>{action.label}</Text>\n {dur && (\n <Text component=\"span\" size=\"xs\" c=\"dimmed\" style={{ flexShrink: 0 }}>{dur}</Text>\n )}\n </Group>\n {action.question && (\n <Text component=\"span\" size=\"xs\" c=\"dimmed\" style={{ display: 'block' }}>{action.question}</Text>\n )}\n {addons.length > 0 && (\n <Stack gap={2}>\n {addons.map((addon) => (\n <Switch\n key={addon.id}\n checked={parentAddons.includes(addon.id)}\n onChange={(e) => handleAddonToggle(action.id, addon.id, e.currentTarget.checked)}\n size=\"xs\"\n label={\n <span>\n <Text component=\"span\" size=\"xs\" fw={500} style={{ display: 'block' }}>\n {addon.label}\n </Text>\n {addon.question && (\n <Text component=\"span\" size=\"xs\" c=\"dimmed\" style={{ display: 'block' }}>\n {addon.question}\n </Text>\n )}\n </span>\n }\n styles={{\n root: { cursor: 'pointer' },\n track: { cursor: 'pointer' },\n label: { cursor: 'pointer', paddingLeft: 6 },\n }}\n />\n ))}\n </Stack>\n )}\n </Stack>\n )\n })()}\n {actions.length > 1 && (\n <Radio.Group value={selected} onChange={handleChange}>\n <Stack gap={6}>\n {actions.map((action) => {\n const dur = formatDuration(action.duration)\n const isSelected = action.id === selected\n const addons = action.addons ?? []\n const parentAddons = selectedAddons[action.id] ?? []\n return (\n <Stack key={action.id} gap={0}>\n <Radio.Card\n value={action.id}\n radius=\"md\"\n p=\"xs\"\n withBorder\n style={{\n cursor: 'pointer',\n borderColor: isSelected\n ? 'var(--mantine-color-blue-4)'\n : 'var(--mantine-color-gray-2)',\n backgroundColor: isSelected\n ? 'var(--mantine-color-white)'\n : 'var(--mantine-color-gray-0)',\n }}\n >\n <Stack gap={2}>\n <Group gap=\"sm\" wrap=\"nowrap\" align=\"center\">\n <Radio.Indicator\n icon={CheckIcon}\n size=\"xs\"\n style={{ flexShrink: 0 }}\n />\n <Text component=\"span\" size=\"sm\" c=\"dark\" style={{ flex: 1, minWidth: 0, display: 'block' }} truncate>{action.label}</Text>\n {dur && (\n <Text component=\"span\" size=\"xs\" c=\"dimmed\" style={{ flexShrink: 0 }}>{dur}</Text>\n )}\n </Group>\n {action.question && (\n <Text component=\"span\" size=\"xs\" c=\"dimmed\" ml={28} style={{ display: 'block' }}>{action.question}</Text>\n )}\n </Stack>\n\n {/* Addons (toggles) — inside the selected card */}\n {isSelected && addons.length > 0 && (\n <Stack gap={2} mt={6} ml={28}>\n {addons.map((addon) => (\n <Switch\n key={addon.id}\n checked={parentAddons.includes(addon.id)}\n onChange={(e) => handleAddonToggle(action.id, addon.id, e.currentTarget.checked)}\n size=\"xs\"\n label={\n <span>\n <Text component=\"span\" size=\"xs\" fw={500} style={{ display: 'block' }}>\n {addon.label}\n </Text>\n {addon.question && (\n <Text component=\"span\" size=\"xs\" c=\"dimmed\" style={{ display: 'block' }}>\n {addon.question}\n </Text>\n )}\n </span>\n }\n styles={{\n root: { cursor: 'pointer' },\n track: { cursor: 'pointer' },\n label: { cursor: 'pointer', paddingLeft: 6 },\n }}\n />\n ))}\n </Stack>\n )}\n </Radio.Card>\n </Stack>\n )\n })}\n </Stack>\n </Radio.Group>\n )}\n </Stack>\n </Card>\n )\n}\n"]}
1
+ {"version":3,"file":"HealthcareServiceCard.js","sourceRoot":"","sources":["../../src/HealthcareServiceCard/HealthcareServiceCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Badge, Card, Group, Radio, Stack, Switch, Text } from '@mantine/core'\nimport type { Duration } from '@medplum/fhirtypes'\nimport React, { useState, type JSX } from 'react'\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\n/** A single protocol action entry to display in the card. */\nexport interface HealthcareServiceAction {\n /** Unique identifier for this action. */\n readonly id: string\n /** Whether this is the default action. */\n readonly isDefault: boolean\n /** Display label for the action (e.g. \"Helicoidal\"). */\n readonly label: string\n /** User-facing question / hint for this action. */\n readonly question?: string\n /** FHIR Duration for this action. */\n readonly duration?: Duration\n /**\n * Whether this action is pre-selected in a configured protocol-group.\n * When `true`, overrides `isDefault` for initial selection.\n * `undefined` means the PD was not configured — fall back to `isDefault`.\n */\n readonly prechecked?: boolean\n /** Optional addons (sub-actions with `any` selection). */\n readonly addons?: readonly HealthcareServiceAction[]\n}\n\nexport interface HealthcareServiceCardProps {\n /** Service display name. */\n readonly name: string\n /** Specialty display name (shown as a badge). */\n readonly specialty?: string\n /** Protocol action variants the user can choose from. */\n readonly actions: readonly HealthcareServiceAction[]\n /** Called when the user selects a different action. */\n readonly onActionChange?: (actionId: string) => void\n /** Called when addon selection changes. */\n readonly onAddonsChange?: (parentActionId: string, addonIds: string[]) => void\n /** Override the initially selected action (defaults to the default action). */\n readonly selectedActionId?: string\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction formatDuration (d?: Duration): string | undefined {\n if (d?.value === undefined || d?.value === null) { return undefined }\n const unit = d.unit ?? d.code ?? ''\n return unit ? `${d.value} ${unit}` : String(d.value)\n}\n\nfunction CheckIcon (props: React.ComponentPropsWithoutRef<'svg'> & { size?: string | number }): JSX.Element {\n const { size, style, ...rest } = props\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? 14}\n height={size ?? 14}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={3}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={style}\n {...rest}\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n}\n\n// ─── Component ───────────────────────────────────────────────────────────────\n\nexport function HealthcareServiceCard ({\n name,\n specialty,\n actions,\n onActionChange,\n onAddonsChange,\n selectedActionId\n}: HealthcareServiceCardProps): JSX.Element {\n // Prefer explicitly prechecked action, then isDefault, then first\n const initialAction =\n actions.find((a) => a.prechecked === true) ??\n actions.find((a) => a.isDefault) ??\n actions[0]\n const [selected, setSelected] = useState(\n selectedActionId ?? initialAction?.id ?? ''\n )\n // Derive initial addon state from prechecked sub-actions\n const [selectedAddons, setSelectedAddons] = useState<Record<string, string[]>>(() => {\n const initial: Record<string, string[]> = {}\n for (const action of actions) {\n const precheckedAddons = (action.addons ?? [])\n .filter((a) => a.prechecked === true)\n .map((a) => a.id)\n if (precheckedAddons.length > 0) {\n initial[action.id] = precheckedAddons\n }\n }\n return initial\n })\n\n const handleChange = (value: string): void => {\n setSelected(value)\n onActionChange?.(value)\n }\n\n const handleAddonToggle = (parentId: string, addonId: string, checked: boolean): void => {\n setSelectedAddons((prev) => {\n const current = prev[parentId] ?? []\n const next = checked\n ? [...current, addonId]\n : current.filter((id) => id !== addonId)\n const updated = { ...prev, [parentId]: next }\n onAddonsChange?.(parentId, updated[parentId])\n return updated\n })\n }\n\n return (\n <Card withBorder radius=\"md\" padding=\"lg\">\n <Stack gap=\"sm\">\n {/* Header: name + specialty */}\n <Stack gap={4}>\n <Text fw={700} size=\"lg\">{name}</Text>\n {specialty && (\n <Badge variant=\"light\" color=\"blue\" radius=\"sm\" size=\"sm\" style={{ alignSelf: 'flex-start' }}>\n {specialty}\n </Badge>\n )}\n </Stack>\n\n {/* Action variants */}\n {actions.length === 1 && (() => {\n const action = actions[0]\n const dur = formatDuration(action.duration)\n const addons = action.addons ?? []\n const parentAddons = selectedAddons[action.id] ?? []\n return (\n <Stack gap={4}>\n <Group gap=\"sm\" wrap=\"nowrap\" align=\"flex-start\">\n <Text component=\"span\" size=\"sm\" c=\"dark\" style={{ flex: 1, minWidth: 0, display: 'block' }}>{action.label}</Text>\n {dur && (\n <Text component=\"span\" size=\"xs\" c=\"dimmed\" style={{ flexShrink: 0 }}>{dur}</Text>\n )}\n </Group>\n {action.question && (\n <Text component=\"span\" size=\"xs\" c=\"dimmed\" style={{ display: 'block' }}>{action.question}</Text>\n )}\n {addons.length > 0 && (\n <Stack gap={2}>\n {addons.map((addon) => (\n <Switch\n key={addon.id}\n checked={parentAddons.includes(addon.id)}\n onChange={(e) => handleAddonToggle(action.id, addon.id, e.currentTarget.checked)}\n size=\"xs\"\n label={\n <span>\n <Text component=\"span\" size=\"xs\" fw={500} style={{ display: 'block' }}>\n {addon.label}\n </Text>\n {addon.question && (\n <Text component=\"span\" size=\"xs\" c=\"dimmed\" style={{ display: 'block' }}>\n {addon.question}\n </Text>\n )}\n </span>\n }\n styles={{\n root: { cursor: 'pointer' },\n track: { cursor: 'pointer' },\n label: { cursor: 'pointer', paddingLeft: 6 },\n }}\n />\n ))}\n </Stack>\n )}\n </Stack>\n )\n })()}\n {actions.length > 1 && (\n <Radio.Group value={selected} onChange={handleChange}>\n <Stack gap={6}>\n {actions.map((action) => {\n const dur = formatDuration(action.duration)\n const isSelected = action.id === selected\n const addons = action.addons ?? []\n const parentAddons = selectedAddons[action.id] ?? []\n return (\n <Stack key={action.id} gap={0}>\n <Radio.Card\n value={action.id}\n radius=\"md\"\n p=\"xs\"\n withBorder\n style={{\n cursor: 'pointer',\n borderColor: isSelected\n ? 'var(--mantine-color-blue-4)'\n : 'var(--mantine-color-gray-2)',\n backgroundColor: isSelected\n ? 'var(--mantine-color-white)'\n : 'var(--mantine-color-gray-0)',\n }}\n >\n <Stack gap={2}>\n <Group gap=\"sm\" wrap=\"nowrap\" align=\"flex-start\">\n <Radio.Indicator\n icon={CheckIcon}\n size=\"xs\"\n style={{ flexShrink: 0 }}\n />\n <Text component=\"span\" size=\"sm\" c=\"dark\" style={{ flex: 1, minWidth: 0, display: 'block' }}>{action.label}</Text>\n {dur && (\n <Text component=\"span\" size=\"xs\" c=\"dimmed\" style={{ flexShrink: 0 }}>{dur}</Text>\n )}\n </Group>\n {action.question && (\n <Text component=\"span\" size=\"xs\" c=\"dimmed\" ml={28} style={{ display: 'block' }}>{action.question}</Text>\n )}\n </Stack>\n\n {/* Addons (toggles) — inside the selected card */}\n {isSelected && addons.length > 0 && (\n <Stack gap={2} mt={6} ml={28}>\n {addons.map((addon) => (\n <Switch\n key={addon.id}\n checked={parentAddons.includes(addon.id)}\n onChange={(e) => handleAddonToggle(action.id, addon.id, e.currentTarget.checked)}\n size=\"xs\"\n label={\n <span>\n <Text component=\"span\" size=\"xs\" fw={500} style={{ display: 'block' }}>\n {addon.label}\n </Text>\n {addon.question && (\n <Text component=\"span\" size=\"xs\" c=\"dimmed\" style={{ display: 'block' }}>\n {addon.question}\n </Text>\n )}\n </span>\n }\n styles={{\n root: { cursor: 'pointer' },\n track: { cursor: 'pointer' },\n label: { cursor: 'pointer', paddingLeft: 6 },\n }}\n />\n ))}\n </Stack>\n )}\n </Radio.Card>\n </Stack>\n )\n })}\n </Stack>\n </Radio.Group>\n )}\n </Stack>\n </Card>\n )\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { HealthcareService } from '@medplum/fhirtypes';
2
- import type { JSX, ReactNode } from 'react';
2
+ import { type JSX, type ReactNode } from 'react';
3
3
  export interface HealthcareServiceDirectoryProps {
4
4
  /** Function that fetches all HealthcareService resources to display in the tree. */
5
5
  readonly fetchServices: () => Promise<HealthcareService[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"HealthcareServiceDirectory.d.ts","sourceRoot":"","sources":["../../src/HealthcareServiceDirectory/HealthcareServiceDirectory.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAK3C,MAAM,WAAW,+BAA+B;IAC9C,oFAAoF;IACpF,QAAQ,CAAC,aAAa,EAAE,MAAM,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAA;IAC1D,6CAA6C;IAC7C,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAC1C,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAA;IACxD,sGAAsG;IACtG,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,OAAO,KAAK,SAAS,CAAA;IACrF,iFAAiF;IACjF,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,CAAA;IAC/B,iFAAiF;IACjF,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,CAAA;IACjC,mFAAmF;IACnF,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAA;CAC5B;AA0ED,wBAAgB,0BAA0B,CAAC,EACzC,aAAa,EACb,WAAW,EACX,QAAQ,EACR,aAAa,EACb,UAAU,EACV,YAAY,EACZ,MAAM,GACP,EAAE,+BAA+B,GAAG,GAAG,CAAC,OAAO,CAyG/C"}
1
+ {"version":3,"file":"HealthcareServiceDirectory.d.ts","sourceRoot":"","sources":["../../src/HealthcareServiceDirectory/HealthcareServiceDirectory.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,EAA6C,KAAK,GAAG,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAI3F,MAAM,WAAW,+BAA+B;IAC9C,oFAAoF;IACpF,QAAQ,CAAC,aAAa,EAAE,MAAM,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAA;IAC1D,6CAA6C;IAC7C,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAC1C,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAA;IACxD,sGAAsG;IACtG,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,OAAO,KAAK,SAAS,CAAA;IACrF,iFAAiF;IACjF,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,CAAA;IAC/B,iFAAiF;IACjF,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,CAAA;IACjC,mFAAmF;IACnF,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAA;CAC5B;AA0ED,wBAAgB,0BAA0B,CAAC,EACzC,aAAa,EACb,WAAW,EACX,QAAQ,EACR,aAAa,EACb,UAAU,EACV,YAAY,EACZ,MAAM,GACP,EAAE,+BAA+B,GAAG,GAAG,CAAC,OAAO,CAyG/C"}
@@ -1 +1 @@
1
- {"version":3,"file":"HealthcareServiceDirectory.js","sourceRoot":"","sources":["../../src/HealthcareServiceDirectory/HealthcareServiceDirectory.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Accordion,\n ActionIcon,\n Alert,\n Group,\n Loader,\n Stack,\n Text,\n} from '@mantine/core'\nimport type { HealthcareService } from '@medplum/fhirtypes'\nimport type { JSX, ReactNode } from 'react'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface HealthcareServiceDirectoryProps {\n /** Function that fetches all HealthcareService resources to display in the tree. */\n readonly fetchServices: () => Promise<HealthcareService[]>\n /** Set of currently selected service IDs. */\n readonly selectedIds?: ReadonlySet<string>\n /** Called when the user clicks on a service to select it. */\n readonly onSelect?: (service: HealthcareService) => void\n /** Optional custom renderer for each service row. Receives the service and whether it is selected. */\n readonly renderService?: (service: HealthcareService, selected: boolean) => ReactNode\n /** Icon element for the select button when unselected. Defaults to a \"+\" SVG. */\n readonly selectIcon?: ReactNode\n /** Icon element for the select button when selected. Defaults to a check SVG. */\n readonly selectedIcon?: ReactNode\n /** Content to show at the bottom of the directory (e.g. fallback/contact info). */\n readonly footer?: ReactNode\n}\n\ninterface TreeCategory {\n name: string\n children: TreeSubcategory[]\n}\n\ninterface TreeSubcategory {\n name: string\n services: HealthcareService[]\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction getSpecialty(hs: HealthcareService): string {\n return hs.specialty?.[0]?.coding?.[0]?.display ?? 'Otros'\n}\n\nfunction getCategory(hs: HealthcareService): string {\n return hs.category?.[0]?.coding?.[0]?.display ?? 'General'\n}\n\nfunction buildTree(services: HealthcareService[]): TreeCategory[] {\n const specialtyMap = new Map<string, Map<string, HealthcareService[]>>()\n\n for (const hs of services) {\n const specialty = getSpecialty(hs)\n const category = getCategory(hs)\n\n let catMap = specialtyMap.get(specialty)\n if (!catMap) {\n catMap = new Map()\n specialtyMap.set(specialty, catMap)\n }\n\n let list = catMap.get(category)\n if (!list) {\n list = []\n catMap.set(category, list)\n }\n list.push(hs)\n }\n\n const tree: TreeCategory[] = []\n for (const [specialty, catMap] of specialtyMap) {\n const children: TreeSubcategory[] = []\n for (const [category, svcs] of catMap) {\n children.push({ name: category, services: svcs })\n }\n tree.push({ name: specialty, children })\n }\n\n return tree\n}\n\nfunction PlusIcon(): JSX.Element {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n )\n}\n\nfunction CheckIcon(): JSX.Element {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n}\n\n// ─── Component ───────────────────────────────────────────────────────────────\n\nexport function HealthcareServiceDirectory({\n fetchServices,\n selectedIds,\n onSelect,\n renderService,\n selectIcon,\n selectedIcon,\n footer,\n}: HealthcareServiceDirectoryProps): JSX.Element {\n const [services, setServices] = useState<HealthcareService[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string>()\n\n useEffect(() => {\n let cancelled = false\n setLoading(true)\n setError(undefined)\n\n fetchServices()\n .then((result) => {\n if (!cancelled) {\n setServices(result)\n }\n })\n .catch((err) => {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : String(err))\n }\n })\n .finally(() => {\n if (!cancelled) {\n setLoading(false)\n }\n })\n\n return () => { cancelled = true }\n }, [fetchServices])\n\n const tree = useMemo(() => buildTree(services), [services])\n\n const handleSelect = useCallback(\n (hs: HealthcareService) => {\n if (selectedIds?.has(hs.id ?? '')) {\n return\n }\n onSelect?.(hs)\n },\n [selectedIds, onSelect]\n )\n\n if (loading) {\n return (\n <Stack align=\"center\" py=\"xl\">\n <Loader size=\"md\" />\n </Stack>\n )\n }\n\n if (error) {\n return (\n <Alert color=\"red\" title=\"Error\">\n {error}\n </Alert>\n )\n }\n\n return (\n <Stack gap=\"md\">\n <Accordion variant=\"separated\">\n {tree.map((specialty) => (\n <Accordion.Item key={specialty.name} value={specialty.name}>\n <Accordion.Control>\n <Text fw={500}>{specialty.name}</Text>\n </Accordion.Control>\n <Accordion.Panel>\n {specialty.children.length === 1 ? (\n <ServiceList\n services={specialty.children[0].services}\n selectedIds={selectedIds}\n onSelect={handleSelect}\n renderService={renderService}\n selectIcon={selectIcon}\n selectedIcon={selectedIcon}\n />\n ) : (\n <Accordion variant=\"default\">\n {specialty.children.map((sub) => (\n <Accordion.Item key={sub.name} value={sub.name}>\n <Accordion.Control>\n <Text size=\"sm\">{sub.name}</Text>\n </Accordion.Control>\n <Accordion.Panel>\n <ServiceList\n services={sub.services}\n selectedIds={selectedIds}\n onSelect={handleSelect}\n renderService={renderService}\n selectIcon={selectIcon}\n selectedIcon={selectedIcon}\n />\n </Accordion.Panel>\n </Accordion.Item>\n ))}\n </Accordion>\n )}\n </Accordion.Panel>\n </Accordion.Item>\n ))}\n </Accordion>\n\n {footer}\n </Stack>\n )\n}\n\n// ─── ServiceList ─────────────────────────────────────────────────────────────\n\nfunction ServiceList({\n services,\n selectedIds,\n onSelect,\n renderService,\n selectIcon,\n selectedIcon,\n}: {\n services: HealthcareService[]\n selectedIds?: ReadonlySet<string>\n onSelect: (hs: HealthcareService) => void\n renderService?: (hs: HealthcareService, selected: boolean) => ReactNode\n selectIcon?: ReactNode\n selectedIcon?: ReactNode\n}): JSX.Element {\n return (\n <Stack gap=\"xs\">\n {services.map((hs) => {\n const id = hs.id ?? ''\n const selected = selectedIds?.has(id) ?? false\n return (\n <Group key={id} justify=\"space-between\" wrap=\"nowrap\" py={4}>\n {renderService ? (\n renderService(hs, selected)\n ) : (\n <Stack gap={0}>\n <Text size=\"sm\">{hs.name ?? id}</Text>\n {hs.category?.[0]?.coding?.[0]?.display && (\n <Text size=\"xs\" c=\"dimmed\">\n {hs.category[0].coding[0].display}\n </Text>\n )}\n </Stack>\n )}\n <ActionIcon\n variant={selected ? 'filled' : 'light'}\n color={selected ? 'green' : 'blue'}\n onClick={() => onSelect(hs)}\n disabled={selected}\n >\n {selected\n ? (selectedIcon ?? <CheckIcon />)\n : (selectIcon ?? <PlusIcon />)}\n </ActionIcon>\n </Group>\n )\n })}\n </Stack>\n )\n}\n"]}
1
+ {"version":3,"file":"HealthcareServiceDirectory.js","sourceRoot":"","sources":["../../src/HealthcareServiceDirectory/HealthcareServiceDirectory.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Accordion,\n ActionIcon,\n Alert,\n Group,\n Loader,\n Stack,\n Text,\n} from '@mantine/core'\nimport type { HealthcareService } from '@medplum/fhirtypes'\nimport { useCallback, useEffect, useMemo, useState, type JSX, type ReactNode } from 'react'\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface HealthcareServiceDirectoryProps {\n /** Function that fetches all HealthcareService resources to display in the tree. */\n readonly fetchServices: () => Promise<HealthcareService[]>\n /** Set of currently selected service IDs. */\n readonly selectedIds?: ReadonlySet<string>\n /** Called when the user clicks on a service to select it. */\n readonly onSelect?: (service: HealthcareService) => void\n /** Optional custom renderer for each service row. Receives the service and whether it is selected. */\n readonly renderService?: (service: HealthcareService, selected: boolean) => ReactNode\n /** Icon element for the select button when unselected. Defaults to a \"+\" SVG. */\n readonly selectIcon?: ReactNode\n /** Icon element for the select button when selected. Defaults to a check SVG. */\n readonly selectedIcon?: ReactNode\n /** Content to show at the bottom of the directory (e.g. fallback/contact info). */\n readonly footer?: ReactNode\n}\n\ninterface TreeCategory {\n name: string\n children: TreeSubcategory[]\n}\n\ninterface TreeSubcategory {\n name: string\n services: HealthcareService[]\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction getSpecialty(hs: HealthcareService): string {\n return hs.specialty?.[0]?.coding?.[0]?.display ?? 'Otros'\n}\n\nfunction getCategory(hs: HealthcareService): string {\n return hs.category?.[0]?.coding?.[0]?.display ?? 'General'\n}\n\nfunction buildTree(services: HealthcareService[]): TreeCategory[] {\n const specialtyMap = new Map<string, Map<string, HealthcareService[]>>()\n\n for (const hs of services) {\n const specialty = getSpecialty(hs)\n const category = getCategory(hs)\n\n let catMap = specialtyMap.get(specialty)\n if (!catMap) {\n catMap = new Map()\n specialtyMap.set(specialty, catMap)\n }\n\n let list = catMap.get(category)\n if (!list) {\n list = []\n catMap.set(category, list)\n }\n list.push(hs)\n }\n\n const tree: TreeCategory[] = []\n for (const [specialty, catMap] of specialtyMap) {\n const children: TreeSubcategory[] = []\n for (const [category, svcs] of catMap) {\n children.push({ name: category, services: svcs })\n }\n tree.push({ name: specialty, children })\n }\n\n return tree\n}\n\nfunction PlusIcon(): JSX.Element {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n )\n}\n\nfunction CheckIcon(): JSX.Element {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n}\n\n// ─── Component ───────────────────────────────────────────────────────────────\n\nexport function HealthcareServiceDirectory({\n fetchServices,\n selectedIds,\n onSelect,\n renderService,\n selectIcon,\n selectedIcon,\n footer,\n}: HealthcareServiceDirectoryProps): JSX.Element {\n const [services, setServices] = useState<HealthcareService[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string>()\n\n useEffect(() => {\n let cancelled = false\n setLoading(true)\n setError(undefined)\n\n fetchServices()\n .then((result) => {\n if (!cancelled) {\n setServices(result)\n }\n })\n .catch((err) => {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : String(err))\n }\n })\n .finally(() => {\n if (!cancelled) {\n setLoading(false)\n }\n })\n\n return () => { cancelled = true }\n }, [fetchServices])\n\n const tree = useMemo(() => buildTree(services), [services])\n\n const handleSelect = useCallback(\n (hs: HealthcareService) => {\n if (selectedIds?.has(hs.id ?? '')) {\n return\n }\n onSelect?.(hs)\n },\n [selectedIds, onSelect]\n )\n\n if (loading) {\n return (\n <Stack align=\"center\" py=\"xl\">\n <Loader size=\"md\" />\n </Stack>\n )\n }\n\n if (error) {\n return (\n <Alert color=\"red\" title=\"Error\">\n {error}\n </Alert>\n )\n }\n\n return (\n <Stack gap=\"md\">\n <Accordion variant=\"separated\">\n {tree.map((specialty) => (\n <Accordion.Item key={specialty.name} value={specialty.name}>\n <Accordion.Control>\n <Text fw={500}>{specialty.name}</Text>\n </Accordion.Control>\n <Accordion.Panel>\n {specialty.children.length === 1 ? (\n <ServiceList\n services={specialty.children[0].services}\n selectedIds={selectedIds}\n onSelect={handleSelect}\n renderService={renderService}\n selectIcon={selectIcon}\n selectedIcon={selectedIcon}\n />\n ) : (\n <Accordion variant=\"default\">\n {specialty.children.map((sub) => (\n <Accordion.Item key={sub.name} value={sub.name}>\n <Accordion.Control>\n <Text size=\"sm\">{sub.name}</Text>\n </Accordion.Control>\n <Accordion.Panel>\n <ServiceList\n services={sub.services}\n selectedIds={selectedIds}\n onSelect={handleSelect}\n renderService={renderService}\n selectIcon={selectIcon}\n selectedIcon={selectedIcon}\n />\n </Accordion.Panel>\n </Accordion.Item>\n ))}\n </Accordion>\n )}\n </Accordion.Panel>\n </Accordion.Item>\n ))}\n </Accordion>\n\n {footer}\n </Stack>\n )\n}\n\n// ─── ServiceList ─────────────────────────────────────────────────────────────\n\nfunction ServiceList({\n services,\n selectedIds,\n onSelect,\n renderService,\n selectIcon,\n selectedIcon,\n}: {\n services: HealthcareService[]\n selectedIds?: ReadonlySet<string>\n onSelect: (hs: HealthcareService) => void\n renderService?: (hs: HealthcareService, selected: boolean) => ReactNode\n selectIcon?: ReactNode\n selectedIcon?: ReactNode\n}): JSX.Element {\n return (\n <Stack gap=\"xs\">\n {services.map((hs) => {\n const id = hs.id ?? ''\n const selected = selectedIds?.has(id) ?? false\n return (\n <Group key={id} justify=\"space-between\" wrap=\"nowrap\" py={4}>\n {renderService ? (\n renderService(hs, selected)\n ) : (\n <Stack gap={0}>\n <Text size=\"sm\">{hs.name ?? id}</Text>\n {hs.category?.[0]?.coding?.[0]?.display && (\n <Text size=\"xs\" c=\"dimmed\">\n {hs.category[0].coding[0].display}\n </Text>\n )}\n </Stack>\n )}\n <ActionIcon\n variant={selected ? 'filled' : 'light'}\n color={selected ? 'green' : 'blue'}\n onClick={() => onSelect(hs)}\n disabled={selected}\n >\n {selected\n ? (selectedIcon ?? <CheckIcon />)\n : (selectIcon ?? <PlusIcon />)}\n </ActionIcon>\n </Group>\n )\n })}\n </Stack>\n )\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"OtpInput.js","sourceRoot":"","sources":["../../src/OtpInput/OtpInput.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Group, TextInput, Text, Stack, Button } from '@mantine/core';\nimport { JSX, useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface OtpInputProps {\n /** Number of digits in the OTP code */\n length?: number;\n /** Called when all digits are entered */\n onComplete: (code: string) => void;\n /** Whether the input is in a loading/verifying state */\n loading?: boolean;\n /** Error message to display */\n error?: string;\n /** Label above the input */\n label?: string;\n /** Called when the user clicks \"Resend\" */\n onResend?: () => void;\n /** Cooldown in seconds before resend is available again */\n resendCooldown?: number;\n}\n\nexport function OtpInput({\n length = 6,\n onComplete,\n loading = false,\n error,\n label,\n onResend,\n resendCooldown = 60,\n}: OtpInputProps): JSX.Element {\n const [values, setValues] = useState<string[]>(Array(length).fill(''));\n const [cooldown, setCooldown] = useState(resendCooldown);\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n\n useEffect(() => {\n inputRefs.current[0]?.focus();\n }, []);\n\n useEffect(() => {\n if (cooldown <= 0) { return undefined; }\n const timer = setInterval(() => setCooldown((c) => c - 1), 1000);\n return () => clearInterval(timer);\n }, [cooldown]);\n\n const handleChange = useCallback(\n (index: number, value: string) => {\n if (!/^\\d*$/.test(value)) {return;}\n const digit = value.slice(-1);\n const next = [...values];\n next[index] = digit;\n setValues(next);\n\n if (digit && index < length - 1) {\n inputRefs.current[index + 1]?.focus();\n }\n\n if (next.every((v) => v !== '')) {\n onComplete(next.join(''));\n }\n },\n [values, length, onComplete]\n );\n\n const handleKeyDown = useCallback(\n (index: number, e: React.KeyboardEvent) => {\n if (e.key === 'Backspace' && !values[index] && index > 0) {\n inputRefs.current[index - 1]?.focus();\n }\n },\n [values]\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent) => {\n e.preventDefault();\n const pasted = e.clipboardData.getData('text').replace(/\\D/g, '').slice(0, length);\n if (!pasted) {return;}\n const next = [...values];\n for (let i = 0; i < pasted.length; i++) {\n next[i] = pasted[i];\n }\n setValues(next);\n const focusIdx = Math.min(pasted.length, length - 1);\n inputRefs.current[focusIdx]?.focus();\n if (next.every((v) => v !== '')) {\n onComplete(next.join(''));\n }\n },\n [values, length, onComplete]\n );\n\n const handleResend = useCallback(() => {\n setCooldown(resendCooldown);\n setValues(Array(length).fill(''));\n inputRefs.current[0]?.focus();\n onResend?.();\n }, [resendCooldown, length, onResend]);\n\n return (\n <Stack align=\"center\" gap=\"md\">\n {label && (\n <Text fw={500} size=\"sm\">\n {label}\n </Text>\n )}\n <Group gap=\"xs\" justify=\"center\" onPaste={handlePaste}>\n {values.map((val, i) => (\n <TextInput\n key={i}\n ref={(el) => {\n inputRefs.current[i] = el as unknown as HTMLInputElement;\n }}\n value={val}\n onChange={(e) => handleChange(i, e.currentTarget.value)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n disabled={loading}\n error={!!error}\n maxLength={1}\n styles={{\n input: {\n width: 48,\n height: 56,\n textAlign: 'center',\n fontSize: '1.5rem',\n fontWeight: 600,\n padding: 0,\n },\n }}\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n />\n ))}\n </Group>\n {error && (\n <Text c=\"red\" size=\"sm\">\n {error}\n </Text>\n )}\n {onResend && (\n <Button variant=\"subtle\" size=\"sm\" onClick={handleResend} disabled={cooldown > 0 || loading}>\n {cooldown > 0 ? `Reenviar codigo en ${cooldown}s` : 'Reenviar codigo'}\n </Button>\n )}\n </Stack>\n );\n}\n"]}
1
+ {"version":3,"file":"OtpInput.js","sourceRoot":"","sources":["../../src/OtpInput/OtpInput.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Group, TextInput, Text, Stack, Button } from '@mantine/core';\nimport { JSX, useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface OtpInputProps {\n /** Number of digits in the OTP code */\n length?: number;\n /** Called when all digits are entered */\n onComplete: (code: string) => void;\n /** Whether the input is in a loading/verifying state */\n loading?: boolean;\n /** Error message to display */\n error?: string;\n /** Label above the input */\n label?: string;\n /** Called when the user clicks \"Resend\" */\n onResend?: () => void;\n /** Cooldown in seconds before resend is available again */\n resendCooldown?: number;\n}\n\nexport function OtpInput({\n length = 6,\n onComplete,\n loading = false,\n error,\n label,\n onResend,\n resendCooldown = 60,\n}: OtpInputProps): JSX.Element {\n const [values, setValues] = useState(Array(length).fill(''));\n const [cooldown, setCooldown] = useState(resendCooldown);\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n\n useEffect(() => {\n inputRefs.current[0]?.focus();\n }, []);\n\n useEffect(() => {\n if (cooldown <= 0) { return undefined; }\n const timer = setInterval(() => setCooldown((c) => c - 1), 1000);\n return () => clearInterval(timer);\n }, [cooldown]);\n\n const handleChange = useCallback(\n (index: number, value: string) => {\n if (!/^\\d*$/.test(value)) {return;}\n const digit = value.slice(-1);\n const next = [...values];\n next[index] = digit;\n setValues(next);\n\n if (digit && index < length - 1) {\n inputRefs.current[index + 1]?.focus();\n }\n\n if (next.every((v) => v !== '')) {\n onComplete(next.join(''));\n }\n },\n [values, length, onComplete]\n );\n\n const handleKeyDown = useCallback(\n (index: number, e: React.KeyboardEvent) => {\n if (e.key === 'Backspace' && !values[index] && index > 0) {\n inputRefs.current[index - 1]?.focus();\n }\n },\n [values]\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent) => {\n e.preventDefault();\n const pasted = e.clipboardData.getData('text').replace(/\\D/g, '').slice(0, length);\n if (!pasted) {return;}\n const next = [...values];\n for (let i = 0; i < pasted.length; i++) {\n next[i] = pasted[i];\n }\n setValues(next);\n const focusIdx = Math.min(pasted.length, length - 1);\n inputRefs.current[focusIdx]?.focus();\n if (next.every((v) => v !== '')) {\n onComplete(next.join(''));\n }\n },\n [values, length, onComplete]\n );\n\n const handleResend = useCallback(() => {\n setCooldown(resendCooldown);\n setValues(Array(length).fill(''));\n inputRefs.current[0]?.focus();\n onResend?.();\n }, [resendCooldown, length, onResend]);\n\n return (\n <Stack align=\"center\" gap=\"md\">\n {label && (\n <Text fw={500} size=\"sm\">\n {label}\n </Text>\n )}\n <Group gap=\"xs\" justify=\"center\" onPaste={handlePaste}>\n {values.map((val, i) => (\n <TextInput\n key={i}\n ref={(el) => {\n inputRefs.current[i] = el as unknown as HTMLInputElement;\n }}\n value={val}\n onChange={(e) => handleChange(i, e.currentTarget.value)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n disabled={loading}\n error={!!error}\n maxLength={1}\n styles={{\n input: {\n width: 48,\n height: 56,\n textAlign: 'center',\n fontSize: '1.5rem',\n fontWeight: 600,\n padding: 0,\n },\n }}\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n />\n ))}\n </Group>\n {error && (\n <Text c=\"red\" size=\"sm\">\n {error}\n </Text>\n )}\n {onResend && (\n <Button variant=\"subtle\" size=\"sm\" onClick={handleResend} disabled={cooldown > 0 || loading}>\n {cooldown > 0 ? `Reenviar codigo en ${cooldown}s` : 'Reenviar codigo'}\n </Button>\n )}\n </Stack>\n );\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { Filter } from '@medplum/core';
1
+ import { type Filter } from '@medplum/core';
2
2
  import { Resource } from '@medplum/fhirtypes';
3
3
  import type { SearchControlProps } from '@medplum/react';
4
4
  import { JSX, ReactNode } from 'react';
@@ -1 +1 @@
1
- {"version":3,"file":"FuegoSearchControl.d.ts","sourceRoot":"","sources":["../../src/search/FuegoSearchControl.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FuegoSearchControl.d.ts","sourceRoot":"","sources":["../../src/search/FuegoSearchControl.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FuegoSearchControl.js","sourceRoot":"","sources":["../../src/search/FuegoSearchControl.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Checkbox,\n CloseButton,\n Group,\n Loader,\n Pagination,\n Stack,\n Table,\n Text,\n TextInput,\n Tooltip,\n} from '@mantine/core'\nimport { Operator } from '@medplum/core'\nimport type { Filter, SortRule } from '@medplum/core'\nimport { Resource } from '@medplum/fhirtypes'\nimport type { SearchControlProps } from '@medplum/react'\nimport { JSX, ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nconst CHECKBOX_COLUMN_WIDTH = 32\n\nexport interface ColumnDef<T extends Resource = Resource> {\n readonly id: string\n readonly header: ReactNode\n readonly width?: number | string\n readonly align?: 'left' | 'center' | 'right'\n readonly textAlign?: 'left' | 'center' | 'right'\n readonly sortable?: boolean\n readonly sortCode?: string\n readonly truncate?: boolean\n // Optional tooltip content; shown on row hover\n readonly tooltip?: (resource: T) => ReactNode\n readonly render: (resource: T) => ReactNode\n}\n\nexport interface RowEvent<T extends Resource = Resource> {\n readonly resource: T\n}\n\nexport interface FuegoSearchControlProps<T extends Resource = Resource>\n extends Pick<\n SearchControlProps<T>,\n 'search' | 'onClick' | 'onAuxClick' | 'onChange' | 'checkboxesEnabled'\n > {\n readonly columns: ColumnDef<T>[]\n readonly bulkActions?: (selected: T[]) => ReactNode\n readonly getRowId?: (r: T) => string\n readonly toolbarParam?: {\n code: string\n placeholder: string\n toFilterValue?: (query: string) => string\n extractQuery?: (filters: Filter[]) => string\n clearCodes?: string[]\n }\n readonly toolbarControls?: ReactNode\n readonly toolbarActions?: ReactNode\n readonly medplum: {\n search: (rt: any, query?: any) => Promise<any>;\n searchResources: (rt: any, params?: any) => Promise<any[]>\n }\n /** Optional identifier system used for PlanDefinition identifier search in toolbar */\n readonly identifierSystem?: string\n}\n\nexport function FuegoSearchControl<T extends Resource = Resource> ({\n search,\n columns,\n checkboxesEnabled = true,\n bulkActions,\n onClick,\n onAuxClick,\n onChange,\n getRowId,\n toolbarParam,\n toolbarControls,\n toolbarActions,\n medplum,\n // Keep prop for compatibility, but unused now that we only search by title\n identifierSystem: _identifierSystem,\n}: FuegoSearchControlProps<T>): JSX.Element {\n const [loading, setLoading] = useState(false)\n const [results, setResults] = useState<T[]>([])\n const [selected, setSelected] = useState<Record<string, boolean>>({})\n const [total, setTotal] = useState<number | undefined>(undefined)\n const [hoveredRowId, setHoveredRowId] = useState<string | undefined>(undefined)\n const [query, setQuery] = useState('')\n const debounceRef = useRef<number | undefined>(undefined)\n const lastSyncedQueryRef = useRef<string | undefined>(undefined)\n\n const count = search.count ?? 20\n const offset = search.offset ?? 0\n const sortRules = useMemo(() => search.sortRules ?? [], [search.sortRules])\n const resourceType = search.resourceType as string\n\n const currentSort = useMemo(() => sortRules[0], [sortRules])\n const hasExplicitColumnWidths = useMemo(() => columns.some((c) => c.width !== undefined), [columns])\n\n useEffect(() => {\n let cancelled = false\n\n async function run (): Promise<void> {\n if (!search.resourceType) {\n return\n }\n setLoading(true)\n try {\n const params: [string, string][] = []\n if (search.fields && search.fields.length > 0) {\n params.push(['_fields', search.fields.join(',')])\n }\n if (search.filters) {\n for (const f of search.filters) {\n if (!f.code) {\n continue\n }\n let key = f.code\n if (f.code === '_filter') {\n key = '_filter'\n } else if (f.operator && (f as any).operator !== 'eq') {\n key = `${f.code}:${(f as any).operator}`\n }\n if (Array.isArray(f.value)) {\n for (const val of f.value) {\n const sval = String(val)\n if (sval.trim().length > 0) {\n params.push([key, sval])\n }\n }\n } else if (f.value !== undefined) {\n const sval = String(f.value)\n if (sval.trim().length > 0) {\n params.push([key, sval])\n }\n }\n }\n }\n if (sortRules && sortRules.length > 0) {\n const s = sortRules[0]\n params.push(['_sort', (s.descending ? '-' : '') + s.code])\n }\n params.push(['_count', String(count)])\n params.push(['_offset', String(offset)])\n // Ask server for total so we can render full pagination\n params.push(['_total', 'accurate'])\n\n if (typeof medplum.search === 'function') {\n const bundle = await medplum.search(resourceType, params)\n const list = (bundle?.entry ?? []).map((e: any) => e.resource as T)\n if (!cancelled) {\n setResults(list ?? [])\n setSelected({})\n setTotal(typeof bundle?.total === 'number' ? bundle.total : undefined)\n }\n } else {\n const list = (await medplum.searchResources(resourceType, params)) as T[]\n if (!cancelled) {\n setResults(list ?? [])\n setSelected({})\n setTotal(undefined)\n }\n }\n } catch (err) {\n if (!cancelled) {\n console.error(err)\n setResults([])\n setSelected({})\n setTotal(undefined)\n }\n } finally {\n if (!cancelled) {\n setLoading(false)\n }\n }\n }\n\n run().catch(console.error)\n return () => {\n cancelled = true\n }\n }, [resourceType, medplum, search, search.fields, search.filters, sortRules, count, offset])\n\n // Sync the input with any existing title/name filter when filters change (do not reset on keystroke)\n const getToolbarQuery = useCallback(\n (filters: Filter[]): string => {\n if (!toolbarParam) {\n return ''\n }\n if (toolbarParam.extractQuery) {\n return toolbarParam.extractQuery(filters)\n }\n const titleFilter = filters.find((f) => f.code === toolbarParam.code) as\n | { value?: string; operator?: string }\n | undefined\n return (titleFilter?.value as string | undefined) ?? ''\n },\n [toolbarParam]\n )\n\n useEffect(() => {\n if (!toolbarParam) {\n return\n }\n const next = getToolbarQuery(search.filters ?? [])\n if (lastSyncedQueryRef.current !== next) {\n lastSyncedQueryRef.current = next\n setQuery(next)\n }\n }, [toolbarParam, search.filters, getToolbarQuery])\n\n // Debounce typing: apply filter 0.5 seconds after user stops typing\n useEffect(() => {\n // Clear any pending debounce from previous render\n if (debounceRef.current) {\n clearTimeout(debounceRef.current)\n debounceRef.current = undefined\n }\n if (!toolbarParam || !onChange) {\n return\n }\n const q = query.trim()\n const current = getToolbarQuery(search.filters ?? [])\n debounceRef.current = window.setTimeout(() => {\n // Only dispatch if the value actually changed\n if (q !== current) {\n const clearCodes = toolbarParam.clearCodes ?? [toolbarParam.code]\n const remainingFilters = (search.filters ?? []).filter((f: any) => !clearCodes.includes(f.code))\n if (!q) {\n onChange({ definition: { ...search, filters: remainingFilters, offset: 0 } })\n } else {\n const value = toolbarParam.toFilterValue ? toolbarParam.toFilterValue(q) : q\n const filter: Filter = toolbarParam.code === '_filter'\n ? { code: toolbarParam.code, operator: Operator.EQUALS, value }\n : { code: toolbarParam.code, operator: Operator.CONTAINS, value }\n onChange({\n definition: {\n ...search,\n filters: [...remainingFilters, filter],\n offset: 0,\n },\n })\n }\n }\n }, 500)\n }, [query, toolbarParam, onChange, search, getToolbarQuery])\n\n function clearSearch (): void {\n if (!toolbarParam) {\n return\n }\n setQuery('')\n if (onChange) {\n const clearCodes = toolbarParam.clearCodes ?? [toolbarParam.code]\n const remainingFilters = (search.filters ?? []).filter((f: any) => !clearCodes.includes(f.code))\n onChange({ definition: { ...search, filters: remainingFilters, offset: 0 } })\n }\n }\n\n function toggleSort (col: ColumnDef<T>): void {\n if (!col.sortable || !onChange) {\n return\n }\n const sortCode = col.sortCode ?? col.id\n const next: SortRule = currentSort?.code === sortCode\n ? { code: sortCode, descending: !currentSort.descending }\n : { code: sortCode, descending: false }\n onChange({ definition: { ...search, sortRules: [next], offset: 0 } })\n }\n\n function setPage (nextOffset: number): void {\n onChange?.({ definition: { ...search, offset: Math.max(0, nextOffset) } })\n }\n\n const clearCodes = toolbarParam?.clearCodes ?? (toolbarParam ? [toolbarParam.code] : [])\n const hasActiveFilters = query.trim().length > 0 || (search.filters ?? []).some(f => clearCodes.includes(f.code))\n\n function isAllSelected (): boolean {\n if (!checkboxesEnabled || results.length === 0) {\n return false\n }\n return results.every((r) => selected[getId(r)])\n }\n\n function toggleAll (): void {\n if (!checkboxesEnabled) {\n return\n }\n if (isAllSelected()) {\n setSelected({})\n } else {\n const next: Record<string, boolean> = {}\n for (const r of results) {\n next[getId(r)] = true\n }\n setSelected(next)\n }\n }\n\n function toggleOne (id: string): void {\n setSelected((prev) => ({ ...prev, [id]: !prev[id] }))\n }\n\n const getId = useCallback((r: T): string => (getRowId ? getRowId(r) : (r.id as string)), [getRowId])\n\n const selectedList = useMemo(() => results.filter((r) => selected[getId(r)]), [results, selected, getId])\n\n const tbodyContent = useMemo(() => {\n const getColumnSizeStyle = (c: ColumnDef<T>): React.CSSProperties => {\n if (c.width === undefined) {\n return {}\n }\n return { width: c.width, minWidth: c.width, maxWidth: c.width, boxSizing: 'border-box' }\n }\n const getColumnAlign = (c: ColumnDef<T>): 'left' | 'center' | 'right' => c.textAlign ?? c.align ?? 'left'\n\n if (loading) {\n return (\n <Table.Tr>\n <Table.Td colSpan={(checkboxesEnabled ? 1 : 0) + columns.length}>\n <Group justify=\"center\" p=\"md\"><Loader size=\"sm\"/></Group>\n </Table.Td>\n </Table.Tr>\n )\n }\n if (results.length === 0) {\n return (\n <Table.Tr>\n <Table.Td colSpan={(checkboxesEnabled ? 1 : 0) + columns.length}>\n <Text size=\"sm\" c=\"dimmed\">No results</Text>\n </Table.Td>\n </Table.Tr>\n )\n }\n return (\n <>\n {results.map((r) => {\n const id = getId(r)\n return (\n <Table.Tr\n key={id}\n onClick={() => onClick?.({ resource: r })}\n onAuxClick={() => onAuxClick?.({ resource: r })}\n onMouseEnter={() => setHoveredRowId(id)}\n onMouseLeave={() => setHoveredRowId((prev) => (prev === id ? undefined : prev))}\n >\n {checkboxesEnabled && (\n <Table.Td\n style={{\n width: CHECKBOX_COLUMN_WIDTH,\n minWidth: CHECKBOX_COLUMN_WIDTH,\n maxWidth: CHECKBOX_COLUMN_WIDTH,\n paddingLeft: 10,\n paddingRight: 0,\n textAlign: 'center',\n boxSizing: 'border-box',\n whiteSpace: 'nowrap',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <Checkbox size=\"xs\" aria-label=\"Select row\" checked={!!selected[id]} onChange={() => toggleOne(id)}/>\n </Table.Td>\n )}\n {columns.map((c) => {\n const baseSpanStyle: React.CSSProperties = c.truncate\n ? {\n display: 'block',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: '100%'\n }\n : { display: 'block' }\n const inner = <span style={baseSpanStyle}>{c.render(r)}</span>\n return (\n <Table.Td\n key={c.id}\n className={c.truncate ? 'truncate' : undefined}\n style={{\n textAlign: getColumnAlign(c),\n overflow: c.truncate ? 'hidden' : undefined,\n ...getColumnSizeStyle(c),\n }}\n >\n {c.tooltip ? (\n <Tooltip label={c.tooltip(r)} opened={hoveredRowId === id} withArrow position=\"bottom\">\n {inner}\n </Tooltip>\n ) : (\n inner\n )}\n </Table.Td>\n )\n })}\n </Table.Tr>\n )\n })}\n </>\n )\n }, [loading, checkboxesEnabled, columns, results, onClick, onAuxClick, selected, getId, hoveredRowId])\n\n return (\n <Stack gap={0}>\n {/* Filter toolbar */}\n {(toolbarParam || toolbarControls || toolbarActions) && (\n <Group\n justify=\"space-between\"\n align=\"center\"\n wrap=\"nowrap\"\n mb=\"sm\"\n px=\"sm\"\n style={{\n paddingTop: 7,\n paddingBottom: 7,\n background: 'var(--mantine-color-gray-0)',\n border: '1px solid var(--mantine-color-gray-2)',\n borderRadius: 'var(--mantine-radius-sm)',\n }}\n >\n <Group gap=\"xs\" wrap=\"nowrap\" style={{ flex: 1, minWidth: 0 }}>\n {toolbarParam && (\n <TextInput\n size=\"sm\"\n style={{ flex: 1, minWidth: 180 }}\n placeholder={toolbarParam.placeholder}\n value={query}\n onChange={(e) => setQuery(e.currentTarget.value)}\n />\n )}\n {toolbarControls}\n {toolbarParam && (\n <Tooltip label=\"Limpiar filtros\" withArrow disabled={!hasActiveFilters}>\n <CloseButton\n size=\"sm\"\n onClick={clearSearch}\n aria-label=\"Limpiar filtros\"\n style={{ opacity: hasActiveFilters ? 1 : 0.3, flexShrink: 0 }}\n />\n </Tooltip>\n )}\n </Group>\n {toolbarActions && (\n <Group gap=\"xs\" wrap=\"nowrap\" ml=\"sm\" style={{ flexShrink: 0 }}>\n {toolbarActions}\n </Group>\n )}\n </Group>\n )}\n {bulkActions && selectedList.length > 0 && (\n <Group justify=\"space-between\" mb=\"xs\">\n <Text size=\"sm\">{selectedList.length} selected</Text>\n <Group gap=\"xs\">{bulkActions(selectedList)}</Group>\n </Group>\n )}\n <div style={{ overflowX: 'auto' }}>\n <Table\n striped\n highlightOnHover\n withTableBorder\n stickyHeader\n stickyHeaderOffset={0}\n verticalSpacing=\"xs\"\n horizontalSpacing=\"sm\"\n fz=\"xs\"\n style={{\n tableLayout: hasExplicitColumnWidths ? 'fixed' : 'auto',\n width: '100%',\n maxWidth: '100%',\n }}\n >\n <colgroup>\n {checkboxesEnabled && <col style={{ width: CHECKBOX_COLUMN_WIDTH }}/>}\n {columns.map((c) => (\n <col key={c.id} style={c.width !== undefined ? { width: c.width } : undefined}/>\n ))}\n </colgroup>\n <Table.Thead>\n <Table.Tr>\n {checkboxesEnabled && (\n <Table.Th\n style={{\n width: CHECKBOX_COLUMN_WIDTH,\n minWidth: CHECKBOX_COLUMN_WIDTH,\n maxWidth: CHECKBOX_COLUMN_WIDTH,\n paddingLeft: 10,\n paddingRight: 0,\n textAlign: 'center',\n boxSizing: 'border-box',\n whiteSpace: 'nowrap',\n }}\n >\n <Checkbox size=\"xs\" aria-label=\"Select all\" checked={isAllSelected()} onChange={toggleAll}/>\n </Table.Th>\n )}\n {columns.map((c) => {\n const sortCode = c.sortable ? (c.sortCode ?? c.id) : undefined\n const isSorted = currentSort && sortCode && currentSort.code === sortCode\n let justify: 'center' | 'flex-end' | 'flex-start' = 'flex-start'\n if (c.textAlign === 'center' || c.align === 'center') {\n justify = 'center'\n } else if (c.textAlign === 'right' || c.align === 'right') {\n justify = 'flex-end'\n }\n return (\n <Table.Th\n key={c.id}\n style={{\n textAlign: c.textAlign ?? c.align ?? 'left',\n overflow: 'hidden',\n cursor: c.sortable ? 'pointer' : undefined,\n ...(c.width === undefined\n ? {}\n : {\n width: c.width,\n minWidth: c.width,\n maxWidth: c.width,\n boxSizing: 'border-box',\n }),\n }}\n onClick={c.sortable ? () => toggleSort(c) : undefined}\n >\n <Group\n gap={6}\n wrap=\"nowrap\"\n justify={justify}\n style={{ width: '100%' }}\n >\n <span>{c.header}</span>\n {isSorted && (\n <Text size=\"xs\" c=\"dimmed\">{currentSort.descending ? '▼' : '▲'}</Text>\n )}\n </Group>\n </Table.Th>\n )\n })}\n </Table.Tr>\n </Table.Thead>\n <Table.Tbody>{tbodyContent}</Table.Tbody>\n </Table>\n </div>\n <Group justify=\"space-between\" align=\"center\" mt=\"sm\">\n <Text size=\"xs\" c=\"dimmed\">\n {results.length > 0 ? `${offset + 1}–${offset + results.length}${total ? ` de ${total}` : ''}` : '0 resultados'}\n </Text>\n <Pagination\n size=\"sm\"\n total={total ? Math.max(1, Math.ceil(total / count)) : Math.max(1, Math.ceil((offset + results.length) / count))}\n value={Math.floor(offset / count) + 1}\n onChange={(page) => setPage((page - 1) * count)}\n withEdges\n />\n </Group>\n </Stack>\n )\n}\n"]}
1
+ {"version":3,"file":"FuegoSearchControl.js","sourceRoot":"","sources":["../../src/search/FuegoSearchControl.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Checkbox,\n CloseButton,\n Group,\n Loader,\n Pagination,\n Stack,\n Table,\n Text,\n TextInput,\n Tooltip,\n} from '@mantine/core'\nimport { Operator, type Filter, type SortRule } from '@medplum/core'\nimport { Resource } from '@medplum/fhirtypes'\nimport type { SearchControlProps } from '@medplum/react'\nimport { JSX, ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nconst CHECKBOX_COLUMN_WIDTH = 32\n\nexport interface ColumnDef<T extends Resource = Resource> {\n readonly id: string\n readonly header: ReactNode\n readonly width?: number | string\n readonly align?: 'left' | 'center' | 'right'\n readonly textAlign?: 'left' | 'center' | 'right'\n readonly sortable?: boolean\n readonly sortCode?: string\n readonly truncate?: boolean\n // Optional tooltip content; shown on row hover\n readonly tooltip?: (resource: T) => ReactNode\n readonly render: (resource: T) => ReactNode\n}\n\nexport interface RowEvent<T extends Resource = Resource> {\n readonly resource: T\n}\n\nexport interface FuegoSearchControlProps<T extends Resource = Resource>\n extends Pick<\n SearchControlProps<T>,\n 'search' | 'onClick' | 'onAuxClick' | 'onChange' | 'checkboxesEnabled'\n > {\n readonly columns: ColumnDef<T>[]\n readonly bulkActions?: (selected: T[]) => ReactNode\n readonly getRowId?: (r: T) => string\n readonly toolbarParam?: {\n code: string\n placeholder: string\n toFilterValue?: (query: string) => string\n extractQuery?: (filters: Filter[]) => string\n clearCodes?: string[]\n }\n readonly toolbarControls?: ReactNode\n readonly toolbarActions?: ReactNode\n readonly medplum: {\n search: (rt: any, query?: any) => Promise<any>;\n searchResources: (rt: any, params?: any) => Promise<any[]>\n }\n /** Optional identifier system used for PlanDefinition identifier search in toolbar */\n readonly identifierSystem?: string\n}\n\nexport function FuegoSearchControl<T extends Resource = Resource> ({\n search,\n columns,\n checkboxesEnabled = true,\n bulkActions,\n onClick,\n onAuxClick,\n onChange,\n getRowId,\n toolbarParam,\n toolbarControls,\n toolbarActions,\n medplum,\n // Keep prop for compatibility, but unused now that we only search by title\n identifierSystem: _identifierSystem,\n}: FuegoSearchControlProps<T>): JSX.Element {\n const [loading, setLoading] = useState(false)\n const [results, setResults] = useState<T[]>([])\n const [selected, setSelected] = useState<Record<string, boolean>>({})\n const [total, setTotal] = useState<number | undefined>(undefined)\n const [hoveredRowId, setHoveredRowId] = useState<string | undefined>(undefined)\n const [query, setQuery] = useState('')\n const debounceRef = useRef<number | undefined>(undefined)\n const lastSyncedQueryRef = useRef<string | undefined>(undefined)\n\n const count = search.count ?? 20\n const offset = search.offset ?? 0\n const sortRules = useMemo(() => search.sortRules ?? [], [search.sortRules])\n const resourceType = search.resourceType as string\n\n const currentSort = useMemo(() => sortRules[0], [sortRules])\n const hasExplicitColumnWidths = useMemo(() => columns.some((c) => c.width !== undefined), [columns])\n\n useEffect(() => {\n let cancelled = false\n\n async function run (): Promise<void> {\n if (!search.resourceType) {\n return\n }\n setLoading(true)\n try {\n const params: [string, string][] = []\n if (search.fields && search.fields.length > 0) {\n params.push(['_fields', search.fields.join(',')])\n }\n if (search.filters) {\n for (const f of search.filters) {\n if (!f.code) {\n continue\n }\n let key = f.code\n if (f.code === '_filter') {\n key = '_filter'\n } else if (f.operator && (f as any).operator !== 'eq') {\n key = `${f.code}:${(f as any).operator}`\n }\n if (Array.isArray(f.value)) {\n for (const val of f.value) {\n const sval = String(val)\n if (sval.trim().length > 0) {\n params.push([key, sval])\n }\n }\n } else if (f.value !== undefined) {\n const sval = String(f.value)\n if (sval.trim().length > 0) {\n params.push([key, sval])\n }\n }\n }\n }\n if (sortRules && sortRules.length > 0) {\n const s = sortRules[0]\n params.push(['_sort', (s.descending ? '-' : '') + s.code])\n }\n params.push(['_count', String(count)])\n params.push(['_offset', String(offset)])\n // Ask server for total so we can render full pagination\n params.push(['_total', 'accurate'])\n\n if (typeof medplum.search === 'function') {\n const bundle = await medplum.search(resourceType, params)\n const list = (bundle?.entry ?? []).map((e: any) => e.resource as T)\n if (!cancelled) {\n setResults(list ?? [])\n setSelected({})\n setTotal(typeof bundle?.total === 'number' ? bundle.total : undefined)\n }\n } else {\n const list = (await medplum.searchResources(resourceType, params)) as T[]\n if (!cancelled) {\n setResults(list ?? [])\n setSelected({})\n setTotal(undefined)\n }\n }\n } catch (err) {\n if (!cancelled) {\n console.error(err)\n setResults([])\n setSelected({})\n setTotal(undefined)\n }\n } finally {\n if (!cancelled) {\n setLoading(false)\n }\n }\n }\n\n run().catch(console.error)\n return () => {\n cancelled = true\n }\n }, [resourceType, medplum, search, search.fields, search.filters, sortRules, count, offset])\n\n // Sync the input with any existing title/name filter when filters change (do not reset on keystroke)\n const getToolbarQuery = useCallback(\n (filters: Filter[]): string => {\n if (!toolbarParam) {\n return ''\n }\n if (toolbarParam.extractQuery) {\n return toolbarParam.extractQuery(filters)\n }\n const titleFilter = filters.find((f) => f.code === toolbarParam.code) as\n | { value?: string; operator?: string }\n | undefined\n return (titleFilter?.value as string | undefined) ?? ''\n },\n [toolbarParam]\n )\n\n useEffect(() => {\n if (!toolbarParam) {\n return\n }\n const next = getToolbarQuery(search.filters ?? [])\n if (lastSyncedQueryRef.current !== next) {\n lastSyncedQueryRef.current = next\n setQuery(next)\n }\n }, [toolbarParam, search.filters, getToolbarQuery])\n\n // Debounce typing: apply filter 0.5 seconds after user stops typing\n useEffect(() => {\n // Clear any pending debounce from previous render\n if (debounceRef.current) {\n clearTimeout(debounceRef.current)\n debounceRef.current = undefined\n }\n if (!toolbarParam || !onChange) {\n return\n }\n const q = query.trim()\n const current = getToolbarQuery(search.filters ?? [])\n debounceRef.current = window.setTimeout(() => {\n // Only dispatch if the value actually changed\n if (q !== current) {\n const clearCodes = toolbarParam.clearCodes ?? [toolbarParam.code]\n const remainingFilters = (search.filters ?? []).filter((f: any) => !clearCodes.includes(f.code))\n if (!q) {\n onChange({ definition: { ...search, filters: remainingFilters, offset: 0 } })\n } else {\n const value = toolbarParam.toFilterValue ? toolbarParam.toFilterValue(q) : q\n const filter: Filter = toolbarParam.code === '_filter'\n ? { code: toolbarParam.code, operator: Operator.EQUALS, value }\n : { code: toolbarParam.code, operator: Operator.CONTAINS, value }\n onChange({\n definition: {\n ...search,\n filters: [...remainingFilters, filter],\n offset: 0,\n },\n })\n }\n }\n }, 500)\n }, [query, toolbarParam, onChange, search, getToolbarQuery])\n\n function clearSearch (): void {\n if (!toolbarParam) {\n return\n }\n setQuery('')\n if (onChange) {\n const clearCodes = toolbarParam.clearCodes ?? [toolbarParam.code]\n const remainingFilters = (search.filters ?? []).filter((f: any) => !clearCodes.includes(f.code))\n onChange({ definition: { ...search, filters: remainingFilters, offset: 0 } })\n }\n }\n\n function toggleSort (col: ColumnDef<T>): void {\n if (!col.sortable || !onChange) {\n return\n }\n const sortCode = col.sortCode ?? col.id\n const next: SortRule = currentSort?.code === sortCode\n ? { code: sortCode, descending: !currentSort.descending }\n : { code: sortCode, descending: false }\n onChange({ definition: { ...search, sortRules: [next], offset: 0 } })\n }\n\n function setPage (nextOffset: number): void {\n onChange?.({ definition: { ...search, offset: Math.max(0, nextOffset) } })\n }\n\n const clearCodes = toolbarParam?.clearCodes ?? (toolbarParam ? [toolbarParam.code] : [])\n const hasActiveFilters = query.trim().length > 0 || (search.filters ?? []).some(f => clearCodes.includes(f.code))\n\n function isAllSelected (): boolean {\n if (!checkboxesEnabled || results.length === 0) {\n return false\n }\n return results.every((r) => selected[getId(r)])\n }\n\n function toggleAll (): void {\n if (!checkboxesEnabled) {\n return\n }\n if (isAllSelected()) {\n setSelected({})\n } else {\n const next: Record<string, boolean> = {}\n for (const r of results) {\n next[getId(r)] = true\n }\n setSelected(next)\n }\n }\n\n function toggleOne (id: string): void {\n setSelected((prev) => ({ ...prev, [id]: !prev[id] }))\n }\n\n const getId = useCallback((r: T): string => (getRowId ? getRowId(r) : (r.id as string)), [getRowId])\n\n const selectedList = useMemo(() => results.filter((r) => selected[getId(r)]), [results, selected, getId])\n\n const tbodyContent = useMemo(() => {\n const getColumnSizeStyle = (c: ColumnDef<T>): React.CSSProperties => {\n if (c.width === undefined) {\n return {}\n }\n return { width: c.width, minWidth: c.width, maxWidth: c.width, boxSizing: 'border-box' }\n }\n const getColumnAlign = (c: ColumnDef<T>): 'left' | 'center' | 'right' => c.textAlign ?? c.align ?? 'left'\n\n if (loading) {\n return (\n <Table.Tr>\n <Table.Td colSpan={(checkboxesEnabled ? 1 : 0) + columns.length}>\n <Group justify=\"center\" p=\"md\"><Loader size=\"sm\"/></Group>\n </Table.Td>\n </Table.Tr>\n )\n }\n if (results.length === 0) {\n return (\n <Table.Tr>\n <Table.Td colSpan={(checkboxesEnabled ? 1 : 0) + columns.length}>\n <Text size=\"sm\" c=\"dimmed\">No results</Text>\n </Table.Td>\n </Table.Tr>\n )\n }\n return (\n <>\n {results.map((r) => {\n const id = getId(r)\n return (\n <Table.Tr\n key={id}\n onClick={() => onClick?.({ resource: r })}\n onAuxClick={() => onAuxClick?.({ resource: r })}\n onMouseEnter={() => setHoveredRowId(id)}\n onMouseLeave={() => setHoveredRowId((prev) => (prev === id ? undefined : prev))}\n >\n {checkboxesEnabled && (\n <Table.Td\n style={{\n width: CHECKBOX_COLUMN_WIDTH,\n minWidth: CHECKBOX_COLUMN_WIDTH,\n maxWidth: CHECKBOX_COLUMN_WIDTH,\n paddingLeft: 10,\n paddingRight: 0,\n textAlign: 'center',\n boxSizing: 'border-box',\n whiteSpace: 'nowrap',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <Checkbox size=\"xs\" aria-label=\"Select row\" checked={!!selected[id]} onChange={() => toggleOne(id)}/>\n </Table.Td>\n )}\n {columns.map((c) => {\n const baseSpanStyle: React.CSSProperties = c.truncate\n ? {\n display: 'block',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: '100%'\n }\n : { display: 'block' }\n const inner = <span style={baseSpanStyle}>{c.render(r)}</span>\n return (\n <Table.Td\n key={c.id}\n className={c.truncate ? 'truncate' : undefined}\n style={{\n textAlign: getColumnAlign(c),\n overflow: c.truncate ? 'hidden' : undefined,\n ...getColumnSizeStyle(c),\n }}\n >\n {c.tooltip ? (\n <Tooltip label={c.tooltip(r)} opened={hoveredRowId === id} withArrow position=\"bottom\">\n {inner}\n </Tooltip>\n ) : (\n inner\n )}\n </Table.Td>\n )\n })}\n </Table.Tr>\n )\n })}\n </>\n )\n }, [loading, checkboxesEnabled, columns, results, onClick, onAuxClick, selected, getId, hoveredRowId])\n\n return (\n <Stack gap={0}>\n {/* Filter toolbar */}\n {(toolbarParam || toolbarControls || toolbarActions) && (\n <Group\n justify=\"space-between\"\n align=\"center\"\n wrap=\"nowrap\"\n mb=\"sm\"\n px=\"sm\"\n style={{\n paddingTop: 7,\n paddingBottom: 7,\n background: 'var(--mantine-color-gray-0)',\n border: '1px solid var(--mantine-color-gray-2)',\n borderRadius: 'var(--mantine-radius-sm)',\n }}\n >\n <Group gap=\"xs\" wrap=\"nowrap\" style={{ flex: 1, minWidth: 0 }}>\n {toolbarParam && (\n <TextInput\n size=\"sm\"\n style={{ flex: 1, minWidth: 180 }}\n placeholder={toolbarParam.placeholder}\n value={query}\n onChange={(e) => setQuery(e.currentTarget.value)}\n />\n )}\n {toolbarControls}\n {toolbarParam && (\n <Tooltip label=\"Limpiar filtros\" withArrow disabled={!hasActiveFilters}>\n <CloseButton\n size=\"sm\"\n onClick={clearSearch}\n aria-label=\"Limpiar filtros\"\n style={{ opacity: hasActiveFilters ? 1 : 0.3, flexShrink: 0 }}\n />\n </Tooltip>\n )}\n </Group>\n {toolbarActions && (\n <Group gap=\"xs\" wrap=\"nowrap\" ml=\"sm\" style={{ flexShrink: 0 }}>\n {toolbarActions}\n </Group>\n )}\n </Group>\n )}\n {bulkActions && selectedList.length > 0 && (\n <Group justify=\"space-between\" mb=\"xs\">\n <Text size=\"sm\">{selectedList.length} selected</Text>\n <Group gap=\"xs\">{bulkActions(selectedList)}</Group>\n </Group>\n )}\n <div style={{ overflowX: 'auto' }}>\n <Table\n striped\n highlightOnHover\n withTableBorder\n stickyHeader\n stickyHeaderOffset={0}\n verticalSpacing=\"xs\"\n horizontalSpacing=\"sm\"\n fz=\"xs\"\n style={{\n tableLayout: hasExplicitColumnWidths ? 'fixed' : 'auto',\n width: '100%',\n maxWidth: '100%',\n }}\n >\n <colgroup>\n {checkboxesEnabled && <col style={{ width: CHECKBOX_COLUMN_WIDTH }}/>}\n {columns.map((c) => (\n <col key={c.id} style={c.width !== undefined ? { width: c.width } : undefined}/>\n ))}\n </colgroup>\n <Table.Thead>\n <Table.Tr>\n {checkboxesEnabled && (\n <Table.Th\n style={{\n width: CHECKBOX_COLUMN_WIDTH,\n minWidth: CHECKBOX_COLUMN_WIDTH,\n maxWidth: CHECKBOX_COLUMN_WIDTH,\n paddingLeft: 10,\n paddingRight: 0,\n textAlign: 'center',\n boxSizing: 'border-box',\n whiteSpace: 'nowrap',\n }}\n >\n <Checkbox size=\"xs\" aria-label=\"Select all\" checked={isAllSelected()} onChange={toggleAll}/>\n </Table.Th>\n )}\n {columns.map((c) => {\n const sortCode = c.sortable ? (c.sortCode ?? c.id) : undefined\n const isSorted = currentSort && sortCode && currentSort.code === sortCode\n let justify: 'center' | 'flex-end' | 'flex-start' = 'flex-start'\n if (c.textAlign === 'center' || c.align === 'center') {\n justify = 'center'\n } else if (c.textAlign === 'right' || c.align === 'right') {\n justify = 'flex-end'\n }\n return (\n <Table.Th\n key={c.id}\n style={{\n textAlign: c.textAlign ?? c.align ?? 'left',\n overflow: 'hidden',\n cursor: c.sortable ? 'pointer' : undefined,\n ...(c.width === undefined\n ? {}\n : {\n width: c.width,\n minWidth: c.width,\n maxWidth: c.width,\n boxSizing: 'border-box',\n }),\n }}\n onClick={c.sortable ? () => toggleSort(c) : undefined}\n >\n <Group\n gap={6}\n wrap=\"nowrap\"\n justify={justify}\n style={{ width: '100%' }}\n >\n <span>{c.header}</span>\n {isSorted && (\n <Text size=\"xs\" c=\"dimmed\">{currentSort.descending ? '▼' : '▲'}</Text>\n )}\n </Group>\n </Table.Th>\n )\n })}\n </Table.Tr>\n </Table.Thead>\n <Table.Tbody>{tbodyContent}</Table.Tbody>\n </Table>\n </div>\n <Group justify=\"space-between\" align=\"center\" mt=\"sm\">\n <Text size=\"xs\" c=\"dimmed\">\n {results.length > 0 ? `${offset + 1}–${offset + results.length}${total ? ` de ${total}` : ''}` : '0 resultados'}\n </Text>\n <Pagination\n size=\"sm\"\n total={total ? Math.max(1, Math.ceil(total / count)) : Math.max(1, Math.ceil((offset + results.length) / count))}\n value={Math.floor(offset / count) + 1}\n onChange={(page) => setPage((page - 1) * count)}\n withEdges\n />\n </Group>\n </Stack>\n )\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"PlanDefinitionAutocomplete.js","sourceRoot":"","sources":["../../src/search/PlanDefinitionAutocomplete.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Autocomplete, AutocompleteProps, Box, Loader, Text } from '@mantine/core'\nimport { useDebouncedValue } from '@mantine/hooks'\nimport { PlanDefinition } from '@medplum/fhirtypes'\nimport { ContentType } from '@medplum/core'\nimport { useMedplum } from '@medplum/react'\nimport { JSX, useEffect, useMemo, useRef, useState } from 'react'\n\nexport interface PlanDefinitionAutocompleteProps\n extends Omit<AutocompleteProps, 'data' | 'value' | 'defaultValue' | 'onChange' | 'onOptionSubmit'> {\n readonly value?: PlanDefinition\n readonly onChange: (plan: PlanDefinition | undefined) => void\n readonly placeholder?: string\n readonly count?: number\n readonly minQueryLength?: number\n}\n\nfunction getPlanLabel (plan: PlanDefinition | undefined): string {\n if (!plan) {\n return ''\n }\n return plan.title ?? plan.name ?? plan.id ?? ''\n}\n\nexport function PlanDefinitionAutocomplete (props: PlanDefinitionAutocompleteProps): JSX.Element {\n const {\n value,\n onChange,\n placeholder = 'Buscar práctica por título',\n count = 20,\n minQueryLength = 0,\n clearable = true,\n rightSection,\n ...inputProps\n } = props\n\n const medplum = useMedplum()\n const [query, setQuery] = useState<string>(getPlanLabel(value))\n const [debounced] = useDebouncedValue(query, 250)\n const [loading, setLoading] = useState(false)\n const [results, setResults] = useState<PlanDefinition[]>([])\n const lastSelectedIdRef = useRef<string | undefined>(value?.id)\n\n useEffect(() => {\n if (value?.id !== lastSelectedIdRef.current) {\n lastSelectedIdRef.current = value?.id\n setQuery(getPlanLabel(value))\n }\n }, [value])\n\n useEffect(() => {\n let cancelled = false\n\n async function run (): Promise<void> {\n const q = debounced.trim()\n if (q.length < minQueryLength) {\n setResults([])\n setLoading(false)\n return\n }\n setLoading(true)\n try {\n const bundle = await medplum.post(\n medplum.fhirUrl('PlanDefinition', '$search'),\n {\n resourceType: 'Parameters',\n parameter: [\n { name: 'q', valueString: q },\n { name: 'count', valueInteger: count }\n ]\n },\n ContentType.FHIR_JSON\n )\n const list = (bundle?.entry ?? [])\n .map((entry: any) => entry.resource as PlanDefinition)\n .filter((resource: PlanDefinition | undefined): resource is PlanDefinition => !!resource)\n if (!cancelled) {\n setResults(Array.isArray(list) ? list : [])\n }\n } catch (err) {\n if (!cancelled) {\n console.error(err)\n setResults([])\n }\n } finally {\n if (!cancelled) {\n setLoading(false)\n }\n }\n }\n\n run().catch(console.error)\n return () => {\n cancelled = true\n }\n }, [debounced, medplum, count, minQueryLength])\n\n const { data, optionsByLabel } = useMemo(() => {\n const counts = new Map<string, number>()\n for (const plan of results ?? []) {\n const base = getPlanLabel(plan) || 'Sin título'\n counts.set(base, (counts.get(base) ?? 0) + 1)\n }\n\n const data: string[] = []\n const seen = new Set<string>()\n const optionsByLabel = new Map<string, PlanDefinition>()\n\n for (const plan of results ?? []) {\n const base = getPlanLabel(plan) || 'Sin título'\n let label = base\n if ((counts.get(base) ?? 0) > 1) {\n label = `${base} (${plan.id ?? 'sin-id'})`\n }\n let uniqueLabel = label\n let suffix = 2\n while (seen.has(uniqueLabel)) {\n uniqueLabel = `${label} (${suffix})`\n suffix += 1\n }\n seen.add(uniqueLabel)\n data.push(uniqueLabel)\n optionsByLabel.set(uniqueLabel, plan)\n }\n\n return { data, optionsByLabel }\n }, [results])\n\n function handleOptionSubmit (label: string): void {\n const chosen = optionsByLabel.get(label)\n if (chosen) {\n lastSelectedIdRef.current = chosen.id\n onChange(chosen)\n setQuery(getPlanLabel(chosen))\n }\n }\n\n function handleClear (): void {\n onChange(undefined)\n setQuery('')\n }\n\n function handleBlur (): void {\n setQuery(getPlanLabel(value))\n }\n\n return (\n <Autocomplete\n {...inputProps}\n value={query}\n placeholder={placeholder}\n data={Array.isArray(data) ? data : []}\n onChange={setQuery}\n onOptionSubmit={handleOptionSubmit}\n renderOption={({ option }) => {\n const plan = optionsByLabel.get(option.value)\n const title = plan?.title ?? plan?.name ?? option.value\n const description = plan?.description?.trim()\n return (\n <Box>\n <Text size=\"sm\" fw={600}>{title}</Text>\n {description && (\n <Text size=\"xs\" c=\"dimmed\">{description}</Text>\n )}\n </Box>\n )\n }}\n onBlur={(event) => {\n inputProps.onBlur?.(event)\n handleBlur()\n }}\n clearable={clearable}\n onClear={() => {\n inputProps.onClear?.()\n handleClear()\n }}\n filter={({ options }) => options}\n rightSection={loading ? <Loader size=\"xs\"/> : rightSection}\n rightSectionPointerEvents={loading ? 'none' : inputProps.rightSectionPointerEvents}\n />\n )\n}\n"]}
1
+ {"version":3,"file":"PlanDefinitionAutocomplete.js","sourceRoot":"","sources":["../../src/search/PlanDefinitionAutocomplete.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Autocomplete, AutocompleteProps, Box, Loader, Text } from '@mantine/core'\nimport { useDebouncedValue } from '@mantine/hooks'\nimport { PlanDefinition } from '@medplum/fhirtypes'\nimport { ContentType } from '@medplum/core'\nimport { useMedplum } from '@medplum/react'\nimport { JSX, useEffect, useMemo, useRef, useState } from 'react'\n\nexport interface PlanDefinitionAutocompleteProps\n extends Omit<AutocompleteProps, 'data' | 'value' | 'defaultValue' | 'onChange' | 'onOptionSubmit'> {\n readonly value?: PlanDefinition\n readonly onChange: (plan: PlanDefinition | undefined) => void\n readonly placeholder?: string\n readonly count?: number\n readonly minQueryLength?: number\n}\n\nfunction getPlanLabel (plan: PlanDefinition | undefined): string {\n if (!plan) {\n return ''\n }\n return plan.title ?? plan.name ?? plan.id ?? ''\n}\n\nexport function PlanDefinitionAutocomplete (props: PlanDefinitionAutocompleteProps): JSX.Element {\n const {\n value,\n onChange,\n placeholder = 'Buscar práctica por título',\n count = 20,\n minQueryLength = 0,\n clearable = true,\n rightSection,\n ...inputProps\n } = props\n\n const medplum = useMedplum()\n const [query, setQuery] = useState(getPlanLabel(value))\n const [debounced] = useDebouncedValue(query, 250)\n const [loading, setLoading] = useState(false)\n const [results, setResults] = useState<PlanDefinition[]>([])\n const lastSelectedIdRef = useRef(value?.id)\n\n useEffect(() => {\n if (value?.id !== lastSelectedIdRef.current) {\n lastSelectedIdRef.current = value?.id\n setQuery(getPlanLabel(value))\n }\n }, [value])\n\n useEffect(() => {\n let cancelled = false\n\n async function run (): Promise<void> {\n const q = debounced.trim()\n if (q.length < minQueryLength) {\n setResults([])\n setLoading(false)\n return\n }\n setLoading(true)\n try {\n const bundle = await medplum.post(\n medplum.fhirUrl('PlanDefinition', '$search'),\n {\n resourceType: 'Parameters',\n parameter: [\n { name: 'q', valueString: q },\n { name: 'count', valueInteger: count }\n ]\n },\n ContentType.FHIR_JSON\n )\n const list = (bundle?.entry ?? [])\n .map((entry: any) => entry.resource as PlanDefinition)\n .filter((resource: PlanDefinition | undefined): resource is PlanDefinition => !!resource)\n if (!cancelled) {\n setResults(Array.isArray(list) ? list : [])\n }\n } catch (err) {\n if (!cancelled) {\n console.error(err)\n setResults([])\n }\n } finally {\n if (!cancelled) {\n setLoading(false)\n }\n }\n }\n\n run().catch(console.error)\n return () => {\n cancelled = true\n }\n }, [debounced, medplum, count, minQueryLength])\n\n const { data, optionsByLabel } = useMemo(() => {\n const counts = new Map<string, number>()\n for (const plan of results ?? []) {\n const base = getPlanLabel(plan) || 'Sin título'\n counts.set(base, (counts.get(base) ?? 0) + 1)\n }\n\n const data: string[] = []\n const seen = new Set<string>()\n const optionsByLabel = new Map<string, PlanDefinition>()\n\n for (const plan of results ?? []) {\n const base = getPlanLabel(plan) || 'Sin título'\n let label = base\n if ((counts.get(base) ?? 0) > 1) {\n label = `${base} (${plan.id ?? 'sin-id'})`\n }\n let uniqueLabel = label\n let suffix = 2\n while (seen.has(uniqueLabel)) {\n uniqueLabel = `${label} (${suffix})`\n suffix += 1\n }\n seen.add(uniqueLabel)\n data.push(uniqueLabel)\n optionsByLabel.set(uniqueLabel, plan)\n }\n\n return { data, optionsByLabel }\n }, [results])\n\n function handleOptionSubmit (label: string): void {\n const chosen = optionsByLabel.get(label)\n if (chosen) {\n lastSelectedIdRef.current = chosen.id\n onChange(chosen)\n setQuery(getPlanLabel(chosen))\n }\n }\n\n function handleClear (): void {\n onChange(undefined)\n setQuery('')\n }\n\n function handleBlur (): void {\n setQuery(getPlanLabel(value))\n }\n\n return (\n <Autocomplete\n {...inputProps}\n value={query}\n placeholder={placeholder}\n data={Array.isArray(data) ? data : []}\n onChange={setQuery}\n onOptionSubmit={handleOptionSubmit}\n renderOption={({ option }) => {\n const plan = optionsByLabel.get(option.value)\n const title = plan?.title ?? plan?.name ?? option.value\n const description = plan?.description?.trim()\n return (\n <Box>\n <Text size=\"sm\" fw={600}>{title}</Text>\n {description && (\n <Text size=\"xs\" c=\"dimmed\">{description}</Text>\n )}\n </Box>\n )\n }}\n onBlur={(event) => {\n inputProps.onBlur?.(event)\n handleBlur()\n }}\n clearable={clearable}\n onClear={() => {\n inputProps.onClear?.()\n handleClear()\n }}\n filter={({ options }) => options}\n rightSection={loading ? <Loader size=\"xs\"/> : rightSection}\n rightSectionPointerEvents={loading ? 'none' : inputProps.rightSectionPointerEvents}\n />\n )\n}\n"]}