@jobber/components 6.103.2-JOB-140609-8386817.45 → 6.103.3

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 (79) 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 -4
  6. package/dist/Checkbox/index.mjs +2 -4
  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 +2 -0
  22. package/dist/FormField/hooks/useFormFieldWrapperStyles.d.ts +2 -7
  23. package/dist/FormField-cjs.js +6 -1
  24. package/dist/FormField-es.js +6 -2
  25. package/dist/InputDate/index.cjs +9 -5
  26. package/dist/InputDate/index.mjs +9 -5
  27. package/dist/InputDate/useInputDateActivatorActions.d.ts +8 -4
  28. package/dist/InputEmail/InputEmail.types.d.ts +20 -12
  29. package/dist/InputEmail/hooks/useInputEmailActions.d.ts +1 -1
  30. package/dist/InputEmail/hooks/useInputEmailFormField.d.ts +32 -0
  31. package/dist/InputEmail/index.cjs +44 -8
  32. package/dist/InputEmail/index.mjs +44 -8
  33. package/dist/InputNumber/InputNumber.rebuilt.types.d.ts +3 -20
  34. package/dist/InputNumber/index.cjs +3 -3
  35. package/dist/InputNumber/index.mjs +3 -3
  36. package/dist/InputPhoneNumber/InputPhoneNumber.types.d.ts +27 -13
  37. package/dist/InputPhoneNumber/hooks/useInputPhoneActions.d.ts +1 -1
  38. package/dist/InputPhoneNumber/hooks/useInputPhoneFormField.d.ts +71 -0
  39. package/dist/InputPhoneNumber/index.cjs +34 -17
  40. package/dist/InputPhoneNumber/index.mjs +34 -17
  41. package/dist/InputText/InputText.types.d.ts +24 -24
  42. package/dist/InputText/index.cjs +54 -54
  43. package/dist/InputText/index.mjs +55 -55
  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 +33 -63
  49. package/dist/InputTime/index.d.ts +1 -1
  50. package/dist/InputTime/index.mjs +36 -66
  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 -28
  60. package/dist/Select/index.d.ts +5 -7
  61. package/dist/Select/index.mjs +43 -30
  62. package/dist/Tabs-es.js +1 -1
  63. package/dist/_baseEach-cjs.js +12 -12
  64. package/dist/_baseEach-es.js +1 -1
  65. package/dist/_baseFlatten-cjs.js +2 -2
  66. package/dist/_baseFlatten-es.js +1 -1
  67. package/dist/{_getAllKeys-cjs.js → _baseGet-cjs.js} +181 -181
  68. package/dist/{_getAllKeys-es.js → _baseGet-es.js} +182 -182
  69. package/dist/debounce-es.js +1 -1
  70. package/dist/index.cjs +2 -2
  71. package/dist/index.mjs +2 -2
  72. package/dist/omit-cjs.js +14 -14
  73. package/dist/omit-es.js +1 -1
  74. package/dist/sharedHelpers/types.d.ts +0 -235
  75. package/dist/styles.css +18 -20
  76. package/dist/useScrollToActive-cjs.js +3 -3
  77. package/dist/useScrollToActive-es.js +2 -2
  78. package/package.json +2 -2
  79. package/dist/InputTime/hooks/useInputTimeActions.d.ts +0 -16
@@ -113,6 +113,7 @@ const DEFAULT_PATTERN = "(***) ***-****";
113
113
  function useInputPhoneActions({ onChange, inputRef, onFocus, onBlur, onKeyDown, onEnter, }) {
114
114
  function handleClear() {
115
115
  var _a;
116
+ handleBlur();
116
117
  onChange && onChange("");
117
118
  (_a = inputRef === null || inputRef === void 0 ? void 0 : inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
118
119
  }
@@ -146,22 +147,26 @@ function useInputPhoneActions({ onChange, inputRef, onFocus, onBlur, onKeyDown,
146
147
  };
147
148
  }
148
149
 
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
+
149
164
  const InputPhoneNumberRebuilt = forwardRef(function InputPhoneNumberInternal(_a, ref) {
150
165
  var _b, _c, _d, _e;
151
166
  var { pattern = DEFAULT_PATTERN } = _a, props = __rest(_a, ["pattern"]);
152
167
  const inputPhoneNumberRef = (_b = ref) !== null && _b !== void 0 ? _b : React__default.useRef(null);
153
168
  const wrapperRef = React__default.useRef(null);
154
- const { inputStyle } = useFormFieldWrapperStyles({
155
- size: props.size,
156
- align: props.align,
157
- placeholder: props.placeholder,
158
- value: props.value,
159
- invalid: props.invalid,
160
- error: props.error,
161
- disabled: props.disabled,
162
- inline: props.inline,
163
- type: "tel",
164
- });
169
+ const { inputStyle } = useFormFieldWrapperStyles(Object.assign(Object.assign({}, props), { type: "tel" }));
165
170
  const generatedId = useId();
166
171
  const id = props.id || generatedId;
167
172
  const { name } = useAtlantisFormFieldName({
@@ -181,13 +186,25 @@ const InputPhoneNumberRebuilt = forwardRef(function InputPhoneNumberInternal(_a,
181
186
  onEnter: props.onEnter,
182
187
  inputRef: inputPhoneNumberRef,
183
188
  });
184
- const descriptionIdentifier = `descriptionUUID--${id}`;
185
- const hasDescription = props.description && !props.inline;
186
- const isInvalid = Boolean(props.error || props.invalid);
187
- 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 },
188
- 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, {
189
206
  [styles.emptyValue]: inputValue.length === 0 && pattern[0] === "(",
190
- }), value: formattedValue, disabled: props.disabled, readOnly: props.readOnly, autoFocus: props.autoFocus, autoComplete: props.autoComplete, 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 }),
207
+ }), value: formattedValue })),
191
208
  React__default.createElement(MaskElement, { isMasking: isMasking, formattedValue: formattedValue, placeholderMask: placeholderMask }),
