admin category, course

main
I-am-Stone 6 months ago
parent 3741dbc38a
commit 5db8102fec
  1. 49
      frontend/edu-connect/src/app/(admin)/admin/category/page.tsx
  2. 83
      frontend/edu-connect/src/app/(admin)/admin/course/_partials/CourseTable.tsx
  3. 26
      frontend/edu-connect/src/app/(admin)/admin/course/page.tsx
  4. 4
      frontend/edu-connect/src/lib/routes.ts

@ -0,0 +1,49 @@
'use client'
import BreadCrumbNav from "@/components/(dashboard)/common/BreadCumbNav/BreadCrumbNav"
import ContentContainer from "@/components/(dashboard)/elements/ContentContainer"
import { PageHeading } from "@/components/(dashboard)/ui/title"
import CommonContainer from "@/components/elements/CommonContainer"
import AppContextProvider from "@/helpers/context/AppContextProvider"
import { defaultFetcher } from "@/helpers/fetch.helper"
import { routes } from "@/lib/routes"
import { APP_BASE_URL } from "@/utils/constants"
import AdminView from "@/views/AdminView"
import useSWR from "swr"
import CategoryTable from "./_partials/CategoryTable"
const CategoryIndexPage = () => {
const CategoryListURL = `${APP_BASE_URL}/api/courses/getCategories`
const { data, mutate, isLoading } = useSWR(CategoryListURL, defaultFetcher);
return(
<AppContextProvider>
<AdminView>
<CommonContainer>
<PageHeading>Categories</PageHeading>
<BreadCrumbNav breadCrumbItems={[
{
title: 'Dashboard',
href: routes.DASHBOARD_ROUTE
},
{
title: 'Categories',
href: routes.CATEGORY_INDEX_PAGE
},
]}/>
<ContentContainer>
<div>
<CategoryTable
mutate={mutate}
isLoading={isLoading}
Data={data || []}
/>
</div>
</ContentContainer>
</CommonContainer>
</AdminView>
</AppContextProvider>
)
}
export default CategoryIndexPage

