diff --git a/src/components/SelectBox.resi b/src/components/SelectBox.resi index fc336a988..3d1a77857 100644 --- a/src/components/SelectBox.resi +++ b/src/components/SelectBox.resi @@ -4,53 +4,51 @@ external toDict: 'a => RescriptCore.Dict.t<'t> = "%identity" @send external focus: Dom.element => unit = "focus" external ffInputToSelectInput: ReactFinalForm.fieldRenderPropsInput => ReactFinalForm.fieldRenderPropsCustomInput< array, -> = - "%identity" +> = "%identity" external ffInputToRadioInput: ReactFinalForm.fieldRenderPropsInput => ReactFinalForm.fieldRenderPropsCustomInput< string, -> = - "%identity" +> = "%identity" let regex: (string, string) => RescriptCore.RegExp.t module ListItem: { @react.component let make: ( - ~isDropDown: bool, - ~searchString: string, - ~multiSelect: bool, - ~optionSize: CheckBoxIcon.size=?, - ~isSelectedStateMinus: bool=?, - ~isSelected: bool, - ~isPrevSelected: bool=?, - ~isNextSelected: bool=?, - ~onClick: JsxEventU.Mouse.t => unit, - ~text: Js.String2.t, - ~fill: string=?, - ~labelValue: Js.String2.t=?, - ~isDisabled: bool=?, - ~icon: Button.iconType, - ~leftVacennt: bool=?, - ~showToggle: bool=?, - ~customStyle: string=?, - ~serialNumber: option=?, - ~isMobileView: bool=?, - ~description: option=?, - ~customLabelStyle: option=?, - ~customMarginStyle: string=?, - ~listFlexDirection: string=?, - ~customSelectStyle: string=?, - ~textOverflowClass: string=?, - ~dataId: int, - ~showDescriptionAsTool: bool=?, - ~optionClass: string=?, - ~selectClass: string=?, - ~toggleProps: string=?, - ~checkboxDimension: string=?, - ~iconStroke: string=?, - ~showToolTipOptions: bool=?, - ~textEllipsisForDropDownOptions: bool=?, - ~textColorClass: string=?, - ~customRowClass: string=?, -) => React.element + ~isDropDown: bool, + ~searchString: string, + ~multiSelect: bool, + ~optionSize: CheckBoxIcon.size=?, + ~isSelectedStateMinus: bool=?, + ~isSelected: bool, + ~isPrevSelected: bool=?, + ~isNextSelected: bool=?, + ~onClick: JsxEventU.Mouse.t => unit, + ~text: Js.String2.t, + ~fill: string=?, + ~labelValue: Js.String2.t=?, + ~isDisabled: bool=?, + ~icon: Button.iconType, + ~leftVacennt: bool=?, + ~showToggle: bool=?, + ~customStyle: string=?, + ~serialNumber: option=?, + ~isMobileView: bool=?, + ~description: option=?, + ~customLabelStyle: option=?, + ~customMarginStyle: string=?, + ~listFlexDirection: string=?, + ~customSelectStyle: string=?, + ~textOverflowClass: string=?, + ~dataId: int, + ~showDescriptionAsTool: bool=?, + ~optionClass: string=?, + ~selectClass: string=?, + ~toggleProps: string=?, + ~checkboxDimension: string=?, + ~iconStroke: string=?, + ~showToolTipOptions: bool=?, + ~textEllipsisForDropDownOptions: bool=?, + ~textColorClass: string=?, + ~customRowClass: string=?, + ) => React.element } type dropdownOptionWithoutOptional = { label: string, @@ -82,111 +80,111 @@ let makeOptions: array => array module BaseSelect: { @react.component let make: ( - ~showSelectAll: bool=?, - ~showDropDown: bool=?, - ~isDropDown: bool=?, - ~options: array, - ~optionSize: CheckBoxIcon.size=?, - ~isSelectedStateMinus: bool=?, - ~onSelect: array => unit, - ~value: RescriptCore.JSON.t, - ~onBlur: ReactEvent.Focus.t => unit=?, - ~showClearAll: bool=?, - ~isHorizontal: bool=?, - ~insertselectBtnRef: ReactDOM.Ref.callbackDomRef=?, - ~insertclearBtnRef: ReactDOM.Ref.callbackDomRef=?, - ~customLabelStyle: string=?, - ~showToggle: bool=?, - ~showSerialNumber: bool=?, - ~heading: string=?, - ~showSelectionAsChips: bool=?, - ~maxHeight: string=?, - ~searchable: bool=?, - ~optionRigthElement: React.element=?, - ~searchInputPlaceHolder: string=?, - ~showSearchIcon: bool=?, - ~customStyle: string=?, - ~customMargin: string=?, - ~disableSelect: bool=?, - ~deselectDisable: bool=?, - ~hideBorder: bool=?, - ~allSelectType: allSelectType=?, - ~isMobileView: bool=?, - ~isModalView: bool=?, - ~customSearchStyle: string=?, - ~hasApplyButton: bool=?, - ~setShowDropDown: ('a => bool) => unit=?, - ~dropdownCustomWidth: string=?, - ~sortingBasedOnDisabled: bool=?, - ~customMarginStyle: string=?, - ~listFlexDirection: string=?, - ~onApply: JsxEvent.Mouse.t => unit=?, - ~showAllSelectedOptions: bool=?, - ~showDescriptionAsTool: bool=?, - ~optionClass: string=?, - ~selectClass: string=?, - ~toggleProps: string=?, - ~showSelectCountButton: bool=?, - ~customSelectAllStyle: string=?, - ~checkboxDimension: string=?, - ~dropdownClassName: string=?, - ~onItemSelect: (JsxEventU.Mouse.t, string) => unit=?, - ~wrapBasis: string=?, - ~preservedAppliedOptions: array=?, -) => React.element + ~showSelectAll: bool=?, + ~showDropDown: bool=?, + ~isDropDown: bool=?, + ~options: array, + ~optionSize: CheckBoxIcon.size=?, + ~isSelectedStateMinus: bool=?, + ~onSelect: array => unit, + ~value: RescriptCore.JSON.t, + ~onBlur: ReactEvent.Focus.t => unit=?, + ~showClearAll: bool=?, + ~isHorizontal: bool=?, + ~insertselectBtnRef: ReactDOM.Ref.callbackDomRef=?, + ~insertclearBtnRef: ReactDOM.Ref.callbackDomRef=?, + ~customLabelStyle: string=?, + ~showToggle: bool=?, + ~showSerialNumber: bool=?, + ~heading: string=?, + ~showSelectionAsChips: bool=?, + ~maxHeight: string=?, + ~searchable: bool=?, + ~optionRigthElement: React.element=?, + ~searchInputPlaceHolder: string=?, + ~showSearchIcon: bool=?, + ~customStyle: string=?, + ~customMargin: string=?, + ~disableSelect: bool=?, + ~deselectDisable: bool=?, + ~hideBorder: bool=?, + ~allSelectType: allSelectType=?, + ~isMobileView: bool=?, + ~isModalView: bool=?, + ~customSearchStyle: string=?, + ~hasApplyButton: bool=?, + ~setShowDropDown: ('a => bool) => unit=?, + ~dropdownCustomWidth: string=?, + ~sortingBasedOnDisabled: bool=?, + ~customMarginStyle: string=?, + ~listFlexDirection: string=?, + ~onApply: JsxEvent.Mouse.t => unit=?, + ~showAllSelectedOptions: bool=?, + ~showDescriptionAsTool: bool=?, + ~optionClass: string=?, + ~selectClass: string=?, + ~toggleProps: string=?, + ~showSelectCountButton: bool=?, + ~customSelectAllStyle: string=?, + ~checkboxDimension: string=?, + ~dropdownClassName: string=?, + ~onItemSelect: (JsxEventU.Mouse.t, string) => unit=?, + ~wrapBasis: string=?, + ~preservedAppliedOptions: array=?, + ) => React.element } module BaseSelectButton: { @react.component let make: ( - ~showDropDown: bool=?, - ~isDropDown: bool=?, - ~isHorizontal: bool=?, - ~options: array, - ~optionSize: CheckBoxIcon.size=?, - ~isSelectedStateMinus: bool=?, - ~onSelect: string => unit, - ~value: RescriptCore.JSON.t, - ~deselectDisable: bool=?, - ~onBlur: ReactEvent.Focus.t => unit=?, - ~setShowDropDown: ('a => bool) => unit=?, - ~onAssignClick: string => unit=?, - ~customSearchStyle: string, - ~disableSelect: bool=?, - ~isMobileView: bool=?, - ~hideAssignBtn: bool=?, - ~searchInputPlaceHolder: string=?, - ~showSearchIcon: bool=?, - ~allowButtonTextMinWidth: bool=?, -) => React.element + ~showDropDown: bool=?, + ~isDropDown: bool=?, + ~isHorizontal: bool=?, + ~options: array, + ~optionSize: CheckBoxIcon.size=?, + ~isSelectedStateMinus: bool=?, + ~onSelect: string => unit, + ~value: RescriptCore.JSON.t, + ~deselectDisable: bool=?, + ~onBlur: ReactEvent.Focus.t => unit=?, + ~setShowDropDown: ('a => bool) => unit=?, + ~onAssignClick: string => unit=?, + ~customSearchStyle: string, + ~disableSelect: bool=?, + ~isMobileView: bool=?, + ~hideAssignBtn: bool=?, + ~searchInputPlaceHolder: string=?, + ~showSearchIcon: bool=?, + ~allowButtonTextMinWidth: bool=?, + ) => React.element } module RenderListItemInBaseRadio: { @react.component let make: ( - ~newOptions: array, - ~value: Core__JSON.t, - ~descriptionOnHover: bool, - ~isDropDown: bool, - ~textIconPresent: bool, - ~searchString: string, - ~optionSize: CheckBoxIcon.size, - ~isSelectedStateMinus: bool, - ~onItemClick: (string, bool) => JsxEventU.Mouse.t => unit, - ~fill: string, - ~customStyle: string, - ~isMobileView: bool, - ~listFlexDirection: string, - ~customSelectStyle: string, - ~textOverflowClass: option, - ~showToolTipOptions: bool, - ~textEllipsisForDropDownOptions: bool, - ~isHorizontal: bool, - ~customMarginStyleOfListItem: string=?, - ~bottomComponent: React.element=?, - ~optionClass: string=?, - ~selectClass: string=?, - ~customScrollStyle: string=?, - ~shouldDisplaySelectedOnTop: bool, -) => React.element + ~newOptions: array, + ~value: Core__JSON.t, + ~descriptionOnHover: bool, + ~isDropDown: bool, + ~textIconPresent: bool, + ~searchString: string, + ~optionSize: CheckBoxIcon.size, + ~isSelectedStateMinus: bool, + ~onItemClick: (string, bool) => JsxEventU.Mouse.t => unit, + ~fill: string, + ~customStyle: string, + ~isMobileView: bool, + ~listFlexDirection: string, + ~customSelectStyle: string, + ~textOverflowClass: option, + ~showToolTipOptions: bool, + ~textEllipsisForDropDownOptions: bool, + ~isHorizontal: bool, + ~customMarginStyleOfListItem: string=?, + ~bottomComponent: React.element=?, + ~optionClass: string=?, + ~selectClass: string=?, + ~customScrollStyle: string=?, + ~shouldDisplaySelectedOnTop: bool, + ) => React.element } let getHashMappedOptionValues: array => RescriptCore.Dict.t< array, @@ -195,153 +193,153 @@ let getSortedKeys: RescriptCore.Dict.t<'a> => array module BaseRadio: { @react.component let make: ( - ~showDropDown: bool=?, - ~isDropDown: bool=?, - ~isHorizontal: bool=?, - ~options: array, - ~optionSize: CheckBoxIcon.size=?, - ~isSelectedStateMinus: bool=?, - ~onSelect: string => unit, - ~value: RescriptCore.JSON.t, - ~deselectDisable: bool=?, - ~onBlur: ReactEvent.Focus.t => unit=?, - ~fill: string=?, - ~customStyle: string=?, - ~searchable: bool=?, - ~isMobileView: bool=?, - ~customSearchStyle: string=?, - ~descriptionOnHover: bool=?, - ~addDynamicValue: bool=?, - ~dropdownCustomWidth: string=?, - ~dropdownRef: React.ref>=?, - ~showMatchingRecordsText: bool=?, - ~fullLength: bool=?, - ~selectedString: string=?, - ~setSelectedString: ('a => string) => unit=?, - ~setExtSearchString: ('b => string) => unit=?, - ~listFlexDirection: string=?, - ~baseComponentCustomStyle: string=?, - ~customSelectStyle: string=?, - ~maxHeight: string=?, - ~textOverflowClass: string=?, - ~searchInputPlaceHolder: string=?, - ~showSearchIcon: bool=?, - ~showToolTipOptions: bool=?, - ~textEllipsisForDropDownOptions: bool=?, - ~bottomComponent: React.element=?, - ~optionClass: string=?, - ~selectClass: string=?, - ~customScrollStyle: string=?, - ~dropdownContainerStyle: string=?, - ~shouldDisplaySelectedOnTop: bool=?, -) => React.element + ~showDropDown: bool=?, + ~isDropDown: bool=?, + ~isHorizontal: bool=?, + ~options: array, + ~optionSize: CheckBoxIcon.size=?, + ~isSelectedStateMinus: bool=?, + ~onSelect: string => unit, + ~value: RescriptCore.JSON.t, + ~deselectDisable: bool=?, + ~onBlur: ReactEvent.Focus.t => unit=?, + ~fill: string=?, + ~customStyle: string=?, + ~searchable: bool=?, + ~isMobileView: bool=?, + ~customSearchStyle: string=?, + ~descriptionOnHover: bool=?, + ~addDynamicValue: bool=?, + ~dropdownCustomWidth: string=?, + ~dropdownRef: React.ref>=?, + ~showMatchingRecordsText: bool=?, + ~fullLength: bool=?, + ~selectedString: string=?, + ~setSelectedString: ('a => string) => unit=?, + ~setExtSearchString: ('b => string) => unit=?, + ~listFlexDirection: string=?, + ~baseComponentCustomStyle: string=?, + ~customSelectStyle: string=?, + ~maxHeight: string=?, + ~textOverflowClass: string=?, + ~searchInputPlaceHolder: string=?, + ~showSearchIcon: bool=?, + ~showToolTipOptions: bool=?, + ~textEllipsisForDropDownOptions: bool=?, + ~bottomComponent: React.element=?, + ~optionClass: string=?, + ~selectClass: string=?, + ~customScrollStyle: string=?, + ~dropdownContainerStyle: string=?, + ~shouldDisplaySelectedOnTop: bool=?, + ) => React.element } type direction = BottomLeft | BottomMiddle | BottomRight | TopLeft | TopMiddle | TopRight module BaseDropdown: { @react.component let make: ( - ~buttonText: string, - ~buttonSize: Button.buttonSize=?, - ~allowMultiSelect: bool, - ~input: ReactFinalForm.fieldRenderPropsInput, - ~showClearAll: bool=?, - ~showSelectAll: bool=?, - ~options: array, - ~optionSize: CheckBoxIcon.size=?, - ~isSelectedStateMinus: bool=?, - ~hideMultiSelectButtons: bool, - ~deselectDisable: bool=?, - ~buttonType: Button.buttonType=?, - ~baseComponent: React.element=?, - ~baseComponentMethod: bool => React.element=?, - ~disableSelect: bool=?, - ~textStyle: string=?, - ~buttonTextWeight: string=?, - ~defaultLeftIcon: Button.iconType=?, - ~autoApply: bool=?, - ~fullLength: bool=?, - ~customButtonStyle: string=?, - ~onAssignClick: string => unit=?, - ~fixedDropDownDirection: direction=?, - ~addButton: bool=?, - ~marginTop: string=?, - ~customStyle: string=?, - ~customSearchStyle: string=?, - ~showSelectionAsChips: bool=?, - ~showToolTip: bool=?, - ~showNameAsToolTip: bool=?, - ~searchable: bool=?, - ~showBorder: bool=?, - ~dropDownCustomBtnClick: bool=?, - ~showCustomBtnAtEnd: bool=?, - ~customButton: React.element=?, - ~descriptionOnHover: bool=?, - ~addDynamicValue: bool=?, - ~showMatchingRecordsText: bool=?, - ~hasApplyButton: bool=?, - ~dropdownCustomWidth: string=?, - ~allowButtonTextMinWidth: bool=?, - ~customMarginStyle: string=?, - ~customButtonLeftIcon: Button.iconType=?, - ~customTextPaddingClass: string=?, - ~customButtonPaddingClass: string=?, - ~customButtonIconMargin: string=?, - ~textStyleClass: string=?, - ~buttonStyleOnDropDownOpened: string=?, - ~selectedString: string=?, - ~setSelectedString: ('a => string) => unit=?, - ~setExtSearchString: ('b => string) => unit=?, - ~listFlexDirection: string=?, - ~ellipsisOnly: bool=?, - ~isPhoneDropdown: bool=?, - ~onApply: JsxEvent.Mouse.t => unit=?, - ~showAllSelectedOptions: bool=?, - ~buttonClickFn: string => unit=?, - ~toggleChevronState: unit => unit=?, - ~showSelectCountButton: bool=?, - ~maxHeight: string=?, - ~customBackColor: string=?, - ~showToolTipOptions: bool=?, - ~textEllipsisForDropDownOptions: bool=?, - ~showBtnTextToolTip: bool=?, - ~dropdownClassName: string=?, - ~searchInputPlaceHolder: string=?, - ~showSearchIcon: bool=?, - ~sortingBasedOnDisabled: bool=?, - ~customSelectStyle: string=?, - ~baseComponentCustomStyle: string=?, - ~bottomComponent: React.element=?, - ~optionClass: string=?, - ~selectClass: string=?, - ~customDropdownOuterClass: string=?, - ~customScrollStyle: string=?, - ~dropdownContainerStyle: string=?, - ~shouldDisplaySelectedOnTop: bool=?, -) => React.element + ~buttonText: string, + ~buttonSize: Button.buttonSize=?, + ~allowMultiSelect: bool, + ~input: ReactFinalForm.fieldRenderPropsInput, + ~showClearAll: bool=?, + ~showSelectAll: bool=?, + ~options: array, + ~optionSize: CheckBoxIcon.size=?, + ~isSelectedStateMinus: bool=?, + ~hideMultiSelectButtons: bool, + ~deselectDisable: bool=?, + ~buttonType: Button.buttonType=?, + ~baseComponent: React.element=?, + ~baseComponentMethod: bool => React.element=?, + ~disableSelect: bool=?, + ~textStyle: string=?, + ~buttonTextWeight: string=?, + ~defaultLeftIcon: Button.iconType=?, + ~autoApply: bool=?, + ~fullLength: bool=?, + ~customButtonStyle: string=?, + ~onAssignClick: string => unit=?, + ~fixedDropDownDirection: direction=?, + ~addButton: bool=?, + ~marginTop: string=?, + ~customStyle: string=?, + ~customSearchStyle: string=?, + ~showSelectionAsChips: bool=?, + ~showToolTip: bool=?, + ~showNameAsToolTip: bool=?, + ~searchable: bool=?, + ~showBorder: bool=?, + ~dropDownCustomBtnClick: bool=?, + ~showCustomBtnAtEnd: bool=?, + ~customButton: React.element=?, + ~descriptionOnHover: bool=?, + ~addDynamicValue: bool=?, + ~showMatchingRecordsText: bool=?, + ~hasApplyButton: bool=?, + ~dropdownCustomWidth: string=?, + ~allowButtonTextMinWidth: bool=?, + ~customMarginStyle: string=?, + ~customButtonLeftIcon: Button.iconType=?, + ~customTextPaddingClass: string=?, + ~customButtonPaddingClass: string=?, + ~customButtonIconMargin: string=?, + ~textStyleClass: string=?, + ~buttonStyleOnDropDownOpened: string=?, + ~selectedString: string=?, + ~setSelectedString: ('a => string) => unit=?, + ~setExtSearchString: ('b => string) => unit=?, + ~listFlexDirection: string=?, + ~ellipsisOnly: bool=?, + ~isPhoneDropdown: bool=?, + ~onApply: JsxEvent.Mouse.t => unit=?, + ~showAllSelectedOptions: bool=?, + ~buttonClickFn: string => unit=?, + ~toggleChevronState: unit => unit=?, + ~showSelectCountButton: bool=?, + ~maxHeight: string=?, + ~customBackColor: string=?, + ~showToolTipOptions: bool=?, + ~textEllipsisForDropDownOptions: bool=?, + ~showBtnTextToolTip: bool=?, + ~dropdownClassName: string=?, + ~searchInputPlaceHolder: string=?, + ~showSearchIcon: bool=?, + ~sortingBasedOnDisabled: bool=?, + ~customSelectStyle: string=?, + ~baseComponentCustomStyle: string=?, + ~bottomComponent: React.element=?, + ~optionClass: string=?, + ~selectClass: string=?, + ~customDropdownOuterClass: string=?, + ~customScrollStyle: string=?, + ~dropdownContainerStyle: string=?, + ~shouldDisplaySelectedOnTop: bool=?, + ) => React.element } module InfraSelectBox: { @react.component let make: ( - ~options: array, - ~input: ReactFinalForm.fieldRenderPropsInput, - ~deselectDisable: bool=?, - ~allowMultiSelect: bool=?, - ~borderRadius: string=?, - ~selectedClass: string=?, - ~nonSelectedClass: string=?, - ~showTickMark: bool=?, -) => React.element + ~options: array, + ~input: ReactFinalForm.fieldRenderPropsInput, + ~deselectDisable: bool=?, + ~allowMultiSelect: bool=?, + ~borderRadius: string=?, + ~selectedClass: string=?, + ~nonSelectedClass: string=?, + ~showTickMark: bool=?, + ) => React.element } module ChipFilterSelectBox: { @react.component let make: ( - ~options: array, - ~input: ReactFinalForm.fieldRenderPropsInput, - ~deselectDisable: bool=?, - ~allowMultiSelect: bool=?, - ~isTickRequired: bool=?, - ~customStyleForChips: string=?, -) => React.element + ~options: array, + ~input: ReactFinalForm.fieldRenderPropsInput, + ~deselectDisable: bool=?, + ~allowMultiSelect: bool=?, + ~isTickRequired: bool=?, + ~customStyleForChips: string=?, + ) => React.element } @react.component let make: ( diff --git a/src/screens/Home/ProdIntent/ProdVerifyModal.res b/src/screens/Home/ProdIntent/ProdVerifyModal.res index cffe3c02e..c4af873b4 100644 --- a/src/screens/Home/ProdIntent/ProdVerifyModal.res +++ b/src/screens/Home/ProdIntent/ProdVerifyModal.res @@ -33,7 +33,6 @@ let make = (~showModal, ~setShowModal, ~initialValues=Dict.make(), ~getProdVerif let onSubmit = (values, _) => { setScreenState(_ => PageLoaderWrapper.Loading) - Window._open("https://calendar.app.google/U2xpGxE8zigYjeft5") updateProdDetails(values) } diff --git a/src/screens/Order/OrderUIUtils.res b/src/screens/Order/OrderUIUtils.res index 5c0b7883a..721e36154 100644 --- a/src/screens/Order/OrderUIUtils.res +++ b/src/screens/Order/OrderUIUtils.res @@ -274,7 +274,12 @@ let initialFilters = (json, filtervalues) => { let connectorFilter = filtervalues->getArrayFromDict("connector", [])->getStrArrayFromJsonArray - let filterDict = json->getDictFromJsonObject + // TODO: Remove the card-network delete once card-network issue is fixed + let filterDict = + json + ->getDictFromJsonObject + ->DictionaryUtils.deleteKeys(["card_network"]) + let filterArr = filterDict->itemToObjMapper let arr = filterDict->Dict.keysToArray diff --git a/src/screens/Settings/BusinessDetails.res b/src/screens/Settings/BusinessDetails.res index 340959030..e72e7e5b9 100644 --- a/src/screens/Settings/BusinessDetails.res +++ b/src/screens/Settings/BusinessDetails.res @@ -158,7 +158,7 @@ let make = () => { onClick={_ => setFormState(_ => Edit)} buttonType=Primary buttonSize={Small} - buttonState={checkUserEntity([#Profile]) ?Disabled :Normal} + buttonState={checkUserEntity([#Profile]) ? Disabled : Normal} customButtonStyle="rounded-sm" /> | Edit => diff --git a/src/screens/Settings/MerchantAccountUtils.res b/src/screens/Settings/MerchantAccountUtils.res index 70cb294f7..b4168ed63 100644 --- a/src/screens/Settings/MerchantAccountUtils.res +++ b/src/screens/Settings/MerchantAccountUtils.res @@ -429,7 +429,8 @@ let validateMerchantAccountForm = ( let val = valuesDict->getJsonObjectFromDict(key->validationFieldsMapper) switch val->JSON.Classify.classify { - | String(str) => switch str->getNonEmptyString { + | String(str) => + switch str->getNonEmptyString { | Some(str) => key->validateCustom(errors, str, isLiveMode) | _ => () }