@bigbinary/neeto-atoms 1.0.111 → 1.0.113
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/{MultiEmailInput-Bzd2dPFC.js → MultiEmailInput-DFWfld8K.js} +58 -26
- package/dist/MultiEmailInput-DFWfld8K.js.map +1 -0
- package/dist/{TranslationProvider-CtJI6HJ4.js → TranslationProvider-Dd0ITHC0.js} +11 -1
- package/dist/{TranslationProvider-CtJI6HJ4.js.map → TranslationProvider-Dd0ITHC0.js.map} +1 -1
- package/dist/cjs/{MultiEmailInput-FNRR9b74.js → MultiEmailInput-CW0TQEU2.js} +58 -26
- package/dist/cjs/MultiEmailInput-CW0TQEU2.js.map +1 -0
- package/dist/cjs/{TranslationProvider-BgCNBYs8.js → TranslationProvider-DOeyGtbV.js} +11 -1
- package/dist/cjs/{TranslationProvider-BgCNBYs8.js.map → TranslationProvider-DOeyGtbV.js.map} +1 -1
- package/dist/cjs/components/MultiEmailInput.js +2 -2
- package/dist/cjs/components/TranslationProvider.js +1 -1
- package/dist/cjs/components/index.js +2 -2
- package/dist/cjs/formik/MultiEmailInput.js +2 -2
- package/dist/cjs/formik/index.js +1 -1
- package/dist/cjs/index.js +2 -2
- package/dist/cjs/primitives/DropdownMenu.js +1 -0
- package/dist/cjs/primitives/DropdownMenu.js.map +1 -1
- package/dist/components/MultiEmailInput/constants.d.ts +16 -1
- package/dist/components/MultiEmailInput/index.d.ts +1 -1
- package/dist/components/MultiEmailInput/types.d.ts +13 -7
- package/dist/components/MultiEmailInput/utils.d.ts +5 -5
- package/dist/components/MultiEmailInput.js +2 -2
- package/dist/components/TranslationProvider.js +1 -1
- package/dist/components/index.js +2 -2
- package/dist/formik/MultiEmailInput.js +2 -2
- package/dist/formik/index.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/primitives/DropdownMenu.js +1 -0
- package/dist/primitives/DropdownMenu.js.map +1 -1
- package/dist/translations/index.d.ts +10 -0
- package/package.json +1 -1
- package/dist/MultiEmailInput-Bzd2dPFC.js.map +0 -1
- package/dist/cjs/MultiEmailInput-FNRR9b74.js.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { useState, useCallback, useMemo, forwardRef, useId } from 'react';
|
|
3
|
+
import { useTranslation } from 'react-i18next';
|
|
3
4
|
import { c as cn } from './utils-BJnb9o5c.js';
|
|
4
5
|
import { Field, FieldLabel, FieldContent } from './primitives/Field.js';
|
|
5
6
|
import { b as buildTestIdPrefix } from './fieldIds-VpluAAMl.js';
|
|
@@ -9,14 +10,23 @@ import { X } from './x-_o2T3n6D.js';
|
|
|
9
10
|
|
|
10
11
|
const EMAIL_REGEX = /^[A-Z0-9._%+-]+@[A-Z0-9-]+(?:\.[A-Z0-9-]+)*\.[A-Z]{2,}$/i;
|
|
11
12
|
const UNSTRICT_EMAIL_REGEX = /(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))/g;
|
|
12
|
-
const
|
|
13
|
+
const DOMAIN_REGEX = /^(?:[a-zA-Z0-9-]{1,63}\.)+[a-zA-Z0-9-]{2,63}$/;
|
|
14
|
+
const SEPARATION_REGEX = /[^\s,]+/g;
|
|
15
|
+
const VALIDATION_REGEX = {
|
|
16
|
+
email: EMAIL_REGEX,
|
|
17
|
+
domain: DOMAIN_REGEX
|
|
18
|
+
};
|
|
19
|
+
const ENTITY_FALLBACK = {
|
|
20
|
+
email: { one: "email", other: "emails" },
|
|
21
|
+
domain: { one: "domain", other: "domains" }
|
|
22
|
+
};
|
|
13
23
|
|
|
14
|
-
const formatEmailInputOption = (email) => ({
|
|
24
|
+
const formatEmailInputOption = (email, entryType = "email") => ({
|
|
15
25
|
label: email,
|
|
16
26
|
value: email,
|
|
17
|
-
valid:
|
|
27
|
+
valid: VALIDATION_REGEX[entryType].test(email)
|
|
18
28
|
});
|
|
19
|
-
const pruneDuplicates = (existing, newEmailStrings) => {
|
|
29
|
+
const pruneDuplicates = (existing, newEmailStrings, entryType = "email") => {
|
|
20
30
|
const seen = new Set(existing.map((e) => e.value.toLowerCase()));
|
|
21
31
|
const duplicates = [];
|
|
22
32
|
const added = [];
|
|
@@ -26,20 +36,21 @@ const pruneDuplicates = (existing, newEmailStrings) => {
|
|
|
26
36
|
duplicates.push(emailStr);
|
|
27
37
|
} else {
|
|
28
38
|
seen.add(lower);
|
|
29
|
-
added.push(formatEmailInputOption(emailStr));
|
|
39
|
+
added.push(formatEmailInputOption(emailStr, entryType));
|
|
30
40
|
}
|
|
31
41
|
}
|
|
32
42
|
return { uniqueEmails: [...existing, ...added], duplicates };
|
|
33
43
|
};
|
|
34
44
|
const filterValidEmails = (emails) => emails.filter((email) => email.valid);
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
45
|
+
const getEntityLabel = (t, entryType, count) => t(
|
|
46
|
+
`neetoatoms.multiEmailInput.${entryType}`,
|
|
47
|
+
ENTITY_FALLBACK[entryType][count === 1 ? "one" : "other"],
|
|
48
|
+
{ count }
|
|
49
|
+
);
|
|
40
50
|
|
|
41
51
|
function useMultiEmailState(props) {
|
|
42
52
|
const {
|
|
53
|
+
entryType = "email",
|
|
43
54
|
value = [],
|
|
44
55
|
onChange,
|
|
45
56
|
onBlur,
|
|
@@ -55,16 +66,19 @@ function useMultiEmailState(props) {
|
|
|
55
66
|
(input) => {
|
|
56
67
|
const trimmed = input.trim();
|
|
57
68
|
if (!trimmed) return;
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
69
|
+
const separated = trimmed.match(SEPARATION_REGEX) || [];
|
|
70
|
+
const matches = entryType === "email" ? trimmed.match(UNSTRICT_EMAIL_REGEX) || separated : separated;
|
|
71
|
+
if (matches.length === 0) return;
|
|
72
|
+
const { uniqueEmails, duplicates } = pruneDuplicates(
|
|
73
|
+
value,
|
|
74
|
+
matches,
|
|
75
|
+
entryType
|
|
76
|
+
);
|
|
63
77
|
onChange?.(uniqueEmails);
|
|
64
78
|
setDuplicateEmails(duplicates);
|
|
65
79
|
setInputValue("");
|
|
66
80
|
},
|
|
67
|
-
[value, onChange]
|
|
81
|
+
[value, onChange, entryType]
|
|
68
82
|
);
|
|
69
83
|
const handleKeyDown = useCallback(
|
|
70
84
|
(event) => {
|
|
@@ -139,6 +153,7 @@ const CHIPS_CONTAINER = "flex min-h-8 flex-wrap items-center gap-1 rounded-lg bo
|
|
|
139
153
|
const CHIPS_ERROR = "border-destructive ring-3 ring-destructive/20 dark:border-destructive/50 dark:ring-destructive/40";
|
|
140
154
|
const MultiEmailInput = forwardRef((props, ref) => {
|
|
141
155
|
const {
|
|
156
|
+
entryType = "email",
|
|
142
157
|
label,
|
|
143
158
|
placeholder = "",
|
|
144
159
|
helpText,
|
|
@@ -155,6 +170,7 @@ const MultiEmailInput = forwardRef((props, ref) => {
|
|
|
155
170
|
dataTestId
|
|
156
171
|
} = props;
|
|
157
172
|
const id = useId();
|
|
173
|
+
const { t } = useTranslation();
|
|
158
174
|
const testIdPrefix = buildTestIdPrefix(dataTestId, label);
|
|
159
175
|
const {
|
|
160
176
|
isCounterVisible,
|
|
@@ -199,7 +215,7 @@ const MultiEmailInput = forwardRef((props, ref) => {
|
|
|
199
215
|
children: [
|
|
200
216
|
validCount,
|
|
201
217
|
" ",
|
|
202
|
-
typeof counter === "object" && counter?.label ? counter.label :
|
|
218
|
+
typeof counter === "object" && counter?.label ? counter.label : getEntityLabel(t, entryType, validCount)
|
|
203
219
|
]
|
|
204
220
|
}
|
|
205
221
|
)
|
|
@@ -231,7 +247,13 @@ const MultiEmailInput = forwardRef((props, ref) => {
|
|
|
231
247
|
className: "-ms-0.5 rounded-xs opacity-50 hover:opacity-100",
|
|
232
248
|
onMouseDown: (e) => e.preventDefault(),
|
|
233
249
|
onClick: () => handleChipRemove(email.value),
|
|
234
|
-
"aria-label":
|
|
250
|
+
"aria-label": t(
|
|
251
|
+
"neetoatoms.multiEmailInput.remove",
|
|
252
|
+
"Remove {{label}}",
|
|
253
|
+
{
|
|
254
|
+
label: email.label
|
|
255
|
+
}
|
|
256
|
+
),
|
|
235
257
|
children: /* @__PURE__ */ jsx(X, { className: "size-3 pointer-events-none" })
|
|
236
258
|
}
|
|
237
259
|
)
|
|
@@ -239,11 +261,9 @@ const MultiEmailInput = forwardRef((props, ref) => {
|
|
|
239
261
|
},
|
|
240
262
|
email.value
|
|
241
263
|
)),
|
|
242
|
-
hiddenCount > 0 && /* @__PURE__ */
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
" more"
|
|
246
|
-
] }),
|
|
264
|
+
hiddenCount > 0 && /* @__PURE__ */ jsx("span", { className: "flex h-[calc(--spacing(5.25))] items-center rounded-sm bg-secondary px-1.5 text-xs font-medium text-secondary-foreground", children: t("neetoatoms.multiEmailInput.hiddenCount", "+{{total}} more", {
|
|
265
|
+
total: hiddenCount
|
|
266
|
+
}) }),
|
|
247
267
|
/* @__PURE__ */ jsx(
|
|
248
268
|
"input",
|
|
249
269
|
{
|
|
@@ -280,7 +300,11 @@ const MultiEmailInput = forwardRef((props, ref) => {
|
|
|
280
300
|
type: "button",
|
|
281
301
|
className: "ml-1 cursor-pointer font-semibold underline",
|
|
282
302
|
onClick: handleFilterInvalidEmails,
|
|
283
|
-
children: filterInvalidEmails?.label ??
|
|
303
|
+
children: filterInvalidEmails?.label ?? t(
|
|
304
|
+
"neetoatoms.multiEmailInput.removeInvalid",
|
|
305
|
+
"Click here to remove invalid {{entity}}.",
|
|
306
|
+
{ entity: getEntityLabel(t, entryType, 0) }
|
|
307
|
+
)
|
|
284
308
|
}
|
|
285
309
|
)
|
|
286
310
|
]
|
|
@@ -299,7 +323,15 @@ const MultiEmailInput = forwardRef((props, ref) => {
|
|
|
299
323
|
{
|
|
300
324
|
className: "text-[0.8rem] text-amber-600 dark:text-amber-400",
|
|
301
325
|
"data-testid": `${testIdPrefix}-duplicate-emails-warning`,
|
|
302
|
-
children:
|
|
326
|
+
children: t(
|
|
327
|
+
"neetoatoms.multiEmailInput.duplicateWarning",
|
|
328
|
+
"Removed {{total}} duplicate {{entity}} from the list: {{items}}",
|
|
329
|
+
{
|
|
330
|
+
total: duplicateEmails.length,
|
|
331
|
+
entity: getEntityLabel(t, entryType, duplicateEmails.length),
|
|
332
|
+
items: duplicateEmails.join(", ")
|
|
333
|
+
}
|
|
334
|
+
)
|
|
303
335
|
}
|
|
304
336
|
)
|
|
305
337
|
] })
|
|
@@ -310,4 +342,4 @@ const MultiEmailInput = forwardRef((props, ref) => {
|
|
|
310
342
|
MultiEmailInput.displayName = "MultiEmailInput";
|
|
311
343
|
|
|
312
344
|
export { MultiEmailInput as M };
|
|
313
|
-
//# sourceMappingURL=MultiEmailInput-
|
|
345
|
+
//# sourceMappingURL=MultiEmailInput-DFWfld8K.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiEmailInput-DFWfld8K.js","sources":["../src/components/MultiEmailInput/constants.ts","../src/components/MultiEmailInput/utils.ts","../src/components/MultiEmailInput/useMultiEmailState.ts","../src/components/MultiEmailInput/MultiEmailInput.tsx"],"sourcesContent":["export const EMAIL_REGEX =\n /^[A-Z0-9._%+-]+@[A-Z0-9-]+(?:\\.[A-Z0-9-]+)*\\.[A-Z]{2,}$/i;\n\nexport const UNSTRICT_EMAIL_REGEX =\n /(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))/g;\n\nexport const DOMAIN_REGEX = /^(?:[a-zA-Z0-9-]{1,63}\\.)+[a-zA-Z0-9-]{2,63}$/;\n\nexport const SEPARATION_REGEX = /[^\\s,]+/g;\n\nexport const VALIDATION_REGEX = {\n email: EMAIL_REGEX,\n domain: DOMAIN_REGEX,\n} as const;\n\nexport const ENTITY_FALLBACK = {\n email: { one: \"email\", other: \"emails\" },\n domain: { one: \"domain\", other: \"domains\" },\n} as const;\n","import type { TFunction } from \"i18next\";\n\nimport { ENTITY_FALLBACK, VALIDATION_REGEX } from \"./constants\";\nimport type { EmailValue, EntryType } from \"./types\";\n\nexport const formatEmailInputOption = (\n email: string,\n entryType: EntryType = \"email\"\n): EmailValue => ({\n label: email,\n value: email,\n valid: VALIDATION_REGEX[entryType].test(email),\n});\n\nexport const pruneDuplicates = (\n existing: EmailValue[],\n newEmailStrings: string[],\n entryType: EntryType = \"email\"\n): { uniqueEmails: EmailValue[]; duplicates: string[] } => {\n const seen = new Set(existing.map(e => e.value.toLowerCase()));\n const duplicates: string[] = [];\n const added: EmailValue[] = [];\n\n for (const emailStr of newEmailStrings) {\n const lower = emailStr.toLowerCase();\n if (seen.has(lower)) {\n duplicates.push(emailStr);\n } else {\n seen.add(lower);\n added.push(formatEmailInputOption(emailStr, entryType));\n }\n }\n\n return { uniqueEmails: [...existing, ...added], duplicates };\n};\n\nexport const filterValidEmails = (emails: EmailValue[]): EmailValue[] =>\n emails.filter(email => email.valid);\n\nexport const getEntityLabel = (\n t: TFunction,\n entryType: EntryType,\n count: number\n): string =>\n t(\n `neetoatoms.multiEmailInput.${entryType}`,\n ENTITY_FALLBACK[entryType][count === 1 ? \"one\" : \"other\"],\n { count }\n );\n","import { useState, useCallback, useMemo } from \"react\";\n\nimport { UNSTRICT_EMAIL_REGEX, SEPARATION_REGEX } from \"./constants\";\nimport { pruneDuplicates, filterValidEmails } from \"./utils\";\nimport type { MultiEmailInputProps } from \"./types\";\n\nexport function useMultiEmailState(props: MultiEmailInputProps) {\n const {\n entryType = \"email\",\n value = [],\n onChange,\n onBlur,\n visibleEmailsCount = 3,\n isAlwaysExpanded = false,\n counter,\n filterInvalidEmails,\n } = props;\n\n const [inputValue, setInputValue] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const [duplicateEmails, setDuplicateEmails] = useState<string[]>([]);\n\n const addEmails = useCallback(\n (input: string) => {\n const trimmed = input.trim();\n if (!trimmed) return;\n const separated = trimmed.match(SEPARATION_REGEX) || [];\n const matches =\n entryType === \"email\"\n ? trimmed.match(UNSTRICT_EMAIL_REGEX) || separated\n : separated;\n if (matches.length === 0) return;\n const { uniqueEmails, duplicates } = pruneDuplicates(\n value,\n matches,\n entryType\n );\n onChange?.(uniqueEmails);\n setDuplicateEmails(duplicates);\n setInputValue(\"\");\n },\n [value, onChange, entryType]\n );\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (!inputValue && event.key === \"Backspace\" && value.length > 0) {\n onChange?.(value.slice(0, -1));\n return;\n }\n if (!inputValue) return;\n if ([\"Enter\", \"Tab\", \",\", \" \"].includes(event.key)) {\n addEmails(inputValue);\n event.preventDefault();\n event.stopPropagation();\n }\n },\n [inputValue, value, onChange, addEmails]\n );\n\n const handlePaste = useCallback(\n (event: React.ClipboardEvent<HTMLInputElement>) => {\n const text = event.clipboardData.getData(\"text\");\n if (!text) return;\n event.preventDefault();\n addEmails(text);\n },\n [addEmails]\n );\n\n const handleBlur = useCallback(() => {\n if (inputValue) {\n addEmails(inputValue);\n } else {\n onBlur?.();\n }\n setIsFocused(false);\n setDuplicateEmails([]);\n }, [inputValue, addEmails, onBlur]);\n\n const handleFocus = useCallback(() => setIsFocused(true), []);\n\n const handleChipRemove = useCallback(\n (emailValue: string) =>\n onChange?.(value.filter(e => e.value !== emailValue)),\n [value, onChange]\n );\n\n const handleFilterInvalidEmails = useCallback(\n () => onChange?.(filterValidEmails(value)),\n [value, onChange]\n );\n\n const validCount = useMemo(() => value.filter(e => e.valid).length, [value]);\n const isCounterVisible =\n !!counter &&\n (typeof counter === \"boolean\" ||\n !counter.startsFrom ||\n validCount >= counter.startsFrom);\n const shouldCollapse =\n !isAlwaysExpanded && !isFocused && value.length > visibleEmailsCount;\n const visibleEmails = shouldCollapse\n ? value.slice(0, visibleEmailsCount)\n : value;\n const hiddenCount = shouldCollapse ? value.length - visibleEmailsCount : 0;\n const isFilterLinkVisible =\n !!filterInvalidEmails && value.length > validCount;\n\n return {\n inputValue,\n setInputValue,\n isFocused,\n duplicateEmails,\n handleKeyDown,\n handlePaste,\n handleBlur,\n handleFocus,\n handleChipRemove,\n handleFilterInvalidEmails,\n isCounterVisible,\n validCount,\n visibleEmails,\n hiddenCount,\n isFilterLinkVisible,\n };\n}\n","import { forwardRef, useId } from \"react\";\nimport { XIcon } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { Field, FieldLabel, FieldContent } from \"src/primitives/Field\";\nimport { buildTestIdPrefix } from \"src/utils/fieldIds\";\nimport { hyphenize } from \"src/utils/hyphenize\";\nimport { withIconSize } from \"src/utils/withIconSize\";\nimport { useMultiEmailState } from \"./useMultiEmailState\";\nimport { getEntityLabel } from \"./utils\";\nimport type { MultiEmailInputProps } from \"./types\";\n\nconst CHIP_BASE =\n \"flex h-[calc(--spacing(5.25))] w-fit items-center justify-center gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground\";\nconst CHIP_INVALID =\n \"border border-destructive text-destructive bg-destructive/10\";\nconst CHIPS_CONTAINER =\n \"flex min-h-8 flex-wrap items-center gap-1 rounded-lg border border-input bg-transparent bg-clip-padding px-2.5 py-1 text-base md:text-sm transition-colors focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50\";\nconst CHIPS_ERROR =\n \"border-destructive ring-3 ring-destructive/20 dark:border-destructive/50 dark:ring-destructive/40\";\n\nexport const MultiEmailInput = forwardRef<\n HTMLInputElement,\n MultiEmailInputProps\n>((props, ref) => {\n const {\n entryType = \"email\",\n label,\n placeholder = \"\",\n helpText,\n error,\n disabled = false,\n required = false,\n maxHeight = 200,\n counter,\n filterInvalidEmails,\n prefix,\n suffix,\n labelProps,\n className,\n dataTestId,\n } = props;\n const id = useId();\n const { t } = useTranslation();\n const testIdPrefix = buildTestIdPrefix(dataTestId, label);\n const {\n isCounterVisible,\n validCount,\n visibleEmails,\n hiddenCount,\n inputValue,\n setInputValue,\n handleKeyDown,\n handlePaste,\n handleFocus,\n handleBlur,\n handleChipRemove,\n isFilterLinkVisible,\n handleFilterInvalidEmails,\n duplicateEmails,\n } = useMultiEmailState(props);\n\n return (\n <Field\n className={cn(\"flex flex-col gap-1.5\", className)}\n data-testid=\"email-input-wrapper\"\n >\n {(label || isCounterVisible) && (\n <div className=\"flex items-center justify-between\">\n {label && (\n <FieldLabel\n htmlFor={id}\n data-testid={`${testIdPrefix}-input-label`}\n {...labelProps}\n >\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n {\" *\"}\n </span>\n )}\n </FieldLabel>\n )}\n {isCounterVisible && (\n <span\n className=\"text-xs text-muted-foreground\"\n data-testid={`${testIdPrefix}-email-counter`}\n >\n {validCount}{\" \"}\n {typeof counter === \"object\" && counter?.label\n ? counter.label\n : getEntityLabel(t, entryType, validCount)}\n </span>\n )}\n </div>\n )}\n <div\n data-testid=\"multi-email-select-container\"\n className={cn(\n CHIPS_CONTAINER,\n !!error && CHIPS_ERROR,\n disabled && \"pointer-events-none opacity-50\"\n )}\n style={{ maxHeight: `${maxHeight}px`, overflowY: \"auto\" }}\n >\n {prefix && (\n <div className=\"shrink-0 text-muted-foreground\">\n {withIconSize(prefix, \"size-4\")}\n </div>\n )}\n {visibleEmails.map(email => (\n <span\n key={email.value}\n className={cn(CHIP_BASE, !email.valid && CHIP_INVALID)}\n >\n {email.label}\n {!disabled && (\n <button\n type=\"button\"\n tabIndex={-1}\n data-testid={`${hyphenize(email.label)}-remove-icon`}\n className=\"-ms-0.5 rounded-xs opacity-50 hover:opacity-100\"\n onMouseDown={e => e.preventDefault()}\n onClick={() => handleChipRemove(email.value)}\n aria-label={t(\n \"neetoatoms.multiEmailInput.remove\",\n \"Remove {{label}}\",\n {\n label: email.label,\n }\n )}\n >\n <XIcon className=\"size-3 pointer-events-none\" />\n </button>\n )}\n </span>\n ))}\n {hiddenCount > 0 && (\n <span className=\"flex h-[calc(--spacing(5.25))] items-center rounded-sm bg-secondary px-1.5 text-xs font-medium text-secondary-foreground\">\n {t(\"neetoatoms.multiEmailInput.hiddenCount\", \"+{{total}} more\", {\n total: hiddenCount,\n })}\n </span>\n )}\n <input\n ref={ref}\n id={id}\n type=\"text\"\n data-testid=\"email-select-input-field\"\n value={inputValue}\n onChange={e => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={props.value?.length ? \"\" : placeholder}\n disabled={disabled}\n className=\"min-w-16 flex-1 bg-transparent text-base outline-none placeholder:text-muted-foreground md:text-sm\"\n />\n {suffix && (\n <div className=\"shrink-0 text-muted-foreground\">\n {withIconSize(suffix, \"size-4\")}\n </div>\n )}\n </div>\n <FieldContent>\n {!!error && (\n <p\n className=\"text-[0.8rem] text-destructive\"\n data-testid={`${testIdPrefix}-input-error`}\n >\n {error}\n {isFilterLinkVisible && (\n <button\n type=\"button\"\n className=\"ml-1 cursor-pointer font-semibold underline\"\n onClick={handleFilterInvalidEmails}\n >\n {filterInvalidEmails?.label ??\n t(\n \"neetoatoms.multiEmailInput.removeInvalid\",\n \"Click here to remove invalid {{entity}}.\",\n { entity: getEntityLabel(t, entryType, 0) }\n )}\n </button>\n )}\n </p>\n )}\n {!!helpText && (\n <p\n className=\"text-[0.8rem] text-muted-foreground\"\n data-testid={`${testIdPrefix}-input-help`}\n >\n {helpText}\n </p>\n )}\n {duplicateEmails.length > 0 && (\n <p\n className=\"text-[0.8rem] text-amber-600 dark:text-amber-400\"\n data-testid={`${testIdPrefix}-duplicate-emails-warning`}\n >\n {t(\n \"neetoatoms.multiEmailInput.duplicateWarning\",\n \"Removed {{total}} duplicate {{entity}} from the list: {{items}}\",\n {\n total: duplicateEmails.length,\n entity: getEntityLabel(t, entryType, duplicateEmails.length),\n items: duplicateEmails.join(\", \"),\n }\n )}\n </p>\n )}\n </FieldContent>\n </Field>\n );\n});\nMultiEmailInput.displayName = \"MultiEmailInput\";\n"],"names":["XIcon"],"mappings":"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"}
|
|
@@ -65,6 +65,16 @@ var neetoatoms = {
|
|
|
65
65
|
toastr: {
|
|
66
66
|
copyMessage: "Copy this error message",
|
|
67
67
|
copied: "Copied!"
|
|
68
|
+
},
|
|
69
|
+
multiEmailInput: {
|
|
70
|
+
email_one: "email",
|
|
71
|
+
email_other: "emails",
|
|
72
|
+
domain_one: "domain",
|
|
73
|
+
domain_other: "domains",
|
|
74
|
+
hiddenCount: "+{{total}} more",
|
|
75
|
+
remove: "Remove {{label}}",
|
|
76
|
+
removeInvalid: "Click here to remove invalid {{entity}}.",
|
|
77
|
+
duplicateWarning: "Removed {{total}} duplicate {{entity}} from the list: {{items}}"
|
|
68
78
|
}
|
|
69
79
|
};
|
|
70
80
|
var enTranslations = {
|
|
@@ -100,4 +110,4 @@ const TranslationProvider = ({
|
|
|
100
110
|
TranslationProvider.displayName = "TranslationProvider";
|
|
101
111
|
|
|
102
112
|
export { TranslationProvider as T, resources as r };
|
|
103
|
-
//# sourceMappingURL=TranslationProvider-
|
|
113
|
+
//# sourceMappingURL=TranslationProvider-Dd0ITHC0.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TranslationProvider-
|
|
1
|
+
{"version":3,"file":"TranslationProvider-Dd0ITHC0.js","sources":["../src/translations/index.ts","../src/components/TranslationProvider/i18n.ts","../src/components/TranslationProvider/TranslationProvider.tsx"],"sourcesContent":["import enTranslations from \"./en.json\";\n\nexport const resources = {\n en: { translation: enTranslations },\n};\n","import i18n from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\n\nimport { resources } from \"src/translations\";\n\nexport const initializeI18n = (language = \"en\") => {\n i18n.use(initReactI18next).init({\n resources,\n lng: language,\n fallbackLng: \"en\",\n interpolation: { escapeValue: false },\n });\n\n return i18n;\n};\n","import { useEffect } from \"react\";\n\nimport { I18nextProvider } from \"react-i18next\";\n\nimport { initializeI18n } from \"./i18n\";\nimport type { TranslationProviderProps } from \"./types\";\n\nconst TranslationProvider = ({\n children,\n language = \"en\",\n}: TranslationProviderProps) => {\n const i18n = initializeI18n(language);\n\n useEffect(() => {\n if (i18n.language !== language) {\n i18n.changeLanguage(language);\n }\n }, [language, i18n]);\n\n return <I18nextProvider i18n={i18n}>{children}</I18nextProvider>;\n};\n\nTranslationProvider.displayName = \"TranslationProvider\";\n\nexport { TranslationProvider };\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEO,MAAM,SAAA,GAAY;AAAA,EACvB,EAAA,EAAI,EAAE,WAAA,EAAa,cAAA;AACrB;;ACCO,MAAM,cAAA,GAAiB,CAAC,QAAA,GAAW,IAAA,KAAS;AACjD,EAAA,IAAA,CAAK,GAAA,CAAI,gBAAgB,CAAA,CAAE,IAAA,CAAK;AAAA,IAC9B,SAAA;AAAA,IACA,GAAA,EAAK,QAAA;AAAA,IACL,WAAA,EAAa,IAAA;AAAA,IACb,aAAA,EAAe,EAAE,WAAA,EAAa,KAAA;AAAM,GACrC,CAAA;AAED,EAAA,OAAO,IAAA;AACT,CAAA;;ACPA,MAAM,sBAAsB,CAAC;AAAA,EAC3B,QAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,KAAgC;AAC9B,EAAA,MAAM,IAAA,GAAO,eAAe,QAAQ,CAAA;AAEpC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,CAAK,aAAa,QAAA,EAAU;AAC9B,MAAA,IAAA,CAAK,eAAe,QAAQ,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,IAAI,CAAC,CAAA;AAEnB,EAAA,uBAAO,GAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAa,QAAA,EAAS,CAAA;AAChD;AAEA,mBAAA,CAAoB,WAAA,GAAc,qBAAA;;;;"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var React = require('react');
|
|
5
|
+
var reactI18next = require('react-i18next');
|
|
5
6
|
var utils = require('./utils-BhM0B89p.js');
|
|
6
7
|
var primitives_Field = require('./primitives/Field.js');
|
|
7
8
|
var fieldIds = require('./fieldIds-DiVU6GVS.js');
|
|
@@ -11,14 +12,23 @@ var x = require('./x-Brw3FJst.js');
|
|
|
11
12
|
|
|
12
13
|
const EMAIL_REGEX = /^[A-Z0-9._%+-]+@[A-Z0-9-]+(?:\.[A-Z0-9-]+)*\.[A-Z]{2,}$/i;
|
|
13
14
|
const UNSTRICT_EMAIL_REGEX = /(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))/g;
|
|
14
|
-
const
|
|
15
|
+
const DOMAIN_REGEX = /^(?:[a-zA-Z0-9-]{1,63}\.)+[a-zA-Z0-9-]{2,63}$/;
|
|
16
|
+
const SEPARATION_REGEX = /[^\s,]+/g;
|
|
17
|
+
const VALIDATION_REGEX = {
|
|
18
|
+
email: EMAIL_REGEX,
|
|
19
|
+
domain: DOMAIN_REGEX
|
|
20
|
+
};
|
|
21
|
+
const ENTITY_FALLBACK = {
|
|
22
|
+
email: { one: "email", other: "emails" },
|
|
23
|
+
domain: { one: "domain", other: "domains" }
|
|
24
|
+
};
|
|
15
25
|
|
|
16
|
-
const formatEmailInputOption = (email) => ({
|
|
26
|
+
const formatEmailInputOption = (email, entryType = "email") => ({
|
|
17
27
|
label: email,
|
|
18
28
|
value: email,
|
|
19
|
-
valid:
|
|
29
|
+
valid: VALIDATION_REGEX[entryType].test(email)
|
|
20
30
|
});
|
|
21
|
-
const pruneDuplicates = (existing, newEmailStrings) => {
|
|
31
|
+
const pruneDuplicates = (existing, newEmailStrings, entryType = "email") => {
|
|
22
32
|
const seen = new Set(existing.map((e) => e.value.toLowerCase()));
|
|
23
33
|
const duplicates = [];
|
|
24
34
|
const added = [];
|
|
@@ -28,20 +38,21 @@ const pruneDuplicates = (existing, newEmailStrings) => {
|
|
|
28
38
|
duplicates.push(emailStr);
|
|
29
39
|
} else {
|
|
30
40
|
seen.add(lower);
|
|
31
|
-
added.push(formatEmailInputOption(emailStr));
|
|
41
|
+
added.push(formatEmailInputOption(emailStr, entryType));
|
|
32
42
|
}
|
|
33
43
|
}
|
|
34
44
|
return { uniqueEmails: [...existing, ...added], duplicates };
|
|
35
45
|
};
|
|
36
46
|
const filterValidEmails = (emails) => emails.filter((email) => email.valid);
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
47
|
+
const getEntityLabel = (t, entryType, count) => t(
|
|
48
|
+
`neetoatoms.multiEmailInput.${entryType}`,
|
|
49
|
+
ENTITY_FALLBACK[entryType][count === 1 ? "one" : "other"],
|
|
50
|
+
{ count }
|
|
51
|
+
);
|
|
42
52
|
|
|
43
53
|
function useMultiEmailState(props) {
|
|
44
54
|
const {
|
|
55
|
+
entryType = "email",
|
|
45
56
|
value = [],
|
|
46
57
|
onChange,
|
|
47
58
|
onBlur,
|
|
@@ -57,16 +68,19 @@ function useMultiEmailState(props) {
|
|
|
57
68
|
(input) => {
|
|
58
69
|
const trimmed = input.trim();
|
|
59
70
|
if (!trimmed) return;
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
71
|
+
const separated = trimmed.match(SEPARATION_REGEX) || [];
|
|
72
|
+
const matches = entryType === "email" ? trimmed.match(UNSTRICT_EMAIL_REGEX) || separated : separated;
|
|
73
|
+
if (matches.length === 0) return;
|
|
74
|
+
const { uniqueEmails, duplicates } = pruneDuplicates(
|
|
75
|
+
value,
|
|
76
|
+
matches,
|
|
77
|
+
entryType
|
|
78
|
+
);
|
|
65
79
|
onChange?.(uniqueEmails);
|
|
66
80
|
setDuplicateEmails(duplicates);
|
|
67
81
|
setInputValue("");
|
|
68
82
|
},
|
|
69
|
-
[value, onChange]
|
|
83
|
+
[value, onChange, entryType]
|
|
70
84
|
);
|
|
71
85
|
const handleKeyDown = React.useCallback(
|
|
72
86
|
(event) => {
|
|
@@ -141,6 +155,7 @@ const CHIPS_CONTAINER = "flex min-h-8 flex-wrap items-center gap-1 rounded-lg bo
|
|
|
141
155
|
const CHIPS_ERROR = "border-destructive ring-3 ring-destructive/20 dark:border-destructive/50 dark:ring-destructive/40";
|
|
142
156
|
const MultiEmailInput = React.forwardRef((props, ref) => {
|
|
143
157
|
const {
|
|
158
|
+
entryType = "email",
|
|
144
159
|
label,
|
|
145
160
|
placeholder = "",
|
|
146
161
|
helpText,
|
|
@@ -157,6 +172,7 @@ const MultiEmailInput = React.forwardRef((props, ref) => {
|
|
|
157
172
|
dataTestId
|
|
158
173
|
} = props;
|
|
159
174
|
const id = React.useId();
|
|
175
|
+
const { t } = reactI18next.useTranslation();
|
|
160
176
|
const testIdPrefix = fieldIds.buildTestIdPrefix(dataTestId, label);
|
|
161
177
|
const {
|
|
162
178
|
isCounterVisible,
|
|
@@ -201,7 +217,7 @@ const MultiEmailInput = React.forwardRef((props, ref) => {
|
|
|
201
217
|
children: [
|
|
202
218
|
validCount,
|
|
203
219
|
" ",
|
|
204
|
-
typeof counter === "object" && counter?.label ? counter.label :
|
|
220
|
+
typeof counter === "object" && counter?.label ? counter.label : getEntityLabel(t, entryType, validCount)
|
|
205
221
|
]
|
|
206
222
|
}
|
|
207
223
|
)
|
|
@@ -233,7 +249,13 @@ const MultiEmailInput = React.forwardRef((props, ref) => {
|
|
|
233
249
|
className: "-ms-0.5 rounded-xs opacity-50 hover:opacity-100",
|
|
234
250
|
onMouseDown: (e) => e.preventDefault(),
|
|
235
251
|
onClick: () => handleChipRemove(email.value),
|
|
236
|
-
"aria-label":
|
|
252
|
+
"aria-label": t(
|
|
253
|
+
"neetoatoms.multiEmailInput.remove",
|
|
254
|
+
"Remove {{label}}",
|
|
255
|
+
{
|
|
256
|
+
label: email.label
|
|
257
|
+
}
|
|
258
|
+
),
|
|
237
259
|
children: /* @__PURE__ */ jsxRuntime.jsx(x.X, { className: "size-3 pointer-events-none" })
|
|
238
260
|
}
|
|
239
261
|
)
|
|
@@ -241,11 +263,9 @@ const MultiEmailInput = React.forwardRef((props, ref) => {
|
|
|
241
263
|
},
|
|
242
264
|
email.value
|
|
243
265
|
)),
|
|
244
|
-
hiddenCount > 0 && /* @__PURE__ */ jsxRuntime.
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
" more"
|
|
248
|
-
] }),
|
|
266
|
+
hiddenCount > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-[calc(--spacing(5.25))] items-center rounded-sm bg-secondary px-1.5 text-xs font-medium text-secondary-foreground", children: t("neetoatoms.multiEmailInput.hiddenCount", "+{{total}} more", {
|
|
267
|
+
total: hiddenCount
|
|
268
|
+
}) }),
|
|
249
269
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
250
270
|
"input",
|
|
251
271
|
{
|
|
@@ -282,7 +302,11 @@ const MultiEmailInput = React.forwardRef((props, ref) => {
|
|
|
282
302
|
type: "button",
|
|
283
303
|
className: "ml-1 cursor-pointer font-semibold underline",
|
|
284
304
|
onClick: handleFilterInvalidEmails,
|
|
285
|
-
children: filterInvalidEmails?.label ??
|
|
305
|
+
children: filterInvalidEmails?.label ?? t(
|
|
306
|
+
"neetoatoms.multiEmailInput.removeInvalid",
|
|
307
|
+
"Click here to remove invalid {{entity}}.",
|
|
308
|
+
{ entity: getEntityLabel(t, entryType, 0) }
|
|
309
|
+
)
|
|
286
310
|
}
|
|
287
311
|
)
|
|
288
312
|
]
|
|
@@ -301,7 +325,15 @@ const MultiEmailInput = React.forwardRef((props, ref) => {
|
|
|
301
325
|
{
|
|
302
326
|
className: "text-[0.8rem] text-amber-600 dark:text-amber-400",
|
|
303
327
|
"data-testid": `${testIdPrefix}-duplicate-emails-warning`,
|
|
304
|
-
children:
|
|
328
|
+
children: t(
|
|
329
|
+
"neetoatoms.multiEmailInput.duplicateWarning",
|
|
330
|
+
"Removed {{total}} duplicate {{entity}} from the list: {{items}}",
|
|
331
|
+
{
|
|
332
|
+
total: duplicateEmails.length,
|
|
333
|
+
entity: getEntityLabel(t, entryType, duplicateEmails.length),
|
|
334
|
+
items: duplicateEmails.join(", ")
|
|
335
|
+
}
|
|
336
|
+
)
|
|
305
337
|
}
|
|
306
338
|
)
|
|
307
339
|
] })
|
|
@@ -312,4 +344,4 @@ const MultiEmailInput = React.forwardRef((props, ref) => {
|
|
|
312
344
|
MultiEmailInput.displayName = "MultiEmailInput";
|
|
313
345
|
|
|
314
346
|
exports.MultiEmailInput = MultiEmailInput;
|
|
315
|
-
//# sourceMappingURL=MultiEmailInput-
|
|
347
|
+
//# sourceMappingURL=MultiEmailInput-CW0TQEU2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiEmailInput-CW0TQEU2.js","sources":["../../src/components/MultiEmailInput/constants.ts","../../src/components/MultiEmailInput/utils.ts","../../src/components/MultiEmailInput/useMultiEmailState.ts","../../src/components/MultiEmailInput/MultiEmailInput.tsx"],"sourcesContent":["export const EMAIL_REGEX =\n /^[A-Z0-9._%+-]+@[A-Z0-9-]+(?:\\.[A-Z0-9-]+)*\\.[A-Z]{2,}$/i;\n\nexport const UNSTRICT_EMAIL_REGEX =\n /(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))/g;\n\nexport const DOMAIN_REGEX = /^(?:[a-zA-Z0-9-]{1,63}\\.)+[a-zA-Z0-9-]{2,63}$/;\n\nexport const SEPARATION_REGEX = /[^\\s,]+/g;\n\nexport const VALIDATION_REGEX = {\n email: EMAIL_REGEX,\n domain: DOMAIN_REGEX,\n} as const;\n\nexport const ENTITY_FALLBACK = {\n email: { one: \"email\", other: \"emails\" },\n domain: { one: \"domain\", other: \"domains\" },\n} as const;\n","import type { TFunction } from \"i18next\";\n\nimport { ENTITY_FALLBACK, VALIDATION_REGEX } from \"./constants\";\nimport type { EmailValue, EntryType } from \"./types\";\n\nexport const formatEmailInputOption = (\n email: string,\n entryType: EntryType = \"email\"\n): EmailValue => ({\n label: email,\n value: email,\n valid: VALIDATION_REGEX[entryType].test(email),\n});\n\nexport const pruneDuplicates = (\n existing: EmailValue[],\n newEmailStrings: string[],\n entryType: EntryType = \"email\"\n): { uniqueEmails: EmailValue[]; duplicates: string[] } => {\n const seen = new Set(existing.map(e => e.value.toLowerCase()));\n const duplicates: string[] = [];\n const added: EmailValue[] = [];\n\n for (const emailStr of newEmailStrings) {\n const lower = emailStr.toLowerCase();\n if (seen.has(lower)) {\n duplicates.push(emailStr);\n } else {\n seen.add(lower);\n added.push(formatEmailInputOption(emailStr, entryType));\n }\n }\n\n return { uniqueEmails: [...existing, ...added], duplicates };\n};\n\nexport const filterValidEmails = (emails: EmailValue[]): EmailValue[] =>\n emails.filter(email => email.valid);\n\nexport const getEntityLabel = (\n t: TFunction,\n entryType: EntryType,\n count: number\n): string =>\n t(\n `neetoatoms.multiEmailInput.${entryType}`,\n ENTITY_FALLBACK[entryType][count === 1 ? \"one\" : \"other\"],\n { count }\n );\n","import { useState, useCallback, useMemo } from \"react\";\n\nimport { UNSTRICT_EMAIL_REGEX, SEPARATION_REGEX } from \"./constants\";\nimport { pruneDuplicates, filterValidEmails } from \"./utils\";\nimport type { MultiEmailInputProps } from \"./types\";\n\nexport function useMultiEmailState(props: MultiEmailInputProps) {\n const {\n entryType = \"email\",\n value = [],\n onChange,\n onBlur,\n visibleEmailsCount = 3,\n isAlwaysExpanded = false,\n counter,\n filterInvalidEmails,\n } = props;\n\n const [inputValue, setInputValue] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const [duplicateEmails, setDuplicateEmails] = useState<string[]>([]);\n\n const addEmails = useCallback(\n (input: string) => {\n const trimmed = input.trim();\n if (!trimmed) return;\n const separated = trimmed.match(SEPARATION_REGEX) || [];\n const matches =\n entryType === \"email\"\n ? trimmed.match(UNSTRICT_EMAIL_REGEX) || separated\n : separated;\n if (matches.length === 0) return;\n const { uniqueEmails, duplicates } = pruneDuplicates(\n value,\n matches,\n entryType\n );\n onChange?.(uniqueEmails);\n setDuplicateEmails(duplicates);\n setInputValue(\"\");\n },\n [value, onChange, entryType]\n );\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (!inputValue && event.key === \"Backspace\" && value.length > 0) {\n onChange?.(value.slice(0, -1));\n return;\n }\n if (!inputValue) return;\n if ([\"Enter\", \"Tab\", \",\", \" \"].includes(event.key)) {\n addEmails(inputValue);\n event.preventDefault();\n event.stopPropagation();\n }\n },\n [inputValue, value, onChange, addEmails]\n );\n\n const handlePaste = useCallback(\n (event: React.ClipboardEvent<HTMLInputElement>) => {\n const text = event.clipboardData.getData(\"text\");\n if (!text) return;\n event.preventDefault();\n addEmails(text);\n },\n [addEmails]\n );\n\n const handleBlur = useCallback(() => {\n if (inputValue) {\n addEmails(inputValue);\n } else {\n onBlur?.();\n }\n setIsFocused(false);\n setDuplicateEmails([]);\n }, [inputValue, addEmails, onBlur]);\n\n const handleFocus = useCallback(() => setIsFocused(true), []);\n\n const handleChipRemove = useCallback(\n (emailValue: string) =>\n onChange?.(value.filter(e => e.value !== emailValue)),\n [value, onChange]\n );\n\n const handleFilterInvalidEmails = useCallback(\n () => onChange?.(filterValidEmails(value)),\n [value, onChange]\n );\n\n const validCount = useMemo(() => value.filter(e => e.valid).length, [value]);\n const isCounterVisible =\n !!counter &&\n (typeof counter === \"boolean\" ||\n !counter.startsFrom ||\n validCount >= counter.startsFrom);\n const shouldCollapse =\n !isAlwaysExpanded && !isFocused && value.length > visibleEmailsCount;\n const visibleEmails = shouldCollapse\n ? value.slice(0, visibleEmailsCount)\n : value;\n const hiddenCount = shouldCollapse ? value.length - visibleEmailsCount : 0;\n const isFilterLinkVisible =\n !!filterInvalidEmails && value.length > validCount;\n\n return {\n inputValue,\n setInputValue,\n isFocused,\n duplicateEmails,\n handleKeyDown,\n handlePaste,\n handleBlur,\n handleFocus,\n handleChipRemove,\n handleFilterInvalidEmails,\n isCounterVisible,\n validCount,\n visibleEmails,\n hiddenCount,\n isFilterLinkVisible,\n };\n}\n","import { forwardRef, useId } from \"react\";\nimport { XIcon } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { Field, FieldLabel, FieldContent } from \"src/primitives/Field\";\nimport { buildTestIdPrefix } from \"src/utils/fieldIds\";\nimport { hyphenize } from \"src/utils/hyphenize\";\nimport { withIconSize } from \"src/utils/withIconSize\";\nimport { useMultiEmailState } from \"./useMultiEmailState\";\nimport { getEntityLabel } from \"./utils\";\nimport type { MultiEmailInputProps } from \"./types\";\n\nconst CHIP_BASE =\n \"flex h-[calc(--spacing(5.25))] w-fit items-center justify-center gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground\";\nconst CHIP_INVALID =\n \"border border-destructive text-destructive bg-destructive/10\";\nconst CHIPS_CONTAINER =\n \"flex min-h-8 flex-wrap items-center gap-1 rounded-lg border border-input bg-transparent bg-clip-padding px-2.5 py-1 text-base md:text-sm transition-colors focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50\";\nconst CHIPS_ERROR =\n \"border-destructive ring-3 ring-destructive/20 dark:border-destructive/50 dark:ring-destructive/40\";\n\nexport const MultiEmailInput = forwardRef<\n HTMLInputElement,\n MultiEmailInputProps\n>((props, ref) => {\n const {\n entryType = \"email\",\n label,\n placeholder = \"\",\n helpText,\n error,\n disabled = false,\n required = false,\n maxHeight = 200,\n counter,\n filterInvalidEmails,\n prefix,\n suffix,\n labelProps,\n className,\n dataTestId,\n } = props;\n const id = useId();\n const { t } = useTranslation();\n const testIdPrefix = buildTestIdPrefix(dataTestId, label);\n const {\n isCounterVisible,\n validCount,\n visibleEmails,\n hiddenCount,\n inputValue,\n setInputValue,\n handleKeyDown,\n handlePaste,\n handleFocus,\n handleBlur,\n handleChipRemove,\n isFilterLinkVisible,\n handleFilterInvalidEmails,\n duplicateEmails,\n } = useMultiEmailState(props);\n\n return (\n <Field\n className={cn(\"flex flex-col gap-1.5\", className)}\n data-testid=\"email-input-wrapper\"\n >\n {(label || isCounterVisible) && (\n <div className=\"flex items-center justify-between\">\n {label && (\n <FieldLabel\n htmlFor={id}\n data-testid={`${testIdPrefix}-input-label`}\n {...labelProps}\n >\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n {\" *\"}\n </span>\n )}\n </FieldLabel>\n )}\n {isCounterVisible && (\n <span\n className=\"text-xs text-muted-foreground\"\n data-testid={`${testIdPrefix}-email-counter`}\n >\n {validCount}{\" \"}\n {typeof counter === \"object\" && counter?.label\n ? counter.label\n : getEntityLabel(t, entryType, validCount)}\n </span>\n )}\n </div>\n )}\n <div\n data-testid=\"multi-email-select-container\"\n className={cn(\n CHIPS_CONTAINER,\n !!error && CHIPS_ERROR,\n disabled && \"pointer-events-none opacity-50\"\n )}\n style={{ maxHeight: `${maxHeight}px`, overflowY: \"auto\" }}\n >\n {prefix && (\n <div className=\"shrink-0 text-muted-foreground\">\n {withIconSize(prefix, \"size-4\")}\n </div>\n )}\n {visibleEmails.map(email => (\n <span\n key={email.value}\n className={cn(CHIP_BASE, !email.valid && CHIP_INVALID)}\n >\n {email.label}\n {!disabled && (\n <button\n type=\"button\"\n tabIndex={-1}\n data-testid={`${hyphenize(email.label)}-remove-icon`}\n className=\"-ms-0.5 rounded-xs opacity-50 hover:opacity-100\"\n onMouseDown={e => e.preventDefault()}\n onClick={() => handleChipRemove(email.value)}\n aria-label={t(\n \"neetoatoms.multiEmailInput.remove\",\n \"Remove {{label}}\",\n {\n label: email.label,\n }\n )}\n >\n <XIcon className=\"size-3 pointer-events-none\" />\n </button>\n )}\n </span>\n ))}\n {hiddenCount > 0 && (\n <span className=\"flex h-[calc(--spacing(5.25))] items-center rounded-sm bg-secondary px-1.5 text-xs font-medium text-secondary-foreground\">\n {t(\"neetoatoms.multiEmailInput.hiddenCount\", \"+{{total}} more\", {\n total: hiddenCount,\n })}\n </span>\n )}\n <input\n ref={ref}\n id={id}\n type=\"text\"\n data-testid=\"email-select-input-field\"\n value={inputValue}\n onChange={e => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={props.value?.length ? \"\" : placeholder}\n disabled={disabled}\n className=\"min-w-16 flex-1 bg-transparent text-base outline-none placeholder:text-muted-foreground md:text-sm\"\n />\n {suffix && (\n <div className=\"shrink-0 text-muted-foreground\">\n {withIconSize(suffix, \"size-4\")}\n </div>\n )}\n </div>\n <FieldContent>\n {!!error && (\n <p\n className=\"text-[0.8rem] text-destructive\"\n data-testid={`${testIdPrefix}-input-error`}\n >\n {error}\n {isFilterLinkVisible && (\n <button\n type=\"button\"\n className=\"ml-1 cursor-pointer font-semibold underline\"\n onClick={handleFilterInvalidEmails}\n >\n {filterInvalidEmails?.label ??\n t(\n \"neetoatoms.multiEmailInput.removeInvalid\",\n \"Click here to remove invalid {{entity}}.\",\n { entity: getEntityLabel(t, entryType, 0) }\n )}\n </button>\n )}\n </p>\n )}\n {!!helpText && (\n <p\n className=\"text-[0.8rem] text-muted-foreground\"\n data-testid={`${testIdPrefix}-input-help`}\n >\n {helpText}\n </p>\n )}\n {duplicateEmails.length > 0 && (\n <p\n className=\"text-[0.8rem] text-amber-600 dark:text-amber-400\"\n data-testid={`${testIdPrefix}-duplicate-emails-warning`}\n >\n {t(\n \"neetoatoms.multiEmailInput.duplicateWarning\",\n \"Removed {{total}} duplicate {{entity}} from the list: {{items}}\",\n {\n total: duplicateEmails.length,\n entity: getEntityLabel(t, entryType, duplicateEmails.length),\n items: duplicateEmails.join(\", \"),\n }\n )}\n </p>\n )}\n </FieldContent>\n </Field>\n );\n});\nMultiEmailInput.displayName = \"MultiEmailInput\";\n"],"names":["useState","useCallback","useMemo","forwardRef","useId","useTranslation","buildTestIdPrefix","jsxs","Field","cn","FieldLabel","jsx","withIconSize","hyphenize","XIcon","FieldContent"],"mappings":"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"}
|
|
@@ -71,6 +71,16 @@ var neetoatoms = {
|
|
|
71
71
|
toastr: {
|
|
72
72
|
copyMessage: "Copy this error message",
|
|
73
73
|
copied: "Copied!"
|
|
74
|
+
},
|
|
75
|
+
multiEmailInput: {
|
|
76
|
+
email_one: "email",
|
|
77
|
+
email_other: "emails",
|
|
78
|
+
domain_one: "domain",
|
|
79
|
+
domain_other: "domains",
|
|
80
|
+
hiddenCount: "+{{total}} more",
|
|
81
|
+
remove: "Remove {{label}}",
|
|
82
|
+
removeInvalid: "Click here to remove invalid {{entity}}.",
|
|
83
|
+
duplicateWarning: "Removed {{total}} duplicate {{entity}} from the list: {{items}}"
|
|
74
84
|
}
|
|
75
85
|
};
|
|
76
86
|
var enTranslations = {
|
|
@@ -107,4 +117,4 @@ TranslationProvider.displayName = "TranslationProvider";
|
|
|
107
117
|
|
|
108
118
|
exports.TranslationProvider = TranslationProvider;
|
|
109
119
|
exports.resources = resources;
|
|
110
|
-
//# sourceMappingURL=TranslationProvider-
|
|
120
|
+
//# sourceMappingURL=TranslationProvider-DOeyGtbV.js.map
|
package/dist/cjs/{TranslationProvider-BgCNBYs8.js.map → TranslationProvider-DOeyGtbV.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TranslationProvider-
|
|
1
|
+
{"version":3,"file":"TranslationProvider-DOeyGtbV.js","sources":["../../src/translations/index.ts","../../src/components/TranslationProvider/i18n.ts","../../src/components/TranslationProvider/TranslationProvider.tsx"],"sourcesContent":["import enTranslations from \"./en.json\";\n\nexport const resources = {\n en: { translation: enTranslations },\n};\n","import i18n from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\n\nimport { resources } from \"src/translations\";\n\nexport const initializeI18n = (language = \"en\") => {\n i18n.use(initReactI18next).init({\n resources,\n lng: language,\n fallbackLng: \"en\",\n interpolation: { escapeValue: false },\n });\n\n return i18n;\n};\n","import { useEffect } from \"react\";\n\nimport { I18nextProvider } from \"react-i18next\";\n\nimport { initializeI18n } from \"./i18n\";\nimport type { TranslationProviderProps } from \"./types\";\n\nconst TranslationProvider = ({\n children,\n language = \"en\",\n}: TranslationProviderProps) => {\n const i18n = initializeI18n(language);\n\n useEffect(() => {\n if (i18n.language !== language) {\n i18n.changeLanguage(language);\n }\n }, [language, i18n]);\n\n return <I18nextProvider i18n={i18n}>{children}</I18nextProvider>;\n};\n\nTranslationProvider.displayName = \"TranslationProvider\";\n\nexport { TranslationProvider };\n"],"names":["i18n","initReactI18next","useEffect","jsx","I18nextProvider"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEO,MAAM,SAAA,GAAY;AAAA,EACvB,EAAA,EAAI,EAAE,WAAA,EAAa,cAAA;AACrB;;ACCO,MAAM,cAAA,GAAiB,CAAC,QAAA,GAAW,IAAA,KAAS;AACjD,EAAAA,qBAAA,CAAK,GAAA,CAAIC,6BAAgB,CAAA,CAAE,IAAA,CAAK;AAAA,IAC9B,SAAA;AAAA,IACA,GAAA,EAAK,QAAA;AAAA,IACL,WAAA,EAAa,IAAA;AAAA,IACb,aAAA,EAAe,EAAE,WAAA,EAAa,KAAA;AAAM,GACrC,CAAA;AAED,EAAA,OAAOD,qBAAA;AACT,CAAA;;ACPA,MAAM,sBAAsB,CAAC;AAAA,EAC3B,QAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,KAAgC;AAC9B,EAAA,MAAM,IAAA,GAAO,eAAe,QAAQ,CAAA;AAEpC,EAAAE,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,CAAK,aAAa,QAAA,EAAU;AAC9B,MAAA,IAAA,CAAK,eAAe,QAAQ,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,IAAI,CAAC,CAAA;AAEnB,EAAA,uBAAOC,cAAA,CAACC,4BAAA,EAAA,EAAgB,IAAA,EAAa,QAAA,EAAS,CAAA;AAChD;AAEA,mBAAA,CAAoB,WAAA,GAAc,qBAAA;;;;;"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var MultiEmailInput = require('../MultiEmailInput-
|
|
3
|
+
var MultiEmailInput = require('../MultiEmailInput-CW0TQEU2.js');
|
|
4
4
|
require('react/jsx-runtime');
|
|
5
5
|
require('react');
|
|
6
|
+
require('react-i18next');
|
|
6
7
|
require('../utils-BhM0B89p.js');
|
|
7
8
|
require('../primitives/Field.js');
|
|
8
9
|
require('../HelpIcon-BF1ePUQf.js');
|
|
@@ -37,7 +38,6 @@ require('react-router-dom');
|
|
|
37
38
|
require('../primitives/Button.js');
|
|
38
39
|
require('../button-CSBhDSDJ.js');
|
|
39
40
|
require('../primitives/Spinner.js');
|
|
40
|
-
require('react-i18next');
|
|
41
41
|
require('../loader-circle-Bw7zP2Gn.js');
|
|
42
42
|
require('../label-BdcX4_ud.js');
|
|
43
43
|
require('../separator-DSL-aG1J.js');
|
|
@@ -16,7 +16,7 @@ var Empty = require('../Empty-Bqt-TucD.js');
|
|
|
16
16
|
var Input = require('../Input-DIq7T9D0.js');
|
|
17
17
|
var Kbd = require('../Kbd--A8Gl8TV.js');
|
|
18
18
|
var Label = require('../Label-CpsdGBV8.js');
|
|
19
|
-
var MultiEmailInput = require('../MultiEmailInput-
|
|
19
|
+
var MultiEmailInput = require('../MultiEmailInput-CW0TQEU2.js');
|
|
20
20
|
var Pagination = require('../Pagination-WyQlBpvK.js');
|
|
21
21
|
var Popover = require('../Popover-5BUgIW60.js');
|
|
22
22
|
var Progress = require('../Progress-n_VwK9_E.js');
|
|
@@ -33,7 +33,7 @@ var TimePicker = require('../TimePicker-lJ2985nh.js');
|
|
|
33
33
|
var TimePickerPanel = require('../TimePickerPanel-DX6cjrSN.js');
|
|
34
34
|
var Toastr = require('../Toastr-9DXjD-Mq.js');
|
|
35
35
|
var Tooltip = require('../Tooltip-B6uv_2Jz.js');
|
|
36
|
-
var TranslationProvider = require('../TranslationProvider-
|
|
36
|
+
var TranslationProvider = require('../TranslationProvider-DOeyGtbV.js');
|
|
37
37
|
var Tree = require('../Tree-Y0ulyxew.js');
|
|
38
38
|
var TreeSelect = require('../TreeSelect-DDQx8FPS.js');
|
|
39
39
|
var Typography = require('../Typography-BW6xEk10.js');
|
|
@@ -4,7 +4,8 @@ var jsxRuntime = require('react/jsx-runtime');
|
|
|
4
4
|
var React = require('react');
|
|
5
5
|
var formik = require('formik');
|
|
6
6
|
var ramda = require('ramda');
|
|
7
|
-
var MultiEmailInput = require('../MultiEmailInput-
|
|
7
|
+
var MultiEmailInput = require('../MultiEmailInput-CW0TQEU2.js');
|
|
8
|
+
require('react-i18next');
|
|
8
9
|
require('../utils-BhM0B89p.js');
|
|
9
10
|
require('../primitives/Field.js');
|
|
10
11
|
require('../HelpIcon-BF1ePUQf.js');
|
|
@@ -39,7 +40,6 @@ require('react-router-dom');
|
|
|
39
40
|
require('../primitives/Button.js');
|
|
40
41
|
require('../button-CSBhDSDJ.js');
|
|
41
42
|
require('../primitives/Spinner.js');
|
|
42
|
-
require('react-i18next');
|
|
43
43
|
require('../loader-circle-Bw7zP2Gn.js');
|
|
44
44
|
require('../label-BdcX4_ud.js');
|
|
45
45
|
require('../separator-DSL-aG1J.js');
|
package/dist/cjs/formik/index.js
CHANGED
|
@@ -95,7 +95,7 @@ require('../index-CS_WSHYi.js');
|
|
|
95
95
|
require('../Tree-Y0ulyxew.js');
|
|
96
96
|
require('../chevron-right-0jNdwX2Q.js');
|
|
97
97
|
require('../redux-DEF7lAd1.js');
|
|
98
|
-
require('../MultiEmailInput-
|
|
98
|
+
require('../MultiEmailInput-CW0TQEU2.js');
|
|
99
99
|
require('../Dialog-ZUHGaoAE.js');
|
|
100
100
|
require('../primitives/Dialog.js');
|
|
101
101
|
require('../dialog-CGblgaX5.js');
|