@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.
- package/dist/Autocomplete/index.cjs +12 -0
- package/dist/Autocomplete/index.mjs +12 -0
- package/dist/Button/Button.d.ts +757 -6
- package/dist/Button-cjs.js +15 -9
- package/dist/Button-es.js +16 -10
- package/dist/Chips/InternalChipDismissible/hooks/index.cjs +2 -2
- package/dist/Chips/InternalChipDismissible/hooks/index.mjs +2 -2
- package/dist/Chips/InternalChipDismissible/index.cjs +2 -2
- package/dist/Chips/InternalChipDismissible/index.mjs +2 -2
- package/dist/Chips/index.cjs +2 -2
- package/dist/Chips/index.mjs +2 -2
- package/dist/DataList/components/DataListSearch/index.cjs +12 -1
- package/dist/DataList/components/DataListSearch/index.mjs +12 -1
- package/dist/DataList/index.cjs +8 -0
- package/dist/DataList/index.mjs +8 -0
- package/dist/DataTable/index.cjs +2 -2
- package/dist/DataTable/index.mjs +2 -2
- package/dist/DatePicker/index.cjs +2 -2
- package/dist/DatePicker/index.mjs +2 -2
- package/dist/FormField/FormFieldTypes.d.ts +0 -195
- package/dist/FormField-cjs.js +1 -0
- package/dist/FormField-es.js +1 -1
- package/dist/InputDate/index.cjs +4 -8
- package/dist/InputDate/index.mjs +4 -8
- package/dist/InputDate/useInputDateActivatorActions.d.ts +2 -2
- package/dist/InputEmail/InputEmail.types.d.ts +21 -28
- package/dist/InputEmail/hooks/useInputEmailActions.d.ts +1 -1
- package/dist/InputEmail/hooks/useInputEmailFormField.d.ts +32 -0
- package/dist/InputEmail/index.cjs +45 -10
- package/dist/InputEmail/index.mjs +45 -10
- package/dist/InputPhoneNumber/InputPhoneNumber.types.d.ts +24 -25
- package/dist/InputPhoneNumber/hooks/useInputPhoneActions.d.ts +1 -1
- package/dist/InputPhoneNumber/hooks/useInputPhoneFormField.d.ts +71 -0
- package/dist/InputPhoneNumber/index.cjs +36 -24
- package/dist/InputPhoneNumber/index.mjs +36 -24
- package/dist/InputText/InputText.d.ts +2 -2
- package/dist/InputText/InputText.types.d.ts +24 -39
- package/dist/InputText/index.cjs +55 -26
- package/dist/InputText/index.mjs +56 -27
- package/dist/InputText/useInputTextActions.d.ts +1 -1
- package/dist/InputText/useInputTextFormField.d.ts +352 -0
- package/dist/InputTime/index.cjs +1 -1
- package/dist/InputTime/index.mjs +1 -1
- package/dist/List/index.cjs +2 -2
- package/dist/List/index.mjs +2 -2
- package/dist/RecurringSelect/index.cjs +2 -2
- package/dist/RecurringSelect/index.mjs +2 -2
- package/dist/Select/index.cjs +2 -2
- package/dist/Select/index.mjs +2 -2
- package/dist/_baseEach-cjs.js +12 -12
- package/dist/_baseEach-es.js +1 -1
- package/dist/_baseFlatten-cjs.js +2 -2
- package/dist/_baseFlatten-es.js +1 -1
- package/dist/{_getAllKeys-cjs.js → _baseGet-cjs.js} +181 -181
- package/dist/{_getAllKeys-es.js → _baseGet-es.js} +182 -182
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/dist/omit-cjs.js +14 -14
- package/dist/omit-es.js +1 -1
- package/dist/useScrollToActive-cjs.js +3 -3
- package/dist/useScrollToActive-es.js +1 -1
- package/package.json +2 -2
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Clearable } from "@jobber/hooks";
|
|
2
|
+
import type { CommonFormFieldProps, FormFieldProps } from "../FormField";
|
|
2
3
|
export type InputEmailLegacyProps = CommonFormFieldProps & Pick<FormFieldProps, "maxLength" | "readonly" | "validations" | "defaultValue">;
|
|
3
4
|
export declare const validationMessage = "Please enter a valid email";
|
|
4
5
|
export type InputEmailVersion = 1 | 2 | undefined;
|
|
@@ -6,35 +7,27 @@ export type InputEmailVersion = 1 | 2 | undefined;
|
|
|
6
7
|
* Experimental version 2 of the InputEmail component.
|
|
7
8
|
* Do not use unless you have talked with Atlantis first.
|
|
8
9
|
*/
|
|
9
|
-
export interface InputEmailRebuiltProps extends
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
readonly
|
|
10
|
+
export interface InputEmailRebuiltProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "onChange" | "onBlur" | "size" | "suffix" | "prefix" | "value" | "max" | "min" | "defaultValue"> {
|
|
11
|
+
readonly error?: string;
|
|
12
|
+
readonly invalid?: boolean;
|
|
13
|
+
readonly identifier?: string;
|
|
14
|
+
readonly autocomplete?: boolean | string;
|
|
15
|
+
readonly loading?: boolean;
|
|
16
|
+
readonly onKeyUp?: (event: React.KeyboardEvent<HTMLInputElement>) => void;
|
|
17
|
+
readonly children?: React.ReactNode;
|
|
18
|
+
readonly clearable?: Clearable;
|
|
14
19
|
/**
|
|
15
|
-
*
|
|
20
|
+
* Version 2 is highly experimental. Avoid using it unless you have talked with Atlantis first.
|
|
16
21
|
*/
|
|
22
|
+
readonly version: 2;
|
|
17
23
|
readonly onChange?: (newValue: string, event?: React.ChangeEvent<HTMLInputElement>) => void;
|
|
18
|
-
/**
|
|
19
|
-
* A callback to handle "Enter" keypress. This will only run
|
|
20
|
-
* if Enter is the only key. Will not run if Shift or Control
|
|
21
|
-
* are being held.
|
|
22
|
-
*/
|
|
23
24
|
readonly onEnter?: FormFieldProps["onEnter"];
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
readonly
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
readonly
|
|
32
|
-
/**
|
|
33
|
-
* @deprecated Use `aria-label` instead. This prop will be removed in a future version.
|
|
34
|
-
*/
|
|
35
|
-
readonly ariaLabel?: never;
|
|
36
|
-
/**
|
|
37
|
-
* @deprecated Use `readOnly` instead. This prop will be removed in a future version.
|
|
38
|
-
*/
|
|
39
|
-
readonly readonly?: never;
|
|
25
|
+
readonly onBlur?: FormFieldProps["onBlur"];
|
|
26
|
+
readonly value?: string;
|
|
27
|
+
readonly size?: FormFieldProps["size"];
|
|
28
|
+
readonly inline?: FormFieldProps["inline"];
|
|
29
|
+
readonly align?: FormFieldProps["align"];
|
|
30
|
+
readonly prefix?: FormFieldProps["prefix"];
|
|
31
|
+
readonly suffix?: FormFieldProps["suffix"];
|
|
32
|
+
readonly description?: FormFieldProps["description"];
|
|
40
33
|
}
|
|
@@ -8,5 +8,5 @@ export declare function useInputEmailActions({ onChange, inputRef, onEnter, onFo
|
|
|
8
8
|
handleChange: (event: ChangeEvent<HTMLInputElement>) => void;
|
|
9
9
|
handleKeyDown: (event: KeyboardEvent<HTMLInputElement>) => void;
|
|
10
10
|
handleFocus: (event: FocusEvent<HTMLInputElement>) => void;
|
|
11
|
-
handleBlur: (event
|
|
11
|
+
handleBlur: (event?: FocusEvent) => void;
|
|
12
12
|
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ChangeEvent, FocusEvent, KeyboardEvent, ReactNode } from "react";
|
|
2
|
+
export interface UseInputEmailFormFieldProps {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly disabled?: boolean;
|
|
6
|
+
readonly autofocus?: boolean;
|
|
7
|
+
readonly error?: string;
|
|
8
|
+
readonly inline?: boolean;
|
|
9
|
+
readonly description?: ReactNode;
|
|
10
|
+
readonly invalid?: boolean;
|
|
11
|
+
readonly value?: string;
|
|
12
|
+
readonly handleChange: (event: ChangeEvent<HTMLInputElement>) => void;
|
|
13
|
+
readonly handleBlur: (event?: FocusEvent<HTMLInputElement>) => void;
|
|
14
|
+
readonly handleFocus: (event: FocusEvent<HTMLInputElement>) => void;
|
|
15
|
+
readonly handleKeyDown: (event: KeyboardEvent<HTMLInputElement>) => void;
|
|
16
|
+
}
|
|
17
|
+
export interface UseInputEmailFormFieldReturn {
|
|
18
|
+
readonly fieldProps: {
|
|
19
|
+
readonly id: string;
|
|
20
|
+
readonly name: string;
|
|
21
|
+
readonly disabled?: boolean;
|
|
22
|
+
readonly autofocus?: boolean;
|
|
23
|
+
readonly onChange: (event: ChangeEvent<HTMLInputElement>) => void;
|
|
24
|
+
readonly onBlur: (event?: FocusEvent<HTMLInputElement>) => void;
|
|
25
|
+
readonly onFocus: (event: FocusEvent<HTMLInputElement>) => void;
|
|
26
|
+
readonly onKeyDown: (event: KeyboardEvent<HTMLInputElement>) => void;
|
|
27
|
+
readonly value?: string;
|
|
28
|
+
readonly "aria-describedby"?: string;
|
|
29
|
+
};
|
|
30
|
+
readonly descriptionIdentifier: string;
|
|
31
|
+
}
|
|
32
|
+
export declare function useInputEmailFormField({ id, name, disabled, autofocus, description, inline, value, handleChange, handleBlur, handleFocus, handleKeyDown, error, ...rest }: UseInputEmailFormFieldProps): UseInputEmailFormFieldReturn;
|
|
@@ -3,12 +3,13 @@
|
|
|
3
3
|
var React = require('react');
|
|
4
4
|
var FormField = require('../FormField-cjs.js');
|
|
5
5
|
require('classnames');
|
|
6
|
-
require('../tslib.es6-cjs.js');
|
|
6
|
+
var tslib_es6 = require('../tslib.es6-cjs.js');
|
|
7
7
|
require('react-hook-form');
|
|
8
8
|
require('@jobber/hooks');
|
|
9
9
|
require('framer-motion');
|
|
10
10
|
require('@jobber/design');
|
|
11
11
|
require('../Button-cjs.js');
|
|
12
|
+
var omit = require('../omit-cjs.js');
|
|
12
13
|
require('../Icon-cjs.js');
|
|
13
14
|
require('../Text-cjs.js');
|
|
14
15
|
require('../Typography-cjs.js');
|
|
@@ -16,6 +17,17 @@ require('../useFormFieldFocus-cjs.js');
|
|
|
16
17
|
require('../InputValidation-cjs.js');
|
|
17
18
|
require('../Spinner-cjs.js');
|
|
18
19
|
require('react-router-dom');
|
|
20
|
+
require('../_commonjsHelpers-cjs.js');
|
|
21
|
+
require('../_baseGet-cjs.js');
|
|
22
|
+
require('../isTypedArray-cjs.js');
|
|
23
|
+
require('../isObjectLike-cjs.js');
|
|
24
|
+
require('../identity-cjs.js');
|
|
25
|
+
require('../_getTag-cjs.js');
|
|
26
|
+
require('../isSymbol-cjs.js');
|
|
27
|
+
require('../keysIn-cjs.js');
|
|
28
|
+
require('../_baseAssignValue-cjs.js');
|
|
29
|
+
require('../_baseFlatten-cjs.js');
|
|
30
|
+
require('../_setToString-cjs.js');
|
|
19
31
|
|
|
20
32
|
const validationMessage = "Please enter a valid email";
|
|
21
33
|
|
|
@@ -37,7 +49,7 @@ function InputEmail$1(props) {
|
|
|
37
49
|
function useInputEmailActions({ onChange, inputRef, onEnter, onFocus, onBlur, onKeyDown, }) {
|
|
38
50
|
function handleClear() {
|
|
39
51
|
var _a;
|
|
40
|
-
|
|
52
|
+
handleBlur();
|
|
41
53
|
onChange === null || onChange === void 0 ? void 0 : onChange("");
|
|
42
54
|
(_a = inputRef === null || inputRef === void 0 ? void 0 : inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
43
55
|
}
|
|
@@ -71,10 +83,19 @@ function useInputEmailActions({ onChange, inputRef, onEnter, onFocus, onBlur, on
|
|
|
71
83
|
};
|
|
72
84
|
}
|
|
73
85
|
|
|
86
|
+
function useInputEmailFormField(_a) {
|
|
87
|
+
var { id, name, disabled, autofocus, description, inline, value, handleChange, handleBlur, handleFocus, handleKeyDown, error } = _a, rest = tslib_es6.__rest(_a, ["id", "name", "disabled", "autofocus", "description", "inline", "value", "handleChange", "handleBlur", "handleFocus", "handleKeyDown", "error"]);
|
|
88
|
+
const descriptionIdentifier = `descriptionUUID--${id}`;
|
|
89
|
+
const fieldProps = Object.assign(Object.assign(Object.assign({}, rest), { id,
|
|
90
|
+
name,
|
|
91
|
+
disabled, autoFocus: autofocus, onChange: handleChange, onBlur: handleBlur, onFocus: handleFocus, onKeyDown: handleKeyDown, value, invalid: error || rest.invalid ? "true" : undefined }), (description &&
|
|
92
|
+
!inline && { "aria-describedby": descriptionIdentifier }));
|
|
93
|
+
return { fieldProps, descriptionIdentifier };
|
|
94
|
+
}
|
|
95
|
+
|
|
74
96
|
const InputEmailRebuilt = React.forwardRef(function InputEmailInternal(props, ref) {
|
|
75
97
|
var _a, _b, _c;
|
|
76
|
-
const
|
|
77
|
-
const id = props.identifier || props.id || generatedId;
|
|
98
|
+
const id = React.useId();
|
|
78
99
|
const inputRef = (_a = ref) !== null && _a !== void 0 ? _a : React.useRef(null);
|
|
79
100
|
const wrapperRef = React.useRef(null);
|
|
80
101
|
const { inputStyle } = FormField.useFormFieldWrapperStyles({
|
|
@@ -85,7 +106,7 @@ const InputEmailRebuilt = React.forwardRef(function InputEmailInternal(props, re
|
|
|
85
106
|
value: props.value,
|
|
86
107
|
invalid: props.invalid,
|
|
87
108
|
error: props.error,
|
|
88
|
-
maxLength:
|
|
109
|
+
maxLength: props.maxLength,
|
|
89
110
|
disabled: props.disabled,
|
|
90
111
|
placeholder: props.placeholder,
|
|
91
112
|
});
|
|
@@ -101,11 +122,25 @@ const InputEmailRebuilt = React.forwardRef(function InputEmailInternal(props, re
|
|
|
101
122
|
onEnter: props.onEnter,
|
|
102
123
|
inputRef,
|
|
103
124
|
});
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
125
|
+
const inputProps = omit.omit(props, [
|
|
126
|
+
"placeholder",
|
|
127
|
+
"onChange",
|
|
128
|
+
"onBlur",
|
|
129
|
+
"onFocus",
|
|
130
|
+
"onEnter",
|
|
131
|
+
"size",
|
|
132
|
+
"prefix",
|
|
133
|
+
"suffix",
|
|
134
|
+
"version",
|
|
135
|
+
]);
|
|
136
|
+
const { fieldProps, descriptionIdentifier } = useInputEmailFormField(Object.assign(Object.assign({}, inputProps), { id,
|
|
137
|
+
name,
|
|
138
|
+
handleChange,
|
|
139
|
+
handleBlur,
|
|
140
|
+
handleFocus,
|
|
141
|
+
handleKeyDown }));
|
|
142
|
+
return (React.createElement(FormField.FormFieldWrapper, { error: props.error || "", invalid: props.invalid, identifier: props.identifier || id, descriptionIdentifier: descriptionIdentifier, size: props.size, inline: props.inline, align: props.align, prefix: props.prefix, suffix: props.suffix, description: props.description, clearable: (_b = props.clearable) !== null && _b !== void 0 ? _b : "never", onClear: handleClear, wrapperRef: wrapperRef, maxLength: props.maxLength, disabled: props.disabled, type: "email", value: props.value, placeholder: props.placeholder, autofocus: props.autoFocus, name: name },
|
|
143
|
+
React.createElement("input", Object.assign({}, fieldProps, { ref: inputRef, type: "email", className: inputStyle, value: props.value, "data-testid": "ATL-InputEmail-input" })),
|
|
109
144
|
React.createElement(FormField.FormFieldPostFix, { variation: "spinner", visible: (_c = props.loading) !== null && _c !== void 0 ? _c : false }),
|
|
110
145
|
props.children));
|
|
111
146
|
});
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import React__default, { forwardRef, useId, useRef } from 'react';
|
|
2
2
|
import { k as FormField, j as useFormFieldWrapperStyles, b as useAtlantisFormFieldName, f as FormFieldWrapper, l as FormFieldPostFix } from '../FormField-es.js';
|
|
3
3
|
import 'classnames';
|
|
4
|
-
import '../tslib.es6-es.js';
|
|
4
|
+
import { _ as __rest } from '../tslib.es6-es.js';
|
|
5
5
|
import 'react-hook-form';
|
|
6
6
|
import '@jobber/hooks';
|
|
7
7
|
import 'framer-motion';
|
|
8
8
|
import '@jobber/design';
|
|
9
9
|
import '../Button-es.js';
|
|
10
|
+
import { o as omit } from '../omit-es.js';
|
|
10
11
|
import '../Icon-es.js';
|
|
11
12
|
import '../Text-es.js';
|
|
12
13
|
import '../Typography-es.js';
|
|
@@ -14,6 +15,17 @@ import '../useFormFieldFocus-es.js';
|
|
|
14
15
|
import '../InputValidation-es.js';
|
|
15
16
|
import '../Spinner-es.js';
|
|
16
17
|
import 'react-router-dom';
|
|
18
|
+
import '../_commonjsHelpers-es.js';
|
|
19
|
+
import '../_baseGet-es.js';
|
|
20
|
+
import '../isTypedArray-es.js';
|
|
21
|
+
import '../isObjectLike-es.js';
|
|
22
|
+
import '../identity-es.js';
|
|
23
|
+
import '../_getTag-es.js';
|
|
24
|
+
import '../isSymbol-es.js';
|
|
25
|
+
import '../keysIn-es.js';
|
|
26
|
+
import '../_baseAssignValue-es.js';
|
|
27
|
+
import '../_baseFlatten-es.js';
|
|
28
|
+
import '../_setToString-es.js';
|
|
17
29
|
|
|
18
30
|
const validationMessage = "Please enter a valid email";
|
|
19
31
|
|
|
@@ -35,7 +47,7 @@ function InputEmail$1(props) {
|
|
|
35
47
|
function useInputEmailActions({ onChange, inputRef, onEnter, onFocus, onBlur, onKeyDown, }) {
|
|
36
48
|
function handleClear() {
|
|
37
49
|
var _a;
|
|
38
|
-
|
|
50
|
+
handleBlur();
|
|
39
51
|
onChange === null || onChange === void 0 ? void 0 : onChange("");
|
|
40
52
|
(_a = inputRef === null || inputRef === void 0 ? void 0 : inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
41
53
|
}
|
|
@@ -69,10 +81,19 @@ function useInputEmailActions({ onChange, inputRef, onEnter, onFocus, onBlur, on
|
|
|
69
81
|
};
|
|
70
82
|
}
|
|
71
83
|
|
|
84
|
+
function useInputEmailFormField(_a) {
|
|
85
|
+
var { id, name, disabled, autofocus, description, inline, value, handleChange, handleBlur, handleFocus, handleKeyDown, error } = _a, rest = __rest(_a, ["id", "name", "disabled", "autofocus", "description", "inline", "value", "handleChange", "handleBlur", "handleFocus", "handleKeyDown", "error"]);
|
|
86
|
+
const descriptionIdentifier = `descriptionUUID--${id}`;
|
|
87
|
+
const fieldProps = Object.assign(Object.assign(Object.assign({}, rest), { id,
|
|
88
|
+
name,
|
|
89
|
+
disabled, autoFocus: autofocus, onChange: handleChange, onBlur: handleBlur, onFocus: handleFocus, onKeyDown: handleKeyDown, value, invalid: error || rest.invalid ? "true" : undefined }), (description &&
|
|
90
|
+
!inline && { "aria-describedby": descriptionIdentifier }));
|
|
91
|
+
return { fieldProps, descriptionIdentifier };
|
|
92
|
+
}
|
|
93
|
+
|
|
72
94
|
const InputEmailRebuilt = forwardRef(function InputEmailInternal(props, ref) {
|
|
73
95
|
var _a, _b, _c;
|
|
74
|
-
const
|
|
75
|
-
const id = props.identifier || props.id || generatedId;
|
|
96
|
+
const id = useId();
|
|
76
97
|
const inputRef = (_a = ref) !== null && _a !== void 0 ? _a : useRef(null);
|
|
77
98
|
const wrapperRef = useRef(null);
|
|
78
99
|
const { inputStyle } = useFormFieldWrapperStyles({
|
|
@@ -83,7 +104,7 @@ const InputEmailRebuilt = forwardRef(function InputEmailInternal(props, ref) {
|
|
|
83
104
|
value: props.value,
|
|
84
105
|
invalid: props.invalid,
|
|
85
106
|
error: props.error,
|
|
86
|
-
maxLength:
|
|
107
|
+
maxLength: props.maxLength,
|
|
87
108
|
disabled: props.disabled,
|
|
88
109
|
placeholder: props.placeholder,
|
|
89
110
|
});
|
|
@@ -99,11 +120,25 @@ const InputEmailRebuilt = forwardRef(function InputEmailInternal(props, ref) {
|
|
|
99
120
|
onEnter: props.onEnter,
|
|
100
121
|
inputRef,
|
|
101
122
|
});
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
123
|
+
const inputProps = omit(props, [
|
|
124
|
+
"placeholder",
|
|
125
|
+
"onChange",
|
|
126
|
+
"onBlur",
|
|
127
|
+
"onFocus",
|
|
128
|
+
"onEnter",
|
|
129
|
+
"size",
|
|
130
|
+
"prefix",
|
|
131
|
+
"suffix",
|
|
132
|
+
"version",
|
|
133
|
+
]);
|
|
134
|
+
const { fieldProps, descriptionIdentifier } = useInputEmailFormField(Object.assign(Object.assign({}, inputProps), { id,
|
|
135
|
+
name,
|
|
136
|
+
handleChange,
|
|
137
|
+
handleBlur,
|
|
138
|
+
handleFocus,
|
|
139
|
+
handleKeyDown }));
|
|
140
|
+
return (React__default.createElement(FormFieldWrapper, { error: props.error || "", invalid: props.invalid, identifier: props.identifier || id, descriptionIdentifier: descriptionIdentifier, size: props.size, inline: props.inline, align: props.align, prefix: props.prefix, suffix: props.suffix, description: props.description, clearable: (_b = props.clearable) !== null && _b !== void 0 ? _b : "never", onClear: handleClear, wrapperRef: wrapperRef, maxLength: props.maxLength, disabled: props.disabled, type: "email", value: props.value, placeholder: props.placeholder, autofocus: props.autoFocus, name: name },
|
|
141
|
+
React__default.createElement("input", Object.assign({}, fieldProps, { ref: inputRef, type: "email", className: inputStyle, value: props.value, "data-testid": "ATL-InputEmail-input" })),
|
|
107
142
|
React__default.createElement(FormFieldPostFix, { variation: "spinner", visible: (_c = props.loading) !== null && _c !== void 0 ? _c : false }),
|
|
108
143
|
props.children));
|
|
109
144
|
});
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import type { Clearable } from "@jobber/hooks";
|
|
1
2
|
import type { InputMaskProps } from "./InputMask";
|
|
2
|
-
import type { CommonFormFieldProps,
|
|
3
|
+
import type { CommonFormFieldProps, FormFieldProps } from "../FormField";
|
|
3
4
|
export interface InputPhoneNumberLegacyProps extends Omit<CommonFormFieldProps, "align">, Pick<FormFieldProps, "autocomplete" | "onEnter" | "onFocus" | "onBlur" | "validations" | "readonly" | "prefix" | "suffix"> {
|
|
4
5
|
readonly value: string;
|
|
5
6
|
readonly onChange: (value: string) => void;
|
|
@@ -15,21 +16,20 @@ export interface InputPhoneNumberLegacyProps extends Omit<CommonFormFieldProps,
|
|
|
15
16
|
*/
|
|
16
17
|
readonly required?: boolean;
|
|
17
18
|
}
|
|
18
|
-
export interface InputPhoneNumberRebuiltProps extends Omit<
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
export interface InputPhoneNumberRebuiltProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "onChange" | "onBlur" | "size" | "suffix" | "prefix" | "value" | "max" | "min" | "defaultValue" | "readOnly" | "type" | "maxLength" | "minLength"> {
|
|
20
|
+
readonly error?: string;
|
|
21
|
+
readonly invalid?: boolean;
|
|
22
|
+
readonly identifier?: string;
|
|
23
|
+
readonly autocomplete?: boolean | string;
|
|
24
|
+
readonly loading?: boolean;
|
|
25
|
+
readonly onKeyUp?: (event: React.KeyboardEvent<HTMLInputElement>) => void;
|
|
26
|
+
readonly children?: React.ReactNode;
|
|
27
|
+
readonly clearable?: Clearable;
|
|
22
28
|
readonly value: string;
|
|
23
|
-
/**
|
|
24
|
-
* Custom onChange handler that provides the new value as the first argument.
|
|
25
|
-
*/
|
|
26
29
|
readonly onChange: (value: string, event?: React.ChangeEvent<HTMLInputElement>) => void;
|
|
27
|
-
|
|
28
|
-
* A callback to handle "Enter" keypress. This will only run
|
|
29
|
-
* if Enter is the only key. Will not run if Shift or Control
|
|
30
|
-
* are being held.
|
|
31
|
-
*/
|
|
30
|
+
readonly onBlur?: (event?: React.FocusEvent<HTMLInputElement>) => void;
|
|
32
31
|
readonly onEnter?: (event: React.KeyboardEvent<HTMLInputElement>) => void;
|
|
32
|
+
readonly onFocus?: (event?: React.FocusEvent<HTMLInputElement>) => void;
|
|
33
33
|
/**
|
|
34
34
|
* A pattern to specify the format to display the phone number in.
|
|
35
35
|
* For example if you want to display the format for [Denmark](https://en.wikipedia.org/wiki/National_conventions_for_writing_telephone_numbers#Denmark)
|
|
@@ -38,20 +38,19 @@ export interface InputPhoneNumberRebuiltProps extends Omit<HTMLInputBaseProps, "
|
|
|
38
38
|
*/
|
|
39
39
|
readonly pattern?: InputMaskProps["pattern"];
|
|
40
40
|
/**
|
|
41
|
-
*
|
|
42
|
-
*/
|
|
43
|
-
readonly identifier?: string;
|
|
44
|
-
/**
|
|
45
|
-
* @deprecated Use `autoComplete` with string values instead. This prop will be removed in a future version.
|
|
46
|
-
*/
|
|
47
|
-
readonly autocomplete?: never;
|
|
48
|
-
/**
|
|
49
|
-
* @deprecated Use `aria-label` instead. This prop will be removed in a future version.
|
|
41
|
+
* Shows a "required" validation message when the component is left empty.
|
|
50
42
|
*/
|
|
51
|
-
readonly
|
|
43
|
+
readonly required?: boolean;
|
|
52
44
|
/**
|
|
53
|
-
*
|
|
45
|
+
* Version 2 is highly experimental, avoid using it unless you have talked with Atlantis first.
|
|
54
46
|
*/
|
|
55
|
-
readonly
|
|
47
|
+
readonly version: 2;
|
|
48
|
+
readonly size?: FormFieldProps["size"];
|
|
49
|
+
readonly inline?: FormFieldProps["inline"];
|
|
50
|
+
readonly align?: FormFieldProps["align"];
|
|
51
|
+
readonly prefix?: FormFieldProps["prefix"];
|
|
52
|
+
readonly suffix?: FormFieldProps["suffix"];
|
|
53
|
+
readonly description?: FormFieldProps["description"];
|
|
54
|
+
readonly readonly?: boolean;
|
|
56
55
|
}
|
|
57
56
|
export declare const DEFAULT_PATTERN = "(***) ***-****";
|
|
@@ -11,6 +11,6 @@ export declare function useInputPhoneActions({ onChange, inputRef, onFocus, onBl
|
|
|
11
11
|
handleClear: () => void;
|
|
12
12
|
handleChange: (event: ChangeEvent<HTMLInputElement>) => void;
|
|
13
13
|
handleFocus: (event: FocusEvent<HTMLInputElement>) => void;
|
|
14
|
-
handleBlur: (event
|
|
14
|
+
handleBlur: (event?: FocusEvent<HTMLInputElement>) => void;
|
|
15
15
|
handleKeyDown: (event: KeyboardEvent<HTMLInputElement>) => void;
|
|
16
16
|
};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { ChangeEvent, FocusEvent, KeyboardEvent, ReactNode } from "react";
|
|
2
|
+
export interface useInputPhoneFormFieldProps {
|
|
3
|
+
/**
|
|
4
|
+
* The html id for the field
|
|
5
|
+
*/
|
|
6
|
+
readonly id: string;
|
|
7
|
+
/**
|
|
8
|
+
* The auto-generated name for the html input field if a nameProp is not provided
|
|
9
|
+
*/
|
|
10
|
+
readonly name: string;
|
|
11
|
+
/**
|
|
12
|
+
* The error message for the field
|
|
13
|
+
*/
|
|
14
|
+
readonly error?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Adjusts the form field to go inline with a content. This also silences the
|
|
17
|
+
* given `validations` prop. You'd have to used the `onValidate` prop to
|
|
18
|
+
* capture the message and render it somewhere else using the
|
|
19
|
+
* `InputValidation` component.
|
|
20
|
+
*/
|
|
21
|
+
readonly inline?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Further description of the input, can be used for a hint.
|
|
24
|
+
*/
|
|
25
|
+
readonly description?: ReactNode;
|
|
26
|
+
/**
|
|
27
|
+
* Callback for when the field value changes
|
|
28
|
+
*/
|
|
29
|
+
handleChange: (event: ChangeEvent<HTMLInputElement>) => void;
|
|
30
|
+
/**
|
|
31
|
+
* Callback for when the field loses focus
|
|
32
|
+
*/
|
|
33
|
+
handleBlur: () => void;
|
|
34
|
+
/**
|
|
35
|
+
* Callback for when the field gains focus
|
|
36
|
+
*/
|
|
37
|
+
handleFocus: (event: FocusEvent<HTMLInputElement>) => void;
|
|
38
|
+
/**
|
|
39
|
+
* Callback for when keydown event is triggered on the field
|
|
40
|
+
*/
|
|
41
|
+
handleKeyDown: (event: KeyboardEvent<HTMLInputElement>) => void;
|
|
42
|
+
readonly invalid?: boolean;
|
|
43
|
+
readonly disabled?: boolean;
|
|
44
|
+
readonly autofocus?: boolean;
|
|
45
|
+
readonly value?: string;
|
|
46
|
+
readonly readonly?: boolean;
|
|
47
|
+
}
|
|
48
|
+
export interface UseInputPhoneFormFieldReturn {
|
|
49
|
+
fieldProps: React.InputHTMLAttributes<HTMLInputElement>;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Provides the props for the html fields rendered by the html input.
|
|
53
|
+
* 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.
|
|
54
|
+
*/
|
|
55
|
+
export declare function useInputPhoneFormField({ id, name, description, inline, handleChange, handleBlur, handleFocus, handleKeyDown, error, disabled, autofocus, value, readonly, ...rest }: useInputPhoneFormFieldProps): {
|
|
56
|
+
fieldProps: {
|
|
57
|
+
readOnly: boolean | undefined;
|
|
58
|
+
"aria-describedby"?: string | undefined;
|
|
59
|
+
id: string;
|
|
60
|
+
name: string;
|
|
61
|
+
disabled: boolean | undefined;
|
|
62
|
+
autoFocus: boolean | undefined;
|
|
63
|
+
onChange: (event: ChangeEvent<HTMLInputElement>) => void;
|
|
64
|
+
onBlur: () => void;
|
|
65
|
+
onFocus: (event: FocusEvent<HTMLInputElement>) => void;
|
|
66
|
+
onKeyDown: (event: KeyboardEvent<HTMLInputElement>) => void;
|
|
67
|
+
value: string | undefined;
|
|
68
|
+
invalid: string | undefined;
|
|
69
|
+
};
|
|
70
|
+
descriptionIdentifier: string;
|
|
71
|
+
};
|
|
@@ -115,7 +115,7 @@ const DEFAULT_PATTERN = "(***) ***-****";
|
|
|
115
115
|
function useInputPhoneActions({ onChange, inputRef, onFocus, onBlur, onKeyDown, onEnter, }) {
|
|
116
116
|
function handleClear() {
|
|
117
117
|
var _a;
|
|
118
|
-
|
|
118
|
+
handleBlur();
|
|
119
119
|
onChange && onChange("");
|
|
120
120
|
(_a = inputRef === null || inputRef === void 0 ? void 0 : inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
121
121
|
}
|
|
@@ -149,27 +149,28 @@ function useInputPhoneActions({ onChange, inputRef, onFocus, onBlur, onKeyDown,
|
|
|
149
149
|
};
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
152
|
+
/**
|
|
153
|
+
* Provides the props for the html fields rendered by the html input.
|
|
154
|
+
* 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.
|
|
155
|
+
*/
|
|
156
|
+
function useInputPhoneFormField(_a) {
|
|
157
|
+
var { id, name, description, inline, handleChange, handleBlur, handleFocus, handleKeyDown, error, disabled, autofocus, value, readonly } = _a, rest = tslib_es6.__rest(_a, ["id", "name", "description", "inline", "handleChange", "handleBlur", "handleFocus", "handleKeyDown", "error", "disabled", "autofocus", "value", "readonly"]);
|
|
158
|
+
const descriptionIdentifier = `descriptionUUID--${id}`;
|
|
159
|
+
const fieldProps = Object.assign(Object.assign(Object.assign(Object.assign({}, rest), { id,
|
|
160
|
+
name,
|
|
161
|
+
disabled, autoFocus: autofocus, onChange: handleChange, onBlur: handleBlur, onFocus: handleFocus, onKeyDown: handleKeyDown, value, invalid: error || rest.invalid ? "true" : undefined }), (description &&
|
|
162
|
+
!inline && { "aria-describedby": descriptionIdentifier })), { readOnly: readonly });
|
|
163
|
+
return { fieldProps, descriptionIdentifier };
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const InputPhoneNumberRebuilt = React.forwardRef(function InputPhoneNumberInternal(_a, ref) {
|
|
155
167
|
var _b, _c, _d, _e;
|
|
156
168
|
var { pattern = DEFAULT_PATTERN } = _a, props = tslib_es6.__rest(_a, ["pattern"]);
|
|
157
169
|
const inputPhoneNumberRef = (_b = ref) !== null && _b !== void 0 ? _b : React.useRef(null);
|
|
158
170
|
const wrapperRef = React.useRef(null);
|
|
159
|
-
const { inputStyle } = FormField.useFormFieldWrapperStyles({
|
|
160
|
-
size: props.size,
|
|
161
|
-
align: props.align,
|
|
162
|
-
placeholder: props.placeholder,
|
|
163
|
-
value: props.value,
|
|
164
|
-
invalid: props.invalid,
|
|
165
|
-
error: props.error,
|
|
166
|
-
maxLength: undefined, // v2: maxLength not used for width styling
|
|
167
|
-
disabled: props.disabled,
|
|
168
|
-
inline: props.inline,
|
|
169
|
-
type: "tel",
|
|
170
|
-
});
|
|
171
|
+
const { inputStyle } = FormField.useFormFieldWrapperStyles(Object.assign(Object.assign({}, props), { type: "tel" }));
|
|
171
172
|
const generatedId = React.useId();
|
|
172
|
-
const id = props.
|
|
173
|
+
const id = props.id || generatedId;
|
|
173
174
|
const { name } = FormField.useAtlantisFormFieldName({
|
|
174
175
|
nameProp: props.name,
|
|
175
176
|
id: id,
|
|
@@ -187,14 +188,25 @@ function InputPhoneNumberInternal(_a, ref) {
|
|
|
187
188
|
onEnter: props.onEnter,
|
|
188
189
|
inputRef: inputPhoneNumberRef,
|
|
189
190
|
});
|
|
190
|
-
const descriptionIdentifier =
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
191
|
+
const { fieldProps, descriptionIdentifier } = useInputPhoneFormField({
|
|
192
|
+
id,
|
|
193
|
+
name,
|
|
194
|
+
handleChange,
|
|
195
|
+
handleBlur,
|
|
196
|
+
handleFocus,
|
|
197
|
+
handleKeyDown,
|
|
198
|
+
autofocus: props.autoFocus,
|
|
199
|
+
disabled: props.disabled,
|
|
200
|
+
readonly: props.readonly,
|
|
201
|
+
invalid: props.invalid,
|
|
202
|
+
error: props.error,
|
|
203
|
+
description: props.description,
|
|
204
|
+
inline: props.inline,
|
|
205
|
+
});
|
|
206
|
+
return (React.createElement(FormField.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 },
|
|
207
|
+
React.createElement("input", Object.assign({ type: "tel" }, fieldProps, { ref: inputPhoneNumberRef, className: classnames(inputStyle, {
|
|
196
208
|
[styles.emptyValue]: inputValue.length === 0 && pattern[0] === "(",
|
|
197
|
-
}), value: formattedValue
|
|
209
|
+
}), value: formattedValue })),
|
|
198
210
|
React.createElement(MaskElement, { isMasking: isMasking, formattedValue: formattedValue, placeholderMask: placeholderMask }),
|
|
199
211
|
React.createElement(FormField.FormFieldPostFix, { variation: "spinner", visible: (_e = props.loading) !== null && _e !== void 0 ? _e : false })));
|
|
200
212
|
});
|