@ -2,10 +2,8 @@ import DataTable from "@/components/(dashboard)/common/DataTable/DataTable"
import { Button } from "@/components/(dashboard)/ui/button" import { Button } from "@/components/(dashboard)/ui/button"
import { Avatar, AvatarImage } from "@/components/ui/avatar" import { Avatar, AvatarImage } from "@/components/ui/avatar"
import { Badge } from "@/components/ui/badge" import { Badge } from "@/components/ui/badge"
import { routes } from "@/lib/routes"
import { ColumnDef } from "@tanstack/react-table" import { ColumnDef } from "@tanstack/react-table"
import { ArrowUpDown } from "lucide-react" import { ArrowUpDown } from "lucide-react"
import Link from "next/link"
const CourseTable: React.FC<{ const CourseTable: React.FC<{
mutate: () => void mutate: () => void
@ -27,7 +25,7 @@ const CourseTable :React.FC<{
}, },
{ {
id: 'name', id: 'name',
accessorFn: (row: any) => row.original?.data, accessorFn: (row: any) => row.original?.name,
header: ({ column }) => ( header: ({ column }) => (
<Button <Button
variant="ghost" variant="ghost"
@ -42,96 +40,133 @@ const CourseTable :React.FC<{
<div className="capitalize flex gap-2"> <div className="capitalize flex gap-2">
<Avatar className="h-8 w-8"> <Avatar className="h-8 w-8">
<AvatarImage <AvatarImage
src={row.original?.profilePicture ?? 'no image path'} src={row.original?.coverImage ?? 'no image path'}
alt={row.original?.firstName} alt={row.original?.name}
/> />
</Avatar> </Avatar>
<p>{row?.original?.firstName}</p> <p>{row.original?.name}</p>
</div> </div>
), ),
}, },
{ {
id: 'email', id: 'description',
accessorFn: (row: any) => row.original?.email, accessorFn: (row: any) => row.original?.description,
header: ({ column }) => ( header: ({ column }) => (
<Button <Button
variant="ghost" variant="ghost"
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")} onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
className="!px-0" className="!px-0"
> >
Email Description
<ArrowUpDown className="ml-2 h-4 w-4" /> <ArrowUpDown className="ml-2 h-4 w-4" />
</Button> </Button>
), ),
cell: ({ row }) => ( cell: ({ row }) => (
<div>{row.original?.email}</div> <div className="max-w-[300px] truncate">{row.original?.description ?? '-'}</div>
), ),
}, },
{ {
id: 'dateOfBirth', id: 'author',
accessorFn: (row: any) => row.original?.dateOfBirth, accessorFn: (row: any) => row.original?.author?.firstName,
header: ({ column }) => (
<Button
variant="ghost"
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
className="!px-0"
>
Author
<ArrowUpDown className="ml-2 h-4 w-4" />
</Button>
),
cell: ({ row }) => (
<div>{row.original?.author?.firstName} {row.original?.author?.lastName}</div>
),
},
{
id: 'category',
accessorFn: (row: any) => row.original?.category?.name,
header: ({ column }) => (
<Button
variant="ghost"
className="!px-0"
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
>
Category
<ArrowUpDown className="ml-2 h-4 w-4" />
</Button>
),
cell: ({ row }) => (
<div className="capitalize">{row.original?.category?.name}</div>
),
},
{
id: 'creationDate',
accessorFn: (row: any) => row.original?.creationDate,
header: ({ column }) => ( header: ({ column }) => (
<Button <Button
variant="ghost" variant="ghost"
className="!px-0" className="!px-0"
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")} onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
> >
DateOfBirth Published Date
<ArrowUpDown className="ml-2 h-4 w-4" /> <ArrowUpDown className="ml-2 h-4 w-4" />
</Button> </Button>
), ),
cell: ({ row }) => ( cell: ({ row }) => (
<div className="capitalize">{row.original?.dateOfBirth}</div> <div className="whitespace-nowrap">
{row.original?.creationDate ? new Date(row.original.creationDate).toLocaleDateString() : '-'}
</div>
), ),
}, },
{ {
id: 'isActivated', id: 'isActive',
accessorFn: (row: any) => row.original?.isActivated, accessorFn: (row: any) => row.original?.isActive,
header: ({ column }) => ( header: ({ column }) => (
<Button <Button
variant="ghost" variant="ghost"
className="!px-0" className="!px-0"
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")} onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
> >
IsActive Status
<ArrowUpDown className="ml-2 h-4 w-4" /> <ArrowUpDown className="ml-2 h-4 w-4" />
</Button> </Button>
), ),
cell: ({ row }) => ( cell: ({ row }) => (
<div>{row.original?.isActivated ? <Badge variant={'success'}>Active</Badge> : <Badge variant={'destructive'}>Deactive</Badge>}</div> <div>{row.original?.isActive ? <Badge variant={'success'}>Active</Badge> : <Badge variant={'destructive'}>Deactive</Badge>}</div>
), ),
}, },
{ {
id: 'last_online_at', id: 'totalEnrolled',
accessorFn: (row: any) => row.original?.lastOnline, accessorFn: (row: any) => row.original?.totalEnrolled,
header: ({ column }) => ( header: ({ column }) => (
<Button <Button
variant="ghost" variant="ghost"
className="!px-0" className="!px-0"
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")} onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
> >
lastOnline Students
<ArrowUpDown className="ml-2 h-4 w-4" /> <ArrowUpDown className="ml-2 h-4 w-4" />
</Button> </Button>
), ),
cell: ({ row }) => ( cell: ({ row }) => (
<div> <div>
{row.original?.lastOnline ?? '-'} {row.original?.totalEnrolled ?? '-'}
</div> </div>
), ),
}, },
] ]
return( return(
<> <>
<DataTable <DataTable
data={Data} data={Data}
columns={columns} columns={columns}
mutate={mutate} mutate={mutate}
searchKey="username" searchKey="name"
isLoading={isLoading} isLoading={isLoading}
/> />
</> </>
) )
} }
export default UserTable export default CourseTable

