Skip to content
Snippets Groups Projects
Commit efd239ad authored by pwa21's avatar pwa21 Committed by Richard Fernando Heise Ferreira
Browse files

Issue #99: ADD homologation system

parent 838ca151
No related branches found
No related tags found
1 merge request!112Issue #99: ADD homologation system
Pipeline #38180 passed
...@@ -28,14 +28,13 @@ export default function Edit({ params }) { ...@@ -28,14 +28,13 @@ export default function Edit({ params }) {
} }
}) })
.then(({ data }) => { .then(({ data }) => {
console.log("aaa", userData)
setUserData(data); setUserData(data);
}) })
.catch((error) => console.error(error)) .catch((error) => console.error(error))
} }
fetchUser(params.id) fetchUser(params.id)
}, [params.id, token, client, uid]) }, [params.id, token, client, uid, loginBarrier])
const ErrorEdit = () => { const ErrorEdit = () => {
return ( return (
......
...@@ -126,7 +126,7 @@ export default function LoginForm({ ...@@ -126,7 +126,7 @@ export default function LoginForm({
variant="outlined" variant="outlined"
className="mt-2 bg-white border-white text-main-text normal-case flex gap-2 w-96 hover:bg-main-hover" className="mt-2 bg-white border-white text-main-text normal-case flex gap-2 w-96 hover:bg-main-hover"
> >
<Image className="w-6 h-6" src="/google.svg" width={10} height={10} /> <Image className="w-6 h-6" src="/google.svg" width={10} height={10} alt="Google" />
<span>Entrar com o Google</span> <span>Entrar com o Google</span>
</Button> </Button>
<SignupModal open={openModalSignup} handleClose={handleCloseModalSignup} /> <SignupModal open={openModalSignup} handleClose={handleCloseModalSignup} />
......
...@@ -4,6 +4,7 @@ import CardMedia from "@mui/material/CardMedia"; ...@@ -4,6 +4,7 @@ import CardMedia from "@mui/material/CardMedia";
import Avatar from "@mui/material/Avatar"; import Avatar from "@mui/material/Avatar";
import Typography from "@mui/material/Typography"; import Typography from "@mui/material/Typography";
import Link from "next/link"; import Link from "next/link";
import { useRouter } from "next/navigation";
const getDefaultThumbnail = (type) => { const getDefaultThumbnail = (type) => {
let thumbnail_url; let thumbnail_url;
...@@ -50,6 +51,9 @@ const getDefaultThumbnail = (type) => { ...@@ -50,6 +51,9 @@ const getDefaultThumbnail = (type) => {
* @returns Cards de recursos para homologação * @returns Cards de recursos para homologação
*/ */
export default function CardsHomologation({ item, key }) { export default function CardsHomologation({ item, key }) {
const router = useRouter()
console.log(item)
return ( return (
<Card <Card
className="transition items-center mt-5 mx-2 min-h-[320px]" className="transition items-center mt-5 mx-2 min-h-[320px]"
...@@ -116,6 +120,7 @@ export default function CardsHomologation({ item, key }) { ...@@ -116,6 +120,7 @@ export default function CardsHomologation({ item, key }) {
<div className="flex items-end"> <div className="flex items-end">
<Button variant="outlined" className=" " <Button variant="outlined" className=" "
alt='Avaliar' alt='Avaliar'
onClick={() => router.push(`/recurso/${item["learning_object"]["id"]}`)}
> >
Avaliar Avaliar
</Button> </Button>
......
...@@ -136,7 +136,7 @@ export default function GroupButton({ profileData, idLogin }) { ...@@ -136,7 +136,7 @@ export default function GroupButton({ profileData, idLogin }) {
onClick={() => { onClick={() => {
if (!loginBarrier()) return; if (!loginBarrier()) return;
if (profileData.complained){ if (complained){
setReported(true) setReported(true)
return; return;
} }
......
...@@ -14,6 +14,7 @@ import { useState, useEffect } from "react"; ...@@ -14,6 +14,7 @@ import { useState, useEffect } from "react";
import ShareModal from "../../../components/ShareModal"; import ShareModal from "../../../components/ShareModal";
import ReportModal from "./reportModal"; import ReportModal from "./reportModal";
import CollectModal from "./collectModal"; import CollectModal from "./collectModal";
import HomologationModal from "./homologationModal";
function ChangeOnHover({ text, textOnHover }) { function ChangeOnHover({ text, textOnHover }) {
return ( return (
...@@ -24,7 +25,7 @@ function ChangeOnHover({ text, textOnHover }) { ...@@ -24,7 +25,7 @@ function ChangeOnHover({ text, textOnHover }) {
); );
} }
export default function ActionButtons({ learningObject, setNeedLoginOpen }) { export default function ActionButtons({ learningObject, setNeedLoginOpen, state }) {
const [liked, setLiked] = useState(learningObject.liked); const [liked, setLiked] = useState(learningObject.liked);
const [shareOpen, setShareOpen] = useState(false); const [shareOpen, setShareOpen] = useState(false);
...@@ -32,6 +33,8 @@ export default function ActionButtons({ learningObject, setNeedLoginOpen }) { ...@@ -32,6 +33,8 @@ export default function ActionButtons({ learningObject, setNeedLoginOpen }) {
const [reported, setReported] = useState(false); const [reported, setReported] = useState(false);
const [collectOpen, setCollectOpen] = useState(false) const [collectOpen, setCollectOpen] = useState(false)
const [userData, setUserData] = useState(""); const [userData, setUserData] = useState("");
const [submitOpen, setSubmitOpen] = useState(false)
const [submitted, setSubmitted] = useState(state === "submitted" ? true : false)
const token = getStoredValue("access_token"); const token = getStoredValue("access_token");
const client = getStoredValue("client"); const client = getStoredValue("client");
...@@ -185,6 +188,7 @@ export default function ActionButtons({ learningObject, setNeedLoginOpen }) { ...@@ -185,6 +188,7 @@ export default function ActionButtons({ learningObject, setNeedLoginOpen }) {
return ( return (
<> <>
<HomologationModal open={submitOpen} onClose={() => setSubmitOpen(false)} name={learningObject.name} id={learningObject.submission_id} setSubmitted={setSubmitted}/>
<ShareModal open={shareOpen} onClose={() => setShareOpen(false)} /> <ShareModal open={shareOpen} onClose={() => setShareOpen(false)} />
<ReportModal <ReportModal
learningObject={learningObject} learningObject={learningObject}
...@@ -193,9 +197,17 @@ export default function ActionButtons({ learningObject, setNeedLoginOpen }) { ...@@ -193,9 +197,17 @@ export default function ActionButtons({ learningObject, setNeedLoginOpen }) {
/> />
{/* Verifica se o usuário está logado antes de abrir o modal de colecionar */} {/* Verifica se o usuário está logado antes de abrir o modal de colecionar */}
{userData && <CollectModal open={collectOpen} onClose={() => setCollectOpen(false)} idLogin={userData["id"]} resourceId={learningObject.id} />} {userData && <CollectModal open={collectOpen} onClose={() => setCollectOpen(false)} idLogin={userData["id"]} resourceId={learningObject.id} />}
{state !== "submitted" &&
<div className="flex justify-start py-4 flex-wrap overflow-x-auto"> <div className="flex justify-start py-4 flex-wrap overflow-x-auto">
{buttonInfo.map(genButton)} {buttonInfo.map(genButton)}
</div> </div>
}
{
submitted &&
<div className="flex justify-end pb-2 mt-2">
<button onClick={() => setSubmitOpen(true)} className="bg-orange p-2 text-white font-semi-bold rounded-lg hover:bg-orange-hover">Avaliar Submissão</button>
</div>
}
</> </>
); );
} }
import { getStoredValue } from "@/app/handlers/localStorageHandler";
import mecredApi from "@/axiosConfig";
import { FormControlLabel, Modal, Radio, RadioGroup, TextField } from "@mui/material";
import { useEffect, useState } from "react";
export default function HomologationModal({ open, onClose, name, id, setSubmitted }) {
const [questions, setQuestions] = useState([])
const [payload, setPayload] = useState([])
const [justification, setJustification] = useState("")
const [confirmOpen, setConfirmOpen] = useState(false)
const [notSucess, setNotSucess] = useState(false)
const token = getStoredValue("access_token");
const client = getStoredValue("client");
const uid = getStoredValue("uid");
let count = 0
useEffect(() => {
const fetchQuestions = async () => {
mecredApi.get("/questions")
.then((response) => {
setQuestions(response.data)
})
}
fetchQuestions()
}, [])
const handleJustification = (e) => {
setJustification(e.target.value)
}
const handleRadios = (e, id) => {
const obj = { question_id: id, accepted: e.target.value === "Sim" ? false : true }
setPayload((prev) => {
const index = prev.findIndex(item => item.question_id === id)
if (index !== -1) {
return prev.map((item) => item.question_id === id ? obj : item)
} else {
count++
return [...prev, obj]
}
})
}
const handleSubmit = (e) => {
e.preventDefault()
payload.sort((a, b) => a.question_id - b.question_id)
let payloadSub = {
"submission": {
"justification": justification,
"answers": payload
}
}
let headers = {
headers: {
"access-token": token,
"token-type": "Bearer",
client: client,
uid: uid,
Expires: 0,
}
}
// submission_id
mecredApi.post(`/submissions/${id}/answer`, payloadSub, headers)
setSubmitted(false)
setConfirmOpen(false)
onClose()
}
const ConfirmModal = ({ open, onClose }) => {
return (
<Modal
open={open}
onClose={onClose}
className="grid h-screen place-items-center mx-5"
>
<div className="flex flex-col bg-main p-5 rounded-lg ">
<p className="flex justify-center text-main-text font-bold text-2xl">Recurso a ser aprovado</p>
<p className="pt-3 text-lg text-main-text ">Este recurso será publicado na plataforma. Você confirma essa avaliação?</p>
<div className="flex flex-row justify-end pt-5">
<button onClick={() => onClose()} className="bg-main px-3 py-2 mr-1 rounded-lg text-main-text hover:bg-main-hover">Alterar avaliação</button>
<button onClick={handleSubmit} className="bg-secondary px-3 py-2 ml-1 rounded-lg text-white font-semibold hover:bg-secondary-hover">Confirmar</button>
</div>
</div>
</Modal>
)
}
const NotSucessModal = ({ open, onClose }) => {
return (
<Modal
open={open}
onClose={onClose}
className="grid h-screen place-items-center mx-5"
>
<div className="flex flex-col bg-main p-5 rounded-lg ">
<p className="pt-3 text-lg text-main-text ">É necessário que todas perguntas sejam respondidas.</p>
<div className="flex flex-row justify-end pt-5">
<button onClick={() => onClose()} className="bg-main px-3 py-2 mr-1 rounded-lg text-main-text hover:bg-main-hover">Ok</button>
</div>
</div>
</Modal>
)
}
return (
<>
<Modal
open={open}
onClose={onClose}
className="grid h-screen place-items-center mx-5"
>
<div className="flex flex-col bg-main p-5 rounded-lg">
<ConfirmModal open={confirmOpen} onClose={() => { setConfirmOpen(false) }} />
<NotSucessModal open={notSucess} onClose={() => { setNotSucess(false) }} />
<p className="flex justify-center text-2xl text-main-text font-bold pb-2">{`Você está avaliando a submissão ${name}`}</p>
<p className="text-main-text pb-4 pt-4 text-lg font-semibold">Esse recurso está em conformidade com os critérios? Marque as opções e justifique aquela(s) que não estiverem em conformidade.</p>
{questions.map((item, i) => {
return (
<div key={i} className="pb-4">
<p className="text-main-text text-lg" key={i}>{item.description}</p>
<RadioGroup row onChange={(e) => { handleRadios(e, item.id) }}>
<FormControlLabel value={"Não"} control={<Radio />} label="Não" className="text-main-text" />
<FormControlLabel value={"Sim"} control={<Radio />} label="Sim" className="text-main-text" />
</RadioGroup>
</div>
)
})}
{/* */}
<TextField
className=""
id="justificativa"
name="justificativa"
onChange={handleJustification}
maxRows={5}
multiline
label="Justificativa (opcional)"
variant="standard"
/>
<div className="flex justify-end mt-5">
<button onClick={onClose} className="bg-main px-3 py-2 mr-1 rounded-lg text-main-text hover:bg-main-hover">Cancelar</button>
<button onClick={() => { payload.length < 4 ? setNotSucess(true) : setConfirmOpen(true) }} className="bg-secondary px-3 py-2 ml-1 rounded-lg text-white font-semibold hover:bg-secondary-hover">Enviar</button>
</div>
</div>
</Modal>
</>
)
}
\ No newline at end of file
...@@ -13,11 +13,14 @@ import Loading from "@/app/components/Loading"; ...@@ -13,11 +13,14 @@ import Loading from "@/app/components/Loading";
import ResourcePreview from "./components/resourcePreview"; import ResourcePreview from "./components/resourcePreview";
import NeedLoginModal from "./components/needLoginModal"; import NeedLoginModal from "./components/needLoginModal";
import ErrorComponent from "@/app/components/ErrorComponent"; import ErrorComponent from "@/app/components/ErrorComponent";
import HomologationModal from "./components/homologationModal";
export default function Recurso({ params }) { export default function Recurso({ params }) {
const [learningObject, setLearningObject] = useState(undefined); const [learningObject, setLearningObject] = useState(undefined);
const [needLoginOpen, setNeedLoginOpen] = useState(false); const [needLoginOpen, setNeedLoginOpen] = useState(false);
const [error, setError] = useState(false) const [error, setError] = useState(false)
const [state, setState] = useState()
const [submitOpen, setSubmitOpen] = useState(false)
const token = getStoredValue("access_token"); const token = getStoredValue("access_token");
const client = getStoredValue("client"); const client = getStoredValue("client");
...@@ -42,6 +45,7 @@ export default function Recurso({ params }) { ...@@ -42,6 +45,7 @@ export default function Recurso({ params }) {
}) })
.then((response) => { .then((response) => {
setLearningObject(response.data); setLearningObject(response.data);
setState(response.data.state === "submitted" ? true : false)
}) })
.catch(() => { setError(true); }) .catch(() => { setError(true); })
}, [params.id, client, token, uid]); }, [params.id, client, token, uid]);
...@@ -56,6 +60,8 @@ export default function Recurso({ params }) { ...@@ -56,6 +60,8 @@ export default function Recurso({ params }) {
<Loading scroll /> <Loading scroll />
) : ( ) : (
<> <>
<HomologationModal open={submitOpen} onClose={() => setSubmitOpen(false)} name={learningObject.name} id={learningObject.submission_id} setSubmitted={setState} />
<NeedLoginModal open={needLoginOpen} setOpen={setNeedLoginOpen} /> <NeedLoginModal open={needLoginOpen} setOpen={setNeedLoginOpen} />
<div className="flex flex-col lg:flex-row"> <div className="flex flex-col lg:flex-row">
<div className="flex flex-col bg-main p-3 lg:w-[55%] flex-shrink-0"> <div className="flex flex-col bg-main p-3 lg:w-[55%] flex-shrink-0">
...@@ -63,17 +69,27 @@ export default function Recurso({ params }) { ...@@ -63,17 +69,27 @@ export default function Recurso({ params }) {
{/* Pré-visualização */} {/* Pré-visualização */}
<ResourcePreview learningObject={learningObject} /> <ResourcePreview learningObject={learningObject} />
</div> </div>
<div className="flex flex-row justify-between">
<div className="flex flex-col">
<div className="text-main-text mt-5 text-2xl font-bold"> <div className="text-main-text mt-5 text-2xl font-bold">
{/* Título */} {/* Título */}
<h1>{learningObject.name}</h1> <h1>{learningObject.name}</h1>
</div> </div>
<div className="text-main-text mt-3 text-sm font-bold"> <div className="text-main-text text-sm font-bold">
{/* tags */} {/* tags */}
<Tags tags={learningObject.tags} /> <Tags tags={learningObject.tags} />
</div> </div>
</div>
{state &&
<div className=" flex items-center mt-5">
<button onClick={() => setSubmitOpen(true)} className="bg-orange p-2 text-white font-semi-bold rounded-lg hover:bg-orange-hover">Avaliar Submissão</button>
</div>
}
</div>
<div className=""> <div className="">
{/* Modal de entrar */} {/* Modal de entrar */}
<ActionButtons learningObject={learningObject} setNeedLoginOpen={setNeedLoginOpen} /> <ActionButtons learningObject={learningObject} setNeedLoginOpen={setNeedLoginOpen} state={state} />
</div> </div>
<div className=""> <div className="">
{/* Publicador */} {/* Publicador */}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment