@archbase/components 3.0.25 → 4.0.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/buttons/ArchbaseSpeedDial.d.ts +59 -0
- package/dist/buttons/index.d.ts +2 -0
- package/dist/charts/ArchbaseArcGauge.d.ts +55 -0
- package/dist/charts/ArchbaseGantt.d.ts +70 -0
- package/dist/charts/ArchbaseLinearGauge.d.ts +55 -0
- package/dist/charts/ArchbaseResourceTimeline.d.ts +61 -0
- package/dist/charts/ArchbaseSparkline.d.ts +45 -0
- package/dist/charts/index.d.ts +10 -0
- package/dist/containers/ArchbaseExpansionPanel.d.ts +60 -0
- package/dist/containers/ArchbaseFloatingPanel.d.ts +91 -0
- package/dist/containers/index.d.ts +4 -0
- package/dist/datagrid/export/ArchbaseDataGridExcelExport.d.ts +67 -0
- package/dist/datagrid/export/index.d.ts +2 -0
- package/dist/datagrid/index.d.ts +1 -0
- package/dist/display/ArchbaseAnimationWrapper.d.ts +73 -0
- package/dist/display/ArchbaseBarcodeGenerator.d.ts +50 -0
- package/dist/display/ArchbaseCarousel.d.ts +100 -0
- package/dist/display/ArchbaseCodeViewer.d.ts +63 -0
- package/dist/display/ArchbaseDiffViewer.d.ts +41 -0
- package/dist/display/ArchbaseJsonTree.d.ts +34 -0
- package/dist/display/ArchbaseLightbox.d.ts +89 -0
- package/dist/display/ArchbaseMarquee.d.ts +46 -0
- package/dist/display/ArchbasePhotoAlbum.d.ts +58 -0
- package/dist/display/ArchbaseQRCode.d.ts +44 -0
- package/dist/display/ArchbaseTooltipRich.d.ts +82 -0
- package/dist/display/ArchbaseVirtualList.d.ts +116 -0
- package/dist/display/index.d.ts +24 -0
- package/dist/editors/ArchbaseAIPromptInput.d.ts +69 -0
- package/dist/editors/ArchbaseAsyncMultiSelect.d.ts +1 -1
- package/dist/editors/ArchbaseAsyncSelect.d.ts +1 -1
- package/dist/editors/ArchbaseBarcodeScanner.d.ts +63 -0
- package/dist/editors/ArchbaseCepInput.d.ts +26 -0
- package/dist/editors/ArchbaseColorGradientPicker.d.ts +80 -0
- package/dist/editors/ArchbaseCpfCnpjInput.d.ts +21 -0
- package/dist/editors/ArchbaseCurrencyInput.d.ts +25 -0
- package/dist/editors/ArchbaseDualListbox.d.ts +61 -0
- package/dist/editors/ArchbaseInPlaceEditor.d.ts +67 -0
- package/dist/editors/ArchbaseLightGrid.d.ts +56 -0
- package/dist/editors/ArchbaseMentionInput.d.ts +75 -0
- package/dist/editors/ArchbaseMultiEmail.d.ts +53 -0
- package/dist/editors/ArchbaseMultiViewCalendar.d.ts +47 -0
- package/dist/editors/ArchbaseNumberStepper.d.ts +66 -0
- package/dist/editors/ArchbaseOTPInput.d.ts +27 -0
- package/dist/editors/ArchbasePhoneInput.d.ts +52 -0
- package/dist/editors/ArchbaseRangeSlider.d.ts +22 -0
- package/dist/editors/ArchbaseSignaturePad.d.ts +60 -0
- package/dist/editors/ArchbaseSpeechToTextInput.d.ts +106 -0
- package/dist/editors/ArchbaseSpreadsheet.d.ts +56 -0
- package/dist/editors/ArchbaseTagInput.d.ts +55 -0
- package/dist/editors/index.d.ts +40 -0
- package/dist/feedback/ArchbaseChunkProgressBar.d.ts +35 -0
- package/dist/feedback/ArchbaseRipple.d.ts +43 -0
- package/dist/feedback/ArchbaseSkeleton.d.ts +115 -0
- package/dist/feedback/index.d.ts +6 -0
- package/dist/filters/ArchbaseColumnSelector.d.ts +38 -0
- package/dist/filters/index.d.ts +2 -0
- package/dist/forms/ArchbaseFieldArray.d.ts +80 -0
- package/dist/forms/ArchbaseFormWizard.d.ts +73 -0
- package/dist/forms/ArchbaseStepper.d.ts +51 -0
- package/dist/forms/index.d.ts +8 -0
- package/dist/forms/useArchbaseFormWizard.d.ts +74 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/useArchbaseConfirm.d.ts +59 -0
- package/dist/image/editor/index.d.ts +43 -4
- package/dist/image/index.d.ts +1 -0
- package/dist/index.css +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +22510 -13820
- package/dist/list/ArchbaseTreeList.d.ts +76 -0
- package/dist/list/index.d.ts +2 -0
- package/dist/navigation/ArchbaseActionSheet.d.ts +70 -0
- package/dist/navigation/ArchbaseAppBar.d.ts +63 -0
- package/dist/navigation/ArchbaseBottomNavigation.d.ts +61 -0
- package/dist/navigation/ArchbaseContextMenu.d.ts +76 -0
- package/dist/navigation/ArchbaseKeyboardShortcuts.d.ts +85 -0
- package/dist/navigation/ArchbaseSpotlight.d.ts +69 -0
- package/dist/navigation/index.d.ts +12 -0
- package/dist/notification/ArchbaseNotificationCenter.d.ts +56 -0
- package/dist/notification/index.d.ts +2 -0
- package/dist/onboarding/ArchbaseOnboardingTour.d.ts +27 -76
- package/dist/viewers/ArchbaseDocViewer.d.ts +40 -0
- package/dist/viewers/ArchbasePdfBuilder.d.ts +53 -0
- package/dist/viewers/ArchbaseXmlViewer.d.ts +36 -0
- package/dist/viewers/index.d.ts +6 -0
- package/package.json +41 -18
- package/src/buttons/ArchbaseSpeedDial.tsx +282 -0
- package/src/buttons/index.ts +3 -0
- package/src/charts/ArchbaseArcGauge.tsx +325 -0
- package/src/charts/ArchbaseGantt.tsx +494 -0
- package/src/charts/ArchbaseLinearGauge.tsx +288 -0
- package/src/charts/ArchbaseResourceTimeline.tsx +433 -0
- package/src/charts/ArchbaseSparkline.tsx +193 -0
- package/src/charts/index.ts +20 -1
- package/src/containers/ArchbaseExpansionPanel.tsx +208 -0
- package/src/containers/ArchbaseFloatingPanel.tsx +448 -0
- package/src/containers/index.ts +17 -0
- package/src/datagrid/components/pagination/grid-pagination.tsx +2 -2
- package/src/datagrid/export/ArchbaseDataGridExcelExport.tsx +293 -0
- package/src/datagrid/export/index.ts +8 -0
- package/src/datagrid/index.tsx +2 -0
- package/src/display/ArchbaseAnimationWrapper.tsx +272 -0
- package/src/display/ArchbaseBarcodeGenerator.tsx +303 -0
- package/src/display/ArchbaseCarousel.tsx +679 -0
- package/src/display/ArchbaseCodeViewer.tsx +271 -0
- package/src/display/ArchbaseDiffViewer.tsx +108 -0
- package/src/display/ArchbaseJsonTree.tsx +150 -0
- package/src/display/ArchbaseLightbox.tsx +279 -0
- package/src/display/ArchbaseMarquee.tsx +268 -0
- package/src/display/ArchbasePhotoAlbum.tsx +415 -0
- package/src/display/ArchbaseQRCode.tsx +137 -0
- package/src/display/ArchbaseTooltipRich.tsx +317 -0
- package/src/display/ArchbaseVirtualList.tsx +618 -0
- package/src/display/index.ts +94 -1
- package/src/editors/ArchbaseAIPromptInput.tsx +432 -0
- package/src/editors/ArchbaseBarcodeScanner.tsx +570 -0
- package/src/editors/ArchbaseCepInput.tsx +173 -0
- package/src/editors/ArchbaseColorGradientPicker.tsx +460 -0
- package/src/editors/ArchbaseCpfCnpjInput.tsx +193 -0
- package/src/editors/ArchbaseCurrencyInput.tsx +100 -0
- package/src/editors/ArchbaseDualListbox.tsx +671 -0
- package/src/editors/ArchbaseInPlaceEditor.tsx +406 -0
- package/src/editors/ArchbaseLightGrid.tsx +538 -0
- package/src/editors/ArchbaseMentionInput.tsx +384 -0
- package/src/editors/ArchbaseMultiEmail.tsx +367 -0
- package/src/editors/ArchbaseMultiViewCalendar.tsx +439 -0
- package/src/editors/ArchbaseNumberStepper.tsx +219 -0
- package/src/editors/ArchbaseOTPInput.tsx +133 -0
- package/src/editors/ArchbaseOperationHoursEditor.tsx +1 -1
- package/src/editors/ArchbasePhoneInput.tsx +355 -0
- package/src/editors/ArchbaseRangeSlider.tsx +109 -0
- package/src/editors/ArchbaseSignaturePad.tsx +425 -0
- package/src/editors/ArchbaseSpeechToTextInput.tsx +444 -0
- package/src/editors/ArchbaseSpreadsheet.tsx +388 -0
- package/src/editors/ArchbaseTagInput.tsx +326 -0
- package/src/editors/index.tsx +92 -0
- package/src/feedback/ArchbaseChunkProgressBar.tsx +156 -0
- package/src/feedback/ArchbaseRipple.tsx +278 -0
- package/src/feedback/ArchbaseSkeleton.tsx +419 -0
- package/src/feedback/index.ts +22 -1
- package/src/filters/ArchbaseColumnSelector.tsx +268 -0
- package/src/filters/index.ts +2 -0
- package/src/forms/ArchbaseFieldArray.tsx +305 -0
- package/src/forms/ArchbaseFormWizard.tsx +284 -0
- package/src/forms/ArchbaseStepper.tsx +137 -0
- package/src/forms/index.ts +24 -2
- package/src/forms/useArchbaseFormWizard.ts +283 -0
- package/src/hooks/index.ts +12 -0
- package/src/hooks/useArchbaseConfirm.ts +293 -0
- package/src/image/editor/functions/image-processing.ts +5 -0
- package/src/image/editor/index.tsx +305 -391
- package/src/image/index.ts +1 -0
- package/src/index.ts +3 -0
- package/src/list/ArchbaseTreeList.tsx +422 -0
- package/src/list/index.ts +3 -0
- package/src/navigation/ArchbaseActionSheet.tsx +301 -0
- package/src/navigation/ArchbaseAppBar.tsx +233 -0
- package/src/navigation/ArchbaseBottomNavigation.tsx +243 -0
- package/src/navigation/ArchbaseContextMenu.tsx +298 -0
- package/src/navigation/ArchbaseKeyboardShortcuts.tsx +472 -0
- package/src/navigation/ArchbaseSpotlight.tsx +483 -0
- package/src/navigation/index.ts +48 -1
- package/src/notification/ArchbaseNotificationCenter.tsx +502 -0
- package/src/notification/index.ts +2 -0
- package/src/onboarding/ArchbaseOnboardingTour.tsx +229 -102
- package/src/viewers/ArchbaseDocViewer.tsx +584 -0
- package/src/viewers/ArchbasePdfBuilder.tsx +291 -0
- package/src/viewers/ArchbaseXmlViewer.tsx +142 -0
- package/src/viewers/index.ts +12 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import React, { forwardRef, ReactNode, useState, useCallback } from 'react';
|
|
2
|
+
import {
|
|
3
|
+
Stepper,
|
|
4
|
+
StepperProps,
|
|
5
|
+
StepperStepProps,
|
|
6
|
+
Button,
|
|
7
|
+
Group,
|
|
8
|
+
MantineColor,
|
|
9
|
+
MantineSize,
|
|
10
|
+
} from '@mantine/core';
|
|
11
|
+
import { getI18nextInstance } from '@archbase/core';
|
|
12
|
+
|
|
13
|
+
export interface ArchbaseStepperStep {
|
|
14
|
+
/** Identificador único do step */
|
|
15
|
+
id?: string;
|
|
16
|
+
/** Título do step */
|
|
17
|
+
title: string;
|
|
18
|
+
/** Descrição do step */
|
|
19
|
+
description?: string;
|
|
20
|
+
/** Ícone do step */
|
|
21
|
+
icon?: ReactNode;
|
|
22
|
+
/** Cor do step quando ativo */
|
|
23
|
+
color?: MantineColor;
|
|
24
|
+
/** Se o step pode ser clicado para navegar diretamente */
|
|
25
|
+
allowStepSelect?: boolean;
|
|
26
|
+
/** Se o step está desabilitado */
|
|
27
|
+
disabled?: boolean;
|
|
28
|
+
/** Conteúdo do step */
|
|
29
|
+
children?: ReactNode;
|
|
30
|
+
/** Estado de carregamento do step */
|
|
31
|
+
loading?: boolean;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface ArchbaseStepperProps extends Omit<StepperProps, 'children' | 'active' | 'onStepClick'> {
|
|
35
|
+
/** Lista de steps */
|
|
36
|
+
steps: ArchbaseStepperStep[];
|
|
37
|
+
/** Step ativo (controlado) */
|
|
38
|
+
active?: number;
|
|
39
|
+
/** Step ativo inicial (não controlado) */
|
|
40
|
+
defaultActive?: number;
|
|
41
|
+
/** Callback quando o step muda */
|
|
42
|
+
onStepChange?: (nextStep: number, prevStep: number) => void;
|
|
43
|
+
/** Se permite clicar nos steps para navegar */
|
|
44
|
+
allowStepClick?: boolean;
|
|
45
|
+
/** Orientação do stepper */
|
|
46
|
+
orientation?: 'horizontal' | 'vertical';
|
|
47
|
+
/** Tamanho do stepper */
|
|
48
|
+
size?: MantineSize;
|
|
49
|
+
/** Cor do stepper */
|
|
50
|
+
color?: MantineColor;
|
|
51
|
+
/** Ícone de step completado */
|
|
52
|
+
completedIcon?: ReactNode;
|
|
53
|
+
/** Ícone de step em progresso */
|
|
54
|
+
progressIcon?: ReactNode;
|
|
55
|
+
/** Raio do ícone do step */
|
|
56
|
+
iconSize?: number;
|
|
57
|
+
/** Estilo do conector entre steps */
|
|
58
|
+
contentPadding?: number;
|
|
59
|
+
/** Se deve mostrar a barra de progresso */
|
|
60
|
+
withProgress?: boolean;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export const ArchbaseStepper = forwardRef<HTMLDivElement, ArchbaseStepperProps>(
|
|
64
|
+
(
|
|
65
|
+
{
|
|
66
|
+
steps,
|
|
67
|
+
active: controlledActive,
|
|
68
|
+
defaultActive = 0,
|
|
69
|
+
onStepChange,
|
|
70
|
+
allowStepClick = false,
|
|
71
|
+
orientation = 'horizontal',
|
|
72
|
+
size = 'md',
|
|
73
|
+
color,
|
|
74
|
+
completedIcon,
|
|
75
|
+
progressIcon,
|
|
76
|
+
iconSize,
|
|
77
|
+
contentPadding,
|
|
78
|
+
withProgress = false,
|
|
79
|
+
...rest
|
|
80
|
+
},
|
|
81
|
+
ref
|
|
82
|
+
) => {
|
|
83
|
+
const [uncontrolledActive, setUncontrolledActive] = useState(defaultActive);
|
|
84
|
+
const active = controlledActive !== undefined ? controlledActive : uncontrolledActive;
|
|
85
|
+
|
|
86
|
+
const handleStepClick = useCallback(
|
|
87
|
+
(stepIndex: number) => {
|
|
88
|
+
if (!allowStepClick) return;
|
|
89
|
+
|
|
90
|
+
const step = steps[stepIndex];
|
|
91
|
+
if (step?.disabled || step?.allowStepSelect === false) return;
|
|
92
|
+
|
|
93
|
+
const prevStep = active;
|
|
94
|
+
if (controlledActive === undefined) {
|
|
95
|
+
setUncontrolledActive(stepIndex);
|
|
96
|
+
}
|
|
97
|
+
onStepChange?.(stepIndex, prevStep);
|
|
98
|
+
},
|
|
99
|
+
[active, allowStepClick, controlledActive, onStepChange, steps]
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
return (
|
|
103
|
+
<Stepper
|
|
104
|
+
ref={ref}
|
|
105
|
+
active={active}
|
|
106
|
+
onStepClick={allowStepClick ? handleStepClick : undefined}
|
|
107
|
+
orientation={orientation}
|
|
108
|
+
size={size}
|
|
109
|
+
color={color}
|
|
110
|
+
completedIcon={completedIcon}
|
|
111
|
+
progressIcon={progressIcon}
|
|
112
|
+
iconSize={iconSize}
|
|
113
|
+
contentPadding={contentPadding}
|
|
114
|
+
{...rest}
|
|
115
|
+
>
|
|
116
|
+
{steps.map((step, index) => (
|
|
117
|
+
<Stepper.Step
|
|
118
|
+
key={step.id || index}
|
|
119
|
+
label={step.title}
|
|
120
|
+
description={step.description}
|
|
121
|
+
icon={step.icon}
|
|
122
|
+
color={step.color}
|
|
123
|
+
allowStepSelect={step.allowStepSelect ?? allowStepClick}
|
|
124
|
+
loading={step.loading}
|
|
125
|
+
>
|
|
126
|
+
{step.children}
|
|
127
|
+
</Stepper.Step>
|
|
128
|
+
))}
|
|
129
|
+
<Stepper.Completed>
|
|
130
|
+
{getI18nextInstance().t('archbase:Todos os passos foram concluídos!')}
|
|
131
|
+
</Stepper.Completed>
|
|
132
|
+
</Stepper>
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
ArchbaseStepper.displayName = 'ArchbaseStepper';
|
package/src/forms/index.ts
CHANGED
|
@@ -1,4 +1,26 @@
|
|
|
1
|
-
// Form Components
|
|
1
|
+
// Form Components
|
|
2
2
|
export { Button as ArchbaseButton } from '@mantine/core';
|
|
3
3
|
export { ActionIcon as ArchbaseActionIcon } from '@mantine/core';
|
|
4
|
-
export { Fieldset as ArchbaseFieldset } from '@mantine/core';
|
|
4
|
+
export { Fieldset as ArchbaseFieldset } from '@mantine/core';
|
|
5
|
+
|
|
6
|
+
// Stepper & Form Wizard
|
|
7
|
+
export { ArchbaseStepper } from './ArchbaseStepper';
|
|
8
|
+
export type { ArchbaseStepperProps, ArchbaseStepperStep } from './ArchbaseStepper';
|
|
9
|
+
|
|
10
|
+
export { ArchbaseFormWizard } from './ArchbaseFormWizard';
|
|
11
|
+
export type { ArchbaseFormWizardProps, ArchbaseFormWizardStep } from './ArchbaseFormWizard';
|
|
12
|
+
|
|
13
|
+
export { useArchbaseFormWizard } from './useArchbaseFormWizard';
|
|
14
|
+
export type {
|
|
15
|
+
FormWizardStep,
|
|
16
|
+
UseArchbaseFormWizardOptions,
|
|
17
|
+
UseArchbaseFormWizardReturn,
|
|
18
|
+
} from './useArchbaseFormWizard';
|
|
19
|
+
|
|
20
|
+
export { ArchbaseFieldArray, useArchbaseFieldArray } from './ArchbaseFieldArray';
|
|
21
|
+
export type {
|
|
22
|
+
ArchbaseFieldArrayProps,
|
|
23
|
+
ArchbaseFieldArrayItemProps,
|
|
24
|
+
UseArchbaseFieldArrayOptions,
|
|
25
|
+
UseArchbaseFieldArrayReturn,
|
|
26
|
+
} from './ArchbaseFieldArray';
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import { useState, useCallback, useMemo } from 'react';
|
|
2
|
+
import { ArchbaseDataSource } from '@archbase/data';
|
|
3
|
+
|
|
4
|
+
export interface FormWizardStep<T = any> {
|
|
5
|
+
/** Identificador único do step */
|
|
6
|
+
id: string;
|
|
7
|
+
/** Título do step */
|
|
8
|
+
title: string;
|
|
9
|
+
/** Descrição do step */
|
|
10
|
+
description?: string;
|
|
11
|
+
/** Ícone do step */
|
|
12
|
+
icon?: React.ReactNode;
|
|
13
|
+
/** Função de validação do step - retorna true se válido, string com erro se inválido */
|
|
14
|
+
validate?: (data: T) => boolean | string | Promise<boolean | string>;
|
|
15
|
+
/** Se o step é opcional */
|
|
16
|
+
optional?: boolean;
|
|
17
|
+
/** Campos do DataSource que pertencem a este step (para validação parcial) */
|
|
18
|
+
fields?: string[];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface UseArchbaseFormWizardOptions<T extends object, ID> {
|
|
22
|
+
/** Lista de steps do wizard */
|
|
23
|
+
steps: FormWizardStep<T>[];
|
|
24
|
+
/** DataSource vinculado ao formulário */
|
|
25
|
+
dataSource?: ArchbaseDataSource<T, ID>;
|
|
26
|
+
/** Step inicial */
|
|
27
|
+
initialStep?: number;
|
|
28
|
+
/** Callback ao completar todos os steps */
|
|
29
|
+
onComplete?: (data: T) => void | Promise<void>;
|
|
30
|
+
/** Callback ao mudar de step */
|
|
31
|
+
onStepChange?: (fromStep: number, toStep: number, data: T) => void;
|
|
32
|
+
/** Se deve validar ao avançar */
|
|
33
|
+
validateOnNext?: boolean;
|
|
34
|
+
/** Se permite voltar para steps anteriores */
|
|
35
|
+
allowBack?: boolean;
|
|
36
|
+
/** Se permite pular steps opcionais */
|
|
37
|
+
allowSkipOptional?: boolean;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface UseArchbaseFormWizardReturn<T> {
|
|
41
|
+
/** Step atual (0-indexed) */
|
|
42
|
+
currentStep: number;
|
|
43
|
+
/** Total de steps */
|
|
44
|
+
totalSteps: number;
|
|
45
|
+
/** Se está no primeiro step */
|
|
46
|
+
isFirstStep: boolean;
|
|
47
|
+
/** Se está no último step */
|
|
48
|
+
isLastStep: boolean;
|
|
49
|
+
/** Se o wizard foi completado */
|
|
50
|
+
isCompleted: boolean;
|
|
51
|
+
/** Se está validando */
|
|
52
|
+
isValidating: boolean;
|
|
53
|
+
/** Erro de validação do step atual */
|
|
54
|
+
validationError: string | null;
|
|
55
|
+
/** Dados do step atual */
|
|
56
|
+
currentStepData: FormWizardStep<T>;
|
|
57
|
+
/** Steps completados */
|
|
58
|
+
completedSteps: Set<number>;
|
|
59
|
+
/** Avançar para o próximo step */
|
|
60
|
+
nextStep: () => Promise<boolean>;
|
|
61
|
+
/** Voltar para o step anterior */
|
|
62
|
+
prevStep: () => void;
|
|
63
|
+
/** Ir para um step específico */
|
|
64
|
+
goToStep: (step: number) => Promise<boolean>;
|
|
65
|
+
/** Resetar o wizard */
|
|
66
|
+
reset: () => void;
|
|
67
|
+
/** Completar o wizard */
|
|
68
|
+
complete: () => Promise<boolean>;
|
|
69
|
+
/** Marcar step como completado */
|
|
70
|
+
markStepCompleted: (step: number) => void;
|
|
71
|
+
/** Verificar se um step está completado */
|
|
72
|
+
isStepCompleted: (step: number) => boolean;
|
|
73
|
+
/** Verificar se pode avançar */
|
|
74
|
+
canGoNext: boolean;
|
|
75
|
+
/** Verificar se pode voltar */
|
|
76
|
+
canGoBack: boolean;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function useArchbaseFormWizard<T extends object, ID = string>(
|
|
80
|
+
options: UseArchbaseFormWizardOptions<T, ID>
|
|
81
|
+
): UseArchbaseFormWizardReturn<T> {
|
|
82
|
+
const {
|
|
83
|
+
steps,
|
|
84
|
+
dataSource,
|
|
85
|
+
initialStep = 0,
|
|
86
|
+
onComplete,
|
|
87
|
+
onStepChange,
|
|
88
|
+
validateOnNext = true,
|
|
89
|
+
allowBack = true,
|
|
90
|
+
allowSkipOptional = false,
|
|
91
|
+
} = options;
|
|
92
|
+
|
|
93
|
+
const [currentStep, setCurrentStep] = useState(initialStep);
|
|
94
|
+
const [isCompleted, setIsCompleted] = useState(false);
|
|
95
|
+
const [isValidating, setIsValidating] = useState(false);
|
|
96
|
+
const [validationError, setValidationError] = useState<string | null>(null);
|
|
97
|
+
const [completedSteps, setCompletedSteps] = useState<Set<number>>(new Set());
|
|
98
|
+
|
|
99
|
+
const totalSteps = steps.length;
|
|
100
|
+
const isFirstStep = currentStep === 0;
|
|
101
|
+
const isLastStep = currentStep === totalSteps - 1;
|
|
102
|
+
const currentStepData = steps[currentStep];
|
|
103
|
+
|
|
104
|
+
const getData = useCallback((): T => {
|
|
105
|
+
if (dataSource) {
|
|
106
|
+
return dataSource.getCurrentRecord() as T;
|
|
107
|
+
}
|
|
108
|
+
return {} as T;
|
|
109
|
+
}, [dataSource]);
|
|
110
|
+
|
|
111
|
+
const validateCurrentStep = useCallback(async (): Promise<boolean> => {
|
|
112
|
+
const step = steps[currentStep];
|
|
113
|
+
if (!step.validate) return true;
|
|
114
|
+
|
|
115
|
+
setIsValidating(true);
|
|
116
|
+
setValidationError(null);
|
|
117
|
+
|
|
118
|
+
try {
|
|
119
|
+
const result = await step.validate(getData());
|
|
120
|
+
|
|
121
|
+
if (result === true) {
|
|
122
|
+
return true;
|
|
123
|
+
} else if (typeof result === 'string') {
|
|
124
|
+
setValidationError(result);
|
|
125
|
+
return false;
|
|
126
|
+
} else {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
} catch (error) {
|
|
130
|
+
setValidationError(error instanceof Error ? error.message : 'Erro de validação');
|
|
131
|
+
return false;
|
|
132
|
+
} finally {
|
|
133
|
+
setIsValidating(false);
|
|
134
|
+
}
|
|
135
|
+
}, [currentStep, getData, steps]);
|
|
136
|
+
|
|
137
|
+
const markStepCompleted = useCallback((step: number) => {
|
|
138
|
+
setCompletedSteps((prev) => new Set([...prev, step]));
|
|
139
|
+
}, []);
|
|
140
|
+
|
|
141
|
+
const isStepCompleted = useCallback(
|
|
142
|
+
(step: number) => completedSteps.has(step),
|
|
143
|
+
[completedSteps]
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
const nextStep = useCallback(async (): Promise<boolean> => {
|
|
147
|
+
if (isLastStep) return false;
|
|
148
|
+
|
|
149
|
+
if (validateOnNext) {
|
|
150
|
+
const isValid = await validateCurrentStep();
|
|
151
|
+
if (!isValid) return false;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
markStepCompleted(currentStep);
|
|
155
|
+
const nextStepIndex = currentStep + 1;
|
|
156
|
+
|
|
157
|
+
onStepChange?.(currentStep, nextStepIndex, getData());
|
|
158
|
+
setCurrentStep(nextStepIndex);
|
|
159
|
+
setValidationError(null);
|
|
160
|
+
|
|
161
|
+
return true;
|
|
162
|
+
}, [
|
|
163
|
+
currentStep,
|
|
164
|
+
getData,
|
|
165
|
+
isLastStep,
|
|
166
|
+
markStepCompleted,
|
|
167
|
+
onStepChange,
|
|
168
|
+
validateCurrentStep,
|
|
169
|
+
validateOnNext,
|
|
170
|
+
]);
|
|
171
|
+
|
|
172
|
+
const prevStep = useCallback(() => {
|
|
173
|
+
if (isFirstStep || !allowBack) return;
|
|
174
|
+
|
|
175
|
+
const prevStepIndex = currentStep - 1;
|
|
176
|
+
onStepChange?.(currentStep, prevStepIndex, getData());
|
|
177
|
+
setCurrentStep(prevStepIndex);
|
|
178
|
+
setValidationError(null);
|
|
179
|
+
}, [allowBack, currentStep, getData, isFirstStep, onStepChange]);
|
|
180
|
+
|
|
181
|
+
const goToStep = useCallback(
|
|
182
|
+
async (step: number): Promise<boolean> => {
|
|
183
|
+
if (step < 0 || step >= totalSteps) return false;
|
|
184
|
+
if (step === currentStep) return true;
|
|
185
|
+
|
|
186
|
+
// Se está indo para frente, valida o step atual
|
|
187
|
+
if (step > currentStep && validateOnNext) {
|
|
188
|
+
const isValid = await validateCurrentStep();
|
|
189
|
+
if (!isValid) return false;
|
|
190
|
+
markStepCompleted(currentStep);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Verifica se pode ir para o step destino
|
|
194
|
+
// Pode ir para qualquer step já completado ou o próximo não completado
|
|
195
|
+
if (step > currentStep) {
|
|
196
|
+
// Verificar se todos os steps anteriores ao destino estão completos
|
|
197
|
+
for (let i = currentStep; i < step; i++) {
|
|
198
|
+
if (!completedSteps.has(i) && !steps[i].optional) {
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
onStepChange?.(currentStep, step, getData());
|
|
205
|
+
setCurrentStep(step);
|
|
206
|
+
setValidationError(null);
|
|
207
|
+
|
|
208
|
+
return true;
|
|
209
|
+
},
|
|
210
|
+
[
|
|
211
|
+
completedSteps,
|
|
212
|
+
currentStep,
|
|
213
|
+
getData,
|
|
214
|
+
markStepCompleted,
|
|
215
|
+
onStepChange,
|
|
216
|
+
steps,
|
|
217
|
+
totalSteps,
|
|
218
|
+
validateCurrentStep,
|
|
219
|
+
validateOnNext,
|
|
220
|
+
]
|
|
221
|
+
);
|
|
222
|
+
|
|
223
|
+
const complete = useCallback(async (): Promise<boolean> => {
|
|
224
|
+
if (validateOnNext) {
|
|
225
|
+
const isValid = await validateCurrentStep();
|
|
226
|
+
if (!isValid) return false;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
markStepCompleted(currentStep);
|
|
230
|
+
setIsCompleted(true);
|
|
231
|
+
|
|
232
|
+
if (onComplete) {
|
|
233
|
+
try {
|
|
234
|
+
await onComplete(getData());
|
|
235
|
+
} catch (error) {
|
|
236
|
+
setValidationError(error instanceof Error ? error.message : 'Erro ao completar');
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return true;
|
|
242
|
+
}, [currentStep, getData, markStepCompleted, onComplete, validateCurrentStep, validateOnNext]);
|
|
243
|
+
|
|
244
|
+
const reset = useCallback(() => {
|
|
245
|
+
setCurrentStep(initialStep);
|
|
246
|
+
setIsCompleted(false);
|
|
247
|
+
setValidationError(null);
|
|
248
|
+
setCompletedSteps(new Set());
|
|
249
|
+
}, [initialStep]);
|
|
250
|
+
|
|
251
|
+
const canGoNext = useMemo(() => {
|
|
252
|
+
if (isLastStep) return false;
|
|
253
|
+
if (isValidating) return false;
|
|
254
|
+
return true;
|
|
255
|
+
}, [isLastStep, isValidating]);
|
|
256
|
+
|
|
257
|
+
const canGoBack = useMemo(() => {
|
|
258
|
+
if (isFirstStep) return false;
|
|
259
|
+
if (!allowBack) return false;
|
|
260
|
+
return true;
|
|
261
|
+
}, [allowBack, isFirstStep]);
|
|
262
|
+
|
|
263
|
+
return {
|
|
264
|
+
currentStep,
|
|
265
|
+
totalSteps,
|
|
266
|
+
isFirstStep,
|
|
267
|
+
isLastStep,
|
|
268
|
+
isCompleted,
|
|
269
|
+
isValidating,
|
|
270
|
+
validationError,
|
|
271
|
+
currentStepData,
|
|
272
|
+
completedSteps,
|
|
273
|
+
nextStep,
|
|
274
|
+
prevStep,
|
|
275
|
+
goToStep,
|
|
276
|
+
reset,
|
|
277
|
+
complete,
|
|
278
|
+
markStepCompleted,
|
|
279
|
+
isStepCompleted,
|
|
280
|
+
canGoNext,
|
|
281
|
+
canGoBack,
|
|
282
|
+
};
|
|
283
|
+
}
|
package/src/hooks/index.ts
CHANGED
|
@@ -3,3 +3,15 @@ export { useArchbaseVisible } from './useArchbaseVisible';
|
|
|
3
3
|
export { useArchbaseNavigateParams } from './useArchbaseNavigateParams';
|
|
4
4
|
export { useArchbaseContainerDimensions } from './useArchbaseContainerDimensions';
|
|
5
5
|
export { useArchbaseElementSizeArea } from './useArchbaseElementSizeArea';
|
|
6
|
+
|
|
7
|
+
export {
|
|
8
|
+
useArchbaseConfirm,
|
|
9
|
+
archbaseConfirm,
|
|
10
|
+
archbaseConfirmDelete,
|
|
11
|
+
archbaseAlert,
|
|
12
|
+
} from './useArchbaseConfirm';
|
|
13
|
+
export type {
|
|
14
|
+
ArchbaseConfirmOptions,
|
|
15
|
+
ArchbaseDeleteConfirmOptions,
|
|
16
|
+
UseArchbaseConfirmReturn,
|
|
17
|
+
} from './useArchbaseConfirm';
|