diff --git a/packages/client/public/locales/en/OAuth.json b/packages/client/public/locales/en/OAuth.json index bddc75f3ac..a5c3db4d61 100644 --- a/packages/client/public/locales/en/OAuth.json +++ b/packages/client/public/locales/en/OAuth.json @@ -63,6 +63,7 @@ "TermsOfService": "Terms of Service", "TermsOfServiceURL": "Terms of Service URL", "TermsOfServiceURLHelpButton": "Terms and conditions that users must comply with when using this application.", + "ThisRequiredField": "This is a required field", "WebsiteUrl": "Website URL", "Write": "Write" } diff --git a/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/ClientForm.styled.ts b/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/ClientForm.styled.ts index 3127a43d67..8fd237f4af 100644 --- a/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/ClientForm.styled.ts +++ b/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/ClientForm.styled.ts @@ -34,6 +34,10 @@ const StyledBlock = styled.div` display: flex; flex-direction: column; gap: 12px; + + .icon-field { + margin: 0; + } `; const StyledHeaderRow = styled.div` diff --git a/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/BasicBlock.tsx b/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/BasicBlock.tsx index 742f1e43d4..1000c5b2b0 100644 --- a/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/BasicBlock.tsx +++ b/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/BasicBlock.tsx @@ -1,8 +1,10 @@ import React from "react"; import { Trans } from "react-i18next"; -//@ts-ignore +// @ts-ignore import HelpButton from "@docspace/components/help-button"; +// @ts-ignore +import FieldContainer from "@docspace/components/field-container"; import { StyledBlock, StyledInputBlock } from "../ClientForm.styled"; @@ -26,6 +28,7 @@ interface BasicBlockProps { isEdit: boolean; errorFields: string[]; + requiredErrorFields: string[]; onBlur: (name: string) => void; } @@ -75,6 +78,7 @@ const BasicBlock = ({ isEdit, errorFields, + requiredErrorFields, onBlur, }: BasicBlockProps) => { const onChange = (e: React.ChangeEvent) => { @@ -133,6 +137,12 @@ const BasicBlock = ({ ); + const isNameRequiredError = requiredErrorFields.includes("name"); + const isWebsiteRequiredError = requiredErrorFields.includes("website_url"); + const isNameError = errorFields.includes("name"); + const isWebsiteError = errorFields.includes("website_url"); + const isLogoRequiredError = requiredErrorFields.includes("logo"); + return ( @@ -142,10 +152,10 @@ const BasicBlock = ({ name={"name"} placeholder={t("Common:EnterName")} value={nameValue} - error={`${t("ErrorName")} 3`} + error={isNameError ? `${t("ErrorName")} 3` : t("ThisRequiredField")} onChange={onChange} isRequired - isError={errorFields.includes("name")} + isError={isNameRequiredError || isNameError} onBlur={onBlur} /> - + + + + onBlur?.(name)} + hasError={isError} /> )} {buttonLabel && ( diff --git a/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/MultiInputGroup.tsx b/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/MultiInputGroup.tsx index 34dc4380ca..22a620766a 100644 --- a/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/MultiInputGroup.tsx +++ b/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/MultiInputGroup.tsx @@ -24,7 +24,7 @@ interface MultiInputGroupProps { name: string; placeholder: string; currentValue: string[]; - + hasError?: boolean; onAdd: (name: string, value: string, remove?: boolean) => void; helpButtonText?: string; @@ -39,7 +39,7 @@ const MultiInputGroup = ({ placeholder, currentValue, onAdd, - + hasError, helpButtonText, isDisabled, }: MultiInputGroupProps) => { @@ -74,9 +74,13 @@ const MultiInputGroup = ({ value={value} placeholder={placeholder} onChange={onChange} - error={`${t("ErrorWrongURL")}: ${window.location.origin}`} + error={ + isError + ? `${t("ErrorWrongURL")}: ${window.location.origin}` + : t("ThisRequiredField") + } isRequired - isError={isError} + isError={isError || hasError} > { diff --git a/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/OAuthBlock.tsx b/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/OAuthBlock.tsx index 236b6a06e5..b2edb276ad 100644 --- a/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/OAuthBlock.tsx +++ b/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/OAuthBlock.tsx @@ -11,6 +11,7 @@ interface OAuthBlockProps { allowedOriginsValue: string[]; changeValue: (name: string, value: string) => void; + requiredErrorFields: string[]; isEdit: boolean; } @@ -21,7 +22,7 @@ const OAuthBlock = ({ allowedOriginsValue, changeValue, - + requiredErrorFields, isEdit, }: OAuthBlockProps) => { return ( @@ -37,6 +38,7 @@ const OAuthBlock = ({ currentValue={redirectUrisValue} helpButtonText={t("RedirectsURLSHelpButton")} isDisabled={isEdit} + hasError={requiredErrorFields.includes("redirect_uris")} /> diff --git a/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/SupportBlock.tsx b/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/SupportBlock.tsx index 35e0581d4d..d485272157 100644 --- a/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/SupportBlock.tsx +++ b/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/SupportBlock.tsx @@ -15,6 +15,7 @@ interface SupportBlockProps { isEdit: boolean; errorFields: string[]; onBlur?: (name: string) => void; + requiredErrorFields: string[]; } const SupportBlock = ({ @@ -27,6 +28,7 @@ const SupportBlock = ({ isEdit, errorFields, onBlur, + requiredErrorFields, }: SupportBlockProps) => { const onChange = (e: React.ChangeEvent) => { const target = e.target; @@ -34,6 +36,11 @@ const SupportBlock = ({ changeValue(target.name, target.value); }; + const policyRequiredError = requiredErrorFields.includes("policy_url"); + const termsRequiredError = requiredErrorFields.includes("terms_url"); + const policyError = errorFields.includes("policy_url"); + const termsError = errorFields.includes("terms_url"); + return ( @@ -43,12 +50,16 @@ const SupportBlock = ({ name={"policy_url"} placeholder={t("EnterURL")} value={policyUrlValue} - error={`${t("ErrorWrongURL")}: ${window.location.origin}`} + error={ + policyError + ? `${t("ErrorWrongURL")}: ${window.location.origin}` + : t("ThisRequiredField") + } onChange={onChange} helpButtonText={t("PrivacyPolicyURLHelpButton")} disabled={isEdit} isRequired - isError={errorFields.includes("policy_url")} + isError={policyError || policyRequiredError} onBlur={onBlur} /> diff --git a/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/TextAreaGroup.tsx b/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/TextAreaGroup.tsx index 41945bc4bc..d57115bdde 100644 --- a/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/TextAreaGroup.tsx +++ b/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/TextAreaGroup.tsx @@ -12,7 +12,7 @@ interface TextAreaProps { name: string; value: string; placeholder: string; - + increaseHeight: boolean; onChange: (e: React.ChangeEvent) => void; } @@ -22,6 +22,7 @@ const TextAreaGroup = ({ name, value, placeholder, + increaseHeight, onChange, }: TextAreaProps) => { @@ -48,7 +49,7 @@ const TextAreaGroup = ({ onChange={onChange} scale tabIndex={0} - heightTextArea={60} + heightTextArea={increaseHeight ? 81 : 60} maxLength={255} /> diff --git a/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/index.tsx b/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/index.tsx index b7503f1351..85f6541cf9 100644 --- a/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/index.tsx +++ b/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/index.tsx @@ -81,6 +81,9 @@ const ClientForm = ({ }); const [errorFields, setErrorFields] = React.useState([]); + const [requiredErrorFields, setRequiredErrorFields] = React.useState< + string[] + >([]); const { t } = useTranslation(["OAuth", "Common"]); @@ -99,6 +102,41 @@ const ClientForm = ({ const onSaveClick = async () => { try { if (!id) { + let isValid = true; + for (let key in form) { + switch (key) { + case "name": + case "logo": + case "website_url": + case "terms_url": + case "policy_url": + if (form[key] === "") { + if (!requiredErrorFields.includes(key)) + setRequiredErrorFields((s) => [...s, key]); + + isValid = false; + } + isValid = isValid && !errorFields.includes(key); + + break; + + case "redirect_uris": + case "allowed_origins": + case "scopes": + if (form[key].length === 0) { + if (!requiredErrorFields.includes(key)) + setRequiredErrorFields((s) => [...s, key]); + + isValid = false; + } + isValid = isValid && !errorFields.includes(key); + + break; + } + } + + if (!isValid) return; + setIsRequestRunning(true); await saveClient?.(form); @@ -299,8 +337,10 @@ const ClientForm = ({ for (let key in form) { switch (key) { case "name": - isValid = isValid && !!form[key]; - + case "logo": + case "website_url": + case "terms_url": + case "policy_url": if ( errorFields.includes(key) && (!form[key] || (form[key].length > 2 && form[key].length < 256)) @@ -310,73 +350,17 @@ const ClientForm = ({ }); } - isValid = isValid && !errorFields.includes(key); + if (requiredErrorFields.includes(key) && form[key] !== "") + setRequiredErrorFields((value) => value.filter((v) => v !== key)); break; - case "logo": - isValid = isValid && !!form[key]; - break; - case "description": - // isValid = isValid && !!form[key]; - - break; - case "website_url": - isValid = isValid && !!form[key]; - - if ( - errorFields.includes(key) && - (!form[key] || isValidUrl(form[key])) - ) { - setErrorFields((value) => { - return value.filter((n) => n !== key); - }); - } - - break; case "redirect_uris": - isValid = isValid && form[key].length > 0; - - break; case "allowed_origins": - isValid = isValid && form[key].length > 0; - - break; - case "logout_redirect_uris": - isValid = isValid; - - break; - case "terms_url": - isValid = isValid && !!form[key]; - - if ( - errorFields.includes(key) && - (!form[key] || isValidUrl(form[key])) - ) { - setErrorFields((value) => { - return value.filter((n) => n !== key); - }); - } - - break; - case "policy_url": - isValid = isValid && !!form[key]; - - if ( - errorFields.includes(key) && - (!form[key] || isValidUrl(form[key])) - ) { - setErrorFields((value) => { - return value.filter((n) => n !== key); - }); - } - - break; - case "authentication_method": - isValid = isValid; - break; case "scopes": - isValid = isValid && form[key].length > 0; + if (requiredErrorFields.includes(key) && form[key].length > 0) + setRequiredErrorFields((value) => value.filter((v) => v !== key)); + break; } } @@ -406,6 +390,7 @@ const ClientForm = ({ changeValue={onChangeForm} isEdit={isEdit} errorFields={errorFields} + requiredErrorFields={requiredErrorFields} onBlur={onBlur} /> {isEdit && ( @@ -422,6 +407,7 @@ const ClientForm = ({ allowedOriginsValue={form.allowed_origins} changeValue={onChangeForm} isEdit={isEdit} + requiredErrorFields={requiredErrorFields} /> diff --git a/packages/runtime.json b/packages/runtime.json index 4ced23348b..78d6cf20dc 100644 --- a/packages/runtime.json +++ b/packages/runtime.json @@ -1,10 +1,10 @@ { - "date": "20231115_15376", + "date": "20231215_102541", "checksums": { - "api.js": "47b1c3ac53feb3667b3f0b42cacf8038", + "api.js": "47725bc876523672712707c384e3cab2", "api.poly.js": "586ce6831fa68f6bc33486e2cebc856e", - "browserDetector.js": "965560573181ee0d643d9a91d3014f39", - "config.json": "1a5613e4029a95b738179f30501700b6", + "browserDetector.js": "9e853f32d806dd83652ccc2d67510a84", + "config.json": "3f54595a6ea8207c37f1197069a2db86", "tiff.min.js": "90496a3b99551fee464b40e26523e84d" } } \ No newline at end of file