Cleared of the stuff the EnCoach team wanted changed

This commit is contained in:
Tiago Ribeiro
2024-10-28 14:40:26 +00:00
parent 0becd295b0
commit fa0c502467
34 changed files with 166 additions and 107 deletions

View File

@@ -20,6 +20,8 @@ import Modal from "@/components/Modal";
import {checkAccess} from "@/utils/permissions";
import useGroups from "@/hooks/useGroups";
import Button from "@/components/Low/Button";
import { EntityWithRoles } from "@/interfaces/entity";
import { useAllowedEntities } from "@/hooks/useEntityPermissions";
const searchFields = [["module"], ["id"], ["createdBy"]];
@@ -56,13 +58,36 @@ const ExamOwnerSelector = ({options, exam, onSave}: {options: User[]; exam: Exam
);
};
export default function ExamList({user}: {user: User}) {
export default function ExamList({user, entities = []}: {user: User, entities: EntityWithRoles[]}) {
const [selectedExam, setSelectedExam] = useState<Exam>();
const {exams, reload} = useExams();
const {users} = useUsers();
const {groups} = useGroups({admin: user?.id, userType: user?.type});
const canViewReading = useAllowedEntities(user, entities, 'view_reading')
const canViewListening = useAllowedEntities(user, entities, 'view_listening')
const canViewWriting = useAllowedEntities(user, entities, 'view_writing')
const canViewSpeaking = useAllowedEntities(user, entities, 'view_speaking')
const canViewLevel = useAllowedEntities(user, entities, 'view_level')
const canDeleteReading = useAllowedEntities(user, entities, 'delete_reading')
const canDeleteListening = useAllowedEntities(user, entities, 'delete_listening')
const canDeleteWriting = useAllowedEntities(user, entities, 'delete_writing')
const canDeleteSpeaking = useAllowedEntities(user, entities, 'delete_speaking')
const canDeleteLevel = useAllowedEntities(user, entities, 'delete_level')
const modulePermissions = useMemo(() => ({
reading: {view: canViewReading.length > 0, delete: canDeleteReading.length > 0},
listening: {view: canViewListening.length > 0, delete: canDeleteListening.length > 0},
writing: {view: canViewWriting.length > 0, delete: canDeleteWriting.length > 0},
speaking: {view: canViewSpeaking.length > 0, delete: canDeleteSpeaking.length > 0},
level: {view: canViewLevel.length > 0, delete: canDeleteLevel.length > 0},
}),
[
canDeleteLevel.length, canDeleteListening.length, canDeleteReading.length, canDeleteSpeaking.length, canDeleteWriting.length, canViewLevel.length, canViewListening.length, canViewReading.length, canViewSpeaking.length, canViewWriting.length
])
const filteredCorporates = useMemo(() => {
const participantsAndAdmins = uniq(groups.flatMap((x) => [...x.participants, x.admin])).filter((x) => x !== user?.id);
return users.filter((x) => participantsAndAdmins.includes(x.id) && x.type === "corporate");
@@ -84,7 +109,10 @@ export default function ExamList({user}: {user: User}) {
});
}, [exams, users]);
const {rows: filteredRows, renderSearch} = useListSearch<Exam>(searchFields, parsedExams);
const filteredExams = useMemo(() => parsedExams.filter(({module}) => modulePermissions[module].view),
[parsedExams, modulePermissions])
const {rows: filteredRows, renderSearch} = useListSearch<Exam>(searchFields, filteredExams);
const setExams = useExamStore((state) => state.setExams);
const setSelectedModules = useExamStore((state) => state.setSelectedModules);
@@ -104,7 +132,7 @@ export default function ExamList({user}: {user: User}) {
setExams([exam]);
setSelectedModules([module]);
router.push("/exercises");
router.push("/exam");
};
const privatizeExam = async (exam: Exam) => {
@@ -245,7 +273,7 @@ export default function ExamList({user}: {user: User}) {
onClick={async () => await loadExam(row.original.module, row.original.id)}>
<BsUpload className="hover:text-mti-purple-light transition ease-in-out duration-300" />
</button>
{PERMISSIONS.examManagement.delete.includes(user.type) && (
{modulePermissions[row.original.module].delete && (
<div data-tip="Delete" className="cursor-pointer tooltip" onClick={() => deleteExam(row.original)}>
<BsTrash className="hover:text-mti-purple-light transition ease-in-out duration-300" />
</div>