@fuego-systems/react 0.1.9 → 0.1.11

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,23 +1,15 @@
1
1
  import type { Duration } from '@medplum/fhirtypes';
2
- import { type JSX } from 'react';
2
+ import { type JSX, type ReactNode } 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. */
6
6
  readonly id: string;
7
- /** Whether this is the default action. */
8
- readonly isDefault: boolean;
9
7
  /** Display label for the action (e.g. "Helicoidal"). */
10
8
  readonly label: string;
11
9
  /** User-facing question / hint for this action. */
12
10
  readonly question?: string;
13
11
  /** FHIR Duration for this action. */
14
12
  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;
21
13
  /** Optional addons (sub-actions with `any` selection). */
22
14
  readonly addons?: readonly HealthcareServiceAction[];
23
15
  }
@@ -26,16 +18,24 @@ export interface HealthcareServiceCardProps {
26
18
  readonly name: string;
27
19
  /** Specialty display name (shown as a badge). */
28
20
  readonly specialty?: string;
21
+ /** Optional custom badge rendered inline next to the service name. */
22
+ readonly badge?: ReactNode;
23
+ /** Whether to render a close button in the top-right corner. Defaults to false. */
24
+ readonly closable?: boolean;
25
+ /** Callback invoked when the close button is clicked. Only relevant when `closable` is true. */
26
+ readonly onClose?: () => void;
29
27
  /** Protocol action variants the user can choose from. */
30
28
  readonly actions: readonly HealthcareServiceAction[];
31
- /** Called when the user selects a different action. */
32
- readonly onActionChange?: (actionId: string) => void;
33
- /** Called when addon selection changes. */
34
- readonly onAddonsChange?: (parentActionId: string, addonIds: string[]) => void;
35
- /** Override the initially selected action (defaults to the default action). */
36
- readonly selectedActionId?: string;
37
- /** Set the initially selected addons by main action. */
38
- readonly selectedAddonIds?: Record<string, string[]>;
29
+ /** Current controlled selection for the chosen action and enabled addons. */
30
+ readonly protocolSelection?: HealthcareServiceProtocolSelection;
31
+ /** Called whenever the controlled protocol selection changes. */
32
+ readonly onProtocolSelectionChange?: (protocolSelection: HealthcareServiceProtocolSelection) => void;
39
33
  }
40
- export declare function HealthcareServiceCard({ name, specialty, actions, onActionChange, onAddonsChange, selectedActionId, selectedAddonIds }: HealthcareServiceCardProps): JSX.Element;
34
+ export interface HealthcareServiceProtocolSelection {
35
+ /** The `action.id` of the chosen top-level action. */
36
+ readonly actionId: string;
37
+ /** The `action.id`s of toggled-on addon sub-actions within the selected action. */
38
+ readonly addonIds?: readonly string[];
39
+ }
40
+ export declare function HealthcareServiceCard({ name, specialty, badge, closable, onClose, actions, protocolSelection, onProtocolSelectionChange }: HealthcareServiceCardProps): JSX.Element;
41
41
  //# sourceMappingURL=HealthcareServiceCard.d.ts.map
@@ -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,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;IAClC,wDAAwD;IACxD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CACrD;AAiCD,wBAAgB,qBAAqB,CAAE,EACrC,IAAI,EACJ,SAAS,EACT,OAAO,EACP,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EACjB,EAAE,0BAA0B,GAAG,GAAG,CAAC,OAAO,CAwL1C"}
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,EAAE,KAAK,GAAG,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAIvD,6DAA6D;AAC7D,MAAM,WAAW,uBAAuB;IACtC,yCAAyC;IACzC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,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,sEAAsE;IACtE,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAA;IAC1B,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,gGAAgG;IAChG,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IAC7B,yDAAyD;IACzD,QAAQ,CAAC,OAAO,EAAE,SAAS,uBAAuB,EAAE,CAAA;IACpD,6EAA6E;IAC7E,QAAQ,CAAC,iBAAiB,CAAC,EAAE,kCAAkC,CAAA;IAC/D,iEAAiE;IACjE,QAAQ,CAAC,yBAAyB,CAAC,EAAE,CAAC,iBAAiB,EAAE,kCAAkC,KAAK,IAAI,CAAA;CACrG;AAED,MAAM,WAAW,kCAAkC;IACjD,sDAAsD;IACtD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACtC;AAiCD,wBAAgB,qBAAqB,CAAE,EACrC,IAAI,EACJ,SAAS,EACT,KAAK,EACL,QAAgB,EAChB,OAAO,EACP,OAAO,EACP,iBAAiB,EACjB,yBAAyB,EAC1B,EAAE,0BAA0B,GAAG,GAAG,CAAC,OAAO,CA8K1C"}
@@ -1,6 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Badge, Card, Group, Radio, Stack, Switch, Text } from '@mantine/core';
3
- import { useState } from 'react';
2
+ import { Badge, Card, CloseButton, Group, Radio, Stack, Switch, Text } from '@mantine/core';
4
3
  // ─── Helpers ─────────────────────────────────────────────────────────────────
