@cratis/components 1.4.15 → 1.5.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/dist/cjs/CommandDialog/CommandDialog.js +4 -4
- package/dist/cjs/CommandDialog/CommandDialog.js.map +1 -1
- package/dist/cjs/CommandDialog/StepperCommandDialog.css +14 -0
- package/dist/cjs/CommandDialog/StepperCommandDialog.js +170 -0
- package/dist/cjs/CommandDialog/StepperCommandDialog.js.map +1 -0
- package/dist/cjs/CommandDialog/index.js +2 -0
- package/dist/cjs/CommandDialog/index.js.map +1 -1
- package/dist/cjs/Dialogs/Dialog.js +2 -2
- package/dist/cjs/Dialogs/Dialog.js.map +1 -1
- package/dist/esm/CommandDialog/CommandDialog.d.ts.map +1 -1
- package/dist/esm/CommandDialog/CommandDialog.js +4 -4
- package/dist/esm/CommandDialog/CommandDialog.js.map +1 -1
- package/dist/esm/CommandDialog/StepperCommandDialog.css +14 -0
- package/dist/esm/CommandDialog/StepperCommandDialog.d.ts +26 -0
- package/dist/esm/CommandDialog/StepperCommandDialog.d.ts.map +1 -0
- package/dist/esm/CommandDialog/StepperCommandDialog.js +168 -0
- package/dist/esm/CommandDialog/StepperCommandDialog.js.map +1 -0
- package/dist/esm/CommandDialog/StepperCommandDialog.stories.d.ts +11 -0
- package/dist/esm/CommandDialog/StepperCommandDialog.stories.d.ts.map +1 -0
- package/dist/esm/CommandDialog/StepperCommandDialog.stories.js +104 -0
- package/dist/esm/CommandDialog/StepperCommandDialog.stories.js.map +1 -0
- package/dist/esm/CommandDialog/index.d.ts +1 -0
- package/dist/esm/CommandDialog/index.d.ts.map +1 -1
- package/dist/esm/CommandDialog/index.js +1 -0
- package/dist/esm/CommandDialog/index.js.map +1 -1
- package/dist/esm/Dialogs/Dialog.d.ts +5 -3
- package/dist/esm/Dialogs/Dialog.d.ts.map +1 -1
- package/dist/esm/Dialogs/Dialog.js +2 -2
- package/dist/esm/Dialogs/Dialog.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { useDialogContext, DialogResult } from '@cratis/arc.react/dialogs';
|
|
3
|
+
import { Dialog } from 'primereact/dialog';
|
|
4
|
+
import { Stepper } from 'primereact/stepper';
|
|
5
|
+
import { Button } from 'primereact/button';
|
|
6
|
+
import React, { useState, useMemo } from 'react';
|
|
7
|
+
import { CommandForm, useCommandFormContext, useCommandInstance, CommandFormFieldWrapper } from '@cratis/arc.react/commands';
|
|
8
|
+
import './StepperCommandDialog.css';
|
|
9
|
+
|
|
10
|
+
const getPropertyName = (accessor) => {
|
|
11
|
+
if (typeof accessor !== 'function')
|
|
12
|
+
return '';
|
|
13
|
+
const fnStr = accessor.toString();
|
|
14
|
+
const match = fnStr.match(/\.([a-zA-Z_$][a-zA-Z0-9_$]*)/);
|
|
15
|
+
return match ? match[1] : '';
|
|
16
|
+
};
|
|
17
|
+
const extractFieldNamesFromNode = (nodes) => {
|
|
18
|
+
const names = [];
|
|
19
|
+
React.Children.forEach(nodes, (child) => {
|
|
20
|
+
if (!React.isValidElement(child))
|
|
21
|
+
return;
|
|
22
|
+
const component = child.type;
|
|
23
|
+
if (component.displayName === 'CommandFormField') {
|
|
24
|
+
const fieldProps = child.props;
|
|
25
|
+
const name = getPropertyName(fieldProps.value);
|
|
26
|
+
if (name)
|
|
27
|
+
names.push(name);
|
|
28
|
+
}
|
|
29
|
+
const childProps = child.props;
|
|
30
|
+
if (childProps.children != null) {
|
|
31
|
+
names.push(...extractFieldNamesFromNode(childProps.children));
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
return names;
|
|
35
|
+
};
|
|
36
|
+
const StepperCommandDialogWrapper = ({ title, visible = true, width = '600px', style, contentStyle, resizable = false, isValid, onClose, onConfirm, onCancel, onBeforeExecute, okLabel = 'Submit', nextLabel = 'Next', previousLabel = 'Previous', orientation = 'horizontal', headerPosition, linear = true, onChangeStep, start, end, pt, ptOptions, unstyled, children }) => {
|
|
37
|
+
const { setCommandValues, setCommandResult, isValid: isCommandFormValid, getFieldError } = useCommandFormContext();
|
|
38
|
+
const commandInstance = useCommandInstance();
|
|
39
|
+
const [isBusy, setIsBusy] = useState(false);
|
|
40
|
+
const [activeStep, setActiveStep] = useState(0);
|
|
41
|
+
const [visitedSteps, setVisitedSteps] = useState(new Set([0]));
|
|
42
|
+
let contextCloseDialog;
|
|
43
|
+
try {
|
|
44
|
+
const context = useDialogContext();
|
|
45
|
+
contextCloseDialog = context?.closeDialog;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
contextCloseDialog = undefined;
|
|
49
|
+
}
|
|
50
|
+
const stepCount = React.Children.count(children);
|
|
51
|
+
const isLastStep = activeStep === stepCount - 1;
|
|
52
|
+
const isFirstStep = activeStep === 0;
|
|
53
|
+
const isDialogValid = isValid !== false && isCommandFormValid;
|
|
54
|
+
const stepFieldNames = useMemo(() => React.Children.toArray(children).map((step) => {
|
|
55
|
+
if (!React.isValidElement(step))
|
|
56
|
+
return [];
|
|
57
|
+
const stepProps = step.props;
|
|
58
|
+
return extractFieldNamesFromNode(stepProps.children);
|
|
59
|
+
}), [children]);
|
|
60
|
+
const stepHasError = (stepIndex) => stepFieldNames[stepIndex]?.some(fieldName => !!(getFieldError?.(fieldName))) ?? false;
|
|
61
|
+
const handleClose = async (result) => {
|
|
62
|
+
let shouldCloseThroughContext = true;
|
|
63
|
+
if (result === DialogResult.Ok || result === DialogResult.Yes) {
|
|
64
|
+
if (onConfirm) {
|
|
65
|
+
const closeResult = await onConfirm();
|
|
66
|
+
shouldCloseThroughContext = closeResult === true;
|
|
67
|
+
}
|
|
68
|
+
else if (onClose) {
|
|
69
|
+
const closeResult = await onClose(result);
|
|
70
|
+
shouldCloseThroughContext = closeResult !== false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
if (onCancel) {
|
|
75
|
+
const closeResult = await onCancel();
|
|
76
|
+
shouldCloseThroughContext = closeResult === true;
|
|
77
|
+
}
|
|
78
|
+
else if (onClose) {
|
|
79
|
+
const closeResult = await onClose(result);
|
|
80
|
+
shouldCloseThroughContext = closeResult !== false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (shouldCloseThroughContext) {
|
|
84
|
+
contextCloseDialog?.(result);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
const handleSubmit = async () => {
|
|
88
|
+
if (onBeforeExecute) {
|
|
89
|
+
const transformedValues = onBeforeExecute(commandInstance);
|
|
90
|
+
setCommandValues(transformedValues);
|
|
91
|
+
}
|
|
92
|
+
setIsBusy(true);
|
|
93
|
+
let result;
|
|
94
|
+
try {
|
|
95
|
+
result = await commandInstance.execute();
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
setIsBusy(false);
|
|
99
|
+
}
|
|
100
|
+
if (!result.isSuccess) {
|
|
101
|
+
setCommandResult(result);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
await handleClose(DialogResult.Ok);
|
|
105
|
+
};
|
|
106
|
+
const processChildren = (nodes) => {
|
|
107
|
+
return React.Children.map(nodes, (child) => {
|
|
108
|
+
if (!React.isValidElement(child))
|
|
109
|
+
return child;
|
|
110
|
+
const component = child.type;
|
|
111
|
+
if (component.displayName === 'CommandFormField') {
|
|
112
|
+
return jsx(CommandFormFieldWrapper, { field: child });
|
|
113
|
+
}
|
|
114
|
+
const childProps = child.props;
|
|
115
|
+
if (childProps.children != null) {
|
|
116
|
+
return React.cloneElement(child, {
|
|
117
|
+
children: processChildren(childProps.children)
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return child;
|
|
121
|
+
});
|
|
122
|
+
};
|
|
123
|
+
const stepperPt = useMemo(() => {
|
|
124
|
+
const userPt = pt;
|
|
125
|
+
const userStepperPanelPt = userPt?.stepperpanel;
|
|
126
|
+
const userNumberPt = userStepperPanelPt?.number;
|
|
127
|
+
return {
|
|
128
|
+
...userPt,
|
|
129
|
+
stepperpanel: {
|
|
130
|
+
...userStepperPanelPt,
|
|
131
|
+
number: (opts) => {
|
|
132
|
+
const existing = typeof userNumberPt === 'function'
|
|
133
|
+
? userNumberPt(opts)
|
|
134
|
+
: userNumberPt ?? {};
|
|
135
|
+
const idx = opts.context.index;
|
|
136
|
+
const hasError = stepFieldNames[idx]?.some(fieldName => !!(getFieldError?.(fieldName))) ?? false;
|
|
137
|
+
const isVisited = visitedSteps.has(idx);
|
|
138
|
+
const bgColor = hasError
|
|
139
|
+
? 'var(--red-500, #ef4444)'
|
|
140
|
+
: isVisited
|
|
141
|
+
? 'var(--green-500, #22c55e)'
|
|
142
|
+
: null;
|
|
143
|
+
if (!bgColor)
|
|
144
|
+
return existing;
|
|
145
|
+
const existingStyle = existing.style;
|
|
146
|
+
return {
|
|
147
|
+
...existing,
|
|
148
|
+
style: { ...existingStyle, backgroundColor: bgColor, color: '#fff' }
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
}, [pt, stepFieldNames, getFieldError, visitedSteps]);
|
|
154
|
+
const headerElement = (jsx("div", { className: "inline-flex align-items-center justify-content-center gap-2", children: jsx("span", { className: "font-bold white-space-nowrap", children: title }) }));
|
|
155
|
+
const footer = (jsxs("div", { className: "flex align-items-center w-full gap-3", children: [!isFirstStep && (jsx(Button, { label: previousLabel, icon: "pi pi-arrow-left", onClick: () => setActiveStep(s => s - 1), disabled: isBusy, outlined: true })), jsx("div", { className: "flex-1" }), !isLastStep && (jsx(Button, { label: nextLabel, icon: "pi pi-arrow-right", iconPos: "right", onClick: () => {
|
|
156
|
+
setVisitedSteps(prev => new Set(prev).add(activeStep));
|
|
157
|
+
setActiveStep(s => s + 1);
|
|
158
|
+
}, disabled: isBusy || stepHasError(activeStep) })), isLastStep && isDialogValid && (jsx(Button, { label: okLabel, icon: "pi pi-check", onClick: handleSubmit, loading: isBusy, disabled: isBusy, autoFocus: true }))] }));
|
|
159
|
+
return (jsx(Dialog, { header: headerElement, modal: true, footer: footer, onHide: () => handleClose(DialogResult.Cancelled), visible: visible, style: { width, ...style }, contentStyle: contentStyle, resizable: resizable, closable: true, children: jsx(Stepper, { activeStep: activeStep, linear: linear, orientation: orientation, headerPosition: headerPosition, onChangeStep: onChangeStep, start: start, end: end, pt: stepperPt, ptOptions: ptOptions, unstyled: unstyled, children: processChildren(children) }) }));
|
|
160
|
+
};
|
|
161
|
+
const StepperCommandDialogComponent = (props) => {
|
|
162
|
+
const { title, visible, width, style, contentStyle, resizable, isValid, onClose, onConfirm, onCancel, okLabel, nextLabel, previousLabel, orientation, headerPosition, linear, onChangeStep, start, end, pt, ptOptions, unstyled, children, ...commandFormProps } = props;
|
|
163
|
+
return (jsx(CommandForm, { ...commandFormProps, children: jsx(StepperCommandDialogWrapper, { title: title, visible: visible, width: width, style: style, contentStyle: contentStyle, resizable: resizable, isValid: isValid, onClose: onClose, onConfirm: onConfirm, onCancel: onCancel, onBeforeExecute: commandFormProps.onBeforeExecute, okLabel: okLabel, nextLabel: nextLabel, previousLabel: previousLabel, orientation: orientation, headerPosition: headerPosition, linear: linear, onChangeStep: onChangeStep, start: start, end: end, pt: pt, ptOptions: ptOptions, unstyled: unstyled, children: children }) }));
|
|
164
|
+
};
|
|
165
|
+
const StepperCommandDialog = StepperCommandDialogComponent;
|
|
166
|
+
|
|
167
|
+
export { StepperCommandDialog };
|
|
168
|
+
//# sourceMappingURL=StepperCommandDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StepperCommandDialog.js","sources":["../../../CommandDialog/StepperCommandDialog.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ICommandResult } from '@cratis/arc/commands';\nimport { DialogResult, useDialogContext } from '@cratis/arc.react/dialogs';\nimport { Dialog as PrimeDialog, type DialogProps as PrimeDialogProps } from 'primereact/dialog';\nimport { Stepper as PrimeStepper, type StepperProps } from 'primereact/stepper';\nimport { Button } from 'primereact/button';\nimport React, { useMemo, useState } from 'react';\nimport {\n CommandForm,\n CommandFormFieldWrapper,\n useCommandFormContext,\n useCommandInstance,\n type CommandFormProps\n} from '@cratis/arc.react/commands';\nimport type { CloseDialog, ConfirmCallback, CancelCallback } from '../Dialogs/Dialog';\nimport './StepperCommandDialog.css';\n\n/** Extracts the property name from an accessor function like `c => c.name`. */\nconst getPropertyName = (accessor: ((obj: unknown) => unknown) | unknown): string => {\n if (typeof accessor !== 'function') return '';\n const fnStr = accessor.toString();\n const match = fnStr.match(/\\.([a-zA-Z_$][a-zA-Z0-9_$]*)/);\n return match ? match[1] : '';\n};\n\n/** Recursively collects all CommandFormField property names from a React node tree. */\nconst extractFieldNamesFromNode = (nodes: React.ReactNode): string[] => {\n const names: string[] = [];\n React.Children.forEach(nodes, (child) => {\n if (!React.isValidElement(child)) return;\n const component = child.type as React.ComponentType<unknown>;\n if ((component as { displayName?: string }).displayName === 'CommandFormField') {\n const fieldProps = child.props as { value?: (obj: unknown) => unknown };\n const name = getPropertyName(fieldProps.value);\n if (name) names.push(name);\n }\n const childProps = child.props as Record<string, unknown>;\n if (childProps.children != null) {\n names.push(...extractFieldNamesFromNode(childProps.children as React.ReactNode));\n }\n });\n return names;\n};\n\n/**\n * Stepper-specific customization props forwarded directly to PrimeReact Stepper.\n * `activeStep` and `children` are managed internally and are excluded.\n */\ntype StepperCustomizationProps = Pick<StepperProps,\n 'orientation' | 'headerPosition' | 'linear' | 'onChangeStep' | 'start' | 'end' | 'pt' | 'ptOptions' | 'unstyled'\n>;\n\nexport interface StepperCommandDialogProps<TCommand extends object>\n extends Omit<CommandFormProps<TCommand>, 'children'>,\n StepperCustomizationProps {\n /** Dialog title text. */\n title: string;\n /** Controls dialog visibility. Defaults to `true`. */\n visible?: boolean;\n /** Dialog width. */\n width?: string;\n /** Custom CSS styles applied to the dialog. */\n style?: PrimeDialogProps['style'];\n /** Custom CSS styles applied to the dialog content area. */\n contentStyle?: PrimeDialogProps['contentStyle'];\n /** Whether the dialog can be resized. Defaults to `false`. */\n resizable?: boolean;\n /** Additional validity gate combined with command form validity. */\n isValid?: boolean;\n /** Fallback close callback. */\n onClose?: CloseDialog;\n /** Confirm callback — called only after successful command execution. */\n onConfirm?: ConfirmCallback;\n /** Cancel callback — invoked when the dialog X button is clicked. */\n onCancel?: CancelCallback;\n /** Label for the submit button shown on the last step when valid. Defaults to `'Submit'`. */\n okLabel?: string;\n /** Label for the next step button. Defaults to `'Next'`. */\n nextLabel?: string;\n /** Label for the previous step button. Defaults to `'Previous'`. */\n previousLabel?: string;\n /** StepperPanel children defining each wizard step. */\n children?: React.ReactNode;\n}\n\nconst StepperCommandDialogWrapper = <TCommand extends object>({\n title,\n visible = true,\n width = '600px',\n style,\n contentStyle,\n resizable = false,\n isValid,\n onClose,\n onConfirm,\n onCancel,\n onBeforeExecute,\n okLabel = 'Submit',\n nextLabel = 'Next',\n previousLabel = 'Previous',\n orientation = 'horizontal',\n headerPosition,\n linear = true,\n onChangeStep,\n start,\n end,\n pt,\n ptOptions,\n unstyled,\n children\n}: {\n title: string;\n visible?: boolean;\n width?: string;\n style?: PrimeDialogProps['style'];\n contentStyle?: PrimeDialogProps['contentStyle'];\n resizable?: boolean;\n isValid?: boolean;\n onClose?: CloseDialog;\n onConfirm?: ConfirmCallback;\n onCancel?: CancelCallback;\n onBeforeExecute?: (values: TCommand) => TCommand;\n okLabel?: string;\n nextLabel?: string;\n previousLabel?: string;\n children?: React.ReactNode;\n} & StepperCustomizationProps) => {\n const { setCommandValues, setCommandResult, isValid: isCommandFormValid, getFieldError } = useCommandFormContext<TCommand>();\n const commandInstance = useCommandInstance<TCommand>();\n const [isBusy, setIsBusy] = useState(false);\n const [activeStep, setActiveStep] = useState(0);\n const [visitedSteps, setVisitedSteps] = useState<Set<number>>(new Set([0]));\n\n let contextCloseDialog: ((result: DialogResult) => void) | undefined;\n try {\n const context = useDialogContext();\n contextCloseDialog = context?.closeDialog;\n } catch {\n contextCloseDialog = undefined;\n }\n\n const stepCount = React.Children.count(children);\n const isLastStep = activeStep === stepCount - 1;\n const isFirstStep = activeStep === 0;\n const isDialogValid = isValid !== false && isCommandFormValid;\n\n // Pre-compute the command property names for each StepperPanel step.\n // Used to determine whether a step has validation errors for the indicator badge.\n const stepFieldNames = useMemo(\n () => React.Children.toArray(children).map((step) => {\n if (!React.isValidElement(step)) return [] as string[];\n const stepProps = step.props as Record<string, unknown>;\n return extractFieldNamesFromNode(stepProps.children as React.ReactNode);\n }),\n [children]\n );\n\n const stepHasError = (stepIndex: number): boolean =>\n stepFieldNames[stepIndex]?.some(fieldName => !!(getFieldError?.(fieldName))) ?? false;\n\n const handleClose = async (result: DialogResult) => {\n let shouldCloseThroughContext = true;\n\n if (result === DialogResult.Ok || result === DialogResult.Yes) {\n if (onConfirm) {\n const closeResult = await onConfirm();\n shouldCloseThroughContext = closeResult === true;\n } else if (onClose) {\n const closeResult = await onClose(result);\n shouldCloseThroughContext = closeResult !== false;\n }\n } else {\n if (onCancel) {\n const closeResult = await onCancel();\n shouldCloseThroughContext = closeResult === true;\n } else if (onClose) {\n const closeResult = await onClose(result);\n shouldCloseThroughContext = closeResult !== false;\n }\n }\n\n if (shouldCloseThroughContext) {\n contextCloseDialog?.(result);\n }\n };\n\n const handleSubmit = async () => {\n if (onBeforeExecute) {\n const transformedValues = onBeforeExecute(commandInstance);\n setCommandValues(transformedValues);\n }\n\n setIsBusy(true);\n let result: ICommandResult<unknown>;\n\n try {\n result = await (commandInstance as unknown as { execute: () => Promise<ICommandResult<unknown>> }).execute();\n } finally {\n setIsBusy(false);\n }\n\n if (!result.isSuccess) {\n setCommandResult(result);\n return;\n }\n\n await handleClose(DialogResult.Ok);\n };\n\n const processChildren = (nodes: React.ReactNode): React.ReactNode => {\n return React.Children.map(nodes, (child) => {\n if (!React.isValidElement(child)) return child;\n\n const component = child.type as React.ComponentType<unknown>;\n if (component.displayName === 'CommandFormField') {\n type FieldElement = Parameters<typeof CommandFormFieldWrapper>[0]['field'];\n return <CommandFormFieldWrapper field={child as unknown as FieldElement} />;\n }\n\n const childProps = child.props as Record<string, unknown>;\n if (childProps.children != null) {\n return React.cloneElement(child as React.ReactElement<Record<string, unknown>>, {\n children: processChildren(childProps.children as React.ReactNode)\n });\n }\n\n return child;\n });\n };\n\n /**\n * Builds the passthrough `pt` object for PrimeStepper, injecting an inline\n * style onto the step *number* span to colour it red (errors) or green (visited\n * and valid). Targeting the number span — rather than the header `<li>` — means\n * PrimeReact's default `p-stepper-header` class and all its layout/separator\n * CSS are never disturbed.\n * Merges with any user-supplied `pt` prop.\n */\n const stepperPt = useMemo(() => {\n type StepContext = { context: { index: number } };\n type NumberPtFn = (opts: StepContext) => Record<string, unknown>;\n\n const userPt = pt as Record<string, unknown> | undefined;\n const userStepperPanelPt = userPt?.stepperpanel as Record<string, unknown> | undefined;\n const userNumberPt = userStepperPanelPt?.number;\n\n return {\n ...userPt,\n stepperpanel: {\n ...userStepperPanelPt,\n number: (opts: StepContext) => {\n const existing: Record<string, unknown> =\n typeof userNumberPt === 'function'\n ? (userNumberPt as NumberPtFn)(opts)\n : (userNumberPt as Record<string, unknown> | undefined) ?? {};\n const idx = opts.context.index;\n const hasError = stepFieldNames[idx]?.some(fieldName => !!(getFieldError?.(fieldName))) ?? false;\n const isVisited = visitedSteps.has(idx);\n\n const bgColor = hasError\n ? 'var(--red-500, #ef4444)'\n : isVisited\n ? 'var(--green-500, #22c55e)'\n : null;\n\n if (!bgColor) return existing;\n const existingStyle = existing.style as Record<string, unknown> | undefined;\n return {\n ...existing,\n style: { ...existingStyle, backgroundColor: bgColor, color: '#fff' }\n };\n }\n }\n };\n }, [pt, stepFieldNames, getFieldError, visitedSteps]);\n\n const headerElement = (\n <div className=\"inline-flex align-items-center justify-content-center gap-2\">\n <span className=\"font-bold white-space-nowrap\">{title}</span>\n </div>\n );\n\n const footer = (\n <div className=\"flex align-items-center w-full gap-3\">\n {!isFirstStep && (\n <Button\n label={previousLabel}\n icon=\"pi pi-arrow-left\"\n onClick={() => setActiveStep(s => s - 1)}\n disabled={isBusy}\n outlined\n />\n )}\n <div className=\"flex-1\" />\n {!isLastStep && (\n <Button\n label={nextLabel}\n icon=\"pi pi-arrow-right\"\n iconPos=\"right\"\n onClick={() => {\n setVisitedSteps(prev => new Set(prev).add(activeStep));\n setActiveStep(s => s + 1);\n }}\n disabled={isBusy || stepHasError(activeStep)}\n />\n )}\n {isLastStep && isDialogValid && (\n <Button\n label={okLabel}\n icon=\"pi pi-check\"\n onClick={handleSubmit}\n loading={isBusy}\n disabled={isBusy}\n autoFocus\n />\n )}\n </div>\n );\n\n return (\n <PrimeDialog\n header={headerElement}\n modal\n footer={footer}\n onHide={() => handleClose(DialogResult.Cancelled)}\n visible={visible}\n style={{ width, ...style }}\n contentStyle={contentStyle}\n resizable={resizable}\n closable\n >\n <PrimeStepper\n activeStep={activeStep}\n linear={linear}\n orientation={orientation}\n headerPosition={headerPosition}\n onChangeStep={onChangeStep}\n start={start}\n end={end}\n pt={stepperPt as StepperProps['pt']}\n ptOptions={ptOptions}\n unstyled={unstyled}\n >\n {processChildren(children)}\n </PrimeStepper>\n </PrimeDialog>\n );\n};\n\nconst StepperCommandDialogComponent = <TCommand extends object = object>(\n props: StepperCommandDialogProps<TCommand>\n) => {\n const {\n title,\n visible,\n width,\n style,\n contentStyle,\n resizable,\n isValid,\n onClose,\n onConfirm,\n onCancel,\n okLabel,\n nextLabel,\n previousLabel,\n orientation,\n headerPosition,\n linear,\n onChangeStep,\n start,\n end,\n pt,\n ptOptions,\n unstyled,\n children,\n ...commandFormProps\n } = props;\n\n return (\n <CommandForm<TCommand> {...commandFormProps}>\n <StepperCommandDialogWrapper<TCommand>\n title={title}\n visible={visible}\n width={width}\n style={style}\n contentStyle={contentStyle}\n resizable={resizable}\n isValid={isValid}\n onClose={onClose}\n onConfirm={onConfirm}\n onCancel={onCancel}\n onBeforeExecute={commandFormProps.onBeforeExecute}\n okLabel={okLabel}\n nextLabel={nextLabel}\n previousLabel={previousLabel}\n orientation={orientation}\n headerPosition={headerPosition}\n linear={linear}\n onChangeStep={onChangeStep}\n start={start}\n end={end}\n pt={pt}\n ptOptions={ptOptions}\n unstyled={unstyled}\n >\n {children}\n </StepperCommandDialogWrapper>\n </CommandForm>\n );\n};\n\nexport const StepperCommandDialog = StepperCommandDialogComponent;\n"],"names":["_jsx","_jsxs","PrimeDialog","PrimeStepper"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { StepperCommandDialog } from './StepperCommandDialog';
|
|
3
|
+
import '@cratis/arc/validation';
|
|
4
|
+
declare const meta: Meta<typeof StepperCommandDialog>;
|
|
5
|
+
export default meta;
|
|
6
|
+
type Story = StoryObj<typeof StepperCommandDialog>;
|
|
7
|
+
export declare const Default: Story;
|
|
8
|
+
export declare const ThreeSteps: Story;
|
|
9
|
+
export declare const WithValidationIndicators: Story;
|
|
10
|
+
export declare const WithBusyState: Story;
|
|
11
|
+
//# sourceMappingURL=StepperCommandDialog.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StepperCommandDialog.stories.d.ts","sourceRoot":"","sources":["../../../CommandDialog/StepperCommandDialog.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAM9D,OAAO,wBAAwB,CAAC;AAEhC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,oBAAoB,CAG3C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAwDnD,eAAO,MAAM,OAAO,EAAE,KA0ErB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAmExB,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,KAyDtC,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAuD3B,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { StepperCommandDialog } from './StepperCommandDialog';
|
|
4
|
+
import { Command, CommandResult, CommandValidator } from '@cratis/arc/commands';
|
|
5
|
+
import { PropertyDescriptor } from '@cratis/arc/reflection';
|
|
6
|
+
import { InputTextField, NumberField, TextAreaField } from '../CommandForm/fields';
|
|
7
|
+
import { DialogResult, useDialog, useDialogContext } from '@cratis/arc.react/dialogs';
|
|
8
|
+
import { StepperPanel } from 'primereact/stepperpanel';
|
|
9
|
+
import '@cratis/arc/validation';
|
|
10
|
+
const meta = {
|
|
11
|
+
title: 'CommandDialog/StepperCommandDialog',
|
|
12
|
+
component: StepperCommandDialog,
|
|
13
|
+
};
|
|
14
|
+
export default meta;
|
|
15
|
+
class CreateProjectValidator extends CommandValidator {
|
|
16
|
+
constructor() {
|
|
17
|
+
super();
|
|
18
|
+
this.ruleFor((c) => c.name).notEmpty().minLength(2).maxLength(100);
|
|
19
|
+
this.ruleFor((c) => c.email).notEmpty().emailAddress();
|
|
20
|
+
this.ruleFor((c) => c.description).notEmpty().minLength(10);
|
|
21
|
+
this.ruleFor((c) => c.budget).greaterThan(0);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
class CreateProjectCommand extends Command {
|
|
25
|
+
route = '/api/projects/create';
|
|
26
|
+
validation = new CreateProjectValidator();
|
|
27
|
+
propertyDescriptors = [
|
|
28
|
+
new PropertyDescriptor('name', String),
|
|
29
|
+
new PropertyDescriptor('email', String),
|
|
30
|
+
new PropertyDescriptor('description', String),
|
|
31
|
+
new PropertyDescriptor('budget', Number),
|
|
32
|
+
];
|
|
33
|
+
name = '';
|
|
34
|
+
email = '';
|
|
35
|
+
description = '';
|
|
36
|
+
budget = 0;
|
|
37
|
+
constructor() {
|
|
38
|
+
super(Object, false);
|
|
39
|
+
}
|
|
40
|
+
get requestParameters() {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
get properties() {
|
|
44
|
+
return ['name', 'email', 'description', 'budget'];
|
|
45
|
+
}
|
|
46
|
+
async validate() {
|
|
47
|
+
const errors = this.validation?.validate(this) ?? [];
|
|
48
|
+
if (errors.length > 0) {
|
|
49
|
+
return CommandResult.validationFailed(errors);
|
|
50
|
+
}
|
|
51
|
+
return CommandResult.empty;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
class SlowCreateProjectCommand extends CreateProjectCommand {
|
|
55
|
+
async execute() {
|
|
56
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
57
|
+
return CommandResult.empty;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export const Default = {
|
|
61
|
+
render: () => {
|
|
62
|
+
const [result, setResult] = useState('');
|
|
63
|
+
const CreateProjectDialogComponent = () => {
|
|
64
|
+
const { closeDialog } = useDialogContext();
|
|
65
|
+
return (_jsxs(StepperCommandDialog, { command: CreateProjectCommand, title: "Create New Project", okLabel: "Create", autoServerValidate: false, onConfirm: async () => closeDialog(DialogResult.Ok), onCancel: () => closeDialog(DialogResult.Cancelled), children: [_jsxs(StepperPanel, { header: "Basic Info", children: [_jsx(InputTextField, { value: c => c.name, title: "Project Name", placeholder: "Enter project name (min 2 chars)" }), _jsx(InputTextField, { value: c => c.email, title: "Contact Email", placeholder: "Enter contact email", type: "email" })] }), _jsxs(StepperPanel, { header: "Details", children: [_jsx(TextAreaField, { value: c => c.description, title: "Description", placeholder: "Describe the project (min 10 chars)", rows: 4 }), _jsx(NumberField, { value: c => c.budget, title: "Budget", placeholder: "Enter budget (must be > 0)" })] })] }));
|
|
66
|
+
};
|
|
67
|
+
const [CreateProjectDialogWrapper, showCreateProjectDialog] = useDialog(CreateProjectDialogComponent);
|
|
68
|
+
return (_jsxs("div", { className: "storybook-wrapper", children: [_jsx("button", { className: "p-button p-component mb-3", onClick: async () => {
|
|
69
|
+
const [dialogResult, commandResult] = await showCreateProjectDialog();
|
|
70
|
+
if (dialogResult === DialogResult.Ok && commandResult) {
|
|
71
|
+
setResult(JSON.stringify(commandResult));
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
setResult('Cancelled');
|
|
75
|
+
}
|
|
76
|
+
}, children: "Open Dialog" }), result && (_jsxs("div", { className: "p-3 mt-3 bg-green-100 border-round", children: [_jsx("strong", { children: "Result:" }), " ", result] })), _jsx(CreateProjectDialogWrapper, {})] }));
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
export const ThreeSteps = {
|
|
80
|
+
render: () => {
|
|
81
|
+
const [visible, setVisible] = useState(false);
|
|
82
|
+
const [result, setResult] = useState('');
|
|
83
|
+
return (_jsxs("div", { className: "storybook-wrapper", children: [_jsx("button", { className: "p-button p-component mb-3", onClick: () => {
|
|
84
|
+
setVisible(true);
|
|
85
|
+
setResult('');
|
|
86
|
+
}, children: "Open Three-Step Dialog" }), result && (_jsxs("div", { className: "p-3 mt-3 bg-green-100 border-round", children: [_jsx("strong", { children: "Submitted:" }), " ", result] })), _jsxs(StepperCommandDialog, { command: CreateProjectCommand, visible: visible, title: "Create New Project (3 Steps)", okLabel: "Create", autoServerValidate: false, onConfirm: async () => {
|
|
87
|
+
setResult('Project created successfully');
|
|
88
|
+
setVisible(false);
|
|
89
|
+
}, onCancel: () => setVisible(false), children: [_jsx(StepperPanel, { header: "Contact Info", children: _jsx(InputTextField, { value: c => c.email, title: "Contact Email", placeholder: "Enter contact email", type: "email" }) }), _jsx(StepperPanel, { header: "Project Name", children: _jsx(InputTextField, { value: c => c.name, title: "Project Name", placeholder: "Enter project name (min 2 chars)" }) }), _jsxs(StepperPanel, { header: "Details", children: [_jsx(TextAreaField, { value: c => c.description, title: "Description", placeholder: "Describe the project (min 10 chars)", rows: 4 }), _jsx(NumberField, { value: c => c.budget, title: "Budget", placeholder: "Enter budget (must be > 0)" })] })] })] }));
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
export const WithValidationIndicators = {
|
|
93
|
+
render: () => {
|
|
94
|
+
const [visible, setVisible] = useState(true);
|
|
95
|
+
return (_jsxs("div", { className: "storybook-wrapper", children: [_jsxs("p", { className: "mb-3 text-sm text-color-secondary", children: [_jsx("code", { children: "validateOnInit" }), " triggers validation immediately \u2014 step indicators appear on any step whose fields are invalid right from the start."] }), _jsx("button", { className: "p-button p-component mb-3", onClick: () => setVisible(true), children: "Open Dialog" }), _jsxs(StepperCommandDialog, { command: CreateProjectCommand, visible: visible, title: "New Project", okLabel: "Create", autoServerValidate: false, validateOnInit: true, onConfirm: async () => setVisible(false), onCancel: () => setVisible(false), children: [_jsxs(StepperPanel, { header: "Basic Info", children: [_jsx(InputTextField, { value: c => c.name, title: "Project Name", placeholder: "Enter project name (min 2 chars)" }), _jsx(InputTextField, { value: c => c.email, title: "Contact Email", placeholder: "Enter contact email", type: "email" })] }), _jsxs(StepperPanel, { header: "Details", children: [_jsx(TextAreaField, { value: c => c.description, title: "Description", placeholder: "Describe the project (min 10 chars)", rows: 4 }), _jsx(NumberField, { value: c => c.budget, title: "Budget", placeholder: "Enter budget (must be > 0)" })] })] })] }));
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
export const WithBusyState = {
|
|
99
|
+
render: () => {
|
|
100
|
+
const [visible, setVisible] = useState(false);
|
|
101
|
+
return (_jsxs("div", { className: "storybook-wrapper", children: [_jsx("p", { className: "mb-3 text-sm text-color-secondary", children: "Simulates a 2-second server delay. Fill all fields and click Submit to see the busy state." }), _jsx("button", { className: "p-button p-component mb-3", onClick: () => setVisible(true), children: "Open Dialog" }), _jsxs(StepperCommandDialog, { command: SlowCreateProjectCommand, visible: visible, title: "Create New Project (Slow)", okLabel: "Create", autoServerValidate: false, onConfirm: async () => setVisible(false), onCancel: () => setVisible(false), children: [_jsxs(StepperPanel, { header: "Basic Info", children: [_jsx(InputTextField, { value: c => c.name, title: "Project Name", placeholder: "Enter project name" }), _jsx(InputTextField, { value: c => c.email, title: "Contact Email", placeholder: "Enter contact email", type: "email" })] }), _jsxs(StepperPanel, { header: "Details", children: [_jsx(TextAreaField, { value: c => c.description, title: "Description", placeholder: "Describe the project", rows: 4 }), _jsx(NumberField, { value: c => c.budget, title: "Budget", placeholder: "Enter budget" })] })] })] }));
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=StepperCommandDialog.stories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StepperCommandDialog.stories.js","sourceRoot":"","sources":["../../../CommandDialog/StepperCommandDialog.stories.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../CommandDialog/index.ts"],"names":[],"mappings":"AAGA,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../CommandDialog/index.ts"],"names":[],"mappings":"AAGA,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { type DialogProps as PrimeDialogProps } from 'primereact/dialog';
|
|
1
2
|
import { DialogResult, DialogButtons } from '@cratis/arc.react/dialogs';
|
|
2
|
-
import {
|
|
3
|
+
import { ReactNode } from 'react';
|
|
3
4
|
export type CloseDialog = (result: DialogResult) => boolean | void | Promise<boolean> | Promise<void>;
|
|
4
5
|
export type ConfirmCallback = () => boolean | void | Promise<boolean> | Promise<void>;
|
|
5
6
|
export type CancelCallback = () => boolean | void | Promise<boolean> | Promise<void>;
|
|
@@ -12,7 +13,8 @@ export interface DialogProps {
|
|
|
12
13
|
buttons?: DialogButtons | ReactNode;
|
|
13
14
|
children: ReactNode;
|
|
14
15
|
width?: string;
|
|
15
|
-
style?:
|
|
16
|
+
style?: PrimeDialogProps['style'];
|
|
17
|
+
contentStyle?: PrimeDialogProps['contentStyle'];
|
|
16
18
|
resizable?: boolean;
|
|
17
19
|
isValid?: boolean;
|
|
18
20
|
isBusy?: boolean;
|
|
@@ -21,5 +23,5 @@ export interface DialogProps {
|
|
|
21
23
|
yesLabel?: string;
|
|
22
24
|
noLabel?: string;
|
|
23
25
|
}
|
|
24
|
-
export declare const Dialog: ({ title, visible, onClose, onConfirm, onCancel, buttons, children, width, style, resizable, isValid, isBusy, okLabel, cancelLabel, yesLabel, noLabel }: DialogProps) => import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
export declare const Dialog: ({ title, visible, onClose, onConfirm, onCancel, buttons, children, width, style, contentStyle, resizable, isValid, isBusy, okLabel, cancelLabel, yesLabel, noLabel }: DialogProps) => import("react/jsx-runtime").JSX.Element;
|
|
25
27
|
//# sourceMappingURL=Dialog.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../../../Dialogs/Dialog.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../../../Dialogs/Dialog.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAyB,KAAK,WAAW,IAAI,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEhG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAoB,MAAM,2BAA2B,CAAC;AAC1F,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AACtG,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AACtF,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAErF,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IACpC,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAChD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,MAAM,GAAI,sKAkBpB,WAAW,4CAkHb,CAAC"}
|
|
@@ -3,7 +3,7 @@ import { Dialog as Dialog$1 } from 'primereact/dialog';
|
|
|
3
3
|
import { Button } from 'primereact/button';
|
|
4
4
|
import { useDialogContext, DialogResult, DialogButtons } from '@cratis/arc.react/dialogs';
|
|
5
5
|
|
|
6
|
-
const Dialog = ({ title, visible = true, onClose, onConfirm, onCancel, buttons = DialogButtons.OkCancel, children, width = '450px', style, resizable = false, isValid, isBusy = false, okLabel = 'Ok', cancelLabel = 'Cancel', yesLabel = 'Yes', noLabel = 'No' }) => {
|
|
6
|
+
const Dialog = ({ title, visible = true, onClose, onConfirm, onCancel, buttons = DialogButtons.OkCancel, children, width = '450px', style, contentStyle, resizable = false, isValid, isBusy = false, okLabel = 'Ok', cancelLabel = 'Cancel', yesLabel = 'Yes', noLabel = 'No' }) => {
|
|
7
7
|
let contextCloseDialog;
|
|
8
8
|
try {
|
|
9
9
|
const context = useDialogContext();
|
|
@@ -61,7 +61,7 @@ const Dialog = ({ title, visible = true, onClose, onConfirm, onCancel, buttons =
|
|
|
61
61
|
return (jsx(Fragment, {}));
|
|
62
62
|
};
|
|
63
63
|
const footer = (jsx("div", { className: "flex flex-wrap justify-content-start gap-3", children: getFooterInterior() }));
|
|
64
|
-
return (jsx(Dialog$1, { header: headerElement, modal: true, footer: footer, onHide: typeof buttons === 'number' ? () => handleClose(DialogResult.Cancelled) : () => { }, visible: visible, style: { width, ...style }, resizable: resizable, closable: typeof buttons === 'number', children: children }));
|
|
64
|
+
return (jsx(Dialog$1, { header: headerElement, modal: true, footer: footer, onHide: typeof buttons === 'number' ? () => handleClose(DialogResult.Cancelled) : () => { }, visible: visible, style: { width, ...style }, contentStyle: contentStyle, resizable: resizable, closable: typeof buttons === 'number', children: children }));
|
|
65
65
|
};
|
|
66
66
|
|
|
67
67
|
export { Dialog };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dialog.js","sources":["../../../Dialogs/Dialog.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { Dialog as PrimeDialog } from 'primereact/dialog';\nimport { Button } from 'primereact/button';\nimport { DialogResult, DialogButtons, useDialogContext } from '@cratis/arc.react/dialogs';\nimport { CSSProperties, ReactNode } from 'react';\n\nexport type CloseDialog = (result: DialogResult) => boolean | void | Promise<boolean> | Promise<void>;\nexport type ConfirmCallback = () => boolean | void | Promise<boolean> | Promise<void>;\nexport type CancelCallback = () => boolean | void | Promise<boolean> | Promise<void>;\n\nexport interface DialogProps {\n title: string;\n visible?: boolean;\n onClose?: CloseDialog;\n onConfirm?: ConfirmCallback;\n onCancel?: CancelCallback;\n buttons?: DialogButtons | ReactNode;\n children: ReactNode;\n width?: string;\n style?: CSSProperties;\n resizable?: boolean;\n isValid?: boolean;\n isBusy?: boolean;\n okLabel?: string;\n cancelLabel?: string;\n yesLabel?: string;\n noLabel?: string;\n}\n\nexport const Dialog = ({ \n title, \n visible = true, \n onClose, \n onConfirm,\n onCancel,\n buttons = DialogButtons.OkCancel, \n children, \n width = '450px', \n style,\n resizable = false, \n isValid,\n isBusy = false,\n okLabel = 'Ok',\n cancelLabel = 'Cancel',\n yesLabel = 'Yes',\n noLabel = 'No'\n}: DialogProps) => {\n // Try to get dialog context, but allow it to be undefined for standalone usage\n let contextCloseDialog: ((result: DialogResult) => void) | undefined;\n try {\n const context = useDialogContext();\n contextCloseDialog = context?.closeDialog;\n } catch {\n // No context available - dialog is being used standalone\n contextCloseDialog = undefined;\n }\n \n const isDialogValid = isValid !== false;\n const headerElement = (\n <div className=\"inline-flex align-items-center justify-content-center gap-2\">\n <span className=\"font-bold white-space-nowrap\">{title}</span>\n </div>\n );\n\n const handleClose = async (result: DialogResult) => {\n let shouldCloseThroughContext = true;\n\n if (result === DialogResult.Ok || result === DialogResult.Yes) {\n if (onConfirm) {\n const closeResult = await onConfirm();\n shouldCloseThroughContext = closeResult === true;\n } else if (onClose) {\n const closeResult = await onClose(result);\n shouldCloseThroughContext = closeResult !== false;\n }\n } else {\n if (onCancel) {\n const closeResult = await onCancel();\n shouldCloseThroughContext = closeResult === true;\n } else if (onClose) {\n const closeResult = await onClose(result);\n shouldCloseThroughContext = closeResult !== false;\n }\n }\n\n if (shouldCloseThroughContext) {\n contextCloseDialog?.(result);\n }\n };\n\n const okFooter = (\n <>\n <Button label={okLabel} icon=\"pi pi-check\" onClick={() => handleClose(DialogResult.Ok)} disabled={!isDialogValid || isBusy} loading={isBusy} autoFocus />\n </>\n );\n\n const okCancelFooter = (\n <>\n <Button label={okLabel} icon=\"pi pi-check\" onClick={() => handleClose(DialogResult.Ok)} disabled={!isDialogValid || isBusy} loading={isBusy} autoFocus />\n <Button label={cancelLabel} icon=\"pi pi-times\" outlined onClick={() => handleClose(DialogResult.Cancelled)} disabled={isBusy} />\n </>\n );\n\n const yesNoFooter = (\n <>\n <Button label={yesLabel} icon=\"pi pi-check\" onClick={() => handleClose(DialogResult.Yes)} disabled={!isDialogValid || isBusy} loading={isBusy} autoFocus />\n <Button label={noLabel} icon=\"pi pi-times\" outlined onClick={() => handleClose(DialogResult.No)} disabled={isBusy} />\n </>\n );\n\n const yesNoCancelFooter = (\n <>\n <Button label={yesLabel} icon=\"pi pi-check\" onClick={() => handleClose(DialogResult.Yes)} disabled={!isDialogValid || isBusy} loading={isBusy} autoFocus />\n <Button label={noLabel} icon=\"pi pi-times\" outlined onClick={() => handleClose(DialogResult.No)} disabled={isBusy} />\n <Button label={cancelLabel} icon=\"pi pi-times\" outlined onClick={() => handleClose(DialogResult.Cancelled)} disabled={isBusy} />\n </>\n );\n\n const getFooterInterior = () => {\n // If buttons is a ReactNode (custom buttons), use it directly\n if (typeof buttons !== 'number') {\n return buttons;\n }\n\n // Otherwise, use predefined buttons based on DialogButtons enum\n switch (buttons) {\n case DialogButtons.Ok:\n return okFooter;\n case DialogButtons.OkCancel:\n return okCancelFooter;\n case DialogButtons.YesNo:\n return yesNoFooter;\n case DialogButtons.YesNoCancel:\n return yesNoCancelFooter;\n }\n\n return (<></>);\n };\n\n const footer = (\n <div className=\"flex flex-wrap justify-content-start gap-3\">\n {getFooterInterior()}\n </div>\n );\n\n return (\n <PrimeDialog\n header={headerElement}\n modal\n footer={footer}\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n onHide={typeof buttons === 'number' ? () => handleClose(DialogResult.Cancelled) : () => {}}\n visible={visible}\n style={{ width, ...style }}\n resizable={resizable}\n closable={typeof buttons === 'number'}>\n {children}\n </PrimeDialog>\n );\n};\n"],"names":["_jsx","_jsxs","_Fragment","PrimeDialog"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Dialog.js","sources":["../../../Dialogs/Dialog.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { Dialog as PrimeDialog, type DialogProps as PrimeDialogProps } from 'primereact/dialog';\nimport { Button } from 'primereact/button';\nimport { DialogResult, DialogButtons, useDialogContext } from '@cratis/arc.react/dialogs';\nimport { ReactNode } from 'react';\n\nexport type CloseDialog = (result: DialogResult) => boolean | void | Promise<boolean> | Promise<void>;\nexport type ConfirmCallback = () => boolean | void | Promise<boolean> | Promise<void>;\nexport type CancelCallback = () => boolean | void | Promise<boolean> | Promise<void>;\n\nexport interface DialogProps {\n title: string;\n visible?: boolean;\n onClose?: CloseDialog;\n onConfirm?: ConfirmCallback;\n onCancel?: CancelCallback;\n buttons?: DialogButtons | ReactNode;\n children: ReactNode;\n width?: string;\n style?: PrimeDialogProps['style'];\n contentStyle?: PrimeDialogProps['contentStyle'];\n resizable?: boolean;\n isValid?: boolean;\n isBusy?: boolean;\n okLabel?: string;\n cancelLabel?: string;\n yesLabel?: string;\n noLabel?: string;\n}\n\nexport const Dialog = ({ \n title, \n visible = true, \n onClose, \n onConfirm,\n onCancel,\n buttons = DialogButtons.OkCancel, \n children, \n width = '450px', \n style,\n contentStyle,\n resizable = false, \n isValid,\n isBusy = false,\n okLabel = 'Ok',\n cancelLabel = 'Cancel',\n yesLabel = 'Yes',\n noLabel = 'No'\n}: DialogProps) => {\n // Try to get dialog context, but allow it to be undefined for standalone usage\n let contextCloseDialog: ((result: DialogResult) => void) | undefined;\n try {\n const context = useDialogContext();\n contextCloseDialog = context?.closeDialog;\n } catch {\n // No context available - dialog is being used standalone\n contextCloseDialog = undefined;\n }\n \n const isDialogValid = isValid !== false;\n const headerElement = (\n <div className=\"inline-flex align-items-center justify-content-center gap-2\">\n <span className=\"font-bold white-space-nowrap\">{title}</span>\n </div>\n );\n\n const handleClose = async (result: DialogResult) => {\n let shouldCloseThroughContext = true;\n\n if (result === DialogResult.Ok || result === DialogResult.Yes) {\n if (onConfirm) {\n const closeResult = await onConfirm();\n shouldCloseThroughContext = closeResult === true;\n } else if (onClose) {\n const closeResult = await onClose(result);\n shouldCloseThroughContext = closeResult !== false;\n }\n } else {\n if (onCancel) {\n const closeResult = await onCancel();\n shouldCloseThroughContext = closeResult === true;\n } else if (onClose) {\n const closeResult = await onClose(result);\n shouldCloseThroughContext = closeResult !== false;\n }\n }\n\n if (shouldCloseThroughContext) {\n contextCloseDialog?.(result);\n }\n };\n\n const okFooter = (\n <>\n <Button label={okLabel} icon=\"pi pi-check\" onClick={() => handleClose(DialogResult.Ok)} disabled={!isDialogValid || isBusy} loading={isBusy} autoFocus />\n </>\n );\n\n const okCancelFooter = (\n <>\n <Button label={okLabel} icon=\"pi pi-check\" onClick={() => handleClose(DialogResult.Ok)} disabled={!isDialogValid || isBusy} loading={isBusy} autoFocus />\n <Button label={cancelLabel} icon=\"pi pi-times\" outlined onClick={() => handleClose(DialogResult.Cancelled)} disabled={isBusy} />\n </>\n );\n\n const yesNoFooter = (\n <>\n <Button label={yesLabel} icon=\"pi pi-check\" onClick={() => handleClose(DialogResult.Yes)} disabled={!isDialogValid || isBusy} loading={isBusy} autoFocus />\n <Button label={noLabel} icon=\"pi pi-times\" outlined onClick={() => handleClose(DialogResult.No)} disabled={isBusy} />\n </>\n );\n\n const yesNoCancelFooter = (\n <>\n <Button label={yesLabel} icon=\"pi pi-check\" onClick={() => handleClose(DialogResult.Yes)} disabled={!isDialogValid || isBusy} loading={isBusy} autoFocus />\n <Button label={noLabel} icon=\"pi pi-times\" outlined onClick={() => handleClose(DialogResult.No)} disabled={isBusy} />\n <Button label={cancelLabel} icon=\"pi pi-times\" outlined onClick={() => handleClose(DialogResult.Cancelled)} disabled={isBusy} />\n </>\n );\n\n const getFooterInterior = () => {\n // If buttons is a ReactNode (custom buttons), use it directly\n if (typeof buttons !== 'number') {\n return buttons;\n }\n\n // Otherwise, use predefined buttons based on DialogButtons enum\n switch (buttons) {\n case DialogButtons.Ok:\n return okFooter;\n case DialogButtons.OkCancel:\n return okCancelFooter;\n case DialogButtons.YesNo:\n return yesNoFooter;\n case DialogButtons.YesNoCancel:\n return yesNoCancelFooter;\n }\n\n return (<></>);\n };\n\n const footer = (\n <div className=\"flex flex-wrap justify-content-start gap-3\">\n {getFooterInterior()}\n </div>\n );\n\n return (\n <PrimeDialog\n header={headerElement}\n modal\n footer={footer}\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n onHide={typeof buttons === 'number' ? () => handleClose(DialogResult.Cancelled) : () => {}}\n visible={visible}\n style={{ width, ...style }}\n contentStyle={contentStyle}\n resizable={resizable}\n closable={typeof buttons === 'number'}>\n {children}\n </PrimeDialog>\n );\n};\n"],"names":["_jsx","_jsxs","_Fragment","PrimeDialog"],"mappings":"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"}
|