diff --git a/web/ASC.Web.Client/src/components/pages/Settings/categories/data-management/sub-components-manual-backup/ThirdPartyStorageModule.js b/web/ASC.Web.Client/src/components/pages/Settings/categories/data-management/sub-components-manual-backup/ThirdPartyStorageModule.js index 1de1b729da..baea4b9bf2 100644 --- a/web/ASC.Web.Client/src/components/pages/Settings/categories/data-management/sub-components-manual-backup/ThirdPartyStorageModule.js +++ b/web/ASC.Web.Client/src/components/pages/Settings/categories/data-management/sub-components-manual-backup/ThirdPartyStorageModule.js @@ -131,17 +131,20 @@ class ThirdPartyStorageModule extends React.PureComponent { }; isInvalidForm = (formSettings) => { + let errors = {}; + let firstError = false; + for (let key in formSettings) { const elem = formSettings[key]; + errors[key] = !elem.trim(); - if (!elem.trim()) { - return true; + if (!elem.trim() && !firstError) { + firstError = true; } } - return false; + return [firstError, errors]; }; - render() { const { t, helpUrlCreatingBackup, isLoadingData, maxProgress } = this.props; const { diff --git a/web/ASC.Web.Client/src/components/pages/Settings/categories/data-management/sub-components-manual-backup/storages/AmazonStorage.js b/web/ASC.Web.Client/src/components/pages/Settings/categories/data-management/sub-components-manual-backup/storages/AmazonStorage.js index 4af379e478..e73f050f0a 100644 --- a/web/ASC.Web.Client/src/components/pages/Settings/categories/data-management/sub-components-manual-backup/storages/AmazonStorage.js +++ b/web/ASC.Web.Client/src/components/pages/Settings/categories/data-management/sub-components-manual-backup/storages/AmazonStorage.js @@ -1,23 +1,26 @@ import React from "react"; import { withTranslation } from "react-i18next"; import Button from "@appserver/components/button"; -import TextInput from "@appserver/components/text-input"; - +import AmazonSettings from "../../consumer-storage-settings/AmazonSettings"; class AmazonStorage extends React.Component { constructor(props) { super(props); const { t, availableStorage, selectedId } = this.props; this.state = { - bucket: "", - forcePathStyle: "", - region: "", - serviceUrl: "", - sse: "", - useHttp: "", - isError: false, + formSettings: { + bucket: "", + forcePathStyle: "", + region: "", + serviceUrl: "", + sse: "", + useHttp: "", + }, + formErrors: {}, isChangedInput: false, }; + this.namesArray = AmazonSettings.formNames(); + this.isDisabled = availableStorage[selectedId] && !availableStorage[selectedId].isSet; @@ -40,125 +43,57 @@ class AmazonStorage extends React.Component { } onChange = (event) => { + const { formSettings } = this.state; const { target } = event; const value = target.value; const name = target.name; - this.setState({ [name]: value }); + this.setState({ formSettings: { ...formSettings, [name]: value } }); }; onMakeCopy = () => { - const { - bucket, - forcePathStyle, - region, - serviceUrl, - sse, - useHttp, - isError, - } = this.state; - + const { formSettings } = this.state; + const { bucket, region } = formSettings; const { onMakeCopyIntoStorage, isInvalidForm } = this.props; - if (isInvalidForm([bucket, region])) { - this.setState({ - isError: true, - }); + const isInvalid = isInvalidForm({ + bucket, + region, + }); + + const hasError = isInvalid[0]; + const errors = isInvalid[1]; + + if (hasError) { + this.setState({ formErrors: errors }); return; } - isError && - this.setState({ - isError: false, - }); - - const valuesArray = [ - bucket, - forcePathStyle, - region, - serviceUrl, - sse, - useHttp, - ]; - - onMakeCopyIntoStorage(valuesArray); + onMakeCopyIntoStorage(this.namesArray); + this.setState({ formErrors: {} }); }; render() { + const { formSettings, formErrors } = this.state; const { - isError, - bucket, - forcePathStyle, - region, - serviceUrl, - sse, - useHttp, - } = this.state; - const { t, isLoadingData, isLoading, maxProgress } = this.props; + t, + isLoadingData, + isLoading, + maxProgress, + availableStorage, + selectedId, + } = this.props; return ( <> - - - - - - -
diff --git a/web/ASC.Web.Client/src/components/pages/Settings/categories/data-management/sub-components-manual-backup/storages/GoogleCloudStorage.js b/web/ASC.Web.Client/src/components/pages/Settings/categories/data-management/sub-components-manual-backup/storages/GoogleCloudStorage.js index ad6885cbd2..dfbc6b8f1c 100644 --- a/web/ASC.Web.Client/src/components/pages/Settings/categories/data-management/sub-components-manual-backup/storages/GoogleCloudStorage.js +++ b/web/ASC.Web.Client/src/components/pages/Settings/categories/data-management/sub-components-manual-backup/storages/GoogleCloudStorage.js @@ -1,8 +1,7 @@ import React from "react"; import { withTranslation } from "react-i18next"; - import Button from "@appserver/components/button"; -import TextInput from "@appserver/components/text-input"; +import GoogleCloudSettings from "../../consumer-storage-settings/GoogleCloudSettings"; class GoogleCloudStorage extends React.Component { constructor(props) { @@ -10,9 +9,12 @@ class GoogleCloudStorage extends React.Component { const { availableStorage, selectedId } = this.props; this.state = { - bucket: "", + formSettings: { + bucket: "", + }, isError: false, isChangedInput: false, + formErrors: {}, }; this.isDisabled = availableStorage[selectedId] && !availableStorage[selectedId].isSet; @@ -24,59 +26,55 @@ class GoogleCloudStorage extends React.Component { } onChange = (event) => { + const { formSettings } = this.state; const { target } = event; const value = target.value; const name = target.name; - this.setState({ [name]: value }); - }; - - isInvalidForm = () => { - const { bucket } = this.state; - if (bucket) return false; - - this.setState({ - isError: true, - }); - return true; + this.setState({ formSettings: { ...formSettings, [name]: value } }); }; onMakeCopy = () => { - const { bucket, isError } = this.state; + const { formSettings } = this.state; + const { bucket } = formSettings; const { onMakeCopyIntoStorage, isInvalidForm } = this.props; - const valuesArray = [bucket]; + const isInvalid = isInvalidForm({ + bucket, + }); - if (isInvalidForm(valuesArray)) { - this.setState({ - isError: true, - }); + const hasError = isInvalid[0]; + const errors = isInvalid[1]; + + if (hasError) { + this.setState({ formErrors: errors }); return; } - isError && - this.setState({ - isError: false, - }); - - onMakeCopyIntoStorage(valuesArray); + onMakeCopyIntoStorage([bucket]); + this.setState({ formErrors: {} }); }; render() { - const { bucket, isError } = this.state; - const { t, isLoadingData, isLoading, maxProgress } = this.props; + const { formSettings, formErrors } = this.state; + const { + t, + isLoadingData, + isLoading, + maxProgress, + availableStorage, + selectedId, + } = this.props; return ( <> -
diff --git a/web/ASC.Web.Client/src/components/pages/Settings/categories/data-management/sub-components-manual-backup/storages/RackspaceStorage.js b/web/ASC.Web.Client/src/components/pages/Settings/categories/data-management/sub-components-manual-backup/storages/RackspaceStorage.js index a7e9d0b1ea..3427c67822 100644 --- a/web/ASC.Web.Client/src/components/pages/Settings/categories/data-management/sub-components-manual-backup/storages/RackspaceStorage.js +++ b/web/ASC.Web.Client/src/components/pages/Settings/categories/data-management/sub-components-manual-backup/storages/RackspaceStorage.js @@ -1,18 +1,22 @@ import React from "react"; import { withTranslation } from "react-i18next"; import Button from "@appserver/components/button"; -import TextInput from "@appserver/components/text-input"; +import RackspaceSettings from "../../consumer-storage-settings/RackspaceSettings"; class RackspaceStorage extends React.Component { constructor(props) { super(props); const { availableStorage, selectedId } = this.props; + this.namesArray = RackspaceSettings.formNames(); + this.state = { - private_container: "", - public_container: "", - region: "", - isError: false, + formSettings: { + private_container: "", + public_container: "", + region: "", + }, + formErrors: {}, }; this.isDisabled = availableStorage[selectedId] && !availableStorage[selectedId].isSet; @@ -33,71 +37,58 @@ class RackspaceStorage extends React.Component { } onChange = (event) => { + const { formSettings } = this.state; const { target } = event; const value = target.value; const name = target.name; - this.setState({ [name]: value }); + this.setState({ formSettings: { ...formSettings, [name]: value } }); }; onMakeCopy = () => { - const { private_container, public_container, region, isError } = this.state; + const { formSettings } = this.state; + const { private_container, public_container, region } = formSettings; const { onMakeCopyIntoStorage, isInvalidForm } = this.props; - const valuesArray = [private_container, public_container, region]; + const isInvalid = isInvalidForm({ + private_container, + public_container, + region, + }); - if (isInvalidForm(valuesArray)) { - this.setState({ - isError: true, - }); + const hasError = isInvalid[0]; + const errors = isInvalid[1]; + + if (hasError) { + this.setState({ formErrors: errors }); return; } - isError && - this.setState({ - isError: false, - }); - - onMakeCopyIntoStorage(valuesArray); + onMakeCopyIntoStorage(this.namesArray); + this.setState({ formErrors: {} }); }; render() { - const { private_container, public_container, region, isError } = this.state; - const { t, isLoadingData, isLoading, maxProgress } = this.props; + const { formSettings, formErrors } = this.state; + const { + t, + isLoadingData, + isLoading, + maxProgress, + selectedId, + availableStorage, + } = this.props; return ( <> - - -
diff --git a/web/ASC.Web.Client/src/components/pages/Settings/categories/data-management/sub-components-manual-backup/storages/SelectelStorage.js b/web/ASC.Web.Client/src/components/pages/Settings/categories/data-management/sub-components-manual-backup/storages/SelectelStorage.js index 68986be879..e70a01ae51 100644 --- a/web/ASC.Web.Client/src/components/pages/Settings/categories/data-management/sub-components-manual-backup/storages/SelectelStorage.js +++ b/web/ASC.Web.Client/src/components/pages/Settings/categories/data-management/sub-components-manual-backup/storages/SelectelStorage.js @@ -1,17 +1,21 @@ import React from "react"; import { withTranslation } from "react-i18next"; import Button from "@appserver/components/button"; -import TextInput from "@appserver/components/text-input"; +import SelectelSettings from "../../consumer-storage-settings/SelectelSettings"; class SelectelStorage extends React.Component { constructor(props) { super(props); const { availableStorage, selectedId } = this.props; + this.namesArray = SelectelSettings.formNames(); + this.state = { - private_container: "", - public_container: "", - isError: false, + formSettings: { + private_container: "", + public_container: "", + }, + formErrors: {}, }; this.isDisabled = @@ -27,61 +31,58 @@ class SelectelStorage extends React.Component { } onChange = (event) => { + const { formSettings } = this.state; const { target } = event; const value = target.value; const name = target.name; - this.setState({ [name]: value }); + this.setState({ formSettings: { ...formSettings, [name]: value } }); }; onMakeCopy = () => { - const { private_container, public_container, isError } = this.state; + const { formSettings } = this.state; + const { private_container, public_container } = formSettings; const { onMakeCopyIntoStorage, isInvalidForm } = this.props; - const valuesArray = [private_container, public_container]; + const isInvalid = isInvalidForm({ + private_container, + public_container, + }); - if (isInvalidForm(valuesArray)) { - this.setState({ - isError: true, - }); + const hasError = isInvalid[0]; + const errors = isInvalid[1]; + + if (hasError) { + this.setState({ formErrors: errors }); return; } - isError && - this.setState({ - isError: false, - }); - - onMakeCopyIntoStorage(valuesArray); + onMakeCopyIntoStorage(this.namesArray); + this.setState({ formErrors: {} }); }; render() { - const { private_container, public_container, isError } = this.state; - const { t, isLoadingData, isLoading, maxProgress } = this.props; + const { formSettings, formErrors } = this.state; + const { + t, + isLoadingData, + isLoading, + maxProgress, + selectedId, + availableStorage, + } = this.props; return ( <> - -