5
4
  function formatDuration(d) {
6
5
  var _a, _b;
@@ -15,58 +14,37 @@ function CheckIcon(props) {
15
14
  return (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: size !== null && size !== void 0 ? size : 14, height: size !== null && size !== void 0 ? size : 14, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 3, strokeLinecap: "round", strokeLinejoin: "round", style: style, ...rest, children: _jsx("polyline", { points: "20 6 9 17 4 12" }) }));
16
15
  }
17
16
  // ─── Component ───────────────────────────────────────────────────────────────
18
- export function HealthcareServiceCard({ name, specialty, actions, onActionChange, onAddonsChange, selectedActionId, selectedAddonIds }) {
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(selectedAddonIds !== null && selectedAddonIds !== void 0 ? selectedAddonIds : (() => {
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
- }));
17
+ export function HealthcareServiceCard({ name, specialty, badge, closable = false, onClose, actions, protocolSelection, onProtocolSelectionChange }) {
18
+ var _a;
37
19
  const handleChange = (value) => {
38
- setSelected(value);
39
- onActionChange === null || onActionChange === void 0 ? void 0 : onActionChange(value);
20
+ if (value !== (protocolSelection === null || protocolSelection === void 0 ? void 0 : protocolSelection.actionId)) {
21
+ onProtocolSelectionChange === null || onProtocolSelectionChange === void 0 ? void 0 : onProtocolSelectionChange({ actionId: value, addonIds: [] });
22
+ }
40
23
  };
41
- const handleAddonToggle = (parentId, addonId, checked) => {
42
- setSelectedAddons((prev) => {
43
- var _a;
44
- const current = (_a = prev[parentId]) !== null && _a !== void 0 ? _a : [];
45
- const next = checked
46
- ? [...current, addonId]
47
- : current.filter((id) => id !== addonId);
48
- const updated = { ...prev, [parentId]: next };
49
- onAddonsChange === null || onAddonsChange === void 0 ? void 0 : onAddonsChange(parentId, updated[parentId]);
50
- return updated;
51
- });
24
+ const handleAddonToggle = (actionId, addonId, checked) => {
25
+ var _a;
26
+ const current = (_a = protocolSelection === null || protocolSelection === void 0 ? void 0 : protocolSelection.addonIds) !== null && _a !== void 0 ? _a : [];
27
+ const next = checked
28
+ ? [...current, addonId]
29
+ : current.filter((id) => id !== addonId);
30
+ onProtocolSelectionChange === null || onProtocolSelectionChange === void 0 ? void 0 : onProtocolSelectionChange({ actionId, addonIds: next });
52
31
  };
53
- return (_jsx(Card, { withBorder: true, radius: "md", padding: "lg", children: _jsxs(Stack, { gap: "sm", children: [_jsxs(Stack, { gap: 4, children: [_jsx(Text, { fw: 700, size: "lg", children: name }), specialty && (_jsx(Badge, { variant: "light", color: "blue", radius: "sm", size: "sm", style: { alignSelf: 'flex-start' }, children: specialty }))] }), actions.length === 1 && (() => {
32
+ return (_jsx(Card, { withBorder: true, radius: "md", padding: "lg", children: _jsxs(Stack, { gap: "sm", children: [_jsxs(Stack, { gap: 4, children: [_jsxs(Group, { justify: "space-between", wrap: "nowrap", align: "flex-start", gap: "xs", children: [_jsx(Text, { fw: 700, size: "lg", style: { flex: 1, minWidth: 0, lineHeight: 1.2 }, children: name }), closable && (_jsx(CloseButton, { onClick: onClose, size: "sm", c: "red", "aria-label": "Quitar", style: { flexShrink: 0 } }))] }), (specialty || badge) && (_jsxs(Group, { gap: 6, wrap: "wrap", children: [specialty && (_jsx(Badge, { variant: "light", color: "blue", radius: "sm", size: "sm", children: specialty })), badge] }))] }), actions.length === 1 && (() => {
54
33
  var _a, _b;
55
34
  const action = actions[0];
56
- const dur = formatDuration(action.duration);
35
+ const duration = formatDuration(action.duration);
57
36
  const addons = (_a = action.addons) !== null && _a !== void 0 ? _a : [];
58
- const parentAddons = (_b = selectedAddons[action.id]) !== null && _b !== void 0 ? _b : [];
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: {
37
+ const selectedAddons = (protocolSelection === null || protocolSelection === void 0 ? void 0 : protocolSelection.actionId) === action.id ? (_b = protocolSelection.addonIds) !== null && _b !== void 0 ? _b : [] : [];
38
+ 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 }), duration && (_jsx(Text, { component: "span", size: "xs", c: "dimmed", style: { flexShrink: 0 }, children: duration }))] }), 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: selectedAddons.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: {
60
39
  root: { cursor: 'pointer' },
61
40
  track: { cursor: 'pointer' },
62
41
  label: { cursor: 'pointer', paddingLeft: 6 },
63
42
  } }, addon.id))) }))] }));
64
- })(), actions.length > 1 && (_jsx(Radio.Group, { value: selected, onChange: handleChange, children: _jsx(Stack, { gap: 6, children: actions.map((action) => {
65
- var _a, _b;
66
- const dur = formatDuration(action.duration);
67
- const isSelected = action.id === selected;
43
+ })(), actions.length > 1 && (_jsx(Radio.Group, { value: (_a = protocolSelection === null || protocolSelection === void 0 ? void 0 : protocolSelection.actionId) !== null && _a !== void 0 ? _a : null, onChange: handleChange, children: _jsx(Stack, { gap: 6, children: actions.map((action) => {
44
+ var _a;
45
+ const duration = formatDuration(action.duration);
46
+ const isSelected = action.id === (protocolSelection === null || protocolSelection === void 0 ? void 0 : protocolSelection.actionId);
68
47
  const addons = (_a = action.addons) !== null && _a !== void 0 ? _a : [];
69
- const parentAddons = (_b = selectedAddons[action.id]) !== null && _b !== void 0 ? _b : [];
70
48
  return (_jsx(Stack, { gap: 0, children: _jsxs(Radio.Card, { value: action.id, radius: "md", p: "xs", withBorder: true, style: {
71
49
  cursor: 'pointer',
72
50
  borderColor: isSelected
@@ -75,11 +53,14 @@ export function HealthcareServiceCard({ name, specialty, actions, onActionChange
75
53
  backgroundColor: isSelected
76
54
  ? 'var(--mantine-color-white)'
77
55
  : 'var(--mantine-color-gray-0)',
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: {
79
- root: { cursor: 'pointer' },
80
- track: { cursor: 'pointer' },
81
- label: { cursor: 'pointer', paddingLeft: 6 },
82
- } }, addon.id))) }))] }) }, action.id));
56
+ }, 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 }), duration && (_jsx(Text, { component: "span", size: "xs", c: "dimmed", style: { flexShrink: 0 }, children: duration }))] }), 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) => {
57
+ var _a;
58
+ return (_jsx(Switch, { checked: (_a = protocolSelection.addonIds) === null || _a === void 0 ? void 0 : _a.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
+ root: { cursor: 'pointer' },
60
+ track: { cursor: 'pointer' },
61
+ label: { cursor: 'pointer', paddingLeft: 6 },
62
+ } }, addon.id));
63
+ }) }))] }) }, action.id));
83
64
  }) }) }))] }) }));
