Continued creating the permission system

This commit is contained in:
Tiago Ribeiro
2024-10-11 10:47:35 +01:00
parent 55204e2ce1
commit a53ee79c0a
12 changed files with 196 additions and 121 deletions

View File

@@ -40,7 +40,7 @@ import {
BsTrash,
BsX,
} from "react-icons/bs";
import {toast, ToastContainer} from "react-toastify";
import {toast} from "react-toastify";
export const getServerSideProps = withIronSessionSsr(async ({req, params}) => {
const user = req.session.user as User;

View File

@@ -80,6 +80,14 @@ const ENTITY_MANAGEMENT: PermissionLayout[] = [
{label: "Delete Entity Role", key: "delete_entity_role"},
]
const ASSIGNMENT_MANAGEMENT: PermissionLayout[] = [
{label: "View Assignments", key: "view_assignments"},
{label: "Create Assignments", key: "create_assignment"},
{label: "Start Assignments", key: "start_assignment"},
{label: "Delete Assignments", key: "delete_assignment"},
{label: "Archive Assignments", key: "archive_assignment"},
]
export const getServerSideProps = withIronSessionSsr(async ({req, res, params}) => {
const user = await requestUser(req, res)
if (!user) return redirect("/login")
@@ -318,6 +326,26 @@ export default function Role({user, entity, role, userCount}: Props) {
)) }
</div>
</div>
<div className="flex flex-col gap-4">
<div className="w-full flex items-center justify-between">
<b>Assignment Management</b>
<Checkbox
isChecked={mapBy(ASSIGNMENT_MANAGEMENT, 'key').every(k => permissions.includes(k))}
onChange={() => mapBy(ASSIGNMENT_MANAGEMENT, 'key').forEach(togglePermissions)}
>
Select all
</Checkbox>
</div>
<Separator />
<div className="grid grid-cols-2 gap-4">
{ASSIGNMENT_MANAGEMENT.map(({label, key}) => (
<Checkbox disabled={!canEditPermissions} key={key} isChecked={permissions.includes(key)} onChange={() => togglePermissions(key)}>
{ label }
</Checkbox>
)) }
</div>
</div>
</section>
</section>
</Layout>

View File

@@ -9,7 +9,7 @@ import {shouldRedirectHome} from "@/utils/navigation.disabled";
import {getUserName} from "@/utils/users";
import {convertToUsers, getGroupsForUser} from "@/utils/groups.be";
import {countEntityUsers, getEntityUsers, getSpecificUsers} from "@/utils/users.be";
import {checkAccess, getTypesOfUser} from "@/utils/permissions";
import {checkAccess, findAllowedEntities, getTypesOfUser} from "@/utils/permissions";
import Link from "next/link";
import {uniq} from "lodash";
import {BsPlus} from "react-icons/bs";
@@ -18,7 +18,7 @@ import {getEntitiesWithRoles} from "@/utils/entities.be";
import {EntityWithRoles} from "@/interfaces/entity";
import Separator from "@/components/Low/Separator";
import { requestUser } from "@/utils/api";
import { redirect } from "@/utils";
import { mapBy, redirect, serialize } from "@/utils";
type EntitiesWithCount = {entity: EntityWithRoles; users: User[]; count: number};
@@ -28,16 +28,16 @@ export const getServerSideProps = withIronSessionSsr(async ({req, res}) => {
if (shouldRedirectHome(user)) return redirect("/")
const entities = await getEntitiesWithRoles(
checkAccess(user, getTypesOfUser(["admin", "developer"])) ? user.entities.map((x) => x.id) : undefined,
);
const entityIDs = mapBy(user.entities, 'id')
const entities = await getEntitiesWithRoles(entityIDs);
const allowedEntities = findAllowedEntities(user, entities, 'view_entities')
const entitiesWithCount = await Promise.all(
entities.map(async (e) => ({entity: e, count: await countEntityUsers(e.id), users: await getEntityUsers(e.id, 5)})),
allowedEntities.map(async (e) => ({entity: e, count: await countEntityUsers(e.id), users: await getEntityUsers(e.id, 5)})),
);
return {
props: {user, entities: JSON.parse(JSON.stringify(entitiesWithCount))},
props: serialize({user, entities: entitiesWithCount}),
};
}, sessionOptions);