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)
+ }
+ }
+}