@mieweb/ui 0.10.0-dev.15 → 0.10.0-dev.16
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/CsvBlock-FVOKKWIY.cjs +17 -0
- package/dist/{CsvBlock-ROJCKJDP.cjs.map → CsvBlock-FVOKKWIY.cjs.map} +1 -1
- package/dist/CsvBlock-MXZO4W3N.js +8 -0
- package/dist/{CsvBlock-UWPMTLE2.js.map → CsvBlock-MXZO4W3N.js.map} +1 -1
- package/dist/HtmlPreviewBlock-2UGW33SQ.js +8 -0
- package/dist/{HtmlPreviewBlock-ME5U3XNS.js.map → HtmlPreviewBlock-2UGW33SQ.js.map} +1 -1
- package/dist/HtmlPreviewBlock-CZKTQUCL.cjs +17 -0
- package/dist/{HtmlPreviewBlock-DWFN6EUB.cjs.map → HtmlPreviewBlock-CZKTQUCL.cjs.map} +1 -1
- package/dist/MermaidBlock-NLDOJZUJ.cjs +17 -0
- package/dist/{MermaidBlock-D2UC5M55.cjs.map → MermaidBlock-NLDOJZUJ.cjs.map} +1 -1
- package/dist/MermaidBlock-QXAEMOAA.js +8 -0
- package/dist/{MermaidBlock-2B6CPD6Y.js.map → MermaidBlock-QXAEMOAA.js.map} +1 -1
- package/dist/SurveyBlock-GSHYZMTW.cjs +17 -0
- package/dist/{SurveyBlock-4CD4AYMJ.cjs.map → SurveyBlock-GSHYZMTW.cjs.map} +1 -1
- package/dist/SurveyBlock-M5BEFZGT.js +8 -0
- package/dist/{SurveyBlock-4DO62RBT.js.map → SurveyBlock-M5BEFZGT.js.map} +1 -1
- package/dist/brands/index.cjs +13 -13
- package/dist/brands/index.js +1 -1
- package/dist/{chunk-VNYW4C4J.cjs → chunk-2BGS7RFM.cjs} +4 -84
- package/dist/chunk-2BGS7RFM.cjs.map +1 -0
- package/dist/{chunk-TMMVIUUN.js → chunk-4IETGCMD.js} +4 -4
- package/dist/{chunk-TMMVIUUN.js.map → chunk-4IETGCMD.js.map} +1 -1
- package/dist/{chunk-76TBQDED.js → chunk-4LPGJ3ZO.js} +4 -4
- package/dist/{chunk-76TBQDED.js.map → chunk-4LPGJ3ZO.js.map} +1 -1
- package/dist/{chunk-6EN3IQQI.cjs → chunk-6GZKQR7P.cjs} +4 -4
- package/dist/{chunk-6EN3IQQI.cjs.map → chunk-6GZKQR7P.cjs.map} +1 -1
- package/dist/{chunk-Y5HFM7LO.js → chunk-77PNQILS.js} +3 -3
- package/dist/{chunk-Y5HFM7LO.js.map → chunk-77PNQILS.js.map} +1 -1
- package/dist/{chunk-G4D6CLBT.js → chunk-7U5QYH54.js} +3 -3
- package/dist/{chunk-G4D6CLBT.js.map → chunk-7U5QYH54.js.map} +1 -1
- package/dist/chunk-AXRRBEER.js +86 -0
- package/dist/chunk-AXRRBEER.js.map +1 -0
- package/dist/{chunk-VU6UTJRM.js → chunk-CATY3P2U.js} +3 -3
- package/dist/{chunk-VU6UTJRM.js.map → chunk-CATY3P2U.js.map} +1 -1
- package/dist/{chunk-UV2FVNWT.cjs → chunk-DF7K6DOJ.cjs} +5 -5
- package/dist/{chunk-UV2FVNWT.cjs.map → chunk-DF7K6DOJ.cjs.map} +1 -1
- package/dist/{chunk-TVTIGV7Q.js → chunk-DXCATYEO.js} +4 -4
- package/dist/{chunk-TVTIGV7Q.js.map → chunk-DXCATYEO.js.map} +1 -1
- package/dist/{chunk-5MCBWTIF.cjs → chunk-E2B5BLAF.cjs} +4 -4
- package/dist/{chunk-5MCBWTIF.cjs.map → chunk-E2B5BLAF.cjs.map} +1 -1
- package/dist/{chunk-GD7EBGC4.cjs → chunk-EQXFDPXV.cjs} +14 -14
- package/dist/{chunk-GD7EBGC4.cjs.map → chunk-EQXFDPXV.cjs.map} +1 -1
- package/dist/{chunk-ENKFJJZX.js → chunk-ETCHEURD.js} +4 -4
- package/dist/{chunk-ENKFJJZX.js.map → chunk-ETCHEURD.js.map} +1 -1
- package/dist/{chunk-DEDN5HAG.js → chunk-FDP6VS5G.js} +3 -3
- package/dist/{chunk-DEDN5HAG.js.map → chunk-FDP6VS5G.js.map} +1 -1
- package/dist/{chunk-WNZAYBVB.cjs → chunk-GRV4MOEO.cjs} +26 -26
- package/dist/{chunk-WNZAYBVB.cjs.map → chunk-GRV4MOEO.cjs.map} +1 -1
- package/dist/{chunk-DLRCAV4Z.js → chunk-IBCCFWD4.js} +24 -3
- package/dist/chunk-IBCCFWD4.js.map +1 -0
- package/dist/{chunk-G3JX3UAU.cjs → chunk-IUQMOBFB.cjs} +5 -5
- package/dist/{chunk-G3JX3UAU.cjs.map → chunk-IUQMOBFB.cjs.map} +1 -1
- package/dist/{chunk-ZPSJ2UV6.cjs → chunk-JX4UZEBZ.cjs} +8 -8
- package/dist/{chunk-ZPSJ2UV6.cjs.map → chunk-JX4UZEBZ.cjs.map} +1 -1
- package/dist/{chunk-7ZXAQTV4.cjs → chunk-KM5OQQL5.cjs} +8 -8
- package/dist/{chunk-7ZXAQTV4.cjs.map → chunk-KM5OQQL5.cjs.map} +1 -1
- package/dist/{chunk-KQUI4BGS.cjs → chunk-LGIQVSAE.cjs} +17 -17
- package/dist/{chunk-KQUI4BGS.cjs.map → chunk-LGIQVSAE.cjs.map} +1 -1
- package/dist/{chunk-FXO5ARBB.cjs → chunk-M5NYHH3Z.cjs} +4 -4
- package/dist/{chunk-FXO5ARBB.cjs.map → chunk-M5NYHH3Z.cjs.map} +1 -1
- package/dist/{chunk-URAQIF67.cjs → chunk-MB5KIIT4.cjs} +6 -6
- package/dist/{chunk-URAQIF67.cjs.map → chunk-MB5KIIT4.cjs.map} +1 -1
- package/dist/{chunk-PSXTXFLM.cjs → chunk-NEFBVO5W.cjs} +24 -3
- package/dist/chunk-NEFBVO5W.cjs.map +1 -0
- package/dist/{chunk-XZNN3S3S.cjs → chunk-O5A4GTTG.cjs} +4 -4
- package/dist/{chunk-XZNN3S3S.cjs.map → chunk-O5A4GTTG.cjs.map} +1 -1
- package/dist/{chunk-DZ5HFLRC.js → chunk-OWLWABAS.js} +3 -3
- package/dist/{chunk-DZ5HFLRC.js.map → chunk-OWLWABAS.js.map} +1 -1
- package/dist/{chunk-IX6KFB3K.cjs → chunk-OZ2LP2VQ.cjs} +9 -9
- package/dist/{chunk-IX6KFB3K.cjs.map → chunk-OZ2LP2VQ.cjs.map} +1 -1
- package/dist/{chunk-N6IY47YA.cjs → chunk-PLDJU623.cjs} +8 -8
- package/dist/{chunk-N6IY47YA.cjs.map → chunk-PLDJU623.cjs.map} +1 -1
- package/dist/{chunk-WGPLUCBD.js → chunk-R47H3Y7J.js} +3 -3
- package/dist/{chunk-WGPLUCBD.js.map → chunk-R47H3Y7J.js.map} +1 -1
- package/dist/{chunk-OE5CKRUC.js → chunk-R5AFQWR5.js} +3 -3
- package/dist/{chunk-OE5CKRUC.js.map → chunk-R5AFQWR5.js.map} +1 -1
- package/dist/{chunk-2IZLKPUW.js → chunk-T7U5HHGK.js} +3 -3
- package/dist/{chunk-2IZLKPUW.js.map → chunk-T7U5HHGK.js.map} +1 -1
- package/dist/{chunk-OCSCBB52.cjs → chunk-TVSGJT6G.cjs} +6 -6
- package/dist/{chunk-OCSCBB52.cjs.map → chunk-TVSGJT6G.cjs.map} +1 -1
- package/dist/{chunk-3QEVGSFG.cjs → chunk-UKUKBUME.cjs} +5 -5
- package/dist/{chunk-3QEVGSFG.cjs.map → chunk-UKUKBUME.cjs.map} +1 -1
- package/dist/{chunk-GOALNQZ2.js → chunk-UV4IJNSN.js} +4 -83
- package/dist/chunk-UV4IJNSN.js.map +1 -0
- package/dist/{chunk-VOKVG3ER.js → chunk-UXI33QGR.js} +3 -3
- package/dist/{chunk-VOKVG3ER.js.map → chunk-UXI33QGR.js.map} +1 -1
- package/dist/{chunk-XEAT7XJG.cjs → chunk-VLBUT2QM.cjs} +4 -4
- package/dist/{chunk-XEAT7XJG.cjs.map → chunk-VLBUT2QM.cjs.map} +1 -1
- package/dist/chunk-VNCIIXGO.js +1924 -0
- package/dist/chunk-VNCIIXGO.js.map +1 -0
- package/dist/{chunk-5GUOOLPR.cjs → chunk-VPRKE2YU.cjs} +5 -5
- package/dist/{chunk-5GUOOLPR.cjs.map → chunk-VPRKE2YU.cjs.map} +1 -1
- package/dist/{chunk-KZFBQ7GY.js → chunk-VVZALGPI.js} +3 -3
- package/dist/{chunk-KZFBQ7GY.js.map → chunk-VVZALGPI.js.map} +1 -1
- package/dist/{chunk-V7D3YGUV.js → chunk-W5TPBCBM.js} +4 -4
- package/dist/{chunk-V7D3YGUV.js.map → chunk-W5TPBCBM.js.map} +1 -1
- package/dist/{chunk-H4ZXMQQW.js → chunk-WBBOH5QF.js} +3 -3
- package/dist/{chunk-H4ZXMQQW.js.map → chunk-WBBOH5QF.js.map} +1 -1
- package/dist/{chunk-3QGS6CXD.js → chunk-WC25GQZD.js} +3 -3
- package/dist/{chunk-3QGS6CXD.js.map → chunk-WC25GQZD.js.map} +1 -1
- package/dist/{chunk-VKELAMAZ.js → chunk-WN6A4QOF.js} +3 -3
- package/dist/{chunk-VKELAMAZ.js.map → chunk-WN6A4QOF.js.map} +1 -1
- package/dist/chunk-XFLEW7AT.cjs +88 -0
- package/dist/chunk-XFLEW7AT.cjs.map +1 -0
- package/dist/{chunk-MNILXWVY.js → chunk-XU2E7MTG.js} +7 -7
- package/dist/{chunk-MNILXWVY.js.map → chunk-XU2E7MTG.js.map} +1 -1
- package/dist/{chunk-E4IBHYJ7.cjs → chunk-YEQLSYJO.cjs} +5 -5
- package/dist/{chunk-E4IBHYJ7.cjs.map → chunk-YEQLSYJO.cjs.map} +1 -1
- package/dist/chunk-YIWJTNR5.cjs +1967 -0
- package/dist/chunk-YIWJTNR5.cjs.map +1 -0
- package/dist/components/AlertDialog/index.cjs +4 -3
- package/dist/components/AlertDialog/index.js +3 -2
- package/dist/components/Button/index.cjs +4 -3
- package/dist/components/Button/index.d.cts +3 -2
- package/dist/components/Button/index.d.ts +3 -2
- package/dist/components/Button/index.js +2 -1
- package/dist/components/CalendarView/index.cjs +5 -4
- package/dist/components/CalendarView/index.d.cts +1 -1
- package/dist/components/CalendarView/index.d.ts +1 -1
- package/dist/components/CalendarView/index.js +3 -2
- package/dist/components/CustomizableDashboard/index.cjs +10 -9
- package/dist/components/CustomizableDashboard/index.js +3 -2
- package/dist/components/FloatingWindow/index.cjs +5 -4
- package/dist/components/FloatingWindow/index.js +3 -2
- package/dist/components/GanttView/index.d.cts +1 -1
- package/dist/components/GanttView/index.d.ts +1 -1
- package/dist/components/ListView/index.cjs +5 -4
- package/dist/components/ListView/index.d.cts +90 -2
- package/dist/components/ListView/index.d.ts +90 -2
- package/dist/components/ListView/index.js +3 -2
- package/dist/components/Markdown/index.cjs +20 -19
- package/dist/components/Markdown/index.js +8 -7
- package/dist/components/MediaEditor/index.cjs +9 -8
- package/dist/components/MediaEditor/index.js +4 -3
- package/dist/components/MediaPlayer/index.cjs +6 -5
- package/dist/components/MediaPlayer/index.js +3 -2
- package/dist/components/MegaMenu/index.cjs +6 -5
- package/dist/components/MegaMenu/index.js +3 -2
- package/dist/components/RadialExplorer/index.cjs +4 -3
- package/dist/components/RadialExplorer/index.js +3 -2
- package/dist/components/RichTextEditor/index.cjs +6 -5
- package/dist/components/RichTextEditor/index.js +3 -2
- package/dist/components/SectionSpyNav/index.cjs +4 -3
- package/dist/components/SectionSpyNav/index.js +3 -2
- package/dist/components/ViewSet/index.cjs +6 -5
- package/dist/components/ViewSet/index.d.cts +101 -1
- package/dist/components/ViewSet/index.d.ts +101 -1
- package/dist/components/ViewSet/index.js +5 -4
- package/dist/components/ViewSwitcher/index.d.cts +57 -4
- package/dist/components/ViewSwitcher/index.d.ts +57 -4
- package/dist/datavis.cjs +3 -2
- package/dist/datavis.cjs.map +1 -1
- package/dist/datavis.js +2 -1
- package/dist/datavis.js.map +1 -1
- package/dist/esheet.cjs +7 -6
- package/dist/esheet.cjs.map +1 -1
- package/dist/esheet.js +4 -3
- package/dist/esheet.js.map +1 -1
- package/dist/index.cjs +613 -523
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +558 -1
- package/dist/index.d.ts +558 -1
- package/dist/index.js +41 -38
- package/dist/index.js.map +1 -1
- package/dist/styles/effects.css +33 -0
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.cjs +4 -4
- package/dist/tailwind-preset.js +1 -1
- package/dist/templates.cjs +103 -0
- package/dist/templates.cjs.map +1 -0
- package/dist/templates.d.cts +560 -0
- package/dist/templates.d.ts +560 -0
- package/dist/templates.js +10 -0
- package/dist/templates.js.map +1 -0
- package/dist/{types-DsdZvEI1.d.cts → types-C3HQe74F.d.cts} +1 -7
- package/dist/{types-DsdZvEI1.d.ts → types-C3HQe74F.d.ts} +1 -7
- package/package.json +12 -1
- package/dist/CsvBlock-ROJCKJDP.cjs +0 -16
- package/dist/CsvBlock-UWPMTLE2.js +0 -7
- package/dist/HtmlPreviewBlock-DWFN6EUB.cjs +0 -16
- package/dist/HtmlPreviewBlock-ME5U3XNS.js +0 -7
- package/dist/MermaidBlock-2B6CPD6Y.js +0 -7
- package/dist/MermaidBlock-D2UC5M55.cjs +0 -16
- package/dist/SurveyBlock-4CD4AYMJ.cjs +0 -16
- package/dist/SurveyBlock-4DO62RBT.js +0 -7
- package/dist/chunk-DLRCAV4Z.js.map +0 -1
- package/dist/chunk-GOALNQZ2.js.map +0 -1
- package/dist/chunk-PSXTXFLM.cjs.map +0 -1
- package/dist/chunk-VNYW4C4J.cjs.map +0 -1
- package/dist/index-DoYYWsNc.d.cts +0 -127
- package/dist/index-DoYYWsNc.d.ts +0 -127
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkTVSGJT6G_cjs = require('../../chunk-TVSGJT6G.cjs');
|
|
4
4
|
require('../../chunk-XDIMTPZU.cjs');
|
|
5
|
-
require('../../chunk-
|
|
5
|
+
require('../../chunk-O5A4GTTG.cjs');
|
|
6
6
|
require('../../chunk-VINZZQBD.cjs');
|
|
7
|
+
require('../../chunk-MB5KIIT4.cjs');
|
|
7
8
|
require('../../chunk-4IS3QCOQ.cjs');
|
|
8
|
-
require('../../chunk-URAQIF67.cjs');
|
|
9
9
|
require('../../chunk-4NCDU5IG.cjs');
|
|
10
10
|
require('../../chunk-XXVUHLQN.cjs');
|
|
11
11
|
require('../../chunk-L7L5S2HO.cjs');
|
|
12
|
-
require('../../chunk-
|
|
12
|
+
require('../../chunk-2BGS7RFM.cjs');
|
|
13
|
+
require('../../chunk-XFLEW7AT.cjs');
|
|
13
14
|
require('../../chunk-S5RVSXDV.cjs');
|
|
14
15
|
require('../../chunk-EUAMEVVI.cjs');
|
|
15
16
|
|
|
@@ -17,7 +18,7 @@ require('../../chunk-EUAMEVVI.cjs');
|
|
|
17
18
|
|
|
18
19
|
Object.defineProperty(exports, "ViewSet", {
|
|
19
20
|
enumerable: true,
|
|
20
|
-
get: function () { return
|
|
21
|
+
get: function () { return chunkTVSGJT6G_cjs.ViewSet; }
|
|
21
22
|
});
|
|
22
23
|
//# sourceMappingURL=index.cjs.map
|
|
23
24
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1,9 +1,109 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
import { V as ViewBaseProps, S as Stage, a as ViewLabels, b as ViewId, c as ViewOption } from '../../index-DoYYWsNc.cjs';
|
|
4
3
|
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
5
4
|
import { VariantProps } from 'class-variance-authority';
|
|
6
5
|
|
|
6
|
+
/**
|
|
7
|
+
* The contract every component in the `Modules/Views` family reads through.
|
|
8
|
+
*
|
|
9
|
+
* A page describes its collection once — which field is the id, the title, the
|
|
10
|
+
* status, the start date — and every view understands it. That is the whole
|
|
11
|
+
* reason the family exists: without it each view needs its own adapter and you
|
|
12
|
+
* end up re-implementing the same board per entity.
|
|
13
|
+
*
|
|
14
|
+
* Views are headless. Nothing here fetches, subscribes, or navigates.
|
|
15
|
+
* See CONTRIBUTING → "Modules: headless data components".
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Which layout is on screen. `overview` and `table` are rendered by the host
|
|
20
|
+
* through `ViewSet` slots rather than by a component in this family — a tabular
|
|
21
|
+
* collection is `DataVisNitroGrid`, and an overview is domain content.
|
|
22
|
+
*/
|
|
23
|
+
type ViewId = 'overview' | 'list' | 'board' | 'calendar' | 'gantt' | 'roadmap' | 'table';
|
|
24
|
+
/**
|
|
25
|
+
* A semantic colour name, resolved to `--mieweb-*` tokens by each view.
|
|
26
|
+
*
|
|
27
|
+
* Accessors return one of these rather than a class string so a caller cannot
|
|
28
|
+
* hardcode a palette that breaks under another brand or in dark mode.
|
|
29
|
+
*/
|
|
30
|
+
type Accent = 'primary' | 'success' | 'warning' | 'destructive' | 'info' | 'neutral';
|
|
31
|
+
/** A named stage: a board column, and the segments of a stage bar. */
|
|
32
|
+
interface Stage {
|
|
33
|
+
id: string;
|
|
34
|
+
label: string;
|
|
35
|
+
accent?: Accent;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* How a view reads one item. Only `getId` and `getTitle` are always required;
|
|
39
|
+
* each view documents which of the rest it needs (a board needs `getStatus`, a
|
|
40
|
+
* Gantt needs `getStart`) and renders an explanatory empty state without them.
|
|
41
|
+
*/
|
|
42
|
+
interface ViewAccessors<T> {
|
|
43
|
+
getId: (item: T) => string;
|
|
44
|
+
getTitle: (item: T) => string;
|
|
45
|
+
/** Secondary line under the title. */
|
|
46
|
+
getSubtitle?: (item: T) => string | undefined;
|
|
47
|
+
/** Board column and list group; matched against `Stage['id']`. */
|
|
48
|
+
getStatus?: (item: T) => string;
|
|
49
|
+
/** Gantt bar start, calendar placement. */
|
|
50
|
+
getStart?: (item: T) => Date | string | null | undefined;
|
|
51
|
+
/** Gantt bar end, calendar span. Falls back to the start when absent. */
|
|
52
|
+
getEnd?: (item: T) => Date | string | null | undefined;
|
|
53
|
+
/** Swimlane in a roadmap, row group in a Gantt. */
|
|
54
|
+
getGroup?: (item: T) => string | undefined;
|
|
55
|
+
getAccent?: (item: T) => Accent;
|
|
56
|
+
}
|
|
57
|
+
/** Strings a view renders. Every one is overridable; the defaults are English. */
|
|
58
|
+
interface ViewLabels {
|
|
59
|
+
/** Accessible name of the view switcher group. */
|
|
60
|
+
viewSwitcher: string;
|
|
61
|
+
loading: string;
|
|
62
|
+
empty: string;
|
|
63
|
+
error: string;
|
|
64
|
+
/** Action on the error state. */
|
|
65
|
+
retry: string;
|
|
66
|
+
/** Heading for the group a record with no status or group falls into. */
|
|
67
|
+
ungrouped: string;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Props every view accepts. Views are controlled: selection, the active view and
|
|
71
|
+
* filter state live in the page, and every change is handed back.
|
|
72
|
+
*/
|
|
73
|
+
interface ViewBaseProps<T> {
|
|
74
|
+
items: T[];
|
|
75
|
+
accessors: ViewAccessors<T>;
|
|
76
|
+
loading?: boolean;
|
|
77
|
+
error?: Error | null;
|
|
78
|
+
selectedId?: string | null;
|
|
79
|
+
/** Called when the user activates an item. */
|
|
80
|
+
onOpen?: (id: string, item: T) => void;
|
|
81
|
+
/** Return a URL to render each item as a real anchor — middle-clickable and crawlable. */
|
|
82
|
+
getHref?: (id: string, item: T) => string;
|
|
83
|
+
/** Render one item. Receives the active view so one function can serve several. */
|
|
84
|
+
renderItem?: (item: T, context: {
|
|
85
|
+
view: ViewId;
|
|
86
|
+
}) => React.ReactNode;
|
|
87
|
+
/** Replaces the built-in empty state. */
|
|
88
|
+
emptyState?: React.ReactNode;
|
|
89
|
+
labels?: Partial<ViewLabels>;
|
|
90
|
+
/** Pins "today" so stories, tests and visual snapshots stay deterministic. */
|
|
91
|
+
now?: Date;
|
|
92
|
+
className?: string;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
interface ViewOption {
|
|
96
|
+
id: ViewId;
|
|
97
|
+
/** Overrides the built-in English label. */
|
|
98
|
+
label?: string;
|
|
99
|
+
/** Overrides the built-in icon. */
|
|
100
|
+
icon?: React.ComponentType<{
|
|
101
|
+
className?: string;
|
|
102
|
+
'aria-hidden'?: boolean;
|
|
103
|
+
}>;
|
|
104
|
+
disabled?: boolean;
|
|
105
|
+
}
|
|
106
|
+
|
|
7
107
|
type ListViewSlot = 'group' | 'groupHeader' | 'item' | 'selectedItem' | 'state';
|
|
8
108
|
interface ListViewProps<T> extends ViewBaseProps<T>, VariantProps<typeof itemVariants> {
|
|
9
109
|
/**
|
|
@@ -1,9 +1,109 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
import { V as ViewBaseProps, S as Stage, a as ViewLabels, b as ViewId, c as ViewOption } from '../../index-DoYYWsNc.js';
|
|
4
3
|
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
5
4
|
import { VariantProps } from 'class-variance-authority';
|
|
6
5
|
|
|
6
|
+
/**
|
|
7
|
+
* The contract every component in the `Modules/Views` family reads through.
|
|
8
|
+
*
|
|
9
|
+
* A page describes its collection once — which field is the id, the title, the
|
|
10
|
+
* status, the start date — and every view understands it. That is the whole
|
|
11
|
+
* reason the family exists: without it each view needs its own adapter and you
|
|
12
|
+
* end up re-implementing the same board per entity.
|
|
13
|
+
*
|
|
14
|
+
* Views are headless. Nothing here fetches, subscribes, or navigates.
|
|
15
|
+
* See CONTRIBUTING → "Modules: headless data components".
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Which layout is on screen. `overview` and `table` are rendered by the host
|
|
20
|
+
* through `ViewSet` slots rather than by a component in this family — a tabular
|
|
21
|
+
* collection is `DataVisNitroGrid`, and an overview is domain content.
|
|
22
|
+
*/
|
|
23
|
+
type ViewId = 'overview' | 'list' | 'board' | 'calendar' | 'gantt' | 'roadmap' | 'table';
|
|
24
|
+
/**
|
|
25
|
+
* A semantic colour name, resolved to `--mieweb-*` tokens by each view.
|
|
26
|
+
*
|
|
27
|
+
* Accessors return one of these rather than a class string so a caller cannot
|
|
28
|
+
* hardcode a palette that breaks under another brand or in dark mode.
|
|
29
|
+
*/
|
|
30
|
+
type Accent = 'primary' | 'success' | 'warning' | 'destructive' | 'info' | 'neutral';
|
|
31
|
+
/** A named stage: a board column, and the segments of a stage bar. */
|
|
32
|
+
interface Stage {
|
|
33
|
+
id: string;
|
|
34
|
+
label: string;
|
|
35
|
+
accent?: Accent;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* How a view reads one item. Only `getId` and `getTitle` are always required;
|
|
39
|
+
* each view documents which of the rest it needs (a board needs `getStatus`, a
|
|
40
|
+
* Gantt needs `getStart`) and renders an explanatory empty state without them.
|
|
41
|
+
*/
|
|
42
|
+
interface ViewAccessors<T> {
|
|
43
|
+
getId: (item: T) => string;
|
|
44
|
+
getTitle: (item: T) => string;
|
|
45
|
+
/** Secondary line under the title. */
|
|
46
|
+
getSubtitle?: (item: T) => string | undefined;
|
|
47
|
+
/** Board column and list group; matched against `Stage['id']`. */
|
|
48
|
+
getStatus?: (item: T) => string;
|
|
49
|
+
/** Gantt bar start, calendar placement. */
|
|
50
|
+
getStart?: (item: T) => Date | string | null | undefined;
|
|
51
|
+
/** Gantt bar end, calendar span. Falls back to the start when absent. */
|
|
52
|
+
getEnd?: (item: T) => Date | string | null | undefined;
|
|
53
|
+
/** Swimlane in a roadmap, row group in a Gantt. */
|
|
54
|
+
getGroup?: (item: T) => string | undefined;
|
|
55
|
+
getAccent?: (item: T) => Accent;
|
|
56
|
+
}
|
|
57
|
+
/** Strings a view renders. Every one is overridable; the defaults are English. */
|
|
58
|
+
interface ViewLabels {
|
|
59
|
+
/** Accessible name of the view switcher group. */
|
|
60
|
+
viewSwitcher: string;
|
|
61
|
+
loading: string;
|
|
62
|
+
empty: string;
|
|
63
|
+
error: string;
|
|
64
|
+
/** Action on the error state. */
|
|
65
|
+
retry: string;
|
|
66
|
+
/** Heading for the group a record with no status or group falls into. */
|
|
67
|
+
ungrouped: string;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Props every view accepts. Views are controlled: selection, the active view and
|
|
71
|
+
* filter state live in the page, and every change is handed back.
|
|
72
|
+
*/
|
|
73
|
+
interface ViewBaseProps<T> {
|
|
74
|
+
items: T[];
|
|
75
|
+
accessors: ViewAccessors<T>;
|
|
76
|
+
loading?: boolean;
|
|
77
|
+
error?: Error | null;
|
|
78
|
+
selectedId?: string | null;
|
|
79
|
+
/** Called when the user activates an item. */
|
|
80
|
+
onOpen?: (id: string, item: T) => void;
|
|
81
|
+
/** Return a URL to render each item as a real anchor — middle-clickable and crawlable. */
|
|
82
|
+
getHref?: (id: string, item: T) => string;
|
|
83
|
+
/** Render one item. Receives the active view so one function can serve several. */
|
|
84
|
+
renderItem?: (item: T, context: {
|
|
85
|
+
view: ViewId;
|
|
86
|
+
}) => React.ReactNode;
|
|
87
|
+
/** Replaces the built-in empty state. */
|
|
88
|
+
emptyState?: React.ReactNode;
|
|
89
|
+
labels?: Partial<ViewLabels>;
|
|
90
|
+
/** Pins "today" so stories, tests and visual snapshots stay deterministic. */
|
|
91
|
+
now?: Date;
|
|
92
|
+
className?: string;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
interface ViewOption {
|
|
96
|
+
id: ViewId;
|
|
97
|
+
/** Overrides the built-in English label. */
|
|
98
|
+
label?: string;
|
|
99
|
+
/** Overrides the built-in icon. */
|
|
100
|
+
icon?: React.ComponentType<{
|
|
101
|
+
className?: string;
|
|
102
|
+
'aria-hidden'?: boolean;
|
|
103
|
+
}>;
|
|
104
|
+
disabled?: boolean;
|
|
105
|
+
}
|
|
106
|
+
|
|
7
107
|
type ListViewSlot = 'group' | 'groupHeader' | 'item' | 'selectedItem' | 'state';
|
|
8
108
|
interface ListViewProps<T> extends ViewBaseProps<T>, VariantProps<typeof itemVariants> {
|
|
9
109
|
/**
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
export { ViewSet } from '../../chunk-
|
|
1
|
+
export { ViewSet } from '../../chunk-4LPGJ3ZO.js';
|
|
2
2
|
import '../../chunk-IT775BYG.js';
|
|
3
|
-
import '../../chunk-
|
|
3
|
+
import '../../chunk-OWLWABAS.js';
|
|
4
4
|
import '../../chunk-Y4QNLW7W.js';
|
|
5
|
+
import '../../chunk-7U5QYH54.js';
|
|
5
6
|
import '../../chunk-XVW5DPPP.js';
|
|
6
|
-
import '../../chunk-G4D6CLBT.js';
|
|
7
7
|
import '../../chunk-3YBS4WUQ.js';
|
|
8
8
|
import '../../chunk-UA7E7PDS.js';
|
|
9
9
|
import '../../chunk-BKSPDTX4.js';
|
|
10
|
-
import '../../chunk-
|
|
10
|
+
import '../../chunk-UV4IJNSN.js';
|
|
11
|
+
import '../../chunk-AXRRBEER.js';
|
|
11
12
|
import '../../chunk-TQONQSJO.js';
|
|
12
13
|
import '../../chunk-PX6F3LHL.js';
|
|
13
14
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,4 +1,57 @@
|
|
|
1
|
-
|
|
2
|
-
import '
|
|
3
|
-
import '
|
|
4
|
-
|
|
1
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { VariantProps } from 'class-variance-authority';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The contract every component in the `Modules/Views` family reads through.
|
|
7
|
+
*
|
|
8
|
+
* A page describes its collection once — which field is the id, the title, the
|
|
9
|
+
* status, the start date — and every view understands it. That is the whole
|
|
10
|
+
* reason the family exists: without it each view needs its own adapter and you
|
|
11
|
+
* end up re-implementing the same board per entity.
|
|
12
|
+
*
|
|
13
|
+
* Views are headless. Nothing here fetches, subscribes, or navigates.
|
|
14
|
+
* See CONTRIBUTING → "Modules: headless data components".
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Which layout is on screen. `overview` and `table` are rendered by the host
|
|
19
|
+
* through `ViewSet` slots rather than by a component in this family — a tabular
|
|
20
|
+
* collection is `DataVisNitroGrid`, and an overview is domain content.
|
|
21
|
+
*/
|
|
22
|
+
type ViewId = 'overview' | 'list' | 'board' | 'calendar' | 'gantt' | 'roadmap' | 'table';
|
|
23
|
+
|
|
24
|
+
interface ViewOption {
|
|
25
|
+
id: ViewId;
|
|
26
|
+
/** Overrides the built-in English label. */
|
|
27
|
+
label?: string;
|
|
28
|
+
/** Overrides the built-in icon. */
|
|
29
|
+
icon?: React.ComponentType<{
|
|
30
|
+
className?: string;
|
|
31
|
+
'aria-hidden'?: boolean;
|
|
32
|
+
}>;
|
|
33
|
+
disabled?: boolean;
|
|
34
|
+
}
|
|
35
|
+
interface ViewSwitcherProps extends VariantProps<typeof viewSwitcherVariants> {
|
|
36
|
+
/** Views to offer, in order. Accepts bare ids or `ViewOption`s. */
|
|
37
|
+
views: readonly (ViewId | ViewOption)[];
|
|
38
|
+
value: ViewId;
|
|
39
|
+
onValueChange: (view: ViewId) => void;
|
|
40
|
+
/** Accessible name of the group. */
|
|
41
|
+
label?: string;
|
|
42
|
+
/** Show labels beside the icons. `responsive` hides them below `sm`. */
|
|
43
|
+
showLabels?: boolean | 'responsive';
|
|
44
|
+
className?: string;
|
|
45
|
+
classNames?: Partial<Record<'option' | 'activeOption', string>>;
|
|
46
|
+
}
|
|
47
|
+
declare const viewSwitcherVariants: (props?: ({
|
|
48
|
+
size?: "sm" | "md" | null | undefined;
|
|
49
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
50
|
+
/**
|
|
51
|
+
* Keyboard model is a radio group: one tab stop, arrows move *and* select.
|
|
52
|
+
* Every option is visible, so moving the selection is the whole interaction —
|
|
53
|
+
* there is nothing to "commit" afterwards.
|
|
54
|
+
*/
|
|
55
|
+
declare const ViewSwitcher: React.ForwardRefExoticComponent<ViewSwitcherProps & React.RefAttributes<HTMLDivElement>>;
|
|
56
|
+
|
|
57
|
+
export { type ViewOption, ViewSwitcher, type ViewSwitcherProps, viewSwitcherVariants };
|
|
@@ -1,4 +1,57 @@
|
|
|
1
|
-
|
|
2
|
-
import '
|
|
3
|
-
import '
|
|
4
|
-
|
|
1
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { VariantProps } from 'class-variance-authority';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The contract every component in the `Modules/Views` family reads through.
|
|
7
|
+
*
|
|
8
|
+
* A page describes its collection once — which field is the id, the title, the
|
|
9
|
+
* status, the start date — and every view understands it. That is the whole
|
|
10
|
+
* reason the family exists: without it each view needs its own adapter and you
|
|
11
|
+
* end up re-implementing the same board per entity.
|
|
12
|
+
*
|
|
13
|
+
* Views are headless. Nothing here fetches, subscribes, or navigates.
|
|
14
|
+
* See CONTRIBUTING → "Modules: headless data components".
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Which layout is on screen. `overview` and `table` are rendered by the host
|
|
19
|
+
* through `ViewSet` slots rather than by a component in this family — a tabular
|
|
20
|
+
* collection is `DataVisNitroGrid`, and an overview is domain content.
|
|
21
|
+
*/
|
|
22
|
+
type ViewId = 'overview' | 'list' | 'board' | 'calendar' | 'gantt' | 'roadmap' | 'table';
|
|
23
|
+
|
|
24
|
+
interface ViewOption {
|
|
25
|
+
id: ViewId;
|
|
26
|
+
/** Overrides the built-in English label. */
|
|
27
|
+
label?: string;
|
|
28
|
+
/** Overrides the built-in icon. */
|
|
29
|
+
icon?: React.ComponentType<{
|
|
30
|
+
className?: string;
|
|
31
|
+
'aria-hidden'?: boolean;
|
|
32
|
+
}>;
|
|
33
|
+
disabled?: boolean;
|
|
34
|
+
}
|
|
35
|
+
interface ViewSwitcherProps extends VariantProps<typeof viewSwitcherVariants> {
|
|
36
|
+
/** Views to offer, in order. Accepts bare ids or `ViewOption`s. */
|
|
37
|
+
views: readonly (ViewId | ViewOption)[];
|
|
38
|
+
value: ViewId;
|
|
39
|
+
onValueChange: (view: ViewId) => void;
|
|
40
|
+
/** Accessible name of the group. */
|
|
41
|
+
label?: string;
|
|
42
|
+
/** Show labels beside the icons. `responsive` hides them below `sm`. */
|
|
43
|
+
showLabels?: boolean | 'responsive';
|
|
44
|
+
className?: string;
|
|
45
|
+
classNames?: Partial<Record<'option' | 'activeOption', string>>;
|
|
46
|
+
}
|
|
47
|
+
declare const viewSwitcherVariants: (props?: ({
|
|
48
|
+
size?: "sm" | "md" | null | undefined;
|
|
49
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
50
|
+
/**
|
|
51
|
+
* Keyboard model is a radio group: one tab stop, arrows move *and* select.
|
|
52
|
+
* Every option is visible, so moving the selection is the whole interaction —
|
|
53
|
+
* there is nothing to "commit" afterwards.
|
|
54
|
+
*/
|
|
55
|
+
declare const ViewSwitcher: React.ForwardRefExoticComponent<ViewSwitcherProps & React.RefAttributes<HTMLDivElement>>;
|
|
56
|
+
|
|
57
|
+
export { type ViewOption, ViewSwitcher, type ViewSwitcherProps, viewSwitcherVariants };
|
package/dist/datavis.cjs
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
var chunkPN2PIE2L_cjs = require('./chunk-PN2PIE2L.cjs');
|
|
4
4
|
var chunkRI56YPED_cjs = require('./chunk-RI56YPED.cjs');
|
|
5
5
|
var chunkYVL3XATO_cjs = require('./chunk-YVL3XATO.cjs');
|
|
6
|
-
var
|
|
6
|
+
var chunk2BGS7RFM_cjs = require('./chunk-2BGS7RFM.cjs');
|
|
7
|
+
require('./chunk-XFLEW7AT.cjs');
|
|
7
8
|
var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
|
|
8
9
|
require('./chunk-EUAMEVVI.cjs');
|
|
9
10
|
var React = require('react');
|
|
@@ -108,7 +109,7 @@ function OrdersGroupPresets({
|
|
|
108
109
|
children: [
|
|
109
110
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Group:" }),
|
|
110
111
|
presets.map((p) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
111
|
-
|
|
112
|
+
chunk2BGS7RFM_cjs.Button,
|
|
112
113
|
{
|
|
113
114
|
type: "button",
|
|
114
115
|
size: "sm",
|
package/dist/datavis.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/HealthSurveillance/ordersGridShared.tsx","../src/components/HealthSurveillance/OrdersGrid.tsx"],"names":["React","jsx","Fragment","Badge","ul","jsxs","cn","Button","React2","ml","gl","buildChartOrderRows","buildEncounterOrderRows"],"mappings":"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","file":"datavis.cjs","sourcesContent":["'use client';\n\n/**\n * Shared internals for the NITRO-backed orders grids\n * (ChartOrdersGrid / EncounterOrdersGrid).\n *\n * - {@link useOrderRowsUrl} — feeds in-memory {@link OrderRow}s to\n * `DataVisNitroSource` through a short-lived object-URL carrying the\n * `{ typeInfo, data }` payload the engine expects (its `local` source type\n * is not implemented yet; same pattern as SuperChat's NITRO table plugin).\n * - {@link OrderStatusBadge} / {@link formatOrderCell} — status chips in grid\n * cells.\n * - {@link OrdersGroupPresets} — one-click \"group by\" chips driving\n * `view.setGroup()` through {@link DataVisNitroContext}.\n *\n * Row selection and mass operations are native NITRO features:\n * `features.rowSelection: 'checkbox'` + the `operations` palette.\n */\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Badge } from '../Badge/Badge';\nimport { Button } from '../Button';\nimport { DataVisNitroContext } from '../DataVisNITRO';\nimport type { OrderRow, OrderRowStatus } from './orderRows';\n\n// =============================================================================\n// Column + typeInfo metadata\n// =============================================================================\n\n/** Grid columns, in display order, with control-panel display names. */\nexport const ORDER_COLUMNS: {\n field: keyof OrderRow;\n header: string;\n type: 'string' | 'date';\n}[] = [\n { field: 'status', header: 'Status', type: 'string' },\n { field: 'order', header: 'Order', type: 'string' },\n { field: 'reason', header: 'Reason', type: 'string' },\n { field: 'kind', header: 'Kind', type: 'string' },\n { field: 'date', header: 'Date', type: 'date' },\n { field: 'dueDate', header: 'Due', type: 'date' },\n { field: 'provider', header: 'Provider', type: 'string' },\n { field: 'requisitionId', header: 'Requisition', type: 'string' },\n { field: 'encounterId', header: 'Encounter', type: 'string' },\n { field: 'blockedBy', header: 'Blocked by', type: 'string' },\n];\n\n/** Fields offered in the grid's Group/Filter control panel. */\nexport const ORDER_CONTROL_FIELDS = ORDER_COLUMNS.filter(\n (c) => c.field !== 'blockedBy'\n).map((c) => ({ field: c.field, displayName: c.header, type: c.type }));\n\n// =============================================================================\n// useOrderRowsUrl\n// =============================================================================\n\n/** Serialize rows into an object-URL `{ typeInfo, data }` source. */\nexport function useOrderRowsUrl(rows: OrderRow[]): string {\n const url = React.useMemo(() => {\n const payload = {\n typeInfo: ORDER_COLUMNS.map(({ field, type }) => ({ field, type })),\n data: rows,\n };\n const blob = new Blob([JSON.stringify(payload)], {\n type: 'application/json',\n });\n return URL.createObjectURL(blob);\n }, [rows]);\n\n React.useEffect(() => () => URL.revokeObjectURL(url), [url]);\n return url;\n}\n\n// =============================================================================\n// Status badge\n// =============================================================================\n\nconst STATUS_VARIANT: Record<\n OrderRowStatus,\n { label: string; variant: 'success' | 'secondary' | 'warning' | 'default' }\n> = {\n completed: { label: 'Completed', variant: 'success' },\n pending: { label: 'Pending', variant: 'secondary' },\n available: { label: 'Available', variant: 'warning' },\n blocked: { label: 'Blocked', variant: 'default' },\n};\n\nexport function OrderStatusBadge({ status }: { status: OrderRowStatus }) {\n const meta = STATUS_VARIANT[status];\n if (!meta) return <>{status}</>;\n return <Badge variant={meta.variant}>{meta.label}</Badge>;\n}\n\n/** `formatCell` for DataVisNitroGrid — renders the status column as a badge. */\nexport function formatOrderCell(\n value: unknown,\n _row: unknown,\n column: { field: string }\n): React.ReactNode {\n if (column.field === 'status' && typeof value === 'string') {\n return <OrderStatusBadge status={value as OrderRowStatus} />;\n }\n return value as React.ReactNode;\n}\n\n// =============================================================================\n// Group presets\n// =============================================================================\n\nexport interface GroupPreset {\n key: string;\n label: string;\n /** Field to group by; undefined = clear grouping */\n field?: keyof OrderRow;\n}\n\nexport const DEFAULT_GROUP_PRESETS: GroupPreset[] = [\n { key: 'none', label: 'Flat' },\n { key: 'reason', label: 'By reason', field: 'reason' },\n { key: 'provider', label: 'By provider', field: 'provider' },\n { key: 'requisition', label: 'By requisition', field: 'requisitionId' },\n { key: 'status', label: 'By status', field: 'status' },\n { key: 'date', label: 'By date', field: 'date' },\n];\n\n/**\n * One-click group-by chips. Must render inside `DataVisNitroSource` — drives\n * the shared view via `setGroup({ fieldNames: [{ field }] })`.\n */\nexport function OrdersGroupPresets({\n presets = DEFAULT_GROUP_PRESETS,\n className,\n}: {\n presets?: GroupPreset[];\n className?: string;\n}) {\n const view = React.useContext(DataVisNitroContext);\n const [active, setActive] = React.useState('none');\n\n const apply = (preset: GroupPreset) => {\n if (!view) return;\n setActive(preset.key);\n if (preset.field) {\n view.setGroup({ fieldNames: [{ field: preset.field }] });\n } else {\n view.clearGroup();\n }\n };\n\n return (\n <div\n data-slot=\"orders-group-presets\"\n role=\"group\"\n aria-label=\"Group orders by\"\n className={cn('flex flex-wrap items-center gap-1.5', className)}\n >\n <span className=\"text-muted-foreground text-xs font-medium\">Group:</span>\n {presets.map((p) => (\n <Button\n key={p.key}\n type=\"button\"\n size=\"sm\"\n variant={active === p.key ? 'primary' : 'outline'}\n aria-pressed={active === p.key}\n onClick={() => apply(p)}\n >\n {p.label}\n </Button>\n ))}\n </div>\n );\n}\n","'use client';\n\n/**\n * NITRO-backed orders grids.\n *\n * - {@link ChartOrdersGrid} — chart-wide: every pending and past **encounter\n * order** across all encounters, plus the actionable due-list orders. Group\n * and filter by reason (program), provider, requisition, status, kind, and\n * date — via the one-click presets or the grid's own control panel.\n * - {@link EncounterOrdersGrid} — the current encounter's orders (its pending\n * unprocessed items are the mass-operation targets) plus the due-list\n * orders available to place this visit.\n *\n * Encounter orders get bundled into **requisitions** — documents routing a\n * batch of orders to a provider/referral. The grids only emit callbacks\n * (`onOrderRows`, `onRequisition`, `onCancel`); document generation is the\n * host application's job.\n *\n * Rendering is `@mieweb/ui/datavis` (`DataVisNitroSource` + `DataVisNitroGrid`)\n * fed through an object-URL source — see ordersGridShared.tsx.\n */\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { DataVisNitroGrid, DataVisNitroSource } from '../DataVisNITRO';\nimport {\n buildChartOrderRows,\n buildEncounterOrderRows,\n type OrderRow,\n type OrderRowsOptions,\n} from './orderRows';\nimport {\n ORDER_COLUMNS,\n ORDER_CONTROL_FIELDS,\n formatOrderCell,\n useOrderRowsUrl,\n OrdersGroupPresets,\n} from './ordersGridShared';\nimport type { PatientHistory } from './history';\nimport type { ProgramsMap } from './evaluate';\n\n// =============================================================================\n// Shared props + inner grid\n// =============================================================================\n\ninterface OrdersGridBaseProps {\n history: PatientHistory;\n /** Program metadata — programs.json contents (`programs` field) */\n programs: ProgramsMap;\n /** Occupational enrollments; quality measures apply to everyone in-gate */\n enrolledKeys?: string[];\n /** Display labels for program keys (falls back to the key) */\n programLabels?: Record<string, string>;\n /** Display labels for order keys (falls back to history labels, then key) */\n orderLabels?: Record<string, string>;\n /** Evaluation clock (defaults to today; inject for deterministic stories) */\n now?: Date;\n /** Place the selected available orders */\n onOrderRows?: (rows: OrderRow[]) => void;\n /** Bundle selected pending unprocessed orders into a requisition */\n onRequisition?: (rows: OrderRow[]) => void;\n /** Cancel selected pending unprocessed orders */\n onCancel?: (rows: OrderRow[]) => void;\n /** Grid height (CSS value) */\n height?: string;\n /** Grid title */\n title?: string;\n className?: string;\n 'data-testid'?: string;\n}\n\nfunction OrdersGridInner({\n rows,\n title,\n height = '480px',\n onOrderRows,\n onRequisition,\n onCancel,\n className,\n 'data-testid': dataTestId,\n}: {\n rows: OrderRow[];\n title: string;\n height?: string;\n onOrderRows?: (rows: OrderRow[]) => void;\n onRequisition?: (rows: OrderRow[]) => void;\n onCancel?: (rows: OrderRow[]) => void;\n className?: string;\n 'data-testid'?: string;\n}) {\n const url = useOrderRowsUrl(rows);\n\n // Mass operations over the native checkbox selection. The palette hands\n // each callback the selected rows' data (OrderRow-shaped after the\n // object-URL round trip); each operation applies only to eligible rows:\n // 'available' can be ordered, pending unprocessed (no requisition yet)\n // can be bundled into a requisition or cancelled.\n const operations = React.useMemo(() => {\n const asOrderRows = (sel: unknown[]) => sel as OrderRow[];\n const ops: {\n label: string;\n callback: (ctx: { rows: unknown[] }) => void;\n }[] = [];\n if (onOrderRows) {\n ops.push({\n label: 'Order',\n callback: ({ rows: sel }) => {\n const eligible = asOrderRows(sel).filter(\n (r) => r.status === 'available'\n );\n if (eligible.length > 0) onOrderRows(eligible);\n },\n });\n }\n if (onRequisition) {\n ops.push({\n label: 'Create requisition',\n callback: ({ rows: sel }) => {\n const eligible = asOrderRows(sel).filter(\n (r) => r.status === 'pending' && !r.requisitionId\n );\n if (eligible.length > 0) onRequisition(eligible);\n },\n });\n }\n if (onCancel) {\n ops.push({\n label: 'Cancel',\n callback: ({ rows: sel }) => {\n const eligible = asOrderRows(sel).filter(\n (r) => r.status === 'pending' && !r.requisitionId\n );\n if (eligible.length > 0) onCancel(eligible);\n },\n });\n }\n return ops;\n }, [onOrderRows, onRequisition, onCancel]);\n\n const columns = React.useMemo(\n () =>\n ORDER_COLUMNS.map(({ field, header }) => ({\n field: field as string,\n header,\n })),\n []\n );\n\n return (\n <div\n data-slot=\"orders-grid\"\n data-testid={dataTestId}\n className={cn('flex flex-col gap-2', className)}\n >\n <DataVisNitroSource type=\"http\" url={url}>\n <OrdersGroupPresets />\n <DataVisNitroGrid\n title={title}\n height={height}\n columns={columns}\n controlFields={ORDER_CONTROL_FIELDS}\n operations={operations}\n // 'checkbox' selection ships in @mieweb/datavis > 1.1.0 (native\n // leading checkbox column + tri-state select-all header); the\n // published typings still say `boolean`, hence the cast.\n features={\n {\n rowSelection: 'checkbox',\n stickyHeaders: true,\n } as unknown as React.ComponentProps<\n typeof DataVisNitroGrid\n >['features']\n }\n formatCell={formatOrderCell}\n />\n </DataVisNitroSource>\n </div>\n );\n}\n\n// =============================================================================\n// ChartOrdersGrid\n// =============================================================================\n\nexport interface ChartOrdersGridProps extends OrdersGridBaseProps {\n /** Include not-yet-placed due-list orders as available/blocked rows */\n includeDue?: boolean;\n}\n\n/** Chart-wide order history across all encounters. */\nexport function ChartOrdersGrid({\n history,\n programs,\n enrolledKeys,\n programLabels,\n orderLabels,\n now,\n includeDue,\n title = 'Orders — chart',\n ...rest\n}: ChartOrdersGridProps) {\n const rows = React.useMemo(() => {\n const opts: OrderRowsOptions = {\n enrolledKeys,\n now,\n programLabels,\n orderLabels,\n includeDue,\n };\n return buildChartOrderRows(history, programs, opts);\n }, [\n history,\n programs,\n enrolledKeys,\n now,\n programLabels,\n orderLabels,\n includeDue,\n ]);\n\n return <OrdersGridInner rows={rows} title={title} {...rest} />;\n}\n\nChartOrdersGrid.displayName = 'ChartOrdersGrid';\n\n// =============================================================================\n// EncounterOrdersGrid\n// =============================================================================\n\nexport interface EncounterOrdersGridProps extends OrdersGridBaseProps {\n /** The current encounter (visit) ID */\n encounterId: string;\n}\n\n/** The current encounter's orders + due-list orders placeable this visit. */\nexport function EncounterOrdersGrid({\n history,\n programs,\n encounterId,\n enrolledKeys,\n programLabels,\n orderLabels,\n now,\n title = 'Encounter orders',\n ...rest\n}: EncounterOrdersGridProps) {\n const rows = React.useMemo(() => {\n const opts: OrderRowsOptions = {\n enrolledKeys,\n now,\n programLabels,\n orderLabels,\n };\n return buildEncounterOrderRows(history, programs, encounterId, opts);\n }, [\n history,\n programs,\n encounterId,\n enrolledKeys,\n now,\n programLabels,\n orderLabels,\n ]);\n\n return <OrdersGridInner rows={rows} title={title} {...rest} />;\n}\n\nEncounterOrdersGrid.displayName = 'EncounterOrdersGrid';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/HealthSurveillance/ordersGridShared.tsx","../src/components/HealthSurveillance/OrdersGrid.tsx"],"names":["React","jsx","Fragment","Badge","ul","jsxs","cn","Button","React2","ml","gl","buildChartOrderRows","buildEncounterOrderRows"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BO,IAAM,aAAA,GAIP;AAAA,EACJ,EAAE,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,EACpD,EAAE,KAAA,EAAO,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS,MAAM,QAAA,EAAS;AAAA,EAClD,EAAE,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,EACpD,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,MAAM,QAAA,EAAS;AAAA,EAChD,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,EAC9C,EAAE,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,KAAA,EAAO,MAAM,MAAA,EAAO;AAAA,EAChD,EAAE,KAAA,EAAO,UAAA,EAAY,MAAA,EAAQ,UAAA,EAAY,MAAM,QAAA,EAAS;AAAA,EACxD,EAAE,KAAA,EAAO,eAAA,EAAiB,MAAA,EAAQ,aAAA,EAAe,MAAM,QAAA,EAAS;AAAA,EAChE,EAAE,KAAA,EAAO,aAAA,EAAe,MAAA,EAAQ,WAAA,EAAa,MAAM,QAAA,EAAS;AAAA,EAC5D,EAAE,KAAA,EAAO,WAAA,EAAa,MAAA,EAAQ,YAAA,EAAc,MAAM,QAAA;AACpD,CAAA;AAGO,IAAM,uBAAuB,aAAA,CAAc,MAAA;AAAA,EAChD,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU;AACrB,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,WAAA,EAAa,CAAA,CAAE,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAE,MAAK,CAAE,CAAA;AAO/D,SAAS,gBAAgB,IAAA,EAA0B;AACxD,EAAA,MAAM,GAAA,GAAYA,yBAAQ,MAAM;AAC9B,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,QAAA,EAAU,aAAA,CAAc,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,IAAA,EAAK,MAAO,EAAE,KAAA,EAAO,IAAA,EAAK,CAAE,CAAA;AAAA,MAClE,IAAA,EAAM;AAAA,KACR;AACA,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,KAAK,SAAA,CAAU,OAAO,CAAC,CAAA,EAAG;AAAA,MAC/C,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,gBAAgB,IAAI,CAAA;AAAA,EACjC,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAMA,gBAAA,CAAA,SAAA,CAAU,MAAM,MAAM,GAAA,CAAI,gBAAgB,GAAG,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAC3D,EAAA,OAAO,GAAA;AACT;AAMA,IAAM,cAAA,GAGF;AAAA,EACF,SAAA,EAAW,EAAE,KAAA,EAAO,WAAA,EAAa,SAAS,SAAA,EAAU;AAAA,EACpD,OAAA,EAAS,EAAE,KAAA,EAAO,SAAA,EAAW,SAAS,WAAA,EAAY;AAAA,EAClD,SAAA,EAAW,EAAE,KAAA,EAAO,WAAA,EAAa,SAAS,SAAA,EAAU;AAAA,EACpD,OAAA,EAAS,EAAE,KAAA,EAAO,SAAA,EAAW,SAAS,SAAA;AACxC,CAAA;AAEO,SAAS,gBAAA,CAAiB,EAAE,MAAA,EAAO,EAA+B;AACvE,EAAA,MAAM,IAAA,GAAO,eAAe,MAAM,CAAA;AAClC,EAAA,IAAI,CAAC,IAAA,EAAM,uBAAOC,cAAA,CAAAC,mBAAA,EAAA,EAAG,QAAA,EAAA,MAAA,EAAO,CAAA;AAC5B,EAAA,sCAAQC,uBAAA,EAAA,EAAM,OAAA,EAAS,IAAA,CAAK,OAAA,EAAU,eAAK,KAAA,EAAM,CAAA;AACnD;AAGO,SAAS,eAAA,CACd,KAAA,EACA,IAAA,EACA,MAAA,EACiB;AACjB,EAAA,IAAI,MAAA,CAAO,KAAA,KAAU,QAAA,IAAY,OAAO,UAAU,QAAA,EAAU;AAC1D,IAAA,uBAAOF,cAAA,CAAC,gBAAA,EAAA,EAAiB,MAAA,EAAQ,KAAA,EAAyB,CAAA;AAAA,EAC5D;AACA,EAAA,OAAO,KAAA;AACT;AAaO,IAAM,qBAAA,GAAuC;AAAA,EAClD,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,EAC7B,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,WAAA,EAAa,OAAO,QAAA,EAAS;AAAA,EACrD,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,aAAA,EAAe,OAAO,UAAA,EAAW;AAAA,EAC3D,EAAE,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,gBAAA,EAAkB,OAAO,eAAA,EAAgB;AAAA,EACtE,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,WAAA,EAAa,OAAO,QAAA,EAAS;AAAA,EACrD,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,OAAO,MAAA;AAC1C,CAAA;AAMO,SAAS,kBAAA,CAAmB;AAAA,EACjC,OAAA,GAAU,qBAAA;AAAA,EACV;AACF,CAAA,EAGG;AACD,EAAA,MAAM,IAAA,GAAaD,4BAAWI,oBAAmB,CAAA;AACjD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAUJ,0BAAS,MAAM,CAAA;AAEjD,EAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,KAAwB;AACrC,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,SAAA,CAAU,OAAO,GAAG,CAAA;AACpB,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,IAAA,CAAK,QAAA,CAAS,EAAE,UAAA,EAAY,CAAC,EAAE,OAAO,MAAA,CAAO,KAAA,EAAO,CAAA,EAAG,CAAA;AAAA,IACzD,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IAClB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEK,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,sBAAA;AAAA,MACV,IAAA,EAAK,OAAA;AAAA,MACL,YAAA,EAAW,iBAAA;AAAA,MACX,SAAA,EAAWC,oBAAA,CAAG,qCAAA,EAAuC,SAAS,CAAA;AAAA,MAE9D,QAAA,EAAA;AAAA,wBAAAL,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAA4C,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,QACjE,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,qBACZA,cAAA;AAAA,UAACM,wBAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAS,MAAA,KAAW,CAAA,CAAE,GAAA,GAAM,SAAA,GAAY,SAAA;AAAA,YACxC,cAAA,EAAc,WAAW,CAAA,CAAE,GAAA;AAAA,YAC3B,OAAA,EAAS,MAAM,KAAA,CAAM,CAAC,CAAA;AAAA,YAErB,QAAA,EAAA,CAAA,CAAE;AAAA,WAAA;AAAA,UAPE,CAAA,CAAE;AAAA,SASV;AAAA;AAAA;AAAA,GACH;AAEJ;ACrGA,SAAS,eAAA,CAAgB;AAAA,EACvB,IAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA,GAAS,OAAA;AAAA,EACT,WAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA,EAAe;AACjB,CAAA,EASG;AACD,EAAA,MAAM,GAAA,GAAM,gBAAgB,IAAI,CAAA;AAOhC,EAAA,MAAM,UAAA,GAAmBC,yBAAQ,MAAM;AACrC,IAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAAmB,GAAA;AACxC,IAAA,MAAM,MAGA,EAAC;AACP,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU,CAAC,EAAE,IAAA,EAAM,KAAI,KAAM;AAC3B,UAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAG,CAAA,CAAE,MAAA;AAAA,YAChC,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW;AAAA,WACtB;AACA,UAAA,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,WAAA,CAAY,QAAQ,CAAA;AAAA,QAC/C;AAAA,OACD,CAAA;AAAA,IACH;AACA,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,KAAA,EAAO,oBAAA;AAAA,QACP,QAAA,EAAU,CAAC,EAAE,IAAA,EAAM,KAAI,KAAM;AAC3B,UAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAG,CAAA,CAAE,MAAA;AAAA,YAChC,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,SAAA,IAAa,CAAC,CAAA,CAAE;AAAA,WACtC;AACA,UAAA,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,aAAA,CAAc,QAAQ,CAAA;AAAA,QACjD;AAAA,OACD,CAAA;AAAA,IACH;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU,CAAC,EAAE,IAAA,EAAM,KAAI,KAAM;AAC3B,UAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAG,CAAA,CAAE,MAAA;AAAA,YAChC,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,SAAA,IAAa,CAAC,CAAA,CAAE;AAAA,WACtC;AACA,UAAA,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,QAAQ,CAAA;AAAA,QAC5C;AAAA,OACD,CAAA;AAAA,IACH;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,WAAA,EAAa,aAAA,EAAe,QAAQ,CAAC,CAAA;AAEzC,EAAA,MAAM,OAAA,GAAgBA,gBAAA,CAAA,OAAA;AAAA,IACpB,MACE,aAAA,CAAc,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,QAAO,MAAO;AAAA,MACxC,KAAA;AAAA,MACA;AAAA,KACF,CAAE,CAAA;AAAA,IACJ;AAAC,GACH;AAEA,EAAA,uBACEP,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,aAAA;AAAA,MACV,aAAA,EAAa,UAAA;AAAA,MACb,SAAA,EAAWK,oBAAA,CAAG,qBAAA,EAAuB,SAAS,CAAA;AAAA,MAE9C,QAAA,kBAAAD,eAAAA,CAACI,oBAAA,EAAA,EAAmB,IAAA,EAAK,QAAO,GAAA,EAC9B,QAAA,EAAA;AAAA,wBAAAR,eAAC,kBAAA,EAAA,EAAmB,CAAA;AAAA,wBACpBA,cAAAA;AAAA,UAACS,oBAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,MAAA;AAAA,YACA,OAAA;AAAA,YACA,aAAA,EAAe,oBAAA;AAAA,YACf,UAAA;AAAA,YAIA,QAAA,EACE;AAAA,cACE,YAAA,EAAc,UAAA;AAAA,cACd,aAAA,EAAe;AAAA,aACjB;AAAA,YAIF,UAAA,EAAY;AAAA;AAAA;AACd,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;AAYO,SAAS,eAAA,CAAgB;AAAA,EAC9B,OAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,GAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA,GAAQ,qBAAA;AAAA,EACR,GAAG;AACL,CAAA,EAAyB;AACvB,EAAA,MAAM,IAAA,GAAaF,yBAAQ,MAAM;AAC/B,IAAA,MAAM,IAAA,GAAyB;AAAA,MAC7B,YAAA;AAAA,MACA,GAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAOG,qCAAA,CAAoB,OAAA,EAAS,QAAA,EAAU,IAAI,CAAA;AAAA,EACpD,CAAA,EAAG;AAAA,IACD,OAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,GAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,uBAAOV,cAAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAY,KAAA,EAAe,GAAG,IAAA,EAAM,CAAA;AAC9D;AAEA,eAAA,CAAgB,WAAA,GAAc,iBAAA;AAYvB,SAAS,mBAAA,CAAoB;AAAA,EAClC,OAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,GAAA;AAAA,EACA,KAAA,GAAQ,kBAAA;AAAA,EACR,GAAG;AACL,CAAA,EAA6B;AAC3B,EAAA,MAAM,IAAA,GAAaO,yBAAQ,MAAM;AAC/B,IAAA,MAAM,IAAA,GAAyB;AAAA,MAC7B,YAAA;AAAA,MACA,GAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAOI,yCAAA,CAAwB,OAAA,EAAS,QAAA,EAAU,WAAA,EAAa,IAAI,CAAA;AAAA,EACrE,CAAA,EAAG;AAAA,IACD,OAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,GAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,uBAAOX,cAAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAY,KAAA,EAAe,GAAG,IAAA,EAAM,CAAA;AAC9D;AAEA,mBAAA,CAAoB,WAAA,GAAc,qBAAA","file":"datavis.cjs","sourcesContent":["'use client';\n\n/**\n * Shared internals for the NITRO-backed orders grids\n * (ChartOrdersGrid / EncounterOrdersGrid).\n *\n * - {@link useOrderRowsUrl} — feeds in-memory {@link OrderRow}s to\n * `DataVisNitroSource` through a short-lived object-URL carrying the\n * `{ typeInfo, data }` payload the engine expects (its `local` source type\n * is not implemented yet; same pattern as SuperChat's NITRO table plugin).\n * - {@link OrderStatusBadge} / {@link formatOrderCell} — status chips in grid\n * cells.\n * - {@link OrdersGroupPresets} — one-click \"group by\" chips driving\n * `view.setGroup()` through {@link DataVisNitroContext}.\n *\n * Row selection and mass operations are native NITRO features:\n * `features.rowSelection: 'checkbox'` + the `operations` palette.\n */\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Badge } from '../Badge/Badge';\nimport { Button } from '../Button';\nimport { DataVisNitroContext } from '../DataVisNITRO';\nimport type { OrderRow, OrderRowStatus } from './orderRows';\n\n// =============================================================================\n// Column + typeInfo metadata\n// =============================================================================\n\n/** Grid columns, in display order, with control-panel display names. */\nexport const ORDER_COLUMNS: {\n field: keyof OrderRow;\n header: string;\n type: 'string' | 'date';\n}[] = [\n { field: 'status', header: 'Status', type: 'string' },\n { field: 'order', header: 'Order', type: 'string' },\n { field: 'reason', header: 'Reason', type: 'string' },\n { field: 'kind', header: 'Kind', type: 'string' },\n { field: 'date', header: 'Date', type: 'date' },\n { field: 'dueDate', header: 'Due', type: 'date' },\n { field: 'provider', header: 'Provider', type: 'string' },\n { field: 'requisitionId', header: 'Requisition', type: 'string' },\n { field: 'encounterId', header: 'Encounter', type: 'string' },\n { field: 'blockedBy', header: 'Blocked by', type: 'string' },\n];\n\n/** Fields offered in the grid's Group/Filter control panel. */\nexport const ORDER_CONTROL_FIELDS = ORDER_COLUMNS.filter(\n (c) => c.field !== 'blockedBy'\n).map((c) => ({ field: c.field, displayName: c.header, type: c.type }));\n\n// =============================================================================\n// useOrderRowsUrl\n// =============================================================================\n\n/** Serialize rows into an object-URL `{ typeInfo, data }` source. */\nexport function useOrderRowsUrl(rows: OrderRow[]): string {\n const url = React.useMemo(() => {\n const payload = {\n typeInfo: ORDER_COLUMNS.map(({ field, type }) => ({ field, type })),\n data: rows,\n };\n const blob = new Blob([JSON.stringify(payload)], {\n type: 'application/json',\n });\n return URL.createObjectURL(blob);\n }, [rows]);\n\n React.useEffect(() => () => URL.revokeObjectURL(url), [url]);\n return url;\n}\n\n// =============================================================================\n// Status badge\n// =============================================================================\n\nconst STATUS_VARIANT: Record<\n OrderRowStatus,\n { label: string; variant: 'success' | 'secondary' | 'warning' | 'default' }\n> = {\n completed: { label: 'Completed', variant: 'success' },\n pending: { label: 'Pending', variant: 'secondary' },\n available: { label: 'Available', variant: 'warning' },\n blocked: { label: 'Blocked', variant: 'default' },\n};\n\nexport function OrderStatusBadge({ status }: { status: OrderRowStatus }) {\n const meta = STATUS_VARIANT[status];\n if (!meta) return <>{status}</>;\n return <Badge variant={meta.variant}>{meta.label}</Badge>;\n}\n\n/** `formatCell` for DataVisNitroGrid — renders the status column as a badge. */\nexport function formatOrderCell(\n value: unknown,\n _row: unknown,\n column: { field: string }\n): React.ReactNode {\n if (column.field === 'status' && typeof value === 'string') {\n return <OrderStatusBadge status={value as OrderRowStatus} />;\n }\n return value as React.ReactNode;\n}\n\n// =============================================================================\n// Group presets\n// =============================================================================\n\nexport interface GroupPreset {\n key: string;\n label: string;\n /** Field to group by; undefined = clear grouping */\n field?: keyof OrderRow;\n}\n\nexport const DEFAULT_GROUP_PRESETS: GroupPreset[] = [\n { key: 'none', label: 'Flat' },\n { key: 'reason', label: 'By reason', field: 'reason' },\n { key: 'provider', label: 'By provider', field: 'provider' },\n { key: 'requisition', label: 'By requisition', field: 'requisitionId' },\n { key: 'status', label: 'By status', field: 'status' },\n { key: 'date', label: 'By date', field: 'date' },\n];\n\n/**\n * One-click group-by chips. Must render inside `DataVisNitroSource` — drives\n * the shared view via `setGroup({ fieldNames: [{ field }] })`.\n */\nexport function OrdersGroupPresets({\n presets = DEFAULT_GROUP_PRESETS,\n className,\n}: {\n presets?: GroupPreset[];\n className?: string;\n}) {\n const view = React.useContext(DataVisNitroContext);\n const [active, setActive] = React.useState('none');\n\n const apply = (preset: GroupPreset) => {\n if (!view) return;\n setActive(preset.key);\n if (preset.field) {\n view.setGroup({ fieldNames: [{ field: preset.field }] });\n } else {\n view.clearGroup();\n }\n };\n\n return (\n <div\n data-slot=\"orders-group-presets\"\n role=\"group\"\n aria-label=\"Group orders by\"\n className={cn('flex flex-wrap items-center gap-1.5', className)}\n >\n <span className=\"text-muted-foreground text-xs font-medium\">Group:</span>\n {presets.map((p) => (\n <Button\n key={p.key}\n type=\"button\"\n size=\"sm\"\n variant={active === p.key ? 'primary' : 'outline'}\n aria-pressed={active === p.key}\n onClick={() => apply(p)}\n >\n {p.label}\n </Button>\n ))}\n </div>\n );\n}\n","'use client';\n\n/**\n * NITRO-backed orders grids.\n *\n * - {@link ChartOrdersGrid} — chart-wide: every pending and past **encounter\n * order** across all encounters, plus the actionable due-list orders. Group\n * and filter by reason (program), provider, requisition, status, kind, and\n * date — via the one-click presets or the grid's own control panel.\n * - {@link EncounterOrdersGrid} — the current encounter's orders (its pending\n * unprocessed items are the mass-operation targets) plus the due-list\n * orders available to place this visit.\n *\n * Encounter orders get bundled into **requisitions** — documents routing a\n * batch of orders to a provider/referral. The grids only emit callbacks\n * (`onOrderRows`, `onRequisition`, `onCancel`); document generation is the\n * host application's job.\n *\n * Rendering is `@mieweb/ui/datavis` (`DataVisNitroSource` + `DataVisNitroGrid`)\n * fed through an object-URL source — see ordersGridShared.tsx.\n */\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { DataVisNitroGrid, DataVisNitroSource } from '../DataVisNITRO';\nimport {\n buildChartOrderRows,\n buildEncounterOrderRows,\n type OrderRow,\n type OrderRowsOptions,\n} from './orderRows';\nimport {\n ORDER_COLUMNS,\n ORDER_CONTROL_FIELDS,\n formatOrderCell,\n useOrderRowsUrl,\n OrdersGroupPresets,\n} from './ordersGridShared';\nimport type { PatientHistory } from './history';\nimport type { ProgramsMap } from './evaluate';\n\n// =============================================================================\n// Shared props + inner grid\n// =============================================================================\n\ninterface OrdersGridBaseProps {\n history: PatientHistory;\n /** Program metadata — programs.json contents (`programs` field) */\n programs: ProgramsMap;\n /** Occupational enrollments; quality measures apply to everyone in-gate */\n enrolledKeys?: string[];\n /** Display labels for program keys (falls back to the key) */\n programLabels?: Record<string, string>;\n /** Display labels for order keys (falls back to history labels, then key) */\n orderLabels?: Record<string, string>;\n /** Evaluation clock (defaults to today; inject for deterministic stories) */\n now?: Date;\n /** Place the selected available orders */\n onOrderRows?: (rows: OrderRow[]) => void;\n /** Bundle selected pending unprocessed orders into a requisition */\n onRequisition?: (rows: OrderRow[]) => void;\n /** Cancel selected pending unprocessed orders */\n onCancel?: (rows: OrderRow[]) => void;\n /** Grid height (CSS value) */\n height?: string;\n /** Grid title */\n title?: string;\n className?: string;\n 'data-testid'?: string;\n}\n\nfunction OrdersGridInner({\n rows,\n title,\n height = '480px',\n onOrderRows,\n onRequisition,\n onCancel,\n className,\n 'data-testid': dataTestId,\n}: {\n rows: OrderRow[];\n title: string;\n height?: string;\n onOrderRows?: (rows: OrderRow[]) => void;\n onRequisition?: (rows: OrderRow[]) => void;\n onCancel?: (rows: OrderRow[]) => void;\n className?: string;\n 'data-testid'?: string;\n}) {\n const url = useOrderRowsUrl(rows);\n\n // Mass operations over the native checkbox selection. The palette hands\n // each callback the selected rows' data (OrderRow-shaped after the\n // object-URL round trip); each operation applies only to eligible rows:\n // 'available' can be ordered, pending unprocessed (no requisition yet)\n // can be bundled into a requisition or cancelled.\n const operations = React.useMemo(() => {\n const asOrderRows = (sel: unknown[]) => sel as OrderRow[];\n const ops: {\n label: string;\n callback: (ctx: { rows: unknown[] }) => void;\n }[] = [];\n if (onOrderRows) {\n ops.push({\n label: 'Order',\n callback: ({ rows: sel }) => {\n const eligible = asOrderRows(sel).filter(\n (r) => r.status === 'available'\n );\n if (eligible.length > 0) onOrderRows(eligible);\n },\n });\n }\n if (onRequisition) {\n ops.push({\n label: 'Create requisition',\n callback: ({ rows: sel }) => {\n const eligible = asOrderRows(sel).filter(\n (r) => r.status === 'pending' && !r.requisitionId\n );\n if (eligible.length > 0) onRequisition(eligible);\n },\n });\n }\n if (onCancel) {\n ops.push({\n label: 'Cancel',\n callback: ({ rows: sel }) => {\n const eligible = asOrderRows(sel).filter(\n (r) => r.status === 'pending' && !r.requisitionId\n );\n if (eligible.length > 0) onCancel(eligible);\n },\n });\n }\n return ops;\n }, [onOrderRows, onRequisition, onCancel]);\n\n const columns = React.useMemo(\n () =>\n ORDER_COLUMNS.map(({ field, header }) => ({\n field: field as string,\n header,\n })),\n []\n );\n\n return (\n <div\n data-slot=\"orders-grid\"\n data-testid={dataTestId}\n className={cn('flex flex-col gap-2', className)}\n >\n <DataVisNitroSource type=\"http\" url={url}>\n <OrdersGroupPresets />\n <DataVisNitroGrid\n title={title}\n height={height}\n columns={columns}\n controlFields={ORDER_CONTROL_FIELDS}\n operations={operations}\n // 'checkbox' selection ships in @mieweb/datavis > 1.1.0 (native\n // leading checkbox column + tri-state select-all header); the\n // published typings still say `boolean`, hence the cast.\n features={\n {\n rowSelection: 'checkbox',\n stickyHeaders: true,\n } as unknown as React.ComponentProps<\n typeof DataVisNitroGrid\n >['features']\n }\n formatCell={formatOrderCell}\n />\n </DataVisNitroSource>\n </div>\n );\n}\n\n// =============================================================================\n// ChartOrdersGrid\n// =============================================================================\n\nexport interface ChartOrdersGridProps extends OrdersGridBaseProps {\n /** Include not-yet-placed due-list orders as available/blocked rows */\n includeDue?: boolean;\n}\n\n/** Chart-wide order history across all encounters. */\nexport function ChartOrdersGrid({\n history,\n programs,\n enrolledKeys,\n programLabels,\n orderLabels,\n now,\n includeDue,\n title = 'Orders — chart',\n ...rest\n}: ChartOrdersGridProps) {\n const rows = React.useMemo(() => {\n const opts: OrderRowsOptions = {\n enrolledKeys,\n now,\n programLabels,\n orderLabels,\n includeDue,\n };\n return buildChartOrderRows(history, programs, opts);\n }, [\n history,\n programs,\n enrolledKeys,\n now,\n programLabels,\n orderLabels,\n includeDue,\n ]);\n\n return <OrdersGridInner rows={rows} title={title} {...rest} />;\n}\n\nChartOrdersGrid.displayName = 'ChartOrdersGrid';\n\n// =============================================================================\n// EncounterOrdersGrid\n// =============================================================================\n\nexport interface EncounterOrdersGridProps extends OrdersGridBaseProps {\n /** The current encounter (visit) ID */\n encounterId: string;\n}\n\n/** The current encounter's orders + due-list orders placeable this visit. */\nexport function EncounterOrdersGrid({\n history,\n programs,\n encounterId,\n enrolledKeys,\n programLabels,\n orderLabels,\n now,\n title = 'Encounter orders',\n ...rest\n}: EncounterOrdersGridProps) {\n const rows = React.useMemo(() => {\n const opts: OrderRowsOptions = {\n enrolledKeys,\n now,\n programLabels,\n orderLabels,\n };\n return buildEncounterOrderRows(history, programs, encounterId, opts);\n }, [\n history,\n programs,\n encounterId,\n enrolledKeys,\n now,\n programLabels,\n orderLabels,\n ]);\n\n return <OrdersGridInner rows={rows} title={title} {...rest} />;\n}\n\nEncounterOrdersGrid.displayName = 'EncounterOrdersGrid';\n"]}
|
package/dist/datavis.js
CHANGED
|
@@ -2,7 +2,8 @@ import { ul, ml, gl } from './chunk-C6CTTLH2.js';
|
|
|
2
2
|
export { ul as DataVisNitroContext, vl as DataVisNitroGraph, gl as DataVisNitroGrid, bl as DataVisNitroLanguageSelector, ml as DataVisNitroSource } from './chunk-C6CTTLH2.js';
|
|
3
3
|
import { buildChartOrderRows, buildEncounterOrderRows } from './chunk-Y5KEFV5O.js';
|
|
4
4
|
import { Badge } from './chunk-BMSG4NBH.js';
|
|
5
|
-
import { Button } from './chunk-
|
|
5
|
+
import { Button } from './chunk-UV4IJNSN.js';
|
|
6
|
+
import './chunk-AXRRBEER.js';
|
|
6
7
|
import { cn } from './chunk-TQONQSJO.js';
|
|
7
8
|
import './chunk-PX6F3LHL.js';
|
|
8
9
|
import * as React from 'react';
|