@archbase/components 3.0.25 → 4.0.0
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,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ArchbaseMultiEmail — wrapper para react-multi-email integrado ao DataSource (v1/v2).
|
|
3
|
+
* Permite entrada de multiplos e-mails com validacao, exibidos como badges (pills).
|
|
4
|
+
* @status stable
|
|
5
|
+
*/
|
|
6
|
+
import { Badge, CloseButton, Group, Input, MantineSize, useMantineColorScheme, useMantineTheme } from '@mantine/core';
|
|
7
|
+
import { useForceUpdate } from '@mantine/hooks';
|
|
8
|
+
import type { CSSProperties, FocusEventHandler } from 'react';
|
|
9
|
+
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
10
|
+
import type { DataSourceEvent, IArchbaseDataSourceBase } from '@archbase/data';
|
|
11
|
+
import { DataSourceEventNames, useArchbaseDidUpdate, useArchbaseV1V2Compatibility } from '@archbase/data';
|
|
12
|
+
import { useValidationErrors } from '@archbase/core';
|
|
13
|
+
import { ReactMultiEmail } from 'react-multi-email';
|
|
14
|
+
import 'react-multi-email/dist/style.css';
|
|
15
|
+
|
|
16
|
+
export interface ArchbaseMultiEmailProps<T, ID> {
|
|
17
|
+
/** Fonte de dados onde sera atribuido o valor (V1 ou V2) */
|
|
18
|
+
dataSource?: IArchbaseDataSourceBase<T>;
|
|
19
|
+
/** Campo onde devera ser atribuido o valor na fonte de dados */
|
|
20
|
+
dataField?: string;
|
|
21
|
+
/** Valor controlado (array de emails) */
|
|
22
|
+
value?: string[];
|
|
23
|
+
/** Valor padrao nao controlado */
|
|
24
|
+
defaultValue?: string[];
|
|
25
|
+
/** Delimitador para converter string do datasource em array (padrao ';') */
|
|
26
|
+
delimiter?: string;
|
|
27
|
+
/** Titulo do campo */
|
|
28
|
+
label?: string;
|
|
29
|
+
/** Descricao do campo */
|
|
30
|
+
description?: string;
|
|
31
|
+
/** Ultimo erro ocorrido */
|
|
32
|
+
error?: string;
|
|
33
|
+
/** Texto de sugestao */
|
|
34
|
+
placeholder?: string;
|
|
35
|
+
/** Indicador se o preenchimento e obrigatorio */
|
|
36
|
+
required?: boolean;
|
|
37
|
+
/** Indicador se o campo esta desabilitado */
|
|
38
|
+
disabled?: boolean;
|
|
39
|
+
/** Indicador se o campo e somente leitura */
|
|
40
|
+
readOnly?: boolean;
|
|
41
|
+
/** Numero maximo de emails permitidos */
|
|
42
|
+
max?: number;
|
|
43
|
+
/** Funcao customizada de validacao de email */
|
|
44
|
+
validateEmail?: (email: string) => boolean;
|
|
45
|
+
/** Evento quando o valor e alterado */
|
|
46
|
+
onChangeValue?: (emails: string[]) => void;
|
|
47
|
+
/** Evento quando o campo recebe o foco */
|
|
48
|
+
onFocusEnter?: FocusEventHandler<HTMLInputElement> | undefined;
|
|
49
|
+
/** Evento quando o foco sai do campo */
|
|
50
|
+
onFocusExit?: FocusEventHandler<HTMLInputElement> | undefined;
|
|
51
|
+
/** Referencia para o componente interno */
|
|
52
|
+
innerRef?: React.RefObject<HTMLDivElement> | undefined;
|
|
53
|
+
/** Estilo do componente */
|
|
54
|
+
style?: CSSProperties;
|
|
55
|
+
/** Classe CSS */
|
|
56
|
+
className?: string;
|
|
57
|
+
/** Largura do componente */
|
|
58
|
+
width?: string | number;
|
|
59
|
+
/** Tamanho do componente */
|
|
60
|
+
size?: MantineSize;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function ArchbaseMultiEmail<T, ID>({
|
|
64
|
+
dataSource,
|
|
65
|
+
dataField,
|
|
66
|
+
value,
|
|
67
|
+
defaultValue,
|
|
68
|
+
delimiter = ';',
|
|
69
|
+
label,
|
|
70
|
+
description,
|
|
71
|
+
error,
|
|
72
|
+
placeholder,
|
|
73
|
+
required,
|
|
74
|
+
disabled = false,
|
|
75
|
+
readOnly = false,
|
|
76
|
+
max,
|
|
77
|
+
validateEmail,
|
|
78
|
+
onChangeValue,
|
|
79
|
+
onFocusEnter,
|
|
80
|
+
onFocusExit,
|
|
81
|
+
innerRef,
|
|
82
|
+
style,
|
|
83
|
+
className,
|
|
84
|
+
width,
|
|
85
|
+
size,
|
|
86
|
+
}: ArchbaseMultiEmailProps<T, ID>) {
|
|
87
|
+
// Hook de compatibilidade V1/V2
|
|
88
|
+
const v1v2Compatibility = useArchbaseV1V2Compatibility<string[]>(
|
|
89
|
+
'ArchbaseMultiEmail',
|
|
90
|
+
dataSource,
|
|
91
|
+
dataField,
|
|
92
|
+
defaultValue ?? value ?? [],
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
const theme = useMantineTheme();
|
|
96
|
+
const { colorScheme } = useMantineColorScheme();
|
|
97
|
+
const forceUpdate = useForceUpdate();
|
|
98
|
+
const [internalError, setInternalError] = useState<string | undefined>(error);
|
|
99
|
+
|
|
100
|
+
// Contexto de validacao (opcional)
|
|
101
|
+
const validationContext = useValidationErrors();
|
|
102
|
+
const fieldKey = `${dataField}`;
|
|
103
|
+
const contextError = validationContext?.getError(fieldKey);
|
|
104
|
+
|
|
105
|
+
// Estado local dos emails
|
|
106
|
+
const [emails, setEmails] = useState<string[]>(defaultValue ?? value ?? []);
|
|
107
|
+
|
|
108
|
+
// Atualizar erro se prop mudar
|
|
109
|
+
useEffect(() => {
|
|
110
|
+
if (error !== undefined && error !== internalError) {
|
|
111
|
+
setInternalError(error);
|
|
112
|
+
}
|
|
113
|
+
}, [error]);
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Converte o valor vindo do datasource para string[].
|
|
117
|
+
* Se for string, faz split pelo delimitador; se for array, usa diretamente.
|
|
118
|
+
*/
|
|
119
|
+
const parseFieldValue = (fieldValue: any): string[] => {
|
|
120
|
+
if (!fieldValue) return [];
|
|
121
|
+
if (Array.isArray(fieldValue)) return fieldValue;
|
|
122
|
+
if (typeof fieldValue === 'string') {
|
|
123
|
+
return fieldValue
|
|
124
|
+
.split(delimiter)
|
|
125
|
+
.map((e) => e.trim())
|
|
126
|
+
.filter((e) => e.length > 0);
|
|
127
|
+
}
|
|
128
|
+
return [];
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Converte string[] para o formato de armazenamento no datasource.
|
|
133
|
+
* Se o campo original era string, junta com delimitador.
|
|
134
|
+
*/
|
|
135
|
+
const serializeValue = (emailList: string[]): any => {
|
|
136
|
+
if (dataSource && dataField) {
|
|
137
|
+
const currentFieldValue = dataSource.getFieldValue(dataField);
|
|
138
|
+
if (typeof currentFieldValue === 'string' || currentFieldValue === null || currentFieldValue === undefined) {
|
|
139
|
+
return emailList.join(delimiter);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return emailList;
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
const loadDataSourceFieldValue = () => {
|
|
146
|
+
let initialValue: string[] = defaultValue ?? value ?? [];
|
|
147
|
+
|
|
148
|
+
if (dataSource && dataField) {
|
|
149
|
+
const fieldValue = dataSource.getFieldValue(dataField);
|
|
150
|
+
initialValue = parseFieldValue(fieldValue);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
setEmails(initialValue);
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
const fieldChangedListener = useCallback(() => {
|
|
157
|
+
loadDataSourceFieldValue();
|
|
158
|
+
}, []);
|
|
159
|
+
|
|
160
|
+
const dataSourceEvent = useCallback(
|
|
161
|
+
(event: DataSourceEvent<T>) => {
|
|
162
|
+
if (dataSource && dataField) {
|
|
163
|
+
if (
|
|
164
|
+
event.type === DataSourceEventNames.dataChanged ||
|
|
165
|
+
event.type === DataSourceEventNames.recordChanged ||
|
|
166
|
+
event.type === DataSourceEventNames.afterScroll ||
|
|
167
|
+
event.type === DataSourceEventNames.afterCancel ||
|
|
168
|
+
event.type === DataSourceEventNames.afterEdit
|
|
169
|
+
) {
|
|
170
|
+
loadDataSourceFieldValue();
|
|
171
|
+
if (!v1v2Compatibility.isDataSourceV2) {
|
|
172
|
+
forceUpdate();
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (event.type === DataSourceEventNames.onFieldError && event.fieldName === dataField) {
|
|
177
|
+
setInternalError(event.error);
|
|
178
|
+
validationContext?.setError(fieldKey, event.error);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
[v1v2Compatibility.isDataSourceV2, validationContext, fieldKey],
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
// Ref para manter callback sempre atualizado
|
|
186
|
+
const dataSourceEventRef = useRef(dataSourceEvent);
|
|
187
|
+
useEffect(() => {
|
|
188
|
+
dataSourceEventRef.current = dataSourceEvent;
|
|
189
|
+
}, [dataSourceEvent]);
|
|
190
|
+
|
|
191
|
+
// Wrapper estavel que delega para ref
|
|
192
|
+
const stableDataSourceEvent = useCallback((event: DataSourceEvent<T>) => {
|
|
193
|
+
dataSourceEventRef.current(event);
|
|
194
|
+
}, []);
|
|
195
|
+
|
|
196
|
+
// Registrar listeners com cleanup
|
|
197
|
+
useEffect(() => {
|
|
198
|
+
loadDataSourceFieldValue();
|
|
199
|
+
if (dataSource && dataField) {
|
|
200
|
+
const hasFieldListener = typeof (dataSource as any).addFieldChangeListener === 'function';
|
|
201
|
+
dataSource.addListener(stableDataSourceEvent);
|
|
202
|
+
if (hasFieldListener) {
|
|
203
|
+
(dataSource as any).addFieldChangeListener(dataField, fieldChangedListener);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return () => {
|
|
207
|
+
dataSource.removeListener(stableDataSourceEvent);
|
|
208
|
+
if (hasFieldListener) {
|
|
209
|
+
(dataSource as any).removeFieldChangeListener(dataField, fieldChangedListener);
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
}, [dataSource, dataField, stableDataSourceEvent, fieldChangedListener]);
|
|
214
|
+
|
|
215
|
+
useArchbaseDidUpdate(() => {
|
|
216
|
+
loadDataSourceFieldValue();
|
|
217
|
+
}, []);
|
|
218
|
+
|
|
219
|
+
// Sincronizar com prop value quando nao ha datasource
|
|
220
|
+
useEffect(() => {
|
|
221
|
+
if (!dataSource && value !== undefined) {
|
|
222
|
+
setEmails(value);
|
|
223
|
+
}
|
|
224
|
+
}, [value, dataSource]);
|
|
225
|
+
|
|
226
|
+
const isReadOnly = (): boolean => {
|
|
227
|
+
let tmpReadOnly = readOnly;
|
|
228
|
+
if (dataSource && !readOnly) {
|
|
229
|
+
tmpReadOnly = dataSource.isBrowsing();
|
|
230
|
+
}
|
|
231
|
+
return tmpReadOnly;
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
const handleChange = (newEmails: string[]) => {
|
|
235
|
+
// Limpa erro ao editar
|
|
236
|
+
const hasError = internalError || contextError;
|
|
237
|
+
if (hasError) {
|
|
238
|
+
setInternalError(undefined);
|
|
239
|
+
validationContext?.clearError(fieldKey);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Aplicar limite max
|
|
243
|
+
const limitedEmails = max ? newEmails.slice(0, max) : newEmails;
|
|
244
|
+
|
|
245
|
+
setEmails(limitedEmails);
|
|
246
|
+
|
|
247
|
+
// Persistir no datasource
|
|
248
|
+
if (dataSource && !dataSource.isBrowsing() && dataField) {
|
|
249
|
+
const serialized = serializeValue(limitedEmails);
|
|
250
|
+
if (dataSource.getFieldValue(dataField) !== serialized) {
|
|
251
|
+
v1v2Compatibility.handleValueChange(limitedEmails);
|
|
252
|
+
dataSource.setFieldValue(dataField, serialized);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (onChangeValue) {
|
|
257
|
+
onChangeValue(limitedEmails);
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
const handleRemoveEmail = (index: number) => {
|
|
262
|
+
if (isReadOnly() || disabled) return;
|
|
263
|
+
const newEmails = [...emails];
|
|
264
|
+
newEmails.splice(index, 1);
|
|
265
|
+
handleChange(newEmails);
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
const displayError = internalError || contextError;
|
|
269
|
+
const isDark = colorScheme === 'dark';
|
|
270
|
+
|
|
271
|
+
return (
|
|
272
|
+
<Input.Wrapper
|
|
273
|
+
label={label}
|
|
274
|
+
description={description}
|
|
275
|
+
error={displayError}
|
|
276
|
+
required={required}
|
|
277
|
+
style={{ width, ...style }}
|
|
278
|
+
className={className}
|
|
279
|
+
size={size}
|
|
280
|
+
>
|
|
281
|
+
<div
|
|
282
|
+
ref={innerRef}
|
|
283
|
+
style={{
|
|
284
|
+
border: `1px solid ${
|
|
285
|
+
displayError
|
|
286
|
+
? theme.colors.red[isDark ? 4 : 6]
|
|
287
|
+
: isDark
|
|
288
|
+
? theme.colors.dark[4]
|
|
289
|
+
: theme.colors.gray[4]
|
|
290
|
+
}`,
|
|
291
|
+
borderRadius: theme.radius.sm,
|
|
292
|
+
padding: '6px 8px',
|
|
293
|
+
minHeight: 36,
|
|
294
|
+
backgroundColor: disabled
|
|
295
|
+
? isDark
|
|
296
|
+
? theme.colors.dark[6]
|
|
297
|
+
: theme.colors.gray[1]
|
|
298
|
+
: isDark
|
|
299
|
+
? theme.colors.dark[6]
|
|
300
|
+
: theme.white,
|
|
301
|
+
opacity: disabled ? 0.6 : 1,
|
|
302
|
+
cursor: disabled || isReadOnly() ? 'not-allowed' : undefined,
|
|
303
|
+
}}
|
|
304
|
+
>
|
|
305
|
+
{isReadOnly() || disabled ? (
|
|
306
|
+
<Group gap={4} style={{ flexWrap: 'wrap' }}>
|
|
307
|
+
{emails.length === 0 && (
|
|
308
|
+
<span
|
|
309
|
+
style={{
|
|
310
|
+
color: isDark ? theme.colors.dark[3] : theme.colors.gray[5],
|
|
311
|
+
fontSize: theme.fontSizes[size ?? 'sm'],
|
|
312
|
+
}}
|
|
313
|
+
>
|
|
314
|
+
{placeholder}
|
|
315
|
+
</span>
|
|
316
|
+
)}
|
|
317
|
+
{emails.map((email, index) => (
|
|
318
|
+
<Badge
|
|
319
|
+
key={`${email}-${index}`}
|
|
320
|
+
variant={isDark ? 'light' : 'outline'}
|
|
321
|
+
size={size ?? 'sm'}
|
|
322
|
+
style={{ textTransform: 'none' }}
|
|
323
|
+
>
|
|
324
|
+
{email}
|
|
325
|
+
</Badge>
|
|
326
|
+
))}
|
|
327
|
+
</Group>
|
|
328
|
+
) : (
|
|
329
|
+
<ReactMultiEmail
|
|
330
|
+
placeholder={placeholder}
|
|
331
|
+
emails={emails}
|
|
332
|
+
onChange={handleChange}
|
|
333
|
+
validateEmail={validateEmail}
|
|
334
|
+
onFocus={onFocusEnter as any}
|
|
335
|
+
onBlur={onFocusExit as any}
|
|
336
|
+
style={{
|
|
337
|
+
border: 'none',
|
|
338
|
+
padding: 0,
|
|
339
|
+
minHeight: 'auto',
|
|
340
|
+
backgroundColor: 'transparent',
|
|
341
|
+
}}
|
|
342
|
+
getLabel={(email, index, removeEmail) => (
|
|
343
|
+
<Badge
|
|
344
|
+
key={`${email}-${index}`}
|
|
345
|
+
variant={isDark ? 'light' : 'outline'}
|
|
346
|
+
size={size ?? 'sm'}
|
|
347
|
+
style={{ textTransform: 'none', marginRight: 4, marginBottom: 2 }}
|
|
348
|
+
rightSection={
|
|
349
|
+
<CloseButton
|
|
350
|
+
size="xs"
|
|
351
|
+
variant="transparent"
|
|
352
|
+
onClick={() => removeEmail(index)}
|
|
353
|
+
tabIndex={-1}
|
|
354
|
+
/>
|
|
355
|
+
}
|
|
356
|
+
>
|
|
357
|
+
{email}
|
|
358
|
+
</Badge>
|
|
359
|
+
)}
|
|
360
|
+
/>
|
|
361
|
+
)}
|
|
362
|
+
</div>
|
|
363
|
+
</Input.Wrapper>
|
|
364
|
+
);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
ArchbaseMultiEmail.displayName = 'ArchbaseMultiEmail';
|