Skip to content

Commit 77d13aa

Browse files
committed
3172: Added to remaining forms
1 parent 4f21be8 commit 77d13aa

File tree

6 files changed

+107
-78
lines changed

6 files changed

+107
-78
lines changed

src/components/slide/slides-list.jsx

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
import { React, useState, useEffect, useContext } from "react";
2-
import { useTranslation } from "react-i18next";
1+
import {React, useState, useEffect, useContext} from "react";
2+
import {useTranslation} from "react-i18next";
33
import List from "../util/list/list";
44
import idFromUrl from "../util/helpers/id-from-url";
55
import UserContext from "../../context/user-context";
66
import ListContext from "../../context/list-context";
77
import ContentHeader from "../util/content-header/content-header";
88
import ContentBody from "../util/content-body/content-body";
99
import useModal from "../../context/modal-context/modal-context-hook";
10-
import { SlideColumns } from "./slides-columns";
10+
import {SlideColumns} from "./slides-columns";
1111
import {
1212
displayError,
1313
displaySuccess,
@@ -17,22 +17,23 @@ import {
1717
useDeleteV2SlidesByIdMutation,
1818
useGetV2PlaylistsByIdQuery,
1919
} from "../../redux/api/api.generated.ts";
20+
import Row from "react-bootstrap/Row";
2021

2122
/**
2223
* The slides list component.
2324
*
2425
* @returns {object} The slides list
2526
*/
2627
function SlidesList() {
27-
const { t } = useTranslation("common", { keyPrefix: "slides-list" });
28+
const {t} = useTranslation("common", {keyPrefix: "slides-list"});
2829
const context = useContext(UserContext);
29-
const { selected, setSelected } = useModal();
30+
const {selected, setSelected} = useModal();
3031

3132
const {
32-
searchText: { get: searchText },
33-
page: { get: page },
34-
createdBy: { get: createdBy },
35-
isPublished: { get: isPublished },
33+
searchText: {get: searchText},
34+
page: {get: page},
35+
createdBy: {get: createdBy},
36+
isPublished: {get: isPublished},
3637
} = useContext(ListContext);
3738

3839
// Local state
@@ -43,7 +44,7 @@ function SlidesList() {
4344
);
4445

4546
// Delete call
46-
const [DeleteV2Slides, { isSuccess: isDeleteSuccess, error: isDeleteError }] =
47+
const [DeleteV2Slides, {isSuccess: isDeleteSuccess, error: isDeleteError}] =
4748
useDeleteV2SlidesByIdMutation();
4849

4950
// Get method
@@ -54,7 +55,7 @@ function SlidesList() {
5455
refetch,
5556
} = useGetV2SlidesQuery({
5657
page,
57-
order: { createdAt: "desc" },
58+
order: {createdAt: "desc"},
5859
title: searchText,
5960
published: isPublished,
6061
createdBy,
@@ -83,7 +84,7 @@ function SlidesList() {
8384
const slideToDelete = selected[0];
8485
setSelected(selected.slice(1));
8586
const slideToDeleteId = idFromUrl(slideToDelete.id);
86-
DeleteV2Slides({ id: slideToDeleteId });
87+
DeleteV2Slides({id: slideToDeleteId});
8788
}
8889
}, [isDeleting, isDeleteSuccess]);
8990

src/components/themes/theme-create.jsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@ function ThemeCreate() {
1818
};
1919

2020
return (
21-
<div className="p-3">
22-
<ThemeManager saveMethod="POST" initialState={data} />
23-
</div>
21+
<ThemeManager saveMethod="POST" initialState={data} />
2422
);
2523
}
2624

src/components/themes/theme-edit.jsx

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,13 @@ function ThemeEdit() {
1818
} = useGetV2ThemesByIdQuery({ id });
1919

2020
return (
21-
<div className="p-3">
22-
<ThemeManager
23-
saveMethod="PUT"
24-
initialState={data}
25-
id={id}
26-
loadingError={loadingError}
27-
isLoading={isLoading}
28-
/>
29-
</div>
21+
<ThemeManager
22+
saveMethod="PUT"
23+
initialState={data}
24+
id={id}
25+
loadingError={loadingError}
26+
isLoading={isLoading}
27+
/>
3028
);
3129
}
3230