192
209
  React__default.createElement(FormFieldPostFix, { variation: "spinner", visible: (_e = props.loading) !== null && _e !== void 0 ? _e : false })));
193
210
  });
@@ -1,6 +1,6 @@
1
+ import type { Clearable } from "@jobber/hooks";
1
2
  import type { XOR } from "ts-xor";
2
- import type { CommonFormFieldProps, FormFieldProps, FormFieldTypes } from "../FormField";
3
- import type { FocusEvents, HTMLInputBaseProps, InputLengthConstraint, KeyboardEvents, RebuiltInputCommonProps } from "../sharedHelpers/types";
3
+ import type { AutocompleteTypes, CommonFormFieldProps, FormFieldProps, FormFieldTypes } from "../FormField";
4
4
  export interface RowRange {
5
5
  min: number;
6
6
  max: number;
@@ -10,7 +10,15 @@ export type InputTextVersion = 1 | 2 | undefined;
10
10
  * Experimental version 2 of the InputText component.
11
11
  * Do not use unless you have talked with Atlantis first.
12
12
  */
13
- export interface InputTextRebuiltProps extends HTMLInputBaseProps, FocusEvents<HTMLInputElement | HTMLTextAreaElement>, KeyboardEvents<HTMLInputElement | HTMLTextAreaElement>, RebuiltInputCommonProps, InputLengthConstraint {
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;
14
22
  /**
15
23
  * Use this when you're expecting a long answer.
16
24
  */
@@ -22,32 +30,24 @@ export interface InputTextRebuiltProps extends HTMLInputBaseProps, FocusEvents<H
22
30
  * maximum number of visible rows.
23
31
  */
24
32
  readonly rows?: number | RowRange;
25
- /**
26
- * Determines what kind of form field should the component give you.
27
- */
28
33
  readonly type?: FormFieldTypes;
29
34
  /**
30
- * Toolbar to render content below the input.
31
- */
32
- readonly toolbar?: React.ReactNode;
33
- /**
34
- * Determines the visibility of the toolbar.
35
- */
36
- readonly toolbarVisibility?: "always" | "while-editing";
37
- /**
38
- * The current value of the input.
39
- */
40
- readonly value: string;
41
- /**
42
- * 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.
43
36
  */
37
+ readonly version: 2;
44
38
  readonly onChange?: (newValue: string, event?: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
45
- /**
46
- * A callback to handle "Enter" keypress. This will only run
47
- * if Enter is the only key. Will not run if Shift or Control
48
- * are being held.
49
- */
50
39
  readonly onEnter?: FormFieldProps["onEnter"];
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"];
51
51
  }
52
52
  interface BaseProps extends CommonFormFieldProps, Pick<FormFieldProps, "autofocus" | "maxLength" | "readonly" | "autocomplete" | "keyboard" | "onEnter" | "onFocus" | "onBlur" | "onChange" | "inputRef" | "validations" | "defaultValue" | "prefix" | "suffix" | "toolbar" | "toolbarVisibility" | "version"> {
53
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,6 +162,7 @@ function insertAtCursor(input, newText) {
150
162
  function useInputTextActions({ onChange, inputRef, onEnter, onFocus, onBlur, onKeyDown, }) {
151
163
  function handleClear() {
152
164
  var _a;
165
+ handleBlur();
153
166
  onChange && onChange("");
154
167
  (_a = inputRef === null || inputRef === void 0 ? void 0 : inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
155
168
  }
@@ -183,10 +196,23 @@ function useInputTextActions({ onChange, inputRef, onEnter, onFocus, onBlur, onK
183
196
  };
184
197
  }
185
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
+
186
211
  const InputTextSPAR = React.forwardRef(function InputTextInternal(props, inputRefs) {
187
212
  var _a, _b, _c;
188
213
  const inputTextRef = React.useRef(null);
189
214
  const wrapperRef = React.useRef(null);
215
+ const legacyPropHelper = Object.assign(Object.assign({}, props), { version: 1 });
190
216
  const id = useInputTextId(props);
191
217
  const { rowRange } = useTextAreaResize({
192
218
  rows: props.rows,
@@ -194,18 +220,8 @@ const InputTextSPAR = React.forwardRef(function InputTextInternal(props, inputRe
194
220
  inputRef: inputTextRef,
195
221
  wrapperRef: wrapperRef,
196
222
  });
197
- const { inputStyle } = FormField.useFormFieldWrapperStyles({
198
- size: props.size,
199
- align: props.align,
200
- placeholder: props.placeholder,
201
- value: props.value,
202
- invalid: props.invalid,
203
- error: props.error,
204
- maxLength: props.maxLength,
205
- type: props.multiline ? "textarea" : "text",
206
- disabled: props.disabled,
207
- inline: props.inline,
208
- });
223
+ const type = props.multiline ? "textarea" : "text";
224
+ const { inputStyle } = FormField.useFormFieldWrapperStyles(legacyPropHelper);
209
225
  const { name } = FormField.useAtlantisFormFieldName({
210
226
  nameProp: props.name,
211
227
  id: id,
@@ -218,43 +234,27 @@ const InputTextSPAR = React.forwardRef(function InputTextInternal(props, inputRe
218
234
  onEnter: props.onEnter,
219
235
  inputRef: inputTextRef,
220
236
  });
221
- const descriptionIdentifier = `descriptionUUID--${id}`;
222
- const hasDescription = props.description && !props.inline;
223
- const isInvalid = Boolean(props.error || props.invalid);
224
- // Shared props for both TextArea and TextInput
225
- const commonInputProps = {
226
- id,
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,
227
250
  name,
228
- className: inputStyle,
229
- value: props.value,
230
- disabled: props.disabled,
231
- readOnly: props.readOnly,
232
- autoFocus: props.autoFocus,
233
- autoComplete: props.autoComplete,
234
- inputMode: props.inputMode,
235
- tabIndex: props.tabIndex,
236
- maxLength: props.maxLength,
237
- role: props.role,
238
- "aria-label": props.ariaLabel,
239
- "aria-describedby": hasDescription
240
- ? descriptionIdentifier
241
- : props.ariaDescribedBy,
242
- "aria-invalid": isInvalid ? true : undefined,
243
- "aria-controls": props.ariaControls,
244
- "aria-expanded": props.ariaExpanded,
245
- "aria-activedescendant": props.ariaActiveDescendant,
246
- "aria-autocomplete": props.ariaAutocomplete,
247
- "aria-required": props.ariaRequired,
248
- onChange: handleChange,
249
- onBlur: handleBlur,
250
- onFocus: handleFocus,
251
- onKeyDown: handleKeyDown,
252
- onKeyUp: props.onKeyUp,
253
- ref: FormField.mergeRefs([inputRefs, inputTextRef]),
254
- };
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", maxLength: props.maxLength, 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 },
251
+ handleChange,
252
+ handleBlur,
253
+ handleFocus,
254
+ handleKeyDown }));
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 },
256
256
  React.createElement(React.Fragment, null,
257
- props.multiline ? (React.createElement(TextArea, Object.assign({}, commonInputProps, { rows: rowRange.min }))) : (React.createElement(TextInput, Object.assign({}, commonInputProps, { pattern: props.pattern }))),
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 })),
258
258
  React.createElement(FormField.FormFieldPostFix, { variation: "spinner", visible: (_c = props.loading) !== null && _c !== void 0 ? _c : false }),
259
259
  props.children)));
260
260
  });
@@ -262,12 +262,12 @@ function useInputTextId(props) {
262
262
  const generatedId = React.useId();
263
263
  return props.id || generatedId;
264
264
  }
265
- const TextArea = React.forwardRef(function TextArea(props, ref) {
266
- return React.createElement("textarea", Object.assign({}, props, { ref: ref }));
267
- });
268
- const TextInput = React.forwardRef(function TextInput(props, ref) {
269
- return React.createElement("input", Object.assign({}, props, { ref: ref }));
270
- });
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 })));
270
+ }
271
271
 
