Skip to content
Snippets Groups Projects
Commit bd71b63e626f authored by Arnaud Vergnet's avatar Arnaud Vergnet :sun_with_face:
Browse files

feat(frontend): allow creating data services

parent 8d76d2f9676f
No related branches found
No related tags found
1 merge request!12feat(frontend): Connect frontend to cw instance
import { client } from "@/constants/cubicweb"; import { client } from "@/constants/cubicweb";
import { Project } from "@/types"; import { DataService, Project } from "@/types";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
export function login(login: string, password: string) { export function login(login: string, password: string) {
...@@ -21,3 +21,9 @@ ...@@ -21,3 +21,9 @@
"INSERT ImportProcedure X: X name %(name)s, X sparql_endpoint %(sparql_endpoint)s, X activated %(activated)s"; "INSERT ImportProcedure X: X name %(name)s, X sparql_endpoint %(sparql_endpoint)s, X activated %(activated)s";
return client.execute(rql, data); return client.execute(rql, data);
} }
export async function createDataService(data: Omit<DataService, "eid">) {
const rql =
"INSERT DataService X: X name %(name)s, X data_url %(data_url)s, X refresh_period %(refresh_period)s, X description %(description)s";
return client.execute(rql, data);
}
...@@ -99,8 +99,8 @@ ...@@ -99,8 +99,8 @@
<DataServiceCard <DataServiceCard
key={i} key={i}
name={d.name} name={d.name}
data_url={d.dataUrl} data_url={d.data_url}
refresh_prediod={d.refreshPeriod} refresh_prediod={d.refresh_period}
onOpen={() => { onOpen={() => {
router.push("/data-service/" + d.eid); router.push("/data-service/" + d.eid);
}} }}
......
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
<RecipeCard <RecipeCard
key={i} key={i}
name={d.name} name={d.name}
processType={d.processType} processType={d.process_type}
lastProcessDate={new Date()} lastProcessDate={new Date()}
lastProcessSuccess={true} lastProcessSuccess={true}
onOpen={() => { onOpen={() => {
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
InputLabel, InputLabel,
Select, Select,
MenuItem, MenuItem,
Button, FormHelperText,
} from "@mui/material"; } from "@mui/material";
import SaveIcon from "@mui/icons-material/Save"; import SaveIcon from "@mui/icons-material/Save";
import { DataService } from "@/types"; import { DataService } from "@/types";
...@@ -10,8 +10,13 @@ ...@@ -10,8 +10,13 @@
} from "@mui/material"; } from "@mui/material";
import SaveIcon from "@mui/icons-material/Save"; import SaveIcon from "@mui/icons-material/Save";
import { DataService } from "@/types"; import { DataService } from "@/types";
import { Controller, SubmitHandler, useForm } from "react-hook-form";
import { useState } from "react";
import { useRouter } from "next/navigation";
import { createDataService } from "@/api/cubicweb";
import { LoadingButton } from "@mui/lab";
export interface DataServiceFormProps { export interface DataServiceFormProps {
dataService?: DataService; dataService?: DataService;
} }
...@@ -13,6 +18,13 @@ ...@@ -13,6 +18,13 @@
export interface DataServiceFormProps { export interface DataServiceFormProps {
dataService?: DataService; dataService?: DataService;
} }
interface FormData {
name: string;
data_url: string;
refresh_period: "daily" | "weekly" | "monthly";
description: string;
}
export function DataServiceForm({ dataService }: DataServiceFormProps) { export function DataServiceForm({ dataService }: DataServiceFormProps) {
...@@ -18,2 +30,21 @@ ...@@ -18,2 +30,21 @@
export function DataServiceForm({ dataService }: DataServiceFormProps) { export function DataServiceForm({ dataService }: DataServiceFormProps) {
const [loading, setLoading] = useState(false);
const { handleSubmit, control } = useForm<FormData>({
defaultValues: dataService
? dataService
: {
refresh_period: "weekly",
},
});
const router = useRouter();
const onSubmit: SubmitHandler<FormData> = async (data) => {
setLoading(true);
const result = await createDataService(data);
const eid = result[0][0];
setLoading(false);
router.push(`/data-service/${eid}`);
};
return ( return (
...@@ -19,22 +50,97 @@ ...@@ -19,22 +50,97 @@
return ( return (
<Stack spacing={2}> <form onSubmit={handleSubmit(onSubmit)}>
{!dataService ? <TextField label="Nom" fullWidth /> : null} <Stack spacing={2}>
<Stack direction={"row"} spacing={2}> {!dataService ? (
<TextField label="Url" value={dataService?.dataUrl} fullWidth /> <Controller
<Box minWidth={200}> name="name"
<FormControl fullWidth> control={control}
<InputLabel id="update-freq-label"> rules={{ required: true }}
Fréquence de mise à jour render={({ field, fieldState: { error } }) => (
</InputLabel> <TextField
<Select label="Nom"
labelId="update-freq-label" required={true}
value={0} disabled={loading}
label="Fréquence de mise à jour" {...field}
> error={error !== undefined}
<MenuItem value={0}>Journalier</MenuItem> helperText={
<MenuItem value={1}>Hebdomadaire</MenuItem> error?.type === "required" ? "Champ requis" : error?.message
<MenuItem value={2}>Mensuel</MenuItem> }
</Select> />
</FormControl> )}
/>
) : null}
<Stack direction={"row"} spacing={2}>
<Controller
name="data_url"
control={control}
rules={{ required: true }}
render={({ field, fieldState: { error } }) => (
<TextField
label="Data URL"
required={true}
disabled={loading}
{...field}
error={error !== undefined}
helperText={
error?.type === "required" ? "Champ requis" : error?.message
}
fullWidth
/>
)}
/>
<Box minWidth={200}>
<Controller
name="refresh_period"
control={control}
rules={{ required: true }}
render={({ field, fieldState: { error } }) => (
<FormControl fullWidth>
<InputLabel id="update-freq-label">
Fréquence de mise à jour
</InputLabel>
<Select
labelId="update-freq-label"
label="Fréquence de mise à jour"
{...field}
error={error !== undefined}
disabled={loading}
>
<MenuItem value={"daily"}>Journalier</MenuItem>
<MenuItem value={"weekly"}>Hebdomadaire</MenuItem>
<MenuItem value={"monthly"}>Mensuel</MenuItem>
</Select>
{error ? (
<FormHelperText error={true}>
{error?.message}
</FormHelperText>
) : null}
</FormControl>
)}
/>
</Box>
</Stack>
<Controller
name="description"
control={control}
render={({ field, fieldState: { error } }) => (
<TextField
label="Description"
disabled={loading}
{...field}
error={error !== undefined}
helperText={error?.message}
fullWidth
/>
)}
/>
<Box display={"flex"} flexDirection={"row-reverse"}>
<LoadingButton
variant="contained"
startIcon={<SaveIcon />}
loading={loading}
type="submit"
>
{dataService ? "Sauvegarder" : "Ajouter"}
</LoadingButton>
</Box> </Box>
</Stack> </Stack>
...@@ -39,11 +145,5 @@ ...@@ -39,11 +145,5 @@
</Box> </Box>
</Stack> </Stack>
<TextField label="Description" fullWidth multiline /> </form>
<Box display={"flex"} flexDirection={"row-reverse"}>
<Button variant="contained" startIcon={<SaveIcon />}>
{dataService ? "Sauvegarder" : "Ajouter"}
</Button>
</Box>
</Stack>
); );
} }
...@@ -28,9 +28,9 @@ ...@@ -28,9 +28,9 @@
{ {
eid: 1, eid: 1,
name: "Syracuse", name: "Syracuse",
dataUrl: "https://syracuse.fr", data_url: "https://syracuse.fr",
refreshPeriod: "weekly", refresh_period: "weekly",
}, },
{ {
eid: 2, eid: 2,
name: "Syracuse Preprod", name: "Syracuse Preprod",
...@@ -33,10 +33,10 @@ ...@@ -33,10 +33,10 @@
}, },
{ {
eid: 2, eid: 2,
name: "Syracuse Preprod", name: "Syracuse Preprod",
dataUrl: "https://preprod.syracuse.fr", data_url: "https://preprod.syracuse.fr",
refreshPeriod: "weekly", refresh_period: "weekly",
}, },
{ {
eid: 3, eid: 3,
name: "ONB", name: "ONB",
...@@ -39,9 +39,9 @@ ...@@ -39,9 +39,9 @@
}, },
{ {
eid: 3, eid: 3,
name: "ONB", name: "ONB",
dataUrl: "https://onb.opera.fr", data_url: "https://onb.opera.fr",
refreshPeriod: "weekly", refresh_period: "weekly",
}, },
]; ];
...@@ -49,8 +49,8 @@ ...@@ -49,8 +49,8 @@
{ {
eid: 1, eid: 1,
name: "Syracuse", name: "Syracuse",
processType: "default", process_type: "default",
}, },
{ {
eid: 2, eid: 2,
name: "Syracuse Preprod", name: "Syracuse Preprod",
...@@ -53,9 +53,9 @@ ...@@ -53,9 +53,9 @@
}, },
{ {
eid: 2, eid: 2,
name: "Syracuse Preprod", name: "Syracuse Preprod",
processType: "default-dryrun", process_type: "default-dryrun",
}, },
{ {
eid: 3, eid: 3,
name: "ONB", name: "ONB",
...@@ -58,11 +58,11 @@ ...@@ -58,11 +58,11 @@
}, },
{ {
eid: 3, eid: 3,
name: "ONB", name: "ONB",
processType: "default", process_type: "default",
}, },
]; ];
export const DATA_SERVICE: DataService = { export const DATA_SERVICE: DataService = {
eid: 1, eid: 1,
name: "Syracuse", name: "Syracuse",
...@@ -63,11 +63,11 @@ ...@@ -63,11 +63,11 @@
}, },
]; ];
export const DATA_SERVICE: DataService = { export const DATA_SERVICE: DataService = {
eid: 1, eid: 1,
name: "Syracuse", name: "Syracuse",
dataUrl: "https://syracuse.fr", data_url: "https://syracuse.fr",
refreshPeriod: "weekly", refresh_period: "weekly",
}; };
export const PROJECT: Project = { export const PROJECT: Project = {
......
...@@ -8,11 +8,11 @@ ...@@ -8,11 +8,11 @@
export interface DataService { export interface DataService {
eid: number; eid: number;
name: string; name: string;
dataUrl: string; data_url: string;
refreshPeriod: "daily" | "weekly" | "monthly"; refresh_period: "daily" | "weekly" | "monthly";
description?: string; description?: string;
} }
export interface Recipe { export interface Recipe {
eid: number; eid: number;
name: string; name: string;
...@@ -13,8 +13,8 @@ ...@@ -13,8 +13,8 @@
description?: string; description?: string;
} }
export interface Recipe { export interface Recipe {
eid: number; eid: number;
name: string; name: string;
processType: "default" | "default-dryrun"; process_type: "default" | "default-dryrun";
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment