Renamed the admin type to corporate

This commit is contained in:
Tiago Ribeiro
2023-10-27 00:43:05 +01:00
parent 15f8d25bc9
commit 0aefbb85ec
11 changed files with 38 additions and 237 deletions

View File

@@ -2,30 +2,30 @@ import {Type} from "@/interfaces/user";
export const PERMISSIONS = { export const PERMISSIONS = {
generateCode: { generateCode: {
student: ["teacher", "admin", "developer", "owner"], student: ["teacher", "corporate", "developer", "owner"],
teacher: ["admin", "developer", "owner"], teacher: ["corporate", "developer", "owner"],
admin: ["owner", "developer"], corporate: ["owner", "developer"],
owner: ["developer", "owner"], owner: ["developer", "owner"],
developer: ["developer"], developer: ["developer"],
}, },
deleteUser: { deleteUser: {
student: ["teacher", "admin", "developer", "owner"], student: ["teacher", "corporate", "developer", "owner"],
teacher: ["admin", "developer", "owner"], teacher: ["corporate", "developer", "owner"],
admin: ["owner", "developer"], corporate: ["owner", "developer"],
owner: ["developer", "owner"], owner: ["developer", "owner"],
developer: ["developer"], developer: ["developer"],
}, },
updateUser: { updateUser: {
student: ["teacher", "admin", "developer", "owner"], student: ["teacher", "corporate", "developer", "owner"],
teacher: ["admin", "developer", "owner"], teacher: ["corporate", "developer", "owner"],
admin: ["owner", "developer"], corporate: ["owner", "developer"],
owner: ["developer", "owner"], owner: ["developer", "owner"],
developer: ["developer"], developer: ["developer"],
}, },
updateExpiryDate: { updateExpiryDate: {
student: ["developer", "owner"], student: ["developer", "owner"],
teacher: ["developer", "owner"], teacher: ["developer", "owner"],
admin: ["owner", "developer"], corporate: ["owner", "developer"],
owner: ["developer", "owner"], owner: ["developer", "owner"],
developer: ["developer"], developer: ["developer"],
}, },

View File

@@ -103,10 +103,10 @@ export default function OwnerDashboard({user}: Props) {
<BsArrowLeft className="text-xl" /> <BsArrowLeft className="text-xl" />
<span>Back</span> <span>Back</span>
</div> </div>
<h2 className="text-2xl font-semibold">Corporate ({users.filter((x) => x.type === "admin").length})</h2> <h2 className="text-2xl font-semibold">Corporate ({users.filter((x) => x.type === "corporate").length})</h2>
</div> </div>
<UserList user={user} filter={(x) => x.type === "admin"} /> <UserList user={user} filter={(x) => x.type === "corporate"} />
</> </>
); );
@@ -131,7 +131,7 @@ export default function OwnerDashboard({user}: Props) {
}; };
const InactiveCorporateList = () => { const InactiveCorporateList = () => {
const filter = (x: User) => x.type === "admin" && (x.isDisabled || moment().isAfter(x.subscriptionExpirationDate)); const filter = (x: User) => x.type === "corporate" && (x.isDisabled || moment().isAfter(x.subscriptionExpirationDate));
return ( return (
<> <>
@@ -177,7 +177,7 @@ export default function OwnerDashboard({user}: Props) {
<BsPersonFillGear className="text-mti-purple-light text-6xl" /> <BsPersonFillGear className="text-mti-purple-light text-6xl" />
<span className="flex flex-col gap-1 items-center text-xl"> <span className="flex flex-col gap-1 items-center text-xl">
<span className="text-lg">Corporate</span> <span className="text-lg">Corporate</span>
<span className="font-semibold text-mti-purple">{users.filter((x) => x.type === "admin").length}</span> <span className="font-semibold text-mti-purple">{users.filter((x) => x.type === "corporate").length}</span>
</span> </span>
</div> </div>
<div className="bg-white rounded-xl shadow p-4 flex flex-col gap-4 items-center w-52 h-52 justify-center cursor-pointer hover:shadow-xl transition ease-in-out duration-300"> <div className="bg-white rounded-xl shadow p-4 flex flex-col gap-4 items-center w-52 h-52 justify-center cursor-pointer hover:shadow-xl transition ease-in-out duration-300">
@@ -207,7 +207,7 @@ export default function OwnerDashboard({user}: Props) {
<span className="flex flex-col gap-1 items-center text-xl"> <span className="flex flex-col gap-1 items-center text-xl">
<span className="text-lg text-center">Inactive Corporate</span> <span className="text-lg text-center">Inactive Corporate</span>
<span className="font-semibold text-mti-rose"> <span className="font-semibold text-mti-rose">
{users.filter((x) => x.type === "admin" && (x.isDisabled || moment().isAfter(x.subscriptionExpirationDate))).length} {users.filter((x) => x.type === "corporate" && (x.isDisabled || moment().isAfter(x.subscriptionExpirationDate))).length}
</span> </span>
</span> </span>
</div> </div>
@@ -229,7 +229,7 @@ export default function OwnerDashboard({user}: Props) {
<span className="p-4">Latest corporate</span> <span className="p-4">Latest corporate</span>
<div className="flex flex-col items-start h-96 overflow-scroll scrollbar-hide"> <div className="flex flex-col items-start h-96 overflow-scroll scrollbar-hide">
{users {users
.filter((x) => x.type === "admin") .filter((x) => x.type === "corporate")
.sort((a, b) => dateSorter(a, b, "asc", "registrationDate")) .sort((a, b) => dateSorter(a, b, "asc", "registrationDate"))
.map((x) => ( .map((x) => (
<UserDisplay key={x.id} {...x} /> <UserDisplay key={x.id} {...x} />
@@ -240,7 +240,7 @@ export default function OwnerDashboard({user}: Props) {
<span className="p-4">Disabled Corporate</span> <span className="p-4">Disabled Corporate</span>
<div className="flex flex-col items-start h-96 overflow-scroll scrollbar-hide"> <div className="flex flex-col items-start h-96 overflow-scroll scrollbar-hide">
{users {users
.filter((x) => x.type === "admin" && x.isDisabled) .filter((x) => x.type === "corporate" && x.isDisabled)
.map((x) => ( .map((x) => (
<UserDisplay key={x.id} {...x} /> <UserDisplay key={x.id} {...x} />
))} ))}
@@ -282,7 +282,7 @@ export default function OwnerDashboard({user}: Props) {
{users {users
.filter( .filter(
(x) => (x) =>
x.type === "admin" && x.type === "corporate" &&
x.subscriptionExpirationDate && x.subscriptionExpirationDate &&
moment().isAfter(moment(x.subscriptionExpirationDate).subtract(30, "days")), moment().isAfter(moment(x.subscriptionExpirationDate).subtract(30, "days")),
) )
@@ -307,9 +307,9 @@ export default function OwnerDashboard({user}: Props) {
if (shouldReload) reload(); if (shouldReload) reload();
}} }}
onViewStudents={ onViewStudents={
selectedUser.type === "admin" || selectedUser.type === "teacher" ? () => setPage("students") : undefined selectedUser.type === "corporate" || selectedUser.type === "teacher" ? () => setPage("students") : undefined
} }
onViewTeachers={selectedUser.type === "admin" ? () => setPage("teachers") : undefined} onViewTeachers={selectedUser.type === "corporate" ? () => setPage("teachers") : undefined}
{...selectedUser} {...selectedUser}
/> />
</div> </div>

View File

@@ -65,5 +65,5 @@ export interface Group {
disableEditing?: boolean; disableEditing?: boolean;
} }
export type Type = "student" | "teacher" | "admin" | "owner" | "developer"; export type Type = "student" | "teacher" | "corporate" | "owner" | "developer";
export const userTypes: Type[] = ["student", "teacher", "admin", "owner", "developer"]; export const userTypes: Type[] = ["student", "teacher", "corporate", "owner", "developer"];

View File

@@ -24,7 +24,7 @@ export default function BatchCodeGenerator({user}: {user: User}) {
}); });
useEffect(() => { useEffect(() => {
if (user && (user.type === "admin" || user.type === "teacher")) { if (user && (user.type === "corporate" || user.type === "teacher")) {
setExpiryDate(user.subscriptionExpirationDate || null); setExpiryDate(user.subscriptionExpirationDate || null);
} }
}, [user]); }, [user]);
@@ -126,8 +126,8 @@ export default function BatchCodeGenerator({user}: {user: User}) {
<Button <Button
className="w-44 2xl:w-48" className="w-44 2xl:w-48"
variant="outline" variant="outline"
onClick={() => generateCode("admin")} onClick={() => generateCode("corporate")}
disabled={emails.length === 0 || isLoading || !PERMISSIONS.generateCode.admin.includes(user.type)}> disabled={emails.length === 0 || isLoading || !PERMISSIONS.generateCode.corporate.includes(user.type)}>
Admin Admin
</Button> </Button>
<Button <Button

View File

@@ -17,7 +17,7 @@ export default function CodeGenerator({user}: {user: User}) {
const [isExpiryDateEnabled, setIsExpiryDateEnabled] = useState(true); const [isExpiryDateEnabled, setIsExpiryDateEnabled] = useState(true);
useEffect(() => { useEffect(() => {
if (user && (user.type === "admin" || user.type === "teacher")) { if (user && (user.type === "corporate" || user.type === "teacher")) {
setExpiryDate(user.subscriptionExpirationDate || null); setExpiryDate(user.subscriptionExpirationDate || null);
} }
}, [user]); }, [user]);
@@ -75,8 +75,8 @@ export default function CodeGenerator({user}: {user: User}) {
<Button <Button
className="w-44 2xl:w-48" className="w-44 2xl:w-48"
variant="outline" variant="outline"
onClick={() => generateCode("admin")} onClick={() => generateCode("corporate")}
disabled={!PERMISSIONS.generateCode.admin.includes(user.type) || (isExpiryDateEnabled && expiryDate === null)}> disabled={!PERMISSIONS.generateCode.corporate.includes(user.type) || (isExpiryDateEnabled && expiryDate === null)}>
Admin Admin
</Button> </Button>
<Button <Button

View File

@@ -51,7 +51,7 @@ const CreatePanel = ({user, users, group, onCreate}: CreateDialogProps) => {
const emailUsers = [...new Set(emails)].map((x) => users.find((y) => y.email.toLowerCase() === x)).filter((x) => x !== undefined); const emailUsers = [...new Set(emails)].map((x) => users.find((y) => y.email.toLowerCase() === x)).filter((x) => x !== undefined);
const filteredUsers = emailUsers.filter( const filteredUsers = emailUsers.filter(
(x) => (x) =>
((user.type === "developer" || user.type === "owner" || user.type === "admin") && ((user.type === "developer" || user.type === "owner" || user.type === "corporate") &&
(x?.type === "student" || x?.type === "teacher")) || (x?.type === "student" || x?.type === "teacher")) ||
(user.type === "teacher" && x?.type === "student"), (user.type === "teacher" && x?.type === "student"),
); );
@@ -140,7 +140,7 @@ export default function GroupList({user}: {user: User}) {
}, [showDisclosure]); }, [showDisclosure]);
useEffect(() => { useEffect(() => {
if (user && (user.type === "admin" || user.type === "teacher")) { if (user && (user.type === "corporate" || user.type === "teacher")) {
setFilterByUser(true); setFilterByUser(true);
} }
}, [user]); }, [user]);

View File

@@ -31,7 +31,9 @@ export default function UserList({user, filter}: {user: User; filter?: (user: Us
useEffect(() => { useEffect(() => {
if (user && users) { if (user && users) {
const filterUsers = const filterUsers =
user.type === "admin" || user.type === "student" ? users.filter((u) => groups.flatMap((g) => g.participants).includes(u.id)) : users; user.type === "corporate" || user.type === "student"
? users.filter((u) => groups.flatMap((g) => g.participants).includes(u.id))
: users;
const filteredUsers = filter ? filterUsers.filter(filter) : filterUsers; const filteredUsers = filter ? filterUsers.filter(filter) : filterUsers;
@@ -141,9 +143,9 @@ export default function UserList({user, filter}: {user: User; filter?: (user: Us
Teacher Teacher
</Button> </Button>
<Button <Button
onClick={() => updateAccountType(row.original, "admin")} onClick={() => updateAccountType(row.original, "corporate")}
className="text-sm !py-2 !px-4" className="text-sm !py-2 !px-4"
disabled={row.original.type === "admin" || !PERMISSIONS.generateCode["admin"].includes(user.type)}> disabled={row.original.type === "corporate" || !PERMISSIONS.generateCode["corporate"].includes(user.type)}>
Admin Admin
</Button> </Button>
<Button <Button

View File

@@ -163,7 +163,7 @@ export default function Home() {
<Layout user={user}> <Layout user={user}>
{user.type === "student" && <StudentDashboard user={user} />} {user.type === "student" && <StudentDashboard user={user} />}
{user.type === "teacher" && <StudentDashboard user={user} />} {user.type === "teacher" && <StudentDashboard user={user} />}
{user.type === "admin" && <StudentDashboard user={user} />} {user.type === "corporate" && <StudentDashboard user={user} />}
{user.type === "owner" && <StudentDashboard user={user} />} {user.type === "owner" && <StudentDashboard user={user} />}
{user.type === "developer" && <OwnerDashboard user={user} />} {user.type === "developer" && <OwnerDashboard user={user} />}
</Layout> </Layout>

View File

@@ -278,7 +278,7 @@ export default function History({user}: {user: User}) {
}} }}
/> />
)} )}
{(user.type === "admin" || user.type === "teacher") && groups.length > 0 && ( {(user.type === "corporate" || user.type === "teacher") && groups.length > 0 && (
<Select <Select
options={users options={users
.filter((x) => groups.flatMap((y) => y.participants).includes(x.id)) .filter((x) => groups.flatMap((y) => y.participants).includes(x.id))

View File

@@ -184,7 +184,7 @@ export default function Stats() {
}} }}
/> />
)} )}
{(user.type === "admin" || user.type === "teacher") && groups.length > 0 && ( {(user.type === "corporate" || user.type === "teacher") && groups.length > 0 && (
<Select <Select
className="w-full" className="w-full"
options={users options={users

View File

@@ -1,201 +0,0 @@
import {Type, User} from "@/interfaces/user";
interface Permissions {
createUser: {[key in Type]: boolean};
deleteUser: {[key in Type]: boolean};
manageUser: {[key in Type]: boolean};
viewUsers: {[key in Type]: boolean};
viewStats: boolean;
viewUserStats: boolean;
viewClassStats: boolean;
createClass: boolean;
manageClass: boolean;
deleteClass: boolean;
}
const permissions: {[key in Type]: Permissions} = {
student: {
createUser: {
admin: false,
developer: false,
owner: false,
student: false,
teacher: false,
},
deleteUser: {
admin: false,
developer: false,
owner: false,
student: false,
teacher: false,
},
manageUser: {
admin: false,
developer: false,
owner: false,
student: false,
teacher: false,
},
viewUsers: {
admin: false,
developer: false,
owner: false,
student: false,
teacher: false,
},
createClass: false,
deleteClass: false,
manageClass: false,
viewStats: true,
viewUserStats: false,
viewClassStats: false,
},
teacher: {
createUser: {
admin: false,
developer: false,
owner: false,
student: true,
teacher: false,
},
deleteUser: {
admin: false,
developer: false,
owner: false,
student: true,
teacher: false,
},
manageUser: {
admin: false,
developer: false,
owner: false,
student: true,
teacher: false,
},
viewUsers: {
admin: false,
developer: false,
owner: false,
student: true,
teacher: false,
},
createClass: true,
deleteClass: true,
manageClass: true,
viewStats: true,
viewUserStats: true,
viewClassStats: true,
},
admin: {
createUser: {
admin: false,
developer: false,
owner: false,
student: true,
teacher: true,
},
deleteUser: {
admin: false,
developer: false,
owner: false,
student: true,
teacher: true,
},
manageUser: {
admin: false,
developer: false,
owner: false,
student: true,
teacher: true,
},
viewUsers: {
admin: false,
developer: false,
owner: false,
student: true,
teacher: true,
},
createClass: true,
deleteClass: true,
manageClass: true,
viewStats: true,
viewUserStats: true,
viewClassStats: true,
},
owner: {
createUser: {
admin: true,
developer: false,
owner: false,
student: true,
teacher: true,
},
deleteUser: {
admin: true,
developer: false,
owner: false,
student: true,
teacher: true,
},
manageUser: {
admin: true,
developer: false,
owner: false,
student: true,
teacher: true,
},
viewUsers: {
admin: true,
developer: false,
owner: false,
student: true,
teacher: true,
},
createClass: true,
deleteClass: true,
manageClass: true,
viewStats: true,
viewUserStats: true,
viewClassStats: true,
},
developer: {
createUser: {
admin: true,
developer: true,
owner: true,
student: true,
teacher: true,
},
deleteUser: {
admin: true,
developer: true,
owner: true,
student: true,
teacher: true,
},
manageUser: {
admin: true,
developer: true,
owner: true,
student: true,
teacher: true,
},
viewUsers: {
admin: true,
developer: true,
owner: true,
student: true,
teacher: true,
},
createClass: true,
deleteClass: true,
manageClass: true,
viewStats: true,
viewUserStats: true,
viewClassStats: true,
},
};
export default function getPermissions(user: User) {
return permissions[user.type];
}