@ -1,7 +1,5 @@
'use client' 'use client'
import UserTabContent from "@/app/user/profile/_partials/UserTabContent"
import BreadCrumbNav from "@/components/(dashboard)/common/BreadCumbNav/BreadCrumbNav" import BreadCrumbNav from "@/components/(dashboard)/common/BreadCumbNav/BreadCrumbNav"
import DataTable from "@/components/(dashboard)/common/DataTable/DataTable"
import ContentContainer from "@/components/(dashboard)/elements/ContentContainer" import ContentContainer from "@/components/(dashboard)/elements/ContentContainer"
import { PageHeading } from "@/components/(dashboard)/ui/title" import { PageHeading } from "@/components/(dashboard)/ui/title"
import CommonContainer from "@/components/elements/CommonContainer" import CommonContainer from "@/components/elements/CommonContainer"
@ -11,46 +9,40 @@ import { routes } from "@/lib/routes"
import { APP_BASE_URL } from "@/utils/constants" import { APP_BASE_URL } from "@/utils/constants"
import AdminView from "@/views/AdminView" import AdminView from "@/views/AdminView"
import useSWR from "swr" import useSWR from "swr"
import UserTable from "./_partials/UserTable" import CourseTable from "./_partials/CourseTable"
const UsersIndexPage = () => { const CourseIndexPage = () => {
const UserListURL = `${APP_BASE_URL}/api/admin/stats/userDetail` const CourseListURL = `${APP_BASE_URL}/api/course/listall`
const { data : UsersList , mutate , isLoading} = useSWR(UserListURL , defaultFetcher); const { data, mutate, isLoading } = useSWR(CourseListURL, defaultFetcher);
console.log(UsersList)
return ( return (
<>
<AppContextProvider> <AppContextProvider>
<AdminView> <AdminView>
<CommonContainer> <CommonContainer>
<PageHeading>Users</PageHeading> <PageHeading>Courses</PageHeading>
<BreadCrumbNav breadCrumbItems={[ <BreadCrumbNav breadCrumbItems={[
{ {
title: 'Dashboard', title: 'Dashboard',
href: routes.DASHBOARD_ROUTE href: routes.DASHBOARD_ROUTE
}, },
{ {
title : 'Course', title: 'Courses',
href: routes.COURSE_INDEX_PAGE href: routes.COURSE_INDEX_PAGE
}, },
]}/> ]}/>
<ContentContainer> <ContentContainer>
<div> <div>
<UserTable <CourseTable
userData={CourseList?.course}
mutate={mutate} mutate={mutate}
isLoading={isLoading} isLoading={isLoading}
Data={data?.data || []}
/> />
</div> </div>
</ContentContainer> </ContentContainer>
</CommonContainer> </CommonContainer>
</AdminView> </AdminView>
</AppContextProvider> </AppContextProvider>
</>
) )
} }
export default UsersIndexPage export default CourseIndexPage

@ -5,7 +5,9 @@ export const routes = {
DASHBOARD_ROUTE : '/admin/dashboard', DASHBOARD_ROUTE : '/admin/dashboard',
PROFILE_ROUTE : '/user/profile', PROFILE_ROUTE : '/user/profile',
MY_COURSES_INDEX : '/my-courses', MY_COURSES_INDEX : '/my-courses',
USER_INDEX_PAGE : '/admin/users' USER_INDEX_PAGE : '/admin/users',
COURSE_INDEX_PAGE: '/admin/course',
CATEGORY_INDEX_PAGE: '/admin/category'
} }
export const privateRoutes = ['/user/profile'] export const privateRoutes = ['/user/profile']

Loading…
Cancel
Save