@shipengine/formik-giger 0.2.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/esm/Checkbox.d.ts +13 -0
- package/dist/esm/Checkbox.js +57 -0
- package/dist/esm/Checkbox.js.map +1 -0
- package/dist/esm/DatePicker.d.ts +11 -0
- package/dist/esm/DatePicker.js +51 -0
- package/dist/esm/DatePicker.js.map +1 -0
- package/dist/esm/FocusOnError.d.ts +21 -0
- package/dist/esm/FocusOnError.js +70 -0
- package/dist/esm/FocusOnError.js.map +1 -0
- package/dist/esm/FormField.d.ts +17 -0
- package/dist/esm/FormField.js +43 -0
- package/dist/esm/FormField.js.map +1 -0
- package/dist/esm/Input.d.ts +11 -0
- package/dist/esm/Input.js +48 -0
- package/dist/esm/Input.js.map +1 -0
- package/dist/esm/Radio.d.ts +11 -0
- package/dist/esm/Radio.js +49 -0
- package/dist/esm/Radio.js.map +1 -0
- package/dist/esm/RadioGroup.d.ts +11 -0
- package/dist/esm/RadioGroup.js +47 -0
- package/dist/esm/RadioGroup.js.map +1 -0
- package/dist/esm/Select.d.ts +13 -0
- package/dist/esm/Select.js +68 -0
- package/dist/esm/Select.js.map +1 -0
- package/dist/esm/SelectAutocomplete.d.ts +11 -0
- package/dist/esm/SelectAutocomplete.js +57 -0
- package/dist/esm/SelectAutocomplete.js.map +1 -0
- package/dist/esm/Textarea.d.ts +11 -0
- package/dist/esm/Textarea.js +48 -0
- package/dist/esm/Textarea.js.map +1 -0
- package/dist/esm/index.d.ts +10 -0
- package/dist/esm/index.js +11 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/lib/Checkbox.d.ts +13 -0
- package/dist/lib/Checkbox.js +62 -0
- package/dist/lib/Checkbox.js.map +1 -0
- package/dist/lib/DatePicker.d.ts +11 -0
- package/dist/lib/DatePicker.js +56 -0
- package/dist/lib/DatePicker.js.map +1 -0
- package/dist/lib/FocusOnError.d.ts +21 -0
- package/dist/lib/FocusOnError.js +79 -0
- package/dist/lib/FocusOnError.js.map +1 -0
- package/dist/lib/FormField.d.ts +17 -0
- package/dist/lib/FormField.js +47 -0
- package/dist/lib/FormField.js.map +1 -0
- package/dist/lib/Input.d.ts +11 -0
- package/dist/lib/Input.js +53 -0
- package/dist/lib/Input.js.map +1 -0
- package/dist/lib/Radio.d.ts +11 -0
- package/dist/lib/Radio.js +54 -0
- package/dist/lib/Radio.js.map +1 -0
- package/dist/lib/RadioGroup.d.ts +11 -0
- package/dist/lib/RadioGroup.js +52 -0
- package/dist/lib/RadioGroup.js.map +1 -0
- package/dist/lib/Select.d.ts +13 -0
- package/dist/lib/Select.js +73 -0
- package/dist/lib/Select.js.map +1 -0
- package/dist/lib/SelectAutocomplete.d.ts +11 -0
- package/dist/lib/SelectAutocomplete.js +62 -0
- package/dist/lib/SelectAutocomplete.js.map +1 -0
- package/dist/lib/Textarea.d.ts +11 -0
- package/dist/lib/Textarea.js +53 -0
- package/dist/lib/Textarea.js.map +1 -0
- package/dist/lib/index.d.ts +10 -0
- package/dist/lib/index.js +37 -0
- package/dist/lib/index.js.map +1 -0
- package/package.json +4 -4
@@ -0,0 +1,13 @@
|
|
1
|
+
import { FieldProps } from 'formik';
|
2
|
+
import { ICheckboxProps } from '@shipengine/giger';
|
3
|
+
|
4
|
+
interface CheckboxProps extends FieldProps, Omit<ICheckboxProps, 'name' | 'form' | 'touched' | 'checked' | 'defaultChecked' | 'type'> {
|
5
|
+
type?: string;
|
6
|
+
}
|
7
|
+
declare function fieldToCheckbox({ disabled, field: { onBlur: fieldOnBlur, value, onChange: onFormikChange, ...field }, form: { isSubmitting, errors, touched }, onBlur, onChange, ...props }: CheckboxProps): ICheckboxProps;
|
8
|
+
declare function Checkbox(props: CheckboxProps): JSX.Element;
|
9
|
+
declare namespace Checkbox {
|
10
|
+
var displayName: string;
|
11
|
+
}
|
12
|
+
|
13
|
+
export { Checkbox, CheckboxProps, fieldToCheckbox };
|
@@ -0,0 +1,57 @@
|
|
1
|
+
import { getIn } from 'formik';
|
2
|
+
import { Checkbox as Checkbox$1 } from '@shipengine/giger';
|
3
|
+
import { jsx } from '@emotion/react/jsx-runtime';
|
4
|
+
|
5
|
+
function fieldToCheckbox(_ref) {
|
6
|
+
let {
|
7
|
+
disabled,
|
8
|
+
field: {
|
9
|
+
onBlur: fieldOnBlur,
|
10
|
+
value,
|
11
|
+
onChange: onFormikChange,
|
12
|
+
...field
|
13
|
+
},
|
14
|
+
form: {
|
15
|
+
isSubmitting,
|
16
|
+
errors,
|
17
|
+
touched
|
18
|
+
},
|
19
|
+
onBlur,
|
20
|
+
onChange,
|
21
|
+
...props
|
22
|
+
} = _ref;
|
23
|
+
/**
|
24
|
+
* Checkbox can be used as a single item and as a part of multiple choices
|
25
|
+
* (sharing the "name" attribute) In that case the field value will be an array
|
26
|
+
* as multiple inputs have the same name.
|
27
|
+
* For all other scenarios "value" will be the input value (string, boolean, number ...)
|
28
|
+
*/
|
29
|
+
const checkboxIsPartOfMultiple = Array.isArray(value);
|
30
|
+
const indeterminate = !checkboxIsPartOfMultiple && value == null;
|
31
|
+
const handleChange = e => {
|
32
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(e);
|
33
|
+
onFormikChange(e);
|
34
|
+
};
|
35
|
+
return {
|
36
|
+
isInvalid: getIn(touched, field.name) && !!getIn(errors, field.name),
|
37
|
+
disabled: disabled || isSubmitting,
|
38
|
+
checked: checkboxIsPartOfMultiple ? value.includes(props.value) : Boolean(value),
|
39
|
+
value,
|
40
|
+
indeterminate,
|
41
|
+
onBlur: onBlur !== null && onBlur !== void 0 ? onBlur : function (e) {
|
42
|
+
fieldOnBlur(e !== null && e !== void 0 ? e : field.name);
|
43
|
+
},
|
44
|
+
onChange: handleChange,
|
45
|
+
...field,
|
46
|
+
...props
|
47
|
+
};
|
48
|
+
}
|
49
|
+
function Checkbox(props) {
|
50
|
+
return jsx(Checkbox$1, {
|
51
|
+
...fieldToCheckbox(props)
|
52
|
+
});
|
53
|
+
}
|
54
|
+
Checkbox.displayName = 'FormikCheckbox';
|
55
|
+
|
56
|
+
export { Checkbox, fieldToCheckbox };
|
57
|
+
//# sourceMappingURL=Checkbox.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Checkbox.js","sources":["../../src/Checkbox.tsx"],"sourcesContent":["import { FieldProps, getIn } from 'formik';\nimport { ChangeEvent, FocusEvent } from 'react';\n\nimport { Checkbox as GigerCheckbox, ICheckboxProps as GigerCheckboxProps } from '@shipengine/giger';\n\nexport interface CheckboxProps\n extends FieldProps,\n Omit<\n GigerCheckboxProps,\n | 'name'\n | 'form'\n | 'touched'\n | 'checked'\n | 'defaultChecked'\n // Excluded for conflict with Field type\n | 'type'\n > {\n type?: string;\n}\n\nexport function fieldToCheckbox({\n disabled,\n field: { onBlur: fieldOnBlur, value, onChange: onFormikChange, ...field },\n form: { isSubmitting, errors, touched },\n onBlur,\n onChange,\n ...props\n}: CheckboxProps): GigerCheckboxProps {\n /**\n * Checkbox can be used as a single item and as a part of multiple choices\n * (sharing the \"name\" attribute) In that case the field value will be an array\n * as multiple inputs have the same name.\n * For all other scenarios \"value\" will be the input value (string, boolean, number ...)\n */\n const checkboxIsPartOfMultiple = Array.isArray(value);\n\n const indeterminate = !checkboxIsPartOfMultiple && value == null;\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n onChange?.(e);\n onFormikChange(e);\n };\n\n return {\n isInvalid: getIn(touched, field.name) && !!getIn(errors, field.name),\n disabled: disabled || isSubmitting,\n checked: checkboxIsPartOfMultiple ? value.includes(props.value) : Boolean(value),\n value,\n indeterminate,\n onBlur:\n onBlur ??\n function (e: FocusEvent) {\n fieldOnBlur(e ?? field.name);\n },\n onChange: handleChange,\n ...field,\n ...props,\n };\n}\n\nexport function Checkbox(props: CheckboxProps): JSX.Element {\n return <GigerCheckbox {...fieldToCheckbox(props)} />;\n}\n\nCheckbox.displayName = 'FormikCheckbox';\n"],"names":["fieldToCheckbox","_ref","disabled","field","onBlur","fieldOnBlur","value","onChange","onFormikChange","form","isSubmitting","errors","touched","props","checkboxIsPartOfMultiple","Array","isArray","indeterminate","handleChange","e","isInvalid","getIn","name","checked","includes","Boolean","Checkbox","_jsx","GigerCheckbox","displayName"],"mappings":";;;;AAoBO,SAASA,eAAeA,CAAAC,IAAA,EAOO;EAAA,IAPN;IAC5BC,QAAQ;AACRC,IAAAA,KAAK,EAAE;AAAEC,MAAAA,MAAM,EAAEC,WAAW;MAAEC,KAAK;AAAEC,MAAAA,QAAQ,EAAEC,cAAc;MAAE,GAAGL,KAAAA;KAAO;AACzEM,IAAAA,IAAI,EAAE;MAAEC,YAAY;MAAEC,MAAM;AAAEC,MAAAA,OAAAA;KAAS;IACvCR,MAAM;IACNG,QAAQ;IACR,GAAGM,KAAAA;AACQ,GAAC,GAAAZ,IAAA,CAAA;AACZ;AACJ;AACA;AACA;AACA;AACA;AACI,EAAA,MAAMa,wBAAwB,GAAGC,KAAK,CAACC,OAAO,CAACV,KAAK,CAAC,CAAA;AAErD,EAAA,MAAMW,aAAa,GAAG,CAACH,wBAAwB,IAAIR,KAAK,IAAI,IAAI,CAAA;EAEhE,MAAMY,YAAY,GAAIC,CAAgC,IAAK;AACvDZ,IAAAA,QAAQ,aAARA,QAAQ,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAARA,QAAQ,CAAGY,CAAC,CAAC,CAAA;IACbX,cAAc,CAACW,CAAC,CAAC,CAAA;GACpB,CAAA;EAED,OAAO;AACHC,IAAAA,SAAS,EAAEC,KAAK,CAACT,OAAO,EAAET,KAAK,CAACmB,IAAI,CAAC,IAAI,CAAC,CAACD,KAAK,CAACV,MAAM,EAAER,KAAK,CAACmB,IAAI,CAAC;IACpEpB,QAAQ,EAAEA,QAAQ,IAAIQ,YAAY;AAClCa,IAAAA,OAAO,EAAET,wBAAwB,GAAGR,KAAK,CAACkB,QAAQ,CAACX,KAAK,CAACP,KAAK,CAAC,GAAGmB,OAAO,CAACnB,KAAK,CAAC;IAChFA,KAAK;IACLW,aAAa;IACbb,MAAM,EACFA,MAAM,KAANA,IAAAA,IAAAA,MAAM,cAANA,MAAM,GACN,UAAUe,CAAa,EAAE;MACrBd,WAAW,CAACc,CAAC,KAAA,IAAA,IAADA,CAAC,KAAA,KAAA,CAAA,GAADA,CAAC,GAAIhB,KAAK,CAACmB,IAAI,CAAC,CAAA;KAC/B;AACLf,IAAAA,QAAQ,EAAEW,YAAY;AACtB,IAAA,GAAGf,KAAK;IACR,GAAGU,KAAAA;GACN,CAAA;AACL,CAAA;AAEO,SAASa,QAAQA,CAACb,KAAoB,EAAe;EACxD,OAAOc,GAAA,CAACC,UAAa,EAAA;IAAA,GAAK5B,eAAe,CAACa,KAAK,CAAA;AAAC,GAAG,CAAC,CAAA;AACxD,CAAA;AAEAa,QAAQ,CAACG,WAAW,GAAG,gBAAgB;;;;"}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import { FieldProps } from 'formik';
|
2
|
+
import { IDatePickerProps as IDatePickerProps$1, WithCommonProps } from '@shipengine/giger';
|
3
|
+
|
4
|
+
type IDatePickerProps<FormValues = unknown> = FieldProps<Date | null, FormValues> & Omit<IDatePickerProps$1, 'name'> & WithCommonProps<unknown>;
|
5
|
+
declare function fieldToDateField<FormValues = unknown>({ disabled, field: { name, onChange: onFormikChange, ...field }, form: { isSubmitting, errors, touched, setFieldTouched }, onClickConfirm, ...props }: IDatePickerProps<FormValues>): IDatePickerProps$1;
|
6
|
+
declare function DatePicker<FormValues = unknown>({ ...props }: IDatePickerProps<FormValues>): JSX.Element;
|
7
|
+
declare namespace DatePicker {
|
8
|
+
var displayName: string;
|
9
|
+
}
|
10
|
+
|
11
|
+
export { DatePicker, IDatePickerProps, fieldToDateField };
|
@@ -0,0 +1,51 @@
|
|
1
|
+
import { getIn } from 'formik';
|
2
|
+
import { DatePicker as DatePicker$1 } from '@shipengine/giger';
|
3
|
+
import { jsx } from '@emotion/react/jsx-runtime';
|
4
|
+
|
5
|
+
function fieldToDateField(_ref) {
|
6
|
+
let {
|
7
|
+
disabled,
|
8
|
+
field: {
|
9
|
+
name,
|
10
|
+
onChange: onFormikChange,
|
11
|
+
...field
|
12
|
+
},
|
13
|
+
form: {
|
14
|
+
isSubmitting,
|
15
|
+
errors,
|
16
|
+
touched,
|
17
|
+
setFieldTouched
|
18
|
+
},
|
19
|
+
onClickConfirm,
|
20
|
+
...props
|
21
|
+
} = _ref;
|
22
|
+
const handleClickConfirm = date => {
|
23
|
+
setFieldTouched(name);
|
24
|
+
onFormikChange({
|
25
|
+
target: {
|
26
|
+
name,
|
27
|
+
value: date
|
28
|
+
}
|
29
|
+
});
|
30
|
+
onClickConfirm === null || onClickConfirm === void 0 ? void 0 : onClickConfirm(date);
|
31
|
+
};
|
32
|
+
return {
|
33
|
+
disabled: disabled || isSubmitting,
|
34
|
+
isInvalid: getIn(touched, name) && getIn(errors, name),
|
35
|
+
onClickConfirm: handleClickConfirm,
|
36
|
+
...field,
|
37
|
+
...props
|
38
|
+
};
|
39
|
+
}
|
40
|
+
function DatePicker(_ref2) {
|
41
|
+
let {
|
42
|
+
...props
|
43
|
+
} = _ref2;
|
44
|
+
return jsx(DatePicker$1, {
|
45
|
+
...fieldToDateField(props)
|
46
|
+
});
|
47
|
+
}
|
48
|
+
DatePicker.displayName = 'FormikDatePicker';
|
49
|
+
|
50
|
+
export { DatePicker, fieldToDateField };
|
51
|
+
//# sourceMappingURL=DatePicker.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"DatePicker.js","sources":["../../src/DatePicker.tsx"],"sourcesContent":["import { FieldProps, getIn } from 'formik';\n\nimport {\n WithCommonProps,\n DatePicker as GigerDatePicker,\n IDatePickerProps as GigerDatePickerProps,\n} from '@shipengine/giger';\n\nexport type IDatePickerProps<FormValues = unknown> = FieldProps<Date | null, FormValues> &\n Omit<GigerDatePickerProps, 'name'> &\n WithCommonProps<unknown>;\n\nexport function fieldToDateField<FormValues = unknown>({\n disabled,\n field: { name, onChange: onFormikChange, ...field },\n form: { isSubmitting, errors, touched, setFieldTouched },\n onClickConfirm,\n ...props\n}: IDatePickerProps<FormValues>): GigerDatePickerProps {\n const handleClickConfirm = (date: Date | [Date, Date]) => {\n setFieldTouched(name);\n onFormikChange({ target: { name, value: date } });\n onClickConfirm?.(date);\n };\n\n return {\n disabled: disabled || isSubmitting,\n isInvalid: getIn(touched, name) && getIn(errors, name),\n onClickConfirm: handleClickConfirm,\n ...field,\n ...props,\n };\n}\n\nexport function DatePicker<FormValues = unknown>({ ...props }: IDatePickerProps<FormValues>): JSX.Element {\n return <GigerDatePicker {...fieldToDateField(props)} />;\n}\n\nDatePicker.displayName = 'FormikDatePicker';\n"],"names":["fieldToDateField","_ref","disabled","field","name","onChange","onFormikChange","form","isSubmitting","errors","touched","setFieldTouched","onClickConfirm","props","handleClickConfirm","date","target","value","isInvalid","getIn","DatePicker","_ref2","_jsx","GigerDatePicker","displayName"],"mappings":";;;;AAYO,SAASA,gBAAgBA,CAAAC,IAAA,EAMuB;EAAA,IANA;IACnDC,QAAQ;AACRC,IAAAA,KAAK,EAAE;MAAEC,IAAI;AAAEC,MAAAA,QAAQ,EAAEC,cAAc;MAAE,GAAGH,KAAAA;KAAO;AACnDI,IAAAA,IAAI,EAAE;MAAEC,YAAY;MAAEC,MAAM;MAAEC,OAAO;AAAEC,MAAAA,eAAAA;KAAiB;IACxDC,cAAc;IACd,GAAGC,KAAAA;AACuB,GAAC,GAAAZ,IAAA,CAAA;EAC3B,MAAMa,kBAAkB,GAAIC,IAAyB,IAAK;IACtDJ,eAAe,CAACP,IAAI,CAAC,CAAA;AACrBE,IAAAA,cAAc,CAAC;AAAEU,MAAAA,MAAM,EAAE;QAAEZ,IAAI;AAAEa,QAAAA,KAAK,EAAEF,IAAAA;AAAK,OAAA;AAAE,KAAC,CAAC,CAAA;AACjDH,IAAAA,cAAc,aAAdA,cAAc,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAdA,cAAc,CAAGG,IAAI,CAAC,CAAA;GACzB,CAAA;EAED,OAAO;IACHb,QAAQ,EAAEA,QAAQ,IAAIM,YAAY;AAClCU,IAAAA,SAAS,EAAEC,KAAK,CAACT,OAAO,EAAEN,IAAI,CAAC,IAAIe,KAAK,CAACV,MAAM,EAAEL,IAAI,CAAC;AACtDQ,IAAAA,cAAc,EAAEE,kBAAkB;AAClC,IAAA,GAAGX,KAAK;IACR,GAAGU,KAAAA;GACN,CAAA;AACL,CAAA;AAEO,SAASO,UAAUA,CAAAC,KAAA,EAAgF;EAAA,IAAzD;IAAE,GAAGR,KAAAA;AAAoC,GAAC,GAAAQ,KAAA,CAAA;EACvF,OAAOC,GAAA,CAACC,YAAe,EAAA;IAAA,GAAKvB,gBAAgB,CAACa,KAAK,CAAA;AAAC,GAAG,CAAC,CAAA;AAC3D,CAAA;AAEAO,UAAU,CAACI,WAAW,GAAG,kBAAkB;;;;"}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
interface IFocusOnErrorProps {
|
2
|
+
initialValidation?: boolean;
|
3
|
+
focusDelay?: number;
|
4
|
+
}
|
5
|
+
/**
|
6
|
+
* Use FocusOnError when Formik is in the same component and you don't have
|
7
|
+
* access to useFormikContext, otherwise useFocusOnError can be used.
|
8
|
+
*/
|
9
|
+
declare function FocusOnError({ initialValidation, focusDelay }: IFocusOnErrorProps): JSX.Element;
|
10
|
+
/**
|
11
|
+
* Focus the first element with error in the form after triggering Formik onSubmit.
|
12
|
+
* If used with initialValidation `true`, it will focus after form initialization.
|
13
|
+
* * Important * The order is based on the errors object, and the errors key order is based on
|
14
|
+
* the order used in the validation schema.
|
15
|
+
*
|
16
|
+
* @param initialValidation boolean true if the focus is desired on form initialization
|
17
|
+
* @param focusDelay number milliseconds to delay the focus on the input
|
18
|
+
*/
|
19
|
+
declare function useFocusOnError(initialValidation?: boolean, focusDelay?: number): void;
|
20
|
+
|
21
|
+
export { FocusOnError, IFocusOnErrorProps, useFocusOnError };
|
@@ -0,0 +1,70 @@
|
|
1
|
+
import flatten from 'flat';
|
2
|
+
import { Fragment, useRef, useEffect } from 'react';
|
3
|
+
import { useFormikContext } from 'formik';
|
4
|
+
import { jsx } from '@emotion/react/jsx-runtime';
|
5
|
+
|
6
|
+
/**
|
7
|
+
* Use FocusOnError when Formik is in the same component and you don't have
|
8
|
+
* access to useFormikContext, otherwise useFocusOnError can be used.
|
9
|
+
*/
|
10
|
+
function FocusOnError(_ref) {
|
11
|
+
let {
|
12
|
+
initialValidation = false,
|
13
|
+
focusDelay = 0
|
14
|
+
} = _ref;
|
15
|
+
useFocusOnError(initialValidation, focusDelay);
|
16
|
+
return jsx(Fragment, {});
|
17
|
+
}
|
18
|
+
|
19
|
+
/**
|
20
|
+
* Focus the first element with error in the form after triggering Formik onSubmit.
|
21
|
+
* If used with initialValidation `true`, it will focus after form initialization.
|
22
|
+
* * Important * The order is based on the errors object, and the errors key order is based on
|
23
|
+
* the order used in the validation schema.
|
24
|
+
*
|
25
|
+
* @param initialValidation boolean true if the focus is desired on form initialization
|
26
|
+
* @param focusDelay number milliseconds to delay the focus on the input
|
27
|
+
*/
|
28
|
+
function useFocusOnError() {
|
29
|
+
let initialValidation = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
30
|
+
let focusDelay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
31
|
+
const {
|
32
|
+
errors,
|
33
|
+
isSubmitting,
|
34
|
+
isValidating,
|
35
|
+
validateForm
|
36
|
+
} = useFormikContext();
|
37
|
+
const validateOnInit = useRef(initialValidation);
|
38
|
+
useEffect(() => {
|
39
|
+
if (validateOnInit.current) {
|
40
|
+
runImperativeValidation();
|
41
|
+
validateOnInit.current = false;
|
42
|
+
return;
|
43
|
+
}
|
44
|
+
if (isSubmitting && !isValidating) {
|
45
|
+
focusFirstElementWithError(errors);
|
46
|
+
}
|
47
|
+
function focusFirstElementWithError(errorsObject) {
|
48
|
+
if (!Object.keys(errorsObject).length) return;
|
49
|
+
const flattenedErrorsObj = flatten(errorsObject);
|
50
|
+
const names = Object.keys(flattenedErrorsObj);
|
51
|
+
const firstErrorElementName = names === null || names === void 0 ? void 0 : names[0];
|
52
|
+
if (firstErrorElementName) {
|
53
|
+
const element = window.document.querySelector(`form [name="${firstErrorElementName}"]`);
|
54
|
+
element === null || element === void 0 ? void 0 : element.scrollIntoView({
|
55
|
+
behavior: 'smooth'
|
56
|
+
});
|
57
|
+
setTimeout(() => {
|
58
|
+
element === null || element === void 0 ? void 0 : element.focus();
|
59
|
+
}, focusDelay);
|
60
|
+
}
|
61
|
+
}
|
62
|
+
async function runImperativeValidation() {
|
63
|
+
const validationErrors = await validateForm();
|
64
|
+
focusFirstElementWithError(validationErrors);
|
65
|
+
}
|
66
|
+
}, [errors, focusDelay, isSubmitting, isValidating, validateForm]);
|
67
|
+
}
|
68
|
+
|
69
|
+
export { FocusOnError, useFocusOnError };
|
70
|
+
//# sourceMappingURL=FocusOnError.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"FocusOnError.js","sources":["../../src/FocusOnError.tsx"],"sourcesContent":["import flatten from 'flat';\nimport { Fragment, useEffect, useRef } from 'react';\nimport { FormikErrors, useFormikContext } from 'formik';\n\nexport interface IFocusOnErrorProps {\n initialValidation?: boolean;\n focusDelay?: number;\n}\n\n/**\n * Use FocusOnError when Formik is in the same component and you don't have\n * access to useFormikContext, otherwise useFocusOnError can be used.\n */\nexport function FocusOnError({ initialValidation = false, focusDelay = 0 }: IFocusOnErrorProps): JSX.Element {\n useFocusOnError(initialValidation, focusDelay);\n\n return <Fragment />;\n}\n\n/**\n * Focus the first element with error in the form after triggering Formik onSubmit.\n * If used with initialValidation `true`, it will focus after form initialization.\n * * Important * The order is based on the errors object, and the errors key order is based on\n * the order used in the validation schema.\n *\n * @param initialValidation boolean true if the focus is desired on form initialization\n * @param focusDelay number milliseconds to delay the focus on the input\n */\nexport function useFocusOnError(initialValidation = false, focusDelay = 0): void {\n const { errors, isSubmitting, isValidating, validateForm } = useFormikContext();\n const validateOnInit = useRef(initialValidation);\n\n useEffect(() => {\n if (validateOnInit.current) {\n runImperativeValidation();\n validateOnInit.current = false;\n return;\n }\n\n if (isSubmitting && !isValidating) {\n focusFirstElementWithError(errors);\n }\n\n function focusFirstElementWithError(errorsObject: FormikErrors<unknown>) {\n if (!Object.keys(errorsObject).length) return;\n\n const flattenedErrorsObj: Record<string, unknown> = flatten(errorsObject);\n const names = Object.keys(flattenedErrorsObj);\n const firstErrorElementName = names?.[0];\n\n if (firstErrorElementName) {\n const element = window.document.querySelector<HTMLElement>(`form [name=\"${firstErrorElementName}\"]`);\n element?.scrollIntoView({ behavior: 'smooth' });\n\n setTimeout(() => {\n element?.focus();\n }, focusDelay);\n }\n }\n\n async function runImperativeValidation() {\n const validationErrors = await validateForm();\n focusFirstElementWithError(validationErrors);\n }\n }, [errors, focusDelay, isSubmitting, isValidating, validateForm]);\n}\n"],"names":["FocusOnError","_ref","initialValidation","focusDelay","useFocusOnError","_jsx","Fragment","arguments","length","undefined","errors","isSubmitting","isValidating","validateForm","useFormikContext","validateOnInit","useRef","useEffect","current","runImperativeValidation","focusFirstElementWithError","errorsObject","Object","keys","flattenedErrorsObj","flatten","names","firstErrorElementName","element","window","document","querySelector","scrollIntoView","behavior","setTimeout","focus","validationErrors"],"mappings":";;;;;AASA;AACA;AACA;AACA;AACO,SAASA,YAAYA,CAAAC,IAAA,EAAiF;EAAA,IAAhF;AAAEC,IAAAA,iBAAiB,GAAG,KAAK;AAAEC,IAAAA,UAAU,GAAG,CAAA;AAAsB,GAAC,GAAAF,IAAA,CAAA;AAC1FG,EAAAA,eAAe,CAACF,iBAAiB,EAAEC,UAAU,CAAC,CAAA;AAE9C,EAAA,OAAOE,GAAA,CAACC,QAAQ,EAAA,EAAE,CAAC,CAAA;AACvB,CAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASF,eAAeA,GAAkD;AAAA,EAAA,IAAjDF,iBAAiB,GAAAK,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAA,CAAA,CAAA,GAAG,KAAK,CAAA;AAAA,EAAA,IAAEJ,UAAU,GAAAI,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAA,CAAA,CAAA,GAAG,CAAC,CAAA;EACrE,MAAM;IAAEG,MAAM;IAAEC,YAAY;IAAEC,YAAY;AAAEC,IAAAA,YAAAA;GAAc,GAAGC,gBAAgB,EAAE,CAAA;AAC/E,EAAA,MAAMC,cAAc,GAAGC,MAAM,CAACd,iBAAiB,CAAC,CAAA;AAEhDe,EAAAA,SAAS,CAAC,MAAM;IACZ,IAAIF,cAAc,CAACG,OAAO,EAAE;AACxBC,MAAAA,uBAAuB,EAAE,CAAA;MACzBJ,cAAc,CAACG,OAAO,GAAG,KAAK,CAAA;AAC9B,MAAA,OAAA;AACJ,KAAA;AAEA,IAAA,IAAIP,YAAY,IAAI,CAACC,YAAY,EAAE;MAC/BQ,0BAA0B,CAACV,MAAM,CAAC,CAAA;AACtC,KAAA;IAEA,SAASU,0BAA0BA,CAACC,YAAmC,EAAE;MACrE,IAAI,CAACC,MAAM,CAACC,IAAI,CAACF,YAAY,CAAC,CAACb,MAAM,EAAE,OAAA;AAEvC,MAAA,MAAMgB,kBAA2C,GAAGC,OAAO,CAACJ,YAAY,CAAC,CAAA;AACzE,MAAA,MAAMK,KAAK,GAAGJ,MAAM,CAACC,IAAI,CAACC,kBAAkB,CAAC,CAAA;MAC7C,MAAMG,qBAAqB,GAAGD,KAAK,KAAA,IAAA,IAALA,KAAK,KAALA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,KAAK,CAAG,CAAC,CAAC,CAAA;AAExC,MAAA,IAAIC,qBAAqB,EAAE;QACvB,MAAMC,OAAO,GAAGC,MAAM,CAACC,QAAQ,CAACC,aAAa,CAAe,CAAA,YAAA,EAAcJ,qBAAsB,CAAA,EAAA,CAAG,CAAC,CAAA;AACpGC,QAAAA,OAAO,aAAPA,OAAO,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAPA,OAAO,CAAEI,cAAc,CAAC;AAAEC,UAAAA,QAAQ,EAAE,QAAA;AAAS,SAAC,CAAC,CAAA;AAE/CC,QAAAA,UAAU,CAAC,MAAM;AACbN,UAAAA,OAAO,aAAPA,OAAO,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAPA,OAAO,CAAEO,KAAK,EAAE,CAAA;SACnB,EAAEhC,UAAU,CAAC,CAAA;AAClB,OAAA;AACJ,KAAA;IAEA,eAAegB,uBAAuBA,GAAG;AACrC,MAAA,MAAMiB,gBAAgB,GAAG,MAAMvB,YAAY,EAAE,CAAA;MAC7CO,0BAA0B,CAACgB,gBAAgB,CAAC,CAAA;AAChD,KAAA;AACJ,GAAC,EAAE,CAAC1B,MAAM,EAAEP,UAAU,EAAEQ,YAAY,EAAEC,YAAY,EAAEC,YAAY,CAAC,CAAC,CAAA;AACtE;;;;"}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { ReactNode } from 'react';
|
2
|
+
import { WithChildrenCommonProps, FieldMessageType } from '@shipengine/giger';
|
3
|
+
|
4
|
+
interface IFormFieldMessage {
|
5
|
+
type: FieldMessageType;
|
6
|
+
content: ReactNode;
|
7
|
+
}
|
8
|
+
type FormFieldProps = WithChildrenCommonProps<{
|
9
|
+
name: string;
|
10
|
+
message?: IFormFieldMessage;
|
11
|
+
}>;
|
12
|
+
declare function FormField({ name, children, message, ...rest }: FormFieldProps): JSX.Element;
|
13
|
+
declare namespace FormField {
|
14
|
+
var displayName: string;
|
15
|
+
}
|
16
|
+
|
17
|
+
export { FormField };
|
@@ -0,0 +1,43 @@
|
|
1
|
+
import { useField } from 'formik';
|
2
|
+
import { cloneElement, useMemo } from 'react';
|
3
|
+
import { FormField as FormField$1, FieldMessageType } from '@shipengine/giger';
|
4
|
+
import { jsx } from '@emotion/react/jsx-runtime';
|
5
|
+
|
6
|
+
const useFieldMessage = (fieldName, defaultMessage) => {
|
7
|
+
const [, meta] = useField(fieldName);
|
8
|
+
const formFieldMessage = useMemo(() => {
|
9
|
+
if (meta.error && meta.touched) {
|
10
|
+
return {
|
11
|
+
type: FieldMessageType.ERROR,
|
12
|
+
content: meta.error
|
13
|
+
};
|
14
|
+
} else if ((defaultMessage === null || defaultMessage === void 0 ? void 0 : defaultMessage.type) === FieldMessageType.HINT || (defaultMessage === null || defaultMessage === void 0 ? void 0 : defaultMessage.type) === FieldMessageType.INFO || (defaultMessage === null || defaultMessage === void 0 ? void 0 : defaultMessage.type) === FieldMessageType.SUCCESS) {
|
15
|
+
return {
|
16
|
+
type: defaultMessage.type,
|
17
|
+
content: defaultMessage.content
|
18
|
+
};
|
19
|
+
}
|
20
|
+
return undefined;
|
21
|
+
}, [defaultMessage === null || defaultMessage === void 0 ? void 0 : defaultMessage.content, defaultMessage === null || defaultMessage === void 0 ? void 0 : defaultMessage.type, meta.error, meta.touched]);
|
22
|
+
return formFieldMessage;
|
23
|
+
};
|
24
|
+
function FormField(_ref) {
|
25
|
+
let {
|
26
|
+
name,
|
27
|
+
children,
|
28
|
+
message,
|
29
|
+
...rest
|
30
|
+
} = _ref;
|
31
|
+
const formFieldMessage = useFieldMessage(name, message);
|
32
|
+
return jsx(FormField$1, {
|
33
|
+
message: formFieldMessage,
|
34
|
+
...rest,
|
35
|
+
children: /*#__PURE__*/cloneElement(children, {
|
36
|
+
name
|
37
|
+
})
|
38
|
+
});
|
39
|
+
}
|
40
|
+
FormField.displayName = 'FormikFormField';
|
41
|
+
|
42
|
+
export { FormField };
|
43
|
+
//# sourceMappingURL=FormField.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"FormField.js","sources":["../../src/FormField.tsx"],"sourcesContent":["import { useField } from 'formik';\nimport { useMemo, cloneElement, ReactNode, ReactElement } from 'react';\n\nimport { FieldMessageType, FormField as GigerFormField, WithChildrenCommonProps } from '@shipengine/giger';\n\ninterface IFormFieldMessage {\n type: FieldMessageType;\n content: ReactNode;\n}\n\ntype UseFieldMessageReturn =\n | {\n type: FieldMessageType;\n content: string;\n }\n | undefined;\n\nconst useFieldMessage = (fieldName: string, defaultMessage?: IFormFieldMessage): UseFieldMessageReturn => {\n const [, meta] = useField(fieldName);\n\n const formFieldMessage = useMemo(() => {\n if (meta.error && meta.touched) {\n return {\n type: FieldMessageType.ERROR,\n content: meta.error,\n };\n } else if (\n defaultMessage?.type === FieldMessageType.HINT ||\n defaultMessage?.type === FieldMessageType.INFO ||\n defaultMessage?.type === FieldMessageType.SUCCESS\n ) {\n return {\n type: defaultMessage.type,\n content: defaultMessage.content,\n };\n }\n\n return undefined;\n }, [defaultMessage?.content, defaultMessage?.type, meta.error, meta.touched]) as UseFieldMessageReturn;\n\n return formFieldMessage;\n};\n\ntype FormFieldProps = WithChildrenCommonProps<{\n name: string;\n message?: IFormFieldMessage;\n}>;\n\nexport function FormField({ name, children, message, ...rest }: FormFieldProps): JSX.Element {\n const formFieldMessage = useFieldMessage(name, message);\n\n return (\n <GigerFormField message={formFieldMessage} {...rest}>\n {cloneElement(children as ReactElement, { name })}\n </GigerFormField>\n );\n}\n\nFormField.displayName = 'FormikFormField';\n"],"names":["useFieldMessage","fieldName","defaultMessage","meta","useField","formFieldMessage","useMemo","error","touched","type","FieldMessageType","ERROR","content","HINT","INFO","SUCCESS","undefined","FormField","_ref","name","children","message","rest","_jsx","GigerFormField","cloneElement","displayName"],"mappings":";;;;;AAiBA,MAAMA,eAAe,GAAGA,CAACC,SAAiB,EAAEC,cAAkC,KAA4B;AACtG,EAAA,MAAM,GAAGC,IAAI,CAAC,GAAGC,QAAQ,CAACH,SAAS,CAAC,CAAA;AAEpC,EAAA,MAAMI,gBAAgB,GAAGC,OAAO,CAAC,MAAM;AACnC,IAAA,IAAIH,IAAI,CAACI,KAAK,IAAIJ,IAAI,CAACK,OAAO,EAAE;MAC5B,OAAO;QACHC,IAAI,EAAEC,gBAAgB,CAACC,KAAK;QAC5BC,OAAO,EAAET,IAAI,CAACI,KAAAA;OACjB,CAAA;AACL,KAAC,MAAM,IACH,CAAAL,cAAc,KAAdA,IAAAA,IAAAA,cAAc,uBAAdA,cAAc,CAAEO,IAAI,MAAKC,gBAAgB,CAACG,IAAI,IAC9C,CAAAX,cAAc,aAAdA,cAAc,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAdA,cAAc,CAAEO,IAAI,MAAKC,gBAAgB,CAACI,IAAI,IAC9C,CAAAZ,cAAc,KAAA,IAAA,IAAdA,cAAc,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAdA,cAAc,CAAEO,IAAI,MAAKC,gBAAgB,CAACK,OAAO,EACnD;MACE,OAAO;QACHN,IAAI,EAAEP,cAAc,CAACO,IAAI;QACzBG,OAAO,EAAEV,cAAc,CAACU,OAAAA;OAC3B,CAAA;AACL,KAAA;AAEA,IAAA,OAAOI,SAAS,CAAA;GACnB,EAAE,CAACd,cAAc,KAAdA,IAAAA,IAAAA,cAAc,KAAdA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,cAAc,CAAEU,OAAO,EAAEV,cAAc,KAAdA,IAAAA,IAAAA,cAAc,uBAAdA,cAAc,CAAEO,IAAI,EAAEN,IAAI,CAACI,KAAK,EAAEJ,IAAI,CAACK,OAAO,CAAC,CAA0B,CAAA;AAEtG,EAAA,OAAOH,gBAAgB,CAAA;AAC3B,CAAC,CAAA;AAOM,SAASY,SAASA,CAAAC,IAAA,EAAoE;EAAA,IAAnE;IAAEC,IAAI;IAAEC,QAAQ;IAAEC,OAAO;IAAE,GAAGC,IAAAA;AAAqB,GAAC,GAAAJ,IAAA,CAAA;AAC1E,EAAA,MAAMb,gBAAgB,GAAGL,eAAe,CAACmB,IAAI,EAAEE,OAAO,CAAC,CAAA;EAEvD,OACIE,GAAA,CAACC,WAAc,EAAA;AAACH,IAAAA,OAAO,EAAEhB,gBAAiB;AAAA,IAAA,GAAKiB,IAAI;AAAAF,IAAAA,QAAA,eAC9CK,YAAY,CAACL,QAAQ,EAAkB;AAAED,MAAAA,IAAAA;KAAM,CAAA;AAAC,GACrC,CAAC,CAAA;AAEzB,CAAA;AAEAF,SAAS,CAACS,WAAW,GAAG,iBAAiB;;;;"}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import { FieldProps } from 'formik';
|
2
|
+
import { IInputProps } from '@shipengine/giger';
|
3
|
+
|
4
|
+
type InputProps<FormValues = unknown> = FieldProps<string | number | undefined, FormValues> & Omit<IInputProps, 'name' | 'value'>;
|
5
|
+
declare function fieldToInput<FormValues = unknown>({ disabled, field: { onBlur: fieldOnBlur, onChange: onFormikChange, ...field }, form: { isSubmitting, touched, errors }, onBlur, onChange, ...props }: InputProps<FormValues>): IInputProps;
|
6
|
+
declare function Input<FormValues = unknown>({ ...props }: InputProps<FormValues>): JSX.Element;
|
7
|
+
declare namespace Input {
|
8
|
+
var displayName: string;
|
9
|
+
}
|
10
|
+
|
11
|
+
export { Input, InputProps, fieldToInput };
|
@@ -0,0 +1,48 @@
|
|
1
|
+
import { getIn } from 'formik';
|
2
|
+
import { Input as Input$1 } from '@shipengine/giger';
|
3
|
+
import { jsx } from '@emotion/react/jsx-runtime';
|
4
|
+
|
5
|
+
function fieldToInput(_ref) {
|
6
|
+
let {
|
7
|
+
disabled,
|
8
|
+
field: {
|
9
|
+
onBlur: fieldOnBlur,
|
10
|
+
onChange: onFormikChange,
|
11
|
+
...field
|
12
|
+
},
|
13
|
+
form: {
|
14
|
+
isSubmitting,
|
15
|
+
touched,
|
16
|
+
errors
|
17
|
+
},
|
18
|
+
onBlur,
|
19
|
+
onChange,
|
20
|
+
...props
|
21
|
+
} = _ref;
|
22
|
+
const handleChange = e => {
|
23
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(e);
|
24
|
+
onFormikChange(e);
|
25
|
+
};
|
26
|
+
return {
|
27
|
+
isInvalid: getIn(touched, field.name) && !!getIn(errors, field.name),
|
28
|
+
disabled: disabled || isSubmitting,
|
29
|
+
onBlur: onBlur !== null && onBlur !== void 0 ? onBlur : function (e) {
|
30
|
+
fieldOnBlur(e !== null && e !== void 0 ? e : field.name);
|
31
|
+
},
|
32
|
+
onChange: handleChange,
|
33
|
+
...field,
|
34
|
+
...props
|
35
|
+
};
|
36
|
+
}
|
37
|
+
function Input(_ref2) {
|
38
|
+
let {
|
39
|
+
...props
|
40
|
+
} = _ref2;
|
41
|
+
return jsx(Input$1, {
|
42
|
+
...fieldToInput(props)
|
43
|
+
});
|
44
|
+
}
|
45
|
+
Input.displayName = 'FormikInput';
|
46
|
+
|
47
|
+
export { Input, fieldToInput };
|
48
|
+
//# sourceMappingURL=Input.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Input.js","sources":["../../src/Input.tsx"],"sourcesContent":["import { FieldProps, getIn } from 'formik';\nimport { ChangeEvent, FocusEvent } from 'react';\n\nimport { Input as GigerInput, IInputProps as IGigerInputProps } from '@shipengine/giger';\n\nexport type InputProps<FormValues = unknown> = FieldProps<string | number | undefined, FormValues> &\n Omit<IGigerInputProps, 'name' | 'value'>;\n\nexport function fieldToInput<FormValues = unknown>({\n disabled,\n field: { onBlur: fieldOnBlur, onChange: onFormikChange, ...field },\n form: { isSubmitting, touched, errors },\n onBlur,\n onChange,\n ...props\n}: InputProps<FormValues>): IGigerInputProps {\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n onChange?.(e);\n onFormikChange(e);\n };\n\n return {\n isInvalid: getIn(touched, field.name) && !!getIn(errors, field.name),\n disabled: disabled || isSubmitting,\n onBlur:\n onBlur ??\n function (e: FocusEvent) {\n fieldOnBlur(e ?? field.name);\n },\n onChange: handleChange,\n ...field,\n ...props,\n };\n}\n\nexport function Input<FormValues = unknown>({ ...props }: InputProps<FormValues>): JSX.Element {\n return <GigerInput {...fieldToInput(props)} />;\n}\n\nInput.displayName = 'FormikInput';\n"],"names":["fieldToInput","_ref","disabled","field","onBlur","fieldOnBlur","onChange","onFormikChange","form","isSubmitting","touched","errors","props","handleChange","e","isInvalid","getIn","name","Input","_ref2","_jsx","GigerInput","displayName"],"mappings":";;;;AAQO,SAASA,YAAYA,CAAAC,IAAA,EAOiB;EAAA,IAPM;IAC/CC,QAAQ;AACRC,IAAAA,KAAK,EAAE;AAAEC,MAAAA,MAAM,EAAEC,WAAW;AAAEC,MAAAA,QAAQ,EAAEC,cAAc;MAAE,GAAGJ,KAAAA;KAAO;AAClEK,IAAAA,IAAI,EAAE;MAAEC,YAAY;MAAEC,OAAO;AAAEC,MAAAA,MAAAA;KAAQ;IACvCP,MAAM;IACNE,QAAQ;IACR,GAAGM,KAAAA;AACiB,GAAC,GAAAX,IAAA,CAAA;EACrB,MAAMY,YAAY,GAAIC,CAAgC,IAAK;AACvDR,IAAAA,QAAQ,aAARA,QAAQ,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAARA,QAAQ,CAAGQ,CAAC,CAAC,CAAA;IACbP,cAAc,CAACO,CAAC,CAAC,CAAA;GACpB,CAAA;EAED,OAAO;AACHC,IAAAA,SAAS,EAAEC,KAAK,CAACN,OAAO,EAAEP,KAAK,CAACc,IAAI,CAAC,IAAI,CAAC,CAACD,KAAK,CAACL,MAAM,EAAER,KAAK,CAACc,IAAI,CAAC;IACpEf,QAAQ,EAAEA,QAAQ,IAAIO,YAAY;IAClCL,MAAM,EACFA,MAAM,KAANA,IAAAA,IAAAA,MAAM,cAANA,MAAM,GACN,UAAUU,CAAa,EAAE;MACrBT,WAAW,CAACS,CAAC,KAAA,IAAA,IAADA,CAAC,KAAA,KAAA,CAAA,GAADA,CAAC,GAAIX,KAAK,CAACc,IAAI,CAAC,CAAA;KAC/B;AACLX,IAAAA,QAAQ,EAAEO,YAAY;AACtB,IAAA,GAAGV,KAAK;IACR,GAAGS,KAAAA;GACN,CAAA;AACL,CAAA;AAEO,SAASM,KAAKA,CAAAC,KAAA,EAA0E;EAAA,IAAnD;IAAE,GAAGP,KAAAA;AAA8B,GAAC,GAAAO,KAAA,CAAA;EAC5E,OAAOC,GAAA,CAACC,OAAU,EAAA;IAAA,GAAKrB,YAAY,CAACY,KAAK,CAAA;AAAC,GAAG,CAAC,CAAA;AAClD,CAAA;AAEAM,KAAK,CAACI,WAAW,GAAG,aAAa;;;;"}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import { FieldProps } from 'formik';
|
2
|
+
import { RadioProps as RadioProps$1 } from '@shipengine/giger';
|
3
|
+
|
4
|
+
type RadioProps = FieldProps & Omit<RadioProps$1, 'name' | 'checked'>;
|
5
|
+
declare function fieldToRadio({ disabled, field: { onBlur: fieldOnBlur, value: selectedValue, onChange: onFormikChange, ...field }, form: { isSubmitting, errors, touched }, onBlur, onChange, value, ...props }: RadioProps): RadioProps$1;
|
6
|
+
declare function Radio(props: RadioProps): JSX.Element;
|
7
|
+
declare namespace Radio {
|
8
|
+
var displayName: string;
|
9
|
+
}
|
10
|
+
|
11
|
+
export { Radio, RadioProps, fieldToRadio };
|
@@ -0,0 +1,49 @@
|
|
1
|
+
import { getIn } from 'formik';
|
2
|
+
import { Radio as Radio$1 } from '@shipengine/giger';
|
3
|
+
import { jsx } from '@emotion/react/jsx-runtime';
|
4
|
+
|
5
|
+
function fieldToRadio(_ref) {
|
6
|
+
let {
|
7
|
+
disabled,
|
8
|
+
field: {
|
9
|
+
onBlur: fieldOnBlur,
|
10
|
+
value: selectedValue,
|
11
|
+
onChange: onFormikChange,
|
12
|
+
...field
|
13
|
+
},
|
14
|
+
form: {
|
15
|
+
isSubmitting,
|
16
|
+
errors,
|
17
|
+
touched
|
18
|
+
},
|
19
|
+
onBlur,
|
20
|
+
onChange,
|
21
|
+
value,
|
22
|
+
...props
|
23
|
+
} = _ref;
|
24
|
+
const handleChange = e => {
|
25
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(e);
|
26
|
+
onFormikChange(e);
|
27
|
+
};
|
28
|
+
return {
|
29
|
+
isInvalid: getIn(touched, field.name) && !!getIn(errors, field.name),
|
30
|
+
disabled: disabled || isSubmitting,
|
31
|
+
value,
|
32
|
+
onBlur: onBlur !== null && onBlur !== void 0 ? onBlur : function (e) {
|
33
|
+
fieldOnBlur(e !== null && e !== void 0 ? e : field.name);
|
34
|
+
},
|
35
|
+
onChange: handleChange,
|
36
|
+
checked: selectedValue === value,
|
37
|
+
...field,
|
38
|
+
...props
|
39
|
+
};
|
40
|
+
}
|
41
|
+
function Radio(props) {
|
42
|
+
return jsx(Radio$1, {
|
43
|
+
...fieldToRadio(props)
|
44
|
+
});
|
45
|
+
}
|
46
|
+
Radio.displayName = 'FormikRadio';
|
47
|
+
|
48
|
+
export { Radio, fieldToRadio };
|
49
|
+
//# sourceMappingURL=Radio.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Radio.js","sources":["../../src/Radio.tsx"],"sourcesContent":["import { FieldProps, getIn } from 'formik';\nimport { ChangeEvent, FocusEvent } from 'react';\n\nimport { Radio as GigerRadio, RadioProps as GigerRadioProps } from '@shipengine/giger';\n\nexport type RadioProps = FieldProps & Omit<GigerRadioProps, 'name' | 'checked'>;\n\nexport function fieldToRadio({\n disabled,\n field: { onBlur: fieldOnBlur, value: selectedValue, onChange: onFormikChange, ...field },\n form: { isSubmitting, errors, touched },\n onBlur,\n onChange,\n value,\n ...props\n}: RadioProps): GigerRadioProps {\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n onChange?.(e);\n onFormikChange(e);\n };\n\n return {\n isInvalid: getIn(touched, field.name) && !!getIn(errors, field.name),\n disabled: disabled || isSubmitting,\n value,\n onBlur:\n onBlur ??\n function (e: FocusEvent) {\n fieldOnBlur(e ?? field.name);\n },\n onChange: handleChange,\n checked: selectedValue === value,\n ...field,\n ...props,\n };\n}\n\nexport function Radio(props: RadioProps): JSX.Element {\n return <GigerRadio {...fieldToRadio(props)} />;\n}\n\nRadio.displayName = 'FormikRadio';\n"],"names":["fieldToRadio","_ref","disabled","field","onBlur","fieldOnBlur","value","selectedValue","onChange","onFormikChange","form","isSubmitting","errors","touched","props","handleChange","e","isInvalid","getIn","name","checked","Radio","_jsx","GigerRadio","displayName"],"mappings":";;;;AAOO,SAASA,YAAYA,CAAAC,IAAA,EAQI;EAAA,IARH;IACzBC,QAAQ;AACRC,IAAAA,KAAK,EAAE;AAAEC,MAAAA,MAAM,EAAEC,WAAW;AAAEC,MAAAA,KAAK,EAAEC,aAAa;AAAEC,MAAAA,QAAQ,EAAEC,cAAc;MAAE,GAAGN,KAAAA;KAAO;AACxFO,IAAAA,IAAI,EAAE;MAAEC,YAAY;MAAEC,MAAM;AAAEC,MAAAA,OAAAA;KAAS;IACvCT,MAAM;IACNI,QAAQ;IACRF,KAAK;IACL,GAAGQ,KAAAA;AACK,GAAC,GAAAb,IAAA,CAAA;EACT,MAAMc,YAAY,GAAIC,CAAgC,IAAK;AACvDR,IAAAA,QAAQ,aAARA,QAAQ,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAARA,QAAQ,CAAGQ,CAAC,CAAC,CAAA;IACbP,cAAc,CAACO,CAAC,CAAC,CAAA;GACpB,CAAA;EAED,OAAO;AACHC,IAAAA,SAAS,EAAEC,KAAK,CAACL,OAAO,EAAEV,KAAK,CAACgB,IAAI,CAAC,IAAI,CAAC,CAACD,KAAK,CAACN,MAAM,EAAET,KAAK,CAACgB,IAAI,CAAC;IACpEjB,QAAQ,EAAEA,QAAQ,IAAIS,YAAY;IAClCL,KAAK;IACLF,MAAM,EACFA,MAAM,KAANA,IAAAA,IAAAA,MAAM,cAANA,MAAM,GACN,UAAUY,CAAa,EAAE;MACrBX,WAAW,CAACW,CAAC,KAAA,IAAA,IAADA,CAAC,KAAA,KAAA,CAAA,GAADA,CAAC,GAAIb,KAAK,CAACgB,IAAI,CAAC,CAAA;KAC/B;AACLX,IAAAA,QAAQ,EAAEO,YAAY;IACtBK,OAAO,EAAEb,aAAa,KAAKD,KAAK;AAChC,IAAA,GAAGH,KAAK;IACR,GAAGW,KAAAA;GACN,CAAA;AACL,CAAA;AAEO,SAASO,KAAKA,CAACP,KAAiB,EAAe;EAClD,OAAOQ,GAAA,CAACC,OAAU,EAAA;IAAA,GAAKvB,YAAY,CAACc,KAAK,CAAA;AAAC,GAAG,CAAC,CAAA;AAClD,CAAA;AAEAO,KAAK,CAACG,WAAW,GAAG,aAAa;;;;"}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import { FieldProps } from 'formik';
|
2
|
+
import { IRadioGroupProps } from '@shipengine/giger';
|
3
|
+
|
4
|
+
type RadioGroupProps = FieldProps & Omit<IRadioGroupProps, 'name' | 'value'>;
|
5
|
+
declare function fieldToRadioGroup({ disabled, field: { onBlur: fieldOnBlur, value, onChange: onFormikChange, ...field }, form: { isSubmitting, errors, touched }, onBlur, onChange, ...props }: RadioGroupProps): IRadioGroupProps;
|
6
|
+
declare function RadioGroup(props: RadioGroupProps): JSX.Element;
|
7
|
+
declare namespace RadioGroup {
|
8
|
+
var displayName: string;
|
9
|
+
}
|
10
|
+
|
11
|
+
export { RadioGroup, RadioGroupProps, fieldToRadioGroup };
|
@@ -0,0 +1,47 @@
|
|
1
|
+
import { getIn } from 'formik';
|
2
|
+
import { RadioGroup as RadioGroup$1 } from '@shipengine/giger';
|
3
|
+
import { jsx } from '@emotion/react/jsx-runtime';
|
4
|
+
|
5
|
+
function fieldToRadioGroup(_ref) {
|
6
|
+
let {
|
7
|
+
disabled,
|
8
|
+
field: {
|
9
|
+
onBlur: fieldOnBlur,
|
10
|
+
value,
|
11
|
+
onChange: onFormikChange,
|
12
|
+
...field
|
13
|
+
},
|
14
|
+
form: {
|
15
|
+
isSubmitting,
|
16
|
+
errors,
|
17
|
+
touched
|
18
|
+
},
|
19
|
+
onBlur,
|
20
|
+
onChange,
|
21
|
+
...props
|
22
|
+
} = _ref;
|
23
|
+
const handleChange = e => {
|
24
|
+
onChange && onChange(e);
|
25
|
+
onFormikChange(e);
|
26
|
+
};
|
27
|
+
return {
|
28
|
+
isInvalid: getIn(touched, field.name) && !!getIn(errors, field.name),
|
29
|
+
disabled: disabled || isSubmitting,
|
30
|
+
value,
|
31
|
+
onBlur: onBlur !== null && onBlur !== void 0 ? onBlur : function (e) {
|
32
|
+
fieldOnBlur(e !== null && e !== void 0 ? e : field.name);
|
33
|
+
},
|
34
|
+
onChange: handleChange,
|
35
|
+
...field,
|
36
|
+
...props
|
37
|
+
};
|
38
|
+
}
|
39
|
+
function RadioGroup(props) {
|
40
|
+
return jsx(RadioGroup$1, {
|
41
|
+
...fieldToRadioGroup(props)
|
42
|
+
});
|
43
|
+
}
|
44
|
+
RadioGroup.displayName = 'FormikRadioGroup';
|
45
|
+
|
46
|
+
export { RadioGroup, fieldToRadioGroup };
|
47
|
+
//# sourceMappingURL=RadioGroup.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"RadioGroup.js","sources":["../../src/RadioGroup.tsx"],"sourcesContent":["import { ChangeEvent, FocusEvent } from 'react';\nimport { FieldProps, getIn } from 'formik';\n\nimport { RadioGroup as GigerRadioGroup, IRadioGroupProps as GigerRadioGroupProps } from '@shipengine/giger';\n\nexport type RadioGroupProps = FieldProps & Omit<GigerRadioGroupProps, 'name' | 'value'>;\n\nexport function fieldToRadioGroup({\n disabled,\n field: { onBlur: fieldOnBlur, value, onChange: onFormikChange, ...field },\n form: { isSubmitting, errors, touched },\n onBlur,\n onChange,\n ...props\n}: RadioGroupProps): GigerRadioGroupProps {\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n onChange && onChange(e);\n onFormikChange(e);\n };\n\n return {\n isInvalid: getIn(touched, field.name) && !!getIn(errors, field.name),\n disabled: disabled || isSubmitting,\n value,\n onBlur:\n onBlur ??\n function (e: FocusEvent) {\n fieldOnBlur(e ?? field.name);\n },\n onChange: handleChange,\n ...field,\n ...props,\n };\n}\n\nexport function RadioGroup(props: RadioGroupProps): JSX.Element {\n return <GigerRadioGroup {...fieldToRadioGroup(props)} />;\n}\n\nRadioGroup.displayName = 'FormikRadioGroup';\n"],"names":["fieldToRadioGroup","_ref","disabled","field","onBlur","fieldOnBlur","value","onChange","onFormikChange","form","isSubmitting","errors","touched","props","handleChange","e","isInvalid","getIn","name","RadioGroup","_jsx","GigerRadioGroup","displayName"],"mappings":";;;;AAOO,SAASA,iBAAiBA,CAAAC,IAAA,EAOS;EAAA,IAPR;IAC9BC,QAAQ;AACRC,IAAAA,KAAK,EAAE;AAAEC,MAAAA,MAAM,EAAEC,WAAW;MAAEC,KAAK;AAAEC,MAAAA,QAAQ,EAAEC,cAAc;MAAE,GAAGL,KAAAA;KAAO;AACzEM,IAAAA,IAAI,EAAE;MAAEC,YAAY;MAAEC,MAAM;AAAEC,MAAAA,OAAAA;KAAS;IACvCR,MAAM;IACNG,QAAQ;IACR,GAAGM,KAAAA;AACU,GAAC,GAAAZ,IAAA,CAAA;EACd,MAAMa,YAAY,GAAIC,CAAgC,IAAK;AACvDR,IAAAA,QAAQ,IAAIA,QAAQ,CAACQ,CAAC,CAAC,CAAA;IACvBP,cAAc,CAACO,CAAC,CAAC,CAAA;GACpB,CAAA;EAED,OAAO;AACHC,IAAAA,SAAS,EAAEC,KAAK,CAACL,OAAO,EAAET,KAAK,CAACe,IAAI,CAAC,IAAI,CAAC,CAACD,KAAK,CAACN,MAAM,EAAER,KAAK,CAACe,IAAI,CAAC;IACpEhB,QAAQ,EAAEA,QAAQ,IAAIQ,YAAY;IAClCJ,KAAK;IACLF,MAAM,EACFA,MAAM,KAANA,IAAAA,IAAAA,MAAM,cAANA,MAAM,GACN,UAAUW,CAAa,EAAE;MACrBV,WAAW,CAACU,CAAC,KAAA,IAAA,IAADA,CAAC,KAAA,KAAA,CAAA,GAADA,CAAC,GAAIZ,KAAK,CAACe,IAAI,CAAC,CAAA;KAC/B;AACLX,IAAAA,QAAQ,EAAEO,YAAY;AACtB,IAAA,GAAGX,KAAK;IACR,GAAGU,KAAAA;GACN,CAAA;AACL,CAAA;AAEO,SAASM,UAAUA,CAACN,KAAsB,EAAe;EAC5D,OAAOO,GAAA,CAACC,YAAe,EAAA;IAAA,GAAKrB,iBAAiB,CAACa,KAAK,CAAA;AAAC,GAAG,CAAC,CAAA;AAC5D,CAAA;AAEAM,UAAU,CAACG,WAAW,GAAG,kBAAkB;;;;"}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import { FieldProps } from 'formik';
|
2
|
+
import { ISelectOption, ISelect } from '@shipengine/giger';
|
3
|
+
|
4
|
+
type SelectProps<FormValues = unknown> = FieldProps<ISelectOption | null, FormValues> & Omit<ISelect, 'name' | 'value'> & {
|
5
|
+
options?: ISelectOption[];
|
6
|
+
};
|
7
|
+
declare function fieldToSelect<FormValues = unknown>({ disabled, field: { onBlur: fieldOnBlur, onChange: onFormikChange, ...field }, form: { isSubmitting, touched, errors }, onClickAway, onChange, ...props }: SelectProps<FormValues>): ISelect;
|
8
|
+
declare function Select<FormValues = unknown>({ options, children, ...props }: SelectProps<FormValues>): JSX.Element;
|
9
|
+
declare namespace Select {
|
10
|
+
var displayName: string;
|
11
|
+
}
|
12
|
+
|
13
|
+
export { Select, SelectProps, fieldToSelect };
|
@@ -0,0 +1,68 @@
|
|
1
|
+
import { getIn } from 'formik';
|
2
|
+
import { Option, Select as Select$1 } from '@shipengine/giger';
|
3
|
+
import { jsx } from '@emotion/react/jsx-runtime';
|
4
|
+
|
5
|
+
function fieldToSelect(_ref) {
|
6
|
+
let {
|
7
|
+
disabled,
|
8
|
+
field: {
|
9
|
+
onBlur: fieldOnBlur,
|
10
|
+
onChange: onFormikChange,
|
11
|
+
...field
|
12
|
+
},
|
13
|
+
form: {
|
14
|
+
isSubmitting,
|
15
|
+
touched,
|
16
|
+
errors
|
17
|
+
},
|
18
|
+
onClickAway,
|
19
|
+
onChange,
|
20
|
+
...props
|
21
|
+
} = _ref;
|
22
|
+
const handleChange = (fieldName, value) => {
|
23
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(fieldName, value);
|
24
|
+
onFormikChange({
|
25
|
+
target: {
|
26
|
+
name: field.name,
|
27
|
+
value
|
28
|
+
}
|
29
|
+
});
|
30
|
+
};
|
31
|
+
const handleClickAway = () => {
|
32
|
+
onClickAway === null || onClickAway === void 0 ? void 0 : onClickAway();
|
33
|
+
fieldOnBlur({
|
34
|
+
target: {
|
35
|
+
name: field.name
|
36
|
+
}
|
37
|
+
});
|
38
|
+
};
|
39
|
+
return {
|
40
|
+
isInvalid: getIn(touched, field.name) && !!getIn(errors, field.name),
|
41
|
+
disabled: disabled || isSubmitting,
|
42
|
+
onClickAway: handleClickAway,
|
43
|
+
onChange: handleChange,
|
44
|
+
...field,
|
45
|
+
...props
|
46
|
+
};
|
47
|
+
}
|
48
|
+
function Select(_ref2) {
|
49
|
+
let {
|
50
|
+
options,
|
51
|
+
children,
|
52
|
+
...props
|
53
|
+
} = _ref2;
|
54
|
+
const formikProps = fieldToSelect(props);
|
55
|
+
const renderedOptions = options ? options.map(option => jsx(Option, {
|
56
|
+
value: option,
|
57
|
+
selected: option === formikProps.value,
|
58
|
+
children: option.label
|
59
|
+
}, option.label)) : children;
|
60
|
+
return jsx(Select$1, {
|
61
|
+
...formikProps,
|
62
|
+
children: renderedOptions
|
63
|
+
});
|
64
|
+
}
|
65
|
+
Select.displayName = 'FormikSelect';
|
66
|
+
|
67
|
+
export { Select, fieldToSelect };
|
68
|
+
//# sourceMappingURL=Select.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Select.js","sources":["../../src/Select.tsx"],"sourcesContent":["import { FieldProps, getIn } from 'formik';\n\nimport { ISelectOption, Select as GigerSelect, ISelect as IGigerSelect, Option } from '@shipengine/giger';\n\nexport type SelectProps<FormValues = unknown> = FieldProps<ISelectOption | null, FormValues> &\n Omit<IGigerSelect, 'name' | 'value'> & {\n options?: ISelectOption[];\n };\n\nexport function fieldToSelect<FormValues = unknown>({\n disabled,\n field: { onBlur: fieldOnBlur, onChange: onFormikChange, ...field },\n form: { isSubmitting, touched, errors },\n onClickAway,\n onChange,\n ...props\n}: SelectProps<FormValues>): IGigerSelect {\n const handleChange = (fieldName: string, value: ISelectOption | null) => {\n onChange?.(fieldName, value);\n onFormikChange({ target: { name: field.name, value } });\n };\n\n const handleClickAway = () => {\n onClickAway?.();\n fieldOnBlur({ target: { name: field.name } });\n };\n\n return {\n isInvalid: getIn(touched, field.name) && !!getIn(errors, field.name),\n disabled: disabled || isSubmitting,\n onClickAway: handleClickAway,\n onChange: handleChange,\n ...field,\n ...props,\n };\n}\n\nexport function Select<FormValues = unknown>({ options, children, ...props }: SelectProps<FormValues>): JSX.Element {\n const formikProps = fieldToSelect(props);\n\n const renderedOptions = options\n ? options.map((option) => (\n <Option key={option.label} value={option} selected={option === formikProps.value}>\n {option.label}\n </Option>\n ))\n : children;\n\n return <GigerSelect {...formikProps}>{renderedOptions}</GigerSelect>;\n}\n\nSelect.displayName = 'FormikSelect';\n"],"names":["fieldToSelect","_ref","disabled","field","onBlur","fieldOnBlur","onChange","onFormikChange","form","isSubmitting","touched","errors","onClickAway","props","handleChange","fieldName","value","target","name","handleClickAway","isInvalid","getIn","Select","_ref2","options","children","formikProps","renderedOptions","map","option","_jsx","Option","selected","label","GigerSelect","displayName"],"mappings":";;;;AASO,SAASA,aAAaA,CAAAC,IAAA,EAOa;EAAA,IAPU;IAChDC,QAAQ;AACRC,IAAAA,KAAK,EAAE;AAAEC,MAAAA,MAAM,EAAEC,WAAW;AAAEC,MAAAA,QAAQ,EAAEC,cAAc;MAAE,GAAGJ,KAAAA;KAAO;AAClEK,IAAAA,IAAI,EAAE;MAAEC,YAAY;MAAEC,OAAO;AAAEC,MAAAA,MAAAA;KAAQ;IACvCC,WAAW;IACXN,QAAQ;IACR,GAAGO,KAAAA;AACkB,GAAC,GAAAZ,IAAA,CAAA;AACtB,EAAA,MAAMa,YAAY,GAAGA,CAACC,SAAiB,EAAEC,KAA2B,KAAK;IACrEV,QAAQ,KAAA,IAAA,IAARA,QAAQ,KAARA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,QAAQ,CAAGS,SAAS,EAAEC,KAAK,CAAC,CAAA;AAC5BT,IAAAA,cAAc,CAAC;AAAEU,MAAAA,MAAM,EAAE;QAAEC,IAAI,EAAEf,KAAK,CAACe,IAAI;AAAEF,QAAAA,KAAAA;AAAM,OAAA;AAAE,KAAC,CAAC,CAAA;GAC1D,CAAA;EAED,MAAMG,eAAe,GAAGA,MAAM;AAC1BP,IAAAA,WAAW,KAAXA,IAAAA,IAAAA,WAAW,KAAXA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,WAAW,EAAI,CAAA;AACfP,IAAAA,WAAW,CAAC;AAAEY,MAAAA,MAAM,EAAE;QAAEC,IAAI,EAAEf,KAAK,CAACe,IAAAA;AAAK,OAAA;AAAE,KAAC,CAAC,CAAA;GAChD,CAAA;EAED,OAAO;AACHE,IAAAA,SAAS,EAAEC,KAAK,CAACX,OAAO,EAAEP,KAAK,CAACe,IAAI,CAAC,IAAI,CAAC,CAACG,KAAK,CAACV,MAAM,EAAER,KAAK,CAACe,IAAI,CAAC;IACpEhB,QAAQ,EAAEA,QAAQ,IAAIO,YAAY;AAClCG,IAAAA,WAAW,EAAEO,eAAe;AAC5Bb,IAAAA,QAAQ,EAAEQ,YAAY;AACtB,IAAA,GAAGX,KAAK;IACR,GAAGU,KAAAA;GACN,CAAA;AACL,CAAA;AAEO,SAASS,MAAMA,CAAAC,KAAA,EAA8F;EAAA,IAAvE;IAAEC,OAAO;IAAEC,QAAQ;IAAE,GAAGZ,KAAAA;AAA+B,GAAC,GAAAU,KAAA,CAAA;AACjG,EAAA,MAAMG,WAAW,GAAG1B,aAAa,CAACa,KAAK,CAAC,CAAA;AAExC,EAAA,MAAMc,eAAe,GAAGH,OAAO,GACzBA,OAAO,CAACI,GAAG,CAAEC,MAAM,IACfC,GAAA,CAACC,MAAM,EAAA;AAAoBf,IAAAA,KAAK,EAAEa,MAAO;AAACG,IAAAA,QAAQ,EAAEH,MAAM,KAAKH,WAAW,CAACV,KAAM;IAAAS,QAAA,EAC5EI,MAAM,CAACI,KAAAA;AAAK,GAAA,EADJJ,MAAM,CAACI,KAEZ,CACX,CAAC,GACFR,QAAQ,CAAA;EAEd,OAAOK,GAAA,CAACI,QAAW,EAAA;AAAA,IAAA,GAAKR,WAAW;AAAAD,IAAAA,QAAA,EAAGE,eAAAA;AAAe,GAAc,CAAC,CAAA;AACxE,CAAA;AAEAL,MAAM,CAACa,WAAW,GAAG,cAAc;;;;"}
|