From e9ae10b76ba8e3028d5e737878dc1c819a02162f Mon Sep 17 00:00:00 2001 From: Ole Wieners Date: Wed, 26 Feb 2025 17:58:44 +0100 Subject: [PATCH] Add notification for series creation This utilizes the recently added notification context to show a note "Series has been created" on the series details page. The user will be redirected to that page after a series has been freshly created. The note will clear when the user navigates away from that page. --- backend/src/api/model/series.rs | 4 +-- frontend/src/i18n/locales/de.yaml | 1 + frontend/src/i18n/locales/en.yaml | 1 + frontend/src/routes/manage/Series/Create.tsx | 32 ++++++++++++------- .../routes/manage/Series/SeriesDetails.tsx | 7 ++++ frontend/src/routes/manage/Series/index.tsx | 2 +- frontend/src/routes/manage/Shared/Details.tsx | 4 +-- frontend/src/routes/manage/Shared/Table.tsx | 2 +- 8 files changed, 35 insertions(+), 18 deletions(-) diff --git a/backend/src/api/model/series.rs b/backend/src/api/model/series.rs index 3b4df502e..7c8ecd896 100644 --- a/backend/src/api/model/series.rs +++ b/backend/src/api/model/series.rs @@ -158,9 +158,9 @@ impl Series { None => (None, None), }; - let selection = Self::select(); + let selection = Self::select().with_renamed_table("series", "all_series"); let query = format!( - "insert into series (opencast_id, title, state, updated, read_roles, write_roles) \ + "insert into all_series (opencast_id, title, state, updated, read_roles, write_roles) \ values ($1, $2, 'waiting', '-infinity', $3, $4) \ returning {selection}", ); diff --git a/frontend/src/i18n/locales/de.yaml b/frontend/src/i18n/locales/de.yaml index 907a440ac..6e0b45a13 100644 --- a/frontend/src/i18n/locales/de.yaml +++ b/frontend/src/i18n/locales/de.yaml @@ -480,6 +480,7 @@ manage: title: Seriendetails referencing-pages-explanation: 'Diese Serie wird von den folgenden Seiten referenziert:' no-referencing-pages: Diese Serie wird von keiner Seite referenziert. + created-note: Serie wurde erstellt. delete-note: > In der Serie enthaltene Video werden nicht gelöschtund können einer anderen Serie zugeordnet werden. diff --git a/frontend/src/i18n/locales/en.yaml b/frontend/src/i18n/locales/en.yaml index 31d5a5495..a100279f8 100644 --- a/frontend/src/i18n/locales/en.yaml +++ b/frontend/src/i18n/locales/en.yaml @@ -460,6 +460,7 @@ manage: title: Series details referencing-pages-explanation: 'This series is referenced on the following pages:' no-referencing-pages: No pages reference this series. + created-note: Series has been created. delete-note: > Videos in this series will not be deleted. They will remain in the system and can be added to another series. diff --git a/frontend/src/routes/manage/Series/Create.tsx b/frontend/src/routes/manage/Series/Create.tsx index 809838028..f807e1c6e 100644 --- a/frontend/src/routes/manage/Series/Create.tsx +++ b/frontend/src/routes/manage/Series/Create.tsx @@ -20,6 +20,11 @@ import { ManageNav } from ".."; import { PageTitle } from "../../../layout/header/ui"; import { displayCommitError } from "../Realm/util"; import { LuCheckCircle } from "react-icons/lu"; +import { useRouter } from "../../../router"; +import { keyOfId } from "../../../util"; +import { PATH as MANAGE_PATH } from "."; +import { CreateSeriesMutation } from "./__generated__/CreateSeriesMutation.graphql"; +import { useNotification } from "../../../ui/NotificationContext"; export const CREATE_SERIES_PATH = "/~manage/create-series"; @@ -71,24 +76,23 @@ type CreateSeriesPageProps = { const CreateSeriesPage: React.FC = ({ knownRolesRef }) => { const user = useUser(); - if (!isRealUser(user)) { - return unreachable(); - } - + const router = useRouter(); const { t } = useTranslation(); const titleFieldId = useId(); const descriptionFieldId = useId(); const knownRoles = useFragment(knownRolesFragment, knownRolesRef); - const [commit, inFlight] = useMutation(createSeriesMutation); + const [commit, inFlight] = useMutation(createSeriesMutation); const [success, setSuccess] = useState(false); const [commitError, setCommitError] = useState(null); + const { setNotification } = useNotification(); + + if (!isRealUser(user)) { + return unreachable(); + } const defaultAcl = defaultAclMap(user); const { - register, - handleSubmit, - control, - reset, + register, handleSubmit, control, formState: { errors, isValid, isDirty }, } = useForm({ mode: "onChange", @@ -107,9 +111,15 @@ const CreateSeriesPage: React.FC = ({ knownRolesRef }) => }) ), }, - onCompleted: () => { + onCompleted: response => { + const returnPath = `${MANAGE_PATH}/${keyOfId(response.createSeries.id)}`; setSuccess(true); - reset(); + setNotification({ + kind: "info", + message: () => t("manage.my-series.details.created-note"), + scope: returnPath, + }); + router.goto(returnPath); }, onError: error => setCommitError(displayCommitError(error)), }); diff --git a/frontend/src/routes/manage/Series/SeriesDetails.tsx b/frontend/src/routes/manage/Series/SeriesDetails.tsx index a8f412f44..335d62883 100644 --- a/frontend/src/routes/manage/Series/SeriesDetails.tsx +++ b/frontend/src/routes/manage/Series/SeriesDetails.tsx @@ -14,6 +14,7 @@ import { HostRealms, } from "../Shared/Details"; import { Link } from "../../../router"; +import { useNotification } from "../../../ui/NotificationContext"; const updateSeriesMetadata = graphql` @@ -39,6 +40,7 @@ export const ManageSeriesDetailsRoute = makeManageSeriesRoute( link: ManageSeriesRoute.url, }} sections={series => [ + , , , , ); +const NotificationSection: React.FC = () => { + const { Notification } = useNotification(); + return ; +}; + const SeriesButtonSection: React.FC<{ series: Series }> = ({ series }) => { const { t } = useTranslation(); const [commit] = useMutation(deleteSeriesMutation); diff --git a/frontend/src/routes/manage/Series/index.tsx b/frontend/src/routes/manage/Series/index.tsx index dc3fa051a..cf1e222e4 100644 --- a/frontend/src/routes/manage/Series/index.tsx +++ b/frontend/src/routes/manage/Series/index.tsx @@ -27,7 +27,7 @@ import { CREATE_SERIES_PATH } from "./Create"; import { LinkButton } from "../../../ui/LinkButton"; -const PATH = "/~manage/series" as const; +export const PATH = "/~manage/series" as const; export const ManageSeriesRoute = makeRoute({ url: PATH, diff --git a/frontend/src/routes/manage/Shared/Details.tsx b/frontend/src/routes/manage/Shared/Details.tsx index 647aec916..6f0249346 100644 --- a/frontend/src/routes/manage/Shared/Details.tsx +++ b/frontend/src/routes/manage/Shared/Details.tsx @@ -62,9 +62,7 @@ export const DetailsPage = ({ return <> - {sections(item).map((section, i) => ( - {section} - ))} + {sections(item).map((section, i) => {section})} ; }; diff --git a/frontend/src/routes/manage/Shared/Table.tsx b/frontend/src/routes/manage/Shared/Table.tsx index 8962b7704..ff856066c 100644 --- a/frontend/src/routes/manage/Shared/Table.tsx +++ b/frontend/src/routes/manage/Shared/Table.tsx @@ -19,7 +19,7 @@ import { ManageRoute } from ".."; import { COLORS } from "../../../color"; import { PageTitle } from "../../../layout/header/ui"; import { Breadcrumbs } from "../../../ui/Breadcrumbs"; -import { Link, useRouter } from "../../../router"; +import { Link } from "../../../router"; import { VideosSortColumn } from "../Video/__generated__/VideoManageQuery.graphql"; import { SeriesSortColumn } from "../Series/__generated__/SeriesManageQuery.graphql"; import { useNotification } from "../../../ui/NotificationContext";