src/components/themes/theme-form.jsx

Lines changed: 66 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { React } from "react";
2-
import { Button, FormLabel } from "react-bootstrap";
2+
import { Button, FormLabel, Row, Col } from "react-bootstrap";
33
import { useTranslation } from "react-i18next";
44
import { useNavigate } from "react-router-dom";
55
import PropTypes from "prop-types";
66
import Form from "react-bootstrap/Form";
77
import LoadingComponent from "../util/loading-component/loading-component";
88
import FormInputArea from "../util/forms/form-input-area";
99
import ContentBody from "../util/content-body/content-body";
10-
import ContentFooter from "../util/content-footer/content-footer";
1110
import FormInput from "../util/forms/form-input";
1211
import ImageUploader from "../util/image-uploader/image-uploader";
12+
import StickyFooter from "../util/sticky-footer";
1313

1414
/**
1515
* The theme form component.
@@ -26,81 +26,94 @@ import ImageUploader from "../util/image-uploader/image-uploader";
2626
function ThemeForm({
2727
handleInput,
2828
handleSubmit,
29+
handleSaveNoClose,
2930
headerText,
3031
isLoading = false,
3132
loadingMessage = "",
3233
theme = null,
3334
}) {
34-
const { t } = useTranslation("common");
35+
const { t } = useTranslation("common", { keyPrefix: "theme-form" });
3536
const navigate = useNavigate();
3637

3738
return (
38-
<>
39+
<div>
40+
<LoadingComponent
41+
isLoading={isLoading}
42+
loadingMessage={loadingMessage}
43+
/>
3944
<Form>
40-
<LoadingComponent
41-
isLoading={isLoading}
42-
loadingMessage={loadingMessage}
43-
/>
44-
<h1 id="themeTitle">{headerText}</h1>
45-
<ContentBody>
46-
<FormInput
47-
name="title"
48-
type="text"
49-
label={t("theme-form.theme-name-label")}
50-
value={theme.title}
51-
onChange={handleInput}
52-
/>
53-
<FormInputArea
54-
name="description"
55-
type="text"
56-
label={t("theme-form.theme-description-label")}
57-
value={theme.description}
58-
onChange={handleInput}
59-
/>
60-
</ContentBody>
61-
<ContentBody>
62-
<h2 className="h4">{t("theme-form.css-header")}</h2>
63-
<FormInputArea
64-
name="cssStyles"
65-
type="text"
66-
label={t("theme-form.theme-css-label")}
67-
value={theme.cssStyles}
68-
onChange={handleInput}
69-
/>
70-
<FormLabel htmlFor="logo" className="mt-5">
71-
{t("theme-form.logo-title")}
72-
</FormLabel>
73-
<ImageUploader
74-
multipleImages={false}
75-
handleImageUpload={handleInput}
76-
inputImage={theme.logo}
77-
name="logo"
78-
showLibraryButton
79-
/>
80-
</ContentBody>
81-
<ContentFooter>
45+
<Row className="m-2">
46+
<h1 id="themeTitle">{headerText}</h1>
47+
<Col>
48+
<ContentBody>
49+
<FormInput
50+
name="title"
51+
type="text"
52+
label={t("theme-name-label")}
53+
value={theme.title}
54+
onChange={handleInput}
55+
/>
56+
<FormInputArea
57+
name="description"
58+
type="text"
59+
label={t("theme-description-label")}
60+
value={theme.description}
61+
onChange={handleInput}
62+
/>
63+
</ContentBody>
64+
<ContentBody>
65+
<h2 className="h4">{t("css-header")}</h2>
66+
<FormInputArea
67+
name="cssStyles"
68+
type="text"
69+
label={t("theme-css-label")}
70+
value={theme.cssStyles}
71+
onChange={handleInput}
72+
/>
73+
<FormLabel htmlFor="logo" className="mt-5">
74+
{t("logo-title")}
75+
</FormLabel>
76+
<ImageUploader
77+
multipleImages={false}
78+
handleImageUpload={handleInput}
79+
inputImage={theme.logo ?? null}
80+
name="logo"
81+
showLibraryButton
82+
/>
83+
</ContentBody>
84+
</Col>
85+
</Row>
86+
87+
<StickyFooter>
8288
<Button
8389
variant="secondary"
8490
type="button"
8591
id="cancel_theme"
8692
onClick={() => navigate("/themes/list")}
87-
size="lg"
8893
className="margin-right-button"
8994
>
90-
{t("theme-form.cancel-button")}
95+
{t("cancel-button")}
96+
</Button>
97+
<Button
98+
variant="outline-primary"
99+
type="button"
100+
id="save_without_close"
101+
onClick={handleSaveNoClose}
102+
className="margin-right-button"
103+
>
104+
{t("save-without-close-button")}
91105
</Button>
92106
<Button
93107
variant="primary"
94108
type="button"
95109
onClick={handleSubmit}
96110
id="save_theme"
97-
size="lg"
98111
>
99-
{t("theme-form.save-button")}
112+
{t("save-button")}
100113
</Button>
101-
</ContentFooter>
114+
</StickyFooter>
102115
</Form>
103-
</>
116+
</div>
104117
);
105118
}
106119

@@ -113,6 +126,7 @@ ThemeForm.propTypes = {
113126
}),
114127
handleInput: PropTypes.func.isRequired,
115128
handleSubmit: PropTypes.func.isRequired,
129+
handleSaveNoClose: PropTypes.func.isRequired,
116130
headerText: PropTypes.string.isRequired,
117131
isLoading: PropTypes.bool,
118132
loadingMessage: PropTypes.string,

src/components/themes/theme-manager.jsx

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
displaySuccess,
1313
displayError,
1414
} from "../util/list/toast-component/display-toast";
15+
import idFromUrl from "../util/helpers/id-from-url";
1516

1617
/**
1718
* The theme manager component.
@@ -43,6 +44,7 @@ function ThemeManager({
4344
const [loadingMessage, setLoadingMessage] = useState(
4445
t("loading-messages.loading-theme")
4546
);
47+
const [saveWithoutClose, setSaveWithoutClose] = useState(false);
4648

4749
const [submitting, setSubmitting] = useState(false);
4850
const [formStateObject, setFormStateObject] = useState({
@@ -173,7 +175,16 @@ function ThemeManager({
173175
if (isSaveSuccessPost || isSaveSuccessPut) {
174176
setSubmitting(false);
175177
displaySuccess(t("success-messages.saved-theme"));
176-
navigate("/themes/list");
178+
179+
if (saveWithoutClose) {
180+
setSaveWithoutClose(false);
181+
182+
if (isSaveSuccessPost) {
183+
navigate(`/themes/edit/${idFromUrl(data["@id"])}`);
184+
}
185+
} else {
186+
navigate(`/themes/list`);
187+
}
177188
}
178189
}, [isSaveSuccessPut, isSaveSuccessPost]);
179190

@@ -188,6 +199,11 @@ function ThemeManager({
188199
}
189200
};
190201

202+
const handleSaveNoClose = () => {
203+
setSaveWithoutClose(true);
204+
handleSubmit();
205+
};
206+
191207
/** If the theme is saved with error, display the error message */
192208
useEffect(() => {
193209
if (saveErrorPut || saveErrorPost) {
@@ -205,6 +221,7 @@ function ThemeManager({
205221
headerText={`${headerText}: ${formStateObject?.title}`}
206222
handleInput={handleInput}
207223
handleSubmit={handleSubmit}
224+
handleSaveNoClose={handleSaveNoClose}
208225
isLoading={isLoading || submitting}
209226
loadingMessage={loadingMessage}
210227
/>

src/translations/da/common.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,8 @@
407407
"theme-description-label": "Temaets beskrivelse",
408408
"css-header": "Temaets CSS",
409409
"theme-css-label": "Temaets CSS",
410-
"save-button": "Gem tema",
410+
"save-button": "Gem tema og luk",
411+
"save-without-close-button": "Gem tema",
411412
"cancel-button": "Annuller"
412413
},
413414
"group-form": {

0 commit comments

Comments
 (0)