@jobber/components 6.103.2-JOB-140609-f6002b5.12 → 6.103.2-JOB-135467-8ed574a.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/Autocomplete/index.cjs +12 -0
  2. package/dist/Autocomplete/index.mjs +12 -0
  3. package/dist/Button/Button.d.ts +757 -6
  4. package/dist/Button-cjs.js +15 -9
  5. package/dist/Button-es.js +16 -10
  6. package/dist/Chips/InternalChipDismissible/hooks/index.cjs +2 -2
  7. package/dist/Chips/InternalChipDismissible/hooks/index.mjs +2 -2
  8. package/dist/Chips/InternalChipDismissible/index.cjs +2 -2
  9. package/dist/Chips/InternalChipDismissible/index.mjs +2 -2
  10. package/dist/Chips/index.cjs +2 -2
  11. package/dist/Chips/index.mjs +2 -2
  12. package/dist/DataList/components/DataListSearch/index.cjs +12 -1
  13. package/dist/DataList/components/DataListSearch/index.mjs +12 -1
  14. package/dist/DataList/index.cjs +8 -0
  15. package/dist/DataList/index.mjs +8 -0
  16. package/dist/DataTable/index.cjs +2 -2
  17. package/dist/DataTable/index.mjs +2 -2
  18. package/dist/DatePicker/index.cjs +2 -2
  19. package/dist/DatePicker/index.mjs +2 -2
  20. package/dist/FormField/FormFieldTypes.d.ts +0 -195
  21. package/dist/FormField-cjs.js +1 -0
  22. package/dist/FormField-es.js +1 -1
  23. package/dist/InputDate/index.cjs +4 -8
  24. package/dist/InputDate/index.mjs +4 -8
  25. package/dist/InputDate/useInputDateActivatorActions.d.ts +2 -2
  26. package/dist/InputEmail/InputEmail.types.d.ts +21 -28
  27. package/dist/InputEmail/hooks/useInputEmailActions.d.ts +1 -1
  28. package/dist/InputEmail/hooks/useInputEmailFormField.d.ts +32 -0
  29. package/dist/InputEmail/index.cjs +45 -10
  30. package/dist/InputEmail/index.mjs +45 -10
  31. package/dist/InputPhoneNumber/InputPhoneNumber.types.d.ts +24 -25
  32. package/dist/InputPhoneNumber/hooks/useInputPhoneActions.d.ts +1 -1
  33. package/dist/InputPhoneNumber/hooks/useInputPhoneFormField.d.ts +71 -0
  34. package/dist/InputPhoneNumber/index.cjs +36 -24
  35. package/dist/InputPhoneNumber/index.mjs +36 -24
  36. package/dist/InputText/InputText.d.ts +2 -2
  37. package/dist/InputText/InputText.types.d.ts +24 -39
  38. package/dist/InputText/index.cjs +55 -26
  39. package/dist/InputText/index.mjs +56 -27
  40. package/dist/InputText/useInputTextActions.d.ts +1 -1
  41. package/dist/InputText/useInputTextFormField.d.ts +352 -0
  42. package/dist/InputTime/index.cjs +1 -1
  43. package/dist/InputTime/index.mjs +1 -1
  44. package/dist/List/index.cjs +2 -2
  45. package/dist/List/index.mjs +2 -2
  46. package/dist/RecurringSelect/index.cjs +2 -2
  47. package/dist/RecurringSelect/index.mjs +2 -2
  48. package/dist/Select/index.cjs +2 -2
  49. package/dist/Select/index.mjs +2 -2
  50. package/dist/_baseEach-cjs.js +12 -12
  51. package/dist/_baseEach-es.js +1 -1
  52. package/dist/_baseFlatten-cjs.js +2 -2
  53. package/dist/_baseFlatten-es.js +1 -1
  54. package/dist/{_getAllKeys-cjs.js → _baseGet-cjs.js} +181 -181
  55. package/dist/{_getAllKeys-es.js → _baseGet-es.js} +182 -182
  56. package/dist/index.cjs +2 -2
  57. package/dist/index.mjs +2 -2
  58. package/dist/omit-cjs.js +14 -14
  59. package/dist/omit-es.js +1 -1
  60. package/dist/useScrollToActive-cjs.js +3 -3
  61. package/dist/useScrollToActive-es.js +1 -1
  62. package/package.json +2 -2