272
272
  function isNewInputTextProps(props) {
273
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, m as mergeRefs, f as FormFieldWrapper, 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,6 +160,7 @@ function insertAtCursor(input, newText) {
148
160
  function useInputTextActions({ onChange, inputRef, onEnter, onFocus, onBlur, onKeyDown, }) {
149
161
  function handleClear() {
150
162
  var _a;
163
+ handleBlur();
151
164
  onChange && onChange("");
152
165
  (_a = inputRef === null || inputRef === void 0 ? void 0 : inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
153
166
  }
@@ -181,10 +194,23 @@ function useInputTextActions({ onChange, inputRef, onEnter, onFocus, onBlur, onK
181
194
  };
182
195
  }
183
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
+
184
209
  const InputTextSPAR = forwardRef(function InputTextInternal(props, inputRefs) {
185
210
  var _a, _b, _c;
186
211
  const inputTextRef = React__default.useRef(null);
187
212
  const wrapperRef = React__default.useRef(null);
213
+ const legacyPropHelper = Object.assign(Object.assign({}, props), { version: 1 });
188
214
  const id = useInputTextId(props);
189
215
  const { rowRange } = useTextAreaResize({
190
216
  rows: props.rows,
@@ -192,18 +218,8 @@ const InputTextSPAR = forwardRef(function InputTextInternal(props, inputRefs) {
192
218
  inputRef: inputTextRef,
193
219
  wrapperRef: wrapperRef,
194
220
  });
195
- const { inputStyle } = useFormFieldWrapperStyles({
196
- size: props.size,
197
- align: props.align,
198
- placeholder: props.placeholder,
199
- value: props.value,
200
- invalid: props.invalid,
201
- error: props.error,
202
- maxLength: props.maxLength,
203
- type: props.multiline ? "textarea" : "text",
204
- disabled: props.disabled,
205
- inline: props.inline,
206
- });
221
+ const type = props.multiline ? "textarea" : "text";
222
+ const { inputStyle } = useFormFieldWrapperStyles(legacyPropHelper);
207
223
  const { name } = useAtlantisFormFieldName({
208
224
  nameProp: props.name,
209
225
  id: id,
@@ -216,43 +232,27 @@ const InputTextSPAR = forwardRef(function InputTextInternal(props, inputRefs) {
216
232
  onEnter: props.onEnter,
217
233
  inputRef: inputTextRef,
218
234
  });
219
- const descriptionIdentifier = `descriptionUUID--${id}`;
220
- const hasDescription = props.description && !props.inline;
221
- const isInvalid = Boolean(props.error || props.invalid);
222
- // Shared props for both TextArea and TextInput
223
- const commonInputProps = {
224
- id,
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,
225
248
  name,
226
- className: inputStyle,
227
- value: props.value,
228
- disabled: props.disabled,
229
- readOnly: props.readOnly,
230
- autoFocus: props.autoFocus,
231
- autoComplete: props.autoComplete,
232
- inputMode: props.inputMode,
233
- tabIndex: props.tabIndex,
234
- maxLength: props.maxLength,
235
- role: props.role,
236
- "aria-label": props.ariaLabel,
237
- "aria-describedby": hasDescription
238
- ? descriptionIdentifier
239
- : props.ariaDescribedBy,
240
- "aria-invalid": isInvalid ? true : undefined,
241
- "aria-controls": props.ariaControls,
242
- "aria-expanded": props.ariaExpanded,
243
- "aria-activedescendant": props.ariaActiveDescendant,
244
- "aria-autocomplete": props.ariaAutocomplete,
245
- "aria-required": props.ariaRequired,
246
- onChange: handleChange,
247
- onBlur: handleBlur,
248
- onFocus: handleFocus,
249
- onKeyDown: handleKeyDown,
250
- onKeyUp: props.onKeyUp,
251
- ref: mergeRefs([inputRefs, inputTextRef]),
252
- };
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", maxLength: props.maxLength, 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 },
249
+ handleChange,
250
+ handleBlur,
251
+ handleFocus,
252
+ handleKeyDown }));
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 },
254
254
  React__default.createElement(React__default.Fragment, null,
255
- props.multiline ? (React__default.createElement(TextArea, Object.assign({}, commonInputProps, { rows: rowRange.min }))) : (React__default.createElement(TextInput, Object.assign({}, commonInputProps, { pattern: props.pattern }))),
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 })),
256
256
  React__default.createElement(FormFieldPostFix, { variation: "spinner", visible: (_c = props.loading) !== null && _c !== void 0 ? _c : false }),
257
257
  props.children)));
258
258
  });
@@ -260,12 +260,12 @@ function useInputTextId(props) {
260
260
  const generatedId = useId();
261
261
  return props.id || generatedId;
262
262
  }
263
- const TextArea = forwardRef(function TextArea(props, ref) {
264
- return React__default.createElement("textarea", Object.assign({}, props, { ref: ref }));
265
- });
266
- const TextInput = forwardRef(function TextInput(props, ref) {
267
- return React__default.createElement("input", Object.assign({}, props, { ref: ref }));
268
- });
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 })));
268
+ }
269
269
 
270
270
  function isNewInputTextProps(props) {
271
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
  };