Edit static pages
This commit is contained in:
parent
ac963d658e
commit
24e2527c1b
@ -5,6 +5,8 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/core": "7.9.0",
|
"@babel/core": "7.9.0",
|
||||||
"@babel/preset-typescript": "^7.10.1",
|
"@babel/preset-typescript": "^7.10.1",
|
||||||
|
"@ckeditor/ckeditor5-build-classic": "^23.1.0",
|
||||||
|
"@ckeditor/ckeditor5-react": "^3.0.0",
|
||||||
"@date-io/moment": "^1.3.13",
|
"@date-io/moment": "^1.3.13",
|
||||||
"@material-ui/core": "^4.10.1",
|
"@material-ui/core": "^4.10.1",
|
||||||
"@material-ui/icons": "^4.9.1",
|
"@material-ui/icons": "^4.9.1",
|
||||||
|
@ -35,8 +35,8 @@ export function Confirm({ children, title, content, onConfirm, onCancel }: Confi
|
|||||||
<DialogContentText>{ content || t('confirmation') }</DialogContentText>
|
<DialogContentText>{ content || t('confirmation') }</DialogContentText>
|
||||||
</DialogContent>
|
</DialogContent>
|
||||||
<DialogActions>
|
<DialogActions>
|
||||||
|
<Button color="primary" variant="contained" autoFocus onClick={ handleConfirm }>{ t('confirm') }</Button>
|
||||||
<Button onClick={ handleCancel }>{ t('cancel') }</Button>
|
<Button onClick={ handleCancel }>{ t('cancel') }</Button>
|
||||||
<Button color="primary" autoFocus onClick={ handleConfirm }>{ t('confirm') }</Button>
|
|
||||||
</DialogActions>
|
</DialogActions>
|
||||||
</Dialog>,
|
</Dialog>,
|
||||||
document.getElementById("modals") as Element,
|
document.getElementById("modals") as Element,
|
||||||
|
23
src/field/ckeditor.tsx
Normal file
23
src/field/ckeditor.tsx
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import { FieldProps } from "formik";
|
||||||
|
|
||||||
|
// @ts-ignore
|
||||||
|
import { CKEditor } from '@ckeditor/ckeditor5-react';
|
||||||
|
// @ts-ignore
|
||||||
|
import ClassicEditor from '@ckeditor/ckeditor5-build-classic';
|
||||||
|
import { FormControl, FormControlLabel, FormControlProps, FormLabel, TextFieldProps } from "@material-ui/core";
|
||||||
|
import React from "react";
|
||||||
|
|
||||||
|
export type CKEditorFieldProps = FieldProps & FormControlProps & { label?: string };
|
||||||
|
|
||||||
|
export function CKEditorField({ field, form, error, label, ...props }: CKEditorFieldProps) {
|
||||||
|
const handleChange = (_: unknown, editor: any) => {
|
||||||
|
const data = editor.getData();
|
||||||
|
form.setFieldValue(field.name, data);
|
||||||
|
form.setFieldTouched(field.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return <FormControl { ...props }>
|
||||||
|
<FormLabel style={{ marginBottom: "0.5rem" }}>{ label }</FormLabel>
|
||||||
|
<CKEditor data={ field.value } editor={ ClassicEditor } onChange={ handleChange }/>
|
||||||
|
</FormControl>
|
||||||
|
}
|
@ -10,7 +10,7 @@ import { Edition } from "@/data/edition";
|
|||||||
import { Pencil } from "mdi-material-ui";
|
import { Pencil } from "mdi-material-ui";
|
||||||
import { Management } from "../main";
|
import { Management } from "../main";
|
||||||
import { createPortal } from "react-dom";
|
import { createPortal } from "react-dom";
|
||||||
import { CreateStaticPageDialog } from "@/management/page/create";
|
import { EditStaticPageDialog } from "@/management/page/create";
|
||||||
|
|
||||||
export type EditionDetailsProps = {
|
export type EditionDetailsProps = {
|
||||||
edition: string;
|
edition: string;
|
||||||
|
@ -9,11 +9,12 @@ import { Cancel } from "mdi-material-ui";
|
|||||||
import { useSpacing } from "@/styles";
|
import { useSpacing } from "@/styles";
|
||||||
import { default as StaticPage } from "@/data/page";
|
import { default as StaticPage } from "@/data/page";
|
||||||
|
|
||||||
export type CreateStaticPageDialogProps = {
|
export type EditStaticPageDialogProps = {
|
||||||
onSave?: (page: StaticPage) => void;
|
onSave?: (page: StaticPage) => void;
|
||||||
|
page?: StaticPage;
|
||||||
} & DialogProps;
|
} & DialogProps;
|
||||||
|
|
||||||
export function CreateStaticPageDialog({ onSave, ...props }: CreateStaticPageDialogProps) {
|
export function EditStaticPageDialog({ onSave, page, ...props }: EditStaticPageDialogProps) {
|
||||||
const { t } = useTranslation("management");
|
const { t } = useTranslation("management");
|
||||||
const spacing = useSpacing(3);
|
const spacing = useSpacing(3);
|
||||||
|
|
||||||
@ -21,10 +22,14 @@ export function CreateStaticPageDialog({ onSave, ...props }: CreateStaticPageDia
|
|||||||
onSave?.(staticPageFormValuesTransformer.reverseTransform(values));
|
onSave?.(staticPageFormValuesTransformer.reverseTransform(values));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const initialValues = page
|
||||||
|
? staticPageFormValuesTransformer.transform(page)
|
||||||
|
: initialStaticPageFormValues;
|
||||||
|
|
||||||
return <Dialog { ...props } maxWidth="lg">
|
return <Dialog { ...props } maxWidth="lg">
|
||||||
<Formik initialValues={ initialStaticPageFormValues } onSubmit={ handleSubmit }>
|
<Formik initialValues={ initialValues } onSubmit={ handleSubmit }>
|
||||||
<Form className={ spacing.vertical }>
|
<Form className={ spacing.vertical }>
|
||||||
<DialogTitle>{ t("page.create.title") }</DialogTitle>
|
<DialogTitle>{ t(page ? "page.edit.title" : "page.create.title") }</DialogTitle>
|
||||||
<DialogContent>
|
<DialogContent>
|
||||||
<StaticPageForm />
|
<StaticPageForm />
|
||||||
</DialogContent>
|
</DialogContent>
|
||||||
@ -38,3 +43,4 @@ export function CreateStaticPageDialog({ onSave, ...props }: CreateStaticPageDia
|
|||||||
</Formik>
|
</Formik>
|
||||||
</Dialog>
|
</Dialog>
|
||||||
}
|
}
|
||||||
|
|
@ -6,6 +6,7 @@ import { TextField as TextFieldFormik } from "formik-material-ui";
|
|||||||
import { Typography } from "@material-ui/core";
|
import { Typography } from "@material-ui/core";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { useSpacing } from "@/styles";
|
import { useSpacing } from "@/styles";
|
||||||
|
import { CKEditorField } from "@/field/ckeditor";
|
||||||
|
|
||||||
export type StaticPageFormValues = StaticPage;
|
export type StaticPageFormValues = StaticPage;
|
||||||
|
|
||||||
@ -33,7 +34,7 @@ export function StaticPageForm() {
|
|||||||
<Field label={ t("translation:language.pl") } name="title.pl" fullWidth component={ TextFieldFormik }/>
|
<Field label={ t("translation:language.pl") } name="title.pl" fullWidth component={ TextFieldFormik }/>
|
||||||
<Field label={ t("translation:language.en") } name="title.en" fullWidth component={ TextFieldFormik }/>
|
<Field label={ t("translation:language.en") } name="title.en" fullWidth component={ TextFieldFormik }/>
|
||||||
<Typography variant="subtitle2">{ t("page.field.content") }</Typography>
|
<Typography variant="subtitle2">{ t("page.field.content") }</Typography>
|
||||||
<Field label={ t("translation:language.pl") } name="content.pl" fullWidth component={ TextFieldFormik }/>
|
<Field label={ t("translation:language.pl") } name="content.pl" fullWidth component={ CKEditorField }/>
|
||||||
<Field label={ t("translation:language.en") } name="content.en" fullWidth component={ TextFieldFormik }/>
|
<Field label={ t("translation:language.en") } name="content.en" fullWidth component={ CKEditorField }/>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
@ -13,9 +13,9 @@ import { encapsulate, one } from "@/helpers";
|
|||||||
import { Actions } from "@/components";
|
import { Actions } from "@/components";
|
||||||
import { useSpacing } from "@/styles";
|
import { useSpacing } from "@/styles";
|
||||||
import { useHistory } from "react-router-dom";
|
import { useHistory } from "react-router-dom";
|
||||||
import { Add } from "@material-ui/icons";
|
import { Add, Edit } from "@material-ui/icons";
|
||||||
import { createPortal } from "react-dom";
|
import { createPortal } from "react-dom";
|
||||||
import { CreateStaticPageDialog } from "@/management/page/create";
|
import { EditStaticPageDialog } from "@/management/page/edit";
|
||||||
import { Confirm } from "@/components/confirm";
|
import { Confirm } from "@/components/confirm";
|
||||||
|
|
||||||
export const StaticPageManagement = () => {
|
export const StaticPageManagement = () => {
|
||||||
@ -29,6 +29,26 @@ export const StaticPageManagement = () => {
|
|||||||
|
|
||||||
useEffect(updatePageList, []);
|
useEffect(updatePageList, []);
|
||||||
|
|
||||||
|
const EditStaticPageAction = ({ page }: { page: StaticPage }) => {
|
||||||
|
const [ open, setOpen ] = useState<boolean>(false);
|
||||||
|
|
||||||
|
const handlePageCreation = async (page: StaticPage) => {
|
||||||
|
await api.page.save(page);
|
||||||
|
setOpen(false);
|
||||||
|
updatePageList();
|
||||||
|
}
|
||||||
|
|
||||||
|
return <>
|
||||||
|
<Tooltip title={ t("actions.edit") as any }>
|
||||||
|
<IconButton onClick={ () => setOpen(true) }><Edit /></IconButton>
|
||||||
|
</Tooltip>
|
||||||
|
{ open && createPortal(
|
||||||
|
<EditStaticPageDialog open={ open } onSave={ handlePageCreation } page={ page } onClose={ () => setOpen(false) }/>,
|
||||||
|
document.getElementById("modals") as Element
|
||||||
|
) }
|
||||||
|
</>
|
||||||
|
}
|
||||||
|
|
||||||
const CreateStaticPageAction = () => {
|
const CreateStaticPageAction = () => {
|
||||||
const [ open, setOpen ] = useState<boolean>(false);
|
const [ open, setOpen ] = useState<boolean>(false);
|
||||||
|
|
||||||
@ -41,7 +61,7 @@ export const StaticPageManagement = () => {
|
|||||||
return <>
|
return <>
|
||||||
<Button variant="contained" color="primary" startIcon={ <Add /> } onClick={ () => setOpen(true) }>{ t("create") }</Button>
|
<Button variant="contained" color="primary" startIcon={ <Add /> } onClick={ () => setOpen(true) }>{ t("create") }</Button>
|
||||||
{ createPortal(
|
{ createPortal(
|
||||||
<CreateStaticPageDialog open={ open } onSave={ handlePageCreation } onClose={ () => setOpen(false) }/>,
|
<EditStaticPageDialog open={ open } onSave={ handlePageCreation } onClose={ () => setOpen(false) }/>,
|
||||||
document.getElementById("modals") as Element
|
document.getElementById("modals") as Element
|
||||||
) }
|
) }
|
||||||
</>
|
</>
|
||||||
@ -85,6 +105,7 @@ export const StaticPageManagement = () => {
|
|||||||
{
|
{
|
||||||
title: t("actions.label"),
|
title: t("actions.label"),
|
||||||
render: page => <Actions style={{ margin: "-1rem" }} spacing={ 0 }>
|
render: page => <Actions style={{ margin: "-1rem" }} spacing={ 0 }>
|
||||||
|
<EditStaticPageAction page={ page } />
|
||||||
<DeleteStaticPageAction page={ page } />
|
<DeleteStaticPageAction page={ page } />
|
||||||
<PreviewStaticPageAction page={ page } />
|
<PreviewStaticPageAction page={ page } />
|
||||||
</Actions>,
|
</Actions>,
|
||||||
|
@ -9,6 +9,7 @@ actions:
|
|||||||
label: Akcje
|
label: Akcje
|
||||||
preview: Podgląd
|
preview: Podgląd
|
||||||
delete: Usuń
|
delete: Usuń
|
||||||
|
edit: Edytuj
|
||||||
|
|
||||||
edition:
|
edition:
|
||||||
index:
|
index:
|
||||||
@ -28,3 +29,5 @@ page:
|
|||||||
slug: Adres
|
slug: Adres
|
||||||
create:
|
create:
|
||||||
title: Utwórz stronę statyczną
|
title: Utwórz stronę statyczną
|
||||||
|
edit:
|
||||||
|
title: Zmień stronę statyczną
|
||||||
|
12
yarn.lock
12
yarn.lock
@ -988,6 +988,18 @@
|
|||||||
lodash "^4.17.13"
|
lodash "^4.17.13"
|
||||||
to-fast-properties "^2.0.0"
|
to-fast-properties "^2.0.0"
|
||||||
|
|
||||||
|
"@ckeditor/ckeditor5-build-classic@^23.1.0":
|
||||||
|
version "23.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-build-classic/-/ckeditor5-build-classic-23.1.0.tgz#b358bd9c266727cd1504d16fb069ada43694e2e5"
|
||||||
|
integrity sha512-wqJZ6yuqm48NoiciRcfs+t73YOfIKovJIiLSHf0yB2I3Mc+bL6iNhwwyJ3b6D/22IgYEXTpc6PiwsYFbGFnq2Q==
|
||||||
|
|
||||||
|
"@ckeditor/ckeditor5-react@^3.0.0":
|
||||||
|
version "3.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-react/-/ckeditor5-react-3.0.0.tgz#05a1bdd7b26a8c1df6fd734376ea84e394d6ab47"
|
||||||
|
integrity sha512-kqoD0rbGeUp7CjYBtKcwXVVSWO/VL1QsoTyeGbFyoMHmkM96fBj0TI0Xs2kFqKkeiICtAnwvul3GVNWbIlK/Tw==
|
||||||
|
dependencies:
|
||||||
|
prop-types "^15.7.2"
|
||||||
|
|
||||||
"@csstools/convert-colors@^1.4.0":
|
"@csstools/convert-colors@^1.4.0":
|
||||||
version "1.4.0"
|
version "1.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7"
|
resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7"
|
||||||
|
Loading…
Reference in New Issue
Block a user