diff --git a/components/Section/Calendario/Forms/Form1.vue b/components/Section/Calendario/Forms/Form1.vue index a9a161fe..50c4dc81 100644 --- a/components/Section/Calendario/Forms/Form1.vue +++ b/components/Section/Calendario/Forms/Form1.vue @@ -1,91 +1,230 @@ +const props = withDefaults(defineProps(), { + editId: null, +}); + +// + +const editIdRef = toRef(props, 'editId'); + + +const apiClient = useApiClient(); +const queryClient = useQueryClient(); +const { curso: currentCurso } = await useApiCursosFindOne(editIdRef); + +type FormValues = { + imagem: Blob | null | undefined; + + modalidade: { + id: string | null; + }; + campus: { + id: string | null; + }; + + nome: string; + + nomeAbreviado: string; +}; + +type FormOutput = { + imagem: Blob | null | undefined; + + modalidade: { + id: string; + }; + campus: { + id: string; + }; + + nome: string; + + nomeAbreviado: string; +}; + +const initialFormValues = reactive({ + imagem: null, + modalidade: { + id: currentCurso.value?.modalidade?.id ?? null, + }, + + campus: { + id: currentCurso.value?.campus?.id ?? null, + }, + nome: currentCurso.value?.nome ?? '', + nomeAbreviado: currentCurso.value?.nomeAbreviado ?? '', +}); + +const handleDelete = async () => { + const id = editIdRef.value; + + if (!id) return; + + const resposta = window.confirm( + 'Você tem certeza de que deseja deletar esse curso?' + ); + + if (resposta) { + await apiClient.cursos.cursoDeleteById({ id: id }); + await queryClient.invalidateQueries({ queryKey: ['cursos'] }); + $emit('close'); + } +}; + +const schema = yup.object().shape({ + imagem: yup.mixed().nullable().optional(), + modalidade: yup.object().shape({ + id: yup.string().required('Modalidade é obrigatório!'), + }), + campus: yup.object().shape({ + id: yup.string().required('Campus é obrigatório!'), + }), + + nome: yup.string().required('Nome do bloco é obrigatório!'), + nomeAbreviado: yup + .string() + .required('Nome abreviado do bloco é obrigatório!'), +}); + +const { + resetForm, + handleSubmit, + setFieldValue, + values: formValues, +} = useForm({ + validationSchema: schema, + initialValues: initialFormValues, +}); + +const onSubmit = handleSubmit(async (values: FormOutput) => { + const editId = editIdRef.value; + + const { imagem, ...data } = values; + + let id; + + if (editId === null) { + const cursoCriado = await apiClient.cursos.cursoCreate({ + requestBody: { ...data }, + }); + + id = cursoCriado.id; + } else { + await apiClient.cursos.cursoUpdateById({ + id: editId, + + requestBody: { + ...values, + }, + }); + + id = editId; + } + + if (imagem) { + await apiClient.cursos.cursoSetCoverImage({ + id: id, + formData: { + file: imagem, + }, + }); + } + + await queryClient.invalidateQueries({ + queryKey: ['cursos'], + }); + + resetForm(); + $emit('close'); +}, console.error); + +const nome = computed({ + get: () => formValues.nome, + set: (value) => { + formValues.nome = value; + }, +}); + - diff --git a/components/Section/Calendario/Forms/Form2.vue b/components/Section/Calendario/Forms/Form2.vue index 5c6b109c..d94191d8 100644 --- a/components/Section/Calendario/Forms/Form2.vue +++ b/components/Section/Calendario/Forms/Form2.vue @@ -1,232 +1,98 @@ + - -'' \ No newline at end of file + +.date-fields { + display: flex; /* Habilita o Flexbox */ + gap: 20px; /* Espaçamento entre os campos */ +} + +.date-fields .v-text-field { + flex: 1; /* Faz com que cada campo de data ocupe espaço igual */ +} + + \ No newline at end of file diff --git a/components/Section/Calendario/Forms/Form3.vue b/components/Section/Calendario/Forms/Form3.vue index e0c58efc..7854b577 100644 --- a/components/Section/Calendario/Forms/Form3.vue +++ b/components/Section/Calendario/Forms/Form3.vue @@ -13,6 +13,10 @@ const calendario = ref({ fim: '', }); +const backform = () => { + $emit('back'); // Emitir o evento de próximo +}; + const closeForm = () => { $emit('close'); }; @@ -21,7 +25,7 @@ const nextForm = () => { $emit('next'); }; -const $emit = defineEmits(['close', 'next']); +const $emit = defineEmits(['close', 'next', 'back']);