@alfadocs/ui-kit-debug 1.30.0 → 1.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/{address-fields-CZ0pEdEI.js → address-fields-jFfjxOQR.js} +3 -3
- package/dist/_chunks/{address-fields-CZ0pEdEI.js.map → address-fields-jFfjxOQR.js.map} +1 -1
- package/dist/_chunks/{appointment-card-Dzr3GeVz.js → appointment-card-CvUFFEdS.js} +8 -6
- package/dist/_chunks/appointment-card-CvUFFEdS.js.map +1 -0
- package/dist/_chunks/{appointment-timeline-DhHwmHo1.js → appointment-timeline-DsMZY7U9.js} +2 -2
- package/dist/_chunks/{appointment-timeline-DhHwmHo1.js.map → appointment-timeline-DsMZY7U9.js.map} +1 -1
- package/dist/_chunks/{appointment-tray-4FUu_5NX.js → appointment-tray-Z2GaOIYQ.js} +2 -2
- package/dist/_chunks/{appointment-tray-4FUu_5NX.js.map → appointment-tray-Z2GaOIYQ.js.map} +1 -1
- package/dist/_chunks/{booking-AabCk7CI.js → booking-jGzRUETo.js} +2 -2
- package/dist/_chunks/{booking-AabCk7CI.js.map → booking-jGzRUETo.js.map} +1 -1
- package/dist/_chunks/{calendar-CI9MINcR.js → calendar-BNQKpxhE.js} +494 -438
- package/dist/_chunks/calendar-BNQKpxhE.js.map +1 -0
- package/dist/_chunks/{calendar-event-card-66CEEWU6.js → calendar-event-card-DSh-69HT.js} +130 -122
- package/dist/_chunks/calendar-event-card-DSh-69HT.js.map +1 -0
- package/dist/_chunks/calendar-workspace-Dy1jHBvG.js +9392 -0
- package/dist/_chunks/calendar-workspace-Dy1jHBvG.js.map +1 -0
- package/dist/_chunks/{clinical-note-card-BBgFd2nB.js → clinical-note-card-yCTR9DB6.js} +185 -188
- package/dist/_chunks/clinical-note-card-yCTR9DB6.js.map +1 -0
- package/dist/_chunks/{color-picker-CU303VjY.js → color-picker-Bl5f0iK1.js} +28 -25
- package/dist/_chunks/color-picker-Bl5f0iK1.js.map +1 -0
- package/dist/_chunks/{combobox-D7_NLE2Z.js → combobox-DnSdYssy.js} +216 -215
- package/dist/_chunks/combobox-DnSdYssy.js.map +1 -0
- package/dist/_chunks/{country-select-DzbPFktV.js → country-select-CfDNFG5c.js} +2 -2
- package/dist/_chunks/{country-select-DzbPFktV.js.map → country-select-CfDNFG5c.js.map} +1 -1
- package/dist/_chunks/{face-scheme-DA2vjqaM.js → face-scheme-l-CQyLs-.js} +2 -2
- package/dist/_chunks/{face-scheme-DA2vjqaM.js.map → face-scheme-l-CQyLs-.js.map} +1 -1
- package/dist/_chunks/notes-panel-am6e-Lwh.js +380 -0
- package/dist/_chunks/notes-panel-am6e-Lwh.js.map +1 -0
- package/dist/_chunks/{patient-details-DYAmq76G.js → patient-details-CdfursHt.js} +3 -3
- package/dist/_chunks/{patient-details-DYAmq76G.js.map → patient-details-CdfursHt.js.map} +1 -1
- package/dist/_chunks/{province-select-BBc7s7vR.js → province-select-BaUnkg4S.js} +2 -2
- package/dist/_chunks/{province-select-BBc7s7vR.js.map → province-select-BaUnkg4S.js.map} +1 -1
- package/dist/_chunks/{rich-text-editor-lSCiE0Zz.js → rich-text-editor-VJATL1Tk.js} +2 -2
- package/dist/_chunks/{rich-text-editor-lSCiE0Zz.js.map → rich-text-editor-VJATL1Tk.js.map} +1 -1
- package/dist/_chunks/{timeline-r-8IUoBS.js → timeline-u-2t9t_M.js} +37 -35
- package/dist/_chunks/timeline-u-2t9t_M.js.map +1 -0
- package/dist/agent-catalog.json +51 -10
- package/dist/agent-i18n/en.json +9 -7
- package/dist/components/_shared/get-error-message.d.ts +3 -0
- package/dist/components/_shared/get-error-message.d.ts.map +1 -0
- package/dist/components/address-fields/index.js +1 -1
- package/dist/components/appointment-card/appointment-card.d.ts.map +1 -1
- package/dist/components/appointment-card/index.js +2 -2
- package/dist/components/appointment-timeline/index.js +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/calendar/calendar.d.ts +26 -2
- package/dist/components/calendar/calendar.d.ts.map +1 -1
- package/dist/components/calendar/index.js +1 -1
- package/dist/components/calendar-event-card/calendar-event-card.d.ts +9 -0
- package/dist/components/calendar-event-card/calendar-event-card.d.ts.map +1 -1
- package/dist/components/calendar-event-card/index.js +1 -1
- package/dist/components/clinical-note-card/clinical-note-card.d.ts +16 -1
- package/dist/components/clinical-note-card/clinical-note-card.d.ts.map +1 -1
- package/dist/components/clinical-note-card/index.js +1 -1
- package/dist/components/color-picker/color-utils.d.ts.map +1 -1
- package/dist/components/color-picker/index.js +1 -1
- package/dist/components/combobox/combobox.d.ts +5 -0
- package/dist/components/combobox/combobox.d.ts.map +1 -1
- package/dist/components/combobox/index.js +1 -1
- package/dist/components/country-select/index.js +1 -1
- package/dist/components/face-scheme/index.js +1 -1
- package/dist/components/notes-panel/index.d.ts +1 -1
- package/dist/components/notes-panel/index.d.ts.map +1 -1
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/notes-panel/notes-panel.agent.d.ts.map +1 -1
- package/dist/components/notes-panel/notes-panel.d.ts +24 -5
- package/dist/components/notes-panel/notes-panel.d.ts.map +1 -1
- package/dist/components/patient-details/index.js +1 -1
- package/dist/components/province-select/index.js +1 -1
- package/dist/components/rich-text-editor/index.js +1 -1
- package/dist/components/timeline/index.js +1 -1
- package/dist/components/timeline/timeline.d.ts +2 -0
- package/dist/components/timeline/timeline.d.ts.map +1 -1
- package/dist/host-compat.css +7 -1
- package/dist/i18n/locales/ar.d.ts +50 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +54 -4
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +60 -10
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +64 -14
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +50 -0
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +54 -4
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +50 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +54 -4
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +50 -0
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +54 -4
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +50 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +53 -3
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +50 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +54 -4
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +60 -10
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +64 -14
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +50 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +54 -4
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +50 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +54 -4
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +50 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +54 -4
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +50 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +54 -4
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +50 -0
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +53 -3
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +50 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +54 -4
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +50 -0
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +54 -4
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +50 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +54 -4
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +50 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +54 -4
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +50 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +54 -4
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +91 -90
- package/dist/locales/ar.json +54 -4
- package/dist/locales/de.json +64 -14
- package/dist/locales/el.json +54 -4
- package/dist/locales/en.json +54 -4
- package/dist/locales/es.json +54 -4
- package/dist/locales/fr.json +53 -3
- package/dist/locales/hi.json +54 -4
- package/dist/locales/it.json +64 -14
- package/dist/locales/ja.json +54 -4
- package/dist/locales/nl.json +54 -4
- package/dist/locales/pl.json +54 -4
- package/dist/locales/pt.json +54 -4
- package/dist/locales/ro.json +53 -3
- package/dist/locales/ru.json +54 -4
- package/dist/locales/sq.json +54 -4
- package/dist/locales/sv.json +54 -4
- package/dist/locales/tr.json +54 -4
- package/dist/locales/zh.json +54 -4
- package/dist/patterns/calendar/calendar-appointment-details.d.ts +145 -0
- package/dist/patterns/calendar/calendar-appointment-details.d.ts.map +1 -0
- package/dist/patterns/calendar/calendar-appointment-details.sections.d.ts +32 -0
- package/dist/patterns/calendar/calendar-appointment-details.sections.d.ts.map +1 -0
- package/dist/patterns/calendar/calendar-editor-hydration.d.ts +59 -0
- package/dist/patterns/calendar/calendar-editor-hydration.d.ts.map +1 -0
- package/dist/patterns/calendar/calendar-notes-tool.d.ts +14 -0
- package/dist/patterns/calendar/calendar-notes-tool.d.ts.map +1 -0
- package/dist/patterns/calendar/calendar-patient-picker.d.ts +11 -0
- package/dist/patterns/calendar/calendar-patient-picker.d.ts.map +1 -0
- package/dist/patterns/calendar/calendar-series-scope-chooser.d.ts +18 -0
- package/dist/patterns/calendar/calendar-series-scope-chooser.d.ts.map +1 -0
- package/dist/patterns/calendar/calendar-workspace.d.ts +26 -1
- package/dist/patterns/calendar/calendar-workspace.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar-workspace.model.d.ts +8 -5
- package/dist/patterns/calendar/calendar-workspace.model.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.data.d.ts +66 -1
- package/dist/patterns/calendar/calendar.data.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.host.d.ts +2 -0
- package/dist/patterns/calendar/calendar.host.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.journey.d.ts +42 -7
- package/dist/patterns/calendar/calendar.journey.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.model.d.ts +54 -5
- package/dist/patterns/calendar/calendar.model.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.sheets.d.ts +68 -15
- package/dist/patterns/calendar/calendar.sheets.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.surface.d.ts +12 -2
- package/dist/patterns/calendar/calendar.surface.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.types.d.ts +29 -1
- package/dist/patterns/calendar/calendar.types.d.ts.map +1 -1
- package/dist/patterns/calendar/index.d.ts +9 -6
- package/dist/patterns/calendar/index.d.ts.map +1 -1
- package/dist/patterns/calendar/index.js +15 -14
- package/dist/tokens.css +10 -2
- package/package.json +1 -1
- package/dist/_chunks/appointment-card-Dzr3GeVz.js.map +0 -1
- package/dist/_chunks/calendar-CI9MINcR.js.map +0 -1
- package/dist/_chunks/calendar-event-card-66CEEWU6.js.map +0 -1
- package/dist/_chunks/calendar-workspace-a84AHQwj.js +0 -7506
- package/dist/_chunks/calendar-workspace-a84AHQwj.js.map +0 -1
- package/dist/_chunks/clinical-note-card-BBgFd2nB.js.map +0 -1
- package/dist/_chunks/color-picker-CU303VjY.js.map +0 -1
- package/dist/_chunks/combobox-D7_NLE2Z.js.map +0 -1
- package/dist/_chunks/notes-panel-CTNpsByN.js +0 -353
- package/dist/_chunks/notes-panel-CTNpsByN.js.map +0 -1
- package/dist/_chunks/timeline-r-8IUoBS.js.map +0 -1
|
@@ -130,10 +130,10 @@ const K = {
|
|
|
130
130
|
layout: t = "rail-start",
|
|
131
131
|
order: r = "newest-first",
|
|
132
132
|
className: s,
|
|
133
|
-
children:
|
|
133
|
+
children: a,
|
|
134
134
|
...n
|
|
135
|
-
},
|
|
136
|
-
const
|
|
135
|
+
}, d) => {
|
|
136
|
+
const i = p(() => ({ layout: t, order: r }), [t, r]), o = w(null), [l, z] = V(null), h = w(null);
|
|
137
137
|
h.current = l;
|
|
138
138
|
const x = I((y) => {
|
|
139
139
|
var T;
|
|
@@ -149,7 +149,7 @@ const K = {
|
|
|
149
149
|
}),
|
|
150
150
|
[x]
|
|
151
151
|
);
|
|
152
|
-
return O(
|
|
152
|
+
return O(d, () => o.current, []), B(K, R, n.id), /* @__PURE__ */ e(v.Provider, { value: i, children: /* @__PURE__ */ e(
|
|
153
153
|
"ol",
|
|
154
154
|
{
|
|
155
155
|
ref: o,
|
|
@@ -158,37 +158,37 @@ const K = {
|
|
|
158
158
|
"data-selected-event": l ?? void 0,
|
|
159
159
|
className: U({ layout: t, order: r, className: s }),
|
|
160
160
|
...n,
|
|
161
|
-
children:
|
|
161
|
+
children: a
|
|
162
162
|
}
|
|
163
163
|
) });
|
|
164
164
|
}
|
|
165
165
|
);
|
|
166
166
|
E.displayName = "Timeline";
|
|
167
167
|
const S = m(
|
|
168
|
-
({ type: t = "neutral", eventId: r, className: s, children:
|
|
169
|
-
const { layout:
|
|
170
|
-
return
|
|
168
|
+
({ type: t = "neutral", eventId: r, className: s, children: a, ...n }, d) => {
|
|
169
|
+
const { layout: i } = u(v), { t: o } = A(), l = p(() => ({ type: t }), [t]);
|
|
170
|
+
return i === "alternating" ? /* @__PURE__ */ e(g.Provider, { value: l, children: /* @__PURE__ */ c(
|
|
171
171
|
"li",
|
|
172
172
|
{
|
|
173
|
-
ref:
|
|
173
|
+
ref: d,
|
|
174
174
|
"data-event-id": r,
|
|
175
175
|
className: ["ds:contents", s].filter(Boolean).join(" "),
|
|
176
176
|
...n,
|
|
177
177
|
children: [
|
|
178
178
|
/* @__PURE__ */ e("span", { className: "ds:sr-only", children: o(`timeline.type.${t}`) }),
|
|
179
|
-
|
|
179
|
+
a
|
|
180
180
|
]
|
|
181
181
|
}
|
|
182
182
|
) }) : /* @__PURE__ */ e(g.Provider, { value: l, children: /* @__PURE__ */ c(
|
|
183
183
|
"li",
|
|
184
184
|
{
|
|
185
|
-
ref:
|
|
185
|
+
ref: d,
|
|
186
186
|
"data-event-id": r,
|
|
187
|
-
className: W({ layout:
|
|
187
|
+
className: W({ layout: i, className: s }),
|
|
188
188
|
...n,
|
|
189
189
|
children: [
|
|
190
190
|
/* @__PURE__ */ e("span", { className: "ds:sr-only", children: o(`timeline.type.${t}`) }),
|
|
191
|
-
|
|
191
|
+
a
|
|
192
192
|
]
|
|
193
193
|
}
|
|
194
194
|
) });
|
|
@@ -196,38 +196,38 @@ const S = m(
|
|
|
196
196
|
);
|
|
197
197
|
S.displayName = "Timeline.Event";
|
|
198
198
|
const _ = m(
|
|
199
|
-
({ icon: t, className: r, ...s },
|
|
200
|
-
const { type: n } = u(g), { layout:
|
|
199
|
+
({ icon: t, className: r, ...s }, a) => {
|
|
200
|
+
const { type: n } = u(g), { layout: d } = u(v), i = /* @__PURE__ */ e(
|
|
201
201
|
"div",
|
|
202
202
|
{
|
|
203
|
-
ref:
|
|
203
|
+
ref: a,
|
|
204
204
|
"aria-hidden": "true",
|
|
205
205
|
className: Y({ type: n, className: r }),
|
|
206
206
|
...s,
|
|
207
207
|
children: t ?? X[n]
|
|
208
208
|
}
|
|
209
209
|
);
|
|
210
|
-
return
|
|
210
|
+
return d === "alternating" ? /* @__PURE__ */ c(
|
|
211
211
|
"div",
|
|
212
212
|
{
|
|
213
213
|
"aria-hidden": "true",
|
|
214
214
|
className: "ds:col-start-2 ds:flex ds:flex-col ds:items-center",
|
|
215
215
|
children: [
|
|
216
216
|
/* @__PURE__ */ e("div", { className: "ds:w-[var(--border-width-md)] ds:flex-1 ds:bg-[var(--border)] ds:first:hidden" }),
|
|
217
|
-
|
|
217
|
+
i,
|
|
218
218
|
/* @__PURE__ */ e("div", { className: "ds:w-[var(--border-width-md)] ds:flex-1 ds:bg-[var(--border)]" })
|
|
219
219
|
]
|
|
220
220
|
}
|
|
221
|
-
) :
|
|
221
|
+
) : i;
|
|
222
222
|
}
|
|
223
223
|
);
|
|
224
224
|
_.displayName = "Timeline.Dot";
|
|
225
225
|
const j = m(
|
|
226
|
-
({ title: t, description: r, actor: s, children:
|
|
226
|
+
({ title: t, description: r, actor: s, children: a, className: n, ...d }, i) => {
|
|
227
227
|
const { layout: o } = u(v), l = /* @__PURE__ */ e(
|
|
228
228
|
"div",
|
|
229
229
|
{
|
|
230
|
-
ref:
|
|
230
|
+
ref: i,
|
|
231
231
|
className: [
|
|
232
232
|
"ds:flex-1 ds:min-w-0 ds:pb-[var(--spacing-md)]",
|
|
233
233
|
// Wrap policy: `break-word` (not `anywhere`) preserves word-
|
|
@@ -240,7 +240,7 @@ const j = m(
|
|
|
240
240
|
"ds:[&_*]:break-normal ds:[&_*]:[overflow-wrap:break-word]",
|
|
241
241
|
n
|
|
242
242
|
].filter(Boolean).join(" "),
|
|
243
|
-
...
|
|
243
|
+
...d,
|
|
244
244
|
children: /* @__PURE__ */ e(N, { variant: "outlined", children: /* @__PURE__ */ c(N.Body, { children: [
|
|
245
245
|
/* @__PURE__ */ e("p", { className: "type-label ds:text-[var(--foreground)]", children: t }),
|
|
246
246
|
r && /* @__PURE__ */ e("p", { className: "ds:mt-[var(--spacing-xs)] type-body-sm ds:text-[var(--muted-foreground)]", children: r }),
|
|
@@ -248,7 +248,7 @@ const j = m(
|
|
|
248
248
|
/* @__PURE__ */ e(P, { size: "xs", name: s.name, src: s.src }),
|
|
249
249
|
/* @__PURE__ */ e("span", { className: "type-meta ds:text-[var(--muted-foreground)]", children: s.name })
|
|
250
250
|
] }),
|
|
251
|
-
|
|
251
|
+
a
|
|
252
252
|
] }) })
|
|
253
253
|
}
|
|
254
254
|
);
|
|
@@ -259,24 +259,26 @@ j.displayName = "Timeline.Content";
|
|
|
259
259
|
const G = 1440 * 60 * 1e3, k = m(
|
|
260
260
|
({
|
|
261
261
|
date: t,
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
262
|
+
locale: r,
|
|
263
|
+
relative: s = !0,
|
|
264
|
+
format: a = { dateStyle: "medium", timeStyle: "short" },
|
|
265
|
+
className: n,
|
|
266
|
+
...d
|
|
267
|
+
}, i) => /* @__PURE__ */ e(
|
|
267
268
|
q,
|
|
268
269
|
{
|
|
269
|
-
ref:
|
|
270
|
+
ref: i,
|
|
270
271
|
value: t,
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
272
|
+
locale: r,
|
|
273
|
+
format: s ? "relative" : "absolute",
|
|
274
|
+
relativeWindow: s ? G : void 0,
|
|
275
|
+
absoluteFormat: a,
|
|
274
276
|
className: [
|
|
275
277
|
"ds:text-[var(--muted-foreground)]",
|
|
276
278
|
"ds:[font-variant-numeric:var(--font-feature-tabular)]",
|
|
277
|
-
|
|
279
|
+
n
|
|
278
280
|
].filter(Boolean).join(" "),
|
|
279
|
-
...
|
|
281
|
+
...d
|
|
280
282
|
}
|
|
281
283
|
)
|
|
282
284
|
);
|
|
@@ -291,4 +293,4 @@ export {
|
|
|
291
293
|
le as T,
|
|
292
294
|
K as t
|
|
293
295
|
};
|
|
294
|
-
//# sourceMappingURL=timeline-
|
|
296
|
+
//# sourceMappingURL=timeline-u-2t9t_M.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline-u-2t9t_M.js","sources":["../../src/components/timeline/timeline.agent.ts","../../src/components/timeline/timeline.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — Timeline. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { TimelineHandle } from './timeline';\n\nexport const timelineAgent: AgentAdapter<TimelineHandle> = {\n id: 'timeline',\n // `select_event` persists `selectedEvent` state, so this is single-selection\n // (`select_single`), not a transient `pick`. See PRS §26 §4.\n capabilities: ['select_single'],\n state: {\n selectedEvent: {\n type: 'string | null',\n descriptionKey: 'ui.agent.timeline.state.selectedEvent',\n description: 'Opaque event id of the currently-active event, or null.',\n read: (handle) => handle.getSelectedEvent(),\n },\n },\n actions: {\n select_event: {\n safety: 'read',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.timeline.actions.selectEvent',\n description: 'Scroll the given event into view and mark it as selected.',\n invoke: (handle, args: { id: string }) => {\n handle.selectEvent(args.id);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'timeline',\n description: 'Marks the Timeline root.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-event-id',\n description:\n 'Opaque event id emitted on each Timeline.Event when the `eventId` prop is provided.',\n },\n },\n};\n","import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type LiHTMLAttributes,\n type OlHTMLAttributes,\n type ReactNode,\n type TimeHTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { TriangleAlert, Check, Circle, Info, X } from 'lucide-react';\nimport { Avatar } from '../avatar';\nimport { Card } from '../card';\nimport { Timestamp } from '../timestamp';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { timelineAgent } from './timeline.agent';\n\n// TODO: optional @tanstack/react-virtual integration for 500+ events\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\ntype EventType = 'info' | 'success' | 'warning' | 'error' | 'neutral';\ntype Layout = 'rail-start' | 'rail-end' | 'alternating';\n\ninterface TimelineContextValue {\n layout: Layout;\n order: 'newest-first' | 'oldest-first';\n}\n\nconst TimelineContext = createContext<TimelineContextValue>({\n layout: 'rail-start',\n order: 'newest-first',\n});\n\ninterface TimelineEventContextValue {\n type: EventType;\n}\n\nconst TimelineEventContext = createContext<TimelineEventContextValue>({\n type: 'neutral',\n});\n\n/* ------------------------------------------------------------------ */\n/* CVA — root */\n/* ------------------------------------------------------------------ */\n\nconst timelineVariants = cva('ds:flex ds:flex-col', {\n variants: {\n layout: {\n 'rail-start': 'ds:ps-4',\n 'rail-end': 'ds:pe-4',\n alternating:\n 'ds:grid ds:grid-cols-[1fr_2rem_1fr] ds:gap-x-[var(--spacing-md)]',\n },\n order: {\n 'newest-first': 'ds:flex-col',\n 'oldest-first': 'ds:flex-col-reverse',\n },\n },\n defaultVariants: { layout: 'rail-start', order: 'newest-first' },\n});\n\n/* ------------------------------------------------------------------ */\n/* CVA — event item */\n/* ------------------------------------------------------------------ */\n\nconst eventVariants = cva(\n 'ds:relative ds:flex ds:gap-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n {\n variants: {\n layout: {\n 'rail-start': [\n 'ds:flex-row',\n // Rail: continuous border on the inline-start of the event list\n 'ds:before:absolute ds:before:top-8 ds:before:bottom-0',\n 'ds:before:border-inline-start-[2px] ds:before:border-[color:var(--border)]',\n 'ds:before:inset-inline-start-[-1rem]',\n 'ds:last:before:hidden',\n ].join(' '),\n 'rail-end': [\n 'ds:flex-row-reverse',\n 'ds:before:absolute ds:before:top-8 ds:before:bottom-0',\n 'ds:before:border-inline-end-[2px] ds:before:border-[color:var(--border)]',\n 'ds:before:inset-inline-end-[-1rem]',\n 'ds:last:before:hidden',\n ].join(' '),\n alternating: 'ds:contents',\n },\n },\n defaultVariants: { layout: 'rail-start' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* CVA — dot */\n/* ------------------------------------------------------------------ */\n\nconst dotVariants = cva(\n [\n 'ds:relative ds:z-10 ds:flex ds:items-center ds:justify-center',\n 'ds:rounded-[var(--radius-full)] ds:shrink-0',\n 'ds:size-8',\n 'ds:ring-2 ds:ring-[var(--background)]',\n ].join(' '),\n {\n variants: {\n type: {\n info: 'ds:bg-[var(--info)] ds:text-[var(--info-solid-foreground)]',\n success:\n 'ds:bg-[var(--success)] ds:text-[var(--success-solid-foreground)]',\n warning:\n 'ds:bg-[var(--warning)] ds:text-[var(--warning-solid-foreground)]',\n error:\n 'ds:bg-[var(--destructive)] ds:text-[var(--destructive-foreground)]',\n neutral: 'ds:bg-[var(--muted)] ds:text-[var(--muted-foreground)]',\n },\n },\n defaultVariants: { type: 'neutral' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface TimelineProps\n extends\n Omit<OlHTMLAttributes<HTMLOListElement>, 'color'>,\n VariantProps<typeof timelineVariants> {\n layout?: Layout;\n order?: 'newest-first' | 'oldest-first';\n children: ReactNode;\n className?: string;\n}\n\nexport interface TimelineEventProps extends LiHTMLAttributes<HTMLLIElement> {\n type?: EventType;\n /** Opaque event id — when set, the component emits `data-event-id` for agent addressing. */\n eventId?: string;\n children: ReactNode;\n className?: string;\n}\n\n/** Curated imperative handle for agent / external automation. */\nexport interface TimelineHandle {\n getSelectedEvent: () => string | null;\n selectEvent: (id: string) => void;\n}\n\nexport interface TimelineDotProps extends HTMLAttributes<HTMLDivElement> {\n icon?: ReactNode;\n className?: string;\n}\n\nexport interface TimelineContentProps extends HTMLAttributes<HTMLDivElement> {\n title: string;\n description?: string;\n actor?: { name: string; src?: string };\n children?: ReactNode;\n className?: string;\n}\n\nexport interface TimelineTimestampProps extends TimeHTMLAttributes<HTMLTimeElement> {\n date: Date | string;\n /** Overrides the active language for date and time formatting. */\n locale?: string;\n relative?: boolean;\n format?: Intl.DateTimeFormatOptions;\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Default icons per type */\n/* ------------------------------------------------------------------ */\n\nconst TYPE_ICONS: Record<EventType, ReactNode> = {\n info: <Info size={16} aria-hidden=\"true\" />,\n success: <Check size={16} aria-hidden=\"true\" />,\n warning: <TriangleAlert size={16} aria-hidden=\"true\" />,\n error: <X size={16} aria-hidden=\"true\" />,\n neutral: <Circle size={16} aria-hidden=\"true\" />,\n};\n\n/* ------------------------------------------------------------------ */\n/* Timeline root */\n/* ------------------------------------------------------------------ */\n\nconst TimelineRoot = forwardRef<HTMLOListElement, TimelineProps>(\n (\n {\n layout = 'rail-start',\n order = 'newest-first',\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const ctx = useMemo(() => ({ layout, order }), [layout, order]);\n const olRef = useRef<HTMLOListElement | null>(null);\n const [selectedEvent, setSelectedEvent] = useState<string | null>(null);\n const latestRef = useRef<string | null>(null);\n latestRef.current = selectedEvent;\n\n const selectEvent = useCallback((id: string) => {\n setSelectedEvent(id);\n const target = olRef.current?.querySelector(\n `[data-event-id=\"${id}\"]`,\n ) as HTMLElement | null;\n target?.scrollIntoView({ block: 'center', behavior: 'auto' });\n }, []);\n\n const agentHandle = useMemo<TimelineHandle>(\n () => ({\n getSelectedEvent: () => latestRef.current,\n selectEvent,\n }),\n [selectEvent],\n );\n useImperativeHandle(ref, () => olRef.current as HTMLOListElement, []);\n useAgentRegistration(timelineAgent, agentHandle, props.id);\n\n return (\n <TimelineContext.Provider value={ctx}>\n <ol\n ref={olRef}\n data-component=\"timeline\"\n data-component-id={props.id}\n data-selected-event={selectedEvent ?? undefined}\n className={timelineVariants({ layout, order, className })}\n {...props}\n >\n {children}\n </ol>\n </TimelineContext.Provider>\n );\n },\n);\nTimelineRoot.displayName = 'Timeline';\n\n/* ------------------------------------------------------------------ */\n/* Timeline.Event */\n/* ------------------------------------------------------------------ */\n\nconst TimelineEvent = forwardRef<HTMLLIElement, TimelineEventProps>(\n ({ type = 'neutral', eventId, className, children, ...props }, ref) => {\n const { layout } = useContext(TimelineContext);\n const { t } = useTranslation();\n\n const evtCtx = useMemo(() => ({ type }), [type]);\n\n if (layout === 'alternating') {\n // In alternating layout the <li> uses `contents` so its children\n // participate directly in the parent grid.\n return (\n <TimelineEventContext.Provider value={evtCtx}>\n <li\n ref={ref}\n data-event-id={eventId}\n className={['ds:contents', className].filter(Boolean).join(' ')}\n {...props}\n >\n {/* Visually-hidden type prefix for screen readers */}\n <span className=\"ds:sr-only\">{t(`timeline.type.${type}`)}</span>\n {children}\n </li>\n </TimelineEventContext.Provider>\n );\n }\n\n return (\n <TimelineEventContext.Provider value={evtCtx}>\n <li\n ref={ref}\n data-event-id={eventId}\n className={eventVariants({ layout, className })}\n {...props}\n >\n {/* Visually-hidden type prefix for screen readers */}\n <span className=\"ds:sr-only\">{t(`timeline.type.${type}`)}</span>\n {children}\n </li>\n </TimelineEventContext.Provider>\n );\n },\n);\nTimelineEvent.displayName = 'Timeline.Event';\n\n/* ------------------------------------------------------------------ */\n/* Timeline.Dot */\n/* ------------------------------------------------------------------ */\n\nconst TimelineDot = forwardRef<HTMLDivElement, TimelineDotProps>(\n ({ icon, className, ...props }, ref) => {\n const { type } = useContext(TimelineEventContext);\n const { layout } = useContext(TimelineContext);\n\n const dot = (\n <div\n ref={ref}\n aria-hidden=\"true\"\n className={dotVariants({ type, className })}\n {...props}\n >\n {icon ?? TYPE_ICONS[type]}\n </div>\n );\n\n if (layout === 'alternating') {\n // In alternating grid: col 2 (centre) for the dot with the rail line\n return (\n <div\n aria-hidden=\"true\"\n className=\"ds:col-start-2 ds:flex ds:flex-col ds:items-center\"\n >\n {/* Rail segment above the dot */}\n <div className=\"ds:w-[var(--border-width-md)] ds:flex-1 ds:bg-[var(--border)] ds:first:hidden\" />\n {dot}\n {/* Rail segment below the dot */}\n <div className=\"ds:w-[var(--border-width-md)] ds:flex-1 ds:bg-[var(--border)]\" />\n </div>\n );\n }\n\n return dot;\n },\n);\nTimelineDot.displayName = 'Timeline.Dot';\n\n/* ------------------------------------------------------------------ */\n/* Timeline.Content */\n/* ------------------------------------------------------------------ */\n\nconst TimelineContent = forwardRef<HTMLDivElement, TimelineContentProps>(\n ({ title, description, actor, children, className, ...props }, ref) => {\n const { layout } = useContext(TimelineContext);\n\n const inner = (\n <div\n ref={ref}\n className={[\n 'ds:flex-1 ds:min-w-0 ds:pb-[var(--spacing-md)]',\n // Wrap policy: `break-word` (not `anywhere`) preserves word-\n // boundary wrapping for natural-language titles / descriptions;\n // only genuinely unbreakable strings (URLs, hashes) break mid-\n // word when they would otherwise overflow. `anywhere` introduces\n // a soft-wrap opportunity at every character boundary, which\n // chopped Italian / German labels mid-word when an event card\n // sat in a narrow context.\n 'ds:[&_*]:break-normal ds:[&_*]:[overflow-wrap:break-word]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n <Card variant=\"outlined\">\n <Card.Body>\n <p className=\"type-label ds:text-[var(--foreground)]\">{title}</p>\n {description && (\n <p className=\"ds:mt-[var(--spacing-xs)] type-body-sm ds:text-[var(--muted-foreground)]\">\n {description}\n </p>\n )}\n {actor && (\n <div className=\"ds:mt-[var(--spacing-sm)] ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <Avatar size=\"xs\" name={actor.name} src={actor.src} />\n <span className=\"type-meta ds:text-[var(--muted-foreground)]\">\n {actor.name}\n </span>\n </div>\n )}\n {children}\n </Card.Body>\n </Card>\n </div>\n );\n\n if (layout === 'alternating') {\n // Alternating: odd events in col 1 (start), even events in col 3 (end).\n // We use CSS nth-child targeting via a wrapper that sets col placement.\n return (\n <div className=\"ds:col-span-1 ds:[li:nth-child(even)_&]:col-start-3 ds:[li:nth-child(odd)_&]:col-start-1\">\n {inner}\n </div>\n );\n }\n\n return inner;\n },\n);\nTimelineContent.displayName = 'Timeline.Content';\n\n/* ------------------------------------------------------------------ */\n/* Timeline.Timestamp — thin wrapper over the shared Timestamp */\n/* component. Keeps the existing API (`date`, `relative`, `format`) */\n/* for backward compatibility; adds tabular-nums because timeline */\n/* timestamps sit in a rail gutter and benefit from column-aligned */\n/* digits. */\n/* ------------------------------------------------------------------ */\n\nconst TWENTY_FOUR_HOURS_MS = 24 * 60 * 60 * 1000;\n\nconst TimelineTimestamp = forwardRef<HTMLTimeElement, TimelineTimestampProps>(\n (\n {\n date,\n locale,\n relative = true,\n format = { dateStyle: 'medium', timeStyle: 'short' },\n className,\n ...props\n },\n ref,\n ) => (\n <Timestamp\n ref={ref}\n value={date}\n locale={locale}\n format={relative ? 'relative' : 'absolute'}\n relativeWindow={relative ? TWENTY_FOUR_HOURS_MS : undefined}\n absoluteFormat={format}\n className={[\n 'ds:text-[var(--muted-foreground)]',\n 'ds:[font-variant-numeric:var(--font-feature-tabular)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n ),\n);\nTimelineTimestamp.displayName = 'Timeline.Timestamp';\n\n/* ------------------------------------------------------------------ */\n/* Compound export */\n/* ------------------------------------------------------------------ */\n\nexport const Timeline = Object.assign(TimelineRoot, {\n Event: TimelineEvent,\n Dot: TimelineDot,\n Content: TimelineContent,\n Timestamp: TimelineTimestamp,\n});\n"],"names":["timelineAgent","handle","args","TimelineContext","createContext","TimelineEventContext","timelineVariants","cva","eventVariants","dotVariants","TYPE_ICONS","jsx","Info","Check","TriangleAlert","X","Circle","TimelineRoot","forwardRef","layout","order","className","children","props","ref","ctx","useMemo","olRef","useRef","selectedEvent","setSelectedEvent","useState","latestRef","selectEvent","useCallback","id","target","_a","agentHandle","useImperativeHandle","useAgentRegistration","TimelineEvent","type","eventId","useContext","t","useTranslation","evtCtx","jsxs","TimelineDot","icon","dot","TimelineContent","title","description","actor","inner","Card","Avatar","TWENTY_FOUR_HOURS_MS","TimelineTimestamp","date","locale","relative","format","Timestamp","Timeline"],"mappings":"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"}
|
package/dist/agent-catalog.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"packageVersion": "1.
|
|
3
|
+
"packageVersion": "1.31.0",
|
|
4
4
|
"components": [
|
|
5
5
|
{
|
|
6
6
|
"kind": "component",
|
|
@@ -1592,7 +1592,7 @@
|
|
|
1592
1592
|
},
|
|
1593
1593
|
"item": {
|
|
1594
1594
|
"attr": "data-event-id",
|
|
1595
|
-
"description": "Emitted on every rendered FullCalendar event by the kit event renderer. Used by focusEvent. Cards also carry data-kind=\"task\"|\"draft\"|\"appointment\" and data-status for classification."
|
|
1595
|
+
"description": "Emitted on every rendered FullCalendar event by the kit event renderer. Used by focusEvent. Cards also carry data-kind=\"task\"|\"draft\"|\"pending-details\"|\"appointment\" and data-status for classification."
|
|
1596
1596
|
}
|
|
1597
1597
|
}
|
|
1598
1598
|
},
|
|
@@ -7673,7 +7673,7 @@
|
|
|
7673
7673
|
]
|
|
7674
7674
|
},
|
|
7675
7675
|
"idempotent": false,
|
|
7676
|
-
"description": "Toggle the pinned state of the note with the given id.",
|
|
7676
|
+
"description": "Toggle the pinned state of the note with the given id. Refused for a deleted note or one whose actions.pin is false.",
|
|
7677
7677
|
"descriptionKey": "ui.agent.notesPanel.actions.togglePin"
|
|
7678
7678
|
},
|
|
7679
7679
|
{
|
|
@@ -16876,6 +16876,14 @@
|
|
|
16876
16876
|
"component": "radio-group",
|
|
16877
16877
|
"as": "deleteScope"
|
|
16878
16878
|
},
|
|
16879
|
+
{
|
|
16880
|
+
"component": "radio-group",
|
|
16881
|
+
"as": "seriesScope"
|
|
16882
|
+
},
|
|
16883
|
+
{
|
|
16884
|
+
"component": "button",
|
|
16885
|
+
"as": "seriesScopeChange"
|
|
16886
|
+
},
|
|
16879
16887
|
{
|
|
16880
16888
|
"component": "dropdown-menu",
|
|
16881
16889
|
"as": "signatureMenu"
|
|
@@ -17026,7 +17034,7 @@
|
|
|
17026
17034
|
{
|
|
17027
17035
|
"name": "dock_tool",
|
|
17028
17036
|
"safety": "read",
|
|
17029
|
-
"description": "Open
|
|
17037
|
+
"description": "Open a workspace rail tool: Appointments, appointment editor / details, waiting list, patient notes, online bookings or free-slot finder. Read the actual strip: hosts may withhold tools, and patient-notes is registered only with patient context. Notes uses the host's note permissions, independently of appointment-edit rights. Clearing its patient context returns to the previous available tool and focuses its rail button. Opening notes from a panel may address a note id and moves focus into Notes. Closing other tools returns to Appointments.",
|
|
17030
17038
|
"descriptionKey": "ui.agent.calendar.workflows.dockTool",
|
|
17031
17039
|
"uiActions": [
|
|
17032
17040
|
"control-room-rail.open",
|
|
@@ -17057,6 +17065,21 @@
|
|
|
17057
17065
|
"appointment.list"
|
|
17058
17066
|
]
|
|
17059
17067
|
},
|
|
17068
|
+
{
|
|
17069
|
+
"name": "read_appointment_details",
|
|
17070
|
+
"safety": "phi",
|
|
17071
|
+
"description": "Read one appointment in the docked details panel. With the host's details read, any card click, including a patient-less block and a chip whose names are still loading, focuses the appointment and docks a read-only panel: appointment, booking, money, contact, treatments, signing and series sections, the patient's latest three notes and a History sub-view. See more or a note opens the separate Notes rail tool when the host offers it. While the read is loading, failed or refused the panel shows that status instead. Edit, withheld from a read-only viewer, opens the editor. Without the host's read a pending chip stays inert and the editor form is the details. Reads patient-identifiable data.",
|
|
17072
|
+
"descriptionKey": "ui.agent.calendar.workflows.readAppointmentDetails",
|
|
17073
|
+
"uiActions": [
|
|
17074
|
+
"calendar.focus_event"
|
|
17075
|
+
],
|
|
17076
|
+
"stateReads": [
|
|
17077
|
+
"control-room-rail.activeToolId"
|
|
17078
|
+
],
|
|
17079
|
+
"apiActions": [
|
|
17080
|
+
"appointment.read"
|
|
17081
|
+
]
|
|
17082
|
+
},
|
|
17060
17083
|
{
|
|
17061
17084
|
"name": "create_appointment",
|
|
17062
17085
|
"safety": "phi",
|
|
@@ -17086,13 +17109,14 @@
|
|
|
17086
17109
|
"control-room-rail.activeToolId"
|
|
17087
17110
|
],
|
|
17088
17111
|
"apiActions": [
|
|
17112
|
+
"patient.search",
|
|
17089
17113
|
"appointment.create"
|
|
17090
17114
|
]
|
|
17091
17115
|
},
|
|
17092
17116
|
{
|
|
17093
17117
|
"name": "edit_appointment",
|
|
17094
17118
|
"safety": "phi",
|
|
17095
|
-
"description": "Amend an existing appointment.
|
|
17119
|
+
"description": "Amend an existing appointment in the docked editor. With the host's details read the editor opens from Edit on the details panel and Cancel or Save returns there; without it the details panel is the form. A remote host first loads canonical data; loading, failure and whole-appointment refusal expose no editable form. When that data carries a series, the editor first asks the scope: this occurrence, this and following, or the whole series. Honour the returned patient, care, description and recurrence capabilities. A refused recurring scope cannot be treated as an ordinary edit. Save waits for host acceptance before closing or announcing success; rejection preserves the entered draft for correction or retry. Writes patient-identifiable data.",
|
|
17096
17120
|
"descriptionKey": "ui.agent.calendar.workflows.editAppointment",
|
|
17097
17121
|
"uiActions": [
|
|
17098
17122
|
"calendar.focus_event",
|
|
@@ -17114,6 +17138,8 @@
|
|
|
17114
17138
|
"calendar.currentDate"
|
|
17115
17139
|
],
|
|
17116
17140
|
"apiActions": [
|
|
17141
|
+
"appointment.read",
|
|
17142
|
+
"patient.search",
|
|
17117
17143
|
"appointment.update",
|
|
17118
17144
|
"appointmentSeries.applyScope"
|
|
17119
17145
|
]
|
|
@@ -17137,7 +17163,7 @@
|
|
|
17137
17163
|
{
|
|
17138
17164
|
"name": "move_appointment",
|
|
17139
17165
|
"safety": "phi",
|
|
17140
|
-
"description": "Reschedule an appointment either by dragging its card to a new slot or by arming \"Move…\" in the details panel and then clicking the target slot — the panel stays docked and a banner tinted with the appointment's own colour names what is being placed. Either route ends in the confirmation dialog, which offers the SMS and e-mail notify channels
|
|
17166
|
+
"description": "Reschedule an appointment either by dragging its card to a new slot or by arming \"Move…\" in the details panel and then clicking the target slot — the panel stays docked and a banner tinted with the appointment's own colour names what is being placed. Either route ends in the confirmation dialog, which offers the SMS and e-mail notify channels and, for a series member, the recurring scope. A host recurring parent always confirms, asks the scope and hides the notify channels, as the platform does. Cancelling reverts the card and commits nothing. Writes patient-identifiable data.",
|
|
17141
17167
|
"descriptionKey": "ui.agent.calendar.workflows.moveAppointment",
|
|
17142
17168
|
"uiActions": [
|
|
17143
17169
|
"calendar.focus_event",
|
|
@@ -17219,7 +17245,7 @@
|
|
|
17219
17245
|
{
|
|
17220
17246
|
"name": "manage_patient_notes",
|
|
17221
17247
|
"safety": "phi",
|
|
17222
|
-
"description": "Read and write the patient's notes from the Notes
|
|
17248
|
+
"description": "Read and write the patient's notes from the conditional Notes rail tool: add a note through the composer, pin one, edit one in a dialog or delete one behind an alert dialog. Every write goes to the host, which stamps the note's id, time and author. The kit attributes nothing to a clinical note. An HTML note edits in a rich text editor and saves as HTML; a clinical or deleted note offers no edit. With no host seam, or when the host's seam is not writable, the tool is a read-only timeline. Explicit note permissions take precedence over appointment-edit permission. Details and the editor have no Notes sub-view. The rows carry ids and pin / flag / clinical markers only; the body and author are never exposed as state. Writes patient-identifiable clinical data.",
|
|
17223
17249
|
"descriptionKey": "ui.agent.calendar.workflows.managePatientNotes",
|
|
17224
17250
|
"uiActions": [
|
|
17225
17251
|
"notes-panel.add_note",
|
|
@@ -17227,7 +17253,8 @@
|
|
|
17227
17253
|
"dialog.open",
|
|
17228
17254
|
"dialog.close",
|
|
17229
17255
|
"dialog.dismiss",
|
|
17230
|
-
"text-area.set_value"
|
|
17256
|
+
"text-area.set_value",
|
|
17257
|
+
"rich-text-editor.set_content"
|
|
17231
17258
|
],
|
|
17232
17259
|
"stateReads": [
|
|
17233
17260
|
"notes-panel.notes",
|
|
@@ -17273,6 +17300,20 @@
|
|
|
17273
17300
|
"signature.request"
|
|
17274
17301
|
]
|
|
17275
17302
|
},
|
|
17303
|
+
{
|
|
17304
|
+
"name": "create_document",
|
|
17305
|
+
"safety": "phi",
|
|
17306
|
+
"description": "Open the appointment details create menu through data-action=\"open-create-document\" and select an offered data-action=\"create-document-<kind>\" item: bill, folder, template, empty, identification or webcam. The host supplies permitted kinds and owns navigation, confirmation and persistence. Appointment read-only mode does not withhold document rights. A selection starts the host workflow; it does not prove that a document or bill was created. May write patient-identifiable data.",
|
|
17307
|
+
"descriptionKey": "ui.agent.calendar.workflows.createDocument",
|
|
17308
|
+
"uiActions": [
|
|
17309
|
+
"dropdown-menu.open",
|
|
17310
|
+
"dropdown-menu.close"
|
|
17311
|
+
],
|
|
17312
|
+
"stateReads": [
|
|
17313
|
+
"dropdown-menu.isOpen"
|
|
17314
|
+
],
|
|
17315
|
+
"apiActions": []
|
|
17316
|
+
},
|
|
17276
17317
|
{
|
|
17277
17318
|
"name": "message_patient_whatsapp",
|
|
17278
17319
|
"safety": "phi",
|
|
@@ -17348,7 +17389,7 @@
|
|
|
17348
17389
|
{
|
|
17349
17390
|
"name": "find_free_slot",
|
|
17350
17391
|
"safety": "read",
|
|
17351
|
-
"description": "Search the practice for bookable time in the finder panel. Operator and chair scope are grouped checklists behind a popover per axis — a select-all row first, operators sectioned under their groups, nothing ticked searching every eligible resource — beside the care, the duration, the date range and, for a care that needs one, a medical-device select. The results list groups the slots under a day heading; a click steers the grid to that day and docks the editor prefilled with the date, time, duration, chair, operator and any seeded patient or care. The 185-day range warning is advisory (the search still runs), \"Show more slots\" pushes the To date out by 30 days and re-searches, and an alert names which business hours are missing when the practice or its operators hold none (it links to the scheduler only where the host supplies that navigation, which this workspace does not). Read-only
|
|
17392
|
+
"description": "Search the practice for bookable time in the finder panel. Operator and chair scope are grouped checklists behind a popover per axis — a select-all row first, operators sectioned under their groups, nothing ticked searching every eligible resource — beside the care, the duration, the date range and, for a care that needs one, a medical-device select. The results list groups the slots under a day heading; when the viewer may write appointments, a click steers the grid to that day and docks the editor prefilled with the date, time, duration, chair, operator and any seeded patient or care; read-only viewers see the list and projection only, under a lock note, with no Book. The 185-day range warning is advisory (the search still runs), \"Show more slots\" pushes the To date out by 30 days and re-searches, and an alert names which business hours are missing when the practice or its operators hold none (it links to the scheduler only where the host supplies that navigation, which this workspace does not). Projected bands open a modal list of original options by click, Enter or Space; only an explicit Book action uses the finder booking path. Read-only viewers can scroll those options without Book. Dismissal restores focus to the band.",
|
|
17352
17393
|
"descriptionKey": "ui.agent.calendar.workflows.findFreeSlot",
|
|
17353
17394
|
"uiActions": [
|
|
17354
17395
|
"collapsible.toggle",
|
|
@@ -17376,7 +17417,7 @@
|
|
|
17376
17417
|
{
|
|
17377
17418
|
"name": "triage_online_booking",
|
|
17378
17419
|
"safety": "phi",
|
|
17379
|
-
"description": "
|
|
17420
|
+
"description": "Review the online-bookings queue independently of the visible dates. The host owns membership and loading/error state. Show a row on the grid; completion is available only when the host enables it and the user can edit. Review-only rows remain in the queue on selection and cannot be dragged, resized or edited. Unknown last-seen data never marks a booking New. Completing writes patient-identifiable data.",
|
|
17380
17421
|
"descriptionKey": "ui.agent.calendar.workflows.triageOnlineBooking",
|
|
17381
17422
|
"uiActions": [
|
|
17382
17423
|
"calendar.focus_event",
|
package/dist/agent-i18n/en.json
CHANGED
|
@@ -170,24 +170,26 @@
|
|
|
170
170
|
"filterColumns": "Narrow the grid to particular chairs or operators from the two filter popovers, with the platform's semantics: nothing ticked shows everyone and ticking narrows. Operators list under their groups with a tri-state row per group; \"Only available operators\" is on by default in the operator views, and a session-local \"Show disabled operators\" switch reveals the operators the practice has disabled. A count badge rides each filter button while it narrows, and the \"Reset filters\" chip beside them clears both selections and restores both switches without ever changing the view. Selection only — no appointment is touched.",
|
|
171
171
|
"maskPatientNames": "Turn privacy mode on or off from the toolbar. While on, patient names are masked on the cards, in the hover peek, in the Appointments panel and on the printed call sheet, so the page can stay open beside a waiting patient. It is a display mask, not a permission: it is not persisted and it changes no record.",
|
|
172
172
|
"configureDisplay": "Set the per-user display knobs in the cog popover — layout, zebra rows, show times, slot precision, the day window, the care-description mode, what the cards are coloured by, the default duration of a new appointment (5–240 minutes), whether operators read as an initials disc or a dot plus full name, whether chairs read as a full name or a short code, and whether the details panel offers the map link. The choices are remembered per user through the host's preferences adapter under `calendarWorkspace.*` keys, so they persist beyond the page load; they change presentation only and touch no patient record.",
|
|
173
|
-
"dockTool": "Open
|
|
173
|
+
"dockTool": "Open a workspace rail tool: Appointments, appointment editor / details, waiting list, patient notes, online bookings or free-slot finder. Read the actual strip: hosts may withhold tools, and patient-notes is registered only with patient context. Notes uses the host's note permissions, independently of appointment-edit rights. Clearing its patient context returns to the previous available tool and focuses its rail button. Opening notes from a panel may address a note id and moves focus into Notes. Closing other tools returns to Appointments.",
|
|
174
174
|
"reviewUpcoming": "Read the rail's resting panel: the practice's upcoming appointments — now to the end of the seventh day, cancelled excluded, earliest first — each row led by the patient. The preset row, the jump-to-date picker and the edge loaders widen the derived window up to ±180 days. Activating a row selects that appointment on the grid, which docks its details. Read-only; the rows carry ids and lifecycle state, never patient identity.",
|
|
175
|
+
"readAppointmentDetails": "Read one appointment in the docked details panel. With the host's details read, any card click, including a patient-less block and a chip whose names are still loading, focuses the appointment and docks a read-only panel: appointment, booking, money, contact, treatments, signing and series sections, the patient's latest three notes and a History sub-view. See more or a note opens the separate Notes rail tool when the host offers it. While the read is loading, failed or refused the panel shows that status instead. Edit, withheld from a read-only viewer, opens the editor. Without the host's read a pending chip stays inert and the editor form is the details. Reads patient-identifiable data.",
|
|
175
176
|
"createAppointment": "Book a new appointment in the editor panel, docked from the New appointment button, from a click on an empty slot (prefilled with the slot, the clicked column and the cog's default duration) or from an online booking being processed. Set the patient, the linked care or care-plan lines, the date, start time and duration, the operator, chair, branch and colour, the description (255 characters at most — a longer one blocks the save), and, once a patient is chosen, the SMS and e-mail reminders, the first-visit question and — where the patient has unsigned required documents — how they are asked to sign. Busy chair, busy operator and operator-away warnings are advisory and do not hold the save; only a practice closure does. Enter submits from any text field. Writes patient-identifiable data.",
|
|
176
|
-
"editAppointment": "Amend an existing appointment.
|
|
177
|
+
"editAppointment": "Amend an existing appointment in the docked editor. With the host's details read the editor opens from Edit on the details panel and Cancel or Save returns there; without it the details panel is the form. A remote host first loads canonical data; loading, failure and whole-appointment refusal expose no editable form. When that data carries a series, the editor first asks the scope: this occurrence, this and following, or the whole series. Honour the returned patient, care, description and recurrence capabilities. A refused recurring scope cannot be treated as an ordinary edit. Save waits for host acceptance before closing or announcing success; rejection preserves the entered draft for correction or retry. Writes patient-identifiable data.",
|
|
177
178
|
"changeAppointmentStatus": "Set an appointment's attendance status from the Status select in the details panel. The status is patient-identifiable attendance data.",
|
|
178
|
-
"moveAppointment": "Reschedule an appointment either by dragging its card to a new slot or by arming \"Move…\" in the details panel and then clicking the target slot — the panel stays docked and a banner tinted with the appointment's own colour names what is being placed. Either route ends in the confirmation dialog, which offers the SMS and e-mail notify channels
|
|
179
|
+
"moveAppointment": "Reschedule an appointment either by dragging its card to a new slot or by arming \"Move…\" in the details panel and then clicking the target slot — the panel stays docked and a banner tinted with the appointment's own colour names what is being placed. Either route ends in the confirmation dialog, which offers the SMS and e-mail notify channels and, for a series member, the recurring scope. A host recurring parent always confirms, asks the scope and hides the notify channels, as the platform does. Cancelling reverts the card and commits nothing. Writes patient-identifiable data.",
|
|
179
180
|
"resizeAppointment": "Change an appointment's duration by dragging its card edge. Unlike a move this SAVES AT ONCE with no confirmation, exactly as the platform does; the toast that follows carries an Undo that restores the previous duration and logs both changes on the appointment's history. Writes patient-identifiable data.",
|
|
180
181
|
"copyAppointment": "Duplicate an appointment onto another slot: arm \"Copy…\" in the details panel, then click the target. The copy lands immediately with no confirmation, and its toast carries an Undo. A plan-linked appointment first asks whether to copy the appointment only or the appointment and its treatments. Writes patient-identifiable data.",
|
|
181
182
|
"deleteAppointment": "Remove an appointment from the details panel behind an alert dialog. The dialog asks for the recurring scope when the appointment belongs to a series, and for the care-plan cleanup when it is the parent of a price-list recurrence — so confirming can drop far more than the one card. Irreversible from this surface.",
|
|
182
|
-
"managePatientNotes": "Read and write the patient's notes from the Notes
|
|
183
|
+
"managePatientNotes": "Read and write the patient's notes from the conditional Notes rail tool: add a note through the composer, pin one, edit one in a dialog or delete one behind an alert dialog. Every write goes to the host, which stamps the note's id, time and author. The kit attributes nothing to a clinical note. An HTML note edits in a rich text editor and saves as HTML; a clinical or deleted note offers no edit. With no host seam, or when the host's seam is not writable, the tool is a read-only timeline. Explicit note permissions take precedence over appointment-edit permission. Details and the editor have no Notes sub-view. The rows carry ids and pin / flag / clinical markers only; the body and author are never exposed as state. Writes patient-identifiable clinical data.",
|
|
183
184
|
"readModificationHistory": "Open the History sub-view of the details panel and read the appointment's modification ledger, newest first — what changed, from what to what, and when. No mutation.",
|
|
184
185
|
"requestSignature": "Ask the patient to sign the appointment's documents from the details panel, by SMS or e-mail through the kit menu. The chip beside it reports the channel a request has already gone out on. There is no \"On this device…\" item: on-device signing is the host's own e-signature surface and no seam here mounts it, so the menu offers only the two channels it can honour. Sends a patient-identifiable request.",
|
|
186
|
+
"createDocument": "Open the appointment details create menu through data-action=\"open-create-document\" and select an offered data-action=\"create-document-<kind>\" item: bill, folder, template, empty, identification or webcam. The host supplies permitted kinds and owns navigation, confirmation and persistence. Appointment read-only mode does not withhold document rights. A selection starts the host workflow; it does not prove that a document or bill was created. May write patient-identifiable data.",
|
|
185
187
|
"messagePatientWhatsapp": "Reach the patient over WhatsApp from a waiting-list row. The affordance is a `wa.me` deep link the row opens in a new tab — it is disabled, and names its reason in its accessible name, when the entry carries no WhatsApp-capable number. There is no equivalent in the details panel: the send-reminder group is handed an empty channel list, because the host's legacy Snippets island is the only composing surface and no seam here mounts it. Hands a patient's contact detail to an outbound channel.",
|
|
186
188
|
"filterWaitingList": "Narrow the waiting queue: the four quick views (all, patients without an appointment, appointment scheduled over 30 days ago, on the list over 30 days) and, behind \"Show advanced filters\", the platform's nine optional client-side inputs — patient, patient assigned, operator, appointment scheduled, appointment scheduled from / to, on the waiting list from / to and description — applied only when \"Filter list\" is pressed. The toggle carries a count badge while any input is set, and changing the quick view drops the form. Selection only.",
|
|
187
189
|
"manageWaitingListEntry": "Add, amend or remove a waiting-list entry. The four-field form opens as a rail SUB-VIEW — from the toolbar split button's plus segment, from Add entry, or from a row's pencil — with a back arrow to the queue. Editing is refused on a row already linked to an appointment, because those fields belong to the appointment; the pencil stays focusable and names that reason. Remove deletes at once with no confirmation, platform parity, and its toast carries an Undo that puts the entry back. Writes patient-identifiable data.",
|
|
188
190
|
"scheduleWaitingPatient": "Give a waiting patient a slot. \"Schedule\" on an unlinked row hands off to the free-slot finder seeded from the entry — operator, chair, duration, patient, care and colour already filled in — and booking a slot opens the editor carrying the entry, so saving books the appointment and takes the entry off the list. A row already linked to an appointment reads \"Reschedule\" and seeds the same finder, but booking there MOVES the existing appointment rather than creating a second one. Writes patient-identifiable data.",
|
|
189
|
-
"findFreeSlot": "Search the practice for bookable time in the finder panel. Operator and chair scope are grouped checklists behind a popover per axis — a select-all row first, operators sectioned under their groups, nothing ticked searching every eligible resource — beside the care, the duration, the date range and, for a care that needs one, a medical-device select. The results list groups the slots under a day heading; a click steers the grid to that day and docks the editor prefilled with the date, time, duration, chair, operator and any seeded patient or care. The 185-day range warning is advisory (the search still runs), \"Show more slots\" pushes the To date out by 30 days and re-searches, and an alert names which business hours are missing when the practice or its operators hold none (it links to the scheduler only where the host supplies that navigation, which this workspace does not). Read-only
|
|
190
|
-
"triageOnlineBooking": "
|
|
191
|
+
"findFreeSlot": "Search the practice for bookable time in the finder panel. Operator and chair scope are grouped checklists behind a popover per axis — a select-all row first, operators sectioned under their groups, nothing ticked searching every eligible resource — beside the care, the duration, the date range and, for a care that needs one, a medical-device select. The results list groups the slots under a day heading; when the viewer may write appointments, a click steers the grid to that day and docks the editor prefilled with the date, time, duration, chair, operator and any seeded patient or care; read-only viewers see the list and projection only, under a lock note, with no Book. The 185-day range warning is advisory (the search still runs), \"Show more slots\" pushes the To date out by 30 days and re-searches, and an alert names which business hours are missing when the practice or its operators hold none (it links to the scheduler only where the host supplies that navigation, which this workspace does not). Projected bands open a modal list of original options by click, Enter or Space; only an explicit Book action uses the finder booking path. Read-only viewers can scroll those options without Book. Dismissal restores focus to the band.",
|
|
192
|
+
"triageOnlineBooking": "Review the online-bookings queue independently of the visible dates. The host owns membership and loading/error state. Show a row on the grid; completion is available only when the host enables it and the user can edit. Review-only rows remain in the queue on selection and cannot be dragged, resized or edited. Unknown last-seen data never marks a booking New. Completing writes patient-identifiable data.",
|
|
191
193
|
"printDaySheet": "Print the front-desk call sheet. The toolbar's printer icon opens a dialog asking which day — one day, never the visible range — and Print renders that day's appointments through the browser, scoped by the filters in force and masked when privacy mode is on. Nothing is sent to a server, but the sheet itself is a patient-identifiable document."
|
|
192
194
|
}
|
|
193
195
|
},
|
|
@@ -800,7 +802,7 @@
|
|
|
800
802
|
},
|
|
801
803
|
"actions": {
|
|
802
804
|
"addNote": "Compose and commit a new note. A clinical note requires the clinical-note permission (read canAddClinical first).",
|
|
803
|
-
"togglePin": "Toggle the pinned state of the note with the given id.",
|
|
805
|
+
"togglePin": "Toggle the pinned state of the note with the given id. Refused for a deleted note or one whose actions.pin is false.",
|
|
804
806
|
"toggleFlag": "Toggle the flagged state of the note with the given id."
|
|
805
807
|
}
|
|
806
808
|
},
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-error-message.d.ts","sourceRoot":"","sources":["../../../src/components/_shared/get-error-message.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWxE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appointment-card.d.ts","sourceRoot":"","sources":["../../../src/components/appointment-card/appointment-card.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,cAAc,EAAkB,MAAM,OAAO,CAAC;AACxE,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAsBlE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AA6C/D,OAAO,EAAE,eAAe,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAMjF,oCAAoC;AACpC,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,YAAY,CAAC;AAE1D,kCAAkC;AAClC,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC;AAE7D,wEAAwE;AACxE,MAAM,WAAW,mBAAmB;IAClC,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B;AAED,0DAA0D;AAC1D,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,iDAAiD;AACjD,MAAM,WAAW,oBAAoB;IACnC,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,+DAA+D;AAC/D,MAAM,WAAW,wBAAwB;IACvC,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,gEAAgE;AAChE,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,KAAK,EAAE,gBAAgB,CAAC;IACxB,wDAAwD;IACxD,IAAI,EAAE,eAAe,CAAC;IACtB,wBAAwB;IACxB,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,yBAAyB;IACzB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,QAAQ,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,wBAAwB;IACxB,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,uBAAuB;IACvB,UAAU,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACpC,sCAAsC;IACtC,aAAa,CAAC,EAAE,wBAAwB,CAAC;IACzC,qBAAqB;IACrB,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAMD,QAAA,MAAM,uBAAuB;;;;8EAsC5B,CAAC;
|
|
1
|
+
{"version":3,"file":"appointment-card.d.ts","sourceRoot":"","sources":["../../../src/components/appointment-card/appointment-card.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { A as p } from "../../_chunks/appointment-card-
|
|
2
|
-
import { A as e, a as o, b as r } from "../../_chunks/appointment-tray-
|
|
1
|
+
import { A as p } from "../../_chunks/appointment-card-CvUFFEdS.js";
|
|
2
|
+
import { A as e, a as o, b as r } from "../../_chunks/appointment-tray-Z2GaOIYQ.js";
|
|
3
3
|
import { i } from "../../_chunks/is-safe-url-DkETxeHz.js";
|
|
4
4
|
export {
|
|
5
5
|
p as AppointmentCard,
|
|
@@ -60,7 +60,7 @@ export interface CalendarEvent {
|
|
|
60
60
|
* own: use `isRecurring` for the grid indicator.
|
|
61
61
|
*/
|
|
62
62
|
isRecurrenceParent?: boolean;
|
|
63
|
-
/**
|
|
63
|
+
/** Background event; interactive only with onBackgroundEventClick. */
|
|
64
64
|
isInternal?: boolean;
|
|
65
65
|
/**
|
|
66
66
|
* Renders the card as a TASK rather than an appointment — calendar-scheduled
|
|
@@ -79,13 +79,24 @@ export interface CalendarEvent {
|
|
|
79
79
|
* filling.
|
|
80
80
|
*/
|
|
81
81
|
isDraft?: boolean;
|
|
82
|
+
/**
|
|
83
|
+
* A REAL booked appointment whose details the host is still fetching —
|
|
84
|
+
* an occupancy-first host draws the block from the slot it occupies
|
|
85
|
+
* (colour, time, chair) and fills the name in afterwards. Renders the
|
|
86
|
+
* card's details-pending treatment (`data-kind="pending-details"`). A
|
|
87
|
+
* click is delivered and the host decides what it opens; the hover
|
|
88
|
+
* callback and drag stay refused, so a block nobody can name yet is never
|
|
89
|
+
* previewed or moved. Distinct from the pattern's `isPendingBooking` (an
|
|
90
|
+
* online booking still missing a patient or an operator).
|
|
91
|
+
*/
|
|
92
|
+
detailsPending?: boolean;
|
|
82
93
|
/**
|
|
83
94
|
* Per-event master switch for drag AND resize. Overrides the
|
|
84
95
|
* calendar-level `editable` for this event only (true enables even when
|
|
85
96
|
* the calendar is not editable; false disables both gestures).
|
|
86
97
|
* Leave undefined to inherit the calendar-level setting.
|
|
87
98
|
* Precedence: per-event `startEditable` > per-event `editable` >
|
|
88
|
-
* calendar-level `editable`. Background
|
|
99
|
+
* calendar-level `editable`. Background and details-pending events
|
|
89
100
|
* are never draggable regardless.
|
|
90
101
|
*/
|
|
91
102
|
editable?: boolean;
|
|
@@ -297,6 +308,9 @@ export interface CalendarProps {
|
|
|
297
308
|
* caveat. Existing one-argument handlers keep working unchanged.
|
|
298
309
|
*/
|
|
299
310
|
onEventClick?: (event: CalendarEvent, meta?: CalendarEventClickMeta) => void;
|
|
311
|
+
/** Opt in to keyboard-accessible titled background buttons. The anchor
|
|
312
|
+
* follows CalendarEventClickMeta's lifetime rules; no booking is implied. */
|
|
313
|
+
onBackgroundEventClick?: (event: CalendarEvent, meta: CalendarEventClickMeta) => void;
|
|
300
314
|
/**
|
|
301
315
|
* Fires when the pointer enters an event's rendered surface — the anchor
|
|
302
316
|
* seam for hover "peek" cards. Skipped for background events
|
|
@@ -409,6 +423,16 @@ export interface CalendarProps {
|
|
|
409
423
|
* Omitted / empty array shows all seven days.
|
|
410
424
|
*/
|
|
411
425
|
hiddenDays?: number[];
|
|
426
|
+
/**
|
|
427
|
+
* Local ISO `YYYY-MM-DD` dates whose rows the host has NOT finished
|
|
428
|
+
* loading: every cell of such a day wears the loading wash and carries
|
|
429
|
+
* `aria-busy`, and its date header gains a visually-hidden "still
|
|
430
|
+
* loading" word, so a half-drawn day is never read as an empty one. A
|
|
431
|
+
* date left out of the list is one the host says is fully loaded; an
|
|
432
|
+
* omitted prop says every rendered day is. The workspace pattern
|
|
433
|
+
* derives it from `CalendarData.dayLoadState`.
|
|
434
|
+
*/
|
|
435
|
+
loadingDates?: readonly string[];
|
|
412
436
|
/** Lower bound of the time axis (e.g. '07:00'). */
|
|
413
437
|
slotMinTime?: string;
|
|
414
438
|
/** Upper bound of the time axis (e.g. '23:00'). */
|