@@ -113,7 +113,7 @@ const DEFAULT_PATTERN = "(***) ***-****";
113
113
  function useInputPhoneActions({ onChange, inputRef, onFocus, onBlur, onKeyDown, onEnter, }) {
114
114
  function handleClear() {
115
115
  var _a;
116
- // Don't call blur handler when programmatically clearing
116
+ handleBlur();
117
117
  onChange && onChange("");
118
118
  (_a = inputRef === null || inputRef === void 0 ? void 0 : inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
119
119
  }
@@ -147,27 +147,28 @@ function useInputPhoneActions({ onChange, inputRef, onFocus, onBlur, onKeyDown,
147
147
  };
148
148
  }
149
149
 
150
- const InputPhoneNumberRebuilt = forwardRef(
151
- // eslint-disable-next-line max-statements
152
- function InputPhoneNumberInternal(_a, ref) {
150
+ /**
151
+ * Provides the props for the html fields rendered by the html input.
152
+ * 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.
153
+ */
154
+ function useInputPhoneFormField(_a) {
155
+ var { id, name, description, inline, handleChange, handleBlur, handleFocus, handleKeyDown, error, disabled, autofocus, value, readonly } = _a, rest = __rest(_a, ["id", "name", "description", "inline", "handleChange", "handleBlur", "handleFocus", "handleKeyDown", "error", "disabled", "autofocus", "value", "readonly"]);
156
+ const descriptionIdentifier = `descriptionUUID--${id}`;
157
+ const fieldProps = Object.assign(Object.assign(Object.assign(Object.assign({}, rest), { id,
158
+ name,
159
+ disabled, autoFocus: autofocus, onChange: handleChange, onBlur: handleBlur, onFocus: handleFocus, onKeyDown: handleKeyDown, value, invalid: error || rest.invalid ? "true" : undefined }), (description &&
160
+ !inline && { "aria-describedby": descriptionIdentifier })), { readOnly: readonly });
161
+ return { fieldProps, descriptionIdentifier };
162
+ }
163
+
164
+ const InputPhoneNumberRebuilt = forwardRef(function InputPhoneNumberInternal(_a, ref) {
153
165
  var _b, _c, _d, _e;
154
166
  var { pattern = DEFAULT_PATTERN } = _a, props = __rest(_a, ["pattern"]);
155
167
  const inputPhoneNumberRef = (_b = ref) !== null && _b !== void 0 ? _b : React__default.useRef(null);
156
168
  const wrapperRef = React__default.useRef(null);
157
- const { inputStyle } = useFormFieldWrapperStyles({
158
- size: props.size,
159
- align: props.align,
160
- placeholder: props.placeholder,
161
- value: props.value,
162
- invalid: props.invalid,
163
- error: props.error,
164
- maxLength: undefined, // v2: maxLength not used for width styling
165
- disabled: props.disabled,
166
- inline: props.inline,
167
- type: "tel",
168
- });
169
+ const { inputStyle } = useFormFieldWrapperStyles(Object.assign(Object.assign({}, props), { type: "tel" }));
169
170
  const generatedId = useId();
170
- const id = props.identifier || props.id || generatedId;
171
+ const id = props.id || generatedId;
171
172
  const { name } = useAtlantisFormFieldName({
172
173
  nameProp: props.name,
173
174
  id: id,
@@ -185,14 +186,25 @@ function InputPhoneNumberInternal(_a, ref) {
185
186
  onEnter: props.onEnter,
186
187
  inputRef: inputPhoneNumberRef,
187
188
  });
188
- const descriptionIdentifier = `descriptionUUID--${id}`;
189
- const hasDescription = props.description && !props.inline;
190
- const isInvalid = Boolean(props["aria-invalid"] || props.error || props.invalid);
191
- const effectiveReadOnly = props.readonly || props.readOnly;
192
- return (React__default.createElement(FormFieldWrapper, { disabled: props.disabled, size: props.size, inline: props.inline, wrapperRef: wrapperRef, error: (_c = props.error) !== null && _c !== void 0 ? _c : "", invalid: Boolean(props.error || props.invalid), identifier: id, descriptionIdentifier: descriptionIdentifier, description: props.description, clearable: (_d = props.clearable) !== null && _d !== void 0 ? _d : "never", onClear: handleClear, type: "tel", placeholder: props.placeholder, value: formattedValue, prefix: props.prefix, suffix: props.suffix, readonly: effectiveReadOnly, loading: props.loading },
193
- React__default.createElement("input", { id: id, name: name, type: "tel", ref: inputPhoneNumberRef, className: classnames(inputStyle, {
189
+ const { fieldProps, descriptionIdentifier } = useInputPhoneFormField({
190
+ id,
191
+ name,
192
+ handleChange,
193
+ handleBlur,
194
+ handleFocus,
195
+ handleKeyDown,
196
+ autofocus: props.autoFocus,
197
+ disabled: props.disabled,
198
+ readonly: props.readonly,
199
+ invalid: props.invalid,
200
+ error: props.error,
201
+ description: props.description,
202
+ inline: props.inline,
203
+ });
204
+ return (React__default.createElement(FormFieldWrapper, { disabled: props.disabled, size: props.size, inline: props.inline, wrapperRef: wrapperRef, error: (_c = props.error) !== null && _c !== void 0 ? _c : "", invalid: Boolean(props.error || props.invalid), identifier: id, descriptionIdentifier: descriptionIdentifier, description: props.description, clearable: (_d = props.clearable) !== null && _d !== void 0 ? _d : "never", onClear: handleClear, type: "tel", placeholder: props.placeholder, value: formattedValue, prefix: props.prefix, suffix: props.suffix, readonly: props.readonly, loading: props.loading },
205
+ React__default.createElement("input", Object.assign({ type: "tel" }, fieldProps, { ref: inputPhoneNumberRef, className: classnames(inputStyle, {
194
206
  [styles.emptyValue]: inputValue.length === 0 && pattern[0] === "(",
195
- }), value: formattedValue, disabled: props.disabled, readOnly: effectiveReadOnly, required: props.required, autoFocus: props.autoFocus, autoComplete: props.autoComplete, inputMode: props.inputMode, tabIndex: props.tabIndex, role: props.role, "aria-label": props["aria-label"], "aria-describedby": hasDescription ? descriptionIdentifier : props["aria-describedby"], "aria-invalid": isInvalid ? true : undefined, "aria-controls": props["aria-controls"], "aria-expanded": props["aria-expanded"], "aria-activedescendant": props["aria-activedescendant"], "aria-autocomplete": props["aria-autocomplete"], "aria-required": props["aria-required"], onChange: handleChange, onBlur: handleBlur, onFocus: handleFocus, onKeyDown: handleKeyDown }),
207
+ }), value: formattedValue })),
196
208
  React__default.createElement(MaskElement, { isMasking: isMasking, formattedValue: formattedValue, placeholderMask: placeholderMask }),
197
209
  React__default.createElement(FormFieldPostFix, { variation: "spinner", visible: (_e = props.loading) !== null && _e !== void 0 ? _e : false })));
198
210
  });
@@ -24,11 +24,11 @@ export declare const InputText: React.ForwardRefExoticComponent<({
24
24
  readonly toolbar?: React.ReactNode;
25
25
  readonly defaultValue?: (string | Date) | undefined;
26
26
  readonly prefix?: import("../FormField").Affix | undefined;
27
- readonly maxLength?: number | undefined;
28
27
  readonly autofocus?: boolean | undefined;
29
28
  readonly autocomplete?: (boolean | import("../FormField").AutocompleteTypes) | undefined;
30
29
  inputRef?: React.RefObject<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement> | undefined;
31
30
  readonly keyboard?: ("numeric" | "decimal") | undefined;
31
+ readonly maxLength?: number | undefined;
32
32
  readonly suffix?: import("ts-xor").XOR<import("../FormField").Affix, import("../FormField").Suffix> | undefined;
33
33
  onEnter?: ((event: React.KeyboardEvent) => void) | undefined;
34
34
  readonly readonly?: boolean | undefined;
@@ -58,11 +58,11 @@ export declare const InputText: React.ForwardRefExoticComponent<({
58
58
  readonly toolbar?: React.ReactNode;
59
59
  readonly defaultValue?: (string | Date) | undefined;
60
60
  readonly prefix?: import("../FormField").Affix | undefined;
61
- readonly maxLength?: number | undefined;
62
61
  readonly autofocus?: boolean | undefined;
63
62
  readonly autocomplete?: (boolean | import("../FormField").AutocompleteTypes) | undefined;
64
63
  inputRef?: React.RefObject<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement> | undefined;
65
64
  readonly keyboard?: ("numeric" | "decimal") | undefined;
65
+ readonly maxLength?: number | undefined;
66
66
  readonly suffix?: import("ts-xor").XOR<import("../FormField").Affix, import("../FormField").Suffix> | undefined;
67
67
  onEnter?: ((event: React.KeyboardEvent) => void) | undefined;
68
68
  readonly readonly?: boolean | undefined;
@@ -1,5 +1,6 @@
1
+ import type { Clearable } from "@jobber/hooks";
1
2
  import type { XOR } from "ts-xor";
2
- import type { CommonFormFieldProps, FocusEvents, FormFieldProps, FormFieldTypes, HTMLInputBaseProps, KeyboardEvents, RebuiltInputCommonProps } from "../FormField";
3
+ import type { AutocompleteTypes, CommonFormFieldProps, FormFieldProps, FormFieldTypes } from "../FormField";
3
4
  export interface RowRange {
4
5
  min: number;
5
6
  max: number;
@@ -9,7 +10,15 @@ export type InputTextVersion = 1 | 2 | undefined;
9
10
  * Experimental version 2 of the InputText component.
10
11
  * Do not use unless you have talked with Atlantis first.
11
12
  */
12
- export interface InputTextRebuiltProps extends HTMLInputBaseProps, FocusEvents<HTMLInputElement | HTMLTextAreaElement>, KeyboardEvents<HTMLInputElement | HTMLTextAreaElement>, RebuiltInputCommonProps {
13
+ export interface InputTextRebuiltProps extends Omit<React.InputHTMLAttributes<HTMLInputElement | HTMLTextAreaElement>, "onChange" | "onBlur" | "maxLength" | "rows" | "size" | "suffix" | "prefix" | "value" | "max" | "min" | "defaultValue"> {
14
+ readonly error?: string;
15
+ readonly invalid?: boolean;
16
+ readonly identifier?: string;
17
+ readonly autocomplete?: boolean | AutocompleteTypes;
18
+ readonly loading?: boolean;
19
+ readonly onKeyUp?: (event: React.KeyboardEvent<HTMLInputElement>) => void;
20
+ readonly children?: React.ReactNode;
21
+ readonly clearable?: Clearable;
13
22
  /**
14
23
  * Use this when you're expecting a long answer.
15
24
  */
@@ -21,48 +30,24 @@ export interface InputTextRebuiltProps extends HTMLInputBaseProps, FocusEvents<H
21
30
  * maximum number of visible rows.
22
31
  */
23
32
  readonly rows?: number | RowRange;
24
- /**
25
- * Determines what kind of form field should the component give you.
26
- */
27
33
  readonly type?: FormFieldTypes;
28
34
  /**
29
- * Toolbar to render content below the input.
30
- */
31
- readonly toolbar?: React.ReactNode;
32
- /**
33
- * Determines the visibility of the toolbar.
34
- */
35
- readonly toolbarVisibility?: "always" | "while-editing";
36
- /**
37
- * The current value of the input.
38
- */
39
- readonly value: string;
40
- /**
41
- * Custom onChange handler that provides the new value as the first argument.
35
+ * Version 2 is highly experimental. Avoid using it unless you have talked with Atlantis first.
42
36
  */
37
+ readonly version: 2;
43
38
  readonly onChange?: (newValue: string, event?: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
44
- /**
45
- * A callback to handle "Enter" keypress. This will only run
46
- * if Enter is the only key. Will not run if Shift or Control
47
- * are being held.
48
- */
49
39
  readonly onEnter?: FormFieldProps["onEnter"];
50
- /**
51
- * @deprecated Use `id` instead. This prop will be removed in a future version.
52
- */
53
- readonly identifier?: string;
54
- /**
55
- * @deprecated Use `autoComplete` with string values instead. This prop will be removed in a future version.
56
- */
57
- readonly autocomplete?: never;
58
- /**
59
- * @deprecated Use `aria-label` instead. This prop will be removed in a future version.
60
- */
61
- readonly ariaLabel?: never;
62
- /**
63
- * @deprecated Use `readOnly` instead. This prop will be removed in a future version.
64
- */
65
- readonly readonly?: never;
40
+ readonly onBlur?: FormFieldProps["onBlur"];
41
+ readonly value: string;
42
+ readonly maxLength?: number;
43
+ readonly size?: FormFieldProps["size"];
44
+ readonly inline?: FormFieldProps["inline"];
45
+ readonly align?: FormFieldProps["align"];
46
+ readonly toolbar?: FormFieldProps["toolbar"];
47
+ readonly toolbarVisibility?: FormFieldProps["toolbarVisibility"];
48
+ readonly prefix?: FormFieldProps["prefix"];
49
+ readonly suffix?: FormFieldProps["suffix"];
50
+ readonly description?: FormFieldProps["description"];
66
51
  }
67
52
  interface BaseProps extends CommonFormFieldProps, Pick<FormFieldProps, "autofocus" | "maxLength" | "readonly" | "autocomplete" | "keyboard" | "onEnter" | "onFocus" | "onBlur" | "onChange" | "inputRef" | "validations" | "defaultValue" | "prefix" | "suffix" | "toolbar" | "toolbarVisibility" | "version"> {
68
53
  multiline?: boolean;
@@ -4,11 +4,12 @@ var React = require('react');
4
4
  var jobberHooks = require('@jobber/hooks');
5
5
  var FormField = require('../FormField-cjs.js');
6
6
  require('classnames');
7
- require('../tslib.es6-cjs.js');
7
+ var tslib_es6 = require('../tslib.es6-cjs.js');
8
8
  require('react-hook-form');
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
  /**
21
33
  * Hook for resizing a textarea based on its content. The textarea will grow up to the max number of rows specified.
@@ -150,7 +162,7 @@ function insertAtCursor(input, newText) {
150
162
  function useInputTextActions({ onChange, inputRef, onEnter, onFocus, onBlur, onKeyDown, }) {
151
163
  function handleClear() {
152
164
  var _a;
153
- // Don't call blur handler when programmatically clearing
165
+ handleBlur();
154
166
  onChange && onChange("");
155
167
  (_a = inputRef === null || inputRef === void 0 ? void 0 : inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
156
168
  }
@@ -184,10 +196,23 @@ function useInputTextActions({ onChange, inputRef, onEnter, onFocus, onBlur, onK
184
196
  };
185
197
  }
186
198
 
199
+ /**
200
+ * Provides the props for the html fields rendered by the html input.
201
+ * 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.
202
+ */
203
+ function useInputTextFormField(_a) {
204
+ var { id, name, description, inline, handleChange, handleBlur, handleFocus, handleKeyDown, error } = _a, rest = tslib_es6.__rest(_a, ["id", "name", "description", "inline", "handleChange", "handleBlur", "handleFocus", "handleKeyDown", "error"]);
205
+ const descriptionIdentifier = `descriptionUUID--${id}`;
206
+ const fieldProps = Object.assign(Object.assign(Object.assign(Object.assign({}, rest), { id, className: FormField.styles.input, name, disabled: rest.disabled, inputMode: rest.inputMode, onChange: handleChange, onBlur: handleBlur, onFocus: handleFocus }), (description &&
207
+ !inline && { "aria-describedby": descriptionIdentifier })), { "aria-invalid": rest["aria-invalid"] || error || rest.invalid ? true : undefined, autoFocus: rest.autoFocus, invalid: error || rest.invalid ? "true" : undefined, onKeyDown: handleKeyDown });
208
+ return { fieldProps, descriptionIdentifier };
209
+ }
210
+
187
211
  const InputTextSPAR = React.forwardRef(function InputTextInternal(props, inputRefs) {
188
212
  var _a, _b, _c;
189
213
  const inputTextRef = React.useRef(null);
190
214
  const wrapperRef = React.useRef(null);
215
+ const legacyPropHelper = Object.assign(Object.assign({}, props), { version: 1 });
191
216
  const id = useInputTextId(props);
192
217
  const { rowRange } = useTextAreaResize({
193
218
  rows: props.rows,
@@ -195,19 +220,8 @@ const InputTextSPAR = React.forwardRef(function InputTextInternal(props, inputRe
195
220
  inputRef: inputTextRef,
196
221
  wrapperRef: wrapperRef,
197
222
  });
198
- const { inputStyle } = FormField.useFormFieldWrapperStyles({
199
- size: props.size,
200
- align: props.align,
201
- placeholder: props.placeholder,
202
- value: props.value,
203
- invalid: props.invalid,
204
- error: props.error,
205
- max: typeof props.max === "string" ? parseFloat(props.max) : props.max,
206
- maxLength: undefined, // v2: maxLength is for HTML validation only, not for width styling
207
- type: props.multiline ? "textarea" : "text",
208
- disabled: props.disabled,
209
- inline: props.inline,
210
- });
223
+ const type = props.multiline ? "textarea" : "text";
224
+ const { inputStyle } = FormField.useFormFieldWrapperStyles(legacyPropHelper);
211
225
  const { name } = FormField.useAtlantisFormFieldName({
212
226
  nameProp: props.name,
213
227
  id: id,
@@ -220,25 +234,40 @@ const InputTextSPAR = React.forwardRef(function InputTextInternal(props, inputRe
220
234
  onEnter: props.onEnter,
221
235
  inputRef: inputTextRef,
222
236
  });
223
- const descriptionIdentifier = `descriptionUUID--${id}`;
224
- const hasDescription = props.description && !props.inline;
225
- const isInvalid = Boolean(props["aria-invalid"] || props.error || props.invalid);
237
+ const inputProps = omit.omit(props, [
238
+ "onChange",
239
+ "onBlur",
240
+ "onFocus",
241
+ "onEnter",
242
+ "size",
243
+ "placeholder",
244
+ "multiline",
245
+ "prefix",
246
+ "suffix",
247
+ "version",
248
+ ]);
249
+ const { fieldProps, descriptionIdentifier } = useInputTextFormField(Object.assign(Object.assign({}, inputProps), { id,
250
+ name,
251
+ handleChange,
252
+ handleBlur,
253
+ handleFocus,
254
+ handleKeyDown }));
226
255
  return (React.createElement(FormField.FormFieldWrapper, { disabled: props.disabled, size: props.size, align: props.align, inline: props.inline, autofocus: props.autoFocus, name: name, wrapperRef: wrapperRef, error: (_a = props.error) !== null && _a !== void 0 ? _a : "", invalid: Boolean(props.error || props.invalid), identifier: id, descriptionIdentifier: descriptionIdentifier, description: props.description, clearable: (_b = props.clearable) !== null && _b !== void 0 ? _b : "never", onClear: handleClear, type: props.multiline ? "textarea" : "text", placeholder: props.placeholder, value: props.value, prefix: props.prefix, suffix: props.suffix, rows: rowRange.min, toolbar: props.toolbar, toolbarVisibility: props.toolbarVisibility },
227
256
  React.createElement(React.Fragment, null,
228
- props.multiline ? (React.createElement(TextArea, { id: id, name: name, className: inputStyle, value: props.value, rows: rowRange.min, disabled: props.disabled, readOnly: props.readOnly, required: props.required, autoFocus: props.autoFocus, autoComplete: props.autoComplete, maxLength: props.maxLength, minLength: props.minLength, inputMode: props.inputMode, tabIndex: props.tabIndex, role: props.role, "aria-label": props["aria-label"], "aria-describedby": hasDescription ? descriptionIdentifier : props["aria-describedby"], "aria-invalid": isInvalid ? true : undefined, "aria-controls": props["aria-controls"], "aria-expanded": props["aria-expanded"], "aria-activedescendant": props["aria-activedescendant"], "aria-autocomplete": props["aria-autocomplete"], "aria-required": props["aria-required"], invalid: isInvalid ? "true" : undefined, onChange: handleChange, onBlur: handleBlur, onFocus: handleFocus, onKeyDown: handleKeyDown, onKeyUp: props.onKeyUp, ref: FormField.mergeRefs([inputRefs, inputTextRef]) })) : (React.createElement(TextInput, { id: id, name: name, 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, max: props.max, min: props.min, pattern: props.pattern, inputMode: props.inputMode, tabIndex: props.tabIndex, role: props.role, "aria-label": props["aria-label"], "aria-describedby": hasDescription ? descriptionIdentifier : props["aria-describedby"], "aria-invalid": isInvalid ? true : undefined, "aria-controls": props["aria-controls"], "aria-expanded": props["aria-expanded"], "aria-activedescendant": props["aria-activedescendant"], "aria-autocomplete": props["aria-autocomplete"], "aria-required": props["aria-required"], invalid: isInvalid ? "true" : undefined, onChange: handleChange, onBlur: handleBlur, onFocus: handleFocus, onKeyDown: handleKeyDown, onKeyUp: props.onKeyUp, ref: FormField.mergeRefs([inputRefs, inputTextRef]) })),
257
+ type === "textarea" ? (React.createElement(TextArea, { fieldProps: fieldProps, rowRange: rowRange, inputRefs: [inputRefs, inputTextRef], value: props.value, inputStyle: inputStyle })) : (React.createElement(TextInput, { fieldProps: fieldProps, inputRefs: [inputRefs, inputTextRef], value: props.value, inputStyle: inputStyle })),
229
258
  React.createElement(FormField.FormFieldPostFix, { variation: "spinner", visible: (_c = props.loading) !== null && _c !== void 0 ? _c : false }),
230
259
  props.children)));
231
260
  });
232
261
  function useInputTextId(props) {
233
262
  const generatedId = React.useId();
234
- return props.identifier || props.id || generatedId;
263
+ return props.id || generatedId;
264
+ }
265
+ function TextArea({ fieldProps, rowRange, inputRefs, value, inputStyle, }) {
266
+ return (React.createElement("textarea", Object.assign({}, fieldProps, { rows: rowRange.min, ref: FormField.mergeRefs(inputRefs), className: inputStyle, value: value })));
267
+ }
268
+ function TextInput({ fieldProps, inputRefs, value, inputStyle, }) {
269
+ return (React.createElement("input", Object.assign({}, fieldProps, { ref: FormField.mergeRefs(inputRefs), className: inputStyle, value: value })));
235
270
  }
236
- const TextArea = React.forwardRef(function TextArea(props, ref) {
237
- return React.createElement("textarea", Object.assign({}, props, { ref: ref }));
238
- });
239
- const TextInput = React.forwardRef(function TextInput(props, ref) {
240
- return React.createElement("input", Object.assign({}, props, { ref: ref }));
241
- });
242
271
 
243
272
  function isNewInputTextProps(props) {
244
273
  return props.version === 2;
@@ -1,12 +1,13 @@
1
1
  import React__default, { forwardRef, useRef, useImperativeHandle, useId } from 'react';
2
2
  import { useSafeLayoutEffect } from '@jobber/hooks';
3
- import { k as FormField, j as useFormFieldWrapperStyles, b as useAtlantisFormFieldName, f as FormFieldWrapper, m as mergeRefs, l as FormFieldPostFix } from '../FormField-es.js';
3
+ import { k as FormField, s as styles, j as useFormFieldWrapperStyles, b as useAtlantisFormFieldName, f as FormFieldWrapper, l as FormFieldPostFix, m as mergeRefs } from '../FormField-es.js';
4
4
  import 'classnames';
5
- import '../tslib.es6-es.js';
5
+ import { _ as __rest } from '../tslib.es6-es.js';
6
6
  import 'react-hook-form';
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
  /**
19
31
  * Hook for resizing a textarea based on its content. The textarea will grow up to the max number of rows specified.
@@ -148,7 +160,7 @@ function insertAtCursor(input, newText) {
148
160
  function useInputTextActions({ onChange, inputRef, onEnter, onFocus, onBlur, onKeyDown, }) {
149
161
  function handleClear() {
150
162
  var _a;
151
- // Don't call blur handler when programmatically clearing
163
+ handleBlur();
152
164
  onChange && onChange("");
153
165
  (_a = inputRef === null || inputRef === void 0 ? void 0 : inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
154
166
  }
@@ -182,10 +194,23 @@ function useInputTextActions({ onChange, inputRef, onEnter, onFocus, onBlur, onK
182
194
  };
183
195
  }
184
196
 
197
+ /**
198
+ * Provides the props for the html fields rendered by the html input.
199
+ * 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.
200
+ */
201
+ function useInputTextFormField(_a) {
202
+ var { id, name, description, inline, handleChange, handleBlur, handleFocus, handleKeyDown, error } = _a, rest = __rest(_a, ["id", "name", "description", "inline", "handleChange", "handleBlur", "handleFocus", "handleKeyDown", "error"]);
203
+ const descriptionIdentifier = `descriptionUUID--${id}`;
204
+ const fieldProps = Object.assign(Object.assign(Object.assign(Object.assign({}, rest), { id, className: styles.input, name, disabled: rest.disabled, inputMode: rest.inputMode, onChange: handleChange, onBlur: handleBlur, onFocus: handleFocus }), (description &&
205
+ !inline && { "aria-describedby": descriptionIdentifier })), { "aria-invalid": rest["aria-invalid"] || error || rest.invalid ? true : undefined, autoFocus: rest.autoFocus, invalid: error || rest.invalid ? "true" : undefined, onKeyDown: handleKeyDown });
206
+ return { fieldProps, descriptionIdentifier };
207
+ }
208
+
185
209
  const InputTextSPAR = forwardRef(function InputTextInternal(props, inputRefs) {
186
210
  var _a, _b, _c;
187
211
  const inputTextRef = React__default.useRef(null);
188
212
  const wrapperRef = React__default.useRef(null);
213
+ const legacyPropHelper = Object.assign(Object.assign({}, props), { version: 1 });
189
214
  const id = useInputTextId(props);
190
215
  const { rowRange } = useTextAreaResize({
191
216
  rows: props.rows,
@@ -193,19 +218,8 @@ const InputTextSPAR = forwardRef(function InputTextInternal(props, inputRefs) {
193
218
  inputRef: inputTextRef,
194
219
  wrapperRef: wrapperRef,
195
220
  });
196
- const { inputStyle } = useFormFieldWrapperStyles({
197
- size: props.size,
198
- align: props.align,
199
- placeholder: props.placeholder,
200
- value: props.value,
201
- invalid: props.invalid,
202
- error: props.error,
203
- max: typeof props.max === "string" ? parseFloat(props.max) : props.max,
204
- maxLength: undefined, // v2: maxLength is for HTML validation only, not for width styling
205
- type: props.multiline ? "textarea" : "text",
206
- disabled: props.disabled,
207
- inline: props.inline,
208
- });
221
+ const type = props.multiline ? "textarea" : "text";
222
+ const { inputStyle } = useFormFieldWrapperStyles(legacyPropHelper);
209
223
  const { name } = useAtlantisFormFieldName({
210
224
  nameProp: props.name,
211
225
  id: id,
@@ -218,25 +232,40 @@ const InputTextSPAR = forwardRef(function InputTextInternal(props, inputRefs) {
218
232
  onEnter: props.onEnter,
219
233
  inputRef: inputTextRef,
220
234
  });
221
- const descriptionIdentifier = `descriptionUUID--${id}`;
222
- const hasDescription = props.description && !props.inline;
223
- const isInvalid = Boolean(props["aria-invalid"] || props.error || props.invalid);
235
+ const inputProps = omit(props, [
236
+ "onChange",
237
+ "onBlur",
238
+ "onFocus",
239
+ "onEnter",
240
+ "size",
241
+ "placeholder",
242
+ "multiline",
243
+ "prefix",
244
+ "suffix",
245
+ "version",
246
+ ]);
247
+ const { fieldProps, descriptionIdentifier } = useInputTextFormField(Object.assign(Object.assign({}, inputProps), { id,
248
+ name,
249
+ handleChange,
250
+ handleBlur,
251
+ handleFocus,
252
+ handleKeyDown }));
224
253
  return (React__default.createElement(FormFieldWrapper, { disabled: props.disabled, size: props.size, align: props.align, inline: props.inline, autofocus: props.autoFocus, name: name, wrapperRef: wrapperRef, error: (_a = props.error) !== null && _a !== void 0 ? _a : "", invalid: Boolean(props.error || props.invalid), identifier: id, descriptionIdentifier: descriptionIdentifier, description: props.description, clearable: (_b = props.clearable) !== null && _b !== void 0 ? _b : "never", onClear: handleClear, type: props.multiline ? "textarea" : "text", placeholder: props.placeholder, value: props.value, prefix: props.prefix, suffix: props.suffix, rows: rowRange.min, toolbar: props.toolbar, toolbarVisibility: props.toolbarVisibility },
225
254
  React__default.createElement(React__default.Fragment, null,
226
- props.multiline ? (React__default.createElement(TextArea, { id: id, name: name, className: inputStyle, value: props.value, rows: rowRange.min, disabled: props.disabled, readOnly: props.readOnly, required: props.required, autoFocus: props.autoFocus, autoComplete: props.autoComplete, maxLength: props.maxLength, minLength: props.minLength, inputMode: props.inputMode, tabIndex: props.tabIndex, role: props.role, "aria-label": props["aria-label"], "aria-describedby": hasDescription ? descriptionIdentifier : props["aria-describedby"], "aria-invalid": isInvalid ? true : undefined, "aria-controls": props["aria-controls"], "aria-expanded": props["aria-expanded"], "aria-activedescendant": props["aria-activedescendant"], "aria-autocomplete": props["aria-autocomplete"], "aria-required": props["aria-required"], invalid: isInvalid ? "true" : undefined, onChange: handleChange, onBlur: handleBlur, onFocus: handleFocus, onKeyDown: handleKeyDown, onKeyUp: props.onKeyUp, ref: mergeRefs([inputRefs, inputTextRef]) })) : (React__default.createElement(TextInput, { id: id, name: name, 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, max: props.max, min: props.min, pattern: props.pattern, inputMode: props.inputMode, tabIndex: props.tabIndex, role: props.role, "aria-label": props["aria-label"], "aria-describedby": hasDescription ? descriptionIdentifier : props["aria-describedby"], "aria-invalid": isInvalid ? true : undefined, "aria-controls": props["aria-controls"], "aria-expanded": props["aria-expanded"], "aria-activedescendant": props["aria-activedescendant"], "aria-autocomplete": props["aria-autocomplete"], "aria-required": props["aria-required"], invalid: isInvalid ? "true" : undefined, onChange: handleChange, onBlur: handleBlur, onFocus: handleFocus, onKeyDown: handleKeyDown, onKeyUp: props.onKeyUp, ref: mergeRefs([inputRefs, inputTextRef]) })),
255
+ type === "textarea" ? (React__default.createElement(TextArea, { fieldProps: fieldProps, rowRange: rowRange, inputRefs: [inputRefs, inputTextRef], value: props.value, inputStyle: inputStyle })) : (React__default.createElement(TextInput, { fieldProps: fieldProps, inputRefs: [inputRefs, inputTextRef], value: props.value, inputStyle: inputStyle })),
227
256
  React__default.createElement(FormFieldPostFix, { variation: "spinner", visible: (_c = props.loading) !== null && _c !== void 0 ? _c : false }),
228
257
  props.children)));
229
258
  });
230
259
  function useInputTextId(props) {
231
260
  const generatedId = useId();
232
- return props.identifier || props.id || generatedId;
261
+ return props.id || generatedId;
262
+ }
263
+ function TextArea({ fieldProps, rowRange, inputRefs, value, inputStyle, }) {
264
+ return (React__default.createElement("textarea", Object.assign({}, fieldProps, { rows: rowRange.min, ref: mergeRefs(inputRefs), className: inputStyle, value: value })));
265
+ }
266
+ function TextInput({ fieldProps, inputRefs, value, inputStyle, }) {
267
+ return (React__default.createElement("input", Object.assign({}, fieldProps, { ref: mergeRefs(inputRefs), className: inputStyle, value: value })));
233
268
  }
234
- const TextArea = forwardRef(function TextArea(props, ref) {
235
- return React__default.createElement("textarea", Object.assign({}, props, { ref: ref }));
236
- });
237
- const TextInput = forwardRef(function TextInput(props, ref) {
238
- return React__default.createElement("input", Object.assign({}, props, { ref: ref }));
239
- });
240
269
 
241
270
  function isNewInputTextProps(props) {
242
271
  return props.version === 2;
@@ -12,5 +12,5 @@ export declare function useInputTextActions({ onChange, inputRef, onEnter, onFoc
12
12
  handleChange: (event: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
13
13
  handleKeyDown: (event: KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
14
14
  handleFocus: (event: FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
15
- handleBlur: (event: FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
15
+ handleBlur: (event?: FocusEvent) => void;
16
16
  };