diff --git a/src/modules/files/types.ts b/src/modules/files/types.ts index 30431f0..5ce8bbe 100644 --- a/src/modules/files/types.ts +++ b/src/modules/files/types.ts @@ -1,6 +1,7 @@ // 文件关联的目标资源类型(多态关联) // P1-5 新增 "user_avatar":用于用户头像上传场景的 targetType 字段对齐 // P2-3 新增 "message":用于私信附件上传场景的 targetType 字段对齐 +// V5-5 新增 "lesson_plan":用于备课模块附件上传场景的 targetType 字段对齐 export type FileTargetType = | "exam" | "textbook" @@ -9,6 +10,7 @@ export type FileTargetType = | "homework" | "user_avatar" | "message" + | "lesson_plan" // 文件附件记录(DB 行的 TypeScript 表示) export interface FileAttachment { diff --git a/src/modules/layout/components/site-header.tsx b/src/modules/layout/components/site-header.tsx index 3699742..c48724d 100644 --- a/src/modules/layout/components/site-header.tsx +++ b/src/modules/layout/components/site-header.tsx @@ -50,6 +50,9 @@ export function SiteHeader() { const tNav = useTranslations("nav") const tCommon = useTranslations("common") + // v3: root layout 已通过 auth() 获取 server-side session 传给 SessionProvider, + // SSR 和 CSR 期间 useSession 返回相同数据,不再需要 mounted workaround。 + const name = session?.user?.name ?? "" const email = session?.user?.email ?? "" const displayName = name || email || (status === "loading" ? tCommon("user.loading") : tCommon("user.notLoggedIn")) diff --git a/src/modules/notifications/hooks/use-desktop-notifications.ts b/src/modules/notifications/hooks/use-desktop-notifications.ts index c8e0d0d..f3a4d37 100644 --- a/src/modules/notifications/hooks/use-desktop-notifications.ts +++ b/src/modules/notifications/hooks/use-desktop-notifications.ts @@ -1,6 +1,6 @@ "use client" -import { useEffect, useRef, useCallback, useState } from "react" +import { useEffect, useRef, useCallback, useSyncExternalStore } from "react" import type { Notification } from "../types" @@ -22,6 +22,33 @@ interface UseDesktopNotificationsResult { showNotification: (notification: Notification) => void } +// v3: 使用 useSyncExternalStore 订阅浏览器 Notification 权限。 +// 模块级监听器集合:requestPermission 完成后手动通知 React 重新读取快照。 +// Notification API 没有标准的 permissionchange 事件,需手动触发。 +const permissionListeners = new Set<() => void>() + +function subscribePermission(onStoreChange: () => void): () => void { + permissionListeners.add(onStoreChange) + return () => { + permissionListeners.delete(onStoreChange) + } +} + +function getPermissionSnapshot(): NotificationPermission | "unsupported" { + if (typeof window === "undefined" || !("Notification" in window)) return "unsupported" + return Notification.permission +} + +function getPermissionServerSnapshot(): NotificationPermission | "unsupported" { + // SSR 期间返回固定值,与 client hydration 一致,避免 hydration mismatch。 + // hydration 完成后 React 自动切换到 getSnapshot 并触发重新渲染。 + return "unsupported" +} + +function notifyPermissionChange(): void { + permissionListeners.forEach((listener) => listener()) +} + /** * 桌面通知 Hook * @@ -41,15 +68,24 @@ interface UseDesktopNotificationsResult { * - Chrome/Edge/Firefox 桌面版完整支持 * - Safari 桌面版 13+ 支持 * - 移动端浏览器不支持(自动降级为无桌面推送) + * + * v3: 使用 useSyncExternalStore 替代 useState + useEffect 检测权限, + * 避免 SSR/CSR 不一致导致的 hydration mismatch,同时满足 + * react-hooks/set-state-in-effect 规则。 */ export function useDesktopNotifications( options?: UseDesktopNotificationsOptions ): UseDesktopNotificationsResult { const enabled = options?.enabled ?? false - const [permission, setPermission] = useState( - typeof window !== "undefined" && "Notification" in window - ? Notification.permission - : "unsupported" + + // v3: useSyncExternalStore 自动处理 SSR/CSR 一致性 + // - SSR: getPermissionServerSnapshot → "unsupported" + // - hydration: 仍使用 server snapshot(一致,无 mismatch) + // - hydration 后: 切换到 getPermissionSnapshot,如有差异自动 re-render + const permission = useSyncExternalStore( + subscribePermission, + getPermissionSnapshot, + getPermissionServerSnapshot ) const onClickRef = useRef(options?.onClick) @@ -63,8 +99,9 @@ export function useDesktopNotifications( if (typeof window === "undefined" || !("Notification" in window)) return try { - const result = await Notification.requestPermission() - setPermission(result) + await Notification.requestPermission() + // 通知 React 重新读取快照(Notification.permission 可能已改变) + notifyPermissionChange() } catch { // 某些浏览器可能抛出异常,静默处理 } @@ -95,17 +132,18 @@ export function useDesktopNotifications( ) // 当 enabled 变为 true 且权限为 default 时,自动请求权限 - // 使用异步队列避免在 effect 中同步调用 setState useEffect(() => { if (!enabled || permission !== "default") return if (typeof window === "undefined" || !("Notification" in window)) return let cancelled = false - Notification.requestPermission().then((result) => { - if (!cancelled) setPermission(result) - }).catch(() => { - // 某些浏览器可能抛出异常,静默处理 - }) + Notification.requestPermission() + .then(() => { + if (!cancelled) notifyPermissionChange() + }) + .catch(() => { + // 某些浏览器可能抛出异常,静默处理 + }) return () => { cancelled = true diff --git a/src/modules/questions/components/question-actions.tsx b/src/modules/questions/components/question-actions.tsx index 4bfbbe0..f865267 100644 --- a/src/modules/questions/components/question-actions.tsx +++ b/src/modules/questions/components/question-actions.tsx @@ -87,7 +87,7 @@ export function QuestionActions({ question }: QuestionActionsProps): React.React } } - const typeLabel = t(question.type) + const typeLabel = t(`type.${question.type}`) return ( <> diff --git a/src/modules/questions/components/question-columns.tsx b/src/modules/questions/components/question-columns.tsx index 9f1b0a3..ce07bba 100644 --- a/src/modules/questions/components/question-columns.tsx +++ b/src/modules/questions/components/question-columns.tsx @@ -51,7 +51,7 @@ export function useQuestionColumns(): ColumnDef[] { diff --git a/src/modules/rbac/lib/permission-catalog.ts b/src/modules/rbac/lib/permission-catalog.ts index 9e13956..20fa03d 100644 --- a/src/modules/rbac/lib/permission-catalog.ts +++ b/src/modules/rbac/lib/permission-catalog.ts @@ -11,7 +11,7 @@ export interface PermissionMeta { value: Permission /** i18n key for the human-readable label, e.g. "rbac:permissions.exam.create". */ labelKey: string - /** i18n key for the description, e.g. "rbac:permissions.exam.create.desc". */ + /** i18n key for the description, e.g. "rbac:permissions.exam.createDesc". */ descriptionKey: string } @@ -39,223 +39,223 @@ export const PERMISSION_CATALOG: PermissionGroup[] = [ group: "exam", labelKey: "rbac:permissions.group.exam", permissions: [ - { key: "EXAM_CREATE", value: Permissions.EXAM_CREATE, labelKey: "rbac:permissions.exam.create", descriptionKey: "rbac:permissions.exam.create.desc" }, - { key: "EXAM_READ", value: Permissions.EXAM_READ, labelKey: "rbac:permissions.exam.read", descriptionKey: "rbac:permissions.exam.read.desc" }, - { key: "EXAM_UPDATE", value: Permissions.EXAM_UPDATE, labelKey: "rbac:permissions.exam.update", descriptionKey: "rbac:permissions.exam.update.desc" }, - { key: "EXAM_DELETE", value: Permissions.EXAM_DELETE, labelKey: "rbac:permissions.exam.delete", descriptionKey: "rbac:permissions.exam.delete.desc" }, - { key: "EXAM_DUPLICATE", value: Permissions.EXAM_DUPLICATE, labelKey: "rbac:permissions.exam.duplicate", descriptionKey: "rbac:permissions.exam.duplicate.desc" }, - { key: "EXAM_PUBLISH", value: Permissions.EXAM_PUBLISH, labelKey: "rbac:permissions.exam.publish", descriptionKey: "rbac:permissions.exam.publish.desc" }, - { key: "EXAM_AI_GENERATE", value: Permissions.EXAM_AI_GENERATE, labelKey: "rbac:permissions.exam.ai_generate", descriptionKey: "rbac:permissions.exam.ai_generate.desc" }, - { key: "EXAM_SUBMIT", value: Permissions.EXAM_SUBMIT, labelKey: "rbac:permissions.exam.submit", descriptionKey: "rbac:permissions.exam.submit.desc" }, - { key: "EXAM_PROCTOR", value: Permissions.EXAM_PROCTOR, labelKey: "rbac:permissions.exam.proctor", descriptionKey: "rbac:permissions.exam.proctor.desc" }, - { key: "EXAM_PROCTOR_READ", value: Permissions.EXAM_PROCTOR_READ, labelKey: "rbac:permissions.exam.proctor_read", descriptionKey: "rbac:permissions.exam.proctor_read.desc" }, + { key: "EXAM_CREATE", value: Permissions.EXAM_CREATE, labelKey: "rbac:permissions.exam.create", descriptionKey: "rbac:permissions.exam.createDesc" }, + { key: "EXAM_READ", value: Permissions.EXAM_READ, labelKey: "rbac:permissions.exam.read", descriptionKey: "rbac:permissions.exam.readDesc" }, + { key: "EXAM_UPDATE", value: Permissions.EXAM_UPDATE, labelKey: "rbac:permissions.exam.update", descriptionKey: "rbac:permissions.exam.updateDesc" }, + { key: "EXAM_DELETE", value: Permissions.EXAM_DELETE, labelKey: "rbac:permissions.exam.delete", descriptionKey: "rbac:permissions.exam.deleteDesc" }, + { key: "EXAM_DUPLICATE", value: Permissions.EXAM_DUPLICATE, labelKey: "rbac:permissions.exam.duplicate", descriptionKey: "rbac:permissions.exam.duplicateDesc" }, + { key: "EXAM_PUBLISH", value: Permissions.EXAM_PUBLISH, labelKey: "rbac:permissions.exam.publish", descriptionKey: "rbac:permissions.exam.publishDesc" }, + { key: "EXAM_AI_GENERATE", value: Permissions.EXAM_AI_GENERATE, labelKey: "rbac:permissions.exam.ai_generate", descriptionKey: "rbac:permissions.exam.ai_generateDesc" }, + { key: "EXAM_SUBMIT", value: Permissions.EXAM_SUBMIT, labelKey: "rbac:permissions.exam.submit", descriptionKey: "rbac:permissions.exam.submitDesc" }, + { key: "EXAM_PROCTOR", value: Permissions.EXAM_PROCTOR, labelKey: "rbac:permissions.exam.proctor", descriptionKey: "rbac:permissions.exam.proctorDesc" }, + { key: "EXAM_PROCTOR_READ", value: Permissions.EXAM_PROCTOR_READ, labelKey: "rbac:permissions.exam.proctor_read", descriptionKey: "rbac:permissions.exam.proctor_readDesc" }, ], }, { group: "homework", labelKey: "rbac:permissions.group.homework", permissions: [ - { key: "HOMEWORK_CREATE", value: Permissions.HOMEWORK_CREATE, labelKey: "rbac:permissions.homework.create", descriptionKey: "rbac:permissions.homework.create.desc" }, - { key: "HOMEWORK_GRADE", value: Permissions.HOMEWORK_GRADE, labelKey: "rbac:permissions.homework.grade", descriptionKey: "rbac:permissions.homework.grade.desc" }, - { key: "HOMEWORK_SUBMIT", value: Permissions.HOMEWORK_SUBMIT, labelKey: "rbac:permissions.homework.submit", descriptionKey: "rbac:permissions.homework.submit.desc" }, + { key: "HOMEWORK_CREATE", value: Permissions.HOMEWORK_CREATE, labelKey: "rbac:permissions.homework.create", descriptionKey: "rbac:permissions.homework.createDesc" }, + { key: "HOMEWORK_GRADE", value: Permissions.HOMEWORK_GRADE, labelKey: "rbac:permissions.homework.grade", descriptionKey: "rbac:permissions.homework.gradeDesc" }, + { key: "HOMEWORK_SUBMIT", value: Permissions.HOMEWORK_SUBMIT, labelKey: "rbac:permissions.homework.submit", descriptionKey: "rbac:permissions.homework.submitDesc" }, ], }, { group: "question", labelKey: "rbac:permissions.group.question", permissions: [ - { key: "QUESTION_CREATE", value: Permissions.QUESTION_CREATE, labelKey: "rbac:permissions.question.create", descriptionKey: "rbac:permissions.question.create.desc" }, - { key: "QUESTION_READ", value: Permissions.QUESTION_READ, labelKey: "rbac:permissions.question.read", descriptionKey: "rbac:permissions.question.read.desc" }, - { key: "QUESTION_UPDATE", value: Permissions.QUESTION_UPDATE, labelKey: "rbac:permissions.question.update", descriptionKey: "rbac:permissions.question.update.desc" }, - { key: "QUESTION_DELETE", value: Permissions.QUESTION_DELETE, labelKey: "rbac:permissions.question.delete", descriptionKey: "rbac:permissions.question.delete.desc" }, + { key: "QUESTION_CREATE", value: Permissions.QUESTION_CREATE, labelKey: "rbac:permissions.question.create", descriptionKey: "rbac:permissions.question.createDesc" }, + { key: "QUESTION_READ", value: Permissions.QUESTION_READ, labelKey: "rbac:permissions.question.read", descriptionKey: "rbac:permissions.question.readDesc" }, + { key: "QUESTION_UPDATE", value: Permissions.QUESTION_UPDATE, labelKey: "rbac:permissions.question.update", descriptionKey: "rbac:permissions.question.updateDesc" }, + { key: "QUESTION_DELETE", value: Permissions.QUESTION_DELETE, labelKey: "rbac:permissions.question.delete", descriptionKey: "rbac:permissions.question.deleteDesc" }, ], }, { group: "textbook", labelKey: "rbac:permissions.group.textbook", permissions: [ - { key: "TEXTBOOK_CREATE", value: Permissions.TEXTBOOK_CREATE, labelKey: "rbac:permissions.textbook.create", descriptionKey: "rbac:permissions.textbook.create.desc" }, - { key: "TEXTBOOK_READ", value: Permissions.TEXTBOOK_READ, labelKey: "rbac:permissions.textbook.read", descriptionKey: "rbac:permissions.textbook.read.desc" }, - { key: "TEXTBOOK_UPDATE", value: Permissions.TEXTBOOK_UPDATE, labelKey: "rbac:permissions.textbook.update", descriptionKey: "rbac:permissions.textbook.update.desc" }, - { key: "TEXTBOOK_DELETE", value: Permissions.TEXTBOOK_DELETE, labelKey: "rbac:permissions.textbook.delete", descriptionKey: "rbac:permissions.textbook.delete.desc" }, + { key: "TEXTBOOK_CREATE", value: Permissions.TEXTBOOK_CREATE, labelKey: "rbac:permissions.textbook.create", descriptionKey: "rbac:permissions.textbook.createDesc" }, + { key: "TEXTBOOK_READ", value: Permissions.TEXTBOOK_READ, labelKey: "rbac:permissions.textbook.read", descriptionKey: "rbac:permissions.textbook.readDesc" }, + { key: "TEXTBOOK_UPDATE", value: Permissions.TEXTBOOK_UPDATE, labelKey: "rbac:permissions.textbook.update", descriptionKey: "rbac:permissions.textbook.updateDesc" }, + { key: "TEXTBOOK_DELETE", value: Permissions.TEXTBOOK_DELETE, labelKey: "rbac:permissions.textbook.delete", descriptionKey: "rbac:permissions.textbook.deleteDesc" }, ], }, { group: "class", labelKey: "rbac:permissions.group.class", permissions: [ - { key: "CLASS_CREATE", value: Permissions.CLASS_CREATE, labelKey: "rbac:permissions.class.create", descriptionKey: "rbac:permissions.class.create.desc" }, - { key: "CLASS_READ", value: Permissions.CLASS_READ, labelKey: "rbac:permissions.class.read", descriptionKey: "rbac:permissions.class.read.desc" }, - { key: "CLASS_UPDATE", value: Permissions.CLASS_UPDATE, labelKey: "rbac:permissions.class.update", descriptionKey: "rbac:permissions.class.update.desc" }, - { key: "CLASS_DELETE", value: Permissions.CLASS_DELETE, labelKey: "rbac:permissions.class.delete", descriptionKey: "rbac:permissions.class.delete.desc" }, - { key: "CLASS_ENROLL", value: Permissions.CLASS_ENROLL, labelKey: "rbac:permissions.class.enroll", descriptionKey: "rbac:permissions.class.enroll.desc" }, - { key: "CLASS_SCHEDULE", value: Permissions.CLASS_SCHEDULE, labelKey: "rbac:permissions.class.schedule", descriptionKey: "rbac:permissions.class.schedule.desc" }, + { key: "CLASS_CREATE", value: Permissions.CLASS_CREATE, labelKey: "rbac:permissions.class.create", descriptionKey: "rbac:permissions.class.createDesc" }, + { key: "CLASS_READ", value: Permissions.CLASS_READ, labelKey: "rbac:permissions.class.read", descriptionKey: "rbac:permissions.class.readDesc" }, + { key: "CLASS_UPDATE", value: Permissions.CLASS_UPDATE, labelKey: "rbac:permissions.class.update", descriptionKey: "rbac:permissions.class.updateDesc" }, + { key: "CLASS_DELETE", value: Permissions.CLASS_DELETE, labelKey: "rbac:permissions.class.delete", descriptionKey: "rbac:permissions.class.deleteDesc" }, + { key: "CLASS_ENROLL", value: Permissions.CLASS_ENROLL, labelKey: "rbac:permissions.class.enroll", descriptionKey: "rbac:permissions.class.enrollDesc" }, + { key: "CLASS_SCHEDULE", value: Permissions.CLASS_SCHEDULE, labelKey: "rbac:permissions.class.schedule", descriptionKey: "rbac:permissions.class.scheduleDesc" }, ], }, { group: "school", labelKey: "rbac:permissions.group.school", permissions: [ - { key: "SCHOOL_MANAGE", value: Permissions.SCHOOL_MANAGE, labelKey: "rbac:permissions.school.manage", descriptionKey: "rbac:permissions.school.manage.desc" }, - { key: "GRADE_MANAGE", value: Permissions.GRADE_MANAGE, labelKey: "rbac:permissions.school.grade_manage", descriptionKey: "rbac:permissions.school.grade_manage.desc" }, - { key: "USER_MANAGE", value: Permissions.USER_MANAGE, labelKey: "rbac:permissions.school.user_manage", descriptionKey: "rbac:permissions.school.user_manage.desc" }, + { key: "SCHOOL_MANAGE", value: Permissions.SCHOOL_MANAGE, labelKey: "rbac:permissions.school.manage", descriptionKey: "rbac:permissions.school.manageDesc" }, + { key: "GRADE_MANAGE", value: Permissions.GRADE_MANAGE, labelKey: "rbac:permissions.school.grade_manage", descriptionKey: "rbac:permissions.school.grade_manageDesc" }, + { key: "USER_MANAGE", value: Permissions.USER_MANAGE, labelKey: "rbac:permissions.school.user_manage", descriptionKey: "rbac:permissions.school.user_manageDesc" }, ], }, { group: "user", labelKey: "rbac:permissions.group.user", permissions: [ - { key: "USER_PROFILE_UPDATE", value: Permissions.USER_PROFILE_UPDATE, labelKey: "rbac:permissions.user.profile_update", descriptionKey: "rbac:permissions.user.profile_update.desc" }, + { key: "USER_PROFILE_UPDATE", value: Permissions.USER_PROFILE_UPDATE, labelKey: "rbac:permissions.user.profile_update", descriptionKey: "rbac:permissions.user.profile_updateDesc" }, ], }, { group: "ai", labelKey: "rbac:permissions.group.ai", permissions: [ - { key: "AI_CHAT", value: Permissions.AI_CHAT, labelKey: "rbac:permissions.ai.chat", descriptionKey: "rbac:permissions.ai.chat.desc" }, - { key: "AI_CONFIGURE", value: Permissions.AI_CONFIGURE, labelKey: "rbac:permissions.ai.configure", descriptionKey: "rbac:permissions.ai.configure.desc" }, + { key: "AI_CHAT", value: Permissions.AI_CHAT, labelKey: "rbac:permissions.ai.chat", descriptionKey: "rbac:permissions.ai.chatDesc" }, + { key: "AI_CONFIGURE", value: Permissions.AI_CONFIGURE, labelKey: "rbac:permissions.ai.configure", descriptionKey: "rbac:permissions.ai.configureDesc" }, ], }, { group: "settings", labelKey: "rbac:permissions.group.settings", permissions: [ - { key: "SETTINGS_ADMIN", value: Permissions.SETTINGS_ADMIN, labelKey: "rbac:permissions.settings.admin", descriptionKey: "rbac:permissions.settings.admin.desc" }, + { key: "SETTINGS_ADMIN", value: Permissions.SETTINGS_ADMIN, labelKey: "rbac:permissions.settings.admin", descriptionKey: "rbac:permissions.settings.adminDesc" }, ], }, { group: "audit", labelKey: "rbac:permissions.group.audit", permissions: [ - { key: "AUDIT_LOG_READ", value: Permissions.AUDIT_LOG_READ, labelKey: "rbac:permissions.audit.read", descriptionKey: "rbac:permissions.audit.read.desc" }, + { key: "AUDIT_LOG_READ", value: Permissions.AUDIT_LOG_READ, labelKey: "rbac:permissions.audit.read", descriptionKey: "rbac:permissions.audit.readDesc" }, ], }, { group: "announcement", labelKey: "rbac:permissions.group.announcement", permissions: [ - { key: "ANNOUNCEMENT_MANAGE", value: Permissions.ANNOUNCEMENT_MANAGE, labelKey: "rbac:permissions.announcement.manage", descriptionKey: "rbac:permissions.announcement.manage.desc" }, - { key: "ANNOUNCEMENT_READ", value: Permissions.ANNOUNCEMENT_READ, labelKey: "rbac:permissions.announcement.read", descriptionKey: "rbac:permissions.announcement.read.desc" }, + { key: "ANNOUNCEMENT_MANAGE", value: Permissions.ANNOUNCEMENT_MANAGE, labelKey: "rbac:permissions.announcement.manage", descriptionKey: "rbac:permissions.announcement.manageDesc" }, + { key: "ANNOUNCEMENT_READ", value: Permissions.ANNOUNCEMENT_READ, labelKey: "rbac:permissions.announcement.read", descriptionKey: "rbac:permissions.announcement.readDesc" }, ], }, { group: "grade_record", labelKey: "rbac:permissions.group.grade_record", permissions: [ - { key: "GRADE_RECORD_MANAGE", value: Permissions.GRADE_RECORD_MANAGE, labelKey: "rbac:permissions.grade_record.manage", descriptionKey: "rbac:permissions.grade_record.manage.desc" }, - { key: "GRADE_RECORD_READ", value: Permissions.GRADE_RECORD_READ, labelKey: "rbac:permissions.grade_record.read", descriptionKey: "rbac:permissions.grade_record.read.desc" }, + { key: "GRADE_RECORD_MANAGE", value: Permissions.GRADE_RECORD_MANAGE, labelKey: "rbac:permissions.grade_record.manage", descriptionKey: "rbac:permissions.grade_record.manageDesc" }, + { key: "GRADE_RECORD_READ", value: Permissions.GRADE_RECORD_READ, labelKey: "rbac:permissions.grade_record.read", descriptionKey: "rbac:permissions.grade_record.readDesc" }, ], }, { group: "file", labelKey: "rbac:permissions.group.file", permissions: [ - { key: "FILE_UPLOAD", value: Permissions.FILE_UPLOAD, labelKey: "rbac:permissions.file.upload", descriptionKey: "rbac:permissions.file.upload.desc" }, - { key: "FILE_READ", value: Permissions.FILE_READ, labelKey: "rbac:permissions.file.read", descriptionKey: "rbac:permissions.file.read.desc" }, - { key: "FILE_DELETE", value: Permissions.FILE_DELETE, labelKey: "rbac:permissions.file.delete", descriptionKey: "rbac:permissions.file.delete.desc" }, + { key: "FILE_UPLOAD", value: Permissions.FILE_UPLOAD, labelKey: "rbac:permissions.file.upload", descriptionKey: "rbac:permissions.file.uploadDesc" }, + { key: "FILE_READ", value: Permissions.FILE_READ, labelKey: "rbac:permissions.file.read", descriptionKey: "rbac:permissions.file.readDesc" }, + { key: "FILE_DELETE", value: Permissions.FILE_DELETE, labelKey: "rbac:permissions.file.delete", descriptionKey: "rbac:permissions.file.deleteDesc" }, ], }, { group: "course_plan", labelKey: "rbac:permissions.group.course_plan", permissions: [ - { key: "COURSE_PLAN_MANAGE", value: Permissions.COURSE_PLAN_MANAGE, labelKey: "rbac:permissions.course_plan.manage", descriptionKey: "rbac:permissions.course_plan.manage.desc" }, - { key: "COURSE_PLAN_READ", value: Permissions.COURSE_PLAN_READ, labelKey: "rbac:permissions.course_plan.read", descriptionKey: "rbac:permissions.course_plan.read.desc" }, + { key: "COURSE_PLAN_MANAGE", value: Permissions.COURSE_PLAN_MANAGE, labelKey: "rbac:permissions.course_plan.manage", descriptionKey: "rbac:permissions.course_plan.manageDesc" }, + { key: "COURSE_PLAN_READ", value: Permissions.COURSE_PLAN_READ, labelKey: "rbac:permissions.course_plan.read", descriptionKey: "rbac:permissions.course_plan.readDesc" }, ], }, { group: "attendance", labelKey: "rbac:permissions.group.attendance", permissions: [ - { key: "ATTENDANCE_MANAGE", value: Permissions.ATTENDANCE_MANAGE, labelKey: "rbac:permissions.attendance.manage", descriptionKey: "rbac:permissions.attendance.manage.desc" }, - { key: "ATTENDANCE_READ", value: Permissions.ATTENDANCE_READ, labelKey: "rbac:permissions.attendance.read", descriptionKey: "rbac:permissions.attendance.read.desc" }, - { key: "LEAVE_REQUEST_CREATE", value: Permissions.LEAVE_REQUEST_CREATE, labelKey: "rbac:permissions.leave_request.create", descriptionKey: "rbac:permissions.leave_request.create.desc" }, - { key: "LEAVE_REQUEST_READ", value: Permissions.LEAVE_REQUEST_READ, labelKey: "rbac:permissions.leave_request.read", descriptionKey: "rbac:permissions.leave_request.read.desc" }, - { key: "LEAVE_REQUEST_REVIEW", value: Permissions.LEAVE_REQUEST_REVIEW, labelKey: "rbac:permissions.leave_request.review", descriptionKey: "rbac:permissions.leave_request.review.desc" }, + { key: "ATTENDANCE_MANAGE", value: Permissions.ATTENDANCE_MANAGE, labelKey: "rbac:permissions.attendance.manage", descriptionKey: "rbac:permissions.attendance.manageDesc" }, + { key: "ATTENDANCE_READ", value: Permissions.ATTENDANCE_READ, labelKey: "rbac:permissions.attendance.read", descriptionKey: "rbac:permissions.attendance.readDesc" }, + { key: "LEAVE_REQUEST_CREATE", value: Permissions.LEAVE_REQUEST_CREATE, labelKey: "rbac:permissions.leave_request.create", descriptionKey: "rbac:permissions.leave_request.createDesc" }, + { key: "LEAVE_REQUEST_READ", value: Permissions.LEAVE_REQUEST_READ, labelKey: "rbac:permissions.leave_request.read", descriptionKey: "rbac:permissions.leave_request.readDesc" }, + { key: "LEAVE_REQUEST_REVIEW", value: Permissions.LEAVE_REQUEST_REVIEW, labelKey: "rbac:permissions.leave_request.review", descriptionKey: "rbac:permissions.leave_request.reviewDesc" }, ], }, { group: "message", labelKey: "rbac:permissions.group.message", permissions: [ - { key: "MESSAGE_SEND", value: Permissions.MESSAGE_SEND, labelKey: "rbac:permissions.message.send", descriptionKey: "rbac:permissions.message.send.desc" }, - { key: "MESSAGE_READ", value: Permissions.MESSAGE_READ, labelKey: "rbac:permissions.message.read", descriptionKey: "rbac:permissions.message.read.desc" }, - { key: "MESSAGE_DELETE", value: Permissions.MESSAGE_DELETE, labelKey: "rbac:permissions.message.delete", descriptionKey: "rbac:permissions.message.delete.desc" }, + { key: "MESSAGE_SEND", value: Permissions.MESSAGE_SEND, labelKey: "rbac:permissions.message.send", descriptionKey: "rbac:permissions.message.sendDesc" }, + { key: "MESSAGE_READ", value: Permissions.MESSAGE_READ, labelKey: "rbac:permissions.message.read", descriptionKey: "rbac:permissions.message.readDesc" }, + { key: "MESSAGE_DELETE", value: Permissions.MESSAGE_DELETE, labelKey: "rbac:permissions.message.delete", descriptionKey: "rbac:permissions.message.deleteDesc" }, ], }, { group: "scheduling", labelKey: "rbac:permissions.group.scheduling", permissions: [ - { key: "SCHEDULE_AUTO", value: Permissions.SCHEDULE_AUTO, labelKey: "rbac:permissions.scheduling.auto", descriptionKey: "rbac:permissions.scheduling.auto.desc" }, - { key: "SCHEDULE_ADJUST", value: Permissions.SCHEDULE_ADJUST, labelKey: "rbac:permissions.scheduling.adjust", descriptionKey: "rbac:permissions.scheduling.adjust.desc" }, + { key: "SCHEDULE_AUTO", value: Permissions.SCHEDULE_AUTO, labelKey: "rbac:permissions.scheduling.auto", descriptionKey: "rbac:permissions.scheduling.autoDesc" }, + { key: "SCHEDULE_ADJUST", value: Permissions.SCHEDULE_ADJUST, labelKey: "rbac:permissions.scheduling.adjust", descriptionKey: "rbac:permissions.scheduling.adjustDesc" }, ], }, { group: "elective", labelKey: "rbac:permissions.group.elective", permissions: [ - { key: "ELECTIVE_MANAGE", value: Permissions.ELECTIVE_MANAGE, labelKey: "rbac:permissions.elective.manage", descriptionKey: "rbac:permissions.elective.manage.desc" }, - { key: "ELECTIVE_READ", value: Permissions.ELECTIVE_READ, labelKey: "rbac:permissions.elective.read", descriptionKey: "rbac:permissions.elective.read.desc" }, - { key: "ELECTIVE_SELECT", value: Permissions.ELECTIVE_SELECT, labelKey: "rbac:permissions.elective.select", descriptionKey: "rbac:permissions.elective.select.desc" }, + { key: "ELECTIVE_MANAGE", value: Permissions.ELECTIVE_MANAGE, labelKey: "rbac:permissions.elective.manage", descriptionKey: "rbac:permissions.elective.manageDesc" }, + { key: "ELECTIVE_READ", value: Permissions.ELECTIVE_READ, labelKey: "rbac:permissions.elective.read", descriptionKey: "rbac:permissions.elective.readDesc" }, + { key: "ELECTIVE_SELECT", value: Permissions.ELECTIVE_SELECT, labelKey: "rbac:permissions.elective.select", descriptionKey: "rbac:permissions.elective.selectDesc" }, ], }, { group: "diagnostic", labelKey: "rbac:permissions.group.diagnostic", permissions: [ - { key: "DIAGNOSTIC_MANAGE", value: Permissions.DIAGNOSTIC_MANAGE, labelKey: "rbac:permissions.diagnostic.manage", descriptionKey: "rbac:permissions.diagnostic.manage.desc" }, - { key: "DIAGNOSTIC_READ", value: Permissions.DIAGNOSTIC_READ, labelKey: "rbac:permissions.diagnostic.read", descriptionKey: "rbac:permissions.diagnostic.read.desc" }, + { key: "DIAGNOSTIC_MANAGE", value: Permissions.DIAGNOSTIC_MANAGE, labelKey: "rbac:permissions.diagnostic.manage", descriptionKey: "rbac:permissions.diagnostic.manageDesc" }, + { key: "DIAGNOSTIC_READ", value: Permissions.DIAGNOSTIC_READ, labelKey: "rbac:permissions.diagnostic.read", descriptionKey: "rbac:permissions.diagnostic.readDesc" }, ], }, { group: "lesson_plan", labelKey: "rbac:permissions.group.lesson_plan", permissions: [ - { key: "LESSON_PLAN_CREATE", value: Permissions.LESSON_PLAN_CREATE, labelKey: "rbac:permissions.lesson_plan.create", descriptionKey: "rbac:permissions.lesson_plan.create.desc" }, - { key: "LESSON_PLAN_READ", value: Permissions.LESSON_PLAN_READ, labelKey: "rbac:permissions.lesson_plan.read", descriptionKey: "rbac:permissions.lesson_plan.read.desc" }, - { key: "LESSON_PLAN_UPDATE", value: Permissions.LESSON_PLAN_UPDATE, labelKey: "rbac:permissions.lesson_plan.update", descriptionKey: "rbac:permissions.lesson_plan.update.desc" }, - { key: "LESSON_PLAN_DELETE", value: Permissions.LESSON_PLAN_DELETE, labelKey: "rbac:permissions.lesson_plan.delete", descriptionKey: "rbac:permissions.lesson_plan.delete.desc" }, - { key: "LESSON_PLAN_PUBLISH", value: Permissions.LESSON_PLAN_PUBLISH, labelKey: "rbac:permissions.lesson_plan.publish", descriptionKey: "rbac:permissions.lesson_plan.publish.desc" }, + { key: "LESSON_PLAN_CREATE", value: Permissions.LESSON_PLAN_CREATE, labelKey: "rbac:permissions.lesson_plan.create", descriptionKey: "rbac:permissions.lesson_plan.createDesc" }, + { key: "LESSON_PLAN_READ", value: Permissions.LESSON_PLAN_READ, labelKey: "rbac:permissions.lesson_plan.read", descriptionKey: "rbac:permissions.lesson_plan.readDesc" }, + { key: "LESSON_PLAN_UPDATE", value: Permissions.LESSON_PLAN_UPDATE, labelKey: "rbac:permissions.lesson_plan.update", descriptionKey: "rbac:permissions.lesson_plan.updateDesc" }, + { key: "LESSON_PLAN_DELETE", value: Permissions.LESSON_PLAN_DELETE, labelKey: "rbac:permissions.lesson_plan.delete", descriptionKey: "rbac:permissions.lesson_plan.deleteDesc" }, + { key: "LESSON_PLAN_PUBLISH", value: Permissions.LESSON_PLAN_PUBLISH, labelKey: "rbac:permissions.lesson_plan.publish", descriptionKey: "rbac:permissions.lesson_plan.publishDesc" }, ], }, { group: "dashboard", labelKey: "rbac:permissions.group.dashboard", permissions: [ - { key: "DASHBOARD_ADMIN_READ", value: Permissions.DASHBOARD_ADMIN_READ, labelKey: "rbac:permissions.dashboard.admin_read", descriptionKey: "rbac:permissions.dashboard.admin_read.desc" }, - { key: "DASHBOARD_TEACHER_READ", value: Permissions.DASHBOARD_TEACHER_READ, labelKey: "rbac:permissions.dashboard.teacher_read", descriptionKey: "rbac:permissions.dashboard.teacher_read.desc" }, - { key: "DASHBOARD_STUDENT_READ", value: Permissions.DASHBOARD_STUDENT_READ, labelKey: "rbac:permissions.dashboard.student_read", descriptionKey: "rbac:permissions.dashboard.student_read.desc" }, - { key: "DASHBOARD_PARENT_READ", value: Permissions.DASHBOARD_PARENT_READ, labelKey: "rbac:permissions.dashboard.parent_read", descriptionKey: "rbac:permissions.dashboard.parent_read.desc" }, + { key: "DASHBOARD_ADMIN_READ", value: Permissions.DASHBOARD_ADMIN_READ, labelKey: "rbac:permissions.dashboard.admin_read", descriptionKey: "rbac:permissions.dashboard.admin_readDesc" }, + { key: "DASHBOARD_TEACHER_READ", value: Permissions.DASHBOARD_TEACHER_READ, labelKey: "rbac:permissions.dashboard.teacher_read", descriptionKey: "rbac:permissions.dashboard.teacher_readDesc" }, + { key: "DASHBOARD_STUDENT_READ", value: Permissions.DASHBOARD_STUDENT_READ, labelKey: "rbac:permissions.dashboard.student_read", descriptionKey: "rbac:permissions.dashboard.student_readDesc" }, + { key: "DASHBOARD_PARENT_READ", value: Permissions.DASHBOARD_PARENT_READ, labelKey: "rbac:permissions.dashboard.parent_read", descriptionKey: "rbac:permissions.dashboard.parent_readDesc" }, ], }, { group: "error_book", labelKey: "rbac:permissions.group.error_book", permissions: [ - { key: "ERROR_BOOK_READ", value: Permissions.ERROR_BOOK_READ, labelKey: "rbac:permissions.error_book.read", descriptionKey: "rbac:permissions.error_book.read.desc" }, - { key: "ERROR_BOOK_MANAGE", value: Permissions.ERROR_BOOK_MANAGE, labelKey: "rbac:permissions.error_book.manage", descriptionKey: "rbac:permissions.error_book.manage.desc" }, - { key: "ERROR_BOOK_ANALYTICS_READ", value: Permissions.ERROR_BOOK_ANALYTICS_READ, labelKey: "rbac:permissions.error_book.analytics_read", descriptionKey: "rbac:permissions.error_book.analytics_read.desc" }, + { key: "ERROR_BOOK_READ", value: Permissions.ERROR_BOOK_READ, labelKey: "rbac:permissions.error_book.read", descriptionKey: "rbac:permissions.error_book.readDesc" }, + { key: "ERROR_BOOK_MANAGE", value: Permissions.ERROR_BOOK_MANAGE, labelKey: "rbac:permissions.error_book.manage", descriptionKey: "rbac:permissions.error_book.manageDesc" }, + { key: "ERROR_BOOK_ANALYTICS_READ", value: Permissions.ERROR_BOOK_ANALYTICS_READ, labelKey: "rbac:permissions.error_book.analytics_read", descriptionKey: "rbac:permissions.error_book.analytics_readDesc" }, ], }, { group: "adaptive_practice", labelKey: "rbac:permissions.group.adaptive_practice", permissions: [ - { key: "ADAPTIVE_PRACTICE_READ", value: Permissions.ADAPTIVE_PRACTICE_READ, labelKey: "rbac:permissions.adaptive_practice.read", descriptionKey: "rbac:permissions.adaptive_practice.read.desc" }, - { key: "ADAPTIVE_PRACTICE_MANAGE", value: Permissions.ADAPTIVE_PRACTICE_MANAGE, labelKey: "rbac:permissions.adaptive_practice.manage", descriptionKey: "rbac:permissions.adaptive_practice.manage.desc" }, + { key: "ADAPTIVE_PRACTICE_READ", value: Permissions.ADAPTIVE_PRACTICE_READ, labelKey: "rbac:permissions.adaptive_practice.read", descriptionKey: "rbac:permissions.adaptive_practice.readDesc" }, + { key: "ADAPTIVE_PRACTICE_MANAGE", value: Permissions.ADAPTIVE_PRACTICE_MANAGE, labelKey: "rbac:permissions.adaptive_practice.manage", descriptionKey: "rbac:permissions.adaptive_practice.manageDesc" }, ], }, { group: "rbac", labelKey: "rbac:permissions.group.rbac", permissions: [ - { key: "ROLE_CREATE", value: Permissions.ROLE_CREATE, labelKey: "rbac:permissions.rbac.role_create", descriptionKey: "rbac:permissions.rbac.role_create.desc" }, - { key: "ROLE_READ", value: Permissions.ROLE_READ, labelKey: "rbac:permissions.rbac.role_read", descriptionKey: "rbac:permissions.rbac.role_read.desc" }, - { key: "ROLE_UPDATE", value: Permissions.ROLE_UPDATE, labelKey: "rbac:permissions.rbac.role_update", descriptionKey: "rbac:permissions.rbac.role_update.desc" }, - { key: "ROLE_DELETE", value: Permissions.ROLE_DELETE, labelKey: "rbac:permissions.rbac.role_delete", descriptionKey: "rbac:permissions.rbac.role_delete.desc" }, - { key: "ROLE_ASSIGN", value: Permissions.ROLE_ASSIGN, labelKey: "rbac:permissions.rbac.role_assign", descriptionKey: "rbac:permissions.rbac.role_assign.desc" }, - { key: "PERMISSION_READ", value: Permissions.PERMISSION_READ, labelKey: "rbac:permissions.rbac.permission_read", descriptionKey: "rbac:permissions.rbac.permission_read.desc" }, + { key: "ROLE_CREATE", value: Permissions.ROLE_CREATE, labelKey: "rbac:permissions.rbac.role_create", descriptionKey: "rbac:permissions.rbac.role_createDesc" }, + { key: "ROLE_READ", value: Permissions.ROLE_READ, labelKey: "rbac:permissions.rbac.role_read", descriptionKey: "rbac:permissions.rbac.role_readDesc" }, + { key: "ROLE_UPDATE", value: Permissions.ROLE_UPDATE, labelKey: "rbac:permissions.rbac.role_update", descriptionKey: "rbac:permissions.rbac.role_updateDesc" }, + { key: "ROLE_DELETE", value: Permissions.ROLE_DELETE, labelKey: "rbac:permissions.rbac.role_delete", descriptionKey: "rbac:permissions.rbac.role_deleteDesc" }, + { key: "ROLE_ASSIGN", value: Permissions.ROLE_ASSIGN, labelKey: "rbac:permissions.rbac.role_assign", descriptionKey: "rbac:permissions.rbac.role_assignDesc" }, + { key: "PERMISSION_READ", value: Permissions.PERMISSION_READ, labelKey: "rbac:permissions.rbac.permission_read", descriptionKey: "rbac:permissions.rbac.permission_readDesc" }, ], }, ]