@jobber/components 7.13.1 → 7.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Autocomplete/index.cjs +3 -2
- package/dist/Autocomplete/index.mjs +2 -1
- package/dist/DataList/components/DataListSearch/index.cjs +2 -1
- package/dist/DataList/components/DataListSearch/index.mjs +2 -1
- package/dist/DataList/index.cjs +2 -1
- package/dist/DataList/index.mjs +2 -1
- package/dist/DataTable/index.cjs +2 -1
- package/dist/DataTable/index.mjs +2 -1
- package/dist/FormField/index.cjs +11 -10
- package/dist/FormField/index.mjs +2 -1
- package/dist/FormField-cjs.js +7 -6
- package/dist/FormField-es.js +2 -1
- package/dist/FormFieldPostFix-cjs.js +250 -0
- package/dist/FormFieldPostFix-es.js +238 -0
- package/dist/InputDate/index.cjs +2 -1
- package/dist/InputDate/index.mjs +2 -1
- package/dist/InputEmail/index.cjs +1 -0
- package/dist/InputEmail/index.mjs +1 -0
- package/dist/InputEmail-cjs.js +4 -3
- package/dist/InputEmail-es.js +2 -1
- package/dist/InputNumber/index.cjs +2 -1
- package/dist/InputNumber/index.mjs +2 -1
- package/dist/InputPassword/index.cjs +2 -1
- package/dist/InputPassword/index.mjs +2 -1
- package/dist/InputPhoneNumber/InputPhoneNumber.d.ts +2 -2
- package/dist/InputPhoneNumber/InputPhoneNumber.types.d.ts +2 -20
- package/dist/InputPhoneNumber/hooks/useInputPhoneActions.d.ts +2 -2
- package/dist/InputPhoneNumber/index.cjs +13 -250
- package/dist/InputPhoneNumber/index.d.ts +2 -5
- package/dist/InputPhoneNumber/index.mjs +12 -253
- package/dist/InputPhoneNumber-cjs.js +190 -0
- package/dist/InputPhoneNumber-es.js +188 -0
- package/dist/InputText/index.cjs +5 -4
- package/dist/InputText/index.mjs +2 -1
- package/dist/InputTime/index.cjs +4 -3
- package/dist/InputTime/index.mjs +2 -1
- package/dist/RecurringSelect/index.cjs +2 -1
- package/dist/RecurringSelect/index.mjs +2 -1
- package/dist/Select/index.cjs +2 -1
- package/dist/Select/index.mjs +2 -1
- package/dist/Select-cjs.js +5 -4
- package/dist/Select-es.js +2 -1
- package/dist/docs/InputPhoneNumber/InputPhoneNumber.md +40 -21
- package/dist/docs/usage-guidelines/usage-guidelines.md +7 -8
- package/dist/index.cjs +13 -12
- package/dist/index.mjs +3 -2
- package/dist/mergeRefs-cjs.js +0 -248
- package/dist/mergeRefs-es.js +1 -238
- package/package.json +3 -3
- package/dist/InputPhoneNumber/InputPhoneNumber.rebuilt.d.ts +0 -3
|
@@ -13,9 +13,10 @@ var Typography = require('../Typography-cjs.js');
|
|
|
13
13
|
var Icon = require('../Icon-cjs.js');
|
|
14
14
|
var Glimmer = require('../Glimmer-cjs.js');
|
|
15
15
|
var InputText_index = require('../InputText/index.cjs');
|
|
16
|
-
var
|
|
16
|
+
var FormFieldPostFix = require('../FormFieldPostFix-cjs.js');
|
|
17
17
|
var tslib_es6 = require('../tslib.es6-cjs.js');
|
|
18
18
|
require('react-hook-form');
|
|
19
|
+
var mergeRefs = require('../mergeRefs-cjs.js');
|
|
19
20
|
require('../Button-cjs.js');
|
|
20
21
|
var filterDataAttributes = require('../filterDataAttributes-cjs.js');
|
|
21
22
|
require('../floating-ui.utils.dom-cjs.js');
|
|
@@ -1302,7 +1303,7 @@ function MultipleSelectionLayout({ selectedValues, inputValue, disabled, error,
|
|
|
1302
1303
|
}, []);
|
|
1303
1304
|
return (React.createElement("div", { "data-testid": "ATL-AutocompleteRebuilt", onFocus: handleFocusIn, onBlur: handleFocusOut },
|
|
1304
1305
|
React.createElement("div", { className: styles$1.multiSelectField, "data-testid": "ATL-AutocompleteRebuilt-multiSelectContainer" },
|
|
1305
|
-
React.createElement(
|
|
1306
|
+
React.createElement(FormFieldPostFix.FormFieldWrapper, { disabled: disabled, size: sizeProp ? sizeProp : undefined, error: (_a = error) !== null && _a !== void 0 ? _a : "", invalid: Boolean(error || invalid), identifier: inputId, descriptionIdentifier: descriptionId, description: description, clearable: clearable !== null && clearable !== void 0 ? clearable : "never", onClear: () => {
|
|
1306
1307
|
var _a;
|
|
1307
1308
|
clearAll();
|
|
1308
1309
|
(_a = internalInputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
@@ -11,9 +11,10 @@ import { T as Typography } from '../Typography-es.js';
|
|
|
11
11
|
import { I as Icon } from '../Icon-es.js';
|
|
12
12
|
import { G as Glimmer } from '../Glimmer-es.js';
|
|
13
13
|
import { InputText } from '../InputText/index.mjs';
|
|
14
|
-
import {
|
|
14
|
+
import { c as FormFieldWrapper } from '../FormFieldPostFix-es.js';
|
|
15
15
|
import { _ as __rest, a as __awaiter } from '../tslib.es6-es.js';
|
|
16
16
|
import 'react-hook-form';
|
|
17
|
+
import { m as mergeRefs } from '../mergeRefs-es.js';
|
|
17
18
|
import '../Button-es.js';
|
|
18
19
|
import { f as filterDataAttributes } from '../filterDataAttributes-es.js';
|
|
19
20
|
import '../floating-ui.utils.dom-es.js';
|
|
@@ -7,7 +7,7 @@ require('@jobber/design');
|
|
|
7
7
|
require('@jobber/hooks');
|
|
8
8
|
require('../../../InputText/index.cjs');
|
|
9
9
|
require('../../../FormField-cjs.js');
|
|
10
|
-
require('../../../
|
|
10
|
+
require('../../../FormFieldPostFix-cjs.js');
|
|
11
11
|
require('framer-motion');
|
|
12
12
|
require('../../../Button-cjs.js');
|
|
13
13
|
require('../../../tslib.es6-cjs.js');
|
|
@@ -20,6 +20,7 @@ require('../../../InputValidation-cjs.js');
|
|
|
20
20
|
require('../../../Spinner-cjs.js');
|
|
21
21
|
require('../../../useAtlantisFormFieldName-cjs.js');
|
|
22
22
|
require('react-hook-form');
|
|
23
|
+
require('../../../mergeRefs-cjs.js');
|
|
23
24
|
require('../../../filterDataAttributes-cjs.js');
|
|
24
25
|
require('../../../DataListContext-cjs.js');
|
|
25
26
|
require('../../../noop-cjs.js');
|
|
@@ -5,7 +5,7 @@ import '@jobber/design';
|
|
|
5
5
|
import '@jobber/hooks';
|
|
6
6
|
import '../../../InputText/index.mjs';
|
|
7
7
|
import '../../../FormField-es.js';
|
|
8
|
-
import '../../../
|
|
8
|
+
import '../../../FormFieldPostFix-es.js';
|
|
9
9
|
import 'framer-motion';
|
|
10
10
|
import '../../../Button-es.js';
|
|
11
11
|
import '../../../tslib.es6-es.js';
|
|
@@ -18,6 +18,7 @@ import '../../../InputValidation-es.js';
|
|
|
18
18
|
import '../../../Spinner-es.js';
|
|
19
19
|
import '../../../useAtlantisFormFieldName-es.js';
|
|
20
20
|
import 'react-hook-form';
|
|
21
|
+
import '../../../mergeRefs-es.js';
|
|
21
22
|
import '../../../filterDataAttributes-es.js';
|
|
22
23
|
import '../../../DataListContext-es.js';
|
|
23
24
|
import '../../../noop-es.js';
|
package/dist/DataList/index.cjs
CHANGED
|
@@ -82,11 +82,12 @@ require('../DataListStickyHeader-cjs.js');
|
|
|
82
82
|
require('../DataListSearch-cjs.js');
|
|
83
83
|
require('../InputText/index.cjs');
|
|
84
84
|
require('../FormField-cjs.js');
|
|
85
|
-
require('../
|
|
85
|
+
require('../FormFieldPostFix-cjs.js');
|
|
86
86
|
require('../useFormFieldFocus-cjs.js');
|
|
87
87
|
require('../InputValidation-cjs.js');
|
|
88
88
|
require('../useAtlantisFormFieldName-cjs.js');
|
|
89
89
|
require('react-hook-form');
|
|
90
|
+
require('../mergeRefs-cjs.js');
|
|
90
91
|
require('../DataListEmptyState-cjs.js');
|
|
91
92
|
require('../DataListLoadMore-cjs.js');
|
|
92
93
|
require('../DataListAction-cjs.js');
|
package/dist/DataList/index.mjs
CHANGED
|
@@ -80,11 +80,12 @@ import '../DataListStickyHeader-es.js';
|
|
|
80
80
|
import '../DataListSearch-es.js';
|
|
81
81
|
import '../InputText/index.mjs';
|
|
82
82
|
import '../FormField-es.js';
|
|
83
|
-
import '../
|
|
83
|
+
import '../FormFieldPostFix-es.js';
|
|
84
84
|
import '../useFormFieldFocus-es.js';
|
|
85
85
|
import '../InputValidation-es.js';
|
|
86
86
|
import '../useAtlantisFormFieldName-es.js';
|
|
87
87
|
import 'react-hook-form';
|
|
88
|
+
import '../mergeRefs-es.js';
|
|
88
89
|
import '../DataListEmptyState-es.js';
|
|
89
90
|
import '../DataListLoadMore-es.js';
|
|
90
91
|
import '../DataListAction-es.js';
|
package/dist/DataTable/index.cjs
CHANGED
|
@@ -11,7 +11,7 @@ require('../Glimmer-cjs.js');
|
|
|
11
11
|
require('../tslib.es6-cjs.js');
|
|
12
12
|
require('../Content-cjs.js');
|
|
13
13
|
require('../Select-cjs.js');
|
|
14
|
-
require('../
|
|
14
|
+
require('../FormFieldPostFix-cjs.js');
|
|
15
15
|
require('framer-motion');
|
|
16
16
|
require('@jobber/design');
|
|
17
17
|
require('../Button-cjs.js');
|
|
@@ -24,6 +24,7 @@ require('../InputValidation-cjs.js');
|
|
|
24
24
|
require('../Spinner-cjs.js');
|
|
25
25
|
require('../useAtlantisFormFieldName-cjs.js');
|
|
26
26
|
require('react-hook-form');
|
|
27
|
+
require('../mergeRefs-cjs.js');
|
|
27
28
|
require('../filterDataAttributes-cjs.js');
|
|
28
29
|
|
|
29
30
|
|
package/dist/DataTable/index.mjs
CHANGED
|
@@ -9,7 +9,7 @@ import '../Glimmer-es.js';
|
|
|
9
9
|
import '../tslib.es6-es.js';
|
|
10
10
|
import '../Content-es.js';
|
|
11
11
|
import '../Select-es.js';
|
|
12
|
-
import '../
|
|
12
|
+
import '../FormFieldPostFix-es.js';
|
|
13
13
|
import 'framer-motion';
|
|
14
14
|
import '@jobber/design';
|
|
15
15
|
import '../Button-es.js';
|
|
@@ -22,4 +22,5 @@ import '../InputValidation-es.js';
|
|
|
22
22
|
import '../Spinner-es.js';
|
|
23
23
|
import '../useAtlantisFormFieldName-es.js';
|
|
24
24
|
import 'react-hook-form';
|
|
25
|
+
import '../mergeRefs-es.js';
|
|
25
26
|
import '../filterDataAttributes-es.js';
|
package/dist/FormField/index.cjs
CHANGED
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
var FormField = require('../FormField-cjs.js');
|
|
4
4
|
var useAtlantisFormFieldName = require('../useAtlantisFormFieldName-cjs.js');
|
|
5
|
-
var
|
|
5
|
+
var FormFieldPostFix = require('../FormFieldPostFix-cjs.js');
|
|
6
6
|
require('react');
|
|
7
7
|
require('classnames');
|
|
8
8
|
require('../tslib.es6-cjs.js');
|
|
9
9
|
require('react-hook-form');
|
|
10
|
+
require('../mergeRefs-cjs.js');
|
|
10
11
|
require('@jobber/hooks');
|
|
11
12
|
require('framer-motion');
|
|
12
13
|
require('@jobber/design');
|
|
@@ -26,12 +27,12 @@ exports.useAtlantisFormField = FormField.useAtlantisFormField;
|
|
|
26
27
|
exports.useAtlantisFormFieldActions = FormField.useAtlantisFormFieldActions;
|
|
27
28
|
exports.useAtlantisReactHookForm = FormField.useAtlantisReactHookForm;
|
|
28
29
|
exports.useAtlantisFormFieldName = useAtlantisFormFieldName.useAtlantisFormFieldName;
|
|
29
|
-
exports.AffixIcon =
|
|
30
|
-
exports.AffixLabel =
|
|
31
|
-
exports.FormFieldInputHorizontalWrapper =
|
|
32
|
-
exports.FormFieldInputWrapperStyles =
|
|
33
|
-
exports.FormFieldLabel =
|
|
34
|
-
exports.FormFieldWrapper =
|
|
35
|
-
exports.FormFieldWrapperMain =
|
|
36
|
-
exports.FormFieldWrapperToolbar =
|
|
37
|
-
exports.useFormFieldWrapperStyles =
|
|
30
|
+
exports.AffixIcon = FormFieldPostFix.AffixIcon;
|
|
31
|
+
exports.AffixLabel = FormFieldPostFix.AffixLabel;
|
|
32
|
+
exports.FormFieldInputHorizontalWrapper = FormFieldPostFix.FormFieldInputHorizontalWrapper;
|
|
33
|
+
exports.FormFieldInputWrapperStyles = FormFieldPostFix.FormFieldInputWrapperStyles;
|
|
34
|
+
exports.FormFieldLabel = FormFieldPostFix.FormFieldLabel;
|
|
35
|
+
exports.FormFieldWrapper = FormFieldPostFix.FormFieldWrapper;
|
|
36
|
+
exports.FormFieldWrapperMain = FormFieldPostFix.FormFieldWrapperMain;
|
|
37
|
+
exports.FormFieldWrapperToolbar = FormFieldPostFix.FormFieldWrapperToolbar;
|
|
38
|
+
exports.useFormFieldWrapperStyles = FormFieldPostFix.useFormFieldWrapperStyles;
|
package/dist/FormField/index.mjs
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
export { F as FormField, u as useAtlantisFormField, a as useAtlantisFormFieldActions, b as useAtlantisReactHookForm } from '../FormField-es.js';
|
|
2
2
|
export { u as useAtlantisFormFieldName } from '../useAtlantisFormFieldName-es.js';
|
|
3
|
-
export { A as AffixIcon, f as AffixLabel, F as FormFieldInputHorizontalWrapper, a as FormFieldInputWrapperStyles, b as FormFieldLabel, c as FormFieldWrapper, d as FormFieldWrapperMain, e as FormFieldWrapperToolbar, u as useFormFieldWrapperStyles } from '../
|
|
3
|
+
export { A as AffixIcon, f as AffixLabel, F as FormFieldInputHorizontalWrapper, a as FormFieldInputWrapperStyles, b as FormFieldLabel, c as FormFieldWrapper, d as FormFieldWrapperMain, e as FormFieldWrapperToolbar, u as useFormFieldWrapperStyles } from '../FormFieldPostFix-es.js';
|
|
4
4
|
import 'react';
|
|
5
5
|
import 'classnames';
|
|
6
6
|
import '../tslib.es6-es.js';
|
|
7
7
|
import 'react-hook-form';
|
|
8
|
+
import '../mergeRefs-es.js';
|
|
8
9
|
import '@jobber/hooks';
|
|
9
10
|
import 'framer-motion';
|
|
10
11
|
import '@jobber/design';
|
package/dist/FormField-cjs.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var React = require('react');
|
|
4
|
-
var
|
|
4
|
+
var FormFieldPostFix = require('./FormFieldPostFix-cjs.js');
|
|
5
5
|
var classnames = require('classnames');
|
|
6
6
|
var useAtlantisFormFieldName = require('./useAtlantisFormFieldName-cjs.js');
|
|
7
7
|
var tslib_es6 = require('./tslib.es6-cjs.js');
|
|
8
8
|
var reactHookForm = require('react-hook-form');
|
|
9
|
+
var mergeRefs = require('./mergeRefs-cjs.js');
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* Combines the actions from the props of the FormField with the actions from react-hook-form. This is used to
|
|
@@ -67,8 +68,8 @@ function useAtlantisFormFieldActions({ name, onChange, inputRef, onControllerCha
|
|
|
67
68
|
*/
|
|
68
69
|
function useAtlantisFormField({ id, nameProp, name, useControllerField: useControllerField, description, disabled, readonly, keyboard, autofocus, pattern, type, value, handleChange, handleBlur, handleFocus, inline, validations, handleKeyDown, handleValidation, errorMessage, }) {
|
|
69
70
|
const descriptionIdentifier = `descriptionUUID--${id}`;
|
|
70
|
-
const fieldProps = Object.assign(Object.assign(Object.assign({}, useControllerField), { id, className: classnames(
|
|
71
|
-
[
|
|
71
|
+
const fieldProps = Object.assign(Object.assign(Object.assign({}, useControllerField), { id, className: classnames(FormFieldPostFix.formFieldStyles.input, {
|
|
72
|
+
[FormFieldPostFix.formFieldStyles.emptyPhoneNumber]: shouldAddPhoneNumberClass(type, value, pattern),
|
|
72
73
|
}), name: (validations || nameProp) && name, disabled: disabled, readOnly: readonly, inputMode: keyboard, onChange: handleChange, onBlur: handleBlur, onFocus: handleFocus, autoFocus: autofocus }), (description &&
|
|
73
74
|
!inline && { "aria-describedby": descriptionIdentifier }));
|
|
74
75
|
const textFieldProps = Object.assign(Object.assign({}, fieldProps), { autoFocus: autofocus, onKeyDown: handleKeyDown });
|
|
@@ -174,19 +175,19 @@ function FormFieldInternal(props) {
|
|
|
174
175
|
// Ensure focus tracking works by providing a wrapperRef when none is passed
|
|
175
176
|
const internalWrapperRef = React.useRef(null);
|
|
176
177
|
const wrapperRef = (_a = props.wrapperRef) !== null && _a !== void 0 ? _a : internalWrapperRef;
|
|
177
|
-
return (React.createElement(
|
|
178
|
+
return (React.createElement(FormFieldPostFix.FormFieldWrapper, Object.assign({}, props, { value: useControllerField.value, error: errorMessage, identifier: id, descriptionIdentifier: descriptionIdentifier, clearable: clearable, onClear: handleClear, wrapperRef: wrapperRef }), renderField()));
|
|
178
179
|
function renderField() {
|
|
179
180
|
switch (type) {
|
|
180
181
|
case "select":
|
|
181
182
|
return (React.createElement(React.Fragment, null,
|
|
182
183
|
React.createElement("select", Object.assign({}, fieldProps), children),
|
|
183
|
-
React.createElement(
|
|
184
|
+
React.createElement(FormFieldPostFix.FormFieldPostFix, { variation: "select" })));
|
|
184
185
|
case "textarea":
|
|
185
186
|
return React.createElement("textarea", Object.assign({}, textFieldProps, { rows: rows, ref: inputRefs }));
|
|
186
187
|
default:
|
|
187
188
|
return (React.createElement(React.Fragment, null,
|
|
188
189
|
React.createElement("input", Object.assign({}, textFieldProps, { autoComplete: setAutocomplete(autocomplete), type: type, maxLength: maxLength, max: max, min: min, ref: inputRefs, onKeyUp: onKeyUp })),
|
|
189
|
-
loading && React.createElement(
|
|
190
|
+
loading && React.createElement(FormFieldPostFix.FormFieldPostFix, { variation: "spinner" }),
|
|
190
191
|
children));
|
|
191
192
|
}
|
|
192
193
|
}
|
package/dist/FormField-es.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import React__default, { useEffect, useImperativeHandle, useId, useRef } from 'react';
|
|
2
|
-
import { g as formFieldStyles,
|
|
2
|
+
import { g as formFieldStyles, c as FormFieldWrapper, h as FormFieldPostFix } from './FormFieldPostFix-es.js';
|
|
3
3
|
import classnames from 'classnames';
|
|
4
4
|
import { u as useAtlantisFormFieldName } from './useAtlantisFormFieldName-es.js';
|
|
5
5
|
import { _ as __rest } from './tslib.es6-es.js';
|
|
6
6
|
import { useFormContext, useForm, useController } from 'react-hook-form';
|
|
7
|
+
import { m as mergeRefs } from './mergeRefs-es.js';
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* Combines the actions from the props of the FormField with the actions from react-hook-form. This is used to
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var jobberHooks = require('@jobber/hooks');
|
|
5
|
+
var framerMotion = require('framer-motion');
|
|
6
|
+
var design = require('@jobber/design');
|
|
7
|
+
var classnames = require('classnames');
|
|
8
|
+
var Button = require('./Button-cjs.js');
|
|
9
|
+
var Icon = require('./Icon-cjs.js');
|
|
10
|
+
var Text = require('./Text-cjs.js');
|
|
11
|
+
var useFormFieldFocus = require('./useFormFieldFocus-cjs.js');
|
|
12
|
+
var InputValidation = require('./InputValidation-cjs.js');
|
|
13
|
+
var Spinner = require('./Spinner-cjs.js');
|
|
14
|
+
|
|
15
|
+
var formFieldStyles = {"container":"YL-mNv-Bl6g-","wrapper":"_8lhbGTQ-hhg-","disabled":"Tz9LK9ABKMk-","horizontalWrapper":"b5mv1x1H7YE-","textarea":"hGr6YW4AeLM-","safari":"QBCWi9GBgMs-","timeInputLabel":"_0pmqVa2zSE4-","miniLabel":"F1t76G6bDKo-","large":"_9tjyT9QUtP8-","text":"QmMiyoAWp-g-","invalid":"XWDSfe6weSY-","small":"Sw5O4I0lMJg-","inline":"SaORbL7SYWY-","center":"ozy2UoT2vsg-","right":"_3TJdT91YD3c-","maxLength":"W6GrMqLy2qk-","inputWrapper":"-LmjnYRU0r0-","childrenWrapper":"yVXYv6hkuOA-","input":"vtSDcuzNr9Q-","emptyPhoneNumber":"MVhuQuzUBUs-","label":"Dgk00tzlODA-","select":"NwQGiWBWIsc-","externalLabel":"Qb8zQ8n-8vc-","postfix":"yTDzs9h1otI-","affixIcon":"m0YpdssD2dY-","suffix":"_-3mMnjSh6ok-","affixLabel":"-Wzcb0pBh5I-","description":"DHX5ijY3xIw-","toolbar":"AL-2brNI7dk-","spinning":"_8Rzv7CcDW80-"};
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @internal Reach out to UX Foundations if using this component since it is possible it might change
|
|
19
|
+
*/
|
|
20
|
+
function AffixLabel({ label, variation = "prefix", labelRef, }) {
|
|
21
|
+
const affixLabelClass = classnames(formFieldStyles.affixLabel, {
|
|
22
|
+
[formFieldStyles.suffix]: variation === "suffix",
|
|
23
|
+
});
|
|
24
|
+
if (!label)
|
|
25
|
+
return null;
|
|
26
|
+
return (React.createElement("div", { ref: labelRef, className: affixLabelClass }, label));
|
|
27
|
+
}
|
|
28
|
+
function AffixIcon({ icon, onClick, ariaLabel, variation = "prefix", size, }) {
|
|
29
|
+
const affixIconClass = classnames(formFieldStyles.affixIcon, {
|
|
30
|
+
[formFieldStyles.suffix]: variation === "suffix",
|
|
31
|
+
});
|
|
32
|
+
const iconSize = size === "small" ? "small" : "base";
|
|
33
|
+
if (!icon)
|
|
34
|
+
return null;
|
|
35
|
+
return (React.createElement("div", { className: affixIconClass }, onClick ? (React.createElement(Button.Button
|
|
36
|
+
/**
|
|
37
|
+
* We can cast the ariaLabel here as a `Suffix`
|
|
38
|
+
* requires an ariaLabel if there is an action
|
|
39
|
+
*/
|
|
40
|
+
, {
|
|
41
|
+
/**
|
|
42
|
+
* We can cast the ariaLabel here as a `Suffix`
|
|
43
|
+
* requires an ariaLabel if there is an action
|
|
44
|
+
*/
|
|
45
|
+
ariaLabel: ariaLabel, icon: icon, onClick: onClick, variation: "subtle", type: "tertiary", size: iconSize })) : (React.createElement(Icon.Icon, { name: icon, size: iconSize, color: "greyBlue" }))));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function FormFieldDescription({ id, description, visible = true, }) {
|
|
49
|
+
if (!visible)
|
|
50
|
+
return null;
|
|
51
|
+
const useStringFormat = !description || typeof description === "string";
|
|
52
|
+
return (React.createElement("div", { id: id, className: formFieldStyles.description }, useStringFormat ? (React.createElement(Text.Text, { size: "small", variation: "subdued" }, description)) : (description)));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
var styles = {"clearInput":"YmRTd-KeXv4-","spinning":"B25z9B8I3gs-"};
|
|
56
|
+
|
|
57
|
+
function ClearAction({ onClick, visible, }) {
|
|
58
|
+
if (!visible)
|
|
59
|
+
return null;
|
|
60
|
+
return (React.createElement("button", { className: styles.clearInput, onClick: onClick, type: "button", "aria-label": "Clear input", "data-testid": "ATL-FormField-clearButton" },
|
|
61
|
+
React.createElement(Icon.Icon, { name: "remove", size: "small" })));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function useToolbar(props) {
|
|
65
|
+
const isToolbarVisible = props.toolbar !== undefined &&
|
|
66
|
+
(props.toolbarVisibility === "always" || props.focused);
|
|
67
|
+
const toolbarAnimationEnd = { opacity: 0, height: 0 };
|
|
68
|
+
const toolbarAnimationStart = { opacity: 1, height: "auto" };
|
|
69
|
+
return {
|
|
70
|
+
isToolbarVisible,
|
|
71
|
+
toolbarAnimationEnd,
|
|
72
|
+
toolbarAnimationStart,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function useIsSafari() {
|
|
77
|
+
return (globalThis === null || globalThis === void 0 ? void 0 : globalThis.navigator)
|
|
78
|
+
? /^((?!chrome|android).)*safari/i.test(navigator.userAgent)
|
|
79
|
+
: false;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Hook for getting the correct styles for the FormField and its children
|
|
84
|
+
*/
|
|
85
|
+
function useFormFieldWrapperStyles({ size, align, placeholder, value, invalid, error, max, prefixRef, suffixRef, maxLength, type, disabled, inline, showMiniLabel = true, }) {
|
|
86
|
+
const isSafari = useIsSafari();
|
|
87
|
+
const wrapperClasses = classnames(formFieldStyles.wrapper, size && formFieldStyles[size], align && formFieldStyles[align], {
|
|
88
|
+
[formFieldStyles.miniLabel]: (showMiniLabel && placeholder && value !== "") ||
|
|
89
|
+
(placeholder && type === "select") ||
|
|
90
|
+
// Naively assume that if the the type is tel, it is the InputPhoneNumber
|
|
91
|
+
(placeholder && type === "tel"),
|
|
92
|
+
[formFieldStyles.text]: type === "textarea" || type === "text",
|
|
93
|
+
[formFieldStyles.textarea]: type === "textarea",
|
|
94
|
+
[formFieldStyles.safari]: isSafari && type === "textarea",
|
|
95
|
+
[formFieldStyles.select]: type === "select",
|
|
96
|
+
[formFieldStyles.invalid]: invalid !== null && invalid !== void 0 ? invalid : error,
|
|
97
|
+
[formFieldStyles.disabled]: disabled,
|
|
98
|
+
[formFieldStyles.maxLength]: maxLength,
|
|
99
|
+
[formFieldStyles.timeInputLabel]: placeholder && type === "time" && placeholder && value === "",
|
|
100
|
+
});
|
|
101
|
+
const containerClasses = classnames(formFieldStyles.container, {
|
|
102
|
+
[formFieldStyles.inline]: inline,
|
|
103
|
+
});
|
|
104
|
+
const wrapperInlineStyle = {
|
|
105
|
+
["--formField-maxLength"]: maxLength || max,
|
|
106
|
+
};
|
|
107
|
+
const [labelStyle, setLabelStyle] = React.useState({
|
|
108
|
+
paddingLeft: undefined,
|
|
109
|
+
paddingRight: undefined,
|
|
110
|
+
});
|
|
111
|
+
React.useEffect(() => {
|
|
112
|
+
var _a, _b;
|
|
113
|
+
setLabelStyle(getAffixPaddding({
|
|
114
|
+
value,
|
|
115
|
+
type,
|
|
116
|
+
prefixWidth: ((_a = prefixRef === null || prefixRef === void 0 ? void 0 : prefixRef.current) === null || _a === void 0 ? void 0 : _a.offsetWidth) || 0,
|
|
117
|
+
suffixWidth: ((_b = suffixRef === null || suffixRef === void 0 ? void 0 : suffixRef.current) === null || _b === void 0 ? void 0 : _b.offsetWidth) || 0,
|
|
118
|
+
}));
|
|
119
|
+
}, [value]);
|
|
120
|
+
return {
|
|
121
|
+
inputStyle: formFieldStyles.input,
|
|
122
|
+
wrapperClasses,
|
|
123
|
+
containerClasses,
|
|
124
|
+
wrapperInlineStyle,
|
|
125
|
+
labelStyle,
|
|
126
|
+
setLabelStyle,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function getAffixPaddding({ value, type, prefixWidth, suffixWidth, }) {
|
|
130
|
+
const hasValue = value !== "";
|
|
131
|
+
const newPadding = {
|
|
132
|
+
paddingLeft: undefined,
|
|
133
|
+
paddingRight: undefined,
|
|
134
|
+
};
|
|
135
|
+
// Naively assume that if the the type is tel, it is the InputPhoneNumber
|
|
136
|
+
if (type === "tel")
|
|
137
|
+
return newPadding;
|
|
138
|
+
if (prefixWidth && !hasValue) {
|
|
139
|
+
newPadding.paddingLeft = offset(prefixWidth);
|
|
140
|
+
}
|
|
141
|
+
if (suffixWidth && !hasValue) {
|
|
142
|
+
newPadding.paddingRight = offset(suffixWidth);
|
|
143
|
+
}
|
|
144
|
+
function offset(width) {
|
|
145
|
+
return `calc(${width}px + var(--space-smallest)`;
|
|
146
|
+
}
|
|
147
|
+
return newPadding;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function FormFieldWrapper({ align, description, descriptionIdentifier, placeholder, value, children, invalid, error, size, prefix, suffix, max, maxLength, type, disabled, inline, identifier, clearable, onClear, readonly, toolbar, toolbarVisibility = "while-editing", showMiniLabel = true, wrapperRef, }) {
|
|
151
|
+
const prefixRef = React.useRef(null);
|
|
152
|
+
const suffixRef = React.useRef(null);
|
|
153
|
+
const { wrapperClasses, containerClasses, wrapperInlineStyle, labelStyle } = useFormFieldWrapperStyles({
|
|
154
|
+
align,
|
|
155
|
+
max,
|
|
156
|
+
maxLength,
|
|
157
|
+
prefixRef,
|
|
158
|
+
suffixRef,
|
|
159
|
+
placeholder,
|
|
160
|
+
value,
|
|
161
|
+
invalid,
|
|
162
|
+
error,
|
|
163
|
+
type,
|
|
164
|
+
disabled,
|
|
165
|
+
inline,
|
|
166
|
+
size,
|
|
167
|
+
showMiniLabel,
|
|
168
|
+
});
|
|
169
|
+
const { focused } = useFormFieldFocus.useFormFieldFocus({ wrapperRef });
|
|
170
|
+
const showClear = jobberHooks.useShowClear({
|
|
171
|
+
clearable,
|
|
172
|
+
multiline: type === "textarea",
|
|
173
|
+
focused,
|
|
174
|
+
hasValue: Boolean(value),
|
|
175
|
+
disabled,
|
|
176
|
+
readonly,
|
|
177
|
+
});
|
|
178
|
+
const { isToolbarVisible, toolbarAnimationEnd, toolbarAnimationStart } = useToolbar({
|
|
179
|
+
focused,
|
|
180
|
+
toolbar,
|
|
181
|
+
toolbarVisibility,
|
|
182
|
+
});
|
|
183
|
+
return (React.createElement("div", { className: containerClasses },
|
|
184
|
+
React.createElement("div", { className: wrapperClasses, style: wrapperInlineStyle, "data-testid": "Form-Field-Wrapper", ref: wrapperRef },
|
|
185
|
+
React.createElement(FormFieldInputHorizontalWrapper, null,
|
|
186
|
+
React.createElement(AffixIcon, Object.assign({}, prefix, { size: size })),
|
|
187
|
+
React.createElement(FormFieldInputWrapperStyles, null,
|
|
188
|
+
(showMiniLabel || !value) && (React.createElement(FormFieldLabel, { htmlFor: identifier, style: (prefixRef === null || prefixRef === void 0 ? void 0 : prefixRef.current) || (suffixRef === null || suffixRef === void 0 ? void 0 : suffixRef.current)
|
|
189
|
+
? labelStyle
|
|
190
|
+
: undefined }, placeholder)),
|
|
191
|
+
React.createElement(AffixLabel, Object.assign({}, prefix, { labelRef: prefixRef })),
|
|
192
|
+
React.createElement(FormFieldWrapperMain, null, children),
|
|
193
|
+
React.createElement(AffixLabel, Object.assign({}, suffix, { labelRef: suffixRef, variation: "suffix" }))),
|
|
194
|
+
React.createElement(ClearAction, { onClick: onClear, visible: showClear }),
|
|
195
|
+
React.createElement(AffixIcon, Object.assign({}, suffix, { variation: "suffix", size: size }))),
|
|
196
|
+
React.createElement(FormFieldWrapperToolbar, { toolbarVisibility: toolbarVisibility, isToolbarVisible: isToolbarVisible, toolbarAnimationEnd: toolbarAnimationEnd, toolbarAnimationStart: toolbarAnimationStart, toolbar: toolbar })),
|
|
197
|
+
React.createElement(FormFieldDescription, { visible: !!description && !inline, id: descriptionIdentifier, description: description }),
|
|
198
|
+
React.createElement(InputValidation.InputValidation, { message: error, visible: !!error && !inline })));
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* @internal Reach out to UX Foundations if using this component since it is possible it might change
|
|
202
|
+
*/
|
|
203
|
+
function FormFieldInputHorizontalWrapper({ children, }) {
|
|
204
|
+
return React.createElement("div", { className: formFieldStyles.horizontalWrapper }, children);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* @internal Reach out to UX Foundations if using this component since it is possible it might change
|
|
208
|
+
*/
|
|
209
|
+
function FormFieldInputWrapperStyles({ children, }) {
|
|
210
|
+
return React.createElement("div", { className: formFieldStyles.inputWrapper }, children);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* @internal Reach out to UX Foundations if using this component since it is possible it might change
|
|
214
|
+
*/
|
|
215
|
+
function FormFieldWrapperMain({ children, tabIndex = -1, }) {
|
|
216
|
+
return (React.createElement("div", { className: formFieldStyles.childrenWrapper, tabIndex: tabIndex }, children));
|
|
217
|
+
}
|
|
218
|
+
function FormFieldLabel({ children, htmlFor, style, external = false, }) {
|
|
219
|
+
if (!children)
|
|
220
|
+
return null;
|
|
221
|
+
return (React.createElement("label", { className: external ? formFieldStyles.externalLabel : formFieldStyles.label, htmlFor: htmlFor, style: style }, children));
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* @internal Reach out to UX Foundations if using this component since it is possible it might change
|
|
225
|
+
*/
|
|
226
|
+
function FormFieldWrapperToolbar({ toolbar, isToolbarVisible, toolbarAnimationEnd, toolbarAnimationStart, toolbarVisibility, }) {
|
|
227
|
+
return (React.createElement(framerMotion.AnimatePresence, { initial: toolbarVisibility === "always" ? false : true }, isToolbarVisible && (React.createElement(framerMotion.motion.div, { key: "toolbar", initial: toolbarAnimationEnd, animate: toolbarAnimationStart, exit: toolbarAnimationEnd, transition: {
|
|
228
|
+
duration: design.tokens["timing-base"] / 1000,
|
|
229
|
+
ease: "easeInOut",
|
|
230
|
+
}, tabIndex: -1 },
|
|
231
|
+
React.createElement("div", { className: formFieldStyles.toolbar, "data-testid": "ATL-InputText-Toolbar" }, toolbar)))));
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
function FormFieldPostFix({ variation, visible = true, className, }) {
|
|
235
|
+
if (!visible)
|
|
236
|
+
return null;
|
|
237
|
+
return (React.createElement("span", { className: classnames(formFieldStyles.postfix, className) }, variation === "select" ? (React.createElement(Icon.Icon, { name: "arrowDown" })) : (React.createElement(Spinner.Spinner, { size: "small" }))));
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
exports.AffixIcon = AffixIcon;
|
|
241
|
+
exports.AffixLabel = AffixLabel;
|
|
242
|
+
exports.FormFieldInputHorizontalWrapper = FormFieldInputHorizontalWrapper;
|
|
243
|
+
exports.FormFieldInputWrapperStyles = FormFieldInputWrapperStyles;
|
|
244
|
+
exports.FormFieldLabel = FormFieldLabel;
|
|
245
|
+
exports.FormFieldPostFix = FormFieldPostFix;
|
|
246
|
+
exports.FormFieldWrapper = FormFieldWrapper;
|
|
247
|
+
exports.FormFieldWrapperMain = FormFieldWrapperMain;
|
|
248
|
+
exports.FormFieldWrapperToolbar = FormFieldWrapperToolbar;
|
|
249
|
+
exports.formFieldStyles = formFieldStyles;
|
|
250
|
+
exports.useFormFieldWrapperStyles = useFormFieldWrapperStyles;
|