@panneau/actions 4.1.1 → 5.0.0-alpha.2

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.
Files changed (45) hide show
  1. package/README.md +75 -0
  2. package/dist/ActionRunner.css +84 -0
  3. package/dist/ActionRunner.module.js +34 -0
  4. package/dist/ActionRunner.module.js.map +1 -0
  5. package/dist/ActionRunnerProvider.d.ts +36 -0
  6. package/dist/ActionRunnerProvider.d.ts.map +1 -0
  7. package/dist/ActionRunnerProvider.js +245 -0
  8. package/dist/ActionRunnerProvider.js.map +1 -0
  9. package/dist/ActionRuns.d.ts +12 -0
  10. package/dist/ActionRuns.d.ts.map +1 -0
  11. package/dist/ActionRuns.js +128 -0
  12. package/dist/ActionRuns.js.map +1 -0
  13. package/dist/ParametersDialog.d.ts +19 -0
  14. package/dist/ParametersDialog.d.ts.map +1 -0
  15. package/dist/ParametersDialog.js +119 -0
  16. package/dist/ParametersDialog.js.map +1 -0
  17. package/dist/ResultsDialog.d.ts +10 -0
  18. package/dist/ResultsDialog.d.ts.map +1 -0
  19. package/dist/ResultsDialog.js +130 -0
  20. package/dist/ResultsDialog.js.map +1 -0
  21. package/dist/context.d.ts +10 -0
  22. package/dist/context.d.ts.map +1 -0
  23. package/dist/context.js +7 -0
  24. package/dist/context.js.map +1 -0
  25. package/dist/describe.d.ts +8 -0
  26. package/dist/describe.d.ts.map +1 -0
  27. package/dist/describe.js +32 -0
  28. package/dist/describe.js.map +1 -0
  29. package/dist/index.d.ts +9 -10
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +8 -74
  32. package/dist/messages.d.ts +2 -0
  33. package/dist/messages.d.ts.map +1 -0
  34. package/dist/messages.js +1 -0
  35. package/dist/request.d.ts +15 -0
  36. package/dist/request.d.ts.map +1 -0
  37. package/dist/request.js +50 -0
  38. package/dist/request.js.map +1 -0
  39. package/dist/types.d.ts +62 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/useActionRunner.d.ts +21 -0
  42. package/dist/useActionRunner.d.ts.map +1 -0
  43. package/dist/useActionRunner.js +34 -0
  44. package/dist/useActionRunner.js.map +1 -0
  45. package/package.json +29 -50
