From 58a885d9ba3d5239a6a7e644c9df64e3a1d91fb5 Mon Sep 17 00:00:00 2001 From: MAMUNdevBD Date: Wed, 5 Jul 2023 17:44:49 +0600 Subject: [PATCH] Teacher and Quize --- components/Layout/Header.tsx | 183 +------------------------ components/Layout/Sidebar.tsx | 63 +-------- components/admin/Forms/CourseForm.tsx | 2 +- components/admin/Forms/QuizeForm.tsx | 106 ++++++++++++++ components/admin/Forms/TeacherForm.tsx | 132 ++++++++++++++++++ controllers/QuizeController.ts | 3 +- controllers/TeacherController.ts | 4 + pages/admin/index.tsx | 2 +- pages/admin/lesson/quize/add.tsx | 38 +++++ pages/admin/lesson/quize/list.tsx | 9 ++ pages/admin/teacher/add.tsx | 19 +++ pages/admin/teacher/edit.tsx | 32 +++++ pages/admin/teacher/list.tsx | 10 +- pages/api/v1/teacher/details.ts | 21 +++ 14 files changed, 383 insertions(+), 241 deletions(-) create mode 100644 components/admin/Forms/QuizeForm.tsx create mode 100644 components/admin/Forms/TeacherForm.tsx create mode 100644 pages/admin/lesson/quize/add.tsx create mode 100644 pages/admin/teacher/add.tsx create mode 100644 pages/admin/teacher/edit.tsx create mode 100644 pages/api/v1/teacher/details.ts diff --git a/components/Layout/Header.tsx b/components/Layout/Header.tsx index 75ae42a..5f88e57 100644 --- a/components/Layout/Header.tsx +++ b/components/Layout/Header.tsx @@ -142,12 +142,10 @@ const Header = () => { " horizontal-logo flex items-center justify-between ltr:mr-2 rtl:ml-2 mr-2" } > - - logo + Studera Koranen @@ -330,179 +328,6 @@ const Header = () => { )} -
- - } - > -
    -
  • -
    - userProfile -
    -

    - John Doe - - Pro - -

    - -
    -
    -
  • -
  • - - - - - - Profile - -
  • -
  • - - - - - - Inbox - -
  • -
  • - - - - - - - - - - - Lock Screen - -
  • -
  • - - - - - - Sign Out - -
  • -
