@jobber/components 6.103.2-JOB-140609-9051081.26 → 6.103.2

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.
Files changed (74) hide show
  1. package/dist/Autocomplete/Autocomplete.types.d.ts +1 -12
  2. package/dist/Autocomplete/index.cjs +13 -1
  3. package/dist/Autocomplete/index.mjs +13 -1
  4. package/dist/Checkbox/Checkbox.types.d.ts +9 -2
  5. package/dist/Checkbox/index.cjs +2 -3
  6. package/dist/Checkbox/index.mjs +2 -3
  7. package/dist/Chips/InternalChipDismissible/hooks/index.cjs +2 -2
  8. package/dist/Chips/InternalChipDismissible/hooks/index.mjs +2 -2
  9. package/dist/Chips/InternalChipDismissible/index.cjs +2 -2
  10. package/dist/Chips/InternalChipDismissible/index.mjs +2 -2
  11. package/dist/Chips/index.cjs +2 -2
  12. package/dist/Chips/index.mjs +2 -2
  13. package/dist/DataList/components/DataListSearch/index.cjs +12 -1
  14. package/dist/DataList/components/DataListSearch/index.mjs +12 -1
  15. package/dist/DataList/index.cjs +8 -0
  16. package/dist/DataList/index.mjs +8 -0
  17. package/dist/DataTable/index.cjs +2 -2
  18. package/dist/DataTable/index.mjs +2 -2
  19. package/dist/DatePicker/index.cjs +2 -2
  20. package/dist/DatePicker/index.mjs +2 -2
  21. package/dist/FormField/FormFieldTypes.d.ts +1 -217
  22. package/dist/FormField-cjs.js +6 -1
  23. package/dist/FormField-es.js +6 -2
  24. package/dist/InputDate/index.cjs +4 -8
  25. package/dist/InputDate/index.mjs +4 -8
  26. package/dist/InputDate/useInputDateActivatorActions.d.ts +2 -2
  27. package/dist/InputEmail/InputEmail.types.d.ts +21 -16
  28. package/dist/InputEmail/hooks/useInputEmailActions.d.ts +1 -1
  29. package/dist/InputEmail/hooks/useInputEmailFormField.d.ts +32 -0
  30. package/dist/InputEmail/index.cjs +45 -10
  31. package/dist/InputEmail/index.mjs +45 -10
  32. package/dist/InputNumber/InputNumber.rebuilt.types.d.ts +2 -23
  33. package/dist/InputNumber/index.cjs +3 -6
  34. package/dist/InputNumber/index.mjs +3 -6
  35. package/dist/InputPhoneNumber/InputPhoneNumber.types.d.ts +26 -15
  36. package/dist/InputPhoneNumber/hooks/useInputPhoneActions.d.ts +1 -1
  37. package/dist/InputPhoneNumber/hooks/useInputPhoneFormField.d.ts +71 -0
  38. package/dist/InputPhoneNumber/index.cjs +35 -20
  39. package/dist/InputPhoneNumber/index.mjs +35 -20
  40. package/dist/InputText/InputText.d.ts +2 -2
  41. package/dist/InputText/InputText.types.d.ts +24 -27
  42. package/dist/InputText/index.cjs +55 -26
  43. package/dist/InputText/index.mjs +56 -27
  44. package/dist/InputText/useInputTextActions.d.ts +1 -1
  45. package/dist/InputText/useInputTextFormField.d.ts +352 -0
  46. package/dist/InputTime/InputTime.rebuilt.d.ts +1 -1
  47. package/dist/InputTime/InputTime.types.d.ts +1 -21
  48. package/dist/InputTime/index.cjs +25 -30
  49. package/dist/InputTime/index.d.ts +1 -1
  50. package/dist/InputTime/index.mjs +27 -32
  51. package/dist/List/index.cjs +2 -2
  52. package/dist/List/index.mjs +2 -2
  53. package/dist/RecurringSelect/index.cjs +2 -2
  54. package/dist/RecurringSelect/index.mjs +2 -2
  55. package/dist/Select/Select.rebuilt.d.ts +1 -1
  56. package/dist/Select/Select.types.d.ts +1 -14
  57. package/dist/Select/hooks/useSelectActions.d.ts +5 -5
  58. package/dist/Select/hooks/useSelectFormField.d.ts +34 -0
  59. package/dist/Select/index.cjs +41 -27
  60. package/dist/Select/index.d.ts +5 -7
  61. package/dist/Select/index.mjs +43 -29
  62. package/dist/_baseEach-cjs.js +12 -12
  63. package/dist/_baseEach-es.js +1 -1
  64. package/dist/_baseFlatten-cjs.js +2 -2
  65. package/dist/_baseFlatten-es.js +1 -1
  66. package/dist/{_getAllKeys-cjs.js → _baseGet-cjs.js} +181 -181
  67. package/dist/{_getAllKeys-es.js → _baseGet-es.js} +182 -182
  68. package/dist/index.cjs +2 -2
  69. package/dist/index.mjs +2 -2
  70. package/dist/omit-cjs.js +14 -14
  71. package/dist/omit-es.js +1 -1
  72. package/dist/useScrollToActive-cjs.js +3 -3
  73. package/dist/useScrollToActive-es.js +1 -1
  74. package/package.json +2 -2
@@ -381,6 +381,7 @@ function FormField(props) {
381
381
  return React__default.createElement(FormFieldInternal, Object.assign({}, props, { id: id }));
382
382
  }
