@panneau/actions 4.1.1 → 5.0.0-alpha.1
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/README.md +75 -0
- package/dist/ActionRunner.css +84 -0
- package/dist/ActionRunner.module.js +34 -0
- package/dist/ActionRunner.module.js.map +1 -0
- package/dist/ActionRunnerProvider.d.ts +36 -0
- package/dist/ActionRunnerProvider.d.ts.map +1 -0
- package/dist/ActionRunnerProvider.js +245 -0
- package/dist/ActionRunnerProvider.js.map +1 -0
- package/dist/ActionRuns.d.ts +12 -0
- package/dist/ActionRuns.d.ts.map +1 -0
- package/dist/ActionRuns.js +128 -0
- package/dist/ActionRuns.js.map +1 -0
- package/dist/ParametersDialog.d.ts +19 -0
- package/dist/ParametersDialog.d.ts.map +1 -0
- package/dist/ParametersDialog.js +119 -0
- package/dist/ParametersDialog.js.map +1 -0
- package/dist/ResultsDialog.d.ts +10 -0
- package/dist/ResultsDialog.d.ts.map +1 -0
- package/dist/ResultsDialog.js +130 -0
- package/dist/ResultsDialog.js.map +1 -0
- package/dist/context.d.ts +10 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +7 -0
- package/dist/context.js.map +1 -0
- package/dist/describe.d.ts +8 -0
- package/dist/describe.d.ts.map +1 -0
- package/dist/describe.js +32 -0
- package/dist/describe.js.map +1 -0
- package/dist/index.d.ts +9 -10
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -74
- package/dist/messages.d.ts +2 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +1 -0
- package/dist/request.d.ts +15 -0
- package/dist/request.d.ts.map +1 -0
- package/dist/request.js +50 -0
- package/dist/request.js.map +1 -0
- package/dist/types.d.ts +62 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/useActionRunner.d.ts +21 -0
- package/dist/useActionRunner.d.ts.map +1 -0
- package/dist/useActionRunner.js +34 -0
- package/dist/useActionRunner.js.map +1 -0
- package/package.json +29 -50
|
@@ -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":"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"}
|
|
@@ -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"}
|
package/dist/context.js
ADDED
|
@@ -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"}
|
package/dist/describe.js
ADDED
|
@@ -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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
|
|
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 {
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/messages.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { actionsMessages as messages } from "@panneau/intl";
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ActionRequest, ActionResult, RouteReference } from '@panneau/protocol';
|
|
2
|
+
import type { ActionTarget } from './types';
|
|
3
|
+
/** The request of an action: its selection (none for the resource), and its parameter values. */
|
|
4
|
+
export declare function buildActionRequest(target: ActionTarget, values?: Record<string, unknown>): ActionRequest;
|
|
5
|
+
/** Where a `link` action goes: its `url` with `{id}` replaced, or its `route` with the item's id. */
|
|
6
|
+
export declare function getLinkTarget(target: ActionTarget): string | RouteReference | null;
|
|
7
|
+
/** Whether a run has finished, successfully or not. */
|
|
8
|
+
export declare function isFinished(status: string): boolean;
|
|
9
|
+
/** The counts of a result, from its summary or, without one, from its per-item results. */
|
|
10
|
+
export declare function getResultCounts(result: ActionResult): {
|
|
11
|
+
succeeded: number | null;
|
|
12
|
+
failed: number;
|
|
13
|
+
skipped: number;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=request.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAErF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,iGAAiG;AACjG,wBAAgB,kBAAkB,CAC9B,MAAM,EAAE,YAAY,EACpB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACrC,aAAa,CAQf;AAED,qGAAqG;AACrG,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG,cAAc,GAAG,IAAI,CAclF;AAID,uDAAuD;AACvD,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,2FAA2F;AAC3F,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG;IACnD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACnB,CAUA"}
|
package/dist/request.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
//#region src/request.ts
|
|
2
|
+
/** The request of an action: its selection (none for the resource), and its parameter values. */
|
|
3
|
+
function buildActionRequest(target, values = {}) {
|
|
4
|
+
if (target.scope === "item" && target.item !== void 0) return {
|
|
5
|
+
selection: { ids: [target.item.id] },
|
|
6
|
+
values
|
|
7
|
+
};
|
|
8
|
+
if (target.scope === "selection" && target.selection !== void 0) return {
|
|
9
|
+
selection: target.selection,
|
|
10
|
+
values
|
|
11
|
+
};
|
|
12
|
+
return { values };
|
|
13
|
+
}
|
|
14
|
+
/** Where a `link` action goes: its `url` with `{id}` replaced, or its `route` with the item's id. */
|
|
15
|
+
function getLinkTarget(target) {
|
|
16
|
+
const { action, item } = target;
|
|
17
|
+
if (action.url !== void 0) {
|
|
18
|
+
if (action.url.includes("{id}") && item === void 0) return null;
|
|
19
|
+
return item !== void 0 ? action.url.replaceAll("{id}", encodeURIComponent(item.id)) : action.url;
|
|
20
|
+
}
|
|
21
|
+
if (action.route !== void 0) return {
|
|
22
|
+
route: action.route,
|
|
23
|
+
params: item !== void 0 ? { id: item.id } : {}
|
|
24
|
+
};
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
var FINISHED = /* @__PURE__ */ new Set([
|
|
28
|
+
"succeeded",
|
|
29
|
+
"partial",
|
|
30
|
+
"failed",
|
|
31
|
+
"cancelled"
|
|
32
|
+
]);
|
|
33
|
+
/** Whether a run has finished, successfully or not. */
|
|
34
|
+
function isFinished(status) {
|
|
35
|
+
return FINISHED.has(status);
|
|
36
|
+
}
|
|
37
|
+
/** The counts of a result, from its summary or, without one, from its per-item results. */
|
|
38
|
+
function getResultCounts(result) {
|
|
39
|
+
if (result.summary !== void 0) return result.summary;
|
|
40
|
+
const results = result.results ?? [];
|
|
41
|
+
return {
|
|
42
|
+
succeeded: null,
|
|
43
|
+
failed: results.filter((entry) => entry.status === "failed").length,
|
|
44
|
+
skipped: results.filter((entry) => entry.status === "skipped").length
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//#endregion
|
|
48
|
+
export { buildActionRequest, getLinkTarget, getResultCounts, isFinished };
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.js","names":[],"sources":["../src/request.ts"],"sourcesContent":["import type { ActionRequest, ActionResult, RouteReference } from '@panneau/protocol';\n\nimport type { ActionTarget } from './types';\n\n/** The request of an action: its selection (none for the resource), and its parameter values. */\nexport function buildActionRequest(\n target: ActionTarget,\n values: Record<string, unknown> = {},\n): ActionRequest {\n if (target.scope === 'item' && target.item !== undefined) {\n return { selection: { ids: [target.item.id] }, values };\n }\n if (target.scope === 'selection' && target.selection !== undefined) {\n return { selection: target.selection, values };\n }\n return { values };\n}\n\n/** Where a `link` action goes: its `url` with `{id}` replaced, or its `route` with the item's id. */\nexport function getLinkTarget(target: ActionTarget): string | RouteReference | null {\n const { action, item } = target;\n if (action.url !== undefined) {\n if (action.url.includes('{id}') && item === undefined) {\n return null;\n }\n return item !== undefined\n ? action.url.replaceAll('{id}', encodeURIComponent(item.id))\n : action.url;\n }\n if (action.route !== undefined) {\n return { route: action.route, params: item !== undefined ? { id: item.id } : {} };\n }\n return null;\n}\n\nconst FINISHED = new Set(['succeeded', 'partial', 'failed', 'cancelled']);\n\n/** Whether a run has finished, successfully or not. */\nexport function isFinished(status: string): boolean {\n return FINISHED.has(status);\n}\n\n/** The counts of a result, from its summary or, without one, from its per-item results. */\nexport function getResultCounts(result: ActionResult): {\n succeeded: number | null;\n failed: number;\n skipped: number;\n} {\n if (result.summary !== undefined) {\n return result.summary;\n }\n const results = result.results ?? [];\n return {\n succeeded: null,\n failed: results.filter((entry) => entry.status === 'failed').length,\n skipped: results.filter((entry) => entry.status === 'skipped').length,\n };\n}\n"],"mappings":";;AAKA,SAAgB,mBACZ,QACA,SAAkC,CAAC,GACtB;CACb,IAAI,OAAO,UAAU,UAAU,OAAO,SAAS,KAAA,GAC3C,OAAO;EAAE,WAAW,EAAE,KAAK,CAAC,OAAO,KAAK,EAAE,EAAE;EAAG;CAAO;CAE1D,IAAI,OAAO,UAAU,eAAe,OAAO,cAAc,KAAA,GACrD,OAAO;EAAE,WAAW,OAAO;EAAW;CAAO;CAEjD,OAAO,EAAE,OAAO;AACpB;;AAGA,SAAgB,cAAc,QAAsD;CAChF,MAAM,EAAE,QAAQ,SAAS;CACzB,IAAI,OAAO,QAAQ,KAAA,GAAW;EAC1B,IAAI,OAAO,IAAI,SAAS,MAAM,KAAK,SAAS,KAAA,GACxC,OAAO;EAEX,OAAO,SAAS,KAAA,IACV,OAAO,IAAI,WAAW,QAAQ,mBAAmB,KAAK,EAAE,CAAC,IACzD,OAAO;CACjB;CACA,IAAI,OAAO,UAAU,KAAA,GACjB,OAAO;EAAE,OAAO,OAAO;EAAO,QAAQ,SAAS,KAAA,IAAY,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC;CAAE;CAEpF,OAAO;AACX;AAEA,IAAM,2BAAW,IAAI,IAAI;CAAC;CAAa;CAAW;CAAU;AAAW,CAAC;;AAGxE,SAAgB,WAAW,QAAyB;CAChD,OAAO,SAAS,IAAI,MAAM;AAC9B;;AAGA,SAAgB,gBAAgB,QAI9B;CACE,IAAI,OAAO,YAAY,KAAA,GACnB,OAAO,OAAO;CAElB,MAAM,UAAU,OAAO,WAAW,CAAA;CAClC,OAAO;EACH,WAAW;EACX,QAAQ,QAAQ,QAAQ,UAAU,MAAM,WAAW,QAAQ,CAAC,CAAC;EAC7D,SAAS,QAAQ,QAAQ,UAAU,MAAM,WAAW,SAAS,CAAC,CAAC;CACnE;AACJ"}
|