-
-
diff --git a/components/Layout/Sidebar.tsx b/components/Layout/Sidebar.tsx index 5759f9d..d8d07e8 100644 --- a/components/Layout/Sidebar.tsx +++ b/components/Layout/Sidebar.tsx @@ -77,14 +77,12 @@ const Sidebar = () => { >
- - logo + - {t("VRISTO")} + {t("Studera Koranen")} @@ -351,57 +349,6 @@ const Sidebar = () => { - -

- - - - {t("Sites")} -

- -
  • - -
    - - - - - - - - {t("tables")} - -
    - -
  • diff --git a/components/admin/Forms/CourseForm.tsx b/components/admin/Forms/CourseForm.tsx index f64653f..dbe6947 100644 --- a/components/admin/Forms/CourseForm.tsx +++ b/components/admin/Forms/CourseForm.tsx @@ -21,7 +21,7 @@ const CourseForm = ({ course }: Props) => { } formdata.append("description", e.target.description.value); if (course) { - fetch("/api/v1/course/update?id=1", { + fetch("/api/v1/course/update?id=" + course.id, { method: "POST", body: formdata, redirect: "follow", diff --git a/components/admin/Forms/QuizeForm.tsx b/components/admin/Forms/QuizeForm.tsx new file mode 100644 index 0000000..c29d566 --- /dev/null +++ b/components/admin/Forms/QuizeForm.tsx @@ -0,0 +1,106 @@ +import { GetServerSideProps } from "next"; +import FileInput from "../Fields/FileInput"; +import InputField from "../Fields/InputField"; +import TextField from "../Fields/TextField"; +import { useForm } from "react-hook-form"; +import { useRouter } from "next/router"; +import Swal from "sweetalert2"; +import PanelSelectField from "../Fields/PanelSelectField"; + +type Props = { + quize?: any; + lessons?: any; +}; + +const QuizeForm = ({ quize, lessons }: Props) => { + const router = useRouter(); + const handleSubmit = (e: any) => { + e.preventDefault(); + var formdata = new FormData(); + formdata.append("lesson_id", e.target.lesson_id.value); + formdata.append("question", e.target.question.value); + formdata.append("o1", e.target.o1.value); + formdata.append("o2", e.target.o2.value); + formdata.append("o3", e.target.o3.value); + formdata.append("o4", e.target.o4.value); + formdata.append("answer", e.target.answer.value); + if (quize) { + fetch("/api/v1/quize/update?id=" + quize.id, { + method: "POST", + body: formdata, + redirect: "follow", + }) + .then((response) => response.json()) + .then(({ success, msg, result }) => { + Swal.fire({ + icon: success ? "success" : "error", + title: success ? "Success" : "Error", + text: msg, + padding: "2em", + customClass: "sweet-alerts", + }); + }) + .catch((error) => console.log("error", error)); + } else { + fetch("/api/v1/quize/add", { + method: "POST", + body: formdata, + redirect: "follow", + }) + .then((response) => response.json()) + .then(({ success, msg, result }) => { + if (success) { + router.push("/admin/quize/list"); + } + }) + .catch((error) => console.log("error", error)); + } + }; + return ( +
    + + +
    + + + + +
    + + + ); +}; + +export default QuizeForm; diff --git a/components/admin/Forms/TeacherForm.tsx b/components/admin/Forms/TeacherForm.tsx new file mode 100644 index 0000000..23475ee --- /dev/null +++ b/components/admin/Forms/TeacherForm.tsx @@ -0,0 +1,132 @@ +import { GetServerSideProps } from "next"; +import FileInput from "../Fields/FileInput"; +import InputField from "../Fields/InputField"; +import TextField from "../Fields/TextField"; +import { useForm } from "react-hook-form"; +import { useRouter } from "next/router"; +import Swal from "sweetalert2"; +import PanelSelectField from "../Fields/PanelSelectField"; + +type Props = { + teacher?: any; +}; + +const TeacherForm = ({ teacher }: Props) => { + const router = useRouter(); + const handleSubmit = (e: any) => { + e.preventDefault(); + var formdata = new FormData(); + formdata.append("fullname", e.target.fullname.value); + formdata.append("sex", e.target.sex.value); + formdata.append("age", e.target.age.value); + formdata.append("mail", e.target.mail.value); + formdata.append("phone", e.target.phone.value); + // formdata.append("nationality", e.target.nationality.value); + formdata.append("address", e.target.address.value); + formdata.append("description", e.target.description.value); + if (e.target.image.files.length > 0) { + formdata.append("image", e.target.image.files[0], e.target.image.value); + } + + if (teacher) { + fetch("/api/v1/teacher/update?id=" + teacher.id, { + method: "POST", + body: formdata, + redirect: "follow", + }) + .then((response) => response.json()) + .then(({ success, msg, result }) => { + Swal.fire({ + icon: success ? "success" : "error", + title: success ? "Success" : "Error", + text: msg, + padding: "2em", + customClass: "sweet-alerts", + }); + }) + .catch((error) => console.log("error", error)); + } else { + fetch("/api/v1/teacher/add", { + method: "POST", + body: formdata, + redirect: "follow", + }) + .then((response) => response.json()) + .then(({ success, msg, result }) => { + if (success) { + router.push("/admin/teacher/list"); + } + }) + .catch((error) => console.log("error", error)); + } + }; + + const genders = [ + { + label: "Male", + value: "male", + }, + { + label: "Female", + value: "female", + }, + ]; + + return ( +
    + +
    + + +
    +
    + + +
    + + + + + + ); +}; + +export default TeacherForm; diff --git a/controllers/QuizeController.ts b/controllers/QuizeController.ts index 2138878..5e3afe0 100644 --- a/controllers/QuizeController.ts +++ b/controllers/QuizeController.ts @@ -19,7 +19,8 @@ class QuizeController { } return await query .join("lessons as l", "quizes.lesson_id", "=", "l.id") - .select("quizes.*", "l.name as lesson_name"); + .join("courses as c", "l.course_id", "=", "c.id") + .select("quizes.*", "l.name as lesson_name", "c.name as course_name"); }; static create = async (data: QuizeInterface): Promise => { diff --git a/controllers/TeacherController.ts b/controllers/TeacherController.ts index 85a78b1..462bcd2 100644 --- a/controllers/TeacherController.ts +++ b/controllers/TeacherController.ts @@ -30,6 +30,10 @@ class TeacherController { await db("teachers").where("id", id).delete(); return true; }; + + static view = async (id: string | number): Promise => { + return await db("teachers").where("id", id).first(); + }; } export { TeacherController }; diff --git a/pages/admin/index.tsx b/pages/admin/index.tsx index 8c811e0..e832259 100644 --- a/pages/admin/index.tsx +++ b/pages/admin/index.tsx @@ -788,7 +788,7 @@ const AdminDashboard = () => {
    New project created :{" "}

    27 Feb, 2020

    diff --git a/pages/admin/lesson/quize/add.tsx b/pages/admin/lesson/quize/add.tsx new file mode 100644 index 0000000..9443966 --- /dev/null +++ b/pages/admin/lesson/quize/add.tsx @@ -0,0 +1,38 @@ +import DefaultLayout from "@/components/Layout/DefaultLayout"; +import LessonForm from "@/components/admin/Forms/LessonForm"; +import QuizeForm from "@/components/admin/Forms/QuizeForm"; +import { useEffect, useState } from "react"; + +const AddQuizePage = () => { + const [lessons, setLessons] = useState([]); + + useEffect(() => { + fetch("/api/v1/lesson/list", { + method: "GET", + redirect: "follow", + }) + .then((response) => response.json()) + .then((result) => { + const output = result.map(({ id, name }) => ({ + label: name, + value: id, + })); + setLessons(output); + }) + .catch((error) => console.log("error", error)); + }, []); + return ( + +
    +
    +
    + Add Quize +
    +
    + +
    +
    + ); +}; + +export default AddQuizePage; diff --git a/pages/admin/lesson/quize/list.tsx b/pages/admin/lesson/quize/list.tsx index 99df967..3c9ca2c 100644 --- a/pages/admin/lesson/quize/list.tsx +++ b/pages/admin/lesson/quize/list.tsx @@ -113,6 +113,14 @@ const AdminLessonQuizeList = () => { return (
    +
    + + Add quize + +
    Quizes @@ -146,6 +154,7 @@ const AdminLessonQuizeList = () => { ), }, { accessor: "question", title: "Question", sortable: true }, + { accessor: "course_name", title: "Course", sortable: true }, { accessor: "lesson_name", title: "Lesson", sortable: true }, { accessor: "created_at", diff --git a/pages/admin/teacher/add.tsx b/pages/admin/teacher/add.tsx new file mode 100644 index 0000000..f496719 --- /dev/null +++ b/pages/admin/teacher/add.tsx @@ -0,0 +1,19 @@ +import DefaultLayout from "@/components/Layout/DefaultLayout"; +import TeacherForm from "@/components/admin/Forms/TeacherForm"; + +const AddTeacherPage = () => { + return ( + +
    +
    +
    + Add Teacher +
    +
    + +
    +
    + ); +}; + +export default AddTeacherPage; diff --git a/pages/admin/teacher/edit.tsx b/pages/admin/teacher/edit.tsx new file mode 100644 index 0000000..12d387f --- /dev/null +++ b/pages/admin/teacher/edit.tsx @@ -0,0 +1,32 @@ +import DefaultLayout from "@/components/Layout/DefaultLayout"; +import TeacherForm from "@/components/admin/Forms/TeacherForm"; +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; + +const EditTeacherPage = () => { + const router = useRouter(); + const [teacher, setTeacher] = useState(); + useEffect(() => { + fetch("/api/v1/teacher/details?id=" + router.query.id, { + method: "GET", + redirect: "follow", + }) + .then((response) => response.json()) + .then((result) => setTeacher(result)) + .catch((error) => console.log("error", error)); + }, [router.query.id]); + return ( + +
    +
    +
    + Edit Teacher +
    +
    + +
    +
    + ); +}; + +export default EditTeacherPage; diff --git a/pages/admin/teacher/list.tsx b/pages/admin/teacher/list.tsx index f69b638..332da03 100644 --- a/pages/admin/teacher/list.tsx +++ b/pages/admin/teacher/list.tsx @@ -118,6 +118,14 @@ const AdminTeacherList = () => { return (
    +
    + + Add Teacher + +
    Teachers @@ -192,7 +200,7 @@ const AdminTeacherList = () => { title: "Action", render: ({ id }) => (
    - +