383
383
  function FormFieldInternal(props) {
384
+ var _a;
384
385
  const { actionsRef, autocomplete = true, children, defaultValue, description, disabled, id, inputRef, inline, keyboard, max, maxLength, min, name: nameProp, pattern, readonly, rows, loading, type = "text", validations, value, onChange, onEnter, onFocus, onBlur, onValidation, onKeyUp, clearable = "never", autofocus, } = props;
385
386
  const { name } = useAtlantisFormFieldName({ id, nameProp });
386
387
  const { errorMessage, inputRefs, useControllerField, setValue, onControllerBlur, onControllerChange, } = useAtlantisReactHookForm({
@@ -427,7 +428,10 @@ function FormFieldInternal(props) {
427
428
  handleValidation,
428
429
  handleKeyDown,
429
430
  });
430
- return (React__default.createElement(FormFieldWrapper, Object.assign({}, props, { value: useControllerField.value, error: errorMessage, identifier: id, descriptionIdentifier: descriptionIdentifier, clearable: clearable, onClear: handleClear }), renderField()));
431
+ // Ensure focus tracking works by providing a wrapperRef when none is passed
432
+ const internalWrapperRef = useRef(null);
433
+ const wrapperRef = (_a = props.wrapperRef) !== null && _a !== void 0 ? _a : internalWrapperRef;
434
+ return (React__default.createElement(FormFieldWrapper, Object.assign({}, props, { value: useControllerField.value, error: errorMessage, identifier: id, descriptionIdentifier: descriptionIdentifier, clearable: clearable, onClear: handleClear, wrapperRef: wrapperRef }), renderField()));
431
435
  function renderField() {
432
436
  switch (type) {
433
437
  case "select":
@@ -454,4 +458,4 @@ function setAutocomplete(autocompleteSetting) {
454
458
  return autocompleteSetting;
455
459
  }
456
460
 
457
- export { AffixIcon as A, FormFieldInputHorizontalWrapper as F, useAtlantisFormFieldActions as a, useAtlantisFormFieldName as b, useAtlantisReactHookForm as c, FormFieldInputWrapperStyles as d, FormFieldLabel as e, FormFieldWrapper as f, FormFieldWrapperMain as g, FormFieldWrapperToolbar as h, AffixLabel as i, useFormFieldWrapperStyles as j, FormField as k, FormFieldPostFix as l, mergeRefs as m, useAtlantisFormField as u };
461
+ export { AffixIcon as A, FormFieldInputHorizontalWrapper as F, useAtlantisFormFieldActions as a, useAtlantisFormFieldName as b, useAtlantisReactHookForm as c, FormFieldInputWrapperStyles as d, FormFieldLabel as e, FormFieldWrapper as f, FormFieldWrapperMain as g, FormFieldWrapperToolbar as h, AffixLabel as i, useFormFieldWrapperStyles as j, FormField as k, FormFieldPostFix as l, mergeRefs as m, styles$1 as s, useAtlantisFormField as u };
@@ -13,12 +13,12 @@ require('../Button-cjs.js');
13
13
  var DatePicker = require('../DatePicker-cjs.js');
14
14
  var InputText_index = require('../InputText/index.cjs');
15
15
  require('../_commonjsHelpers-cjs.js');
16
- require('../_getAllKeys-cjs.js');
16
+ require('../_baseGet-cjs.js');
17
17
  require('../isTypedArray-cjs.js');
18
18
  require('../isObjectLike-cjs.js');
19
- require('../isSymbol-cjs.js');
20
19
  require('../identity-cjs.js');
21
20
  require('../_getTag-cjs.js');
21
+ require('../isSymbol-cjs.js');
22
22
  require('../keysIn-cjs.js');
23
23
  require('../_baseAssignValue-cjs.js');
24
24
  require('../_baseFlatten-cjs.js');
@@ -89,16 +89,12 @@ function useInputDateActivatorActions({ onChange, onBlur, onFocus, }) {
89
89
  onChange === null || onChange === void 0 ? void 0 : onChange(event);
90
90
  }
91
91
  function handleFocus(event) {
92
- if (event) {
93
- onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);
94
- }
92
+ onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);
95
93
  setIsFocused(true);
96
94
  }
97
95
  function handleBlur(event) {
98
96
  setIsFocused(false);
99
- if (event) {
100
- onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
101
- }
97
+ onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
102
98
  }
103
99
  return {
104
100
  handleBlur,
@@ -11,12 +11,12 @@ import '../Button-es.js';
11
11
  import { D as DatePicker } from '../DatePicker-es.js';
12
12
  import { InputText } from '../InputText/index.mjs';
13
13
  import '../_commonjsHelpers-es.js';
14
- import '../_getAllKeys-es.js';
14
+ import '../_baseGet-es.js';
15
15
  import '../isTypedArray-es.js';
16
16
  import '../isObjectLike-es.js';
17
- import '../isSymbol-es.js';
18
17
  import '../identity-es.js';
19
18
  import '../_getTag-es.js';
19
+ import '../isSymbol-es.js';
20
20
  import '../keysIn-es.js';
21
21
  import '../_baseAssignValue-es.js';
22
22
  import '../_baseFlatten-es.js';
@@ -87,16 +87,12 @@ function useInputDateActivatorActions({ onChange, onBlur, onFocus, }) {
87
87
  onChange === null || onChange === void 0 ? void 0 : onChange(event);
88
88
  }
89
89
  function handleFocus(event) {
90
- if (event) {
91
- onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);
92
- }
90
+ onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);
93
91
  setIsFocused(true);
94
92
  }
95
93
  function handleBlur(event) {
96
94
  setIsFocused(false);
97
- if (event) {
98
- onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
99
- }
95
+ onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
100
96
  }
101
97
  return {
102
98
  handleBlur,
@@ -9,8 +9,8 @@ export interface useInputDateActivatorActionsProps extends Pick<InputDateRebuilt
9
9
  * DO not repeat this pattern. We are doing this as a proof of concept relating to the refactoring of Form inputs to see what can be removed.
10
10
  */
11
11
  export declare function useInputDateActivatorActions({ onChange, onBlur, onFocus, }: useInputDateActivatorActionsProps): {
12
- handleBlur: (event?: FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
12
+ handleBlur: (event: FocusEvent<HTMLInputElement>) => void;
13
13
  handleChange: (_: unknown, event?: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
14
- handleFocus: (event?: FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
14
+ handleFocus: (event: FocusEvent<HTMLInputElement>) => void;
15
15
  isFocused: boolean;
16
16
  };
@@ -1,4 +1,5 @@
1
- import type { CommonFormFieldProps, FocusEvents, FormFieldProps, HTMLInputBaseProps, KeyboardEvents, RebuiltInputCommonProps } from "../FormField";
1
+ import type { Clearable } from "@jobber/hooks";
2
+ import type { CommonFormFieldProps, FormFieldProps } from "../FormField";
2
3
  export type InputEmailLegacyProps = CommonFormFieldProps & Pick<FormFieldProps, "maxLength" | "readonly" | "validations" | "defaultValue">;
3
4
  export declare const validationMessage = "Please enter a valid email";
4
5
  export type InputEmailVersion = 1 | 2 | undefined;
@@ -6,23 +7,27 @@ export type InputEmailVersion = 1 | 2 | undefined;
6
7
  * Experimental version 2 of the InputEmail component.
7
8
  * Do not use unless you have talked with Atlantis first.
8
9
  */
9
- export interface InputEmailRebuiltProps extends HTMLInputBaseProps, FocusEvents<HTMLInputElement>, KeyboardEvents<HTMLInputElement>, RebuiltInputCommonProps {
10
- /**
11
- * The current value of the input.
12
- */
13
- readonly value?: string;
10
+ export interface InputEmailRebuiltProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "onChange" | "onBlur" | "size" | "suffix" | "prefix" | "value" | "max" | "min" | "defaultValue"> {
11
+ readonly error?: string;
12
+ readonly invalid?: boolean;
13
+ readonly identifier?: string;
14
+ readonly autocomplete?: boolean | string;
15
+ readonly loading?: boolean;
16
+ readonly onKeyUp?: (event: React.KeyboardEvent<HTMLInputElement>) => void;
17
+ readonly children?: React.ReactNode;
18
+ readonly clearable?: Clearable;
14
19
  /**
15
- * Custom onChange handler that provides the new value as the first argument.
20
+ * Version 2 is highly experimental. Avoid using it unless you have talked with Atlantis first.
16
21
  */
22
+ readonly version: 2;
17
23
  readonly onChange?: (newValue: string, event?: React.ChangeEvent<HTMLInputElement>) => void;
18
- /**
19
- * A callback to handle "Enter" keypress. This will only run
20
- * if Enter is the only key. Will not run if Shift or Control
21
- * are being held.
22
- */
23
24
  readonly onEnter?: FormFieldProps["onEnter"];
24
- /**
25
- * @deprecated Use `id` instead. This prop will be removed in a future version.
26
- */
27
- readonly identifier?: string;
25
+ readonly onBlur?: FormFieldProps["onBlur"];
26
+ readonly value?: string;
27
+ readonly size?: FormFieldProps["size"];
28
+ readonly inline?: FormFieldProps["inline"];
29
+ readonly align?: FormFieldProps["align"];
30
+ readonly prefix?: FormFieldProps["prefix"];
31
+ readonly suffix?: FormFieldProps["suffix"];
32
+ readonly description?: FormFieldProps["description"];
28
33
  }
@@ -8,5 +8,5 @@ export declare function useInputEmailActions({ onChange, inputRef, onEnter, onFo
8
8
  handleChange: (event: ChangeEvent<HTMLInputElement>) => void;
9
9
  handleKeyDown: (event: KeyboardEvent<HTMLInputElement>) => void;
10
10
  handleFocus: (event: FocusEvent<HTMLInputElement>) => void;
11
- handleBlur: (event: FocusEvent<HTMLInputElement>) => void;
11
+ handleBlur: (event?: FocusEvent) => void;
12
12
  };
@@ -0,0 +1,32 @@
1
+ import type { ChangeEvent, FocusEvent, KeyboardEvent, ReactNode } from "react";
2
+ export interface UseInputEmailFormFieldProps {
3
+ readonly id: string;
4
+ readonly name: string;
5
+ readonly disabled?: boolean;
6
+ readonly autofocus?: boolean;
7
+ readonly error?: string;
8
+ readonly inline?: boolean;
9
+ readonly description?: ReactNode;
10
+ readonly invalid?: boolean;
11
+ readonly value?: string;
12
+ readonly handleChange: (event: ChangeEvent<HTMLInputElement>) => void;
13
+ readonly handleBlur: (event?: FocusEvent<HTMLInputElement>) => void;
14
+ readonly handleFocus: (event: FocusEvent<HTMLInputElement>) => void;
15
+ readonly handleKeyDown: (event: KeyboardEvent<HTMLInputElement>) => void;
16
+ }
17
+ export interface UseInputEmailFormFieldReturn {
18
+ readonly fieldProps: {
19
+ readonly id: string;
20
+ readonly name: string;
21
+ readonly disabled?: boolean;
22
+ readonly autofocus?: boolean;
23
+ readonly onChange: (event: ChangeEvent<HTMLInputElement>) => void;
24
+ readonly onBlur: (event?: FocusEvent<HTMLInputElement>) => void;
25
+ readonly onFocus: (event: FocusEvent<HTMLInputElement>) => void;
26
+ readonly onKeyDown: (event: KeyboardEvent<HTMLInputElement>) => void;
27
+ readonly value?: string;
28
+ readonly "aria-describedby"?: string;
29
+ };
30
+ readonly descriptionIdentifier: string;
31
+ }
32
+ export declare function useInputEmailFormField({ id, name, disabled, autofocus, description, inline, value, handleChange, handleBlur, handleFocus, handleKeyDown, error, ...rest }: UseInputEmailFormFieldProps): UseInputEmailFormFieldReturn;
@@ -3,12 +3,13 @@
3
3
  var React = require('react');
4
4
  var FormField = require('../FormField-cjs.js');
5
5
  require('classnames');
6
- require('../tslib.es6-cjs.js');
6
+ var tslib_es6 = require('../tslib.es6-cjs.js');
7
7
  require('react-hook-form');
8
8
  require('@jobber/hooks');
9
9
  require('framer-motion');
10
10
  require('@jobber/design');
11
11
  require('../Button-cjs.js');
12
+ var omit = require('../omit-cjs.js');
12
13
  require('../Icon-cjs.js');
13
14
  require('../Text-cjs.js');
14
15
  require('../Typography-cjs.js');
@@ -16,6 +17,17 @@ require('../useFormFieldFocus-cjs.js');
16
17
  require('../InputValidation-cjs.js');
17
18
  require('../Spinner-cjs.js');
18
19
  require('react-router-dom');
20
+ require('../_commonjsHelpers-cjs.js');
21
+ require('../_baseGet-cjs.js');
22
+ require('../isTypedArray-cjs.js');
23
+ require('../isObjectLike-cjs.js');
24
+ require('../identity-cjs.js');
25
+ require('../_getTag-cjs.js');
26
+ require('../isSymbol-cjs.js');
27
+ require('../keysIn-cjs.js');
28
+ require('../_baseAssignValue-cjs.js');
29
+ require('../_baseFlatten-cjs.js');
30
+ require('../_setToString-cjs.js');
19
31
 
20
32
  const validationMessage = "Please enter a valid email";
21
33
 
@@ -37,7 +49,7 @@ function InputEmail$1(props) {
37
49
  function useInputEmailActions({ onChange, inputRef, onEnter, onFocus, onBlur, onKeyDown, }) {
38
50
  function handleClear() {
39
51
  var _a;
40
- // Don't call blur handler when programmatically clearing
52
+ handleBlur();
41
53
  onChange === null || onChange === void 0 ? void 0 : onChange("");
42
54
  (_a = inputRef === null || inputRef === void 0 ? void 0 : inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
43
55
  }
@@ -71,10 +83,19 @@ function useInputEmailActions({ onChange, inputRef, onEnter, onFocus, onBlur, on
71
83
  };
72
84
  }
73
85
 
86
+ function useInputEmailFormField(_a) {
87
+ var { id, name, disabled, autofocus, description, inline, value, handleChange, handleBlur, handleFocus, handleKeyDown, error } = _a, rest = tslib_es6.__rest(_a, ["id", "name", "disabled", "autofocus", "description", "inline", "value", "handleChange", "handleBlur", "handleFocus", "handleKeyDown", "error"]);
88
+ const descriptionIdentifier = `descriptionUUID--${id}`;
89
+ const fieldProps = Object.assign(Object.assign(Object.assign({}, rest), { id,
90
+ name,
91
+ disabled, autoFocus: autofocus, onChange: handleChange, onBlur: handleBlur, onFocus: handleFocus, onKeyDown: handleKeyDown, value, invalid: error || rest.invalid ? "true" : undefined }), (description &&
92
+ !inline && { "aria-describedby": descriptionIdentifier }));
93
+ return { fieldProps, descriptionIdentifier };
94
+ }
95
+
74
96
  const InputEmailRebuilt = React.forwardRef(function InputEmailInternal(props, ref) {
75
97
  var _a, _b, _c;
76
- const generatedId = React.useId();
77
- const id = props.identifier || props.id || generatedId;
98
+ const id = React.useId();
78
99
  const inputRef = (_a = ref) !== null && _a !== void 0 ? _a : React.useRef(null);
79
100
  const wrapperRef = React.useRef(null);
80
101
  const { inputStyle } = FormField.useFormFieldWrapperStyles({
@@ -85,7 +106,7 @@ const InputEmailRebuilt = React.forwardRef(function InputEmailInternal(props, re
85
106
  value: props.value,
86
107
  invalid: props.invalid,
87
108
  error: props.error,
88
- maxLength: undefined, // v2: maxLength is for HTML validation only, not for width styling
109
+ maxLength: props.maxLength,
89
110
  disabled: props.disabled,
90
111
  placeholder: props.placeholder,
91
112
  });
@@ -101,11 +122,25 @@ const InputEmailRebuilt = React.forwardRef(function InputEmailInternal(props, re
101
122
  onEnter: props.onEnter,
102
123
  inputRef,
103
124
  });
104
- const descriptionIdentifier = `descriptionUUID--${id}`;
105
- const hasDescription = props.description && !props.inline;
106
- const isInvalid = Boolean(props.ariaInvalid || props.error || props.invalid);
107
- return (React.createElement(FormField.FormFieldWrapper, { error: props.error || "", invalid: props.invalid, identifier: id, descriptionIdentifier: descriptionIdentifier, size: props.size, inline: props.inline, align: props.align, prefix: props.prefix, suffix: props.suffix, description: props.description, clearable: (_b = props.clearable) !== null && _b !== void 0 ? _b : "never", onClear: handleClear, wrapperRef: wrapperRef, maxLength: props.maxLength, disabled: props.disabled, type: "email", value: props.value, placeholder: props.placeholder, autofocus: props.autoFocus, name: name },
108
- React.createElement("input", { id: id, name: name, type: "email", ref: inputRef, className: inputStyle, value: props.value, disabled: props.disabled, readOnly: props.readOnly, required: props.required, autoFocus: props.autoFocus, autoComplete: props.autoComplete, maxLength: props.maxLength, minLength: props.minLength, pattern: props.pattern, inputMode: props.inputMode, tabIndex: props.tabIndex, role: props.role, "aria-label": props.ariaLabel, "aria-describedby": hasDescription ? descriptionIdentifier : props.ariaDescribedBy, "aria-invalid": isInvalid ? true : undefined, "aria-controls": props.ariaControls, "aria-expanded": props.ariaExpanded, "aria-activedescendant": props.ariaActiveDescendant, "aria-autocomplete": props.ariaAutocomplete, "aria-required": props.ariaRequired, onChange: handleChange, onBlur: handleBlur, onFocus: handleFocus, onKeyDown: handleKeyDown, onKeyUp: props.onKeyUp, "data-testid": "ATL-InputEmail-input" }),
125
+ const inputProps = omit.omit(props, [
126
+ "placeholder",
127
+ "onChange",
128
+ "onBlur",
129
+ "onFocus",
130
+ "onEnter",
131
+ "size",
132
+ "prefix",
133
+ "suffix",
134
+ "version",
135
+ ]);
136
+ const { fieldProps, descriptionIdentifier } = useInputEmailFormField(Object.assign(Object.assign({}, inputProps), { id,
137
+ name,
138
+ handleChange,
139
+ handleBlur,
140
+ handleFocus,
141
+ handleKeyDown }));
142
+ return (React.createElement(FormField.FormFieldWrapper, { error: props.error || "", invalid: props.invalid, identifier: props.identifier || id, descriptionIdentifier: descriptionIdentifier, size: props.size, inline: props.inline, align: props.align, prefix: props.prefix, suffix: props.suffix, description: props.description, clearable: (_b = props.clearable) !== null && _b !== void 0 ? _b : "never", onClear: handleClear, wrapperRef: wrapperRef, maxLength: props.maxLength, disabled: props.disabled, type: "email", value: props.value, placeholder: props.placeholder, autofocus: props.autoFocus, name: name },
143
+ React.createElement("input", Object.assign({}, fieldProps, { ref: inputRef, type: "email", className: inputStyle, value: props.value, "data-testid": "ATL-InputEmail-input" })),
109
144
  React.createElement(FormField.FormFieldPostFix, { variation: "spinner", visible: (_c = props.loading) !== null && _c !== void 0 ? _c : false }),
110
145
  props.children));
111
146
  });
@@ -1,12 +1,13 @@
1
1
  import React__default, { forwardRef, useId, useRef } from 'react';
2
2
  import { k as FormField, j as useFormFieldWrapperStyles, b as useAtlantisFormFieldName, f as FormFieldWrapper, l as FormFieldPostFix } from '../FormField-es.js';
3
3
  import 'classnames';
4
- import '../tslib.es6-es.js';
4
+ import { _ as __rest } from '../tslib.es6-es.js';
5
5
  import 'react-hook-form';
6
6
  import '@jobber/hooks';
7
7
  import 'framer-motion';
8
8
  import '@jobber/design';
9
9
  import '../Button-es.js';
10
+ import { o as omit } from '../omit-es.js';
10
11
  import '../Icon-es.js';
11
12
  import '../Text-es.js';
12
13
  import '../Typography-es.js';
@@ -14,6 +15,17 @@ import '../useFormFieldFocus-es.js';
14
15
  import '../InputValidation-es.js';
15
16
  import '../Spinner-es.js';
16
17
  import 'react-router-dom';
18
+ import '../_commonjsHelpers-es.js';
19
+ import '../_baseGet-es.js';
20
+ import '../isTypedArray-es.js';
21
+ import '../isObjectLike-es.js';
22
+ import '../identity-es.js';
23
+ import '../_getTag-es.js';
24
+ import '../isSymbol-es.js';
25
+ import '../keysIn-es.js';
26
+ import '../_baseAssignValue-es.js';
27
+ import '../_baseFlatten-es.js';
28
+ import '../_setToString-es.js';
17
29
 
18
30
  const validationMessage = "Please enter a valid email";
19
31
 
@@ -35,7 +47,7 @@ function InputEmail$1(props) {
35
47
  function useInputEmailActions({ onChange, inputRef, onEnter, onFocus, onBlur, onKeyDown, }) {
36
48
  function handleClear() {
37
49
  var _a;
38
- // Don't call blur handler when programmatically clearing
50
+ handleBlur();
39
51
  onChange === null || onChange === void 0 ? void 0 : onChange("");
40
52
  (_a = inputRef === null || inputRef === void 0 ? void 0 : inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
41
53
  }
@@ -69,10 +81,19 @@ function useInputEmailActions({ onChange, inputRef, onEnter, onFocus, onBlur, on
69
81
  };
70
82
  }
71
83
 
84
+ function useInputEmailFormField(_a) {
85
+ var { id, name, disabled, autofocus, description, inline, value, handleChange, handleBlur, handleFocus, handleKeyDown, error } = _a, rest = __rest(_a, ["id", "name", "disabled", "autofocus", "description", "inline", "value", "handleChange", "handleBlur", "handleFocus", "handleKeyDown", "error"]);
86
+ const descriptionIdentifier = `descriptionUUID--${id}`;
87
+ const fieldProps = Object.assign(Object.assign(Object.assign({}, rest), { id,
88
+ name,
89
+ disabled, autoFocus: autofocus, onChange: handleChange, onBlur: handleBlur, onFocus: handleFocus, onKeyDown: handleKeyDown, value, invalid: error || rest.invalid ? "true" : undefined }), (description &&
90
+ !inline && { "aria-describedby": descriptionIdentifier }));
91
+ return { fieldProps, descriptionIdentifier };
92
+ }
93
+
72
94
  const InputEmailRebuilt = forwardRef(function InputEmailInternal(props, ref) {
73
95
  var _a, _b, _c;
74
- const generatedId = useId();
75
- const id = props.identifier || props.id || generatedId;
96
+ const id = useId();
76
97
  const inputRef = (_a = ref) !== null && _a !== void 0 ? _a : useRef(null);
77
98
  const wrapperRef = useRef(null);
78
99
  const { inputStyle } = useFormFieldWrapperStyles({
@@ -83,7 +104,7 @@ const InputEmailRebuilt = forwardRef(function InputEmailInternal(props, ref) {
83
104
  value: props.value,
84
105
  invalid: props.invalid,
85
106
  error: props.error,
86
- maxLength: undefined, // v2: maxLength is for HTML validation only, not for width styling
107
+ maxLength: props.maxLength,
87
108
  disabled: props.disabled,
88
109
  placeholder: props.placeholder,
89
110
  });
@@ -99,11 +120,25 @@ const InputEmailRebuilt = forwardRef(function InputEmailInternal(props, ref) {
99
120
  onEnter: props.onEnter,
100
121
  inputRef,
101
122
  });
102
- const descriptionIdentifier = `descriptionUUID--${id}`;
103
- const hasDescription = props.description && !props.inline;
104
- const isInvalid = Boolean(props.ariaInvalid || props.error || props.invalid);
105
- return (React__default.createElement(FormFieldWrapper, { error: props.error || "", invalid: props.invalid, identifier: id, descriptionIdentifier: descriptionIdentifier, size: props.size, inline: props.inline, align: props.align, prefix: props.prefix, suffix: props.suffix, description: props.description, clearable: (_b = props.clearable) !== null && _b !== void 0 ? _b : "never", onClear: handleClear, wrapperRef: wrapperRef, maxLength: props.maxLength, disabled: props.disabled, type: "email", value: props.value, placeholder: props.placeholder, autofocus: props.autoFocus, name: name },
106
- React__default.createElement("input", { id: id, name: name, type: "email", ref: inputRef, className: inputStyle, value: props.value, disabled: props.disabled, readOnly: props.readOnly, required: props.required, autoFocus: props.autoFocus, autoComplete: props.autoComplete, maxLength: props.maxLength, minLength: props.minLength, pattern: props.pattern, inputMode: props.inputMode, tabIndex: props.tabIndex, role: props.role, "aria-label": props.ariaLabel, "aria-describedby": hasDescription ? descriptionIdentifier : props.ariaDescribedBy, "aria-invalid": isInvalid ? true : undefined, "aria-controls": props.ariaControls, "aria-expanded": props.ariaExpanded, "aria-activedescendant": props.ariaActiveDescendant, "aria-autocomplete": props.ariaAutocomplete, "aria-required": props.ariaRequired, onChange: handleChange, onBlur: handleBlur, onFocus: handleFocus, onKeyDown: handleKeyDown, onKeyUp: props.onKeyUp, "data-testid": "ATL-InputEmail-input" }),
123
+ const inputProps = omit(props, [
124
+ "placeholder",
125
+ "onChange",
126
+ "onBlur",
127
+ "onFocus",
128
+ "onEnter",
129
+ "size",
130
+ "prefix",
131
+ "suffix",
132
+ "version",
133
+ ]);
134
+ const { fieldProps, descriptionIdentifier } = useInputEmailFormField(Object.assign(Object.assign({}, inputProps), { id,
135
+ name,
136
+ handleChange,
137
+ handleBlur,
138
+ handleFocus,
139
+ handleKeyDown }));
140
+ return (React__default.createElement(FormFieldWrapper, { error: props.error || "", invalid: props.invalid, identifier: props.identifier || id, descriptionIdentifier: descriptionIdentifier, size: props.size, inline: props.inline, align: props.align, prefix: props.prefix, suffix: props.suffix, description: props.description, clearable: (_b = props.clearable) !== null && _b !== void 0 ? _b : "never", onClear: handleClear, wrapperRef: wrapperRef, maxLength: props.maxLength, disabled: props.disabled, type: "email", value: props.value, placeholder: props.placeholder, autofocus: props.autoFocus, name: name },
141
+ React__default.createElement("input", Object.assign({}, fieldProps, { ref: inputRef, type: "email", className: inputStyle, value: props.value, "data-testid": "ATL-InputEmail-input" })),
107
142
  React__default.createElement(FormFieldPostFix, { variation: "spinner", visible: (_c = props.loading) !== null && _c !== void 0 ? _c : false }),
108
143
  props.children));
109
144
  });
@@ -1,43 +1,22 @@
1
1
  import type { ReactNode } from "react";
2
2
  import type React from "react";
3
3
  import type { CommonFormFieldProps, FormFieldProps } from "../FormField";
4
- import type { AriaInputProps, FocusEvents, KeyboardEvents } from "../FormField/FormFieldTypes";
5
4
  export type InputNumberVersion = 1 | 2 | undefined;
6
- export interface InputNumberRebuiltProps extends Omit<CommonFormFieldProps, "version">, AriaInputProps, FocusEvents<HTMLInputElement>, KeyboardEvents<HTMLInputElement> {
5
+ export interface InputNumberRebuiltProps extends Omit<CommonFormFieldProps, "version">, Pick<FormFieldProps, "onFocus" | "onBlur" | "inputRef" | "readonly" | "size"> {
7
6
  readonly align?: "center" | "right";
8
- /**
9
- * HTML autocomplete attribute for browser autofill.
10
- */
11
- readonly autoComplete?: string;
7
+ readonly autocomplete?: boolean;
12
8
  readonly autoFocus?: boolean;
13
9
  readonly defaultValue?: number;
14
10
  readonly description?: ReactNode;
15
11
  readonly error?: string;
16
12
  readonly formatOptions?: Intl.NumberFormatOptions;
17
- /**
18
- * @deprecated Use `id` instead.
19
- */
20
13
  readonly identifier?: string;
21
- /**
22
- * The ID of the input element.
23
- */
24
- readonly id?: string;
25
14
  readonly inline?: boolean;
26
15
  readonly invalid?: boolean;
27
16
  readonly maxValue?: number;
28
17
  readonly minValue?: number;
29
- /**
30
- * Callback for value changes.
31
- * @param newValue - The new numeric value
32
- * @param event - Optional change event
33
- */
34
18
  readonly onChange?: (newValue: number, event?: React.ChangeEvent<HTMLInputElement>) => void;
35
- /**
36
- * Whether the input is read-only.
37
- */
38
- readonly readOnly?: boolean;
39
19
  readonly showMiniLabel?: boolean;
40
- readonly size?: FormFieldProps["size"];
41
20
  readonly value?: number;
42
21
  /**
43
22
  * Version 2 is highly experimental. Avoid using it unless you have talked with Atlantis first.
@@ -2740,12 +2740,9 @@ const InputNumberRebuilt = React.forwardRef((props, ref) => {
2740
2740
  }
2741
2741
  },
2742
2742
  }));
2743
- const { align, description, disabled, error, inline, invalid, placeholder, readOnly, showMiniLabel = true, size, minValue, maxValue,
2744
- // Deprecated props (filter out to avoid spreading to React Aria)
2745
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
2746
- identifier: _deprecatedIdentifier } = props, ariaNumberFieldProps = tslib_es6.__rest(props, ["align", "description", "disabled", "error", "inline", "invalid", "placeholder", "readOnly", "showMiniLabel", "size", "minValue", "maxValue", "identifier"]);
2743
+ const { align, description, disabled, error, inline, invalid, placeholder, readonly, showMiniLabel = true, size, minValue, maxValue } = props, ariaNumberFieldProps = tslib_es6.__rest(props, ["align", "description", "disabled", "error", "inline", "invalid", "placeholder", "readonly", "showMiniLabel", "size", "minValue", "maxValue"]);
2747
2744
  const stringDescription = typeof description === "string";
2748
- return (React.createElement($b91743d66a0ed188$export$63c5fa0b2fdccd2e, Object.assign({}, ariaNumberFieldProps, { className: classnames(styles.container, inline && styles.inline), formatOptions: mergedFormatOptions, id: props.id, isDisabled: disabled, isInvalid: invalid, isReadOnly: readOnly, minValue: minValue, maxValue: maxValue, onBlur: e => { var _a; return (_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, e); }, onFocus: e => { var _a; return (_a = props.onFocus) === null || _a === void 0 ? void 0 : _a.call(props, e); }, onChange: handleChange }),
2745
+ return (React.createElement($b91743d66a0ed188$export$63c5fa0b2fdccd2e, Object.assign({}, ariaNumberFieldProps, { className: classnames(styles.container, inline && styles.inline), formatOptions: mergedFormatOptions, isDisabled: disabled, isInvalid: invalid, isReadOnly: readonly, minValue: minValue, maxValue: maxValue, onBlur: e => { var _a; return (_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, e); }, onFocus: e => { var _a; return (_a = props.onFocus) === null || _a === void 0 ? void 0 : _a.call(props, e); }, onChange: handleChange }),
2749
2746
  React.createElement($a049562f99e7db0e$export$eb2fcfdbd7ba97d4, { className: classnames(styles.wrapper, align && styles[align], invalid && styles.invalid, disabled && styles.disabled) },
2750
2747
  React.createElement("div", { className: styles.horizontalWrapper },
2751
2748
  React.createElement("div", { className: classnames(styles.inputWrapper, disabled && styles.disabled, !showMiniLabel && styles.hideLabel, size && styles[size]) },
@@ -2776,7 +2773,7 @@ function InputNumberInternal(props, ref) {
2776
2773
  }
2777
2774
  },
2778
2775
  }));
2779
- return (React.createElement(FormField.FormField, Object.assign({}, props, { type: "number", inputRef: inputRef, onChange: handleChange, validations: Object.assign(Object.assign({}, props.validations), { validate: customValidators((_a = props.validations) === null || _a === void 0 ? void 0 : _a.validate) }) })));
2776
+ return (React.createElement(FormField.FormField, Object.assign({}, props, { clearable: "never", type: "number", inputRef: inputRef, onChange: handleChange, validations: Object.assign(Object.assign({}, props.validations), { validate: customValidators((_a = props.validations) === null || _a === void 0 ? void 0 : _a.validate) }) })));
2780
2777
  function customValidators(validators) {
2781
2778
  if (validators == null) {
2782
2779
  return getOverLimitMessage;
@@ -2738,12 +2738,9 @@ const InputNumberRebuilt = forwardRef((props, ref) => {
2738
2738
  }
2739
2739
  },
2740
2740
  }));
2741
- const { align, description, disabled, error, inline, invalid, placeholder, readOnly, showMiniLabel = true, size, minValue, maxValue,
2742
- // Deprecated props (filter out to avoid spreading to React Aria)
2743
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
2744
- identifier: _deprecatedIdentifier } = props, ariaNumberFieldProps = __rest(props, ["align", "description", "disabled", "error", "inline", "invalid", "placeholder", "readOnly", "showMiniLabel", "size", "minValue", "maxValue", "identifier"]);
2741
+ const { align, description, disabled, error, inline, invalid, placeholder, readonly, showMiniLabel = true, size, minValue, maxValue } = props, ariaNumberFieldProps = __rest(props, ["align", "description", "disabled", "error", "inline", "invalid", "placeholder", "readonly", "showMiniLabel", "size", "minValue", "maxValue"]);
2745
2742
  const stringDescription = typeof description === "string";
2746
- return (React__default.createElement($b91743d66a0ed188$export$63c5fa0b2fdccd2e, Object.assign({}, ariaNumberFieldProps, { className: classnames(styles.container, inline && styles.inline), formatOptions: mergedFormatOptions, id: props.id, isDisabled: disabled, isInvalid: invalid, isReadOnly: readOnly, minValue: minValue, maxValue: maxValue, onBlur: e => { var _a; return (_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, e); }, onFocus: e => { var _a; return (_a = props.onFocus) === null || _a === void 0 ? void 0 : _a.call(props, e); }, onChange: handleChange }),
2743
+ return (React__default.createElement($b91743d66a0ed188$export$63c5fa0b2fdccd2e, Object.assign({}, ariaNumberFieldProps, { className: classnames(styles.container, inline && styles.inline), formatOptions: mergedFormatOptions, isDisabled: disabled, isInvalid: invalid, isReadOnly: readonly, minValue: minValue, maxValue: maxValue, onBlur: e => { var _a; return (_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, e); }, onFocus: e => { var _a; return (_a = props.onFocus) === null || _a === void 0 ? void 0 : _a.call(props, e); }, onChange: handleChange }),
2747
2744
  React__default.createElement($a049562f99e7db0e$export$eb2fcfdbd7ba97d4, { className: classnames(styles.wrapper, align && styles[align], invalid && styles.invalid, disabled && styles.disabled) },
2748
2745
  React__default.createElement("div", { className: styles.horizontalWrapper },
2749
2746
  React__default.createElement("div", { className: classnames(styles.inputWrapper, disabled && styles.disabled, !showMiniLabel && styles.hideLabel, size && styles[size]) },
@@ -2774,7 +2771,7 @@ function InputNumberInternal(props, ref) {
2774
2771
  }
2775
2772
  },
2776
2773
  }));
2777
- return (React__default.createElement(FormField, Object.assign({}, props, { type: "number", inputRef: inputRef, onChange: handleChange, validations: Object.assign(Object.assign({}, props.validations), { validate: customValidators((_a = props.validations) === null || _a === void 0 ? void 0 : _a.validate) }) })));
2774
+ return (React__default.createElement(FormField, Object.assign({}, props, { clearable: "never", type: "number", inputRef: inputRef, onChange: handleChange, validations: Object.assign(Object.assign({}, props.validations), { validate: customValidators((_a = props.validations) === null || _a === void 0 ? void 0 : _a.validate) }) })));
2778
2775
  function customValidators(validators) {
2779
2776
  if (validators == null) {
2780
2777
  return getOverLimitMessage;
@@ -1,5 +1,6 @@
1
+ import type { Clearable } from "@jobber/hooks";
1
2
  import type { InputMaskProps } from "./InputMask";
2
- import type { CommonFormFieldProps, FocusEvents, FormFieldProps, HTMLInputBaseProps, KeyboardEvents, RebuiltInputCommonProps } from "../FormField";
3
+ import type { CommonFormFieldProps, FormFieldProps } from "../FormField";
3
4
  export interface InputPhoneNumberLegacyProps extends Omit<CommonFormFieldProps, "align">, Pick<FormFieldProps, "autocomplete" | "onEnter" | "onFocus" | "onBlur" | "validations" | "readonly" | "prefix" | "suffix"> {
4
5
  readonly value: string;
5
6
  readonly onChange: (value: string) => void;
@@ -15,21 +16,20 @@ export interface InputPhoneNumberLegacyProps extends Omit<CommonFormFieldProps,
15
16
  */
16
17
  readonly required?: boolean;
17
18
  }
18
- export interface InputPhoneNumberRebuiltProps extends Omit<HTMLInputBaseProps, "type" | "maxLength" | "minLength">, FocusEvents<HTMLInputElement>, KeyboardEvents<HTMLInputElement>, RebuiltInputCommonProps {
19
- /**
20
- * The current value of the input.
21
- */
19
+ export interface InputPhoneNumberRebuiltProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "onChange" | "onBlur" | "size" | "suffix" | "prefix" | "value" | "max" | "min" | "defaultValue" | "readOnly" | "type" | "maxLength" | "minLength"> {
20
+ readonly error?: string;
21
+ readonly invalid?: boolean;
22
+ readonly identifier?: string;
23
+ readonly autocomplete?: boolean | string;
24
+ readonly loading?: boolean;
25
+ readonly onKeyUp?: (event: React.KeyboardEvent<HTMLInputElement>) => void;
26
+ readonly children?: React.ReactNode;
27
+ readonly clearable?: Clearable;
22
28
  readonly value: string;
23
- /**
24
- * Custom onChange handler that provides the new value as the first argument.
25
- */
26
29
  readonly onChange: (value: string, event?: React.ChangeEvent<HTMLInputElement>) => void;
27
- /**
28
- * A callback to handle "Enter" keypress. This will only run
29
- * if Enter is the only key. Will not run if Shift or Control
30
- * are being held.
31
- */
30
+ readonly onBlur?: (event?: React.FocusEvent<HTMLInputElement>) => void;
32
31
  readonly onEnter?: (event: React.KeyboardEvent<HTMLInputElement>) => void;
32
+ readonly onFocus?: (event?: React.FocusEvent<HTMLInputElement>) => void;
33
33
  /**
34
34
  * A pattern to specify the format to display the phone number in.
35
35
  * For example if you want to display the format for [Denmark](https://en.wikipedia.org/wiki/National_conventions_for_writing_telephone_numbers#Denmark)
@@ -38,8 +38,19 @@ export interface InputPhoneNumberRebuiltProps extends Omit<HTMLInputBaseProps, "
38
38
  */
39
39
  readonly pattern?: InputMaskProps["pattern"];
40
40
  /**
41
- * @deprecated Use `id` instead. This prop will be removed in a future version.
41
+ * Shows a "required" validation message when the component is left empty.
42
42
  */
43
- readonly identifier?: string;
43
+ readonly required?: boolean;
44
+ /**
45
+ * Version 2 is highly experimental, avoid using it unless you have talked with Atlantis first.
46
+ */
47
+ readonly version: 2;
48
+ readonly size?: FormFieldProps["size"];
49
+ readonly inline?: FormFieldProps["inline"];
50
+ readonly align?: FormFieldProps["align"];
51
+ readonly prefix?: FormFieldProps["prefix"];
52
+ readonly suffix?: FormFieldProps["suffix"];
53
+ readonly description?: FormFieldProps["description"];
54
+ readonly readonly?: boolean;
44
55
  }
45
56
  export declare const DEFAULT_PATTERN = "(***) ***-****";
@@ -11,6 +11,6 @@ export declare function useInputPhoneActions({ onChange, inputRef, onFocus, onBl
11
11
  handleClear: () => void;
12
12
  handleChange: (event: ChangeEvent<HTMLInputElement>) => void;
13
13
  handleFocus: (event: FocusEvent<HTMLInputElement>) => void;
14
- handleBlur: (event: FocusEvent<HTMLInputElement>) => void;
14
+ handleBlur: (event?: FocusEvent<HTMLInputElement>) => void;
15
15
  handleKeyDown: (event: KeyboardEvent<HTMLInputElement>) => void;
16
16
  };