From e9fe23fd6354704d1707240a4b632115f602b6eb Mon Sep 17 00:00:00 2001 From: Stefano Pigozzi <256895@studenti.unimore.it> Date: Mon, 10 May 2021 15:22:07 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Add=20RepositoryEdit=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/frontend/src/PageSwitcher.js | 4 ++ .../interactive/BoxRepositoriesActive.js | 2 +- .../interactive/BoxRepositoriesArchived.js | 2 +- .../interactive/BoxRepositoryCreate.js | 35 ++++++++++++++-- .../interactive/RepositorySummaryBase.js | 42 +++++++++++++++---- .../RepositorySummaryBase.module.css | 17 +++++++- code/frontend/src/routes/PageEdit.js | 38 +++++++++++++++++ code/frontend/src/utils/goToOnSuccess.js | 23 ++++++++++ 8 files changed, 146 insertions(+), 17 deletions(-) create mode 100644 code/frontend/src/routes/PageEdit.js create mode 100644 code/frontend/src/utils/goToOnSuccess.js diff --git a/code/frontend/src/PageSwitcher.js b/code/frontend/src/PageSwitcher.js index 2f2afa7..309da02 100644 --- a/code/frontend/src/PageSwitcher.js +++ b/code/frontend/src/PageSwitcher.js @@ -7,6 +7,7 @@ import PageSettings from "./routes/PageSettings" import PageSandbox from "./routes/PageSandbox" import PageDashboard from "./routes/PageDashboard" import PageRoot from "./routes/PageRoot" +import PageEdit from "./routes/PageEdit" export default function PageSwitcher({ ...props }) { @@ -15,6 +16,9 @@ export default function PageSwitcher({ ...props }) { + + + diff --git a/code/frontend/src/components/interactive/BoxRepositoriesActive.js b/code/frontend/src/components/interactive/BoxRepositoriesActive.js index 7884c93..509835a 100644 --- a/code/frontend/src/components/interactive/BoxRepositoriesActive.js +++ b/code/frontend/src/components/interactive/BoxRepositoriesActive.js @@ -18,7 +18,7 @@ import useDataImmediately from "../../hooks/useDataImmediately" */ export default function BoxRepositoriesActive({ ...props }) { const {user, fetchDataAuth} = useContext(ContextUser) - const {data, error, loading, fetchNow} = useDataImmediately(fetchDataAuth, "GET", "/api/v1/repositories/", { + const {data, error} = useDataImmediately(fetchDataAuth, "GET", "/api/v1/repositories/", { "onlyActive": true, }) diff --git a/code/frontend/src/components/interactive/BoxRepositoriesArchived.js b/code/frontend/src/components/interactive/BoxRepositoriesArchived.js index 545a1fa..4668cb2 100644 --- a/code/frontend/src/components/interactive/BoxRepositoriesArchived.js +++ b/code/frontend/src/components/interactive/BoxRepositoriesArchived.js @@ -17,7 +17,7 @@ import useDataImmediately from "../../hooks/useDataImmediately" */ export default function BoxRepositoriesArchived({ ...props }) { const {user, fetchDataAuth} = useContext(ContextUser) - const {data, started, loading, error} = useDataImmediately(fetchDataAuth, "GET", "/api/v1/repositories/", { + const {data, error} = useDataImmediately(fetchDataAuth, "GET", "/api/v1/repositories/", { "onlyDead": true, }) diff --git a/code/frontend/src/components/interactive/BoxRepositoryCreate.js b/code/frontend/src/components/interactive/BoxRepositoryCreate.js index f5eafe0..088784d 100644 --- a/code/frontend/src/components/interactive/BoxRepositoryCreate.js +++ b/code/frontend/src/components/interactive/BoxRepositoryCreate.js @@ -3,15 +3,23 @@ import BoxFull from "../base/BoxFull" import FormLabelled from "../base/FormLabelled" import FormLabel from "../base/formparts/FormLabel" import InputWithIcon from "../base/InputWithIcon" -import { faFolder, faPlus } from "@fortawesome/free-solid-svg-icons" +import { faFolder, faPencilAlt, faPlus } from "@fortawesome/free-solid-svg-icons" import Radio from "../base/Radio" import Button from "../base/Button" import useRepositoryEditor from "../../hooks/useRepositoryEditor" import FormAlert from "../base/formparts/FormAlert" +/** + * A {@link BoxFull} allowing the user to save the changes made in the current {@link RepositoryEditor}. + * + * @param props + * @returns {JSX.Element} + * @constructor + */ export default function BoxRepositoryCreate({ ...props }) { const { + id, evaluationMode, setEvaluationMode, name, @@ -55,9 +63,28 @@ export default function BoxRepositoryCreate({ ...props }) { {error.toString()} : null} - + {id ? + + : + + } + ) diff --git a/code/frontend/src/components/interactive/RepositorySummaryBase.js b/code/frontend/src/components/interactive/RepositorySummaryBase.js index 96333cd..43a3be6 100644 --- a/code/frontend/src/components/interactive/RepositorySummaryBase.js +++ b/code/frontend/src/components/interactive/RepositorySummaryBase.js @@ -4,15 +4,16 @@ import classNames from "classnames" import {FontAwesomeIcon} from "@fortawesome/react-fontawesome" import Button from "../base/Button" import { faArchive, faPencilAlt, faTrash } from "@fortawesome/free-solid-svg-icons" +import { useHistory } from "react-router" /** * A long line representing a repository in a list. * + * @param id - The id of the repository. + * @param owner - The owner of the repository. * @param icon - The FontAwesome IconDefinition that represents the repository. * @param name - The title of the repository. - * @todo What goes in the details field? - * @param details - Whatever should be rendered in the details field. * @param start - The start date of the repository. * @param end - The end date of the repository. * @param isActive - Whether the repository is active or not. @@ -25,8 +26,10 @@ import { faArchive, faPencilAlt, faTrash } from "@fortawesome/free-solid-svg-ico * @constructor */ export default function RepositorySummaryBase( - { icon, name, details, start, end, isActive, canDelete, canEdit, canArchive, className, ...props } + { id, owner, icon, name, start, end, isActive, canDelete, canEdit, canArchive, className, ...props } ) { + const {history} = useHistory() + return (
@@ -36,22 +39,43 @@ export default function RepositorySummaryBase(
{name}
-
- {start} +
+ {owner["username"]}
- {details} +
+ Start: {start} +
+
+ End: {end} +
{canDelete ? - + : null} {canEdit ? - + : null} {canArchive ? - + : null}
diff --git a/code/frontend/src/components/interactive/RepositorySummaryBase.module.css b/code/frontend/src/components/interactive/RepositorySummaryBase.module.css index 7f5a9c0..2f21b39 100644 --- a/code/frontend/src/components/interactive/RepositorySummaryBase.module.css +++ b/code/frontend/src/components/interactive/RepositorySummaryBase.module.css @@ -50,7 +50,7 @@ align-self: flex-end; } -.StartDate { +.Author { grid-area: d; font-size: small; @@ -59,10 +59,23 @@ .Middle { flex-grow: 1; - height: 60px; background-color: var(--bg-light); + + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: stretch; + +} + +.StartDate { + +} + +.EndDate { + } .Right { diff --git a/code/frontend/src/routes/PageEdit.js b/code/frontend/src/routes/PageEdit.js new file mode 100644 index 0000000..25d4659 --- /dev/null +++ b/code/frontend/src/routes/PageEdit.js @@ -0,0 +1,38 @@ +import React, { useContext } from "react" +import Style from "./PageDashboard.module.css" +import classNames from "classnames" +import BoxHeader from "../components/base/BoxHeader" +import RepositoryEditor from "../components/providers/RepositoryEditor" +import useDataImmediately from "../hooks/useDataImmediately" +import ContextUser from "../contexts/ContextUser" +import BoxAlert from "../components/base/BoxAlert" +import RepositorySummaryBase from "../components/interactive/RepositorySummaryBase" +import { faSearch } from "@fortawesome/free-solid-svg-icons" +import Loading from "../components/base/Loading" +import BoxFull from "../components/base/BoxFull" + + +export default function PageEdit({ id, className, ...props }) { + const {fetchDataAuth} = useContext(ContextUser) + const {data, error} = useDataImmediately(fetchDataAuth, "GET", `/api/v1/repositories/${id}`) + + let contents; + if(error) { + contents = {error.toString()} + } + else if(data) { + contents = + } + else { + contents = + } + + return ( +
+ + Edit repository + + {contents} +
+ ) +} diff --git a/code/frontend/src/utils/goToOnSuccess.js b/code/frontend/src/utils/goToOnSuccess.js new file mode 100644 index 0000000..d11eac7 --- /dev/null +++ b/code/frontend/src/utils/goToOnSuccess.js @@ -0,0 +1,23 @@ +/** + * Decorator which adds a redirect on success to an event handler. + * + * @param func - The function to decorate. + * @param history - The history to push the destination to. + * @param destination - The path of the destination. + * @returns {(function(): void)|*} + */ +export default function goToOnSuccess(func, history, destination) { + return ([...args]) => { + let success = false + try { + func(...args) + success = true + } + catch(e) { + success = false + } + if(success) { + history.push(destination) + } + } +}