@@ -0,0 +1,128 @@
1
+ import ActionRunner_module_default from "./ActionRunner.module.js";
2
+ import { messages } from "./messages.js";
3
+ import { isFinished } from "./request.js";
4
+ import { ActionRunnerContext } from "./context.js";
5
+ import { use } from "react";
6
+ import { Button, IconButton, usePanneauIntl } from "@panneau/ui";
7
+ import { c } from "react/compiler-runtime";
8
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
+ import { X } from "lucide-react";
10
+ import { ProgressBar } from "react-aria-components";
11
+ //#region src/ActionRuns.tsx
12
+ var STATUS_MESSAGES = {
13
+ queued: messages.runQueued,
14
+ running: messages.runRunning,
15
+ succeeded: messages.runSucceeded,
16
+ partial: messages.runPartial,
17
+ failed: messages.runFailed,
18
+ cancelled: messages.runCancelled
19
+ };
20
+ /**
21
+ * The queued runs that the closest `ActionRunnerProvider` follows: their status and progress, a
22
+ * button to cancel those that haven't finished (when the adapter can), and one to dismiss those
23
+ * that have. For a notification area. Renders nothing without runs.
24
+ */
25
+ function ActionRuns(t0) {
26
+ const $ = c(13);
27
+ const { "aria-label": ariaLabel, className } = t0;
28
+ const intl = usePanneauIntl();
29
+ const context = use(ActionRunnerContext);
30
+ if (context === null || context.runs.length === 0) return null;
31
+ const canCancel = context.adapter.cancelActionRun !== void 0;
32
+ let t1;
33
+ if ($[0] !== ariaLabel || $[1] !== intl) {
34
+ t1 = ariaLabel ?? intl.formatMessage(messages.runs);
35
+ $[0] = ariaLabel;
36
+ $[1] = intl;
37
+ $[2] = t1;
38
+ } else t1 = $[2];
39
+ let t2;
40
+ if ($[3] !== className) {
41
+ t2 = [ActionRunner_module_default.runs, className].filter(Boolean);
42
+ $[3] = className;
43
+ $[4] = t2;
44
+ } else t2 = $[4];
45
+ const t3 = t2.join(" ");
46
+ let t4;
47
+ if ($[5] !== canCancel || $[6] !== context || $[7] !== intl) {
48
+ t4 = context.runs.map((t5) => {
49
+ const { run, target } = t5;
50
+ const label = target.action.label;
51
+ const finished = isFinished(run.status);
52
+ const status = intl.formatMessage(STATUS_MESSAGES[run.status]);
53
+ return /* @__PURE__ */ jsxs("li", {
54
+ className: ActionRunner_module_default.run,
55
+ children: [
56
+ /* @__PURE__ */ jsx("span", {
57
+ className: ActionRunner_module_default.runLabel,
58
+ children: label
59
+ }),
60
+ finished ? /* @__PURE__ */ jsx(IconButton, {
61
+ icon: X,
62
+ size: "sm",
63
+ label: intl.formatMessage(messages.dismissRun, { action: label }),
64
+ onPress: () => context.dismissRun(run.id)
65
+ }) : canCancel ? /* @__PURE__ */ jsx(Button, {
66
+ size: "sm",
67
+ variant: "ghost",
68
+ "aria-label": intl.formatMessage(messages.cancelRun, { action: label }),
69
+ onPress: () => {
70
+ context.cancelRun(run.id).catch(_temp);
71
+ },
72
+ children: intl.formatMessage(messages.cancel)
73
+ }) : /* @__PURE__ */ jsx("span", {}),
74
+ finished ? /* @__PURE__ */ jsx("span", {
75
+ className: ActionRunner_module_default.runStatus,
76
+ children: status
77
+ }) : /* @__PURE__ */ jsx(ProgressBar, {
78
+ "aria-label": label,
79
+ className: ActionRunner_module_default.progress,
80
+ value: run.progress,
81
+ maxValue: run.total ?? void 0,
82
+ isIndeterminate: run.total === null || run.total === 0,
83
+ valueLabel: run.total !== null && run.total > 0 ? intl.formatMessage(messages.progress, {
84
+ progress: run.progress,
85
+ total: run.total
86
+ }) : status,
87
+ children: _temp2
88
+ })
89
+ ]
90
+ }, run.id);
91
+ });
92
+ $[5] = canCancel;
93
+ $[6] = context;
94
+ $[7] = intl;
95
+ $[8] = t4;
96
+ } else t4 = $[8];
97
+ let t5;
98
+ if ($[9] !== t1 || $[10] !== t3 || $[11] !== t4) {
99
+ t5 = /* @__PURE__ */ jsx("ul", {
100
+ "aria-label": t1,
101
+ className: t3,
102
+ children: t4
103
+ });
104
+ $[9] = t1;
105
+ $[10] = t3;
106
+ $[11] = t4;
107
+ $[12] = t5;
108
+ } else t5 = $[12];
109
+ return t5;
110
+ }
111
+ function _temp2(t0) {
112
+ const { percentage, valueText } = t0;
113
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
114
+ className: ActionRunner_module_default.runStatus,
115
+ children: valueText
116
+ }), /* @__PURE__ */ jsx("span", {
117
+ className: ActionRunner_module_default.track,
118
+ children: /* @__PURE__ */ jsx("span", {
119
+ className: ActionRunner_module_default.fill,
120
+ style: { width: `${percentage ?? 100}%` }
121
+ })
122
+ })] });
123
+ }
124
+ function _temp() {}
125
+ //#endregion
126
+ export { ActionRuns };
127
+
128
+ //# sourceMappingURL=ActionRuns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActionRuns.js","names":["label","X","status","valueText","_c","styles","_Fragment"],"sources":["../src/ActionRuns.tsx"],"sourcesContent":["import { X } from 'lucide-react';\nimport { use } from 'react';\nimport { ProgressBar } from 'react-aria-components';\n\nimport type { ActionRun } from '@panneau/protocol';\nimport { Button, IconButton, usePanneauIntl } from '@panneau/ui';\n\nimport styles from './ActionRunner.module.css';\nimport { ActionRunnerContext } from './context';\nimport { messages } from './messages';\nimport { isFinished } from './request';\n\nconst STATUS_MESSAGES = {\n queued: messages.runQueued,\n running: messages.runRunning,\n succeeded: messages.runSucceeded,\n partial: messages.runPartial,\n failed: messages.runFailed,\n cancelled: messages.runCancelled,\n} satisfies Record<ActionRun['status'], unknown>;\n\nexport interface ActionRunsProps {\n /** Accessible name of the list. Defaults to \"Actions in progress\". */\n 'aria-label'?: string;\n className?: string;\n}\n\n/**\n * The queued runs that the closest `ActionRunnerProvider` follows: their status and progress, a\n * button to cancel those that haven't finished (when the adapter can), and one to dismiss those\n * that have. For a notification area. Renders nothing without runs.\n */\nexport function ActionRuns({ 'aria-label': ariaLabel, className }: ActionRunsProps) {\n const intl = usePanneauIntl();\n const context = use(ActionRunnerContext);\n if (context === null || context.runs.length === 0) {\n return null;\n }\n const canCancel = context.adapter.cancelActionRun !== undefined;\n return (\n <ul\n aria-label={ariaLabel ?? intl.formatMessage(messages.runs)}\n className={[styles.runs, className].filter(Boolean).join(' ')}\n >\n {context.runs.map(({ run, target }) => {\n const label = target.action.label;\n const finished = isFinished(run.status);\n const status = intl.formatMessage(STATUS_MESSAGES[run.status]);\n return (\n <li key={run.id} className={styles.run}>\n <span className={styles.runLabel}>{label}</span>\n {finished ? (\n <IconButton\n icon={X}\n size=\"sm\"\n label={intl.formatMessage(messages.dismissRun, { action: label })}\n onPress={() => context.dismissRun(run.id)}\n />\n ) : canCancel ? (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label={intl.formatMessage(messages.cancelRun, {\n action: label,\n })}\n onPress={() => {\n context.cancelRun(run.id).catch(() => undefined);\n }}\n >\n {intl.formatMessage(messages.cancel)}\n </Button>\n ) : (\n <span />\n )}\n {finished ? (\n <span className={styles.runStatus}>{status}</span>\n ) : (\n <ProgressBar\n aria-label={label}\n className={styles.progress}\n value={run.progress}\n maxValue={run.total ?? undefined}\n isIndeterminate={run.total === null || run.total === 0}\n valueLabel={\n run.total !== null && run.total > 0\n ? intl.formatMessage(messages.progress, {\n progress: run.progress,\n total: run.total,\n })\n : status\n }\n >\n {({ percentage, valueText }) => (\n <>\n <span className={styles.runStatus}>{valueText}</span>\n <span className={styles.track}>\n <span\n className={styles.fill}\n style={{ width: `${percentage ?? 100}%` }}\n />\n </span>\n </>\n )}\n </ProgressBar>\n )}\n </li>\n );\n })}\n </ul>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Action } from '@panneau/protocol';
2
+ import type { ActionOutcome } from './types';
3
+ export interface ParametersDialogProps {
4
+ action: Action;
5
+ /** How many items the action applies to, for the confirm label. */
6
+ count?: number | undefined;
7
+ locales?: readonly string[] | undefined;
8
+ /** Runs the action with the values. A validation error (`422`) shows on the fields. */
9
+ onSubmit: (values: Record<string, unknown>) => Promise<ActionOutcome>;
10
+ onDone: (outcome: ActionOutcome) => void;
11
+ onCancel: () => void;
12
+ }
13
+ /**
14
+ * The parameters of an action (`fields`, in its `layout`), in a dialog, with the client validation
15
+ * of forms. The action runs when the form is submitted; errors of the action endpoint (`422`, keyed
16
+ * by paths inside `values`) show on the fields, and other errors in the form.
17
+ */
18
+ export declare function ParametersDialog({ action, locales, onSubmit, onDone, onCancel, }: ParametersDialogProps): import("react").JSX.Element;
19
+ //# sourceMappingURL=ParametersDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParametersDialog.d.ts","sourceRoot":"","sources":["../src/ParametersDialog.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAKhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,MAAM,WAAW,qBAAqB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,uFAAuF;IACvF,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IACtE,MAAM,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IACzC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAC7B,MAAM,EACN,OAAO,EACP,QAAQ,EACR,MAAM,EACN,QAAQ,GACX,EAAE,qBAAqB,+BAoCvB"}
@@ -0,0 +1,119 @@
1
+ import ActionRunner_module_default from "./ActionRunner.module.js";
2
+ import { messages } from "./messages.js";
3
+ import { Button, Dialog, usePanneauIntl } from "@panneau/ui";
4
+ import { c } from "react/compiler-runtime";
5
+ import { Form } from "@panneau/forms";
6
+ import { jsx } from "react/jsx-runtime";
7
+ //#region src/ParametersDialog.tsx
8
+ /**
9
+ * The parameters of an action (`fields`, in its `layout`), in a dialog, with the client validation
10
+ * of forms. The action runs when the form is submitted; errors of the action endpoint (`422`, keyed
11
+ * by paths inside `values`) show on the fields, and other errors in the form.
12
+ */
13
+ function ParametersDialog(t0) {
14
+ const $ = c(30);
15
+ const { action, locales, onSubmit, onDone, onCancel } = t0;
16
+ const intl = usePanneauIntl();
17
+ const confirmLabel = typeof action.confirm === "object" && action.confirm.confirmLabel !== void 0 ? action.confirm.confirmLabel : action.label;
18
+ let t1;
19
+ if ($[0] !== onCancel) {
20
+ t1 = (open) => {
21
+ if (!open) onCancel();
22
+ };
23
+ $[0] = onCancel;
24
+ $[1] = t1;
25
+ } else t1 = $[1];
26
+ const t2 = action.label;
27
+ let t3;
28
+ if ($[2] !== action.fields) {
29
+ t3 = action.fields ?? [];
30
+ $[2] = action.fields;
31
+ $[3] = t3;
32
+ } else t3 = $[3];
33
+ let t4;
34
+ if ($[4] !== action.layout) {
35
+ t4 = action.layout ?? [];
36
+ $[4] = action.layout;
37
+ $[5] = t4;
38
+ } else t4 = $[5];
39
+ let t5;
40
+ if ($[6] !== locales) {
41
+ t5 = locales !== void 0 ? { locales } : {};
42
+ $[6] = locales;
43
+ $[7] = t5;
44
+ } else t5 = $[7];
45
+ const t6 = action.label;
46
+ let t7;
47
+ if ($[8] !== intl) {
48
+ t7 = intl.formatMessage(messages.cancel);
49
+ $[8] = intl;
50
+ $[9] = t7;
51
+ } else t7 = $[9];
52
+ let t8;
53
+ if ($[10] !== onCancel || $[11] !== t7) {
54
+ t8 = /* @__PURE__ */ jsx(Button, {
55
+ variant: "secondary",
56
+ onPress: onCancel,
57
+ children: t7
58
+ });
59
+ $[10] = onCancel;
60
+ $[11] = t7;
61
+ $[12] = t8;
62
+ } else t8 = $[12];
63
+ let t9;
64
+ if ($[13] !== onSubmit) {
65
+ t9 = (values) => onSubmit(values);
66
+ $[13] = onSubmit;
67
+ $[14] = t9;
68
+ } else t9 = $[14];
69
+ let t10;
70
+ if ($[15] !== onDone) {
71
+ t10 = (outcome) => onDone(outcome);
72
+ $[15] = onDone;
73
+ $[16] = t10;
74
+ } else t10 = $[16];
75
+ let t11;
76
+ if ($[17] !== action.label || $[18] !== confirmLabel || $[19] !== t10 || $[20] !== t3 || $[21] !== t4 || $[22] !== t5 || $[23] !== t8 || $[24] !== t9) {
77
+ t11 = /* @__PURE__ */ jsx(Form, {
78
+ fields: t3,
79
+ layout: t4,
80
+ ...t5,
81
+ "aria-label": t6,
82
+ submitLabel: confirmLabel,
83
+ actions: t8,
84
+ onSubmit: t9,
85
+ onSubmitted: t10,
86
+ guardUnsavedChanges: false,
87
+ showSavedToast: false,
88
+ className: ActionRunner_module_default.parameters
89
+ });
90
+ $[17] = action.label;
91
+ $[18] = confirmLabel;
92
+ $[19] = t10;
93
+ $[20] = t3;
94
+ $[21] = t4;
95
+ $[22] = t5;
96
+ $[23] = t8;
97
+ $[24] = t9;
98
+ $[25] = t11;
99
+ } else t11 = $[25];
100
+ let t12;
101
+ if ($[26] !== action.label || $[27] !== t1 || $[28] !== t11) {
102
+ t12 = /* @__PURE__ */ jsx(Dialog, {
103
+ isOpen: true,
104
+ onOpenChange: t1,
105
+ title: t2,
106
+ size: "md",
107
+ children: t11
108
+ });
109
+ $[26] = action.label;
110
+ $[27] = t1;
111
+ $[28] = t11;
112
+ $[29] = t12;
113
+ } else t12 = $[29];
114
+ return t12;
115
+ }
116
+ //#endregion
117
+ export { ParametersDialog };
118
+
119
+ //# sourceMappingURL=ParametersDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParametersDialog.js","names":["onCancel","confirmLabel","_c","styles"],"sources":["../src/ParametersDialog.tsx"],"sourcesContent":["import { Form } from '@panneau/forms';\nimport type { Action } from '@panneau/protocol';\nimport { Button, Dialog, usePanneauIntl } from '@panneau/ui';\n\nimport styles from './ActionRunner.module.css';\nimport { messages } from './messages';\nimport type { ActionOutcome } from './types';\n\nexport interface ParametersDialogProps {\n action: Action;\n /** How many items the action applies to, for the confirm label. */\n count?: number | undefined;\n locales?: readonly string[] | undefined;\n /** Runs the action with the values. A validation error (`422`) shows on the fields. */\n onSubmit: (values: Record<string, unknown>) => Promise<ActionOutcome>;\n onDone: (outcome: ActionOutcome) => void;\n onCancel: () => void;\n}\n\n/**\n * The parameters of an action (`fields`, in its `layout`), in a dialog, with the client validation\n * of forms. The action runs when the form is submitted; errors of the action endpoint (`422`, keyed\n * by paths inside `values`) show on the fields, and other errors in the form.\n */\nexport function ParametersDialog({\n action,\n locales,\n onSubmit,\n onDone,\n onCancel,\n}: ParametersDialogProps) {\n const intl = usePanneauIntl();\n const confirmLabel =\n typeof action.confirm === 'object' && action.confirm.confirmLabel !== undefined\n ? action.confirm.confirmLabel\n : action.label;\n return (\n <Dialog\n isOpen\n onOpenChange={(open) => {\n if (!open) {\n onCancel();\n }\n }}\n title={action.label}\n size=\"md\"\n >\n <Form\n fields={action.fields ?? []}\n layout={action.layout ?? []}\n {...(locales !== undefined ? { locales } : {})}\n aria-label={action.label}\n submitLabel={confirmLabel}\n actions={\n <Button variant=\"secondary\" onPress={onCancel}>\n {intl.formatMessage(messages.cancel)}\n </Button>\n }\n onSubmit={(values) => onSubmit(values)}\n onSubmitted={(outcome) => onDone(outcome as ActionOutcome)}\n guardUnsavedChanges={false}\n showSavedToast={false}\n className={styles.parameters}\n />\n </Dialog>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAwBA,SAAO,iBAAA,IAAA;CAAA,MAAA,IAAAE,EAAA,EAAA;CAA0B,MAAA,EAAA,QAAA,SAAA,UAAA,QAAA,aAAA;CAO7B,MAAA,OAAa,eAAe;CAC5B,MAAA,eACI,OAAO,OAAM,YAAa,YAAY,OAAM,QAAQ,iBAAkB,KAAA,IAChE,OAAM,QAAQ,eACd,OAAM;CAAO,IAAA;CAAA,IAAA,EAAA,OAAA,UAAA;EAID,MAAA,SAAA;GACV,IAAI,CAAC,MACD,SAAS;EACZ;EACJ,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CACM,MAAA,KAAA,OAAM;CAAM,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA,QAAA;EAIP,KAAA,OAAM,UAAN,CAAA;EAAmB,EAAA,KAAA,OAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA,QAAA;EACnB,KAAA,OAAM,UAAN,CAAA;EAAmB,EAAA,KAAA,OAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,SAAA;EACtB,KAAA,YAAY,KAAA,IAAZ,EAAA,QAAuC,IAAvC,CAAuC;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CACjC,MAAA,KAAA,OAAM;CAAM,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA;EAIf,KAAA,KAAI,cAAe,SAAQ,MAAO;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,YAAA,EAAA,QAAA,IAAA;EADxC,KAAA,oBAAC,QAAD;GAAgB,SAAA;GAAqBF,SAAA;GAChC,UAAA;EADE,CAAA;EAEE,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,UAAA;EAEH,MAAA,WAAY,SAAS,MAAM;EAAC,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,QAAA;EACzB,OAAA,YAAa,OAAO,OAAwB;EAAC,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,MAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,OAAA,SAAA,EAAA,QAAA,gBAAA,EAAA,QAAA,OAAA,EAAA,QAAA,MAAA,EAAA,QAAA,MAAA,EAAA,QAAA,MAAA,EAAA,QAAA,MAAA,EAAA,QAAA,IAAA;EAZ9D,MAAA,oBAAC,MAAD;GACY,QAAA;GACA,QAAA;GAAmB,GACtB;GACO,cAAA;GACCC,aAAA;GAET,SAAA;GAIM,UAAA;GACG,aAAA;GACQ,qBAAA;GACL,gBAAA;GACL,WAAAE,4BAAM;EAAW,CAAA;EAC9B,EAAA,MAAA,OAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,MAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,OAAA,SAAA,EAAA,QAAA,MAAA,EAAA,QAAA,KAAA;EA1BN,MAAA,oBAAC,QAAD;GACI,QAAA;GACc,cAAA;GAKP,OAAA;GACF,MAAA;GAEL,UAAA;EAVG,CAAA;EA2BE,EAAA,MAAA,OAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,MAAA,EAAA;CAAA,OA3BT;AA2BS"}
@@ -0,0 +1,10 @@
1
+ import type { ActionResult } from '@panneau/protocol';
2
+ export interface ResultsDialogProps {
3
+ /** The label of the action. */
4
+ label: string;
5
+ result: ActionResult;
6
+ onClose: () => void;
7
+ }
8
+ /** The items of a result that didn't succeed, with why: failed with a message, or skipped. */
9
+ export declare function ResultsDialog({ label, result, onClose }: ResultsDialogProps): import("react").JSX.Element;
10
+ //# sourceMappingURL=ResultsDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResultsDialog.d.ts","sourceRoot":"","sources":["../src/ResultsDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAOtD,MAAM,WAAW,kBAAkB;IAC/B,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,8FAA8F;AAC9F,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,+BA2C3E"}
@@ -0,0 +1,130 @@
1
+ import ActionRunner_module_default from "./ActionRunner.module.js";
2
+ import { messages } from "./messages.js";
3
+ import { describeItemResult, describeResult } from "./describe.js";
4
+ import { Badge, Button, Dialog, usePanneauIntl } from "@panneau/ui";
5
+ import { c } from "react/compiler-runtime";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ //#region src/ResultsDialog.tsx
8
+ /** The items of a result that didn't succeed, with why: failed with a message, or skipped. */
9
+ function ResultsDialog(t0) {
10
+ const $ = c(32);
11
+ const { label, result, onClose } = t0;
12
+ const intl = usePanneauIntl();
13
+ let t1;
14
+ if ($[0] !== intl || $[1] !== label || $[2] !== result) {
15
+ t1 = describeResult(result, label, intl);
16
+ $[0] = intl;
17
+ $[1] = label;
18
+ $[2] = result;
19
+ $[3] = t1;
20
+ } else t1 = $[3];
21
+ const summary = t1;
22
+ let t2;
23
+ if ($[4] !== onClose) {
24
+ t2 = (open) => {
25
+ if (!open) onClose();
26
+ };
27
+ $[4] = onClose;
28
+ $[5] = t2;
29
+ } else t2 = $[5];
30
+ let t3;
31
+ if ($[6] !== intl || $[7] !== label) {
32
+ t3 = intl.formatMessage(messages.resultsTitle, { action: label });
33
+ $[6] = intl;
34
+ $[7] = label;
35
+ $[8] = t3;
36
+ } else t3 = $[8];
37
+ let t4;
38
+ if ($[9] !== intl) {
39
+ t4 = intl.formatMessage(messages.close);
40
+ $[9] = intl;
41
+ $[10] = t4;
42
+ } else t4 = $[10];
43
+ let t5;
44
+ if ($[11] !== onClose || $[12] !== t4) {
45
+ t5 = /* @__PURE__ */ jsx(Button, {
46
+ variant: "secondary",
47
+ onPress: onClose,
48
+ children: t4
49
+ });
50
+ $[11] = onClose;
51
+ $[12] = t4;
52
+ $[13] = t5;
53
+ } else t5 = $[13];
54
+ const t6 = summary.description !== void 0 ? ` ${summary.description}` : null;
55
+ let t7;
56
+ if ($[14] !== summary.title || $[15] !== t6) {
57
+ t7 = /* @__PURE__ */ jsxs("p", {
58
+ className: ActionRunner_module_default.summary,
59
+ children: [summary.title, t6]
60
+ });
61
+ $[14] = summary.title;
62
+ $[15] = t6;
63
+ $[16] = t7;
64
+ } else t7 = $[16];
65
+ let t8;
66
+ if ($[17] !== result.results) {
67
+ t8 = result.results ?? [];
68
+ $[17] = result.results;
69
+ $[18] = t8;
70
+ } else t8 = $[18];
71
+ let t9;
72
+ if ($[19] !== intl || $[20] !== t8) {
73
+ let t10;
74
+ if ($[22] !== intl) {
75
+ t10 = (entry) => /* @__PURE__ */ jsxs("li", {
76
+ className: ActionRunner_module_default.result,
77
+ children: [
78
+ /* @__PURE__ */ jsx("span", {
79
+ className: ActionRunner_module_default.resultItem,
80
+ children: intl.formatMessage(messages.item, { id: entry.id })
81
+ }),
82
+ /* @__PURE__ */ jsx(Badge, {
83
+ tone: entry.status === "failed" ? "danger" : "neutral",
84
+ children: intl.formatMessage(entry.status === "failed" ? messages.statusFailed : messages.statusSkipped)
85
+ }),
86
+ /* @__PURE__ */ jsx("span", {
87
+ className: ActionRunner_module_default.resultReason,
88
+ children: describeItemResult(entry, intl)
89
+ })
90
+ ]
91
+ }, entry.id);
92
+ $[22] = intl;
93
+ $[23] = t10;
94
+ } else t10 = $[23];
95
+ t9 = t8.map(t10);
96
+ $[19] = intl;
97
+ $[20] = t8;
98
+ $[21] = t9;
99
+ } else t9 = $[21];
100
+ let t10;
101
+ if ($[24] !== t9) {
102
+ t10 = /* @__PURE__ */ jsx("ul", {
103
+ className: ActionRunner_module_default.results,
104
+ children: t9
105
+ });
106
+ $[24] = t9;
107
+ $[25] = t10;
108
+ } else t10 = $[25];
109
+ let t11;
110
+ if ($[26] !== t10 || $[27] !== t2 || $[28] !== t3 || $[29] !== t5 || $[30] !== t7) {
111
+ t11 = /* @__PURE__ */ jsxs(Dialog, {
112
+ isOpen: true,
113
+ onOpenChange: t2,
114
+ title: t3,
115
+ footer: t5,
116
+ children: [t7, t10]
117
+ });
118
+ $[26] = t10;
119
+ $[27] = t2;
120
+ $[28] = t3;
121
+ $[29] = t5;
122
+ $[30] = t7;
123
+ $[31] = t11;
124
+ } else t11 = $[31];
125
+ return t11;
126
+ }
127
+ //#endregion
128
+ export { ResultsDialog };
129
+
130
+ //# sourceMappingURL=ResultsDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResultsDialog.js","names":["onClose","_c","styles"],"sources":["../src/ResultsDialog.tsx"],"sourcesContent":["import type { ActionResult } from '@panneau/protocol';\nimport { Badge, Button, Dialog, usePanneauIntl } from '@panneau/ui';\n\nimport styles from './ActionRunner.module.css';\nimport { describeItemResult, describeResult } from './describe';\nimport { messages } from './messages';\n\nexport interface ResultsDialogProps {\n /** The label of the action. */\n label: string;\n result: ActionResult;\n onClose: () => void;\n}\n\n/** The items of a result that didn't succeed, with why: failed with a message, or skipped. */\nexport function ResultsDialog({ label, result, onClose }: ResultsDialogProps) {\n const intl = usePanneauIntl();\n const summary = describeResult(result, label, intl);\n return (\n <Dialog\n isOpen\n onOpenChange={(open) => {\n if (!open) {\n onClose();\n }\n }}\n title={intl.formatMessage(messages.resultsTitle, { action: label })}\n footer={\n <Button variant=\"secondary\" onPress={onClose}>\n {intl.formatMessage(messages.close)}\n </Button>\n }\n >\n <p className={styles.summary}>\n {summary.title}\n {summary.description !== undefined ? ` ${summary.description}` : null}\n </p>\n <ul className={styles.results}>\n {(result.results ?? []).map((entry) => (\n <li key={entry.id} className={styles.result}>\n <span className={styles.resultItem}>\n {intl.formatMessage(messages.item, { id: entry.id })}\n </span>\n <Badge tone={entry.status === 'failed' ? 'danger' : 'neutral'}>\n {intl.formatMessage(\n entry.status === 'failed'\n ? messages.statusFailed\n : messages.statusSkipped,\n )}\n </Badge>\n <span className={styles.resultReason}>\n {describeItemResult(entry, intl)}\n </span>\n </li>\n ))}\n </ul>\n </Dialog>\n );\n}\n"],"mappings":";;;;;;;;AAeA,SAAO,cAAA,IAAA;CAAA,MAAA,IAAAC,EAAA,EAAA;CAAuB,MAAA,EAAA,OAAA,QAAA,YAAA;CAC1B,MAAA,OAAa,eAAe;CAAE,IAAA;CAAA,IAAA,EAAA,OAAA,QAAA,EAAA,OAAA,SAAA,EAAA,OAAA,QAAA;EACd,KAAA,eAAe,QAAQ,OAAO,IAAI;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAnD,MAAA,UAAgB;CAAoC,IAAA;CAAA,IAAA,EAAA,OAAA,SAAA;EAI9B,MAAA,SAAA;GACV,IAAI,CAAC,MACD,QAAQ;EACX;EACJ,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,QAAA,EAAA,OAAA,OAAA;EACM,KAAA,KAAI,cAAe,SAAQ,cAAe,EAAA,QAAU,MAAM,CAAC;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA;EAG1D,KAAA,KAAI,cAAe,SAAQ,KAAM;EAAC,EAAA,KAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,WAAA,EAAA,QAAA,IAAA;EADvC,KAAA,oBAAC,QAAD;GAAgB,SAAA;GAAqBD,SAAA;GAChC,UAAA;EADE,CAAA;EAEE,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAKR,MAAA,KAAA,QAAO,gBAAiB,KAAA,IAAxB,IAAwC,QAAO,gBAA/C;CAAoE,IAAA;CAAA,IAAA,EAAA,QAAA,QAAA,SAAA,EAAA,QAAA,IAAA;EAFzE,KAAA,qBAAA,KAAA;GAAc,WAAAE,4BAAM;GAApB,UAAA,CACK,QAAO,OACP,EACD;;EAAA,EAAA,MAAA,QAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,OAAA,SAAA;EAEE,KAAA,OAAM,WAAN,CAAA;EAAoB,EAAA,MAAA,OAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,QAAA,EAAA,QAAA,IAAA;EAAA,IAAA;EAAA,IAAA,EAAA,QAAA,MAAA;GAAM,OAAA,UACxB,qBAAA,MAAA;IAA8B,WAAAA,4BAAM;IAApC,UAAA;KACI,oBAAA,QAAA;MAAiB,WAAAA,4BAAM;MAClB,UAAA,KAAI,cAAe,SAAQ,MAAO,EAAA,IAAM,MAAK,GAAI,CAAC;KAChD,CAAA;KACP,oBAAC,OAAD;MAAa,MAAA,MAAK,WAAY,WAAjB,WAAA;MACR,UAAA,KAAI,cACD,MAAK,WAAY,WACX,SAAQ,eACR,SAAQ,aAClB;KALE,CAAA;KAON,oBAAA,QAAA;MAAiB,WAAAA,4BAAM;MAClB,UAAA,mBAAmB,OAAO,IAAI;KAC5B,CAAA;IACN;GAdI,GAAA,MAAK,EAcT;GACR,EAAA,MAAA;GAAA,EAAA,MAAA;EAAA,OAAA,MAAA,EAAA;EAhBA,KAAC,GAAoB,IAAM,GAgB3B;EAAC,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,IAAA;EAjBN,MAAA,oBAAA,MAAA;GAAe,WAAAA,4BAAM;GAChB,UAAA;EAiBA,CAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,MAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,OAAA,EAAA,QAAA,MAAA,EAAA,QAAA,MAAA,EAAA,QAAA,MAAA,EAAA,QAAA,IAAA;EApCT,MAAA,qBAAC,QAAD;GACI,QAAA;GACc,cAAA;GAKP,OAAA;GAEH,QAAA;GATR,UAAA,CAcI,IAIA,GAlBG;;EAqCE,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,MAAA,EAAA;CAAA,OArCT;AAqCS"}
@@ -0,0 +1,10 @@
1
+ import type { ActionAdapter, ActionOutcome, ActionTarget, FollowedRun } from './types';
2
+ export interface ActionRunnerContextValue {
3
+ adapter: ActionAdapter;
4
+ run: (resource: string, target: ActionTarget) => Promise<ActionOutcome | false>;
5
+ runs: readonly FollowedRun[];
6
+ cancelRun: (id: string) => Promise<void>;
7
+ dismissRun: (id: string) => void;
8
+ }
9
+ export declare const ActionRunnerContext: import("react").Context<ActionRunnerContextValue | null>;
10
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEvF,MAAM,WAAW,wBAAwB;IACrC,OAAO,EAAE,aAAa,CAAC;IACvB,GAAG,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,aAAa,GAAG,KAAK,CAAC,CAAC;IAChF,IAAI,EAAE,SAAS,WAAW,EAAE,CAAC;IAC7B,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,eAAO,MAAM,mBAAmB,0DAAuD,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { createContext } from "react";
2
+ //#region src/context.ts
3
+ var ActionRunnerContext = createContext(null);
4
+ //#endregion
5
+ export { ActionRunnerContext };
6
+
7
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","names":[],"sources":["../src/context.ts"],"sourcesContent":["import { createContext } from 'react';\n\nimport type { ActionAdapter, ActionOutcome, ActionTarget, FollowedRun } from './types';\n\nexport interface ActionRunnerContextValue {\n adapter: ActionAdapter;\n run: (resource: string, target: ActionTarget) => Promise<ActionOutcome | false>;\n runs: readonly FollowedRun[];\n cancelRun: (id: string) => Promise<void>;\n dismissRun: (id: string) => void;\n}\n\nexport const ActionRunnerContext = createContext<ActionRunnerContextValue | null>(null);\n"],"mappings":";;AAYA,IAAa,sBAAsB,cAA+C,IAAI"}
@@ -0,0 +1,8 @@
1
+ import type { IntlShape } from 'react-intl';
2
+ import type { ActionItemResult, ActionResult } from '@panneau/protocol';
3
+ import type { ToastContent } from '@panneau/ui';
4
+ /** The toast of a result: its message, or "done", the counts, and a tone that says how it went. */
5
+ export declare function describeResult(result: ActionResult, actionLabel: string, intl: IntlShape): Omit<ToastContent, 'action'>;
6
+ /** Why an item didn't succeed: its message, or its reason (`forbidden`, `not_found`, `unchanged`). */
7
+ export declare function describeItemResult(entry: ActionItemResult, intl: IntlShape): string;
8
+ //# sourceMappingURL=describe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe.d.ts","sourceRoot":"","sources":["../src/describe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKhD,mGAAmG;AACnG,wBAAgB,cAAc,CAC1B,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,SAAS,GAChB,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAmB9B;AAED,sGAAsG;AACtG,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,CAgBnF"}
@@ -0,0 +1,32 @@
1
+ import { messages } from "./messages.js";
2
+ import { getResultCounts } from "./request.js";
3
+ //#region src/describe.ts
4
+ /** The toast of a result: its message, or "done", the counts, and a tone that says how it went. */
5
+ function describeResult(result, actionLabel, intl) {
6
+ const { succeeded, failed, skipped } = getResultCounts(result);
7
+ const parts = [
8
+ ...succeeded !== null && (failed > 0 || skipped > 0) ? [intl.formatMessage(messages.succeededCount, { count: succeeded })] : [],
9
+ ...failed > 0 ? [intl.formatMessage(messages.failedCount, { count: failed })] : [],
10
+ ...skipped > 0 ? [intl.formatMessage(messages.skippedCount, { count: skipped })] : []
11
+ ];
12
+ const tone = failed > 0 ? succeeded === 0 ? "danger" : "warning" : skipped > 0 ? "warning" : "success";
13
+ return {
14
+ title: result.message !== void 0 && result.message !== "" ? result.message : intl.formatMessage(messages.done, { action: actionLabel }),
15
+ ...parts.length > 0 ? { description: intl.formatList(parts, { type: "unit" }) } : {},
16
+ tone
17
+ };
18
+ }
19
+ /** Why an item didn't succeed: its message, or its reason (`forbidden`, `not_found`, `unchanged`). */
20
+ function describeItemResult(entry, intl) {
21
+ if (entry.message !== void 0 && entry.message !== "") return entry.message;
22
+ switch (entry.reason) {
23
+ case "forbidden": return intl.formatMessage(messages.reasonForbidden);
24
+ case "not_found": return intl.formatMessage(messages.reasonNotFound);
25
+ case "unchanged": return intl.formatMessage(messages.reasonUnchanged);
26
+ default: return intl.formatMessage(entry.status === "failed" ? messages.statusFailed : messages.statusSkipped);
27
+ }
28
+ }
29
+ //#endregion
30
+ export { describeItemResult, describeResult };
31
+
32
+ //# sourceMappingURL=describe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe.js","names":[],"sources":["../src/describe.ts"],"sourcesContent":["import type { IntlShape } from 'react-intl';\n\nimport type { ActionItemResult, ActionResult } from '@panneau/protocol';\nimport type { ToastContent } from '@panneau/ui';\n\nimport { messages } from './messages';\nimport { getResultCounts } from './request';\n\n/** The toast of a result: its message, or \"done\", the counts, and a tone that says how it went. */\nexport function describeResult(\n result: ActionResult,\n actionLabel: string,\n intl: IntlShape,\n): Omit<ToastContent, 'action'> {\n const { succeeded, failed, skipped } = getResultCounts(result);\n const parts = [\n ...(succeeded !== null && (failed > 0 || skipped > 0)\n ? [intl.formatMessage(messages.succeededCount, { count: succeeded })]\n : []),\n ...(failed > 0 ? [intl.formatMessage(messages.failedCount, { count: failed })] : []),\n ...(skipped > 0 ? [intl.formatMessage(messages.skippedCount, { count: skipped })] : []),\n ];\n const tone: ToastContent['tone'] =\n failed > 0 ? (succeeded === 0 ? 'danger' : 'warning') : skipped > 0 ? 'warning' : 'success';\n return {\n title:\n result.message !== undefined && result.message !== ''\n ? result.message\n : intl.formatMessage(messages.done, { action: actionLabel }),\n ...(parts.length > 0 ? { description: intl.formatList(parts, { type: 'unit' }) } : {}),\n tone,\n };\n}\n\n/** Why an item didn't succeed: its message, or its reason (`forbidden`, `not_found`, `unchanged`). */\nexport function describeItemResult(entry: ActionItemResult, intl: IntlShape): string {\n if (entry.message !== undefined && entry.message !== '') {\n return entry.message;\n }\n switch (entry.reason) {\n case 'forbidden':\n return intl.formatMessage(messages.reasonForbidden);\n case 'not_found':\n return intl.formatMessage(messages.reasonNotFound);\n case 'unchanged':\n return intl.formatMessage(messages.reasonUnchanged);\n default:\n return intl.formatMessage(\n entry.status === 'failed' ? messages.statusFailed : messages.statusSkipped,\n );\n }\n}\n"],"mappings":";;;;AASA,SAAgB,eACZ,QACA,aACA,MAC4B;CAC5B,MAAM,EAAE,WAAW,QAAQ,YAAY,gBAAgB,MAAM;CAC7D,MAAM,QAAQ;EACV,GAAI,cAAc,SAAS,SAAS,KAAK,UAAU,KAC7C,CAAC,KAAK,cAAc,SAAS,gBAAgB,EAAE,OAAO,UAAU,CAAC,CAAC,IAClE,CAAA;EACN,GAAI,SAAS,IAAI,CAAC,KAAK,cAAc,SAAS,aAAa,EAAE,OAAO,OAAO,CAAC,CAAC,IAAI,CAAA;EACjF,GAAI,UAAU,IAAI,CAAC,KAAK,cAAc,SAAS,cAAc,EAAE,OAAO,QAAQ,CAAC,CAAC,IAAI,CAAA;CAAG;CAE3F,MAAM,OACF,SAAS,IAAK,cAAc,IAAI,WAAW,YAAa,UAAU,IAAI,YAAY;CACtF,OAAO;EACH,OACI,OAAO,YAAY,KAAA,KAAa,OAAO,YAAY,KAC7C,OAAO,UACP,KAAK,cAAc,SAAS,MAAM,EAAE,QAAQ,YAAY,CAAC;EACnE,GAAI,MAAM,SAAS,IAAI,EAAE,aAAa,KAAK,WAAW,OAAO,EAAE,MAAM,OAAO,CAAC,EAAE,IAAI,CAAC;EACpF;CACJ;AACJ;;AAGA,SAAgB,mBAAmB,OAAyB,MAAyB;CACjF,IAAI,MAAM,YAAY,KAAA,KAAa,MAAM,YAAY,IACjD,OAAO,MAAM;CAEjB,QAAQ,MAAM,QAAd;EACI,KAAK,aACD,OAAO,KAAK,cAAc,SAAS,eAAe;EACtD,KAAK,aACD,OAAO,KAAK,cAAc,SAAS,cAAc;EACrD,KAAK,aACD,OAAO,KAAK,cAAc,SAAS,eAAe;EACtD,SACI,OAAO,KAAK,cACR,MAAM,WAAW,WAAW,SAAS,eAAe,SAAS,aACjE;CACR;AACJ"}
package/dist/index.d.ts CHANGED
@@ -1,10 +1,9 @@
1
- import * as react from 'react';
2
- import { ReactNode } from 'react';
3
-
4
- interface ActionsProvidersProps {
5
- components?: Record<string, unknown> | null;
6
- children?: ReactNode;
7
- }
8
- declare function ActionsProviders({ components: injectedComponents, children, ...props }: ActionsProvidersProps): react.JSX.Element;
9
-
10
- export { ActionsProviders as default };
1
+ export { ActionRunnerProvider, type ActionRunnerProviderProps } from './ActionRunnerProvider';
2
+ export { ActionRuns, type ActionRunsProps } from './ActionRuns';
3
+ export { ParametersDialog, type ParametersDialogProps } from './ParametersDialog';
4
+ export { ResultsDialog, type ResultsDialogProps } from './ResultsDialog';
5
+ export { describeItemResult, describeResult } from './describe';
6
+ export { buildActionRequest, getLinkTarget, getResultCounts } from './request';
7
+ export type { ActionAdapter, ActionDownload, ActionOutcome, ActionResultContext, ActionTarget, ClientActionHandler, ClientActionProps, FollowedRun, } from './types';
8
+ export { useActionRunner, useActionRuns } from './useActionRunner';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,KAAK,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAC9F,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC/E,YAAY,EACR,aAAa,EACb,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -1,74 +1,8 @@
1
- import { c } from 'react/compiler-runtime';
2
- import { ComponentsProvider, ACTIONS_NAMESPACE } from '@panneau/core/contexts';
3
- import actionDelete from '@panneau/action-delete';
4
- import actionDuplicate from '@panneau/action-duplicate';
5
- import actionEdit from '@panneau/action-edit';
6
- import actionImport from '@panneau/action-import';
7
- import actionRestore from '@panneau/action-restore';
8
- import actionShow from '@panneau/action-show';
9
- import actionUpload from '@panneau/action-upload';
10
- import { jsx } from 'react/jsx-runtime';
11
-
12
- var components = /*#__PURE__*/Object.freeze({
13
- __proto__: null,
14
- Delete: actionDelete,
15
- Duplicate: actionDuplicate,
16
- Edit: actionEdit,
17
- Import: actionImport,
18
- Restore: actionRestore,
19
- Show: actionShow,
20
- Upload: actionUpload
21
- });
22
-
23
- function ActionsProviders(t0) {
24
- const $ = c(10);
25
- let props;
26
- let t1;
27
- let t2;
28
- if ($[0] !== t0) {
29
- ({
30
- components: t1,
31
- children: t2,
32
- ...props
33
- } = t0);
34
- $[0] = t0;
35
- $[1] = props;
36
- $[2] = t1;
37
- $[3] = t2;
38
- } else {
39
- props = $[1];
40
- t1 = $[2];
41
- t2 = $[3];
42
- }
43
- const injectedComponents = t1 === undefined ? null : t1;
44
- const children = t2 === undefined ? null : t2;
45
- let t3;
46
- if ($[4] !== injectedComponents) {
47
- t3 = {
48
- ...components,
49
- ...injectedComponents
50
- };
51
- $[4] = injectedComponents;
52
- $[5] = t3;
53
- } else {
54
- t3 = $[5];
55
- }
56
- let t4;
57
- if ($[6] !== children || $[7] !== props || $[8] !== t3) {
58
- t4 = /*#__PURE__*/jsx(ComponentsProvider, {
59
- namespace: ACTIONS_NAMESPACE,
60
- components: t3,
61
- ...props,
62
- children: children
63
- });
64
- $[6] = children;
65
- $[7] = props;
66
- $[8] = t3;
67
- $[9] = t4;
68
- } else {
69
- t4 = $[9];
70
- }
71
- return t4;
72
- }
73
-
74
- export { ActionsProviders as default };
1
+ import { ParametersDialog } from "./ParametersDialog.js";
2
+ import { buildActionRequest, getLinkTarget, getResultCounts } from "./request.js";
3
+ import { describeItemResult, describeResult } from "./describe.js";
4
+ import { ResultsDialog } from "./ResultsDialog.js";
5
+ import { ActionRunnerProvider } from "./ActionRunnerProvider.js";
6
+ import { ActionRuns } from "./ActionRuns.js";
7
+ import { useActionRunner, useActionRuns } from "./useActionRunner.js";
8
+ export { ActionRunnerProvider, ActionRuns, ParametersDialog, ResultsDialog, buildActionRequest, describeItemResult, describeResult, getLinkTarget, getResultCounts, useActionRunner, useActionRuns };
@@ -0,0 +1,2 @@
1
+ export { actionsMessages as messages } from '@panneau/intl';
2
+ //# sourceMappingURL=messages.d.ts.map