84
65
  }
85
66
  //# sourceMappingURL=HealthcareServiceCard.js.map
@@ -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 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 /** Set the initially selected addons by main action. */\n readonly selectedAddonIds?: Record<string, 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 selectedAddonIds\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[]>>(selectedAddonIds ?? (() => {\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
+ {"version":3,"file":"HealthcareServiceCard.js","sourceRoot":"","sources":["../../src/HealthcareServiceCard/HealthcareServiceCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Badge, Card, CloseButton, Group, Radio, Stack, Switch, Text } from '@mantine/core'\nimport type { Duration } from '@medplum/fhirtypes'\nimport React, { type JSX, type ReactNode } 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 /** 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 /** Optional custom badge rendered inline next to the service name. */\n readonly badge?: ReactNode\n /** Whether to render a close button in the top-right corner. Defaults to false. */\n readonly closable?: boolean\n /** Callback invoked when the close button is clicked. Only relevant when `closable` is true. */\n readonly onClose?: () => void\n /** Protocol action variants the user can choose from. */\n readonly actions: readonly HealthcareServiceAction[]\n /** Current controlled selection for the chosen action and enabled addons. */\n readonly protocolSelection?: HealthcareServiceProtocolSelection\n /** Called whenever the controlled protocol selection changes. */\n readonly onProtocolSelectionChange?: (protocolSelection: HealthcareServiceProtocolSelection) => void\n}\n\nexport interface HealthcareServiceProtocolSelection {\n /** The `action.id` of the chosen top-level action. */\n readonly actionId: string\n /** The `action.id`s of toggled-on addon sub-actions within the selected action. */\n readonly addonIds?: readonly 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 badge,\n closable = false,\n onClose,\n actions,\n protocolSelection,\n onProtocolSelectionChange\n}: HealthcareServiceCardProps): JSX.Element {\n const handleChange = (value: string): void => {\n if (value !== protocolSelection?.actionId) {\n onProtocolSelectionChange?.({ actionId: value, addonIds: [] })\n }\n }\n\n const handleAddonToggle = (actionId: string, addonId: string, checked: boolean): void => {\n const current = protocolSelection?.addonIds ?? []\n const next = checked\n ? [...current, addonId]\n : current.filter((id) => id !== addonId)\n onProtocolSelectionChange?.({ actionId, addonIds: next })\n }\n\n return (\n <Card withBorder radius=\"md\" padding=\"lg\">\n <Stack gap=\"sm\">\n {/* Header: name + optional close; specialty + optional badge below */}\n <Stack gap={4}>\n <Group justify=\"space-between\" wrap=\"nowrap\" align=\"flex-start\" gap=\"xs\">\n <Text fw={700} size=\"lg\" style={{ flex: 1, minWidth: 0, lineHeight: 1.2 }}>{name}</Text>\n {closable && (\n <CloseButton\n onClick={onClose}\n size=\"sm\"\n c=\"red\"\n aria-label=\"Quitar\"\n style={{ flexShrink: 0 }}\n />\n )}\n </Group>\n {(specialty || badge) && (\n <Group gap={6} wrap=\"wrap\">\n {specialty && (\n <Badge variant=\"light\" color=\"blue\" radius=\"sm\" size=\"sm\">\n {specialty}\n </Badge>\n )}\n {badge}\n </Group>\n )}\n </Stack>\n\n {/* Action variants */}\n {actions.length === 1 && (() => {\n const action = actions[0]\n const duration = formatDuration(action.duration)\n const addons = action.addons ?? []\n const selectedAddons = protocolSelection?.actionId === action.id ? protocolSelection.addonIds ?? [] : []\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 {duration && (\n <Text component=\"span\" size=\"xs\" c=\"dimmed\" style={{ flexShrink: 0 }}>{duration}</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={selectedAddons.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={protocolSelection?.actionId ?? null} onChange={handleChange}>\n <Stack gap={6}>\n {actions.map((action) => {\n const duration = formatDuration(action.duration)\n const isSelected = action.id === protocolSelection?.actionId\n const addons = action.addons ?? []\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 {duration && (\n <Text component=\"span\" size=\"xs\" c=\"dimmed\" style={{ flexShrink: 0 }}>{duration}</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={protocolSelection.addonIds?.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"]}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { HealthcareServiceCard } from './HealthcareServiceCard/HealthcareServiceCard';
2
- export type { HealthcareServiceCardProps, HealthcareServiceAction } from './HealthcareServiceCard/HealthcareServiceCard';
2
+ export type { HealthcareServiceCardProps, HealthcareServiceAction, HealthcareServiceProtocolSelection } from './HealthcareServiceCard/HealthcareServiceCard';
3
3
  export { HealthcareServiceDirectory } from './HealthcareServiceDirectory/HealthcareServiceDirectory';
4
4
  export type { HealthcareServiceDirectoryProps } from './HealthcareServiceDirectory/HealthcareServiceDirectory';
5
5
  export { FuegoLogo } from './Logo/FuegoLogo';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAA;AACrF,YAAY,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAA;AACxH,OAAO,EAAE,0BAA0B,EAAE,MAAM,yDAAyD,CAAA;AACpG,YAAY,EAAE,+BAA+B,EAAE,MAAM,yDAAyD,CAAA;AAC9G,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAClE,YAAY,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAA;AAE5E,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAC7D,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAA;AACrF,YAAY,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,kCAAkC,EAAE,MAAM,+CAA+C,CAAA;AAC5J,OAAO,EAAE,0BAA0B,EAAE,MAAM,yDAAyD,CAAA;AACpG,YAAY,EAAE,+BAA+B,EAAE,MAAM,yDAAyD,CAAA;AAC9G,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAClE,YAAY,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAA;AAE5E,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAC7D,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAA;AAErF,OAAO,EAAE,0BAA0B,EAAE,MAAM,yDAAyD,CAAA;AAEpG,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAGlE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA","sourcesContent":["export { HealthcareServiceCard } from './HealthcareServiceCard/HealthcareServiceCard'\nexport type { HealthcareServiceCardProps, HealthcareServiceAction } from './HealthcareServiceCard/HealthcareServiceCard'\nexport { HealthcareServiceDirectory } from './HealthcareServiceDirectory/HealthcareServiceDirectory'\nexport type { HealthcareServiceDirectoryProps } from './HealthcareServiceDirectory/HealthcareServiceDirectory'\nexport { FuegoLogo } from './Logo/FuegoLogo'\nexport { RossiLogo } from './Logo/RossiLogo'\nexport { ServiceAutocomplete } from './search/ServiceAutocomplete'\nexport type { ServiceAutocompleteProps } from './search/ServiceAutocomplete'\n\nexport { OtpInput } from './OtpInput/OtpInput'\nexport type { OtpInputProps } from './OtpInput/OtpInput'\nexport { WizardStepper } from './WizardStepper/WizardStepper'\nexport type { WizardStepperProps, WizardStep } from './WizardStepper/WizardStepper'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAA;AAErF,OAAO,EAAE,0BAA0B,EAAE,MAAM,yDAAyD,CAAA;AAEpG,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAGlE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA","sourcesContent":["export { HealthcareServiceCard } from './HealthcareServiceCard/HealthcareServiceCard'\nexport type { HealthcareServiceCardProps, HealthcareServiceAction, HealthcareServiceProtocolSelection } from './HealthcareServiceCard/HealthcareServiceCard'\nexport { HealthcareServiceDirectory } from './HealthcareServiceDirectory/HealthcareServiceDirectory'\nexport type { HealthcareServiceDirectoryProps } from './HealthcareServiceDirectory/HealthcareServiceDirectory'\nexport { FuegoLogo } from './Logo/FuegoLogo'\nexport { RossiLogo } from './Logo/RossiLogo'\nexport { ServiceAutocomplete } from './search/ServiceAutocomplete'\nexport type { ServiceAutocompleteProps } from './search/ServiceAutocomplete'\n\nexport { OtpInput } from './OtpInput/OtpInput'\nexport type { OtpInputProps } from './OtpInput/OtpInput'\nexport { WizardStepper } from './WizardStepper/WizardStepper'\nexport type { WizardStepperProps, WizardStep } from './WizardStepper/WizardStepper'\n"]}