Skip to content

Commit

Permalink
feat: Mahdollista aineistojen lisäys pääkategorioihin (#286)
Browse files Browse the repository at this point in the history
  • Loading branch information
tkork committed Jun 28, 2022
1 parent 8adc0be commit 96cc8c2
Show file tree
Hide file tree
Showing 9 changed files with 275 additions and 20 deletions.
1 change: 1 addition & 0 deletions backend/src/handler/projektiAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -538,6 +538,7 @@ function adaptAineistotToSave(
// Update existing one
dbAineisto.nimi = updateAineistoInput.nimi;
dbAineisto.jarjestys = updateAineistoInput.jarjestys;
dbAineisto.kategoriaId = updateAineistoInput.kategoriaId;
resultAineistot.push(dbAineisto);
}
if (!updateAineistoInput) {
Expand Down
4 changes: 4 additions & 0 deletions common/aineistoKategoriat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ export class AineistoKategoria {
public get hakulauseet() {
return this.props.hakulauseet;
}

public get nimi() {
return this.props.nimi;
}
}

export class AineistoKategoriat {
Expand Down
8 changes: 7 additions & 1 deletion src/components/ExtLink.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,12 @@ const ExtLink = (
</Anchor>
);

const Anchor = styled("a")({ display: "flex", flexFlow: "row wrap" });
const Anchor = styled("a")({
display: "flex",
flexFlow: "row",
alignItems: "flex-start",
textAlign: "left",
justifyContent: "flex-start",
});

export default React.forwardRef(ExtLink);
4 changes: 2 additions & 2 deletions src/components/HassuAccordion.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ const AccordionDetails = styled(MuiAccordionDetails)(({ theme }) => ({
}));

interface AccordionItem {
title: string;
title: string | JSX.Element;
content: ReactNode | string;
id?: Key;
}
Expand Down Expand Up @@ -88,7 +88,7 @@ export default function CustomizedAccordions(props: Props) {
onChange={handleChange(key)}
>
<AccordionSummary>
<span className="vayla-smallest-title">{item.title}</span>
{typeof item.title === "string" ? <span className="vayla-smallest-title">{item.title}</span> : item.title}
</AccordionSummary>
<AccordionDetails>{item.content}</AccordionDetails>
</Accordion>
Expand Down
8 changes: 7 additions & 1 deletion src/components/form/Select.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,17 @@ import React from "react";
import { FieldError } from "react-hook-form";
import FormGroup from "./FormGroup";

export interface SelectOption {
label: string;
value: string;
disabled?: boolean;
}

interface Props {
error?: FieldError;
label?: string;
hideErrorMessage?: boolean;
options: { label: string; value: string; disabled?: boolean }[];
options: SelectOption[];
addEmptyOption?: boolean;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@ import { removeTypeName } from "src/util/removeTypeName";
import Lukunakyma from "./Lukunakyma";
import useKirjaamoOsoitteet from "src/hooks/useKirjaamoOsoitteet";

function defaultValues(projekti: Projekti, kirjaamoOsoitteet: KirjaamoOsoite[] | undefined) {
function defaultValues(
projekti: Projekti,
kirjaamoOsoitteet: KirjaamoOsoite[] | undefined
): KuulutuksenTiedotFormValues {
return {
oid: projekti.oid,
nahtavillaoloVaihe: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,39 @@ import Button from "@components/button/Button";
import HassuSpinner from "@components/HassuSpinner";
import Section from "@components/layout/Section";
import { Stack } from "@mui/material";
import { api } from "@services/api";
import { api, TallennaProjektiInput } from "@services/api";
import log from "loglevel";
import React, { useState } from "react";
import { useFormContext } from "react-hook-form";
import { useProjektiRoute } from "src/hooks/useProjektiRoute";
import useSnackbars from "src/hooks/useSnackbars";
import deleteFieldArrayIds from "src/util/deleteFieldArrayIds";
import { NahtavilleAsetettavatAineistotFormValues } from "./NahtavilleAsetettavatAineistot";

const mapFormValuesToTallennaProjektiInput = (
formData: NahtavilleAsetettavatAineistotFormValues
): TallennaProjektiInput => {
const aineistoNahtavilla = Object.values(formData.aineistoNahtavilla).flat();
deleteFieldArrayIds(aineistoNahtavilla);
return { oid: formData.oid, nahtavillaoloVaihe: { aineistoNahtavilla } };
};

export default function NahtavillaoloPainikkeet() {
const { mutate: reloadProjekti } = useProjektiRoute();
const [isFormSubmitting, setIsFormSubmitting] = useState(false);
const { showSuccessMessage, showErrorMessage } = useSnackbars();

const { handleSubmit } = useFormContext<any>();
const { handleSubmit } = useFormContext<NahtavilleAsetettavatAineistotFormValues>();

const saveSuunnitteluvaihe = async (formData: any) => {
const saveSuunnitteluvaihe = async (formData: TallennaProjektiInput) => {
await api.tallennaProjekti(formData);
if (reloadProjekti) await reloadProjekti();
};

const saveDraft = async (formData: any) => {
const saveDraft = async (formData: NahtavilleAsetettavatAineistotFormValues) => {
setIsFormSubmitting(true);
try {
await saveSuunnitteluvaihe(formData);
await saveSuunnitteluvaihe(mapFormValuesToTallennaProjektiInput(formData));
showSuccessMessage("Tallennus onnistui!");
} catch (e) {
log.error("OnSubmit Error", e);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,56 @@
import { yupResolver } from "@hookform/resolvers/yup";
import { TallennaProjektiInput } from "@services/api";
import { Aineisto, AineistoInput, TallennaProjektiInput } from "@services/api";
import React, { useEffect } from "react";
import { UseFormProps, useForm, FormProvider } from "react-hook-form";
import { useProjektiRoute } from "src/hooks/useProjektiRoute";
import { nahtavillaoloAineistotSchema } from "src/schemas/nahtavillaoloAineistot";
import NahtavillaoloPainikkeet from "./NahtavillaoloPainikkeet";
import LausuntopyyntoonLiitettavaLisaaineisto from "./LausuntopyyntoonLiitettavaLisaaineisto";
import SuunnitelmatJaAineistot from "./SuunnitelmatJaAineistot";
import { ProjektiLisatiedolla } from "src/hooks/useProjekti";
import { AineistoKategoria, aineistoKategoriat } from "common/aineistoKategoriat";

type Props = {};
type AineistoNahtavilla = {
aineistoNahtavilla: {
[kategoriaId: string]: AineistoInput[];
};
};

export type NahtavilleAsetettavatAineistotFormValues = Pick<TallennaProjektiInput, "oid"> & AineistoNahtavilla;

export type NahtavilleAsetettavatAineistotFormValues = Pick<TallennaProjektiInput, "oid">;
const addAineistoKategoria = (
aineistoNahtavilla: AineistoNahtavilla["aineistoNahtavilla"],
kategoria: AineistoKategoria,
allAineisto: Aineisto[] | undefined | null
) => {
const aineisto: Aineisto[] = allAineisto?.filter(({ kategoriaId }) => kategoriaId === kategoria.id) || [];
aineistoNahtavilla[kategoria.id] = aineisto.map<AineistoInput>(({ dokumenttiOid, jarjestys, nimi, kategoriaId }) => ({
dokumenttiOid,
nimi,
jarjestys,
kategoriaId,
}));
// Uncomment to add alakategoriat recursively
// kategoria.alaKategoriat?.forEach((k) => addAineistoKategoria(aineistoNahtavilla, k));
};

export default function NahtavilleAsetettavatAineistot({}: Props) {
function defaultValues(projekti: ProjektiLisatiedolla): NahtavilleAsetettavatAineistotFormValues {
const aineistoNahtavilla = aineistoKategoriat
.listKategoriat()
.reduce<AineistoNahtavilla["aineistoNahtavilla"]>((aineistot, currentKategoria) => {
addAineistoKategoria(aineistot, currentKategoria, projekti.nahtavillaoloVaihe?.aineistoNahtavilla);
return aineistot;
}, {});

return {
oid: projekti.oid,
aineistoNahtavilla,
};
}

export default function NahtavilleAsetettavatAineistot() {
const { data: projekti } = useProjektiRoute();

const formOptions: UseFormProps<NahtavilleAsetettavatAineistotFormValues> = {
resolver: yupResolver(nahtavillaoloAineistotSchema, { abortEarly: false, recursive: true }),
mode: "onChange",
Expand All @@ -25,9 +62,8 @@ export default function NahtavilleAsetettavatAineistot({}: Props) {

useEffect(() => {
if (projekti?.oid) {
const tallentamisTiedot: NahtavilleAsetettavatAineistotFormValues = {
oid: projekti.oid,
};
const tallentamisTiedot = defaultValues(projekti);
console.log({ tallentamisTiedot });
reset(tallentamisTiedot);
}
}, [projekti, reset]);
Expand Down
Loading

0 comments on commit 96cc8c2

Please sign in to comment.