diff --git a/scm-ui/ui-webapp/public/locales/de/repos.json b/scm-ui/ui-webapp/public/locales/de/repos.json index da37603fdd..9edd41b43c 100644 --- a/scm-ui/ui-webapp/public/locales/de/repos.json +++ b/scm-ui/ui-webapp/public/locales/de/repos.json @@ -66,6 +66,14 @@ "importUrl": "Remote Repository URL", "username": "Benutzername", "password": "Passwort", + "compressed": { + "label": "Komprimiert", + "helpText": "Anwählen, wenn die Datei komprimiert ist." + }, + "bundle": { + "title": "Wählen Sie Ihre Datei aus", + "helpText": "Wählen Sie die Datei aus der das Repository importiert werden soll." + }, "pending": { "subtitle": "Repository wird importiert...", "infoText": "Ihr Repository wird gerade importiert. Dies kann einen Moment dauern. Sie werden weitergeleitet, sobald der Import abgeschlossen ist. Wenn Sie diese Seite verlassen, können Sie nicht zurückkehren, um den Import-Status zu erfahren." diff --git a/scm-ui/ui-webapp/public/locales/en/repos.json b/scm-ui/ui-webapp/public/locales/en/repos.json index a795532bf2..cabb9ea440 100644 --- a/scm-ui/ui-webapp/public/locales/en/repos.json +++ b/scm-ui/ui-webapp/public/locales/en/repos.json @@ -67,6 +67,14 @@ "importUrl": "Remote repository url", "username": "Username", "password": "Password", + "compressed": { + "label": "Compressed", + "helpText": "Check if your dump file is compressed." + }, + "bundle": { + "title": "Select your dump file", + "helpText": "Select your dump file from which the repository should be imported." + }, "pending": { "subtitle": "Importing Repository...", "infoText": "Your repository is currently being imported. This may take a moment. You will be forwarded as soon as the import is finished. If you leave this page you cannot return to find out the import status." @@ -202,7 +210,7 @@ "sources": "Sources" }, "parents": { - "label" : "Parent", + "label": "Parent", "label_plural": "Parents" }, "contributors": { diff --git a/scm-ui/ui-webapp/src/repos/components/ImportFromBundleForm.tsx b/scm-ui/ui-webapp/src/repos/components/ImportFromBundleForm.tsx new file mode 100644 index 0000000000..ba5da91934 --- /dev/null +++ b/scm-ui/ui-webapp/src/repos/components/ImportFromBundleForm.tsx @@ -0,0 +1,66 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import React, { FC } from "react"; +import { FileUpload, LabelWithHelpIcon, Checkbox } from "@scm-manager/ui-components"; +import { File } from "@scm-manager/ui-types"; +import { useTranslation } from "react-i18next"; + +type Props = { + setFile: (file: File) => void; + setValid: (valid: boolean) => void; + compressed: boolean; + setCompressed: (compressed: boolean) => void; + disabled: boolean; +}; + +const ImportFromBundleForm: FC = ({ setFile, setValid, compressed, setCompressed, disabled }) => { + const [t] = useTranslation("repos"); + + return ( +
+
+ + { + setFile(file); + setValid(!!file); + }} + /> +
+
+ setCompressed(value)} + label={t("import.compressed.label")} + disabled={disabled} + helpText={t("import.compressed.helpText")} + title={t("import.compressed.label")} + /> +
+
+ ); +}; + +export default ImportFromBundleForm; diff --git a/scm-ui/ui-webapp/src/repos/components/ImportRepositoryFromBundle.tsx b/scm-ui/ui-webapp/src/repos/components/ImportRepositoryFromBundle.tsx index 203ca9b243..e28eb0b894 100644 --- a/scm-ui/ui-webapp/src/repos/components/ImportRepositoryFromBundle.tsx +++ b/scm-ui/ui-webapp/src/repos/components/ImportRepositoryFromBundle.tsx @@ -23,11 +23,12 @@ */ import React, { FC, FormEvent, useState } from "react"; import NamespaceAndNameFields from "./NamespaceAndNameFields"; -import {File, Repository} from "@scm-manager/ui-types"; +import { File, Repository } from "@scm-manager/ui-types"; import RepositoryInformationForm from "./RepositoryInformationForm"; -import { apiClient, ErrorNotification, FileUpload, Level, SubmitButton } from "@scm-manager/ui-components"; +import { apiClient, ErrorNotification, Level, SubmitButton } from "@scm-manager/ui-components"; import { useTranslation } from "react-i18next"; import { useHistory } from "react-router-dom"; +import ImportFromBundleForm from "./ImportFromBundleForm"; type Props = { url: string; @@ -49,6 +50,7 @@ const ImportRepositoryFromBundle: FC = ({ url, repositoryType, setImportP const [loading, setLoading] = useState(false); const [error, setError] = useState(); const [file, setFile] = useState(null); + const [compressed, setCompressed] = useState(false); const history = useHistory(); const [t] = useTranslation("repos"); @@ -65,9 +67,9 @@ const ImportRepositoryFromBundle: FC = ({ url, repositoryType, setImportP setError(undefined); handleImportLoading(true); apiClient - .postBinary(url, (formdata) => { - formdata.append("bundle", file!, file?.name); - formdata.append("repository", JSON.stringify(repo)); + .postBinary(compressed ? url + "?compressed=true" : url, (formData) => { + formData.append("bundle", file, file?.name); + formData.append("repository", JSON.stringify(repo)); }) .then((response) => { const location = response.headers.get("Location"); @@ -88,11 +90,12 @@ const ImportRepositoryFromBundle: FC = ({ url, repositoryType, setImportP return (
- { - setFile(file); - setValid({ ...valid, file: !!file }); - }} + setValid({ ...valid, file })} + compressed={compressed} + setCompressed={setCompressed} + disabled={loading} />