diff --git a/src/Pages/Admin/question/Table.tsx b/src/Pages/Admin/question/Table.tsx
index 94eae88..491377b 100644
--- a/src/Pages/Admin/question/Table.tsx
+++ b/src/Pages/Admin/question/Table.tsx
@@ -11,7 +11,7 @@ const App: React.FC = () => {
const { filterState } = useFilterState();
const response = useGetAllQuestion({
- lesson_id: lesson_id,
+ lessonsIds: [lesson_id],
pagination: true,
...filterState,
});
diff --git a/src/Pages/Admin/question/Model/formUtil.ts b/src/Pages/Admin/question/formUtil.ts
similarity index 84%
rename from src/Pages/Admin/question/Model/formUtil.ts
rename to src/Pages/Admin/question/formUtil.ts
index 85d1cd9..1a4f553 100644
--- a/src/Pages/Admin/question/Model/formUtil.ts
+++ b/src/Pages/Admin/question/formUtil.ts
@@ -1,12 +1,12 @@
import * as Yup from "yup";
-import { Question } from "../../../../types/Item";
+import { Question } from "../../../types/Item";
import { toast } from "react-toastify";
export const getInitialValues = (objectToEdit: Question): any => {
const tags = objectToEdit?.tags?.map((item: any, index: number) => {
return { ...item };
});
-
+
return {
id: objectToEdit?.id ?? null,
content: objectToEdit?.content ?? "",
@@ -16,7 +16,7 @@ export const getInitialValues = (objectToEdit: Question): any => {
hint: objectToEdit?.hint ?? null,
isBase: 0,
parent_id: objectToEdit?.parent_id ?? "",
- answers: objectToEdit?.answers ?? [],
+ answers: objectToEdit?.answers ?? null,
tags: tags ?? [],
};
};
@@ -32,6 +32,15 @@ export const getValidationSchema = () => {
content_image: Yup.string().nullable(),
isCorrect: Yup.boolean(),
}),
+ ).min(2).test(
+ "at-least-one-correct",
+ "At least one answer must be correct",
+ (answers: any) => {
+ return answers?.some(
+ (answer: any) =>
+ answer?.isCorrect === true || answer?.isCorrect === 1,
+ );
+ },
),
});
};
@@ -42,10 +51,18 @@ export const getInitialValuesBase = (objectToEdit: Question): any => {
id: tag?.id,
name: tag?.name,
}));
- console.log(item, "item");
+ const newAnswers = item?.answers?.map((item:any)=>{
+ return {
+ ...item,
+ content : item?.content ?? null
+ }
+ })
+ console.log(newAnswers,"newAnswers");
+
return {
...item,
+ answer:newAnswers,
canAnswersBeShuffled: objectToEdit?.canAnswersBeShuffled ? 1 : 0,
hint: objectToEdit?.hint ?? "",
isBase: 0,
@@ -53,7 +70,7 @@ export const getInitialValuesBase = (objectToEdit: Question): any => {
};
});
- const questions = newQuestions ?? [];
+ const questions = newQuestions ?? [{answers:[]}];
return {
id: objectToEdit?.id ?? null,
@@ -84,13 +101,12 @@ export const getValidationSchemaBase = () => {
answer_image: Yup.string().nullable(),
isCorrect: Yup.boolean(),
}),
- )
+ ).min(2)
.test(
"at-least-one-correct",
"At least one answer must be correct",
(answers: any) => {
- console.log(answers, "answers");
-
+
return answers.some(
(answer: any) =>
answer.isCorrect === true || answer.isCorrect === 1,
@@ -98,7 +114,7 @@ export const getValidationSchemaBase = () => {
},
),
}),
- ),
+ ).min(1),
});
};
diff --git a/src/Pages/Admin/question/useTableColumns.tsx b/src/Pages/Admin/question/useTableColumns.tsx
index da5680c..1c2e4bc 100644
--- a/src/Pages/Admin/question/useTableColumns.tsx
+++ b/src/Pages/Admin/question/useTableColumns.tsx
@@ -45,19 +45,59 @@ export const useColumns = () => {
},
{
title: `${t("columns.content")}`,
- dataIndex: "name",
- key: "name",
+ dataIndex: "content",
+ key: "content",
align: "center",
render: (text, record) => record?.content,
ellipsis: true,
},
{
- title: t("columns.isBase"),
+ title: `${t("columns.hint")}`,
+ dataIndex: "hint",
+ key: "hint",
+ align: "center",
+ render: (text, record) => {
+
+ return (
+ <>{record?.hint ?? "_"}>
+ );
+ },
+ ellipsis: true,
+ },
+ {
+ title: `${t("columns.tags")}`,
+ dataIndex: "tags",
+ key: "tags",
+ align: "center",
+
+ render: (text, record) => {
+ const tags = record?.tags?.map((item:any)=>{
+ return item?.name
+ }) ?? [];
+ return (
+
+ {tags.length > 0 ? (
+ tags.map((tag, index) => (
+
+ {tag}
+ {index < tags.length - 1 && ', '}
+
+ ))
+ ) : (
+ _
+ )}
+
+ );
+ },
+ ellipsis: true,
+ },
+ {
+ title: t("columns.question_type"),
dataIndex: "isBase",
key: "isBase",
align: "center",
render: (text, record) =>
- record?.isBase ? t("practical.yes") : t("practical.no"),
+ record?.isBase ? t("columns.base_question") : t("columns.normal_question"),
},
{
diff --git a/src/Pages/Admin/subject/Table/Page.tsx b/src/Pages/Admin/subject/Table/Page.tsx
index 5eb9789..03addb0 100644
--- a/src/Pages/Admin/subject/Table/Page.tsx
+++ b/src/Pages/Admin/subject/Table/Page.tsx
@@ -32,11 +32,15 @@ const TableWithHeader = () => {
});
const gradeName = grade?.data?.name ?? "";
- useSetPageTitle(
- t(`page_header.grade`) +
- " / " +
- ` ${t("header.subject_of_class")} (${gradeName})`,
- );
+
+
+ useSetPageTitle([
+ {name:`${t(`page_header.home`)}`, path:"/"},
+ {name:`${t(`page_header.grade`)}`, path:"grade"},
+ {name:` ${t("header.subject_of_class")} (${gradeName})`, path:`grade/${grade_id}`}
+ ]);
+
+
return (
diff --git a/src/Pages/Auth/FormField.tsx b/src/Pages/Auth/FormField.tsx
index 00181ca..50ba4f1 100644
--- a/src/Pages/Auth/FormField.tsx
+++ b/src/Pages/Auth/FormField.tsx
@@ -1,19 +1,7 @@
-import React, { useEffect, useState } from "react";
-import { Form, Field, useFormikContext } from "formik";
-import Image from "../../Components/Ui/Image";
-import { Input } from "antd";
-import AuthSelect from "../../Components/Ui/Custom/AuthSelect";
-// import { useGetAllCycle } from "../../api/cycle";
-// import { useGetAllBranch } from "../../api/branch";
-import { useGetAllTerm } from "../../api/term";
-import { FormValues } from "../../types/Auth";
-import {
- BRANCH_OBJECT_KEY,
- CYCLE_OBJECT_KEY,
- TERM_OBJECT_KEY,
-} from "../../config/AppKey";
-import useFormatAuthDataToSelect from "../../utils/useFormatAuthDataToSelect";
+import { Form, useFormikContext } from "formik";
+
import { useTranslation } from "react-i18next";
+import ValidationField from "../../Components/ValidationField/ValidationField";
type FormFieldType = {
isLoading: boolean;
@@ -21,26 +9,18 @@ type FormFieldType = {
const FormField = ({ isLoading }: FormFieldType) => {
const [t] = useTranslation();
+ const {isValid} = useFormikContext();
+ console.log(isValid,"isValid");
+
return (
diff --git a/src/Pages/Auth/LoginForm.tsx b/src/Pages/Auth/LoginForm.tsx
index 8b63fa9..ffbcbf8 100644
--- a/src/Pages/Auth/LoginForm.tsx
+++ b/src/Pages/Auth/LoginForm.tsx
@@ -4,7 +4,7 @@ import useAuthState from "../../zustand/AuthState";
import useNavigateOnSuccess from "../../Hooks/useNavigateOnSuccess";
import { useLoginAdmin } from "../../api/auth";
import FormField from "./FormField";
-import { initialValues } from "./formutils";
+import { initialValues, validationSchema } from "./formutils";
import { FormValues } from "../../types/Auth";
import { toast } from "react-toastify";
import { useTranslation } from "react-i18next";
@@ -39,7 +39,7 @@ const LoginForm = () => {
return (
-
+
{(formikProps) => }
diff --git a/src/Pages/Auth/formutils.ts b/src/Pages/Auth/formutils.ts
index bd6faa1..11f0799 100644
--- a/src/Pages/Auth/formutils.ts
+++ b/src/Pages/Auth/formutils.ts
@@ -2,8 +2,8 @@ import * as Yup from "yup";
import { FormValues } from "../../types/Auth";
export const validationSchema = Yup.object().shape({
- username: Yup.string().required("Username is required"),
- password: Yup.string().required("Password is required"),
+ username: Yup.string().required("validation.required"),
+ password: Yup.string().required("validation.required").min(8,"validation.Password_must_be_at_least_8_characters_long"),
});
export const initialValues: FormValues = {
diff --git a/src/Pages/Home/Dummy.tsx b/src/Pages/Home/Dummy.tsx
index 85181c8..0776ba5 100644
--- a/src/Pages/Home/Dummy.tsx
+++ b/src/Pages/Home/Dummy.tsx
@@ -3,6 +3,8 @@ import { useTranslation } from "react-i18next";
import { ABILITIES_ENUM } from "../../enums/abilities";
import useSetPageTitle from "../../Hooks/useSetPageTitle";
import useFilter from "../../Components/FilterField/components/useFilter";
+import { Button, Popconfirm } from "antd";
+import PageTitle from "../../Layout/Dashboard/PageTitle";
const Dummy = () => {
const [t] = useTranslation();
@@ -10,8 +12,8 @@ const Dummy = () => {
const { FilterButton, FilterBody } = useFilter();
return (
);
};
diff --git a/src/Routes.tsx b/src/Routes.tsx
index c390885..ccb0641 100644
--- a/src/Routes.tsx
+++ b/src/Routes.tsx
@@ -1,5 +1,5 @@
import { TCrudRoute, TMenuItem } from "./types/App";
-import { FaHome, FaMoneyBill, FaSellcast } from "react-icons/fa";
+import { FaCashRegister, FaHome, FaMoneyBill, FaPaperclip, FaSellcast, FaTag, FaUser } from "react-icons/fa";
import React from "react";
const Dummy = React.lazy(() => import("./Pages/Home/Dummy"));
@@ -33,6 +33,7 @@ const EditReSeller = React.lazy(
const User = React.lazy(() => import("./Pages/Admin/User/Page"));
const Param = React.lazy(() => import("./Pages/Admin/Param/Page"));
+const QuestionBank = React.lazy(() => import("./Pages/Admin/QuestionBank/Page"));
/// RESELLER ///
const Student_Package = React.lazy(
@@ -44,12 +45,14 @@ import { ABILITIES_ENUM, ABILITIES_VALUES_ENUM } from "./enums/abilities";
import { ParamsEnum } from "./enums/params";
import { TbCategory } from "react-icons/tb";
import { UserTypeEnum } from "./enums/UserType";
+import { FaTags } from "react-icons/fa6";
+import { MdGrade } from "react-icons/md";
export const menuItems: TMenuItem[] = [
{
header: "page_header.dashboard",
element:
,
- icon:
,
+ icon:
,
text: "sidebar.dashboard",
path: "/",
abilities: ABILITIES_ENUM?.PASS,
@@ -60,7 +63,7 @@ export const menuItems: TMenuItem[] = [
{
header: "page_header.grade",
element:
,
- icon:
,
+ icon:
,
text: "sidebar.grade",
path: `/${ABILITIES_ENUM?.GRADE}`,
abilities: ABILITIES_ENUM?.GRADE,
@@ -70,7 +73,7 @@ export const menuItems: TMenuItem[] = [
{
header: "page_header.tags",
element:
,
- icon:
,
+ icon:
,
text: "sidebar.tags",
path: `/${ABILITIES_ENUM?.TAG}`,
abilities: ABILITIES_ENUM?.TAG,
@@ -78,9 +81,9 @@ export const menuItems: TMenuItem[] = [
prevPath: 0,
},
{
- header: "page_header.tags",
+ header: "page_header.report",
element:
,
- icon:
,
+ icon:
,
text: "sidebar.report",
path: `/${ABILITIES_ENUM?.Report}`,
abilities: ABILITIES_ENUM?.Report,
@@ -90,7 +93,7 @@ export const menuItems: TMenuItem[] = [
{
header: "page_header.student",
element:
,
- icon:
,
+ icon:
,
text: "sidebar.student",
path: `/${ABILITIES_ENUM?.STUDENT}`,
abilities: ABILITIES_ENUM?.STUDENT,
@@ -100,7 +103,7 @@ export const menuItems: TMenuItem[] = [
{
header: "page_header.reSeller",
element:
,
- icon:
,
+ icon:
,
text: "sidebar.reseller",
path: `/${ABILITIES_ENUM?.RE_SELLER}`,
abilities: ABILITIES_ENUM?.RE_SELLER,
@@ -110,7 +113,7 @@ export const menuItems: TMenuItem[] = [
{
header: "page_header.user",
element:
,
- icon:
,
+ icon:
,
text: "sidebar.user",
path: `/${ABILITIES_ENUM?.USER}`,
abilities: ABILITIES_ENUM?.USER,
@@ -128,6 +131,18 @@ export const menuItems: TMenuItem[] = [
prevPath: 0,
},
+ {
+ header: "page_header.questionBank",
+ element:
,
+ icon:
,
+ text: "sidebar.questionBank",
+ path: `/${ABILITIES_ENUM?.QUESTION}`,
+ abilities: ABILITIES_ENUM?.QUESTION,
+ abilities_value: ABILITIES_VALUES_ENUM.INDEX,
+ prevPath: 0,
+ },
+
+
/// RESELLER /////
{
diff --git a/src/Styles/Antd/Mix.scss b/src/Styles/Antd/Mix.scss
index 1f327c6..eaf8c3e 100644
--- a/src/Styles/Antd/Mix.scss
+++ b/src/Styles/Antd/Mix.scss
@@ -10,12 +10,7 @@
}
}
}
-
-.Popover {
- .ant-popover-inner {
- padding: 0 !important;
- }
-}
+x
.Color_type_checkbox.false {
.ant-checkbox-checked .ant-checkbox-inner {
diff --git a/src/Styles/Layout/PageHeader.scss b/src/Styles/Layout/PageHeader.scss
index e276dba..4368f36 100644
--- a/src/Styles/Layout/PageHeader.scss
+++ b/src/Styles/Layout/PageHeader.scss
@@ -9,6 +9,9 @@
}
.page_links {
color: var(--opacity);
+ display: flex;
+ align-items: center;
+ gap: 10px;
}
}
}
@@ -16,3 +19,12 @@
.filter_header_top {
color: #202c4b;
}
+
+
+.PageTitle{
+ display: flex;
+ gap: 10px;
+ .PageTitleItems{
+ cursor: pointer;
+ }
+}
\ No newline at end of file
diff --git a/src/Styles/Pages/exercise.scss b/src/Styles/Pages/exercise.scss
index e26731e..2ba2a34 100644
--- a/src/Styles/Pages/exercise.scss
+++ b/src/Styles/Pages/exercise.scss
@@ -41,7 +41,7 @@
// padding: 2vw;
.exercise_add_main {
background: var(--bg);
- padding: 2vw;
+ padding: 10px 2vw;
}
.exercise_add_buttons {
display: flex;
@@ -127,12 +127,14 @@
display: flex;
justify-content: space-between;
width: 100%;
- padding: 14px 10px;
+ padding: 14px 20px;
background: #f2f4f8;
border-radius: 10px 10px 0 0;
margin: 0 !important;
box-shadow: 0px 0px 4px 2px rgba(0, 0, 0, 0.1);
-
+ div{
+ margin-left: 25px;
+ }
img {
cursor: pointer;
}
@@ -144,7 +146,8 @@
.delete_question_options {
margin-top: 25px;
color: var(--warning);
-
+ z-index: 9999;
+ cursor: pointer;
padding-left: 10px;
.trash_icon {
margin-right: 10px !important;
@@ -211,3 +214,44 @@
transform: translateY(55px);
z-index: -1;
}
+
+
+
+.ant-popconfirm .ant-popconfirm-buttons{
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ >{
+ flex: 1;
+ min-height: auto;
+ min-width: 30px;
+
+ }
+ .ant-btn{
+ min-height: 30px !important;
+ max-height: 30px !important;
+ min-width: 50px;
+ padding: 5px !important;
+ display: flex;
+ align-items: center;
+ justify-content: center ;
+
+
+ }
+}
+
+.QuestionPractical{
+ display: flex;
+ flex-direction: column;
+ background: var(--bg);
+ >header{
+ padding: 30px 2vw 10px 2vw;
+ }
+}
+
+.SelectTag{
+ label{
+ font-weight: bold;
+ font-size: 19px;
+ }
+}
\ No newline at end of file
diff --git a/src/api/auth.ts b/src/api/auth.ts
index 16d5a99..b29bbe4 100644
--- a/src/api/auth.ts
+++ b/src/api/auth.ts
@@ -5,4 +5,4 @@ const API = {
LOGIN: `login`,
LOGOUT: `logout`,
};
-export const useLoginAdmin = () => useAddMutation(KEY, API.LOGIN, false);
+export const useLoginAdmin = () => useAddMutation(KEY, API.LOGIN, true);
diff --git a/src/api/helper/useAxios.ts b/src/api/helper/useAxios.ts
index b2f39fc..69da961 100644
--- a/src/api/helper/useAxios.ts
+++ b/src/api/helper/useAxios.ts
@@ -50,6 +50,8 @@ function useAxios() {
return response;
},
function (error) {
+ console.log(error?.response);
+
const status = error?.request?.status;
const errorMsg = error?.response?.data?.message;
const errorField = error?.response?.data;
diff --git a/src/enums/Model.ts b/src/enums/Model.ts
index 5a95bef..de37336 100644
--- a/src/enums/Model.ts
+++ b/src/enums/Model.ts
@@ -186,4 +186,11 @@ export enum ModalEnum {
Student_Package_EDIT = "Student_Package.edit",
Student_Package_ADD = "Student_Package.add",
Student_Package_DELETE = "Student_Package.delete",
+
+
+ ///QuestionBank
+
+ QUESTION_BANK_ADD = "QuestionBank.add",
+ QUESTION_BANK_EDIT = "QuestionBank.edit",
+ QUESTION_BANK_DELETE = "QuestionBank.delete",
}
diff --git a/src/enums/abilities.ts b/src/enums/abilities.ts
index 427f62a..e84627a 100644
--- a/src/enums/abilities.ts
+++ b/src/enums/abilities.ts
@@ -47,6 +47,7 @@ export enum ABILITIES_ENUM {
User = "user",
RE_SELLER = "reseller",
Student_Package = "student_package",
+ QUESTION_BANK = "QuestionBank"
////
}
diff --git a/src/translate/ar.json b/src/translate/ar.json
index e264634..81c2b58 100644
--- a/src/translate/ar.json
+++ b/src/translate/ar.json
@@ -46,7 +46,9 @@
"grade_to_pass_must_be_less_than_max_grade": "يجب أن تكون درجة النجاح أقل من الحد الأقصى للدرجة",
"max_mark_must_be_greater_than_min_mark_to_pass": "يجب ان تكون اكبر من علامة النجاح",
"Sorry, the question must have at least one option": "عذرًا، يجب أن يحتوي السؤال على خيار واحد على الأقل",
- "at_least_one_answer_should_be_correct": "يجب أن تكون إجابة واحدة صحيحة"
+ "at_least_one_answer_should_be_correct": "يجب أن تكون إجابة واحدة صحيحة",
+ "it_should_have_more_than_one_answers":"يجب أن يحتوي على أكثر من إجابة",
+ "it_should_have_more_than_one_correct_answers":"يجب أن يحتوي على إجابة صحيحة"
},
"header": {
"register_students": "تسجيل الطلاب",
@@ -123,7 +125,9 @@
"personal_information": "المعلومات الشخصية",
"address": "العنوان",
"attachment": "المرفق",
- "subject_of_class": "مواد الصف"
+ "subject_of_class": "مواد الصف",
+ "this_will_un_do_all_your_changes":"سوف يؤدي هذا إلى إلغاء جميع تغييراتك",
+ "edit_question":"تعديل سؤال"
},
"columns": {
"id": "الرقم التعريفي",
@@ -183,7 +187,12 @@
"subject":"المادة",
"quiz_status":"حالة الاختبار",
"creator_name":"اسم المنشئ",
- "created_by":"أنشئ بواسطة"
+ "created_by":"أنشئ بواسطة",
+ "question_type": "نوع تمرين",
+ "base_question": " تمرين متعدد ",
+ "normal_question": " تمرين عادي",
+ "hint":"شرح ",
+ "tags":"كلمات مفتاحية"
},
"practical": {
"to_confirm_deletion_please_re_enter": "لتأكيد الحذف، يرجى إعادة الإدخال",
@@ -749,7 +758,8 @@
"reseller": "البائعين",
"param": "معامل",
"student_package": "حزمة الطالب",
- "quiz":"الاختبارات"
+ "quiz":"الاختبارات",
+ "questionBank":"بنك الأسئلة"
},
"message": {
"some_thing_went_wrong": "حدث خطأ ما",
@@ -784,17 +794,18 @@
"grade": "الصفوف",
"report": "تقرير",
"tags": "كلمات مفتاحية",
- "reseller":"البائعين"
+ "reseller":"البائعين",
+ "QuestionBank":"بنك الأسئلة"
},
"page_header": {
- "dashboard": "لوحة القيادة / الصفحة الرئيسية",
- "course": " لوحة القيادة / الصفوف ",
- "teacher": " لوحة القيادة / المعلمون",
- "payment": " لوحة القيادة / الدفعات",
- "branch": " لوحة القيادة / الفروع",
- "role": " لوحة القيادة / الادوار",
- "student": " لوحة القيادة / قائمة الطلاب ",
- "admin": " لوحة القيادة / المسؤولون",
+ "home": "لوحة القيادة",
+ "course": " الصفوف ",
+ "teacher": " المعلمون",
+ "payment": " الدفعات",
+ "branch": " الفروع",
+ "role": " الادوار",
+ "student": " قائمة الطلاب ",
+ "admin": " المسؤولون",
"student_details": "تفاصيل الطالب",
"create_student": "إنشاء طالب",
"course_details": "تفاصيل الصف",
@@ -802,32 +813,34 @@
"student_payment": "دفع الطالب",
"student_note": "ملاحظات الطالب",
"student_status": "حالة الطالب",
- "education_class": "لوحة القيادة / الصفوف / الشعب",
- "education_class_details": " لوحة القيادة / الصفوف / الشعب / تفاصيل الشعبة",
- "subject_details": " لوحة القيادة / تفاصيل المادة ",
- "cycle": "لوحة القيادة / السنة دراسية ",
- "term": "لوحة القيادة / الفصل ",
- "unit_details": "لوحة القيادة / تفاصيل المادة / تفاصيل الوحدة",
- "lesson_details": "لوحة القيادة / تفاصيل المادة / تفاصيل الوحدة / تفاصيل الدرس",
- "exercise_add": "لوحة القيادة / تفاصيل الدرس / إضافة تمارين ",
- "subject": "لوحة القيادة / المادة",
- "tags": "لوحة القيادة / كلمات مفتاحية",
- "Question": "لوحة القيادة /اسئلة ",
- "add_Question": "لوحة القيادة /إضافة اسئلة ",
- "edit_Question": "لوحة القيادة /تعديل اسئلة ",
- "grade": "لوحة القيادة / الصفوف",
+ "education_class": "الصفوف / الشعب",
+ "education_class_details": " الصفوف / الشعب / تفاصيل الشعبة",
+ "subject_details": " تفاصيل المادة ",
+ "cycle": " السنة دراسية ",
+ "term": "الفصل ",
+ "unit_details": "تفاصيل المادة / تفاصيل الوحدة",
+ "lesson_details": "تفاصيل المادة / تفاصيل الوحدة / تفاصيل الدرس",
+ "exercise_add": "تفاصيل الدرس / إضافة تمارين ",
+ "subject": "المادة",
+ "tags": "كلمات مفتاحية",
+ "Question": "سئلة ",
+ "add_Question": "ضافة اسئلة ",
+ "edit_Question": "عديل اسئلة ",
+ "grade": "الصفوف",
"report": "تقرير",
- "users": "لوحة القيادة / المستخدمون",
- "reseller": " لوحة القيادة / البائعين",
- "add_reseller": " لوحة القيادة / البائعين / إضافة بائع ",
+ "users": "المستخدمون",
+ "reseller": " البائعين",
+ "add_reseller": " البائعين / إضافة بائع ",
"param": "معامل",
- "student_package": "حزمة الطالب"
+ "student_package": "حزمة الطالب",
+ "QuestionBank":"بنك الأسئلة"
},
"table": {
"student": "قائمة الطلاب",
"reseller": "البائعين",
"grade": "قائمة الصفوف",
- "subjects": "مواد الصف"
+ "subjects": "مواد الصف",
+ "QuestionBank":"بنك الأسئلة"
},
"alphabet": {
"A": "A",
diff --git a/src/utils/hasAbilityFn.ts b/src/utils/hasAbilityFn.ts
index 221883b..dc4e751 100644
--- a/src/utils/hasAbilityFn.ts
+++ b/src/utils/hasAbilityFn.ts
@@ -677,3 +677,25 @@ export const canDeleteStudent_Package = hasAbility(
);
+
+
+/// QuestionBank
+
+export const canAddQuestionBank = hasAbility(
+ ABILITIES_ENUM.QUESTION_BANK,
+ ABILITIES_VALUES_ENUM.STORE,
+);
+
+export const canEditQuestionBank = hasAbility(
+ ABILITIES_ENUM.QUESTION_BANK,
+ ABILITIES_VALUES_ENUM.UPDATE,
+);
+export const canDeleteQuestionBank = hasAbility(
+ ABILITIES_ENUM.QUESTION_BANK,
+ ABILITIES_VALUES_ENUM.DELETE,
+);
+
+export const canShowQuestionBank = hasAbility(
+ ABILITIES_ENUM.QUESTION_BANK,
+ ABILITIES_VALUES_ENUM.SHOW,
+);