fix: clean folder

This commit is contained in:
ferdiansyah783 2025-08-07 03:53:40 +07:00
parent 5f24ec7899
commit a72a64215a
208 changed files with 174 additions and 29968 deletions

View File

@ -1,47 +0,0 @@
// MUI Imports
import Grid from '@mui/material/Grid2'
// Component Imports
import Details from '@views/apps/academy/course-details/Details'
import Sidebar from '@views/apps/academy/course-details/Sidebar'
// Data Imports
import { getAcademyData } from '@/app/server/actions'
/**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/apps/academy` in below example.
* ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code
* ! because we've used the server action for getting our static data.
*/
/* const getAcademyData = async () => {
// Vars
const res = await fetch(`${process.env.API_URL}/apps/academy`)
if (!res.ok) {
throw new Error('Failed to fetch academy data')
}
return res.json()
} */
const CourseDetailsPage = async () => {
// Vars
const data = await getAcademyData()
return (
<Grid container spacing={6}>
<Grid size={{ xs: 12, md: 8 }}>
<Details data={data?.courseDetails} />
</Grid>
<Grid size={{ xs: 12, md: 4 }}>
<div className='sticky top-[94px]'>
<Sidebar content={data?.courseDetails.content} />
</div>
</Grid>
</Grid>
)
}
export default CourseDetailsPage

View File

@ -1,65 +0,0 @@
// MUI Imports
import Grid from '@mui/material/Grid2'
// Component Imports
import WelcomeCard from '@views/apps/academy/dashboard/WelcomeCard'
import InterestedTopics from '@views/apps/academy/dashboard/InterestedTopics'
import PopularInstructors from '@views/apps/academy/dashboard/PopularInstructors'
import TopCourses from '@views/apps/academy/dashboard/TopCourses'
import UpcomingWebinar from '@views/apps/academy/dashboard/UpcomingWebinar'
import AssignmentProgress from '@views/apps/academy/dashboard/AssignmentProgress'
import CourseTable from '@views/apps/academy/dashboard/CourseTable'
// Data Imports
import { getAcademyData } from '@/app/server/actions'
/**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/apps/academy` in below example.
* ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code
* ! because we've used the server action for getting our static data.
*/
/* const getAcademyData = async () => {
// Vars
const res = await fetch(`${process.env.API_URL}/apps/academy`)
if (!res.ok) {
throw new Error('Failed to fetch academy data')
}
return res.json()
} */
const AcademyDashboard = async () => {
// Vars
const data = await getAcademyData()
return (
<Grid container spacing={6}>
<Grid size={{ xs: 12 }}>
<WelcomeCard />
</Grid>
<Grid size={{ xs: 12, md: 8 }}>
<InterestedTopics />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<PopularInstructors />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<TopCourses />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<UpcomingWebinar />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<AssignmentProgress />
</Grid>
<Grid size={{ xs: 12 }}>
<CourseTable courseData={data?.courses} />
</Grid>
</Grid>
)
}
export default AcademyDashboard

View File

@ -1,36 +0,0 @@
// Component Imports
import AcademyMyCourse from '@/views/apps/academy/my-courses'
// Server Action Imports
import { getServerMode } from '@core/utils/serverHelpers'
// Data Imports
import { getAcademyData } from '@/app/server/actions'
/**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/apps/academy` in below example.
* ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code
* ! because we've used the server action for getting our static data.
*/
/* const getAcademyData = async () => {
// Vars
const res = await fetch(`${process.env.API_URL}/apps/academy`)
if (!res.ok) {
throw new Error('Failed to fetch academy data')
}
return res.json()
} */
const MyCoursePage = async () => {
// Vars
const mode = await getServerMode()
const data = await getAcademyData()
return <AcademyMyCourse mode={mode} courseData={data?.courses} />
}
export default MyCoursePage

View File

@ -1,20 +0,0 @@
// MUI Imports
import Card from '@mui/material/Card'
// Component Imports
import CalendarWrapper from '@views/apps/calendar/CalendarWrapper'
// Styled Component Imports
import AppFullCalendar from '@/libs/styles/AppFullCalendar'
const CalendarApp = () => {
return (
<Card className='overflow-visible'>
<AppFullCalendar className='app-calendar'>
<CalendarWrapper />
</AppFullCalendar>
</Card>
)
}
export default CalendarApp

View File

@ -1,8 +0,0 @@
// Component Imports
import ChatWrapper from '@views/apps/chat'
const ChatApp = () => {
return <ChatWrapper />
}
export default ChatApp

View File

@ -1,46 +0,0 @@
// Next Imports
import { redirect } from 'next/navigation'
// Type Imports
import type { Customer } from '@/types/apps/ecommerceTypes'
// Component Imports
import CustomerDetails from '@/views/apps/ecommerce/customers/details'
// Data Imports
import { getEcommerceData } from '@/app/server/actions'
/**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/apps/ecommerce` in below example.
* ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code
* ! because we've used the server action for getting our static data.
*/
/* const getEcommerceData = async () => {
// Vars
const res = await fetch(`${process.env.API_URL}/apps/ecommerce`)
if (!res.ok) {
throw new Error('Failed to fetch ecommerce data')
}
return res.json()
} */
const CustomerDetailsPage = async (props: { params: Promise<{ id: string }> }) => {
const params = await props.params
// Vars
const data = await getEcommerceData()
const filteredData = data?.customerData.filter((item: Customer) => item.customerId === params.id)[0]
if (!filteredData) {
redirect('/not-found')
}
return filteredData ? <CustomerDetails customerData={filteredData} customerId={params.id} /> : null
}
export default CustomerDetailsPage

View File

@ -1,8 +1,5 @@
import CustomerListTable from '@views/apps/ecommerce/customers/list/CustomerListTable' import CustomerListTable from '@views/apps/ecommerce/customers/list/CustomerListTable'
// Data Imports
import { getEcommerceData } from '@/app/server/actions'
/** /**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/apps/ecommerce` in below example. * ! `.env` file found at root of your project and also update the API endpoints like `/apps/ecommerce` in below example.
@ -22,10 +19,7 @@ import { getEcommerceData } from '@/app/server/actions'
} */ } */
const CustomerListTablePage = async () => { const CustomerListTablePage = async () => {
// Vars return <CustomerListTable />
const data = await getEcommerceData()
return <CustomerListTable customerData={data?.customerData} />
} }
export default CustomerListTablePage export default CustomerListTablePage

View File

@ -14,9 +14,6 @@ import Orders from '@views/apps/ecommerce/dashboard/Orders'
import Transactions from '@views/apps/ecommerce/dashboard/Transactions' import Transactions from '@views/apps/ecommerce/dashboard/Transactions'
import InvoiceListTable from '@views/apps/ecommerce/dashboard/InvoiceListTable' import InvoiceListTable from '@views/apps/ecommerce/dashboard/InvoiceListTable'
// Data Imports
import { getInvoiceData } from '@/app/server/actions'
/** /**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/apps/invoice` in below example. * ! `.env` file found at root of your project and also update the API endpoints like `/apps/invoice` in below example.
@ -37,9 +34,6 @@ import { getInvoiceData } from '@/app/server/actions'
*/ */
const EcommerceDashboard = async () => { const EcommerceDashboard = async () => {
// Vars
const invoiceData = await getInvoiceData()
return ( return (
<Grid container spacing={6}> <Grid container spacing={6}>
<Grid size={{ xs: 12, md: 4 }}> <Grid size={{ xs: 12, md: 4 }}>
@ -77,7 +71,7 @@ const EcommerceDashboard = async () => {
<Transactions /> <Transactions />
</Grid> </Grid>
<Grid size={{ xs: 12, lg: 8 }}> <Grid size={{ xs: 12, lg: 8 }}>
<InvoiceListTable invoiceData={invoiceData} /> <InvoiceListTable invoiceData={[]} />
</Grid> </Grid>
</Grid> </Grid>
) )

View File

@ -1,49 +0,0 @@
// MUI Imports
import Grid from '@mui/material/Grid2'
// Component Imports
import TotalReviews from '@views/apps/ecommerce/manage-reviews/TotalReviews'
import ReviewsStatistics from '@views/apps/ecommerce/manage-reviews/ReviewsStatistics'
import ManageReviewsTable from '@views/apps/ecommerce/manage-reviews/ManageReviewsTable'
// Data Imports
import { getEcommerceData } from '@/app/server/actions'
/**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/apps/ecommerce` in below example.
* ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code
* ! because we've used the server action for getting our static data.
*/
/* const getEcommerceData = async () => {
// Vars
const res = await fetch(`${process.env.API_URL}/apps/ecommerce`)
if (!res.ok) {
throw new Error('Failed to fetch ecommerce data')
}
return res.json()
} */
const eCommerceManageReviews = async () => {
// Vars
const data = await getEcommerceData()
return (
<Grid container spacing={6}>
<Grid size={{ xs: 12, md: 6 }}>
<TotalReviews />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<ReviewsStatistics />
</Grid>
<Grid size={{ xs: 12 }}>
<ManageReviewsTable reviewsData={data?.reviews} />
</Grid>
</Grid>
)
}
export default eCommerceManageReviews

View File

@ -1,46 +0,0 @@
// Next Imports
import { redirect } from 'next/navigation'
// Type Imports
import type { OrderType } from '@/types/apps/ecommerceTypes'
// Component Imports
import OrderDetails from '@views/apps/ecommerce/orders/details'
// Data Imports
import { getEcommerceData } from '@/app/server/actions'
/**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/apps/ecommerce` in below example.
* ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code
* ! because we've used the server action for getting our static data.
*/
/* const getEcommerceData = async () => {
// Vars
const res = await fetch(`${process.env.API_URL}/apps/ecommerce`)
if (!res.ok) {
throw new Error('Failed to fetch ecommerce data')
}
return res.json()
} */
const OrderDetailsPage = async (props: { params: Promise<{ id: string }> }) => {
const params = await props.params
// Vars
const data = await getEcommerceData()
const filteredData = data?.orderData.filter((item: OrderType) => item.order === params.id)[0]
if (!filteredData) {
redirect('/not-found')
}
return filteredData ? <OrderDetails orderData={filteredData} order={params.id} /> : null
}
export default OrderDetailsPage

View File

@ -1,72 +0,0 @@
// MUI Imports
import Grid from '@mui/material/Grid2'
// Component Imports
import HorizontalStatisticsCard from '@views/apps/ecommerce/referrals/HorizontalStatisticsCard'
import IconStepsCard from '@views/apps/ecommerce/referrals/IconStepsCard'
import InviteAndShare from '@views/apps/ecommerce/referrals/InviteAndShare'
import ReferredUsersTable from '@views/apps/ecommerce/referrals/ReferredUsersTable'
// Data Imports
import { getEcommerceData, getStatisticsData } from '@/app/server/actions'
/**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/pages/widget-examples` in below example.
* ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code
* ! because we've used the server action for getting our static data.
*/
/* const getStatisticsData = async () => {
// Vars
const res = await fetch(`${process.env.API_URL}/pages/widget-examples`)
if (!res.ok) {
throw new Error('Failed to fetch statistics data')
}
return res.json()
} */
/**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/apps/ecommerce` in below example.
* ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code
* ! because we've used the server action for getting our static data.
*/
/* const getEcommerceData = async () => {
// Vars
const res = await fetch(`${process.env.API_URL}/apps/ecommerce`)
if (!res.ok) {
throw new Error('Failed to fetch ecommerce data')
}
return res.json()
} */
const eCommerceReferrals = async () => {
// Vars
const statsData = await getStatisticsData()
const ecommerceData = await getEcommerceData()
return (
<Grid container spacing={6}>
<Grid size={{ xs: 12 }}>
<HorizontalStatisticsCard data={statsData?.statsHorizontalWithAvatar} />
</Grid>
<Grid size={{ xs: 12, md: 8 }}>
<IconStepsCard />
</Grid>
<Grid size={{ xs: 12, md: 4 }}>
<InviteAndShare />
</Grid>
<Grid size={{ xs: 12 }}>
<ReferredUsersTable referralsData={ecommerceData?.referrals} />
</Grid>
</Grid>
)
}
export default eCommerceReferrals

View File

@ -1,10 +0,0 @@
// Component Imports
import EmailWrapper from '@views/apps/email'
const EmailFolderPage = async (props: { params: Promise<{ folder: string }> }) => {
const params = await props.params
return <EmailWrapper folder={params.folder} />
}
export default EmailFolderPage

View File

@ -1,10 +0,0 @@
// Component Imports
import EmailWrapper from '@views/apps/email'
const EmailLabelPage = async (props: { params: Promise<{ label: string }> }) => {
const params = await props.params
return <EmailWrapper label={params.label} />
}
export default EmailLabelPage

View File

@ -1,8 +0,0 @@
// Component Imports
import EmailWrapper from '@views/apps/email'
const EmailPage = () => {
return <EmailWrapper folder='inbox' />
}
export default EmailPage

View File

@ -1,45 +0,0 @@
// MUI Imports
import Grid from '@mui/material/Grid2'
// Component Imports
import AddCard from '@views/apps/invoice/add/AddCard'
import AddActions from '@views/apps/invoice/add/AddActions'
// Data Imports
import { getInvoiceData } from '@/app/server/actions'
/**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/apps/invoice` in below example.
* ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code
* ! because we've used the server action for getting our static data.
*/
/* const getInvoiceData = async () => {
// Vars
const res = await fetch(`${process.env.API_URL}/apps/invoice`)
if (!res.ok) {
throw new Error('Failed to fetch invoice data')
}
return res.json()
}
*/
const InvoiceAdd = async () => {
// Vars
const data = await getInvoiceData()
return (
<Grid container spacing={6}>
<Grid size={{ xs: 12, md: 9 }}>
<AddCard invoiceData={data} />
</Grid>
<Grid size={{ xs: 12, md: 3 }}>
<AddActions />
</Grid>
</Grid>
)
}
export default InvoiceAdd

View File

@ -1,59 +0,0 @@
// Next Imports
import { redirect } from 'next/navigation'
// MUI Imports
import Grid from '@mui/material/Grid2'
// Type Imports
import type { InvoiceType } from '@/types/apps/invoiceTypes'
// Component Imports
import EditCard from '@views/apps/invoice/edit/EditCard'
import EditActions from '@views/apps/invoice/edit/EditActions'
// Data Imports
import { getInvoiceData } from '@/app/server/actions'
/**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/apps/invoice` in below example.
* ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code
* ! because we've used the server action for getting our static data.
*/
/* const getInvoiceData = async () => {
// Vars
const res = await fetch(`${process.env.API_URL}/apps/invoice`)
if (!res.ok) {
throw new Error('Failed to fetch invoice data')
}
return res.json()
} */
const EditPage = async (props: { params: Promise<{ id: string }> }) => {
const params = await props.params
// Vars
const data = await getInvoiceData()
const filteredData = data?.filter((invoice: InvoiceType) => invoice.id === params.id)[0]
if (!filteredData) {
redirect('/not-found')
}
return filteredData ? (
<Grid container spacing={6}>
<Grid size={{ xs: 12, md: 9 }}>
<EditCard data={data} invoiceData={filteredData} id={params.id} />
</Grid>
<Grid size={{ xs: 12, md: 3 }}>
<EditActions id={params.id} />
</Grid>
</Grid>
) : null
}
export default EditPage

View File

@ -1,41 +0,0 @@
// MUI Imports
import Grid from '@mui/material/Grid2'
// Component Imports
import InvoiceList from '@views/apps/invoice/list'
// Data Imports
import { getInvoiceData } from '@/app/server/actions'
/**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/apps/invoice` in below example.
* ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code
* ! because we've used the server action for getting our static data.
*/
/* const getInvoiceData = async () => {
// Vars
const res = await fetch(`${process.env.API_URL}/apps/invoice`)
if (!res.ok) {
throw new Error('Failed to fetch invoice data')
}
return res.json()
} */
const InvoiceApp = async () => {
// Vars
const data = await getInvoiceData()
return (
<Grid container>
<Grid size={{ xs: 12 }}>
<InvoiceList invoiceData={data} />
</Grid>
</Grid>
)
}
export default InvoiceApp

View File

@ -1,46 +0,0 @@
// Next Imports
import { redirect } from 'next/navigation'
// Type Imports
import type { InvoiceType } from '@/types/apps/invoiceTypes'
// Component Imports
import Preview from '@views/apps/invoice/preview'
// Data Imports
import { getInvoiceData } from '@/app/server/actions'
/**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/apps/invoice` in below example.
* ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code
* ! because we've used the server action for getting our static data.
*/
/* const getInvoiceData = async () => {
// Vars
const res = await fetch(`${process.env.API_URL}/apps/invoice`)
if (!res.ok) {
throw new Error('Failed to fetch invoice data')
}
return res.json()
} */
const PreviewPage = async (props: { params: Promise<{ id: string }> }) => {
const params = await props.params
// Vars
const data = await getInvoiceData()
const filteredData = data?.filter((invoice: InvoiceType) => invoice.id === params.id)[0]
if (!filteredData) {
redirect('/not-found')
}
return filteredData ? <Preview invoiceData={filteredData} id={params.id} /> : null
}
export default PreviewPage

View File

@ -1,27 +0,0 @@
// Third-party Imports
import classnames from 'classnames'
// Component Imports
import KanbanBoard from '@views/apps/kanban/KanbanBoard'
// Util Imports
import { commonLayoutClasses } from '@layouts/utils/layoutClasses'
// Styles Imports
import styles from '@views/apps/kanban/styles.module.css'
const KanbanPage = () => {
return (
<div
className={classnames(
commonLayoutClasses.contentHeightFixed,
styles.scroll,
'is-full overflow-auto pis-2 -mis-2'
)}
>
<KanbanBoard />
</div>
)
}
export default KanbanPage

View File

@ -1,84 +0,0 @@
//MUI Imports
import Grid from '@mui/material/Grid2'
//Component Imports
import LogisticsStatisticsCard from '@views/apps/logistics/dashboard/LogisticsStatisticsCard'
import LogisticsVehicleOverview from '@views/apps/logistics/dashboard/LogisticsVehicleOverview'
import LogisticsShipmentStatistics from '@views/apps/logistics/dashboard/LogisticsShipmentStatistics'
import LogisticsDeliveryPerformance from '@views/apps/logistics/dashboard/LogisticsDeliveryPerformance'
import LogisticsDeliveryExceptions from '@views/apps/logistics/dashboard/LogisticsDeliveryExceptions'
import LogisticsOrdersByCountries from '@/views/apps/logistics/dashboard/LogisticsOrdersByCountries'
import LogisticsOverviewTable from '@views/apps/logistics/dashboard/LogisticsOverviewTable'
//Data Imports
import { getLogisticsData, getStatisticsData } from '@/app/server/actions'
/**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/pages/widget-examples` in below example.
* ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code
* ! because we've used the server action for getting our static data.
*/
/* const getStatisticsData = async () => {
// Vars
const res = await fetch(`${process.env.API_URL}/pages/widget-examples`)
if (!res.ok) {
throw new Error('Failed to fetch statisticsData')
}
return res.json()
} */
/**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/apps/logistics` in below example.
* ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code
* ! because we've used the server action for getting our static data.
*/
/* const getLogisticsData = async () => {
// Vars
const res = await fetch(`${process.env.API_URL}/apps/logistics`)
if (!res.ok) {
throw new Error('Failed to fetch logistics data')
}
return res.json()
} */
const LogisticsDashboard = async () => {
// Vars
const data = await getStatisticsData()
const vehicleData = await getLogisticsData()
return (
<Grid container spacing={6}>
<Grid size={{ xs: 12 }}>
<LogisticsStatisticsCard data={data?.statsHorizontalWithBorder} />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<LogisticsVehicleOverview />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<LogisticsShipmentStatistics />
</Grid>
<Grid size={{ xs: 12, md: 4 }}>
<LogisticsDeliveryPerformance />
</Grid>
<Grid size={{ xs: 12, md: 4 }}>
<LogisticsDeliveryExceptions />
</Grid>
<Grid size={{ xs: 12, md: 4 }}>
<LogisticsOrdersByCountries />
</Grid>
<Grid size={{ xs: 12 }}>
<LogisticsOverviewTable vehicleData={vehicleData?.vehicles} />
</Grid>
</Grid>
)
}
export default LogisticsDashboard

View File

@ -1,8 +0,0 @@
// Component Imports
import Fleet from '@views/apps/logistics/fleet'
const FleetPage = () => {
return <Fleet mapboxAccessToken={process.env.MAPBOX_ACCESS_TOKEN!} />
}
export default FleetPage

View File

@ -2,7 +2,6 @@
import Permissions from '@views/apps/permissions' import Permissions from '@views/apps/permissions'
// Data Imports // Data Imports
import { getPermissionsData } from '@/app/server/actions'
/** /**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
@ -23,10 +22,8 @@ import { getPermissionsData } from '@/app/server/actions'
} */ } */
const PermissionsApp = async () => { const PermissionsApp = async () => {
// Vars
const data = await getPermissionsData()
return <Permissions permissionsData={data} /> return <Permissions permissionsData={[]} />
} }
export default PermissionsApp export default PermissionsApp

View File

@ -2,7 +2,6 @@
import Roles from '@views/apps/roles' import Roles from '@views/apps/roles'
// Data Imports // Data Imports
import { getUserData } from '@/app/server/actions'
/** /**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
@ -23,10 +22,8 @@ import { getUserData } from '@/app/server/actions'
} */ } */
const RolesApp = async () => { const RolesApp = async () => {
// Vars
const data = await getUserData()
return <Roles userData={data} /> return <Roles userData={[]} />
} }
export default RolesApp export default RolesApp

View File

@ -1,9 +1,6 @@
// Component Imports // Component Imports
import UserList from '@views/apps/user/list' import UserList from '@views/apps/user/list'
// Data Imports
import { getUserData } from '@/app/server/actions'
/** /**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/apps/user-list` in below example. * ! `.env` file found at root of your project and also update the API endpoints like `/apps/user-list` in below example.
@ -23,10 +20,8 @@ import { getUserData } from '@/app/server/actions'
} */ } */
const UserListApp = async () => { const UserListApp = async () => {
// Vars
const data = await getUserData()
return <UserList userData={data} /> return <UserList userData={[]} />
} }
export default UserListApp export default UserListApp

View File

@ -14,9 +14,6 @@ import type { PricingPlanType } from '@/types/pages/pricingTypes'
import UserLeftOverview from '@views/apps/user/view/user-left-overview' import UserLeftOverview from '@views/apps/user/view/user-left-overview'
import UserRight from '@views/apps/user/view/user-right' import UserRight from '@views/apps/user/view/user-right'
// Data Imports
import { getPricingData } from '@/app/server/actions'
const OverViewTab = dynamic(() => import('@views/apps/user/view/user-right/overview')) const OverViewTab = dynamic(() => import('@views/apps/user/view/user-right/overview'))
const SecurityTab = dynamic(() => import('@views/apps/user/view/user-right/security')) const SecurityTab = dynamic(() => import('@views/apps/user/view/user-right/security'))
const BillingPlans = dynamic(() => import('@views/apps/user/view/user-right/billing-plans')) const BillingPlans = dynamic(() => import('@views/apps/user/view/user-right/billing-plans'))
@ -51,16 +48,13 @@ const tabContentList = (data?: PricingPlanType[]): { [key: string]: ReactElement
} */ } */
const UserViewTab = async () => { const UserViewTab = async () => {
// Vars
const data = await getPricingData()
return ( return (
<Grid container spacing={6}> <Grid container spacing={6}>
<Grid size={{ xs: 12, lg: 4, md: 5 }}> <Grid size={{ xs: 12, lg: 4, md: 5 }}>
<UserLeftOverview /> <UserLeftOverview />
</Grid> </Grid>
<Grid size={{ xs: 12, lg: 8, md: 7 }}> <Grid size={{ xs: 12, lg: 8, md: 7 }}>
<UserRight tabContentList={tabContentList(data)} /> <UserRight tabContentList={tabContentList([])} />
</Grid> </Grid>
</Grid> </Grid>
) )

View File

@ -1,72 +0,0 @@
// Next Imports
import Link from 'next/link'
// MUI Imports
import Grid from '@mui/material/Grid2'
import Typography from '@mui/material/Typography'
// Component Imports
import ApexBarChart from '@views/charts/apex/ApexBarChart'
import ApexAreaChart from '@views/charts/apex/ApexAreaChart'
import ApexLineChart from '@views/charts/apex/ApexLineChart'
import ApexRadarChart from '@views/charts/apex/ApexRadarChart'
import ApexDonutChart from '@views/charts/apex/ApexDonutChart'
import ApexColumnChart from '@views/charts/apex/ApexColumnChart'
import ApexScatterChart from '@views/charts/apex/ApexScatterChart'
import ApexHeatmapChart from '@views/charts/apex/ApexHeatmapChart'
import ApexRadialBarChart from '@views/charts/apex/ApexRadialBarChart'
import ApexCandlestickChart from '@views/charts/apex/ApexCandlestickChart'
const ApexCharts = () => {
return (
<Grid container spacing={6}>
<Grid size={{ xs: 12 }}>
<Typography variant='h4'>ApexCharts</Typography>
<Typography>
<code>react-apexcharts</code> is a third-party library. Please refer to its{' '}
<Link
href='https://apexcharts.com'
target='_blank'
rel='noopener noreferrer'
className='no-underline text-primary'
>
official documentation
</Link>{' '}
for more details.
</Typography>
</Grid>
<Grid size={{ xs: 12 }}>
<ApexAreaChart />
</Grid>
<Grid size={{ xs: 12 }}>
<ApexColumnChart />
</Grid>
<Grid size={{ xs: 12 }}>
<ApexScatterChart />
</Grid>
<Grid size={{ xs: 12 }}>
<ApexLineChart />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<ApexBarChart />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<ApexCandlestickChart />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<ApexHeatmapChart />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<ApexRadialBarChart />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<ApexRadarChart />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<ApexDonutChart />
</Grid>
</Grid>
)
}
export default ApexCharts

View File

@ -1,56 +0,0 @@
// Next Imports
import Link from 'next/link'
// MUI Imports
import Grid from '@mui/material/Grid2'
import Typography from '@mui/material/Typography'
// Component Imports
import RechartsBarChart from '@views/charts/recharts/RechartsBarChart'
import RechartsPieChart from '@views/charts/recharts/RechartsPieChart'
import RechartsLineChart from '@views/charts/recharts/RechartsLineChart'
import RechartsAreaChart from '@views/charts/recharts/RechartsAreaChart'
import RechartsRadarChart from '@views/charts/recharts/RechartsRadarChart'
import RechartsScatterChart from '@views/charts/recharts/RechartsScatterChart'
const Recharts = () => {
return (
<Grid container spacing={6}>
<Grid size={{ xs: 12 }}>
<Typography variant='h4'>Recharts</Typography>
<Typography>
<code>recharts</code> is a third-party library. Please refer to its{' '}
<Link
href='https://recharts.org'
target='_blank'
rel='noopener noreferrer'
className='no-underline text-primary'
>
official documentation
</Link>{' '}
for more details.
</Typography>
</Grid>
<Grid size={{ xs: 12 }}>
<RechartsLineChart />
</Grid>
<Grid size={{ xs: 12 }}>
<RechartsAreaChart />
</Grid>
<Grid size={{ xs: 12 }}>
<RechartsScatterChart />
</Grid>
<Grid size={{ xs: 12 }}>
<RechartsBarChart />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<RechartsRadarChart />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<RechartsPieChart />
</Grid>
</Grid>
)
}
export default Recharts

View File

@ -1,8 +0,0 @@
// Component Imports
import AcademyDashboard from '../../apps/academy/dashboard/page'
const DashboardAcademy = async () => {
return <AcademyDashboard />
}
export default DashboardAcademy

View File

@ -13,9 +13,6 @@ import MonthlyCampaignState from '@views/dashboards/analytics/MonthlyCampaignSta
import SourceVisits from '@views/dashboards/analytics/SourceVisits' import SourceVisits from '@views/dashboards/analytics/SourceVisits'
import ProjectsTable from '@views/dashboards/analytics/ProjectsTable' import ProjectsTable from '@views/dashboards/analytics/ProjectsTable'
// Data Imports
import { getProfileData } from '@/app/server/actions'
/** /**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/pages/profile` in below example. * ! `.env` file found at root of your project and also update the API endpoints like `/pages/profile` in below example.
@ -35,8 +32,6 @@ import { getProfileData } from '@/app/server/actions'
} */ } */
const DashboardAnalytics = async () => { const DashboardAnalytics = async () => {
// Vars
const data = await getProfileData()
return ( return (
<Grid container spacing={6}> <Grid container spacing={6}>
@ -68,7 +63,7 @@ const DashboardAnalytics = async () => {
<SourceVisits /> <SourceVisits />
</Grid> </Grid>
<Grid size={{ xs: 12, lg: 8 }}> <Grid size={{ xs: 12, lg: 8 }}>
<ProjectsTable projectTable={data?.users.profile.projectTable} /> <ProjectsTable projectTable={[]} />
</Grid> </Grid>
</Grid> </Grid>
) )

View File

@ -1,7 +0,0 @@
import LogisticsDashboard from '../../apps/logistics/dashboard/page'
const DashboardLogistics = () => {
return <LogisticsDashboard />
}
export default DashboardLogistics

View File

@ -1,44 +0,0 @@
// MUI Imports
import Grid from '@mui/material/Grid2'
import Typography from '@mui/material/Typography'
// Component Imports
import FormLayoutsBasic from '@views/forms/form-layouts/FormLayoutsBasic'
import FormLayoutsIcon from '@views/forms/form-layouts/FormLayoutsIcons'
import FormLayoutsSeparator from '@views/forms/form-layouts/FormLayoutsSeparator'
import FormLayoutsTabs from '@views/forms/form-layouts/FormLayoutsTabs'
import FormLayoutsCollapsible from '@views/forms/form-layouts/FormLayoutsCollapsible'
import FormLayoutsAlignment from '@views/forms/form-layouts/FormLayoutsAlignment'
const FormLayouts = () => {
return (
<Grid container spacing={6}>
<Grid size={{ xs: 12, md: 6 }}>
<FormLayoutsBasic />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<FormLayoutsIcon />
</Grid>
<Grid size={{ xs: 12 }}>
<FormLayoutsSeparator />
</Grid>
<Grid size={{ xs: 12 }}>
<Typography variant='h5'>Form with Tabs</Typography>
</Grid>
<Grid size={{ xs: 12 }}>
<FormLayoutsTabs />
</Grid>
<Grid size={{ xs: 12 }}>
<Typography variant='h5'>Collapsible Sections</Typography>
</Grid>
<Grid size={{ xs: 12 }}>
<FormLayoutsCollapsible />
</Grid>
<Grid size={{ xs: 12 }}>
<FormLayoutsAlignment />
</Grid>
</Grid>
)
}
export default FormLayouts

View File

@ -1,44 +0,0 @@
// Next Imports
import Link from 'next/link'
// MUI Imports
import Grid from '@mui/material/Grid2'
import Typography from '@mui/material/Typography'
// Component Imports
import FormValidationBasic from '@views/forms/form-validation/FormValidationBasic'
import FormValidationOnSchema from '@views/forms/form-validation/FormValidationSchema'
import FormValidationAsyncSubmit from '@views/forms/form-validation/FormValidationAsyncSubmit'
const FormValidation = () => {
return (
<Grid container spacing={6}>
<Grid size={{ xs: 12 }}>
<Typography variant='h4'>React Hook Form</Typography>
<Typography>
<code>react-hook-form</code> is a third-party library. Please refer to its{' '}
<Link
href='https://react-hook-form.com'
target='_blank'
rel='noopener noreferrer'
className='no-underline text-primary'
>
official documentation
</Link>{' '}
for more details.
</Typography>
</Grid>
<Grid size={{ xs: 12 }}>
<FormValidationBasic />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<FormValidationOnSchema />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<FormValidationAsyncSubmit />
</Grid>
</Grid>
)
}
export default FormValidation

View File

@ -1,77 +0,0 @@
// Next Imports
import Link from 'next/link'
// MUI Imports
import Grid from '@mui/material/Grid2'
import Typography from '@mui/material/Typography'
// Component Imports
import StepperLinearWithValidation from '@views/forms/form-wizard/StepperLinearWithValidation'
import StepperAlternativeLabel from '@views/forms/form-wizard/StepperAlternativeLabel'
import StepperVerticalWithNumbers from '@views/forms/form-wizard/StepperVerticalWithNumbers'
import StepperVerticalWithoutNumbers from '@views/forms/form-wizard/StepperVerticalWithoutNumbers'
import StepperCustomHorizontal from '@views/forms/form-wizard/StepperCustomHorizontal'
import StepperCustomVertical from '@views/forms/form-wizard/StepperCustomVertical'
const FormWizard = () => {
return (
<Grid container spacing={6}>
<Grid size={{ xs: 12 }}>
<Typography variant='h4'>Stepper</Typography>
<Typography>
Please refer to MUI&#39;s official docs for more details on component&#39;s{' '}
<Link
href='https://mui.com/material-ui/react-stepper'
target='_blank'
rel='noopener noreferrer'
className='no-underline text-primary'
>
usage guide
</Link>{' '}
and{' '}
<Link
href='https://mui.com/material-ui/react-stepper/#api'
target='_blank'
rel='noopener noreferrer'
className='no-underline text-primary'
>
API documentation
</Link>
.
</Typography>
</Grid>
<Grid size={{ xs: 12 }}>
<Typography variant='h5'>Linear Stepper with Validation</Typography>
</Grid>
<Grid size={{ xs: 12 }}>
<StepperLinearWithValidation />
</Grid>
<Grid size={{ xs: 12 }}>
<Typography variant='h5'>Alternative Label</Typography>
</Grid>
<Grid size={{ xs: 12 }}>
<StepperAlternativeLabel />
</Grid>
<Grid size={{ xs: 12 }}>
<StepperVerticalWithNumbers />
</Grid>
<Grid size={{ xs: 12 }}>
<StepperVerticalWithoutNumbers />
</Grid>
<Grid size={{ xs: 12 }}>
<Typography variant='h5'>Custom Horizontal Stepper</Typography>
</Grid>
<Grid size={{ xs: 12 }}>
<StepperCustomHorizontal />
</Grid>
<Grid size={{ xs: 12 }}>
<Typography variant='h5'>Custom Vertical Stepper</Typography>
</Grid>
<Grid size={{ xs: 12 }}>
<StepperCustomVertical />
</Grid>
</Grid>
)
}
export default FormWizard

View File

@ -1,29 +0,0 @@
// React Imports
import type { ReactElement } from 'react'
// Next Imports
import dynamic from 'next/dynamic'
// Component Imports
import AccountSettings from '@views/pages/account-settings'
const AccountTab = dynamic(() => import('@views/pages/account-settings/account'))
const SecurityTab = dynamic(() => import('@views/pages/account-settings/security'))
const BillingPlansTab = dynamic(() => import('@views/pages/account-settings/billing-plans'))
const NotificationsTab = dynamic(() => import('@views/pages/account-settings/notifications'))
const ConnectionsTab = dynamic(() => import('@views/pages/account-settings/connections'))
// Vars
const tabContentList = (): { [key: string]: ReactElement } => ({
account: <AccountTab />,
security: <SecurityTab />,
'billing-plans': <BillingPlansTab />,
notifications: <NotificationsTab />,
connections: <ConnectionsTab />
})
const AccountSettingsPage = () => {
return <AccountSettings tabContentList={tabContentList()} />
}
export default AccountSettingsPage

View File

@ -1,77 +0,0 @@
// MUI Imports
import Grid from '@mui/material/Grid2'
// Component Imports
import DialogAddCard from '@views/pages/dialog-examples/DialogAddCard'
import DialogEditUserInfo from '@views/pages/dialog-examples/DialogEditUserInfo'
import DialogAuthentication from '@views/pages/dialog-examples/DialogAuthentication'
import DialogAddNewAddress from '@views/pages/dialog-examples/DialogAddNewAddress'
import DialogShareProject from '@views/pages/dialog-examples/DialogShareProject'
import DialogReferEarn from '@views/pages/dialog-examples/DialogReferEarn'
import DialogPaymentMethod from '@views/pages/dialog-examples/DialogPaymentMethod'
import DialogPaymentProviders from '@views/pages/dialog-examples/DialogPaymentProviders'
import DialogCreateApp from '@views/pages/dialog-examples/DialogCreateApp'
import DialogPricing from '@views/pages/dialog-examples/DialogPricing'
// Data Imports
import { getPricingData } from '@/app/server/actions'
/**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/pages/pricing` in below example.
* ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code
* ! because we've used the server action for getting our static data.
*/
/* const getPricingData = async () => {
// Vars
const res = await fetch(`${process.env.API_URL}/pages/pricing`)
if (!res.ok) {
throw new Error('Failed to fetch data')
}
return res.json()
} */
const DialogExamples = async () => {
// Vars
const data = await getPricingData()
return (
<Grid container spacing={6}>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<DialogAddCard />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<DialogEditUserInfo />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<DialogAuthentication />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<DialogAddNewAddress />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<DialogShareProject />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<DialogReferEarn />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<DialogPaymentMethod />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<DialogPaymentProviders />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<DialogPricing data={data} />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<DialogCreateApp />
</Grid>
</Grid>
)
}
export default DialogExamples

View File

@ -1,32 +0,0 @@
// Component Imports
import FAQ from '@views/pages/faq'
// Data Imports
import { getFaqData } from '@/app/server/actions'
/**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/pages/faq` in below example.
* ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code
* ! because we've used the server action for getting our static data.
*/
/* const getFaqData = async () => {
// Vars
const res = await fetch(`${process.env.API_URL}/pages/faq`)
if (!res.ok) {
throw new Error('Failed to fetch faqData')
}
return res.json()
} */
const FAQPage = async () => {
// Vars
const data = await getFaqData()
return <FAQ data={data} />
}
export default FAQPage

View File

@ -1,32 +0,0 @@
// Component Imports
import Pricing from '@views/pages/pricing'
// Data Imports
import { getPricingData } from '@/app/server/actions'
/**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/pages/pricing` in below example.
* ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code
* ! because we've used the server action for getting our static data.
*/
/* const getPricingData = async () => {
// Vars
const res = await fetch(`${process.env.API_URL}/pages/pricing`)
if (!res.ok) {
throw new Error('Failed to fetch data')
}
return res.json()
} */
const PricePage = async () => {
// Vars
const data = await getPricingData()
return <Pricing data={data} />
}
export default PricePage

View File

@ -1,54 +0,0 @@
// React Imports
import type { ReactElement } from 'react'
// Next Imports
import dynamic from 'next/dynamic'
// Type Imports
import type { Data } from '@/types/pages/profileTypes'
// Component Imports
import UserProfile from '@views/pages/user-profile'
// Data Imports
import { getProfileData } from '@/app/server/actions'
const ProfileTab = dynamic(() => import('@views/pages/user-profile/profile'))
const TeamsTab = dynamic(() => import('@views/pages/user-profile/teams'))
const ProjectsTab = dynamic(() => import('@views/pages/user-profile/projects'))
const ConnectionsTab = dynamic(() => import('@views/pages/user-profile/connections'))
// Vars
const tabContentList = (data?: Data): { [key: string]: ReactElement } => ({
profile: <ProfileTab data={data?.users.profile} />,
teams: <TeamsTab data={data?.users.teams} />,
projects: <ProjectsTab data={data?.users.projects} />,
connections: <ConnectionsTab data={data?.users.connections} />
})
/**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/pages/profile` in below example.
* ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code
* ! because we've used the server action for getting our static data.
*/
/* const getProfileData = async () => {
// Vars
const res = await fetch(`${process.env.API_URL}/pages/profile`)
if (!res.ok) {
throw new Error('Failed to fetch profileData')
}
return res.json()
} */
const ProfilePage = async () => {
// Vars
const data = await getProfileData()
return <UserProfile data={data} tabContentList={tabContentList(data)} />
}
export default ProfilePage

View File

@ -1,33 +0,0 @@
// MUI Imports
import Grid from '@mui/material/Grid2'
// Components Imports
import CardActionsTable from '@views/pages/widget-examples/actions/Table'
import CardActionCollapsible from '@views/pages/widget-examples/actions/Collapsible'
import CardActionRefreshContent from '@views/pages/widget-examples/actions/RefreshContent'
import CardActionRemoveCard from '@views/pages/widget-examples/actions/RemoveCard'
import CardActionAll from '@views/pages/widget-examples/actions/AllActions'
const Actions = () => {
return (
<Grid container spacing={6}>
<Grid size={{ xs: 12 }}>
<CardActionsTable />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<CardActionCollapsible />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<CardActionRefreshContent />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<CardActionRemoveCard />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<CardActionAll />
</Grid>
</Grid>
)
}
export default Actions

View File

@ -1,95 +0,0 @@
// MUI Imports
import Grid from '@mui/material/Grid2'
// Components Imports
import MonthlyCampaignState from '@views/pages/widget-examples/advanced/MonthlyCampaignState'
import ActiveProjects from '@views/pages/widget-examples/advanced/ActiveProjects'
import SourceVisits from '@views/pages/widget-examples/advanced/SourceVisits'
import SalesByCountries from '@views/pages/widget-examples/advanced/SalesByCountries'
import EarningReports from '@views/pages/widget-examples/advanced/EarningReports'
import BrowserStates from '@views/pages/widget-examples/advanced/BrowserStates'
import Orders from '@views/pages/widget-examples/advanced/Orders'
import Transactions from '@views/pages/widget-examples/advanced/Transactions'
import PopularProducts from '@views/pages/widget-examples/advanced/PopularProducts'
import TopCourses from '@views/pages/widget-examples/advanced/TopCourses'
import UpcomingWebinar from '@views/pages/widget-examples/advanced/UpcomingWebinar'
import AssignmentProgress from '@views/pages/widget-examples/advanced/AssignmentProgress'
import DeliveryPerformance from '@views/pages/widget-examples/advanced/DeliveryPerformance'
import VehicleCondition from '@views/pages/widget-examples/advanced/VehicleCondition'
import PopularInstructors from '@views/pages/widget-examples/advanced/PopularInstructors'
import LastTransaction from '@views/pages/widget-examples/advanced/LastTransaction'
import ActivityTimeline from '@views/pages/widget-examples/advanced/ActivityTimeline'
import WebsiteAnalyticsSlider from '@views/pages/widget-examples/advanced/WebsiteAnalyticsSlider'
import Congratulations from '@/views/pages/widget-examples/advanced/Congratulations'
// Server Action Imports
import { getServerMode } from '@core/utils/serverHelpers'
const Advanced = async () => {
// Vars
const serverMode = await getServerMode()
return (
<Grid container spacing={6}>
<Grid size={{ xs: 12, md: 6, lg: 4 }}>
<MonthlyCampaignState />
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 4 }}>
<ActiveProjects />
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 4 }}>
<SourceVisits />
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 4 }}>
<SalesByCountries />
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 4 }}>
<EarningReports />
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 4 }}>
<BrowserStates />
</Grid>
<Grid size={{ xs: 12, lg: 4 }}>
<Orders />
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 4 }}>
<Transactions />
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 4 }}>
<PopularProducts />
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 4 }}>
<TopCourses />
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 4 }}>
<UpcomingWebinar />
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 4 }}>
<AssignmentProgress />
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 4 }}>
<DeliveryPerformance />
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 4 }}>
<VehicleCondition />
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 4 }}>
<PopularInstructors />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<LastTransaction serverMode={serverMode} />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<ActivityTimeline />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<WebsiteAnalyticsSlider />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<Congratulations />
</Grid>
</Grid>
)
}
export default Advanced

View File

@ -1,87 +0,0 @@
// MUI Imports
import Grid from '@mui/material/Grid2'
import Typography from '@mui/material/Typography'
import Divider from '@mui/material/Divider'
// Components Imports
import CardInfluencingInfluencerWithImg from '@views/pages/widget-examples/basic/CardInfluencingInfluencerWithImg'
import CardUser from '@views/pages/widget-examples/basic/CardUser'
import CardWithCollapse from '@views/pages/widget-examples/basic/CardWithCollapse'
import CardMobile from '@views/pages/widget-examples/basic/CardMobile'
import CardHorizontalRatings from '@views/pages/widget-examples/basic/CardHorizontalRatings'
import CardWatch from '@views/pages/widget-examples/basic/CardWatch'
import CardLifetimeMembership from '@views/pages/widget-examples/basic/CardLifetimeMembership'
import CardInfluencingInfluencer from '@views/pages/widget-examples/basic/CardInfluencingInfluencer'
import CardVerticalRatings from '@views/pages/widget-examples/basic/CardVerticalRatings'
import CardSupport from '@views/pages/widget-examples/basic/CardSupport'
import CardWithTabs from '@views/pages/widget-examples/basic/CardWithTabs'
import CardWithTabsCenter from '@views/pages/widget-examples/basic/CardWithTabsCenter'
import CardTwitter from '@views/pages/widget-examples/basic/CardTwitter'
import CardFacebook from '@views/pages/widget-examples/basic/CardFacebook'
import CardLinkedIn from '@views/pages/widget-examples/basic/CardLinkedIn'
const Basic = () => {
return (
<Grid container spacing={6}>
<Grid size={{ xs: 12 }}>
<Typography variant='h3'>Basic Cards</Typography>
<Divider />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<CardInfluencingInfluencerWithImg />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<CardUser />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<CardWithCollapse />
</Grid>
<Grid size={{ xs: 12, sm: 6 }}>
<CardMobile />
</Grid>
<Grid size={{ xs: 12, sm: 6 }}>
<CardHorizontalRatings />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<CardWatch />
</Grid>
<Grid size={{ xs: 12, md: 8 }}>
<CardLifetimeMembership />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<CardInfluencingInfluencer />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<CardVerticalRatings />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<CardSupport />
</Grid>
<Grid size={{ xs: 12 }} className='pbs-12'>
<Typography variant='h3'>Navigation Cards</Typography>
<Divider />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<CardWithTabs />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<CardWithTabsCenter />
</Grid>
<Grid size={{ xs: 12 }} className='pbs-12'>
<Typography variant='h3'>Solid Cards</Typography>
<Divider />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<CardTwitter />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<CardFacebook />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<CardLinkedIn />
</Grid>
</Grid>
)
}
export default Basic

View File

@ -1,57 +0,0 @@
// MUI Imports
import Grid from '@mui/material/Grid2'
// Components Imports
import EarningReports from '@views/pages/widget-examples/charts/EarningReports'
import SupportTracker from '@views/pages/widget-examples/charts/SupportTracker'
import Sales from '@views/pages/widget-examples/charts/Sales'
import RevenueReport from '@views/pages/widget-examples/charts/RevenueReport'
import ProjectStatus from '@views/pages/widget-examples/charts/ProjectStatus'
import EarningReportsWithTabs from '@views/pages/widget-examples/charts/EarningReportsWithTabs'
import TotalEarning from '@views/pages/widget-examples/charts/TotalEarning'
import CarrierPerformance from '@views/pages/widget-examples/charts/CarrierPerformance'
import DeliveryExceptions from '@views/pages/widget-examples/charts/DeliveryExceptions'
import VehicleOverview from '@views/pages/widget-examples/charts/VehicleOverview'
import InterestedTopics from '@views/pages/widget-examples/charts/InterestedTopics'
const Charts = () => {
return (
<Grid container spacing={6}>
<Grid size={{ xs: 12, md: 6 }}>
<EarningReports />
</Grid>
<Grid size={{ xs: 12, md: 6 }}>
<SupportTracker />
</Grid>
<Grid size={{ xs: 12, md: 4 }}>
<Sales />
</Grid>
<Grid size={{ xs: 12, md: 8 }}>
<RevenueReport />
</Grid>
<Grid size={{ xs: 12, md: 4 }}>
<ProjectStatus />
</Grid>
<Grid size={{ xs: 12, md: 8 }}>
<EarningReportsWithTabs />
</Grid>
<Grid size={{ xs: 12, md: 5, lg: 4 }}>
<TotalEarning />
</Grid>
<Grid size={{ xs: 12, md: 7, lg: 8 }}>
<CarrierPerformance />
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 4 }}>
<DeliveryExceptions />
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 8 }}>
<VehicleOverview />
</Grid>
<Grid size={{ xs: 12 }}>
<InterestedTopics />
</Grid>
</Grid>
)
}
export default Charts

View File

@ -1,121 +0,0 @@
// MUI Imports
import Grid from '@mui/material/Grid2'
// Component Imports
import StatisticsCard from '@views/pages/widget-examples/statistics/StatisticsCard'
import Square from '@views/pages/widget-examples/statistics/Square'
import DistributedBarChartOrder from '@/views/pages/widget-examples/statistics/DistributedBarChartOrder'
import LineAreaYearlySalesChart from '@views/pages/widget-examples/statistics/LineAreaYearlySalesChart'
import LineChartProfit from '@views/pages/widget-examples/statistics/LineChartProfit'
import BarChartSessionsWithNegativeValues from '@views/pages/widget-examples/statistics/BarChartSessionsWithNegativeValues'
import RadialBarChart from '@views/pages/widget-examples/statistics/RadialBarChart'
import LineChartImpression from '@views/pages/widget-examples/statistics/LineChartImpression'
import Horizontal from '@views/pages/widget-examples/statistics/Horizontal'
import CardStatsLineAreaCharts from '@views/pages/widget-examples/statistics/CardStatsLineAreaCharts'
import LineAreaDailySalesChart from '@views/pages/widget-examples/statistics/LineAreaDailySalesChart'
import SalesOverview from '@views/pages/widget-examples/statistics/SalesOverview'
import BarChartDailyTraffic from '@views/pages/widget-examples/statistics/BarChartDailyTraffic'
import SubscribersOrders from '@views/pages/widget-examples/statistics/SubscribersOrders'
import Vertical from '@views/pages/widget-examples/statistics/Vertical'
import BarChartRevenueGrowth from '@views/pages/widget-examples/statistics/BarChartRevenueGrowth'
import DonutChartGeneratedLeads from '@views/pages/widget-examples/statistics/DonutChartGeneratedLeads'
import HorizontalStatisticsCard from '@views/pages/widget-examples/statistics/HorizontalStatisticsCard'
import CustomerStatisticsCard from '@views/pages/widget-examples/statistics/CustomerStatisticsCard'
import LogisticsStatisticsCard from '@views/apps/logistics/dashboard/LogisticsStatisticsCard'
import UserListCards from '@views/pages/widget-examples/statistics/UserListCards'
// Data Imports
import { getStatisticsData } from '@/app/server/actions'
/**
* ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the
* ! `.env` file found at root of your project and also update the API endpoints like `/pages/widget-examples` in below example.
* ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code
* ! because we've used the server action for getting our static data.
*/
/* const getStatisticsData = async () => {
// Vars
const res = await fetch(`${process.env.API_URL}/pages/widget-examples`)
if (!res.ok) {
throw new Error('Failed to fetch statistics data')
}
return res.json()
} */
const Statistics = async () => {
// Vars
const statsData = await getStatisticsData()
return (
<Grid container spacing={6}>
<Grid size={{ xs: 12, md: 8 }}>
<StatisticsCard />
</Grid>
<Grid size={{ xs: 12, md: 4 }}>
<Square data={statsData.statsSquare} />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4, lg: 2 }}>
<DistributedBarChartOrder />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4, lg: 2 }}>
<LineAreaYearlySalesChart />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4, lg: 2 }}>
<LineChartProfit />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4, lg: 2 }}>
<BarChartSessionsWithNegativeValues />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4, lg: 2 }}>
<RadialBarChart />
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4, lg: 2 }}>
<LineChartImpression />
</Grid>
<Grid size={{ xs: 12 }}>
<LogisticsStatisticsCard data={statsData?.statsHorizontalWithBorder} />
</Grid>
<Grid size={{ xs: 12 }}>
<UserListCards />
</Grid>
<Grid size={{ xs: 12 }}>
<Horizontal data={statsData.statsHorizontal} />
</Grid>
<Grid size={{ xs: 12 }}>
<CardStatsLineAreaCharts data={statsData.statsWithAreaChart} />
</Grid>
<Grid size={{ xs: 12, sm: 6, lg: 3 }}>
<LineAreaDailySalesChart />
</Grid>
<Grid size={{ xs: 12, sm: 6, lg: 3 }}>
<SalesOverview />
</Grid>
<Grid size={{ xs: 12, sm: 6, lg: 3 }}>
<BarChartDailyTraffic />
</Grid>
<Grid size={{ xs: 12, sm: 6, lg: 3 }}>
<SubscribersOrders />
</Grid>
<Grid size={{ xs: 12 }}>
<HorizontalStatisticsCard data={statsData?.statsHorizontalWithAvatar} />
</Grid>
<Grid size={{ xs: 12 }}>
<CustomerStatisticsCard customerStatData={statsData?.customerStats} />
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 4 }}>
<Vertical data={statsData.statsVertical} />
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 4 }}>
<BarChartRevenueGrowth />
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 4 }}>
<DonutChartGeneratedLeads />
</Grid>
</Grid>
)
}
export default Statistics

View File

@ -1,8 +0,0 @@
// Component Imports
import CheckoutWizard from '@views/pages/wizard-examples/checkout'
const CheckoutPage = () => {
return <CheckoutWizard />
}
export default CheckoutPage

View File

@ -1,8 +0,0 @@
// Component Imports
import CreateDeal from '@views/pages/wizard-examples/create-deal'
const CreateDealPage = () => {
return <CreateDeal />
}
export default CreateDealPage

View File

@ -1,8 +0,0 @@
// Component Imports
import PropertyListing from '@views/pages/wizard-examples/property-listing'
const PropertyListingPage = () => {
return <PropertyListing />
}
export default PropertyListingPage

View File

@ -1,52 +0,0 @@
// Next Imports
import Link from 'next/link'
// MUI Imports
import Grid from '@mui/material/Grid2'
import Typography from '@mui/material/Typography'
// Component imports
import BasicDataTables from '@views/react-table/BasicDataTables'
import EditableDataTables from '@views/react-table/EditableDataTables'
import ColumnVisibility from '@views/react-table/ColumnVisibility'
import RowSelection from '@views/react-table/RowSelection'
import KitchenSink from '@views/react-table/KitchenSink'
const Tables = () => {
return (
<Grid container spacing={6}>
<Grid size={{ xs: 12 }}>
<Typography variant='h4'>React Table</Typography>
<Typography>
<code>@tanstack/react-table</code> is a third-party library. Please refer to its{' '}
<Link
href='https://tanstack.com/table'
target='_blank'
rel='noopener noreferrer'
className='no-underline text-primary'
>
official documentation
</Link>{' '}
for more details.
</Typography>
</Grid>
<Grid size={{ xs: 12 }}>
<BasicDataTables />
</Grid>
<Grid size={{ xs: 12 }}>
<EditableDataTables />
</Grid>
<Grid size={{ xs: 12 }}>
<ColumnVisibility />
</Grid>
<Grid size={{ xs: 12 }}>
<RowSelection />
</Grid>
<Grid size={{ xs: 12 }}>
<KitchenSink />
</Grid>
</Grid>
)
}
export default Tables

View File

@ -1,8 +0,0 @@
// Component Imports
import Checkout from '@views/front-pages/CheckoutPage'
const CheckoutPage = () => {
return <Checkout />
}
export default CheckoutPage

View File

@ -1,8 +0,0 @@
// Component Imports
import Questions from '@views/front-pages/help-center/Questions'
const Article = () => {
return <Questions />
}
export default Article

View File

@ -1,8 +0,0 @@
// Component Imports
import HelpCenterWrapper from '@views/front-pages/help-center'
function HelpCenterPage() {
return <HelpCenterWrapper />
}
export default HelpCenterPage

View File

@ -1,14 +0,0 @@
// Component Imports
import LandingPageWrapper from '@views/front-pages/landing-page'
// Server Action Imports
import { getServerMode } from '@core/utils/serverHelpers'
const LandingPage = async () => {
// Vars
const mode = await getServerMode()
return <LandingPageWrapper mode={mode} />
}
export default LandingPage

View File

@ -1,65 +0,0 @@
// MUI Imports
import Button from '@mui/material/Button'
import InitColorSchemeScript from '@mui/material/InitColorSchemeScript'
// Third-party Imports
import 'react-perfect-scrollbar/dist/css/styles.css'
// Type Imports
import type { ChildrenType } from '@core/types'
// Context Imports
import { IntersectionProvider } from '@/contexts/intersectionContext'
// Component Imports
import Providers from '@components/Providers'
import BlankLayout from '@layouts/BlankLayout'
import FrontLayout from '@components/layout/front-pages'
import ScrollToTop from '@core/components/scroll-to-top'
// Util Imports
import { getSystemMode } from '@core/utils/serverHelpers'
// Style Imports
import '@/app/globals.css'
// Generated Icon CSS Imports
import '@assets/iconify-icons/generated-icons.css'
export const metadata = {
title: 'Vuexy - MUI Next.js Admin Dashboard Template',
description:
'Vuexy - MUI Next.js Admin Dashboard Template - is the most developer friendly & highly customizable Admin Dashboard Template based on MUI v5.'
}
const Layout = async ({ children }: ChildrenType) => {
// Vars
const systemMode = await getSystemMode()
return (
<html id='__next' suppressHydrationWarning>
<body className='flex is-full min-bs-full flex-auto flex-col'>
<InitColorSchemeScript attribute='data' defaultMode={systemMode} />
<Providers direction='ltr'>
<BlankLayout systemMode={systemMode}>
<IntersectionProvider>
<FrontLayout>
{children}
<ScrollToTop className='mui-fixed'>
<Button
variant='contained'
className='is-10 bs-10 rounded-full p-0 min-is-0 flex items-center justify-center'
>
<i className='tabler-arrow-up' />
</Button>
</ScrollToTop>
</FrontLayout>
</IntersectionProvider>
</BlankLayout>
</Providers>
</body>
</html>
)
}
export default Layout

View File

@ -1,14 +0,0 @@
// Component Imports
import Payment from '@views/front-pages/Payment'
// Data Imports
import { getPricingData } from '@/app/server/actions'
const PaymentPage = async () => {
// Vars
const data = await getPricingData()
return <Payment data={data} />
}
export default PaymentPage

View File

@ -1,14 +0,0 @@
// Component Imports
import PricingWrapper from '@/views/front-pages/pricing'
// Data Imports
import { getPricingData } from '@/app/server/actions'
const PricingPage = async () => {
// Vars
const data = await getPricingData()
return <PricingWrapper data={data} />
}
export default PricingPage

View File

@ -1,58 +0,0 @@
/**
* ! The server actions below are used to fetch the static data from the fake-db. If you're using an ORM
* ! (Object-Relational Mapping) or a database, you can swap the code below with your own database queries.
*/
'use server'
// Data Imports
import { db as eCommerceData } from '@/fake-db/apps/ecommerce'
import { db as academyData } from '@/fake-db/apps/academy'
import { db as vehicleData } from '@/fake-db/apps/logistics'
import { db as invoiceData } from '@/fake-db/apps/invoice'
import { db as userData } from '@/fake-db/apps/userList'
import { db as permissionData } from '@/fake-db/apps/permissions'
import { db as profileData } from '@/fake-db/pages/userProfile'
import { db as faqData } from '@/fake-db/pages/faq'
import { db as pricingData } from '@/fake-db/pages/pricing'
import { db as statisticsData } from '@/fake-db/pages/widgetExamples'
export const getEcommerceData = async () => {
return eCommerceData
}
export const getAcademyData = async () => {
return academyData
}
export const getLogisticsData = async () => {
return vehicleData
}
export const getInvoiceData = async () => {
return invoiceData
}
export const getUserData = async () => {
return userData
}
export const getPermissionsData = async () => {
return permissionData
}
export const getProfileData = async () => {
return profileData
}
export const getFaqData = async () => {
return faqData
}
export const getPricingData = async () => {
return pricingData
}
export const getStatisticsData = async () => {
return statisticsData
}

View File

@ -1,378 +0,0 @@
// React Imports
import { Fragment, useEffect, useState } from 'react'
import type { CSSProperties, MouseEvent, ReactNode } from 'react'
// Next Imports
import { usePathname } from 'next/navigation'
// MUI Imports
import Typography from '@mui/material/Typography'
import Collapse from '@mui/material/Collapse'
// Third-party Imports
import classnames from 'classnames'
import {
useFloating,
useDismiss,
useRole,
useInteractions,
useHover,
offset,
flip,
size,
autoUpdate,
FloatingPortal,
safePolygon,
useTransitionStyles
} from '@floating-ui/react'
// Type Imports
import type { Mode } from '@core/types'
// Component Imports
import Link from '@components/Link'
import CustomAvatar from '@core/components/mui/Avatar'
type Props = {
mode: Mode
isBelowLgScreen: boolean
isDrawerOpen: boolean
setIsDrawerOpen: (open: boolean) => void
}
type MenuWrapperProps = {
children: ReactNode
refs: any
isBelowLgScreen: boolean
isOpen: boolean
getFloatingProps: any
top: number
floatingStyles: CSSProperties
isMounted: boolean
styles: CSSProperties
}
// Constants
const pageData = [
{
title: 'Pricing',
href: '/pricing'
},
{
title: 'Payment',
href: '/payment'
},
{
title: 'Checkout',
href: '/checkout'
},
{
title: 'Help Center',
href: '/help-center'
}
]
const authData = [
{
title: 'Login (Basic)',
href: '/login-v1'
},
{
title: 'Login (Cover)',
href: '/login-v2'
},
{
title: 'Register (Basic)',
href: '/register-v1'
},
{
title: 'Register (Cover)',
href: '/register-v2'
},
{
title: 'Register (Multi-steps)',
href: '/register-multi-steps'
},
{
title: 'Forgot Password (Basic)',
href: '/forgot-password-v1'
},
{
title: 'Forgot Password (Cover)',
href: '/forgot-password-v2'
},
{
title: 'Reset Password (Basic)',
href: '/reset-password-v1'
},
{
title: 'Reset Password (Cover)',
href: '/reset-password-v2'
}
]
const othersData = [
{
title: 'Under Maintenance',
href: '/misc/under-maintenance'
},
{
title: 'Coming Soon',
href: '/misc/coming-soon'
},
{
title: 'Not Authorized',
href: '/misc/401-not-authorized'
},
{
title: 'Verify Email (Basic)',
href: '/auth/verify-email-v1'
},
{
title: 'Verify Email (Cover)',
href: '/auth/verify-email-v2'
},
{
title: 'Two Steps (Basic)',
href: '/auth/two-steps-v1'
},
{
title: 'Two Steps (Cover)',
href: '/auth/two-steps-v2'
}
]
const MenuWrapper = (props: MenuWrapperProps) => {
// Props
const { children, refs, isBelowLgScreen, isOpen, getFloatingProps, top, floatingStyles, isMounted, styles } = props
if (!isBelowLgScreen) {
return (
<FloatingPortal>
{isMounted && (
<div ref={refs.setFloating} className='z-[1201] lg:z-[11]' {...getFloatingProps()} style={floatingStyles}>
<div
className='flex gap-8 p-8'
style={{
...styles,
overflowY: 'auto',
background: 'var(--mui-palette-background-paper)',
minWidth: 100,
borderRadius: 'var(--mui-shape-borderRadius)',
outline: 0,
boxShadow: 'var(--mui-shadows-3)',
maxBlockSize: `calc((var(--vh, 1vh) * 100) - ${top}px)`
}}
>
{children}
</div>
</div>
)}
</FloatingPortal>
)
}
return (
<Collapse in={isOpen}>
<div className='flex flex-col gap-6 mbs-3'>{children}</div>
</Collapse>
)
}
const DropdownMenu = (props: Props) => {
// Props
const { isBelowLgScreen, isDrawerOpen, setIsDrawerOpen } = props
// states
const [isOpen, setIsOpen] = useState(false)
// hooks
const pathname = usePathname()
const { y, refs, floatingStyles, context } = useFloating<HTMLElement>({
placement: 'bottom',
open: isOpen,
...(!isBelowLgScreen && { onOpenChange: setIsOpen }),
whileElementsMounted: autoUpdate,
middleware: [
offset(14),
flip({ padding: 10 }),
size({
apply({ rects, elements, availableHeight }) {
Object.assign(elements.floating.style, {
maxHeight: `${availableHeight}px`,
minWidth: `${rects.reference.width}px`
})
},
padding: 10
})
]
})
// Floating UI Transition Styles
const { isMounted, styles } = useTransitionStyles(context, {
// Configure both open and close durations:
duration: 300,
initial: {
opacity: 0,
transform: 'translateY(10px)'
},
open: {
opacity: 1,
transform: 'translateY(0px)'
},
close: {
opacity: 0,
transform: 'translateY(10px)'
}
})
const hover = useHover(context, {
handleClose: safePolygon({
blockPointerEvents: true
}),
restMs: 25,
delay: { open: 75 }
})
const dismiss = useDismiss(context)
const role = useRole(context, { role: 'menu' })
const { getReferenceProps, getFloatingProps } = useInteractions([dismiss, role, hover])
const Tag = isBelowLgScreen ? 'div' : Fragment
const handleLinkClick = () => {
if (isBelowLgScreen) {
isDrawerOpen && setIsDrawerOpen(false)
} else {
setIsOpen(false)
}
}
useEffect(() => {
if (!isDrawerOpen && isOpen) {
setIsOpen(false)
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [isDrawerOpen])
return (
<Tag {...(isBelowLgScreen && { className: 'flex flex-col' })}>
<Typography
component={Link}
color='text.primary'
className={classnames('flex items-center gap-2 font-medium plb-3 pli-1.5 hover:text-primary', {
'text-primary':
pathname === '/front-pages/payment' ||
pathname === '/front-pages/pricing' ||
pathname === '/front-pages/checkout' ||
pathname === '/front-pages/help-center' ||
pathname === '/front-pages/help-center/article/how-to-add-product-in-cart'
})}
{...(isBelowLgScreen
? {
onClick: (e: MouseEvent) => {
e.preventDefault()
setIsOpen(!isOpen)
}
}
: {
ref: refs.setReference,
...getReferenceProps()
})}
>
<span>Pages</span>
<i
className={classnames(
{
'tabler-chevron-down': !isBelowLgScreen || (isBelowLgScreen && !isOpen),
'tabler-chevron-up': isBelowLgScreen && isOpen
},
'text-xl'
)}
/>
</Typography>
<MenuWrapper
refs={refs}
isBelowLgScreen={isBelowLgScreen}
isOpen={isOpen}
getFloatingProps={getFloatingProps}
top={y ? y - window.scrollY : 0}
floatingStyles={floatingStyles}
isMounted={isMounted}
styles={styles}
>
<div className='flex flex-col gap-4'>
<div className='flex gap-3 items-center'>
<CustomAvatar variant='rounded' color='primary' skin='light'>
<i className='tabler-layout-grid' />
</CustomAvatar>
<Typography variant='h6'>Page</Typography>
</div>
{pageData.map((page, index) => (
<Link
key={index}
href={'/front-pages' + page.href}
className={classnames('flex items-center gap-3 focus:outline-none hover:text-primary', {
'text-primary': pathname.includes('/front-pages' + page.href)
})}
onClick={handleLinkClick}
>
<i className='tabler-circle text-[10px]' />
<span>{page.title}</span>
</Link>
))}
</div>
<div className='flex flex-col gap-4'>
<div className='flex gap-3 items-center'>
<CustomAvatar variant='rounded' color='primary' skin='light'>
<i className='tabler-lock' />
</CustomAvatar>
<Typography variant='h6'>Auth Demo</Typography>
</div>
{authData.map((page, index) => (
<Link
key={index}
href={'/pages/auth' + page.href}
target='_blank'
className='flex items-center gap-3 focus:outline-none hover:text-primary'
onClick={handleLinkClick}
>
<i className='tabler-circle text-[10px]' />
<span>{page.title}</span>
</Link>
))}
</div>
<div className='flex flex-col gap-4'>
<div className='flex items-center gap-3'>
<CustomAvatar variant='rounded' color='primary' skin='light'>
<i className='tabler-photo' />
</CustomAvatar>
<Typography variant='h6'>Auth Demo</Typography>
</div>
{othersData.map((page, index) => (
<Link
key={index}
href={'/pages' + page.href}
target='_blank'
className='flex items-center gap-3 focus:outline-none hover:text-primary'
onClick={handleLinkClick}
>
<i className='tabler-circle text-[10px]' />
<span>{page.title}</span>
</Link>
))}
</div>
{!isBelowLgScreen && (
<div className='flex bg-backgroundDefault p-2 rounded'>
<img src='/images/front-pages/dropdown-image.png' width='385' alt='dropdown image' className='rounded' />
</div>
)}
</MenuWrapper>
</Tag>
)
}
export default DropdownMenu

View File

@ -1,208 +0,0 @@
'use client'
// MUI Imports
import Grid from '@mui/material/Grid2'
import Typography from '@mui/material/Typography'
import Button from '@mui/material/Button'
import Chip from '@mui/material/Chip'
import IconButton from '@mui/material/IconButton'
// Third-party Imports
import classnames from 'classnames'
// Type Imports
import type { Mode } from '@core/types'
// Component Imports
import Link from '@components/Link'
import Logo from '@components/layout/shared/Logo'
import CustomTextField from '@core/components/mui/TextField'
// Hooks Imports
import { useImageVariant } from '@core/hooks/useImageVariant'
// Util Imports
import { frontLayoutClasses } from '@layouts/utils/layoutClasses'
// Styles Imports
import styles from './styles.module.css'
import frontCommonStyles from '@views/front-pages/styles.module.css'
const Footer = ({ mode }: { mode: Mode }) => {
// Vars
const footerImageLight = '/images/front-pages/footer-bg-light.png'
const footerImageDark = '/images/front-pages/footer-bg-dark.png'
// Hooks
const dashboardImage = useImageVariant(mode, footerImageLight, footerImageDark)
return (
<footer className={frontLayoutClasses.footer}>
<div className='relative'>
<img src={dashboardImage} alt='footer bg' className='absolute inset-0 is-full bs-full object-cover -z-[1]' />
<div className={classnames('plb-12 text-white', frontCommonStyles.layoutSpacing)}>
<Grid container rowSpacing={10} columnSpacing={12}>
<Grid size={{ xs: 12, lg: 5 }}>
<div className='flex flex-col items-start gap-6'>
<Link href='/front-pages/landing-page'>
<Logo color='var(--mui-palette-common-white)' />
</Link>
<Typography color='white' className='md:max-is-[390px] opacity-[0.78]'>
Most Powerful & Comprehensive 🤩 React NextJS Admin Template with Elegant Material Design & Unique
Layouts.
</Typography>
<div className='flex items-end'>
<CustomTextField
size='small'
className={styles.inputBorder}
label='Subscribe to newsletter'
placeholder='Your email'
sx={{
'& .MuiInputBase-root': {
borderStartEndRadius: '0 !important',
borderEndEndRadius: '0 !important',
'&:not(.Mui-focused)': {
borderColor: 'rgb(var(--mui-mainColorChannels-dark) / 0.22)'
},
'&.MuiFilledInput-root:not(.Mui-focused):not(.Mui-disabled):hover': {
borderColor: 'rgba(255 255 255 / 0.6) !important'
}
}
}}
/>
<Button
variant='contained'
color='primary'
sx={{
borderStartStartRadius: 0,
borderEndStartRadius: 0
}}
>
Subscribe
</Button>
</div>
</div>
</Grid>
<Grid size={{ xs: 12, sm: 3, lg: 2 }}>
<Typography color='white' className='font-medium mbe-6 opacity-[0.92]'>
Pages
</Typography>
<div className='flex flex-col gap-4'>
<Typography component={Link} href='/front-pages/pricing' color='white' className='opacity-[0.78]'>
Pricing
</Typography>
<Link href='/front-pages/payment' className='flex items-center gap-[10px]'>
<Typography color='white' className='opacity-[0.78]'>
Payment
</Typography>
<Chip label='New' color='primary' size='small' />
</Link>
<Typography
component={Link}
href='/pages/misc/under-maintenance'
color='white'
className='opacity-[0.78]'
>
Maintenance
</Typography>
<Typography component={Link} href='/pages/misc/coming-soon' color='white' className='opacity-[0.78]'>
Coming Soon
</Typography>
</div>
</Grid>
<Grid size={{ xs: 12, sm: 3, lg: 2 }}>
<Typography color='white' className='font-medium mbe-6 opacity-[0.92]'>
Products
</Typography>
<div className='flex flex-col gap-4'>
<Typography component={Link} href='/front-pages/landing-page' color='white' className='opacity-[0.78]'>
Page builder
</Typography>
<Typography component={Link} href='/front-pages/landing-page' color='white' className='opacity-[0.78]'>
Admin Dashboards
</Typography>
<Typography component={Link} href='/front-pages/landing-page' color='white' className='opacity-[0.78]'>
UI Kits
</Typography>
<Typography component={Link} href='/front-pages/landing-page' color='white' className='opacity-[0.78]'>
Illustrations
</Typography>
</div>
</Grid>
<Grid size={{ xs: 12, sm: 6, lg: 3 }}>
<Typography color='white' className='font-medium mbe-6 opacity-[0.92]'>
Download our App
</Typography>
<div className='flex flex-col gap-4'>
<Link className='bg-[#282C3E] bs-[56px] is-[211px] rounded'>
<div className='flex items-center pli-5 plb-[7px] gap-6'>
<img src='/images/front-pages/apple-icon.png' alt='apple store' className='bs-[34px]' />
<div className='flex flex-col items-start'>
<Typography variant='body2' color='white' className='opacity-75'>
Download on the
</Typography>
<Typography color='white' className='font-medium opacity-[0.92]'>
App Store
</Typography>
</div>
</div>
</Link>
<Link className='bg-[#282C3E] bs-[56px] is-[211px] rounded'>
<div className='flex items-center pli-5 plb-[7px] gap-6'>
<img src='/images/front-pages/google-play-icon.png' alt='Google play' className='bs-[34px]' />
<div className='flex flex-col items-start'>
<Typography variant='body2' color='white' className='opacity-75'>
Download on the
</Typography>
<Typography color='white' className='font-medium opacity-[0.92]'>
Google Play
</Typography>
</div>
</div>
</Link>
</div>
</Grid>
</Grid>
</div>
</div>
<div className='bg-[#211B2C]'>
<div
className={classnames(
'flex flex-wrap items-center justify-center sm:justify-between gap-4 plb-[15px]',
frontCommonStyles.layoutSpacing
)}
>
<Typography className='text-white' variant='body2'>
<span>{`© ${new Date().getFullYear()}, Made with `}</span>
<span>{`❤️`}</span>
<span>{` by `}</span>
<Link href='https://pixinvent.com/' target='_blank' className='font-medium text-white'>
Pixinvent
</Link>
</Typography>
<div className='flex gap-1.5 items-center'>
<IconButton component={Link} size='small' href='https://github.com/pixinvent' target='_blank'>
<i className='tabler-brand-github-filled text-white text-lg' />
</IconButton>
<IconButton component={Link} size='small' href='https://www.facebook.com/pixinvents/' target='_blank'>
<i className='tabler-brand-facebook-filled text-white text-lg' />
</IconButton>
<IconButton component={Link} size='small' href='https://x.com/pixinvents' target='_blank'>
<i className='tabler-brand-twitter-filled text-white text-lg' />
</IconButton>
<IconButton
component={Link}
size='small'
href='https://www.youtube.com/channel/UClOcB3o1goJ293ri_Hxpklg'
target='_blank'
>
<i className='tabler-brand-youtube-filled text-white text-lg' />
</IconButton>
</div>
</div>
</div>
</footer>
)
}
export default Footer

View File

@ -1,165 +0,0 @@
'use client'
// React Imports
import { useEffect } from 'react'
// Next Imports
import { usePathname } from 'next/navigation'
import Link from 'next/link'
// MUI Imports
import Typography from '@mui/material/Typography'
import Drawer from '@mui/material/Drawer'
import useMediaQuery from '@mui/material/useMediaQuery'
import type { Theme } from '@mui/material/styles'
import IconButton from '@mui/material/IconButton'
// Third-party Imports
import classnames from 'classnames'
// Type Imports
import type { Mode } from '@core/types'
// Hook Imports
import { useIntersection } from '@/hooks/useIntersection'
// Component Imports
import DropdownMenu from './DropdownMenu'
type Props = {
mode: Mode
isDrawerOpen: boolean
setIsDrawerOpen: (open: boolean) => void
}
type WrapperProps = {
children: React.ReactNode
isBelowLgScreen: boolean
className?: string
isDrawerOpen: boolean
setIsDrawerOpen: (open: boolean) => void
}
const Wrapper = (props: WrapperProps) => {
// Props
const { children, isBelowLgScreen, className, isDrawerOpen, setIsDrawerOpen } = props
if (isBelowLgScreen) {
return (
<Drawer
variant='temporary'
anchor='left'
open={isDrawerOpen}
onClose={() => setIsDrawerOpen(false)}
ModalProps={{
keepMounted: true
}}
sx={{ '& .MuiDrawer-paper': { width: ['100%', 300] } }}
className={classnames('p-5', className)}
>
<div className='p-4 flex flex-col gap-x-3'>
<IconButton onClick={() => setIsDrawerOpen(false)} className='absolute inline-end-4 block-start-2'>
<i className='tabler-x' />
</IconButton>
{children}
</div>
</Drawer>
)
}
return <div className={classnames('flex items-center flex-wrap gap-x-4 gap-y-3', className)}>{children}</div>
}
const FrontMenu = (props: Props) => {
// Props
const { isDrawerOpen, setIsDrawerOpen, mode } = props
// Hooks
const pathname = usePathname()
const isBelowLgScreen = useMediaQuery((theme: Theme) => theme.breakpoints.down('lg'))
const { intersections } = useIntersection()
useEffect(() => {
if (!isBelowLgScreen && isDrawerOpen) {
setIsDrawerOpen(false)
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [isBelowLgScreen])
return (
<Wrapper isBelowLgScreen={isBelowLgScreen} isDrawerOpen={isDrawerOpen} setIsDrawerOpen={setIsDrawerOpen}>
<Typography
color='text.primary'
component={Link}
href='/front-pages/landing-page'
className={classnames('font-medium plb-3 pli-1.5 hover:text-primary', {
'text-primary':
!intersections.features &&
!intersections.team &&
!intersections.faq &&
!intersections['contact-us'] &&
pathname === '/front-pages/landing-page'
})}
>
Home
</Typography>
<Typography
color='text.primary'
component={Link}
href='/front-pages/landing-page#features'
className={classnames('font-medium plb-3 pli-1.5 hover:text-primary', {
'text-primary': intersections.features
})}
>
Features
</Typography>
<Typography
color='text.primary'
component={Link}
href='/front-pages/landing-page#team'
className={classnames('font-medium plb-3 pli-1.5 hover:text-primary', {
'text-primary': intersections.team
})}
>
Team
</Typography>
<Typography
color='text.primary'
component={Link}
href='/front-pages/landing-page#faq'
className={classnames('font-medium plb-3 pli-1.5 hover:text-primary', {
'text-primary': intersections.faq
})}
>
FAQ
</Typography>
<Typography
color='text.primary'
component={Link}
href='/front-pages/landing-page#contact-us'
className={classnames('font-medium plb-3 pli-1.5 hover:text-primary', {
'text-primary': intersections['contact-us']
})}
>
Contact us
</Typography>
<DropdownMenu
mode={mode}
isBelowLgScreen={isBelowLgScreen}
isDrawerOpen={isDrawerOpen}
setIsDrawerOpen={setIsDrawerOpen}
/>
<Typography
component={Link}
color='text.primary'
href='/'
target='_blank'
className='font-medium plb-3 pli-1.5 hover:text-primary'
>
Admin
</Typography>
</Wrapper>
)
}
export default FrontMenu

View File

@ -1,100 +0,0 @@
'use client'
// React Imports
import { useState } from 'react'
// Next Imports
import Link from 'next/link'
// MUI Imports
import Button from '@mui/material/Button'
import IconButton from '@mui/material/IconButton'
import useMediaQuery from '@mui/material/useMediaQuery'
import useScrollTrigger from '@mui/material/useScrollTrigger'
import type { Theme } from '@mui/material/styles'
// Third-party Imports
import classnames from 'classnames'
// Type Imports
import type { Mode } from '@core/types'
// Component Imports
import Logo from '@components/layout/shared/Logo'
import ModeDropdown from '@components/layout/shared/ModeDropdown'
import FrontMenu from './FrontMenu'
import CustomIconButton from '@core/components/mui/IconButton'
// Util Imports
import { frontLayoutClasses } from '@layouts/utils/layoutClasses'
// Styles Imports
import styles from './styles.module.css'
const Header = ({ mode }: { mode: Mode }) => {
// States
const [isDrawerOpen, setIsDrawerOpen] = useState(false)
// Hooks
const isBelowLgScreen = useMediaQuery((theme: Theme) => theme.breakpoints.down('lg'))
// Detect window scroll
const trigger = useScrollTrigger({
threshold: 0,
disableHysteresis: true
})
return (
<header className={classnames(frontLayoutClasses.header, styles.header)}>
<div className={classnames(frontLayoutClasses.navbar, styles.navbar, { [styles.headerScrolled]: trigger })}>
<div className={classnames(frontLayoutClasses.navbarContent, styles.navbarContent)}>
{isBelowLgScreen ? (
<div className='flex items-center gap-2 sm:gap-4'>
<IconButton onClick={() => setIsDrawerOpen(true)} className='-mis-2'>
<i className='tabler-menu-2 text-textPrimary' />
</IconButton>
<Link href='/front-pages/landing-page'>
<Logo />
</Link>
<FrontMenu mode={mode} isDrawerOpen={isDrawerOpen} setIsDrawerOpen={setIsDrawerOpen} />
</div>
) : (
<div className='flex items-center gap-10'>
<Link href='/front-pages/landing-page'>
<Logo />
</Link>
<FrontMenu mode={mode} isDrawerOpen={isDrawerOpen} setIsDrawerOpen={setIsDrawerOpen} />
</div>
)}
<div className='flex items-center gap-2 sm:gap-4'>
<ModeDropdown />
{isBelowLgScreen ? (
<CustomIconButton
component={Link}
variant='contained'
href='https://1.envato.market/vuexy_admin'
color='primary'
target='_blank'
>
<i className='tabler-shopping-cart text-xl' />
</CustomIconButton>
) : (
<Button
component={Link}
variant='contained'
href='https://1.envato.market/vuexy_admin'
startIcon={<i className='tabler-shopping-cart text-xl' />}
className='whitespace-nowrap'
target='_blank'
>
Purchase Now
</Button>
)}
</div>
</div>
</div>
</header>
)
}
export default Header

View File

@ -1,27 +0,0 @@
// Type Imports
import type { ChildrenType } from '@core/types'
// Component Imports
import Footer from '@components/layout/front-pages/Footer'
import Header from '@components/layout/front-pages/Header'
// Server Action Imports
import { getServerMode } from '@core/utils/serverHelpers'
// Util Imports
import { frontLayoutClasses } from '@layouts/utils/layoutClasses'
const FrontLayout = async ({ children }: ChildrenType) => {
// Vars
const mode = await getServerMode()
return (
<div className={frontLayoutClasses.root}>
<Header mode={mode} />
{children}
<Footer mode={mode} />
</div>
)
}
export default FrontLayout

View File

@ -1,73 +0,0 @@
.header {
position: sticky;
inset-block-start: 0;
z-index: var(--header-z-index);
display: flex;
align-items: center;
justify-content: center;
inline-size: 100%;
pointer-events: none;
&:before {
content: '';
position: absolute;
z-index: -1;
inset-block-start: 0;
inset-inline: 0;
block-size: 100%;
backdrop-filter: saturate(100%) blur(6px);
}
.navbar {
inline-size: calc(100% - 48px);
padding-block: 0.438rem;
padding-inline: 1.5rem;
margin-inline: auto;
margin-block-start: 1rem;
pointer-events: auto;
background-color: rgb(var(--mui-palette-background-paperChannel) / 0.38);
border: 2px solid rgb(var(--mui-palette-background-paperChannel) / 0.68);
border-radius: var(--mui-shape-borderRadius);
&.headerScrolled {
background-color: var(--mui-palette-background-paper);
border-color: var(--mui-palette-background-paper);
box-shadow: var(--mui-customShadows-sm);
}
@media (min-width: 600px) {
padding-inline: 2rem;
}
@media (min-width: 900px) {
max-inline-size: calc(900px - 48px);
}
@media (min-width: 1200px) {
max-inline-size: calc(1200px - 48px);
}
@media (min-width: 1920px) {
max-inline-size: calc(1440px - 48px);
}
.navbarContent {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1.5rem;
}
}
}
.inputBorder {
fieldset {
border-color: rgb(var(--mui-mainColorChannels-dark) / 0.22) !important;
}
label,
input {
color: rgb(var(--mui-mainColorChannels-dark) / 0.9) !important;
}
}
.footerRadius {
border-start-start-radius: 3.75rem;
border-start-end-radius: 3.75rem;
}

View File

@ -12,8 +12,7 @@ import type { getDictionary } from '@/utils/getDictionary'
import type { VerticalMenuContextProps } from '@menu/components/vertical-menu/Menu' import type { VerticalMenuContextProps } from '@menu/components/vertical-menu/Menu'
// Component Imports // Component Imports
import { Menu, SubMenu, MenuItem, MenuSection } from '@menu/vertical-menu' import { Menu, MenuItem, MenuSection, SubMenu } from '@menu/vertical-menu'
import CustomChip from '@core/components/mui/Chip'
// import { GenerateVerticalMenu } from '@components/GenerateMenu' // import { GenerateVerticalMenu } from '@components/GenerateMenu'
@ -81,33 +80,10 @@ const VerticalMenu = ({ dictionary, scrollMenu }: Props) => {
renderExpandedMenuItemIcon={{ icon: <i className='tabler-circle text-xs' /> }} renderExpandedMenuItemIcon={{ icon: <i className='tabler-circle text-xs' /> }}
menuSectionStyles={menuSectionStyles(verticalNavOptions, theme)} menuSectionStyles={menuSectionStyles(verticalNavOptions, theme)}
> >
<SubMenu <SubMenu label={dictionary['navigation'].dashboards} icon={<i className='tabler-smart-home' />}>
label={dictionary['navigation'].dashboards}
icon={<i className='tabler-smart-home' />}
suffix={<CustomChip label='5' size='small' color='error' round='true' />}
>
<MenuItem href={`/${locale}/dashboards/crm`}>{dictionary['navigation'].crm}</MenuItem> <MenuItem href={`/${locale}/dashboards/crm`}>{dictionary['navigation'].crm}</MenuItem>
<MenuItem href={`/${locale}/dashboards/analytics`}>{dictionary['navigation'].analytics}</MenuItem> <MenuItem href={`/${locale}/dashboards/analytics`}>{dictionary['navigation'].analytics}</MenuItem>
<MenuItem href={`/${locale}/dashboards/ecommerce`}>{dictionary['navigation'].eCommerce}</MenuItem> <MenuItem href={`/${locale}/dashboards/ecommerce`}>{dictionary['navigation'].eCommerce}</MenuItem>
<MenuItem href={`/${locale}/dashboards/academy`}>{dictionary['navigation'].academy}</MenuItem>
<MenuItem href={`/${locale}/dashboards/logistics`}>{dictionary['navigation'].logistics}</MenuItem>
</SubMenu>
<SubMenu label={dictionary['navigation'].frontPages} icon={<i className='tabler-files' />}>
<MenuItem href='/front-pages/landing-page' target='_blank'>
{dictionary['navigation'].landing}
</MenuItem>
<MenuItem href='/front-pages/pricing' target='_blank'>
{dictionary['navigation'].pricing}
</MenuItem>
<MenuItem href='/front-pages/payment' target='_blank'>
{dictionary['navigation'].payment}
</MenuItem>
<MenuItem href='/front-pages/checkout' target='_blank'>
{dictionary['navigation'].checkout}
</MenuItem>
<MenuItem href='/front-pages/help-center' target='_blank'>
{dictionary['navigation'].helpCenter}
</MenuItem>
</SubMenu> </SubMenu>
<MenuSection label={dictionary['navigation'].appsPages}> <MenuSection label={dictionary['navigation'].appsPages}>
<SubMenu label={dictionary['navigation'].eCommerce} icon={<i className='tabler-shopping-cart' />}> <SubMenu label={dictionary['navigation'].eCommerce} icon={<i className='tabler-shopping-cart' />}>
@ -118,32 +94,16 @@ const VerticalMenu = ({ dictionary, scrollMenu }: Props) => {
<MenuItem href={`/${locale}/apps/ecommerce/products/category`}> <MenuItem href={`/${locale}/apps/ecommerce/products/category`}>
{dictionary['navigation'].category} {dictionary['navigation'].category}
</MenuItem> </MenuItem>
<MenuItem href={`/${locale}/apps/ecommerce/products/units`}> <MenuItem href={`/${locale}/apps/ecommerce/products/units`}>{dictionary['navigation'].units}</MenuItem>
{dictionary['navigation'].units}
</MenuItem>
<MenuItem href={`/${locale}/apps/ecommerce/products/ingredients`}> <MenuItem href={`/${locale}/apps/ecommerce/products/ingredients`}>
{dictionary['navigation'].ingredients} {dictionary['navigation'].ingredients}
</MenuItem> </MenuItem>
</SubMenu> </SubMenu>
<SubMenu label={dictionary['navigation'].orders}> <SubMenu label={dictionary['navigation'].orders}>
<MenuItem href={`/${locale}/apps/ecommerce/orders/list`}>{dictionary['navigation'].list}</MenuItem> <MenuItem href={`/${locale}/apps/ecommerce/orders/list`}>{dictionary['navigation'].list}</MenuItem>
<MenuItem
href={`/${locale}/apps/ecommerce/orders/details/5434`}
exactMatch={false}
activeUrl='/apps/ecommerce/orders/details'
>
{dictionary['navigation'].details}
</MenuItem>
</SubMenu> </SubMenu>
<SubMenu label={dictionary['navigation'].customers}> <SubMenu label={dictionary['navigation'].customers}>
<MenuItem href={`/${locale}/apps/ecommerce/customers/list`}>{dictionary['navigation'].list}</MenuItem> <MenuItem href={`/${locale}/apps/ecommerce/customers/list`}>{dictionary['navigation'].list}</MenuItem>
<MenuItem
href={`/${locale}/apps/ecommerce/customers/details/879861`}
exactMatch={false}
activeUrl='/apps/ecommerce/customers/details'
>
{dictionary['navigation'].details}
</MenuItem>
</SubMenu> </SubMenu>
{/* <MenuItem href={`/${locale}/apps/ecommerce/manage-reviews`}> {/* <MenuItem href={`/${locale}/apps/ecommerce/manage-reviews`}>
{dictionary['navigation'].manageReviews} {dictionary['navigation'].manageReviews}
@ -155,48 +115,6 @@ const VerticalMenu = ({ dictionary, scrollMenu }: Props) => {
<MenuItem href={`/${locale}/apps/stock/list`}>{dictionary['navigation'].list}</MenuItem> <MenuItem href={`/${locale}/apps/stock/list`}>{dictionary['navigation'].list}</MenuItem>
<MenuItem href={`/${locale}/apps/stock/adjustment`}>{dictionary['navigation'].addjustment}</MenuItem> <MenuItem href={`/${locale}/apps/stock/adjustment`}>{dictionary['navigation'].addjustment}</MenuItem>
</SubMenu> </SubMenu>
<SubMenu label={dictionary['navigation'].academy} icon={<i className='tabler-school' />}>
<MenuItem href={`/${locale}/apps/academy/dashboard`}>{dictionary['navigation'].dashboard}</MenuItem>
<MenuItem href={`/${locale}/apps/academy/my-courses`}>{dictionary['navigation'].myCourses}</MenuItem>
<MenuItem href={`/${locale}/apps/academy/course-details`}>
{dictionary['navigation'].courseDetails}
</MenuItem>
</SubMenu>
<SubMenu label={dictionary['navigation'].logistics} icon={<i className='tabler-truck' />}>
<MenuItem href={`/${locale}/apps/logistics/dashboard`}>{dictionary['navigation'].dashboard}</MenuItem>
<MenuItem href={`/${locale}/apps/logistics/fleet`}>{dictionary['navigation'].fleet}</MenuItem>
</SubMenu>
<MenuItem
href={`/${locale}/apps/email`}
icon={<i className='tabler-mail' />}
exactMatch={false}
activeUrl='/apps/email'
>
{dictionary['navigation'].email}
</MenuItem>
<MenuItem href={`/${locale}/apps/chat`} icon={<i className='tabler-message-circle-2' />}>
{dictionary['navigation'].chat}
</MenuItem>
<MenuItem href={`/${locale}/apps/calendar`} icon={<i className='tabler-calendar' />}>
{dictionary['navigation'].calendar}
</MenuItem>
<MenuItem href={`/${locale}/apps/kanban`} icon={<i className='tabler-copy' />}>
{dictionary['navigation'].kanban}
</MenuItem>
<SubMenu label={dictionary['navigation'].invoice} icon={<i className='tabler-file-description' />}>
<MenuItem href={`/${locale}/apps/invoice/list`}>{dictionary['navigation'].list}</MenuItem>
<MenuItem
href={`/${locale}/apps/invoice/preview/4987`}
exactMatch={false}
activeUrl='/apps/invoice/preview'
>
{dictionary['navigation'].preview}
</MenuItem>
<MenuItem href={`/${locale}/apps/invoice/edit/4987`} exactMatch={false} activeUrl='/apps/invoice/edit'>
{dictionary['navigation'].edit}
</MenuItem>
<MenuItem href={`/${locale}/apps/invoice/add`}>{dictionary['navigation'].add}</MenuItem>
</SubMenu>
<SubMenu label={dictionary['navigation'].user} icon={<i className='tabler-user' />}> <SubMenu label={dictionary['navigation'].user} icon={<i className='tabler-user' />}>
<MenuItem href={`/${locale}/apps/user/list`}>{dictionary['navigation'].list}</MenuItem> <MenuItem href={`/${locale}/apps/user/list`}>{dictionary['navigation'].list}</MenuItem>
<MenuItem href={`/${locale}/apps/user/view`}>{dictionary['navigation'].view}</MenuItem> <MenuItem href={`/${locale}/apps/user/view`}>{dictionary['navigation'].view}</MenuItem>
@ -205,196 +123,6 @@ const VerticalMenu = ({ dictionary, scrollMenu }: Props) => {
<MenuItem href={`/${locale}/apps/roles`}>{dictionary['navigation'].roles}</MenuItem> <MenuItem href={`/${locale}/apps/roles`}>{dictionary['navigation'].roles}</MenuItem>
<MenuItem href={`/${locale}/apps/permissions`}>{dictionary['navigation'].permissions}</MenuItem> <MenuItem href={`/${locale}/apps/permissions`}>{dictionary['navigation'].permissions}</MenuItem>
</SubMenu> </SubMenu>
<SubMenu label={dictionary['navigation'].pages} icon={<i className='tabler-file' />}>
<MenuItem href={`/${locale}/pages/user-profile`}>{dictionary['navigation'].userProfile}</MenuItem>
<MenuItem href={`/${locale}/pages/account-settings`}>{dictionary['navigation'].accountSettings}</MenuItem>
<MenuItem href={`/${locale}/pages/faq`}>{dictionary['navigation'].faq}</MenuItem>
<MenuItem href={`/${locale}/pages/pricing`}>{dictionary['navigation'].pricing}</MenuItem>
<SubMenu label={dictionary['navigation'].miscellaneous}>
<MenuItem href={`/${locale}/pages/misc/coming-soon`} target='_blank'>
{dictionary['navigation'].comingSoon}
</MenuItem>
<MenuItem href={`/${locale}/pages/misc/under-maintenance`} target='_blank'>
{dictionary['navigation'].underMaintenance}
</MenuItem>
<MenuItem href={`/${locale}/pages/misc/404-not-found`} target='_blank'>
{dictionary['navigation'].pageNotFound404}
</MenuItem>
<MenuItem href={`/${locale}/pages/misc/401-not-authorized`} target='_blank'>
{dictionary['navigation'].notAuthorized401}
</MenuItem>
</SubMenu>
</SubMenu>
<SubMenu label={dictionary['navigation'].authPages} icon={<i className='tabler-shield-lock' />}>
<SubMenu label={dictionary['navigation'].login}>
<MenuItem href={`/${locale}/pages/auth/login-v1`} target='_blank'>
{dictionary['navigation'].loginV1}
</MenuItem>
<MenuItem href={`/${locale}/pages/auth/login-v2`} target='_blank'>
{dictionary['navigation'].loginV2}
</MenuItem>
</SubMenu>
<SubMenu label={dictionary['navigation'].register}>
<MenuItem href={`/${locale}/pages/auth/register-v1`} target='_blank'>
{dictionary['navigation'].registerV1}
</MenuItem>
<MenuItem href={`/${locale}/pages/auth/register-v2`} target='_blank'>
{dictionary['navigation'].registerV2}
</MenuItem>
<MenuItem href={`/${locale}/pages/auth/register-multi-steps`} target='_blank'>
{dictionary['navigation'].registerMultiSteps}
</MenuItem>
</SubMenu>
<SubMenu label={dictionary['navigation'].verifyEmail}>
<MenuItem href={`/${locale}/pages/auth/verify-email-v1`} target='_blank'>
{dictionary['navigation'].verifyEmailV1}
</MenuItem>
<MenuItem href={`/${locale}/pages/auth/verify-email-v2`} target='_blank'>
{dictionary['navigation'].verifyEmailV2}
</MenuItem>
</SubMenu>
<SubMenu label={dictionary['navigation'].forgotPassword}>
<MenuItem href={`/${locale}/pages/auth/forgot-password-v1`} target='_blank'>
{dictionary['navigation'].forgotPasswordV1}
</MenuItem>
<MenuItem href={`/${locale}/pages/auth/forgot-password-v2`} target='_blank'>
{dictionary['navigation'].forgotPasswordV2}
</MenuItem>
</SubMenu>
<SubMenu label={dictionary['navigation'].resetPassword}>
<MenuItem href={`/${locale}/pages/auth/reset-password-v1`} target='_blank'>
{dictionary['navigation'].resetPasswordV1}
</MenuItem>
<MenuItem href={`/${locale}/pages/auth/reset-password-v2`} target='_blank'>
{dictionary['navigation'].resetPasswordV2}
</MenuItem>
</SubMenu>
<SubMenu label={dictionary['navigation'].twoSteps}>
<MenuItem href={`/${locale}/pages/auth/two-steps-v1`} target='_blank'>
{dictionary['navigation'].twoStepsV1}
</MenuItem>
<MenuItem href={`/${locale}/pages/auth/two-steps-v2`} target='_blank'>
{dictionary['navigation'].twoStepsV2}
</MenuItem>
</SubMenu>
</SubMenu>
<SubMenu label={dictionary['navigation'].wizardExamples} icon={<i className='tabler-dots' />}>
<MenuItem href={`/${locale}/pages/wizard-examples/checkout`}>{dictionary['navigation'].checkout}</MenuItem>
<MenuItem href={`/${locale}/pages/wizard-examples/property-listing`}>
{dictionary['navigation'].propertyListing}
</MenuItem>
<MenuItem href={`/${locale}/pages/wizard-examples/create-deal`}>
{dictionary['navigation'].createDeal}
</MenuItem>
</SubMenu>
<MenuItem href={`/${locale}/pages/dialog-examples`} icon={<i className='tabler-square' />}>
{dictionary['navigation'].dialogExamples}
</MenuItem>
<SubMenu label={dictionary['navigation'].widgetExamples} icon={<i className='tabler-chart-bar' />}>
<MenuItem href={`/${locale}/pages/widget-examples/basic`}>{dictionary['navigation'].basic}</MenuItem>
<MenuItem href={`/${locale}/pages/widget-examples/advanced`}>{dictionary['navigation'].advanced}</MenuItem>
<MenuItem href={`/${locale}/pages/widget-examples/statistics`}>
{dictionary['navigation'].statistics}
</MenuItem>
<MenuItem href={`/${locale}/pages/widget-examples/charts`}>{dictionary['navigation'].charts}</MenuItem>
<MenuItem href={`/${locale}/pages/widget-examples/actions`}>{dictionary['navigation'].actions}</MenuItem>
</SubMenu>
</MenuSection>
<MenuSection label={dictionary['navigation'].formsAndTables}>
<MenuItem href={`/${locale}/forms/form-layouts`} icon={<i className='tabler-layout' />}>
{dictionary['navigation'].formLayouts}
</MenuItem>
<MenuItem href={`/${locale}/forms/form-validation`} icon={<i className='tabler-checkup-list' />}>
{dictionary['navigation'].formValidation}
</MenuItem>
<MenuItem href={`/${locale}/forms/form-wizard`} icon={<i className='tabler-git-merge' />}>
{dictionary['navigation'].formWizard}
</MenuItem>
<MenuItem href={`/${locale}/react-table`} icon={<i className='tabler-table' />}>
{dictionary['navigation'].reactTable}
</MenuItem>
<MenuItem
icon={<i className='tabler-checkbox' />}
href={`${process.env.NEXT_PUBLIC_DOCS_URL}/docs/user-interface/form-elements`}
suffix={<i className='tabler-external-link text-xl' />}
target='_blank'
>
{dictionary['navigation'].formELements}
</MenuItem>
<MenuItem
icon={<i className='tabler-layout-board-split' />}
href={`${process.env.NEXT_PUBLIC_DOCS_URL}/docs/user-interface/mui-table`}
suffix={<i className='tabler-external-link text-xl' />}
target='_blank'
>
{dictionary['navigation'].muiTables}
</MenuItem>
</MenuSection>
<MenuSection label={dictionary['navigation'].chartsMisc}>
<SubMenu label={dictionary['navigation'].charts} icon={<i className='tabler-chart-donut-2' />}>
<MenuItem href={`/${locale}/charts/apex-charts`}>{dictionary['navigation'].apex}</MenuItem>
<MenuItem href={`/${locale}/charts/recharts`}>{dictionary['navigation'].recharts}</MenuItem>
</SubMenu>
<MenuItem
icon={<i className='tabler-cards' />}
href={`${process.env.NEXT_PUBLIC_DOCS_URL}/docs/user-interface/foundation`}
suffix={<i className='tabler-external-link text-xl' />}
target='_blank'
>
{dictionary['navigation'].foundation}
</MenuItem>
<MenuItem
icon={<i className='tabler-atom' />}
href={`${process.env.NEXT_PUBLIC_DOCS_URL}/docs/user-interface/components`}
suffix={<i className='tabler-external-link text-xl' />}
target='_blank'
>
{dictionary['navigation'].components}
</MenuItem>
<MenuItem
icon={<i className='tabler-list-search' />}
href={`${process.env.NEXT_PUBLIC_DOCS_URL}/docs/menu-examples/overview`}
suffix={<i className='tabler-external-link text-xl' />}
target='_blank'
>
{dictionary['navigation'].menuExamples}
</MenuItem>
<MenuItem
icon={<i className='tabler-lifebuoy' />}
suffix={<i className='tabler-external-link text-xl' />}
target='_blank'
href='https://pixinvent.ticksy.com'
>
{dictionary['navigation'].raiseSupport}
</MenuItem>
<MenuItem
icon={<i className='tabler-book-2' />}
suffix={<i className='tabler-external-link text-xl' />}
target='_blank'
href={`${process.env.NEXT_PUBLIC_DOCS_URL}`}
>
{dictionary['navigation'].documentation}
</MenuItem>
<SubMenu label={dictionary['navigation'].others} icon={<i className='tabler-box' />}>
<MenuItem suffix={<CustomChip label='New' size='small' color='info' round='true' />}>
{dictionary['navigation'].itemWithBadge}
</MenuItem>
<MenuItem
href='https://pixinvent.com'
target='_blank'
suffix={<i className='tabler-external-link text-xl' />}
>
{dictionary['navigation'].externalLink}
</MenuItem>
<SubMenu label={dictionary['navigation'].menuLevels}>
<MenuItem>{dictionary['navigation'].menuLevel2}</MenuItem>
<SubMenu label={dictionary['navigation'].menuLevel2}>
<MenuItem>{dictionary['navigation'].menuLevel3}</MenuItem>
<MenuItem>{dictionary['navigation'].menuLevel3}</MenuItem>
</SubMenu>
</SubMenu>
<MenuItem disabled>{dictionary['navigation'].disabledMenu}</MenuItem>
</SubMenu>
</MenuSection> </MenuSection>
</Menu> </Menu>
{/* <Menu {/* <Menu

View File

@ -1,546 +0,0 @@
// Type Imports
import type { AcademyType } from '@/types/apps/academyTypes'
export const db: AcademyType = {
courses: [
{
id: 1,
user: 'Lauretta Coie',
image: '/images/avatars/1.png',
tutorImg: '/images/apps/academy/1.png',
completedTasks: 19,
totalTasks: 25,
userCount: 18,
note: 20,
view: 83,
time: '17h 34m',
logo: 'tabler-brand-angular',
color: 'error',
courseTitle: 'Basics of Angular',
desc: 'Introductory course for Angular and framework basics with TypeScript',
tags: 'Web',
rating: 4.4,
ratingCount: 8
},
{
id: 2,
user: 'Maybelle Zmitrovich',
tutorImg: '/images/apps/academy/2.png',
image: '/images/avatars/2.png',
completedTasks: 48,
totalTasks: 52,
userCount: 14,
note: 48,
view: 43,
time: '19h 17m',
logo: 'tabler-palette',
color: 'warning',
desc: 'Learn how to design a beautiful & engaging mobile app with Figma',
courseTitle: 'UI/UX Design',
tags: 'Design',
rating: 4.9,
ratingCount: 10
},
{
id: 3,
user: 'Gertie Langwade',
image: '/images/avatars/2.png',
tutorImg: '/images/apps/academy/3.png',
completedTasks: 87,
totalTasks: 100,
userCount: 19,
note: 81,
view: 88,
time: '16h 16m',
logo: 'tabler-brand-react-native',
color: 'info',
desc: 'Master React.js: Build dynamic web apps with front-end technology',
courseTitle: 'React Native',
tags: 'Web',
rating: 4.8,
ratingCount: 9
},
{
id: 4,
user: 'Estella Chace',
image: '/images/avatars/3.png',
completedTasks: 33,
tutorImg: '/images/apps/academy/4.png',
totalTasks: 50,
userCount: 28,
note: 21,
view: 87,
time: '15h 49m',
logo: 'tabler-pencil',
color: 'success',
courseTitle: 'Art & Drawing',
desc: 'Easy-to-follow video & guides show you how to draw animals & people.',
tags: 'Design',
rating: 4.7,
ratingCount: 18
},
{
id: 5,
user: 'Euell Bownass',
tutorImg: '/images/apps/academy/5.png',
image: '/images/avatars/6.png',
completedTasks: 100,
totalTasks: 100,
userCount: 13,
note: 19,
view: 13,
time: '12h 42m',
logo: 'tabler-star',
color: 'primary',
courseTitle: 'Basic Fundamentals',
desc: 'Learn the basics of the most popular programming language.',
tags: 'Web',
rating: 4.6,
ratingCount: 11
},
{
id: 6,
user: 'Terrye Etches',
tutorImg: '/images/apps/academy/6.png',
image: '/images/avatars/3.png',
completedTasks: 23,
totalTasks: 25,
userCount: 78,
note: 36,
view: 36,
time: '1h 42m',
logo: 'tabler-brand-react-native',
color: 'info',
courseTitle: 'React for Beginners',
desc: 'Learn React in just a couple of afternoons with this immersive course',
tags: 'Web',
rating: 4.5,
ratingCount: 68
},
{
id: 7,
user: 'Papageno Sloy',
tutorImg: '/images/apps/academy/1.png',
image: '/images/avatars/6.png',
completedTasks: 11,
totalTasks: 20,
userCount: 74,
note: 21,
view: 60,
time: '4h 59m',
logo: 'tabler-star',
color: 'primary',
courseTitle: 'The Science of Critical Thinking',
desc: 'Learn how to improve your arguments & make better decisions',
tags: 'Psychology',
rating: 4.4,
ratingCount: 64
},
{
id: 8,
user: 'Aviva Penvarden',
tutorImg: '/images/apps/academy/2.png',
image: '/images/avatars/1.png',
completedTasks: 6,
totalTasks: 25,
userCount: 44,
note: 28,
view: 13,
time: '2h 09m',
logo: 'tabler-palette',
color: 'warning',
courseTitle: 'The Complete Figma UI/UX Course',
desc: 'Learn how to design a beautiful & engaging mobile app with Figma',
tags: 'UI/UX',
rating: 4.3,
ratingCount: 34
},
{
id: 9,
user: 'Reggi Tuddenham',
tutorImg: '/images/apps/academy/3.png',
image: '/images/avatars/8.png',
completedTasks: 67,
totalTasks: 100,
userCount: 95,
note: 34,
view: 26,
time: '22h 21m',
logo: 'tabler-star',
color: 'primary',
courseTitle: 'Advanced Problem Solving Techniques',
desc: 'Learn how to solve problems like a professional with this immersive course',
tags: 'Psychology',
rating: 4.2,
ratingCount: 85
},
{
id: 10,
user: 'Aluin Leveritt',
image: '/images/avatars/1.png',
completedTasks: 49,
totalTasks: 50,
tutorImg: '/images/apps/academy/4.png',
userCount: 98,
note: 51,
view: 37,
time: '22h 22m',
logo: 'tabler-brand-react-native',
color: 'info',
courseTitle: 'Advanced React Native',
desc: "Learn how to build the world's most popular mobile OS with this immersive course",
tags: 'Web',
rating: 4.1,
ratingCount: 88
},
{
id: 11,
user: 'Ardys Deakin',
image: '/images/avatars/1.png',
completedTasks: 87,
totalTasks: 100,
tutorImg: '/images/apps/academy/5.png',
userCount: 19,
note: 40,
view: 32,
time: '15h 25m',
logo: 'tabler-brand-react-native',
color: 'info',
courseTitle: 'Building Web Applications with React',
desc: 'Learn how to build modern web apps with React and Redux',
tags: 'Web',
rating: 4.0,
ratingCount: 9
},
{
id: 12,
user: 'Camel Scown',
image: '/images/avatars/1.png',
tutorImg: '/images/apps/academy/6.png',
completedTasks: 22,
totalTasks: 25,
userCount: 26,
note: 22,
view: 77,
time: '4h 33m',
logo: 'tabler-brand-angular',
color: 'error',
courseTitle: 'Angular Routing and Navigation',
desc: 'Learn how to build single page applications like a pro with this immersive course',
tags: 'Web',
rating: 3.9,
ratingCount: 16
},
{
id: 13,
user: 'Bertina Honnan',
image: '/images/avatars/7.png',
tutorImg: '/images/apps/academy/1.png',
completedTasks: 11,
totalTasks: 50,
userCount: 78,
note: 75,
view: 87,
time: '16h 38m',
logo: 'tabler-star',
color: 'primary',
courseTitle: 'Creative Problem Solving',
desc: 'Learn how to solve problems creatively and effectively with this immersive course',
tags: 'Psychology',
rating: 3.8,
ratingCount: 68
},
{
id: 14,
user: 'Hillyer Wooster',
image: '/images/avatars/2.png',
tutorImg: '/images/apps/academy/2.png',
completedTasks: 11,
totalTasks: 25,
userCount: 92,
note: 39,
view: 60,
time: '22h 43m',
logo: 'tabler-brand-angular',
color: 'error',
courseTitle: 'Building Web Applications with Angular',
desc: 'Learn how to build modern web apps with Angular and TypeScript',
tags: 'Web',
rating: 3.7,
ratingCount: 82
},
{
id: 15,
user: 'Emerson Hance',
image: '/images/avatars/4.png',
tutorImg: '/images/apps/academy/3.png',
completedTasks: 4,
totalTasks: 5,
userCount: 14,
note: 22,
view: 51,
time: '2h 29m',
logo: 'tabler-brand-angular',
color: 'error',
courseTitle: 'Advanced Angular',
desc: 'Learn how to build modern web apps with Angular and TypeScript',
tags: 'Web',
rating: 3.6,
ratingCount: 12
},
{
id: 16,
user: 'Ginger Cruft',
image: '/images/avatars/1.png',
tutorImg: '/images/apps/academy/4.png',
completedTasks: 22,
totalTasks: 25,
userCount: 20,
note: 12,
view: 95,
time: '20h 10m',
logo: 'tabler-brand-react-native',
color: 'info',
courseTitle: 'Testing React with Jest and Enzyme',
desc: 'Learn how to build modern web apps with React and Redux',
tags: 'Web',
rating: 3.5,
ratingCount: 10
},
{
id: 17,
user: 'Rollie Parsons',
image: '/images/avatars/5.png',
tutorImg: '/images/apps/academy/5.png',
completedTasks: 11,
totalTasks: 50,
userCount: 29,
note: 20,
view: 98,
time: '16h 15m',
logo: 'tabler-palette',
color: 'secondary',
courseTitle: 'Typography Theory',
desc: 'Learn how to build modern web apps with React and Redux',
tags: 'Design',
rating: 3.4,
ratingCount: 19
},
{
id: 18,
user: 'Randy Foister',
image: '/images/avatars/1.png',
completedTasks: 23,
tutorImg: '/images/apps/academy/6.png',
totalTasks: 100,
userCount: 20,
note: 16,
view: 77,
time: '4h 31m',
logo: 'tabler-brand-angular',
color: 'error',
courseTitle: 'Angular Testing',
desc: 'Learn how to build modern web apps with Angular and TypeScript',
tags: 'Web',
rating: 4.3,
ratingCount: 10
},
{
id: 19,
user: 'Ashleigh Bartkowiak',
image: '/images/avatars/8.png',
completedTasks: 17,
tutorImg: '/images/apps/academy/1.png',
totalTasks: 50,
userCount: 28,
note: 91,
view: 31,
time: '1h 52m',
logo: 'tabler-brand-react-native',
color: 'info',
courseTitle: 'React for Professional',
desc: 'Learn how to build modern web apps with React and Redux',
tags: 'Web',
rating: 4.2,
ratingCount: 18
},
{
id: 20,
user: 'Bernarr Markie',
image: '/images/avatars/4.png',
tutorImg: '/images/apps/academy/2.png',
completedTasks: 1,
totalTasks: 10,
userCount: 11,
note: 33,
view: 53,
time: '16h 24m',
logo: 'tabler-pencil',
color: 'success',
courseTitle: 'The Ultimate Drawing Course',
desc: 'Learn how to draw like a professional with this immersive course',
tags: 'Art',
rating: 4.1,
ratingCount: 9
},
{
id: 21,
user: 'Merrilee Whitnell',
image: '/images/avatars/2.png',
completedTasks: 91,
totalTasks: 100,
tutorImg: '/images/apps/academy/3.png',
userCount: 11,
note: 17,
view: 74,
time: '5h 57m',
logo: 'tabler-brand-angular',
color: 'error',
courseTitle: 'Basics of Angular',
desc: 'Introductory course for Angular and framework basics with TypeScript',
tags: 'Web',
rating: 4.0,
ratingCount: 7
},
{
id: 22,
user: 'Thekla Dineges',
image: '/images/avatars/1.png',
tutorImg: '/images/apps/academy/4.png',
completedTasks: 49,
totalTasks: 50,
userCount: 28,
note: 30,
view: 54,
time: '4h 40m',
logo: 'tabler-pencil',
color: 'success',
courseTitle: 'Introduction to Digital Painting',
desc: 'Learn how to draw like a professional with this immersive course',
tags: 'Art',
rating: 3.9,
ratingCount: 18
},
{
id: 23,
user: 'Freda Garham',
image: '/images/avatars/5.png',
tutorImg: '/images/apps/academy/5.png',
completedTasks: 81,
totalTasks: 100,
userCount: 79,
note: 46,
view: 27,
time: '8h 44m',
logo: 'tabler-star',
color: 'primary',
courseTitle: 'The Science of Everyday Thinking',
desc: 'Learn how to think better, argue better, and choose better',
tags: 'Psychology',
rating: 3.8,
ratingCount: 69
},
{
id: 24,
user: 'Leyla Bourley',
image: '/images/avatars/5.png',
completedTasks: 6,
tutorImg: '/images/apps/academy/6.png',
totalTasks: 25,
userCount: 28,
note: 11,
view: 77,
time: '22h 36m',
logo: 'tabler-pencil',
color: 'success',
courseTitle: 'Color Theory',
desc: 'Learn how to use color like a professional with this immersive course',
tags: 'Design',
rating: 3.7,
ratingCount: 18
},
{
id: 25,
user: 'Nevsa Lawey',
image: '/images/avatars/6.png',
completedTasks: 13,
totalTasks: 100,
tutorImg: '/images/apps/academy/1.png',
userCount: 93,
note: 73,
view: 67,
time: '19h 21m',
logo: 'tabler-palette',
color: 'warning',
courseTitle: 'The Complete Figma Course',
desc: 'Learn how to design a beautiful & engaging mobile app with Figma',
tags: 'UI/UX',
rating: 3.6,
ratingCount: 83
}
],
courseDetails: {
title: 'UI/UX Basic Fundamentals',
about:
'Learn web design in 1 hour with 25+ simple-to-use rules and guidelines — tons of amazing web design resources included!',
instructor: 'Devonne Wallbridge',
instructorAvatar: '/images/avatars/1.png',
instructorPosition: 'Web Developer, Designer, and Teacher',
skillLevel: 'All Level',
totalStudents: 38815,
language: 'English',
isCaptions: true,
length: '1.5 total hours',
totalLectures: 19,
description: [
`The material of this course is also covered in my other course about web design and development with HTML5 & CSS3. Scroll to the bottom of this page to check out that course, too! If you're already taking my other course, you already have all it takes to start designing beautiful websites today!`,
`"Best web design course: If you're interested in web design, but want more than just a "how to use WordPress" course, I highly recommend this one." — Florian Giusti`,
`"Very helpful to us left-brained people: I am familiar with HTML, CSS, jQuery, and Twitter Bootstrap, but I needed instruction in web design. This course gave me practical, impactful techniques for making websites more beautiful and engaging." — Susan Darlene Cain`
],
content: [
{
title: 'Course Content',
id: 'section1',
topics: [
{ title: 'Welcome to this course', time: '2.4 min', isCompleted: true },
{ title: 'Watch before you start', time: '4.8 min', isCompleted: true },
{ title: 'Basic Design theory', time: '5.9 min', isCompleted: false },
{ title: 'Basic Fundamentals', time: '3.6 min', isCompleted: false },
{ title: 'What is ui/ux', time: '10.6 min', isCompleted: false }
]
},
{
title: 'Web design for Developers',
id: 'section2',
topics: [
{ title: 'How to use Pages in Figma', time: '8.31 min', isCompleted: false },
{ title: 'What is Lo Fi Wireframe', time: '2 min', isCompleted: false },
{ title: 'How to use color in Figma', time: '5.9 min', isCompleted: false },
{ title: 'Frames vs Groups in Figma', time: '3.6 min', isCompleted: false }
]
},
{
title: 'Build Beautiful Websites!',
id: 'section3',
topics: [
{ title: 'Section & Div Block', time: '3.53 min', isCompleted: false },
{ title: 'Read-Only Version of Chat App', time: '2.03 min', isCompleted: false },
{ title: 'Webflow Autosave', time: '8 min', isCompleted: false },
{ title: 'Canvas Settings', time: '3 min', isCompleted: false },
{ title: 'HTML Tags', time: '10 min', isCompleted: false },
{ title: 'Footer (Chat App)', time: '9.10 min', isCompleted: false }
]
},
{
title: 'Final Project',
id: 'section4',
topics: [
{ title: 'Responsive Blog Site', time: '10 min', isCompleted: false },
{ title: 'Responsive Portfolio', time: '13 min', isCompleted: false },
{ title: 'Basic Design theory', time: '15 min', isCompleted: false }
]
}
]
}
}

View File

@ -1,125 +0,0 @@
// Third-party Imports
import type { EventInput } from '@fullcalendar/core'
// Vars
const date = new Date()
const nextDay = new Date(date.getTime() + 24 * 60 * 60 * 1000)
const nextMonth =
date.getMonth() === 11 ? new Date(date.getFullYear() + 1, 0, 1) : new Date(date.getFullYear(), date.getMonth() + 1, 1)
const prevMonth =
date.getMonth() === 11 ? new Date(date.getFullYear() - 1, 0, 1) : new Date(date.getFullYear(), date.getMonth() - 1, 1)
export const events: EventInput[] = [
{
id: '1',
url: '',
title: 'Design Review',
start: date,
end: nextDay,
allDay: false,
extendedProps: {
calendar: 'Business'
}
},
{
id: '2',
url: '',
title: 'Meeting With Client',
start: new Date(date.getFullYear(), date.getMonth() + 1, -11),
end: new Date(date.getFullYear(), date.getMonth() + 1, -10),
allDay: true,
extendedProps: {
calendar: 'Business'
}
},
{
id: '3',
url: '',
title: 'Family Trip',
allDay: true,
start: new Date(date.getFullYear(), date.getMonth() + 1, -9),
end: new Date(date.getFullYear(), date.getMonth() + 1, -7),
extendedProps: {
calendar: 'Holiday'
}
},
{
id: '4',
url: '',
title: "Doctor's Appointment",
start: new Date(date.getFullYear(), date.getMonth() + 1, -11),
end: new Date(date.getFullYear(), date.getMonth() + 1, -10),
allDay: true,
extendedProps: {
calendar: 'Personal'
}
},
{
id: '5',
url: '',
title: 'Dart Game?',
start: new Date(date.getFullYear(), date.getMonth() + 1, -13),
end: new Date(date.getFullYear(), date.getMonth() + 1, -12),
allDay: true,
extendedProps: {
calendar: 'ETC'
}
},
{
id: '6',
url: '',
title: 'Meditation',
start: new Date(date.getFullYear(), date.getMonth() + 1, -13),
end: new Date(date.getFullYear(), date.getMonth() + 1, -12),
allDay: true,
extendedProps: {
calendar: 'Personal'
}
},
{
id: '7',
url: '',
title: 'Dinner',
start: new Date(date.getFullYear(), date.getMonth() + 1, -13),
end: new Date(date.getFullYear(), date.getMonth() + 1, -12),
allDay: true,
extendedProps: {
calendar: 'Family'
}
},
{
id: '8',
url: '',
title: 'Product Review',
start: new Date(date.getFullYear(), date.getMonth() + 1, -13),
end: new Date(date.getFullYear(), date.getMonth() + 1, -12),
allDay: true,
extendedProps: {
calendar: 'Business'
}
},
{
id: '9',
url: '',
title: 'Monthly Meeting',
start: nextMonth,
end: nextMonth,
allDay: true,
extendedProps: {
calendar: 'Business'
}
},
{
id: '10',
url: '',
title: 'Monthly Checkup',
start: prevMonth,
end: prevMonth,
allDay: true,
extendedProps: {
calendar: 'Personal'
}
}
]

View File

@ -1,547 +0,0 @@
// Type Imports
import type { ChatDataType } from '@/types/apps/chatTypes'
const previousDay = new Date(new Date().getTime() - 24 * 60 * 60 * 1000)
const dayBeforePreviousDay = new Date(new Date().getTime() - 24 * 60 * 60 * 1000 * 2)
export const db: ChatDataType = {
profileUser: {
id: 1,
avatar: '/images/avatars/1.png',
fullName: 'John Doe',
role: 'Admin',
about:
'Dessert chocolate cake lemon drops jujubes. Biscuit cupcake ice cream bear claw brownie brownie marshmallow.',
status: 'online',
settings: {
isTwoStepAuthVerificationEnabled: true,
isNotificationsOn: false
}
},
contacts: [
{
id: 2,
fullName: 'Felecia Rower',
role: 'Frontend Developer',
about: 'Cake pie jelly jelly beans. Marzipan lemon drops halvah cake. Pudding cookie lemon drops icing',
avatar: '/images/avatars/2.png',
status: 'offline'
},
{
id: 3,
fullName: 'Adalberto Granzin',
role: 'UI/UX Designer',
avatarColor: 'primary',
about:
'Toffee caramels jelly-o tart gummi bears cake I love ice cream lollipop. Sweet liquorice croissant candy danish dessert icing. Cake macaroon gingerbread toffee sweet.',
status: 'busy'
},
{
id: 4,
fullName: 'Joaquina Weisenborn',
role: 'Town planner',
about:
'Soufflé soufflé caramels sweet roll. Jelly lollipop sesame snaps bear claw jelly beans sugar plum sugar plum.',
avatar: '/images/avatars/8.png',
status: 'busy'
},
{
id: 5,
fullName: 'Margot Henschke',
role: 'Dietitian',
avatarColor: 'success',
about: 'Cake pie jelly jelly beans. Marzipan lemon drops halvah cake. Pudding cookie lemon drops icing',
status: 'busy'
},
{
id: 6,
avatarColor: 'warning',
fullName: 'Bridgett Omohundro',
role: 'Designer, television/film set',
about:
'Gummies gummi bears I love candy icing apple pie I love marzipan bear claw. I love tart biscuit I love candy canes pudding chupa chups liquorice croissant.',
status: 'offline'
},
{
id: 7,
fullName: 'Sal Piggee',
role: 'Marketing executive',
about:
'Toffee caramels jelly-o tart gummi bears cake I love ice cream lollipop. Sweet liquorice croissant candy danish dessert icing. Cake macaroon gingerbread toffee sweet.',
avatarColor: 'info',
status: 'online'
},
{
id: 8,
fullName: 'Miguel Guelff',
role: 'Special educational needs teacher',
about:
'Biscuit powder oat cake donut brownie ice cream I love soufflé. I love tootsie roll I love powder tootsie roll.',
avatar: '/images/avatars/7.png',
status: 'online'
},
{
id: 9,
fullName: 'Mauro Elenbaas',
role: 'Advertising copywriter',
about:
'Bear claw ice cream lollipop gingerbread carrot cake. Brownie gummi bears chocolate muffin croissant jelly I love marzipan wafer.',
avatarColor: 'success',
status: 'away'
},
{
id: 10,
avatarColor: 'error',
fullName: 'Zenia Jacobs',
role: 'Building surveyor',
about: 'Cake pie jelly jelly beans. Marzipan lemon drops halvah cake. Pudding cookie lemon drops icing',
status: 'away'
},
{
id: 11,
fullName: 'Ramonita Veras',
role: 'CEO',
about:
'Toffee caramels jelly-o tart gummi bears cake I love ice cream lollipop. Sweet liquorice croissant candy danish dessert icing. Cake macaroon gingerbread toffee sweet.',
avatar: '/images/avatars/4.png',
status: 'online'
},
{
id: 12,
fullName: 'Lashawna Gotschall',
role: 'Therapist, sports',
about:
'Soufflé soufflé caramels sweet roll. Jelly lollipop sesame snaps bear claw jelly beans sugar plum sugar plum.',
avatarColor: 'info',
status: 'online'
},
{
id: 13,
fullName: 'Rosalva Uyetake',
role: 'Engineer, civil (consulting)',
about:
'Chupa chups candy canes chocolate bar marshmallow liquorice muffin. Lemon drops oat cake tart liquorice tart cookie. Jelly-o cookie tootsie roll halvah.',
avatar: '/images/avatars/6.png',
status: 'offline'
},
{
id: 14,
fullName: 'Cecilia Shockey',
role: 'Database administrator',
about: 'Cake pie jelly jelly beans. Marzipan lemon drops halvah cake. Pudding cookie lemon drops icing',
avatarColor: 'secondary',
status: 'busy'
},
{
id: 15,
fullName: 'Harriett Duropan',
role: 'Therapist, sports',
about:
'Toffee caramels jelly-o tart gummi bears cake I love ice cream lollipop. Sweet liquorice croissant candy danish dessert icing. Cake macaroon gingerbread toffee sweet.',
avatar: '/images/avatars/5.png',
status: 'online'
},
{
id: 16,
fullName: 'Lauran Starner',
role: 'AI specialist',
about:
'Soufflé soufflé caramels sweet roll. Jelly lollipop sesame snaps bear claw jelly beans sugar plum sugar plum.',
avatarColor: 'warning',
status: 'online'
},
{
id: 17,
fullName: 'Verla Morgano',
role: 'Data scientist',
about:
'Chupa chups candy canes chocolate bar marshmallow liquorice muffin. Lemon drops oat cake tart liquorice tart cookie. Jelly-o cookie tootsie roll halvah.',
avatar: '/images/avatars/3.png',
status: 'online'
}
],
chats: [
{
id: 1,
userId: 2,
unseenMsgs: 1,
chat: [
{
message: "How can we help? We're here for you!",
time: 'Mon Dec 10 2018 07:45:00 GMT+0000 (GMT)',
senderId: 1,
msgStatus: {
isSent: true,
isDelivered: true,
isSeen: true
}
},
{
message: 'Hey John, I am looking for the best admin template. Could you please help me to find it out?',
time: 'Mon Dec 10 2018 07:45:23 GMT+0000 (GMT)',
senderId: 2
},
{
message: 'It should be MUI v5 compatible.',
time: 'Mon Dec 10 2018 07:45:55 GMT+0000 (GMT)',
senderId: 2,
msgStatus: {
isSent: true,
isDelivered: true,
isSeen: true
}
},
{
message: 'Absolutely!',
time: 'Mon Dec 10 2018 07:46:00 GMT+0000 (GMT)',
senderId: 1,
msgStatus: {
isSent: true,
isDelivered: true,
isSeen: true
}
},
{
message: 'This admin template is built with MUI!',
time: 'Mon Dec 10 2018 07:46:05 GMT+0000 (GMT)',
senderId: 1,
msgStatus: {
isSent: true,
isDelivered: true,
isSeen: true
}
},
{
message: 'Looks clean and fresh UI. 😍',
time: 'Mon Dec 10 2018 07:46:23 GMT+0000 (GMT)',
senderId: 2
},
{
message: "It's perfect for my next project.",
time: 'Mon Dec 10 2018 07:46:33 GMT+0000 (GMT)',
senderId: 2
},
{
message: 'How can I purchase it?',
time: 'Mon Dec 10 2018 07:46:43 GMT+0000 (GMT)',
senderId: 2
},
{
message: 'Thanks, From our official site 😇',
time: 'Mon Dec 10 2018 07:46:53 GMT+0000 (GMT)',
senderId: 1,
msgStatus: {
isSent: true,
isDelivered: true,
isSeen: true
}
},
{
message: 'I will purchase it for sure. 👍',
time: previousDay,
senderId: 2
}
]
},
{
id: 2,
userId: 3,
unseenMsgs: 0,
chat: [
{
message: 'Hi',
time: 'Mon Dec 10 2018 07:45:00 GMT+0000 (GMT)',
senderId: 1,
msgStatus: {
isSent: true,
isDelivered: true,
isSeen: true
}
},
{
message: 'Hello. How can I help You?',
time: 'Mon Dec 11 2018 07:45:15 GMT+0000 (GMT)',
senderId: 3
},
{
message: 'Can I get details of my last transaction I made last month? 🤔',
time: 'Mon Dec 11 2018 07:46:10 GMT+0000 (GMT)',
senderId: 1,
msgStatus: {
isSent: true,
isDelivered: true,
isSeen: true
}
},
{
message: 'We need to check if we can provide you such information.',
time: 'Mon Dec 11 2018 07:45:15 GMT+0000 (GMT)',
senderId: 3
},
{
message: 'I will inform you as I get update on this.',
time: 'Mon Dec 11 2018 07:46:15 GMT+0000 (GMT)',
senderId: 3
},
{
message: 'If it takes long you can mail me at my mail address.',
time: dayBeforePreviousDay,
senderId: 1,
msgStatus: {
isSent: true,
isDelivered: false,
isSeen: false
}
}
]
},
{
id: 3,
userId: 10,
unseenMsgs: 0,
chat: [
{
message: 'Hello, I am a building surveyor and I would like to schedule a survey for your building.',
time: 'Mon Dec 13 2021 11:00:00 GMT+0000 (GMT)',
senderId: 10
},
{
message: 'Sure, could you please provide more details about the survey?',
time: 'Mon Dec 13 2021 11:01:00 GMT+0000 (GMT)',
senderId: 1
},
{
message:
'The survey will include a thorough inspection of the building to assess its condition and identify any potential issues.',
time: 'Mon Dec 13 2021 11:02:00 GMT+0000 (GMT)',
senderId: 10
},
{
message: 'Okay, when do you plan to conduct the survey?',
time: 'Mon Dec 13 2021 11:03:00 GMT+0000 (GMT)',
senderId: 1
},
{
message: 'I am available to conduct the survey next week. Does that work for you?',
time: 'Mon Dec 13 2021 11:04:00 GMT+0000 (GMT)',
senderId: 10
},
{
message: "Yes, that works for me. Let's schedule it for next Wednesday.",
time: 'Mon Dec 13 2021 11:05:00 GMT+0000 (GMT)',
senderId: 1
},
{
message: 'Great. I will send you a confirmation email with the details.',
time: 'Mon Dec 13 2021 11:06:00 GMT+0000 (GMT)',
senderId: 10
},
{
message: 'Thank you, looking forward to it.',
time: 'Mon Dec 13 2021 11:07:00 GMT+0000 (GMT)',
senderId: 1
}
]
},
{
id: 4,
userId: 8,
unseenMsgs: 0,
chat: [
{
message: 'Hello, I would like to arrange a professional meeting.',
time: 'Mon Dec 10 2018 07:45:00 GMT+0000 (GMT)',
senderId: 1,
msgStatus: {
isSent: true,
isDelivered: true,
isSeen: true
}
},
{
message: 'Sure, could you please provide more details about the meeting?',
time: 'Mon Dec 11 2018 07:45:15 GMT+0000 (GMT)',
senderId: 8
},
{
message: 'The meeting is about our next project plan.',
time: 'Mon Dec 11 2018 07:46:10 GMT+0000 (GMT)',
senderId: 1,
msgStatus: {
isSent: true,
isDelivered: true,
isSeen: true
}
},
{
message: 'Okay, I will prepare the necessary documents for the meeting.',
time: 'Mon Dec 11 2018 07:45:15 GMT+0000 (GMT)',
senderId: 8
},
{
message: 'Thank you, looking forward to it.',
time: 'Mon Dec 11 2018 07:46:15 GMT+0000 (GMT)',
senderId: 1
}
]
},
{
id: 5,
userId: 16,
unseenMsgs: 0,
chat: [
{
message: 'Hey, have you heard about the new AI model GPT-4?',
time: 'Mon Dec 13 2021 09:00:00 GMT+0000 (GMT)',
senderId: 16
},
{
message: "No, I haven't. What's new about it?",
time: 'Mon Dec 13 2021 09:01:00 GMT+0000 (GMT)',
senderId: 1
},
{
message:
"It's supposed to be even more powerful and accurate than GPT-3. It can generate even more realistic text.",
time: 'Mon Dec 13 2021 09:02:00 GMT+0000 (GMT)',
senderId: 16
},
{
message: "That sounds interesting. I'll have to check it out.",
time: 'Mon Dec 13 2021 09:03:00 GMT+0000 (GMT)',
senderId: 1
}
]
},
{
id: 6,
userId: 11,
unseenMsgs: 1,
chat: [
{
message: "Hey, have you thought about our company's future plans?",
time: 'Mon Dec 13 2021 10:00:00 GMT+0000 (GMT)',
senderId: 1
},
{
message: 'Yes, I have been thinking about it. We need to focus on AI and machine learning.',
time: 'Mon Dec 13 2021 10:01:00 GMT+0000 (GMT)',
senderId: 11
},
{
message: 'I agree. These technologies are the future. We should also consider investing in cloud computing.',
time: 'Mon Dec 13 2021 10:02:00 GMT+0000 (GMT)',
senderId: 1
},
{
message: 'Absolutely. Cloud computing will give us the flexibility and scalability we need.',
time: 'Mon Dec 13 2021 10:03:00 GMT+0000 (GMT)',
senderId: 11
},
{
message: 'We should also think about expanding our team. We will need more talent to achieve our goals.',
time: 'Mon Dec 13 2021 10:04:00 GMT+0000 (GMT)',
senderId: 1
},
{
message:
'Yes, hiring the right people is crucial. We should start looking for candidates as soon as possible.',
time: 'Mon Dec 13 2021 10:05:00 GMT+0000 (GMT)',
senderId: 11
},
{
message: "Great. Let's start working on a plan then.",
time: 'Mon Dec 13 2021 10:06:00 GMT+0000 (GMT)',
senderId: 1
},
{
message: "Sounds good. Let's do it.",
time: 'Mon Dec 13 2021 10:07:00 GMT+0000 (GMT)',
senderId: 11
}
]
},
{
id: 7,
userId: 17,
unseenMsgs: 0,
chat: [
{
message:
'Hello, as a data scientist, I have been analyzing our user data and found some interesting patterns.',
time: 'Mon Dec 13 2021 12:00:00 GMT+0000 (GMT)',
senderId: 17
},
{
message: 'That sounds interesting. Could you please share more details?',
time: 'Mon Dec 13 2021 12:01:00 GMT+0000 (GMT)',
senderId: 1
},
{
message: 'Sure, our users are most active during the evening hours and they mostly use our app on weekends.',
time: 'Mon Dec 13 2021 12:02:00 GMT+0000 (GMT)',
senderId: 17
},
{
message: "That's valuable information. We can use this to schedule our app updates and maintenance work.",
time: 'Mon Dec 13 2021 12:03:00 GMT+0000 (GMT)',
senderId: 1
},
{
message: 'Exactly. We can also use this information to target our marketing campaigns.',
time: 'Mon Dec 13 2021 12:04:00 GMT+0000 (GMT)',
senderId: 17
},
{
message: 'Great work. Keep it up.',
time: 'Mon Dec 13 2021 12:05:00 GMT+0000 (GMT)',
senderId: 1
}
]
},
{
id: 8,
userId: 14,
unseenMsgs: 1,
chat: [
{
message:
'Hello, as a database administrator, I have been monitoring our databases and I noticed a significant increase in the load.',
time: 'Mon Dec 13 2021 13:00:00 GMT+0000 (GMT)',
senderId: 14
},
{
message: "That's concerning. Do you have any idea what might be causing this?",
time: 'Mon Dec 13 2021 13:01:00 GMT+0000 (GMT)',
senderId: 1
},
{
message:
'I suspect it might be due to the recent increase in user registrations. I will investigate further and optimize our databases accordingly.',
time: 'Mon Dec 13 2021 13:02:00 GMT+0000 (GMT)',
senderId: 14
},
{
message: 'That sounds like a good plan. Let me know if you need any help.',
time: 'Mon Dec 13 2021 13:03:00 GMT+0000 (GMT)',
senderId: 1
},
{
message: 'Will do. I will keep you updated on the progress.',
time: 'Mon Dec 13 2021 13:04:00 GMT+0000 (GMT)',
senderId: 14
},
{
message: 'Thank you, I appreciate your efforts.',
time: 'Mon Dec 13 2021 13:05:00 GMT+0000 (GMT)',
senderId: 1
},
{
message: 'Your Welcome!😊',
time: 'Mon Dec 13 2021 13:06:00 GMT+0000 (GMT)',
senderId: 14
}
]
}
]
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,826 +0,0 @@
// Type Imports
import type { InvoiceType } from '@/types/apps/invoiceTypes'
const now = new Date()
const currentMonth = now.toLocaleString('default', { month: 'short' })
export const db: InvoiceType[] = [
{
id: '4987',
issuedDate: `13 ${currentMonth} ${now.getFullYear()}`,
address: '7777 Mendez Plains',
company: 'Hall-Robbins PLC',
companyEmail: 'don85@johnson.com',
country: 'USA',
contact: '(616) 865-4180',
name: 'Jordan Stevenson',
service: 'Software Development',
total: 3428,
avatar: '',
avatarColor: 'primary',
invoiceStatus: 'Paid',
balance: '$724',
dueDate: `23 ${currentMonth} ${now.getFullYear()}`
},
{
id: '4988',
issuedDate: `17 ${currentMonth} ${now.getFullYear()}`,
address: '04033 Wesley Wall Apt. 961',
company: 'Mccann LLC and Sons',
companyEmail: 'brenda49@taylor.info',
country: 'Haiti',
contact: '(226) 204-8287',
name: 'Stephanie Burns',
service: 'UI/UX Design & Development',
total: 5219,
avatar: '/images/avatars/1.png',
invoiceStatus: 'Downloaded',
balance: 0,
dueDate: `15 ${currentMonth} ${now.getFullYear()}`
},
{
id: '4989',
issuedDate: `19 ${currentMonth} ${now.getFullYear()}`,
address: '5345 Robert Squares',
company: 'Leonard-Garcia and Sons',
companyEmail: 'smithtiffany@powers.com',
country: 'Denmark',
contact: '(955) 676-1076',
name: 'Tony Herrera',
service: 'Unlimited Extended License',
total: 3719,
avatar: '/images/avatars/2.png',
invoiceStatus: 'Paid',
balance: 0,
dueDate: `03 ${currentMonth} ${now.getFullYear()}`
},
{
id: '4990',
issuedDate: `06 ${currentMonth} ${now.getFullYear()}`,
address: '19022 Clark Parks Suite 149',
company: 'Smith, Miller and Henry LLC',
companyEmail: 'mejiageorge@lee-perez.com',
country: 'Cambodia',
contact: '(832) 323-6914',
name: 'Kevin Patton',
service: 'Software Development',
total: 4749,
avatar: '/images/avatars/3.png',
invoiceStatus: 'Sent',
balance: 0,
dueDate: `11 ${currentMonth} ${now.getFullYear()}`
},
{
id: '4991',
issuedDate: `08 ${currentMonth} ${now.getFullYear()}`,
address: '8534 Saunders Hill Apt. 583',
company: 'Garcia-Cameron and Sons',
companyEmail: 'brandon07@pierce.com',
country: 'Martinique',
contact: '(970) 982-3353',
name: 'Mrs. Julie Donovan MD',
service: 'UI/UX Design & Development',
total: 4056,
avatar: '/images/avatars/4.png',
invoiceStatus: 'Draft',
balance: '$815',
dueDate: `30 ${currentMonth} ${now.getFullYear()}`
},
{
id: '4992',
issuedDate: `26 ${currentMonth} ${now.getFullYear()}`,
address: '661 Perez Run Apt. 778',
company: 'Burnett-Young PLC',
companyEmail: 'guerrerobrandy@beasley-harper.com',
country: 'Botswana',
contact: '(511) 938-9617',
name: 'Amanda Phillips',
service: 'UI/UX Design & Development',
total: 2771,
avatar: '',
avatarColor: 'secondary',
invoiceStatus: 'Paid',
balance: 0,
dueDate: `24 ${currentMonth} ${now.getFullYear()}`
},
{
id: '4993',
issuedDate: `17 ${currentMonth} ${now.getFullYear()}`,
address: '074 Long Union',
company: 'Wilson-Lee LLC',
companyEmail: 'williamshenry@moon-smith.com',
country: 'Montserrat',
contact: '(504) 859-2893',
name: 'Christina Collier',
service: 'UI/UX Design & Development',
total: 2713,
avatar: '',
avatarColor: 'success',
invoiceStatus: 'Draft',
balance: '$407',
dueDate: `22 ${currentMonth} ${now.getFullYear()}`
},
{
id: '4994',
issuedDate: `11 ${currentMonth} ${now.getFullYear()}`,
address: '5225 Ford Cape Apt. 840',
company: 'Schwartz, Henry and Rhodes Group',
companyEmail: 'margaretharvey@russell-murray.com',
country: 'Oman',
contact: '(758) 403-7718',
name: 'David Flores',
service: 'Template Customization',
total: 4309,
avatar: '/images/avatars/5.png',
invoiceStatus: 'Paid',
balance: '-$205',
dueDate: `10 ${currentMonth} ${now.getFullYear()}`
},
{
id: '4995',
issuedDate: `26 ${currentMonth} ${now.getFullYear()}`,
address: '23717 James Club Suite 277',
company: 'Henderson-Holder PLC',
companyEmail: 'dianarodriguez@villegas.com',
country: 'Cambodia',
contact: '(292) 873-8254',
name: 'Valerie Perez',
service: 'Software Development',
total: 3367,
avatar: '/images/avatars/6.png',
invoiceStatus: 'Downloaded',
balance: 0,
dueDate: `24 ${currentMonth} ${now.getFullYear()}`
},
{
id: '4996',
issuedDate: `15 ${currentMonth} ${now.getFullYear()}`,
address: '4528 Myers Gateway',
company: 'Page-Wise PLC',
companyEmail: 'bwilson@norris-brock.com',
country: 'Guam',
contact: '(956) 803-2008',
name: 'Susan Dickerson',
service: 'Software Development',
total: 4776,
avatar: '/images/avatars/7.png',
invoiceStatus: 'Downloaded',
balance: '$305',
dueDate: `02 ${currentMonth} ${now.getFullYear()}`
},
{
id: '4997',
issuedDate: `27 ${currentMonth} ${now.getFullYear()}`,
address: '4234 Mills Club Suite 107',
company: 'Turner PLC Inc',
companyEmail: 'markcampbell@bell.info',
country: 'United States Virgin Islands',
contact: '(716) 962-8635',
name: 'Kelly Smith',
service: 'Unlimited Extended License',
total: 3789,
avatar: '/images/avatars/8.png',
invoiceStatus: 'Partial Payment',
balance: '$666',
dueDate: `18 ${currentMonth} ${now.getFullYear()}`
},
{
id: '4998',
issuedDate: `31 ${currentMonth} ${now.getFullYear()}`,
address: '476 Keith Meadow',
company: 'Levine-Dorsey PLC',
companyEmail: 'mary61@rosario.com',
country: 'Syrian Arab Republic',
contact: '(523) 449-0782',
name: 'Jamie Jones',
service: 'Unlimited Extended License',
total: 5200,
avatar: '/images/avatars/1.png',
invoiceStatus: 'Partial Payment',
balance: 0,
dueDate: `17 ${currentMonth} ${now.getFullYear()}`
},
{
id: '4999',
issuedDate: `14 ${currentMonth} ${now.getFullYear()}`,
address: '56381 Ashley Village Apt. 332',
company: 'Hall, Thompson and Ramirez LLC',
companyEmail: 'sean22@cook.com',
country: 'Ukraine',
contact: '(583) 470-8356',
name: 'Ruben Garcia',
service: 'Software Development',
total: 4558,
avatar: '/images/avatars/2.png',
invoiceStatus: 'Paid',
balance: 0,
dueDate: `01 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5000',
issuedDate: `21 ${currentMonth} ${now.getFullYear()}`,
address: '6946 Gregory Plaza Apt. 310',
company: 'Lambert-Thomas Group',
companyEmail: 'mccoymatthew@lopez-jenkins.net',
country: 'Vanuatu',
contact: '(366) 906-6467',
name: 'Ryan Meyer',
service: 'Template Customization',
total: 3503,
avatar: '/images/avatars/3.png',
invoiceStatus: 'Paid',
balance: 0,
dueDate: `22 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5001',
issuedDate: `30 ${currentMonth} ${now.getFullYear()}`,
address: '64351 Andrew Lights',
company: 'Gregory-Haynes PLC',
companyEmail: 'novakshannon@mccarty-murillo.com',
country: 'Romania',
contact: '(320) 616-3915',
name: 'Valerie Valdez',
service: 'Unlimited Extended License',
total: 5285,
avatar: '/images/avatars/4.png',
invoiceStatus: 'Partial Payment',
balance: '-$202',
dueDate: `02 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5002',
issuedDate: `21 ${currentMonth} ${now.getFullYear()}`,
address: '5702 Sarah Heights',
company: 'Wright-Schmidt LLC',
companyEmail: 'smithrachel@davis-rose.net',
country: 'Costa Rica',
contact: '(435) 899-1963',
name: 'Melissa Wheeler',
service: 'UI/UX Design & Development',
total: 3668,
avatar: '/images/avatars/5.png',
invoiceStatus: 'Downloaded',
balance: '$731',
dueDate: `15 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5003',
issuedDate: `30 ${currentMonth} ${now.getFullYear()}`,
address: '668 Robert Flats',
company: 'Russell-Abbott Ltd',
companyEmail: 'scott96@mejia.net',
country: 'Congo',
contact: '(254) 399-4728',
name: 'Alan Jimenez',
service: 'Unlimited Extended License',
total: 4372,
avatar: '',
avatarColor: 'warning',
invoiceStatus: 'Sent',
balance: '-$344',
dueDate: `17 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5004',
issuedDate: `27 ${currentMonth} ${now.getFullYear()}`,
address: '55642 Chang Extensions Suite 373',
company: 'Williams LLC Inc',
companyEmail: 'cramirez@ross-bass.biz',
country: 'Saint Pierre and Miquelon',
contact: '(648) 500-4338',
name: 'Jennifer Morris',
service: 'Template Customization',
total: 3198,
avatar: '/images/avatars/6.png',
invoiceStatus: 'Partial Payment',
balance: '-$253',
dueDate: `16 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5005',
issuedDate: `30 ${currentMonth} ${now.getFullYear()}`,
address: '56694 Eric Orchard',
company: 'Hudson, Bell and Phillips PLC',
companyEmail: 'arielberg@wolfe-smith.com',
country: 'Uruguay',
contact: '(896) 544-3796',
name: 'Timothy Stevenson',
service: 'Unlimited Extended License',
total: 5293,
avatar: '',
avatarColor: 'error',
invoiceStatus: 'Past Due',
balance: 0,
dueDate: `01 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5006',
issuedDate: `10 ${currentMonth} ${now.getFullYear()}`,
address: '3727 Emma Island Suite 879',
company: 'Berry, Gonzalez and Heath Inc',
companyEmail: 'yrobinson@nichols.com',
country: 'Israel',
contact: '(236) 784-5142',
name: 'Erik Hayden',
service: 'Template Customization',
total: 5612,
avatar: '/images/avatars/7.png',
invoiceStatus: 'Downloaded',
balance: '$883',
dueDate: `12 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5007',
issuedDate: `01 ${currentMonth} ${now.getFullYear()}`,
address: '953 Miller Common Suite 580',
company: 'Martinez, Fuller and Chavez and Sons',
companyEmail: 'tatejennifer@allen.net',
country: 'Cook Islands',
contact: '(436) 717-2419',
name: 'Katherine Kennedy',
service: 'Software Development',
total: 2230,
avatar: '/images/avatars/8.png',
invoiceStatus: 'Sent',
balance: 0,
dueDate: `19 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5008',
issuedDate: `22 ${currentMonth} ${now.getFullYear()}`,
address: '808 Sullivan Street Apt. 135',
company: 'Wilson and Sons LLC',
companyEmail: 'gdurham@lee.com',
country: 'Nepal',
contact: '(489) 946-3041',
name: 'Monica Fuller',
service: 'Unlimited Extended License',
total: 2032,
avatar: '/images/avatars/1.png',
invoiceStatus: 'Partial Payment',
balance: 0,
dueDate: `30 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5009',
issuedDate: `30 ${currentMonth} ${now.getFullYear()}`,
address: '25135 Christopher Creek',
company: 'Hawkins, Johnston and Mcguire PLC',
companyEmail: 'jenny96@lawrence-thompson.com',
country: 'Kiribati',
contact: '(274) 246-3725',
name: 'Stacey Carter',
service: 'UI/UX Design & Development',
total: 3128,
avatar: '/images/avatars/2.png',
invoiceStatus: 'Paid',
balance: 0,
dueDate: `10 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5010',
issuedDate: `06 ${currentMonth} ${now.getFullYear()}`,
address: '81285 Rebecca Estates Suite 046',
company: 'Huynh-Mills and Sons',
companyEmail: 'jgutierrez@jackson.com',
country: 'Swaziland',
contact: '(258) 211-5970',
name: 'Chad Davis',
service: 'Software Development',
total: 2060,
avatar: '/images/avatars/3.png',
invoiceStatus: 'Downloaded',
balance: 0,
dueDate: `08 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5011',
issuedDate: `01 ${currentMonth} ${now.getFullYear()}`,
address: '3102 Briggs Dale Suite 118',
company: 'Jones-Cooley and Sons',
companyEmail: 'hunter14@jones.com',
country: 'Congo',
contact: '(593) 965-4100',
name: 'Chris Reyes',
service: 'UI/UX Design & Development',
total: 4077,
avatar: '',
avatarColor: 'info',
invoiceStatus: 'Draft',
balance: 0,
dueDate: `01 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5012',
issuedDate: `30 ${currentMonth} ${now.getFullYear()}`,
address: '811 Jill Skyway',
company: 'Jones PLC Ltd',
companyEmail: 'pricetodd@johnson-jenkins.com',
country: 'Brazil',
contact: '(585) 829-2603',
name: 'Laurie Summers',
service: 'Template Customization',
total: 2872,
avatar: '/images/avatars/4.png',
invoiceStatus: 'Partial Payment',
balance: 0,
dueDate: `18 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5013',
issuedDate: `05 ${currentMonth} ${now.getFullYear()}`,
address: '2223 Brandon Inlet Suite 597',
company: 'Jordan, Gomez and Ross Group',
companyEmail: 'perrydavid@chapman-rogers.com',
country: 'Congo',
contact: '(527) 351-5517',
name: 'Lindsay Wilson',
service: 'Software Development',
total: 3740,
avatar: '/images/avatars/5.png',
invoiceStatus: 'Draft',
balance: 0,
dueDate: `01 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5014',
issuedDate: `01 ${currentMonth} ${now.getFullYear()}`,
address: '08724 Barry Causeway',
company: 'Gonzalez, Moody and Glover LLC',
companyEmail: 'leahgriffin@carpenter.com',
country: 'Equatorial Guinea',
contact: '(628) 903-0132',
name: 'Jenna Castro',
service: 'Unlimited Extended License',
total: 3623,
avatar: '',
avatarColor: 'primary',
invoiceStatus: 'Downloaded',
balance: 0,
dueDate: `23 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5015',
issuedDate: `16 ${currentMonth} ${now.getFullYear()}`,
address: '073 Holt Ramp Apt. 755',
company: 'Ashley-Pacheco Ltd',
companyEmail: 'esparzadaniel@allen.com',
country: 'Seychelles',
contact: '(847) 396-9904',
name: 'Wendy Weber',
service: 'Software Development',
total: 2477,
avatar: '/images/avatars/6.png',
invoiceStatus: 'Draft',
balance: 0,
dueDate: `01 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5016',
issuedDate: `24 ${currentMonth} ${now.getFullYear()}`,
address: '984 Sherry Trail Apt. 953',
company: 'Berry PLC Group',
companyEmail: 'todd34@owens-morgan.com',
country: 'Ireland',
contact: '(852) 249-4539',
name: 'April Yates',
service: 'Unlimited Extended License',
total: 3904,
avatar: '',
avatarColor: 'secondary',
invoiceStatus: 'Paid',
balance: '$951',
dueDate: `30 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5017',
issuedDate: `24 ${currentMonth} ${now.getFullYear()}`,
address: '093 Jonathan Camp Suite 953',
company: 'Allen Group Ltd',
companyEmail: 'roydavid@bailey.com',
country: 'Netherlands',
contact: '(917) 984-2232',
name: 'Daniel Marshall PhD',
service: 'UI/UX Design & Development',
total: 3102,
avatar: '/images/avatars/7.png',
invoiceStatus: 'Partial Payment',
balance: '-$153',
dueDate: `25 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5018',
issuedDate: `29 ${currentMonth} ${now.getFullYear()}`,
address: '4735 Kristie Islands Apt. 259',
company: 'Chapman-Schneider LLC',
companyEmail: 'baldwinjoel@washington.com',
country: 'Cocos (Keeling) Islands',
contact: '(670) 409-3703',
name: 'Randy Rich',
service: 'UI/UX Design & Development',
total: 2483,
avatar: '/images/avatars/8.png',
invoiceStatus: 'Draft',
balance: 0,
dueDate: `10 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5019',
issuedDate: `07 ${currentMonth} ${now.getFullYear()}`,
address: '92218 Andrew Radial',
company: 'Mcclure, Hernandez and Simon Ltd',
companyEmail: 'psmith@morris.info',
country: 'Macao',
contact: '(646) 263-0257',
name: 'Mrs. Jodi Chapman',
service: 'Unlimited Extended License',
total: 2825,
avatar: '/images/avatars/1.png',
invoiceStatus: 'Partial Payment',
balance: '-$459',
dueDate: `14 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5020',
issuedDate: `10 ${currentMonth} ${now.getFullYear()}`,
address: '2342 Michelle Valley',
company: 'Hamilton PLC and Sons',
companyEmail: 'lori06@morse.com',
country: 'Somalia',
contact: '(751) 213-4288',
name: 'Steven Myers',
service: 'Unlimited Extended License',
total: 2029,
avatar: '/images/avatars/2.png',
invoiceStatus: 'Past Due',
balance: 0,
dueDate: `28 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5021',
issuedDate: `02 ${currentMonth} ${now.getFullYear()}`,
address: '16039 Brittany Terrace Apt. 128',
company: 'Silva-Reeves LLC',
companyEmail: 'zpearson@miller.com',
country: 'Slovakia (Slovak Republic)',
contact: '(655) 649-7872',
name: 'Charles Alexander',
service: 'Software Development',
total: 3208,
avatar: '',
avatarColor: 'success',
invoiceStatus: 'Sent',
balance: 0,
dueDate: `06 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5022',
issuedDate: `02 ${currentMonth} ${now.getFullYear()}`,
address: '37856 Olsen Lakes Apt. 852',
company: 'Solis LLC Ltd',
companyEmail: 'strongpenny@young.net',
country: 'Brazil',
contact: '(402) 935-0735',
name: 'Elizabeth Jones',
service: 'Software Development',
total: 3077,
avatar: '',
avatarColor: 'error',
invoiceStatus: 'Sent',
balance: 0,
dueDate: `09 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5023',
issuedDate: `23 ${currentMonth} ${now.getFullYear()}`,
address: '11489 Griffin Plaza Apt. 927',
company: 'Munoz-Peters and Sons',
companyEmail: 'carrietorres@acosta.com',
country: 'Argentina',
contact: '(915) 448-6271',
name: 'Heidi Walton',
service: 'Software Development',
total: 5578,
avatar: '/images/avatars/3.png',
invoiceStatus: 'Draft',
balance: 0,
dueDate: `23 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5024',
issuedDate: `28 ${currentMonth} ${now.getFullYear()}`,
address: '276 Michael Gardens Apt. 004',
company: 'Shea, Velez and Garcia LLC',
companyEmail: 'zjohnson@nichols-powers.com',
country: 'Philippines',
contact: '(817) 700-2984',
name: 'Christopher Allen',
service: 'Software Development',
total: 2787,
avatar: '/images/avatars/4.png',
invoiceStatus: 'Partial Payment',
balance: 0,
dueDate: `25 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5025',
issuedDate: `21 ${currentMonth} ${now.getFullYear()}`,
address: '633 Bell Well Apt. 057',
company: 'Adams, Simmons and Brown Group',
companyEmail: 'kayla09@thomas.com',
country: 'Martinique',
contact: '(266) 611-9482',
name: 'Joseph Oliver',
service: 'UI/UX Design & Development',
total: 5591,
avatar: '',
avatarColor: 'warning',
invoiceStatus: 'Downloaded',
balance: 0,
dueDate: `07 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5026',
issuedDate: `24 ${currentMonth} ${now.getFullYear()}`,
address: '1068 Lopez Fall',
company: 'Williams-Lawrence and Sons',
companyEmail: 'melvindavis@allen.info',
country: 'Mexico',
contact: '(739) 745-9728',
name: 'Megan Roberts',
service: 'Template Customization',
total: 2783,
avatar: '/images/avatars/5.png',
invoiceStatus: 'Draft',
balance: 0,
dueDate: `22 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5027',
issuedDate: `13 ${currentMonth} ${now.getFullYear()}`,
address: '86691 Mackenzie Light Suite 568',
company: 'Deleon Inc LLC',
companyEmail: 'gjordan@fernandez-coleman.com',
country: 'Costa Rica',
contact: '(682) 804-6506',
name: 'Mary Garcia',
service: 'Template Customization',
total: 2719,
avatar: '',
avatarColor: 'info',
invoiceStatus: 'Sent',
balance: 0,
dueDate: `04 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5028',
issuedDate: `18 ${currentMonth} ${now.getFullYear()}`,
address: '86580 Sarah Bridge',
company: 'Farmer, Johnson and Anderson Group',
companyEmail: 'robertscott@garcia.com',
country: 'Cameroon',
contact: '(775) 366-0411',
name: 'Crystal Mays',
service: 'Template Customization',
total: 3325,
avatar: '',
avatarColor: 'primary',
invoiceStatus: 'Paid',
balance: '$361',
dueDate: `02 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5029',
issuedDate: `29 ${currentMonth} ${now.getFullYear()}`,
address: '49709 Edwin Ports Apt. 353',
company: 'Sherman-Johnson PLC',
companyEmail: 'desiree61@kelly.com',
country: 'Macedonia',
contact: '(510) 536-6029',
name: 'Nicholas Tanner',
service: 'Template Customization',
total: 3851,
avatar: '',
avatarColor: 'secondary',
invoiceStatus: 'Paid',
balance: 0,
dueDate: `25 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5030',
issuedDate: `07 ${currentMonth} ${now.getFullYear()}`,
address: '3856 Mathis Squares Apt. 584',
company: 'Byrd LLC PLC',
companyEmail: 'jeffrey25@martinez-hodge.com',
country: 'Congo',
contact: '(253) 230-4657',
name: 'Mr. Justin Richardson',
service: 'Template Customization',
total: 5565,
avatar: '',
avatarColor: 'success',
invoiceStatus: 'Draft',
balance: 0,
dueDate: `06 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5031',
issuedDate: `21 ${currentMonth} ${now.getFullYear()}`,
address: '141 Adrian Ridge Suite 550',
company: 'Stone-Zimmerman Group',
companyEmail: 'john77@anderson.net',
country: 'Falkland Islands (Malvinas)',
contact: '(612) 546-3485',
name: 'Jennifer Summers',
service: 'Template Customization',
total: 3313,
avatar: '/images/avatars/6.png',
invoiceStatus: 'Partial Payment',
balance: 0,
dueDate: `09 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5032',
issuedDate: `31 ${currentMonth} ${now.getFullYear()}`,
address: '01871 Kristy Square',
company: 'Yang, Hansen and Hart PLC',
companyEmail: 'ywagner@jones.com',
country: 'Germany',
contact: '(203) 601-8603',
name: 'Richard Payne',
service: 'Template Customization',
total: 5181,
avatar: '',
avatarColor: 'error',
invoiceStatus: 'Past Due',
balance: 0,
dueDate: `22 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5033',
issuedDate: `12 ${currentMonth} ${now.getFullYear()}`,
address: '075 Smith Views',
company: 'Jenkins-Rosales Inc',
companyEmail: 'calvin07@joseph-edwards.org',
country: 'Colombia',
contact: '(895) 401-4255',
name: 'Lori Wells',
service: 'Template Customization',
total: 2869,
avatar: '/images/avatars/7.png',
invoiceStatus: 'Partial Payment',
balance: 0,
dueDate: `22 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5034',
issuedDate: `10 ${currentMonth} ${now.getFullYear()}`,
address: '2577 Pearson Overpass Apt. 314',
company: 'Mason-Reed PLC',
companyEmail: 'eric47@george-castillo.com',
country: 'Paraguay',
contact: '(602) 336-9806',
name: 'Tammy Sanchez',
service: 'Unlimited Extended License',
total: 4836,
avatar: '',
avatarColor: 'warning',
invoiceStatus: 'Paid',
balance: 0,
dueDate: `22 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5035',
issuedDate: `20 ${currentMonth} ${now.getFullYear()}`,
address: '1770 Sandra Mountains Suite 636',
company: 'Foster-Pham PLC',
companyEmail: 'jamesjoel@chapman.net',
country: 'Western Sahara',
contact: '(936) 550-1638',
name: 'Dana Carey',
service: 'UI/UX Design & Development',
total: 4263,
avatar: '',
avatarColor: 'info',
invoiceStatus: 'Draft',
balance: '$762',
dueDate: `12 ${currentMonth} ${now.getFullYear()}`
},
{
id: '5036',
issuedDate: `19 ${currentMonth} ${now.getFullYear()}`,
address: '78083 Laura Pines',
company: 'Richardson and Sons LLC',
companyEmail: 'pwillis@cross.org',
country: 'Bhutan',
contact: '(687) 660-2473',
name: 'Andrew Burns',
service: 'Unlimited Extended License',
total: 3171,
avatar: '/images/avatars/8.png',
invoiceStatus: 'Paid',
balance: '-$205',
dueDate: `25 ${currentMonth} ${now.getFullYear()}`
}
]

View File

@ -1,97 +0,0 @@
import type { KanbanType } from '@/types/apps/kanbanTypes'
export const db: KanbanType = {
columns: [
{
id: 1,
title: 'In Progress',
taskIds: [1, 2]
},
{
id: 2,
title: 'In Review',
taskIds: [3, 4]
},
{
id: 3,
title: 'Done',
taskIds: [5, 6]
}
],
tasks: [
{
id: 1,
title: 'Research FAQ page UX',
badgeText: ['UX'],
attachments: 4,
comments: 12,
assigned: [
{ src: '/images/avatars/1.png', name: 'John Doe' },
{ src: '/images/avatars/2.png', name: 'Jane Smith' },
{ src: '/images/avatars/3.png', name: 'Robert Johnson' }
],
dueDate: new Date(new Date().getFullYear(), 11, 30)
},
{
id: 2,
title: 'Review Javascript code',
badgeText: ['Code Review'],
attachments: 2,
comments: 8,
assigned: [
{ src: '/images/avatars/4.png', name: 'Emily Davis' },
{ src: '/images/avatars/5.png', name: ' Tom Smith' }
],
dueDate: new Date(new Date().getFullYear(), 5, 30)
},
{
id: 3,
title: 'Review completed Apps',
badgeText: ['Dashboard'],
attachments: 8,
comments: 17,
assigned: [
{ src: '/images/avatars/6.png', name: 'David Smith' },
{ src: '/images/avatars/2.png', name: 'Jane Smith' }
],
dueDate: new Date(new Date().getFullYear(), 8, 15)
},
{
id: 4,
title: 'Find new images for pages',
badgeText: ['Images'],
attachments: 10,
comments: 18,
assigned: [
{ src: '/images/avatars/6.png', name: 'David Smit' },
{ src: '/images/avatars/1.png', name: 'John Doe' },
{ src: '/images/avatars/5.png', name: 'Tom Smith' },
{ src: '/images/avatars/4.png', name: 'Emily Davis' }
],
image: '/images/apps/kanban/plant.png',
dueDate: new Date(new Date().getFullYear(), 9, 20)
},
{
id: 5,
title: 'Forms & tables section',
badgeText: ['App'],
attachments: 5,
comments: 14,
assigned: [
{ src: '/images/avatars/3.png', name: 'Robert Johnson' },
{ src: '/images/avatars/2.png', name: 'Jane Smith' },
{ src: '/images/avatars/1.png', name: 'John Doe' }
],
dueDate: new Date(new Date().getFullYear(), 10, 10)
},
{
id: 6,
title: 'Complete charts & maps',
badgeText: ['Charts & Map'],
attachments: 6,
comments: 21,
assigned: [{ src: '/images/avatars/1.png', name: 'John Doe' }],
dueDate: new Date(new Date().getFullYear(), 11, 5)
}
]
}

View File

@ -1,256 +0,0 @@
import type { logisticsType } from '@/types/apps/logisticsTypes'
export const db: logisticsType = {
vehicles: [
{
id: 1,
location: 468031,
startCity: 'Cagnes-sur-Mer',
startCountry: 'France',
endCity: 'Catania',
endCountry: 'Italy',
warnings: 'No Warnings',
progress: 49
},
{
id: 2,
location: 302781,
startCity: 'Köln',
startCountry: 'Germany',
endCity: 'Laspezia',
endCountry: 'Italy',
warnings: 'Ecu Not Responding',
progress: 24
},
{
id: 3,
location: 715822,
startCity: 'Chambray-lès-Tours',
startCountry: 'France',
endCity: 'Hamm',
endCountry: 'Germany',
warnings: 'Oil Leakage',
progress: 7
},
{
id: 4,
location: 451430,
startCity: 'Berlin',
startCountry: 'Germany',
endCity: 'Gelsenkirchen',
endCountry: 'Germany',
warnings: 'No Warnings',
progress: 95
},
{
id: 5,
location: 921577,
startCity: 'Cergy-Pontoise',
startCountry: 'France',
endCity: 'Berlin',
endCountry: 'Germany',
warnings: 'No Warnings',
progress: 65
},
{
id: 6,
location: 480957,
startCity: 'Villefranche-sur-Saône',
startCountry: 'France',
endCity: 'Halle',
endCountry: 'Germany',
warnings: 'Ecu Not Responding',
progress: 55
},
{
id: 7,
location: 330178,
startCity: 'Mâcon',
startCountry: 'France',
endCity: 'Bochum',
endCountry: 'Germany',
warnings: 'Fuel Problems',
progress: 74
},
{
id: 8,
location: 595525,
startCity: 'Fullerton',
startCountry: 'USA',
endCity: 'Lübeck',
endCountry: 'Germany',
warnings: 'No Warnings',
progress: 100
},
{
id: 9,
location: 182964,
startCity: 'Saintes',
startCountry: 'France',
endCity: 'Roma',
endCountry: 'Italy',
warnings: 'Oil Leakage',
progress: 82
},
{
id: 10,
location: 706085,
startCity: 'Fort Wayne',
startCountry: 'USA',
endCity: 'Mülheim an der Ruhr',
endCountry: 'Germany',
warnings: 'Oil Leakage',
progress: 49
},
{
id: 11,
location: 523708,
startCity: 'Albany',
startCountry: 'USA',
endCity: 'Wuppertal',
endCountry: 'Germany',
warnings: 'Temperature Not Optimal',
progress: 66
},
{
id: 12,
location: 676485,
startCity: 'Toledo',
startCountry: 'USA',
endCity: 'Magdeburg',
endCountry: 'Germany',
warnings: 'Temperature Not Optimal',
progress: 7
},
{
id: 13,
location: 514437,
startCity: 'Houston',
startCountry: 'USA',
endCity: 'Wiesbaden',
endCountry: 'Germany',
warnings: 'Fuel Problems',
progress: 27
},
{
id: 14,
location: 300198,
startCity: 'West Palm Beach',
startCountry: 'USA',
endCity: 'Dresden',
endCountry: 'Germany',
warnings: 'Temperature Not Optimal',
progress: 90
},
{
id: 15,
location: 960090,
startCity: 'Fort Lauderdale',
startCountry: 'USA',
endCity: 'Kiel',
endCountry: 'Germany',
warnings: 'No Warnings',
progress: 81
},
{
id: 16,
location: 878423,
startCity: 'Schaumburg',
startCountry: 'USA',
endCity: 'Berlin',
endCountry: 'Germany',
warnings: 'Fuel Problems',
progress: 21
},
{
id: 17,
location: 318119,
startCity: 'Mundolsheim',
startCountry: 'France',
endCity: 'München',
endCountry: 'Germany',
warnings: 'No Warnings',
progress: 26
},
{
id: 18,
location: 742500,
startCity: 'Fargo',
startCountry: 'USA',
endCity: 'Salerno',
endCountry: 'Italy',
warnings: 'Temperature Not Optimal',
progress: 80
},
{
id: 19,
location: 469399,
startCity: 'München',
startCountry: 'Germany',
endCity: 'Ath',
endCountry: 'Belgium',
warnings: 'Ecu Not Responding',
progress: 50
},
{
id: 20,
location: 411175,
startCity: 'Chicago',
startCountry: 'USA',
endCity: 'Neuss',
endCountry: 'Germany',
warnings: 'Oil Leakage',
progress: 44
},
{
id: 21,
location: 753525,
startCity: 'Limoges',
startCountry: 'France',
endCity: 'Messina',
endCountry: 'Italy',
warnings: 'Temperature Not Optimal',
progress: 55
},
{
id: 22,
location: 882341,
startCity: 'Cesson-Sévigné',
startCountry: 'France',
endCity: 'Napoli',
endCountry: 'Italy',
warnings: 'No Warnings',
progress: 48
},
{
id: 23,
location: 408270,
startCity: 'Leipzig',
startCountry: 'Germany',
endCity: 'Tournai',
endCountry: 'Belgium',
warnings: 'Ecu Not Responding',
progress: 73
},
{
id: 24,
location: 276904,
startCity: 'Aulnay-sous-Bois',
startCountry: 'France',
endCity: 'Torino',
endCountry: 'Italy',
warnings: 'Fuel Problems',
progress: 30
},
{
id: 25,
location: 159145,
startCity: 'Paris 19',
startCountry: 'France',
endCity: 'Dresden',
endCountry: 'Germany',
warnings: 'No Warnings',
progress: 60
}
]
}

View File

@ -1,59 +0,0 @@
// Type Imports
import type { PermissionRowType } from '@/types/apps/permissionTypes'
export const db: PermissionRowType[] = [
{
id: 1,
name: 'Management',
assignedTo: 'administrator',
createdDate: '14 Apr 2021, 8:43 PM'
},
{
id: 2,
assignedTo: 'administrator',
name: 'Manage Billing & Roles',
createdDate: '16 Sep 2021, 5:20 PM'
},
{
id: 3,
name: 'Add & Remove Users',
createdDate: '14 Oct 2021, 10:20 AM',
assignedTo: ['administrator', 'manager']
},
{
id: 4,
name: 'Project Planning',
createdDate: '14 Oct 2021, 10:20 AM',
assignedTo: ['administrator', 'users', 'support']
},
{
id: 5,
name: 'Manage Email Sequences',
createdDate: '23 Aug 2021, 2:00 PM',
assignedTo: ['administrator', 'users', 'support']
},
{
id: 6,
name: 'Client Communication',
createdDate: '15 Apr 2021, 11:30 AM',
assignedTo: ['administrator', 'manager']
},
{
id: 7,
name: 'Only View',
createdDate: '04 Dec 2021, 8:15 PM',
assignedTo: ['administrator', 'restricted-user']
},
{
id: 8,
name: 'Financial Management',
createdDate: '25 Feb 2021, 10:30 AM',
assignedTo: ['administrator', 'manager']
},
{
id: 9,
name: 'Manage Others Tasks',
createdDate: '04 Nov 2021, 11:45 AM',
assignedTo: ['administrator', 'support']
}
]

View File

@ -1,723 +0,0 @@
// Type Imports
import type { UsersType } from '@/types/apps/userTypes'
export const db: UsersType[] = [
{
id: 1,
fullName: 'Galen Slixby',
company: 'Yotz PVT LTD',
role: 'editor',
username: 'gslixby0',
country: 'El Salvador',
contact: '(479) 232-9151',
email: 'gslixby0@abc.net.au',
currentPlan: 'enterprise',
status: 'inactive',
avatar: '',
avatarColor: 'primary',
billing: 'Auto Debit'
},
{
id: 2,
fullName: 'Halsey Redmore',
company: 'Skinder PVT LTD',
role: 'author',
username: 'hredmore1',
country: 'Albania',
contact: '(472) 607-9137',
email: 'hredmore1@imgur.com',
currentPlan: 'team',
status: 'pending',
avatar: '/images/avatars/3.png',
billing: 'Auto Debit'
},
{
id: 3,
fullName: 'Marjory Sicely',
company: 'Oozz PVT LTD',
role: 'maintainer',
username: 'msicely2',
country: 'Russia',
contact: '(321) 264-4599',
email: 'msicely2@who.int',
currentPlan: 'enterprise',
status: 'active',
avatar: '/images/avatars/1.png',
billing: 'Auto Debit'
},
{
id: 4,
fullName: 'Cyrill Risby',
company: 'Oozz PVT LTD',
role: 'maintainer',
username: 'crisby3',
country: 'China',
contact: '(923) 690-6806',
email: 'crisby3@wordpress.com',
currentPlan: 'team',
status: 'inactive',
avatar: '/images/avatars/3.png',
billing: 'Manual Paypal'
},
{
id: 5,
fullName: 'Maggy Hurran',
company: 'Aimbo PVT LTD',
role: 'subscriber',
username: 'mhurran4',
country: 'Pakistan',
contact: '(669) 914-1078',
email: 'mhurran4@yahoo.co.jp',
currentPlan: 'enterprise',
status: 'pending',
avatar: '/images/avatars/1.png',
billing: 'Manual Cash'
},
{
id: 6,
fullName: 'Silvain Halstead',
company: 'Jaxbean PVT LTD',
role: 'author',
username: 'shalstead5',
country: 'China',
contact: '(958) 973-3093',
email: 'shalstead5@shinystat.com',
currentPlan: 'company',
status: 'active',
avatar: '',
avatarColor: 'error',
billing: 'Manual Cash'
},
{
id: 7,
fullName: 'Breena Gallemore',
company: 'Jazzy PVT LTD',
role: 'subscriber',
username: 'bgallemore6',
country: 'Canada',
contact: '(825) 977-8152',
email: 'bgallemore6@boston.com',
currentPlan: 'company',
status: 'pending',
avatar: '',
avatarColor: 'warning',
billing: 'Auto Debit'
},
{
id: 8,
fullName: 'Kathryne Liger',
company: 'Pixoboo PVT LTD',
role: 'author',
username: 'kliger7',
country: 'France',
contact: '(187) 440-0934',
email: 'kliger7@vinaora.com',
currentPlan: 'enterprise',
status: 'pending',
avatar: '/images/avatars/4.png',
billing: 'Manual Paypal'
},
{
id: 9,
fullName: 'Franz Scotfurth',
company: 'Tekfly PVT LTD',
role: 'subscriber',
username: 'fscotfurth8',
country: 'China',
contact: '(978) 146-5443',
email: 'fscotfurth8@dailymotion.com',
currentPlan: 'team',
status: 'pending',
avatar: '/images/avatars/2.png',
billing: 'Auto Debit'
},
{
id: 10,
fullName: 'Jillene Bellany',
company: 'Gigashots PVT LTD',
role: 'maintainer',
username: 'jbellany9',
country: 'Jamaica',
contact: '(589) 284-6732',
email: 'jbellany9@kickstarter.com',
currentPlan: 'company',
status: 'inactive',
avatar: '/images/avatars/5.png',
billing: 'Manual Cash'
},
{
id: 11,
fullName: 'Jonah Wharlton',
company: 'Eare PVT LTD',
role: 'subscriber',
username: 'jwharltona',
country: 'United States',
contact: '(176) 532-6824',
email: 'jwharltona@oakley.com',
currentPlan: 'team',
status: 'inactive',
avatar: '/images/avatars/4.png',
billing: 'Auto Debit'
},
{
id: 12,
fullName: 'Seth Hallam',
company: 'Yakitri PVT LTD',
role: 'subscriber',
username: 'shallamb',
country: 'Peru',
contact: '(234) 464-0600',
email: 'shallamb@hugedomains.com',
currentPlan: 'team',
status: 'pending',
avatar: '/images/avatars/5.png',
billing: 'Manual Paypal'
},
{
id: 13,
fullName: 'Yoko Pottie',
company: 'Leenti PVT LTD',
role: 'subscriber',
username: 'ypottiec',
country: 'Philippines',
contact: '(907) 284-5083',
email: 'ypottiec@privacy.gov.au',
currentPlan: 'basic',
status: 'inactive',
avatar: '/images/avatars/7.png',
billing: 'Manual Paypal'
},
{
id: 14,
fullName: 'Maximilianus Krause',
company: 'Digitube PVT LTD',
role: 'author',
username: 'mkraused',
country: 'Democratic Republic of the Congo',
contact: '(167) 135-7392',
email: 'mkraused@stanford.edu',
currentPlan: 'team',
status: 'active',
avatar: '/images/avatars/6.png',
billing: 'Auto Debit'
},
{
id: 15,
fullName: 'Zsazsa McCleverty',
company: 'Kaymbo PVT LTD',
role: 'maintainer',
username: 'zmcclevertye',
country: 'France',
contact: '(317) 409-6565',
email: 'zmcclevertye@soundcloud.com',
currentPlan: 'enterprise',
status: 'active',
avatar: '/images/avatars/2.png',
billing: 'Auto Debit'
},
{
id: 16,
fullName: 'Bentlee Emblin',
company: 'Yambee PVT LTD',
role: 'author',
username: 'bemblinf',
country: 'Spain',
contact: '(590) 606-1056',
email: 'bemblinf@wired.com',
currentPlan: 'company',
status: 'active',
avatar: '/images/avatars/6.png',
billing: 'Manual Cash'
},
{
id: 17,
fullName: 'Brockie Myles',
company: 'Wikivu PVT LTD',
role: 'maintainer',
username: 'bmylesg',
country: 'Poland',
contact: '(553) 225-9905',
email: 'bmylesg@amazon.com',
currentPlan: 'basic',
status: 'active',
avatar: '',
avatarColor: 'success',
billing: 'Auto Debit'
},
{
id: 18,
fullName: 'Bertha Biner',
company: 'Twinte PVT LTD',
role: 'editor',
username: 'bbinerh',
country: 'Yemen',
contact: '(901) 916-9287',
email: 'bbinerh@mozilla.com',
currentPlan: 'team',
status: 'active',
avatar: '/images/avatars/7.png',
billing: 'Manual Cash'
},
{
id: 19,
fullName: 'Travus Bruntjen',
company: 'Cogidoo PVT LTD',
role: 'admin',
username: 'tbruntjeni',
country: 'France',
contact: '(524) 586-6057',
email: 'tbruntjeni@sitemeter.com',
currentPlan: 'enterprise',
status: 'active',
avatar: '',
avatarColor: 'primary',
billing: 'Manual Cash'
},
{
id: 20,
fullName: 'Wesley Burland',
company: 'Bubblemix PVT LTD',
role: 'editor',
username: 'wburlandj',
country: 'Honduras',
contact: '(569) 683-1292',
email: 'wburlandj@uiuc.edu',
currentPlan: 'team',
status: 'inactive',
avatar: '/images/avatars/6.png',
billing: 'Manual paypal'
},
{
id: 21,
fullName: 'Selina Kyle',
company: 'Wayne Enterprises',
role: 'admin',
username: 'catwomen1940',
country: 'USA',
contact: '(829) 537-0057',
email: 'irena.dubrovna@wayne.com',
currentPlan: 'team',
status: 'active',
avatar: '/images/avatars/1.png',
billing: 'Manual paypal'
},
{
id: 22,
fullName: 'Jameson Lyster',
company: 'Quaxo PVT LTD',
role: 'editor',
username: 'jlysterl',
country: 'Ukraine',
contact: '(593) 624-0222',
email: 'jlysterl@guardian.co.uk',
currentPlan: 'company',
status: 'inactive',
avatar: '/images/avatars/8.png',
billing: 'Auto Debit'
},
{
id: 23,
fullName: 'Kare Skitterel',
company: 'Ainyx PVT LTD',
role: 'maintainer',
username: 'kskitterelm',
country: 'Poland',
contact: '(254) 845-4107',
email: 'kskitterelm@ainyx.com',
currentPlan: 'basic',
status: 'pending',
avatar: '/images/avatars/3.png',
billing: 'Manual Cash'
},
{
id: 24,
fullName: 'Cleavland Hatherleigh',
company: 'Flipopia PVT LTD',
role: 'admin',
username: 'chatherleighn',
country: 'Brazil',
contact: '(700) 783-7498',
email: 'chatherleighn@washington.edu',
currentPlan: 'team',
status: 'pending',
avatar: '/images/avatars/2.png',
billing: 'Auto Debit'
},
{
id: 25,
fullName: 'Adeline Micco',
company: 'Topicware PVT LTD',
role: 'admin',
username: 'amiccoo',
country: 'France',
contact: '(227) 598-1841',
email: 'amiccoo@whitehouse.gov',
currentPlan: 'enterprise',
status: 'pending',
avatar: '',
avatarColor: 'error',
billing: 'Manual Cash'
},
{
id: 26,
fullName: 'Hugh Hasson',
company: 'Skinix PVT LTD',
role: 'admin',
username: 'hhassonp',
country: 'China',
contact: '(582) 516-1324',
email: 'hhassonp@bizjournals.com',
currentPlan: 'basic',
status: 'inactive',
avatar: '/images/avatars/4.png',
billing: 'Manual Paypal'
},
{
id: 27,
fullName: 'Germain Jacombs',
company: 'Youopia PVT LTD',
role: 'editor',
username: 'gjacombsq',
country: 'Zambia',
contact: '(137) 467-5393',
email: 'gjacombsq@jigsy.com',
currentPlan: 'enterprise',
status: 'active',
avatar: '/images/avatars/5.png',
billing: 'Auto Debit'
},
{
id: 28,
fullName: 'Bree Kilday',
company: 'Jetpulse PVT LTD',
role: 'maintainer',
username: 'bkildayr',
country: 'Portugal',
contact: '(412) 476-0854',
email: 'bkildayr@mashable.com',
currentPlan: 'team',
status: 'active',
avatar: '',
avatarColor: 'warning',
billing: 'Manual Cash'
},
{
id: 29,
fullName: 'Candice Pinyon',
company: 'Kare PVT LTD',
role: 'maintainer',
username: 'cpinyons',
country: 'Sweden',
contact: '(170) 683-1520',
email: 'cpinyons@behance.net',
currentPlan: 'team',
status: 'active',
avatar: '/images/avatars/7.png',
billing: 'Auto Debit'
},
{
id: 30,
fullName: 'Isabel Mallindine',
company: 'Voomm PVT LTD',
role: 'subscriber',
username: 'imallindinet',
country: 'Slovenia',
contact: '(332) 803-1983',
email: 'imallindinet@shinystat.com',
currentPlan: 'team',
status: 'pending',
avatar: '',
avatarColor: 'info',
billing: 'Manual Cash'
},
{
id: 31,
fullName: 'Gwendolyn Meineken',
company: 'Oyondu PVT LTD',
role: 'admin',
username: 'gmeinekenu',
country: 'Moldova',
contact: '(551) 379-7460',
email: 'gmeinekenu@hc360.com',
currentPlan: 'basic',
status: 'pending',
avatar: '/images/avatars/1.png',
billing: 'Auto Debit'
},
{
id: 32,
fullName: 'Rafaellle Snowball',
company: 'Fivespan PVT LTD',
role: 'editor',
username: 'rsnowballv',
country: 'Philippines',
contact: '(974) 829-0911',
email: 'rsnowballv@indiegogo.com',
currentPlan: 'basic',
status: 'pending',
avatar: '/images/avatars/5.png',
billing: 'Manual Cash'
},
{
id: 33,
fullName: 'Rochette Emer',
company: 'Thoughtworks PVT LTD',
role: 'admin',
username: 'remerw',
country: 'North Korea',
contact: '(841) 889-3339',
email: 'remerw@blogtalkradio.com',
currentPlan: 'basic',
status: 'active',
avatar: '/images/avatars/8.png',
billing: 'Manual Cash'
},
{
id: 34,
fullName: 'Ophelie Fibbens',
company: 'Jaxbean PVT LTD',
role: 'subscriber',
username: 'ofibbensx',
country: 'Indonesia',
contact: '(764) 885-7351',
email: 'ofibbensx@booking.com',
currentPlan: 'company',
status: 'active',
avatar: '/images/avatars/4.png',
billing: 'Manual Cash'
},
{
id: 35,
fullName: 'Stephen MacGilfoyle',
company: 'Browseblab PVT LTD',
role: 'maintainer',
username: 'smacgilfoyley',
country: 'Japan',
contact: '(350) 589-8520',
email: 'smacgilfoyley@bigcartel.com',
currentPlan: 'company',
status: 'pending',
avatar: '',
avatarColor: 'error',
billing: 'Auto Debit'
},
{
id: 36,
fullName: 'Bradan Rosebotham',
company: 'Agivu PVT LTD',
role: 'subscriber',
username: 'brosebothamz',
country: 'Belarus',
contact: '(882) 933-2180',
email: 'brosebothamz@tripadvisor.com',
currentPlan: 'team',
status: 'inactive',
avatar: '',
avatarColor: 'success',
billing: 'Auto Debit'
},
{
id: 37,
fullName: 'Skip Hebblethwaite',
company: 'Katz PVT LTD',
role: 'admin',
username: 'shebblethwaite10',
country: 'Canada',
contact: '(610) 343-1024',
email: 'shebblethwaite10@arizona.edu',
currentPlan: 'company',
status: 'inactive',
avatar: '/images/avatars/1.png',
billing: 'Manual Paypal'
},
{
id: 38,
fullName: 'Moritz Piccard',
company: 'Twitternation PVT LTD',
role: 'maintainer',
username: 'mpiccard11',
country: 'Croatia',
contact: '(365) 277-2986',
email: 'mpiccard11@vimeo.com',
currentPlan: 'enterprise',
status: 'inactive',
avatar: '/images/avatars/1.png',
billing: 'Manual Paypal'
},
{
id: 39,
fullName: 'Tyne Widmore',
company: 'Yombu PVT LTD',
role: 'subscriber',
username: 'twidmore12',
country: 'Finland',
contact: '(531) 731-0928',
email: 'twidmore12@bravesites.com',
currentPlan: 'team',
status: 'pending',
avatar: '',
avatarColor: 'primary',
billing: 'Manual Paypal'
},
{
id: 40,
fullName: 'Florenza Desporte',
company: 'Kamba PVT LTD',
role: 'author',
username: 'fdesporte13',
country: 'Ukraine',
contact: '(312) 104-2638',
email: 'fdesporte13@omniture.com',
currentPlan: 'company',
status: 'active',
avatar: '/images/avatars/6.png',
billing: 'Auto Debit'
},
{
id: 41,
fullName: 'Edwina Baldetti',
company: 'Dazzlesphere PVT LTD',
role: 'maintainer',
username: 'ebaldetti14',
country: 'Haiti',
contact: '(315) 329-3578',
email: 'ebaldetti14@theguardian.com',
currentPlan: 'team',
status: 'pending',
avatar: '',
avatarColor: 'info',
billing: 'Auto Debit'
},
{
id: 42,
fullName: 'Benedetto Rossiter',
company: 'Mybuzz PVT LTD',
role: 'editor',
username: 'brossiter15',
country: 'Indonesia',
contact: '(323) 175-6741',
email: 'brossiter15@craigslist.org',
currentPlan: 'team',
status: 'inactive',
avatar: '',
avatarColor: 'warning',
billing: 'Auto Debit'
},
{
id: 43,
fullName: 'Micaela McNirlan',
company: 'Tambee PVT LTD',
role: 'admin',
username: 'mmcnirlan16',
country: 'Indonesia',
contact: '(242) 952-0916',
email: 'mmcnirlan16@hc360.com',
currentPlan: 'basic',
status: 'inactive',
avatar: '',
avatarColor: 'error',
billing: 'Manual Cash'
},
{
id: 44,
fullName: 'Vladamir Koschek',
company: 'Centimia PVT LTD',
role: 'author',
username: 'vkoschek17',
country: 'Guatemala',
contact: '(531) 758-8335',
email: 'vkoschek17@abc.net.au',
currentPlan: 'team',
status: 'active',
avatar: '',
avatarColor: 'success',
billing: 'Manual Cash'
},
{
id: 45,
fullName: 'Corrie Perot',
company: 'Flipopia PVT LTD',
role: 'subscriber',
username: 'cperot18',
country: 'China',
contact: '(659) 385-6808',
email: 'cperot18@goo.ne.jp',
currentPlan: 'team',
status: 'pending',
avatar: '/images/avatars/3.png',
billing: 'Manual Cash'
},
{
id: 46,
fullName: 'Saunder Offner',
company: 'Skalith PVT LTD',
role: 'maintainer',
username: 'soffner19',
country: 'Poland',
contact: '(200) 586-2264',
email: 'soffner19@mac.com',
currentPlan: 'enterprise',
status: 'pending',
avatar: '',
avatarColor: 'primary',
billing: 'Manual Paypal'
},
{
id: 47,
fullName: 'Karena Courtliff',
company: 'Feedfire PVT LTD',
role: 'admin',
username: 'kcourtliff1a',
country: 'China',
contact: '(478) 199-0020',
email: 'kcourtliff1a@bbc.co.uk',
currentPlan: 'basic',
status: 'active',
avatar: '/images/avatars/1.png',
billing: 'Auto Debit'
},
{
id: 48,
fullName: 'Onfre Wind',
company: 'Thoughtmix PVT LTD',
role: 'admin',
username: 'owind1b',
country: 'Ukraine',
contact: '(344) 262-7270',
email: 'owind1b@yandex.ru',
currentPlan: 'basic',
status: 'pending',
avatar: '',
avatarColor: 'error',
billing: 'Auto Debit'
},
{
id: 49,
fullName: 'Paulie Durber',
company: 'Babbleblab PVT LTD',
role: 'subscriber',
username: 'pdurber1c',
country: 'Sweden',
contact: '(694) 676-1275',
email: 'pdurber1c@gov.uk',
currentPlan: 'team',
status: 'inactive',
avatar: '',
avatarColor: 'warning',
billing: 'Manual Cash'
},
{
id: 50,
fullName: 'Beverlie Krabbe',
company: 'Kaymbo PVT LTD',
role: 'editor',
username: 'bkrabbe1d',
country: 'China',
contact: '(397) 294-5153',
email: 'bkrabbe1d@home.pl',
currentPlan: 'company',
status: 'active',
avatar: '/images/avatars/2.png',
billing: 'Auto Debit'
}
]

View File

@ -1,153 +0,0 @@
// Type Imports
import type { FaqType } from '@/types/pages/faqTypes'
export const db: FaqType[] = [
{
id: 'payment',
title: 'Payment',
icon: 'tabler-credit-card',
subtitle: 'Get help with payment',
questionsAnswers: [
{
id: 'order-payment',
question: 'When is payment taken for my order?',
answer:
'Payment is taken during the checkout process when you pay for your order. The order number that appears on the confirmation screen indicates payment has been successfully processed.'
},
{
id: 'order',
question: 'How do I pay for my order?',
answer:
'We accept Visa®, MasterCard®, American Express®, and PayPal®. Our servers encrypt all information submitted to them, so you can be confident that your credit card information will be kept safe and secure.'
},
{
id: 'placing-order',
question: "What should I do if I'm having trouble placing an order?",
answer:
'For any technical difficulties you are experiencing with our website, please contact us at our support portal, or you can call us toll-free at 1-000-000-000, or email us at order@companymail.com'
},
{
id: 'users-license',
question: 'Which license do I need for an end product that is only accessible to paying users?',
answer:
'If you have paying users or you are developing any SaaS products then you need an Extended License. For each products, you need a license. You can get free lifetime updates as well.'
},
{
id: 'subscription-review',
question: 'Does my subscription automatically renew?',
answer:
'No, This is not subscription based item.Pastry pudding cookie toffee bonbon jujubes jujubes powder topping. Jelly beans gummi bears sweet roll bonbon muffin liquorice. Wafer lollipop sesame snaps.'
}
]
},
// delivery
{
id: 'delivery',
title: 'Delivery',
icon: 'tabler-briefcase',
subtitle: 'Get help with delivery',
questionsAnswers: [
{
id: 'ship-order',
question: 'How would you ship my order?',
answer:
'For large products, we deliver your product via a third party logistics company offering you the “room of choice” scheduled delivery service. For small products, we offer free parcel delivery.'
},
{
id: 'delivery-cost',
question: 'What is the delivery cost of my order?',
answer:
'The cost of scheduled delivery is $69 or $99 per order, depending on the destination postal code. The parcel delivery is free.'
},
{
id: 'product-damaged',
question: 'What to do if my product arrives damaged?',
answer:
'We will promptly replace any product that is damaged in transit. Just contact our support team, to notify us of the situation within 48 hours of product arrival.'
}
]
},
// cancellation and return
{
icon: 'tabler-refresh',
id: 'cancellation-return',
title: 'Cancellation & Return',
subtitle: 'Get help with cancellation & return',
questionsAnswers: [
{
id: 'cancel-order',
question: 'Can I cancel my order?',
answer:
'Scheduled delivery orders can be cancelled 72 hours prior to your selected delivery date for full refund. Parcel delivery orders cannot be cancelled, however a free return label can be provided upon request.'
},
{
id: 'product-return',
question: 'Can I return my product?',
answer:
'You can return your product within 15 days of delivery, by contacting our support team, All merchandise returned must be in the original packaging with all original items.'
},
{
id: 'return-status',
question: 'Where can I view status of return?',
answer: 'Locate the item from Your Orders. Select Return/Refund status'
}
]
},
// my orders
{
id: 'my-orders',
title: 'My Orders',
icon: 'tabler-box',
subtitle: 'Order details',
questionsAnswers: [
{
id: 'order-success',
question: 'Has my order been successful?',
answer:
'All successful order transactions will receive an order confirmation email once the order has been processed. If you have not received your order confirmation email within 24 hours, check your junk email or spam folder. Alternatively, log in to your account to check your order summary. If you do not have a account, you can contact our Customer Care Team on 1-000-000-000.'
},
{
id: 'promo-code',
question: 'My Promotion Code is not working, what can I do?',
answer: 'If you are having issues with a promotion code, please contact us at 1 000 000 000 for assistance.'
},
{
id: 'track-orders',
question: 'How do I track my Orders?',
answer:
'If you have an account just sign into your account from here and select “My Orders”. If you have a a guest account track your order from here using the order number and the email address.'
}
]
},
// product and services
{
icon: 'tabler-settings',
id: 'product-services',
title: 'Product & Services',
subtitle: 'Get help with product & services',
questionsAnswers: [
{
id: 'shipping-notification',
question: 'Will I be notified once my order has shipped?',
answer:
'Yes, We will send you an email once your order has been shipped. This email will contain tracking and order information.'
},
{
id: 'warranty-notification',
question: 'Where can I find warranty information?',
answer:
'We are committed to quality products. For information on warranty period and warranty services, visit our Warranty section here.'
},
{
id: 'warranty-coverage',
question: 'How can I purchase additional warranty coverage?',
answer:
'For the peace of your mind, we offer extended warranty plans that add additional year(s) of protection to the standard manufacturers warranty provided by us. To purchase or find out more about the extended warranty program, visit Extended Warranty section here.'
}
]
}
]

View File

@ -1,65 +0,0 @@
// Type Imports
import type { PricingPlanType } from '@/types/pages/pricingTypes'
export const db: PricingPlanType[] = [
{
title: 'Basic',
monthlyPrice: 0,
currentPlan: true,
popularPlan: false,
subtitle: 'A simple start for everyone',
imgSrc: '/images/illustrations/objects/pricing-basic.png',
imgHeight: 120,
yearlyPlan: {
monthly: 0,
annually: 0
},
planBenefits: [
'100 responses a month',
'Unlimited forms and surveys',
'Unlimited fields',
'Basic form creation tools',
'Up to 2 subdomains'
]
},
{
monthlyPrice: 49,
title: 'Standard',
popularPlan: true,
currentPlan: false,
subtitle: 'For small to medium businesses',
imgSrc: '/images/illustrations/objects/pricing-standard.png',
imgHeight: 120,
yearlyPlan: {
monthly: 40,
annually: 480
},
planBenefits: [
'Unlimited responses',
'Unlimited forms and surveys',
'Instagram profile page',
'Google Docs integration',
'Custom “Thank you” page'
]
},
{
monthlyPrice: 99,
popularPlan: false,
currentPlan: false,
title: 'Enterprise',
subtitle: 'Solution for big organizations',
imgSrc: '/images/illustrations/objects/pricing-enterprise.png',
imgHeight: 120,
yearlyPlan: {
monthly: 80,
annually: 960
},
planBenefits: [
'PayPal payments',
'Logic Jumps',
'File upload with 5GB storage',
'Custom domain support',
'Stripe integration'
]
}
]

View File

@ -1,688 +0,0 @@
// Type Imports
import type { ProfileHeaderType, DataType } from '@/types/pages/profileTypes'
type DB = {
users: DataType
profileHeader: ProfileHeaderType
}
export const db: DB = {
users: {
profile: {
about: [
{ property: 'Full Name', value: 'John Doe', icon: 'tabler-user' },
{ property: 'Status', value: 'active', icon: 'tabler-check' },
{ property: 'Role', value: 'Developer', icon: 'tabler-crown' },
{ property: 'Country', value: 'USA', icon: 'tabler-flag' },
{ property: 'Language', value: 'English', icon: 'tabler-language' }
],
contacts: [
{ property: 'Contact', value: '(123) 456-7890', icon: 'tabler-phone-call' },
{ property: 'Skype', value: 'john.doe', icon: 'tabler-messages' },
{ property: 'Email', value: 'john.doe@example.com', icon: 'tabler-mail' }
],
teams: [
{ property: 'Backend Developer', value: '(126 Members)' },
{ property: 'React Developer', value: '(98 Members)' }
],
overview: [
{ property: 'Task Compiled', value: '13.5k', icon: 'tabler-check' },
{ property: 'Connections', value: '897', icon: 'tabler-users' },
{ property: 'Projects Compiled', value: '146', icon: 'tabler-layout-grid' }
],
connections: [
{
isFriend: true,
connections: '45',
name: 'Cecilia Payne',
avatar: '/images/avatars/2.png'
},
{
isFriend: false,
connections: '1.32k',
name: 'Curtis Fletcher',
avatar: '/images/avatars/3.png'
},
{
isFriend: false,
connections: '125',
name: 'Alice Stone',
avatar: '/images/avatars/4.png'
},
{
isFriend: true,
connections: '456',
name: 'Darrell Barnes',
avatar: '/images/avatars/5.png'
},
{
isFriend: true,
connections: '1.2k',
name: 'Eugenia Moore',
avatar: '/images/avatars/8.png'
}
],
teamsTech: [
{
members: 72,
ChipColor: 'error',
chipText: 'Developer',
title: 'React Developers',
avatar: '/images/logos/react-bg.png'
},
{
members: 122,
chipText: 'Support',
ChipColor: 'primary',
title: 'Support Team',
avatar: '/images/icons/support-bg.png'
},
{
members: 7,
ChipColor: 'info',
chipText: 'Designer',
title: 'UI Designer',
avatar: '/images/logos/figma-bg.png'
},
{
members: 289,
ChipColor: 'error',
chipText: 'Developer',
title: 'Vue.js Developers',
avatar: '/images/logos/vue-bg.png'
},
{
members: 24,
chipText: 'Marketing',
ChipColor: 'secondary',
title: 'Digital Marketing',
avatar: '/images/logos/twitter-bg.png'
}
],
projectTable: [
{
id: 1,
title: 'BGC eCommerce App',
subtitle: 'React Project',
leader: 'Eileen',
avatar: '/images/logos/react-bg.png',
avatarGroup: [
'/images/avatars/1.png',
'/images/avatars/2.png',
'/images/avatars/3.png',
'/images/avatars/4.png'
],
status: 78
},
{
id: 2,
leader: 'Owen',
title: 'Falcon Logo Design',
subtitle: 'Figma Project',
avatar: '/images/logos/figma-bg.png',
avatarGroup: ['/images/avatars/5.png', '/images/avatars/6.png'],
status: 18
},
{
id: 3,
title: 'Dashboard Design',
subtitle: 'VueJs Project',
leader: 'Keith',
avatar: '/images/logos/vue-bg.png',
avatarGroup: [
'/images/avatars/7.png',
'/images/avatars/8.png',
'/images/avatars/1.png',
'/images/avatars/2.png'
],
status: 62
},
{
id: 4,
title: 'Foodista Mobile App',
subtitle: 'Xamarin Project',
leader: 'Merline',
avatar: '/images/icons/mobile-bg.png',
avatarGroup: [
'/images/avatars/3.png',
'/images/avatars/4.png',
'/images/avatars/5.png',
'/images/avatars/6.png'
],
status: 8
},
{
id: 5,
leader: 'Harmonia',
title: 'Dojo React Project',
subtitle: 'Python Project',
avatar: '/images/logos/python-bg.png',
avatarGroup: ['/images/avatars/7.png', '/images/avatars/8.png', '/images/avatars/1.png'],
status: 36
},
{
id: 6,
leader: 'Allyson',
title: 'Blockchain Website',
subtitle: 'Sketch Project',
avatar: '/images/logos/sketch-bg.png',
avatarGroup: [
'/images/avatars/2.png',
'/images/avatars/3.png',
'/images/avatars/4.png',
'/images/avatars/5.png'
],
status: 92
},
{
id: 7,
title: 'Hoffman Website',
subtitle: 'HTML Project',
leader: 'Georgie',
avatar: '/images/logos/html-bg.png',
avatarGroup: [
'/images/avatars/6.png',
'/images/avatars/7.png',
'/images/avatars/8.png',
'/images/avatars/1.png'
],
status: 88
},
{
id: 8,
title: 'eCommerce Website',
subtitle: 'React Project',
leader: 'Eileen',
avatar: '/images/logos/react-bg.png',
avatarGroup: [
'/images/avatars/1.png',
'/images/avatars/2.png',
'/images/avatars/3.png',
'/images/avatars/4.png'
],
status: 78
},
{
id: 9,
leader: 'Owen',
title: 'Retro Logo Design',
subtitle: 'Figma Project',
avatar: '/images/logos/figma-bg.png',
avatarGroup: ['/images/avatars/5.png', '/images/avatars/6.png'],
status: 18
},
{
id: 10,
title: 'Admin Dashboard',
subtitle: 'VueJs Project',
leader: 'Keith',
avatar: '/images/logos/vue-bg.png',
avatarGroup: [
'/images/avatars/7.png',
'/images/avatars/8.png',
'/images/avatars/1.png',
'/images/avatars/2.png'
],
status: 62
}
]
},
teams: [
{
extraMembers: 9,
title: 'React Developers',
avatar: '/images/logos/react-bg.png',
avatarGroup: [
{ avatar: '/images/avatars/1.png', name: 'Vinnie Mostowy' },
{ avatar: '/images/avatars/2.png', name: 'Allen Rieske' },
{ avatar: '/images/avatars/3.png', name: 'Julee Rossignol' }
],
description:
'We dont make assumptions about the rest of your technology stack, so you can develop new features.',
chips: [
{
title: 'React',
color: 'primary'
},
{
title: 'MUI',
color: 'info'
}
]
},
{
extraMembers: 4,
title: 'Vue.js Dev Team',
avatar: '/images/logos/vue-bg.png',
avatarGroup: [
{ avatar: '/images/avatars/5.png', name: "Kaith D'souza" },
{ avatar: '/images/avatars/6.png', name: 'John Doe' },
{ avatar: '/images/avatars/7.png', name: 'Alan Walker' }
],
description:
'The development of Vue and its ecosystem is guided by an international team, some of whom have chosen.',
chips: [
{
title: 'Vuejs',
color: 'success'
},
{
color: 'error',
title: 'Developer'
}
]
},
{
title: 'Creative Designers',
avatar: '/images/logos/xd-bg.png',
avatarGroup: [
{ avatar: '/images/avatars/1.png', name: 'Jimmy Ressula' },
{ avatar: '/images/avatars/2.png', name: 'Kristi Lawker' },
{ avatar: '/images/avatars/3.png', name: 'Danny Paul' }
],
description:
'A design or product team is more than just the people on it. A team includes the people, the roles they play.',
chips: [
{
title: 'Sketch',
color: 'warning'
},
{
title: 'XD',
color: 'error'
}
]
},
{
title: 'Support Team',
avatar: '/images/icons/support-bg.png',
avatarGroup: [
{ avatar: '/images/avatars/5.png', name: 'Andrew Tye' },
{ avatar: '/images/avatars/6.png', name: 'Rishi Swaat' },
{ avatar: '/images/avatars/7.png', name: 'Rossie Kim' }
],
description:
'Support your team. Your customer support team is fielding the good, the bad, and the ugly on daily basis.',
chips: [
{
title: 'Zendesk',
color: 'info'
}
]
},
{
extraMembers: 7,
title: 'Digital Marketing',
avatar: '/images/icons/social-bg.png',
avatarGroup: [
{ avatar: '/images/avatars/1.png', name: 'Kim Merchent' },
{ avatar: '/images/avatars/2.png', name: "Sam D'souza" },
{ avatar: '/images/avatars/3.png', name: 'Nurvi Karlos' }
],
description:
'Digital marketing refers to advertising delivered through digital channels such as search engines, websites…',
chips: [
{
title: 'Twitter',
color: 'primary'
},
{
color: 'success',
title: 'Email'
}
]
},
{
extraMembers: 2,
title: 'Event',
avatar: '/images/logos/event-bg.png',
avatarGroup: [
{ avatar: '/images/avatars/5.png', name: 'Vinnie Mostowy' },
{ avatar: '/images/avatars/6.png', name: 'Allen Rieske' },
{ avatar: '/images/avatars/7.png', name: 'Julee Rossignol' }
],
description:
'Event is defined as a particular contest which is part of a program of contests. An example of an event is the long…',
chips: [
{
title: 'Hubilo',
color: 'success'
}
]
},
{
title: 'Figma Resources',
avatar: '/images/logos/figma-bg.png',
avatarGroup: [
{ avatar: '/images/avatars/1.png', name: 'Andrew Mostowy' },
{ avatar: '/images/avatars/2.png', name: 'Micky Ressula' },
{ avatar: '/images/avatars/3.png', name: 'Michel Pal' }
],
description:
'Explore, install, use, and remix thousands of plugins and files published to the Figma Community by designers.',
chips: [
{
title: 'UI/UX',
color: 'success'
},
{
title: 'Figma',
color: 'warning'
}
]
},
{
extraMembers: 8,
title: 'Only Beginners',
avatar: '/images/logos/html-bg.png',
avatarGroup: [
{ avatar: '/images/avatars/5.png', name: 'Kim Karlos' },
{ avatar: '/images/avatars/6.png', name: 'Katy Turner' },
{ avatar: '/images/avatars/7.png', name: 'Peter Adward' }
],
description:
'Learn the basics of how websites work, front-end vs back-end. Learn basic HTML, CSS, and JavaScript.',
chips: [
{
title: 'CSS',
color: 'info'
},
{
title: 'HTML',
color: 'primary'
}
]
},
{
title: 'Python Developers',
avatar: '/images/logos/python-bg.png',
avatarGroup: [
{ avatar: '/images/avatars/5.png', name: 'Kim Karlos' },
{ avatar: '/images/avatars/6.png', name: 'Katy Turner' },
{ avatar: '/images/avatars/7.png', name: 'Peter Adward' }
],
description:
"Harness Python's versatility for web development, data analysis & system automation for cutting-edge solutions.",
chips: [
{
title: 'Python',
color: 'info'
}
]
}
],
projects: [
{
daysLeft: 28,
comments: 15,
totalTask: 344,
hours: '380/244',
tasks: '290/344',
budget: '$18.2k',
completedTask: 328,
deadline: '28/2/22',
chipColor: 'success',
startDate: '14/2/21',
budgetSpent: '$24.8k',
members: '280 members',
title: 'Social Banners',
client: 'Christian Jimenez',
avatar: '/images/icons/social-bg.png',
description: 'We are Consulting, Software Development and Web Development Services.',
avatarGroup: [
{ avatar: '/images/avatars/1.png', name: 'Vinnie Mostowy' },
{ avatar: '/images/avatars/2.png', name: 'Allen Rieske' },
{ avatar: '/images/avatars/3.png', name: 'Julee Rossignol' }
]
},
{
daysLeft: 15,
comments: 236,
totalTask: 90,
tasks: '12/90',
hours: '98/135',
budget: '$1.8k',
completedTask: 38,
deadline: '21/6/22',
budgetSpent: '$2.4k',
chipColor: 'warning',
startDate: '18/8/21',
members: '1.1k members',
title: 'Admin Template',
client: 'Jeffrey Phillips',
avatar: '/images/logos/react-bg.png',
avatarGroup: [
{ avatar: '/images/avatars/4.png', name: "Kaith D'souza" },
{ avatar: '/images/avatars/5.png', name: 'John Doe' },
{ avatar: '/images/avatars/6.png', name: 'Alan Walker' }
],
description: "Time is our most valuable asset, that's why we want to help you save it."
},
{
daysLeft: 45,
comments: 98,
budget: '$420',
totalTask: 140,
tasks: '22/140',
hours: '880/421',
completedTask: 95,
chipColor: 'error',
budgetSpent: '$980',
deadline: '8/10/21',
title: 'App Design',
startDate: '24/7/21',
members: '458 members',
client: 'Ricky McDonald',
avatar: '/images/logos/vue-bg.png',
description: 'Figma dashboard app design combines the user UI & UX.',
avatarGroup: [
{ avatar: '/images/avatars/7.png', name: 'Jimmy Ressula' },
{ avatar: '/images/avatars/8.png', name: 'Kristi Lawker' },
{ avatar: '/images/avatars/1.png', name: 'Danny Paul' }
]
},
{
comments: 120,
daysLeft: 126,
totalTask: 420,
budget: '2.43k',
tasks: '237/420',
hours: '380/820',
completedTask: 302,
deadline: '12/9/22',
budgetSpent: '$8.5k',
chipColor: 'warning',
startDate: '10/2/19',
members: '137 members',
client: 'Hulda Wright',
title: 'Create Website',
avatar: '/images/logos/html-bg.png',
description: 'Your domain name should reflect your products or services so that your...',
avatarGroup: [
{ avatar: '/images/avatars/2.png', name: 'Andrew Tye' },
{ avatar: '/images/avatars/3.png', name: 'Rishi Swaat' },
{ avatar: '/images/avatars/4.png', name: 'Rossie Kim' }
]
},
{
daysLeft: 5,
comments: 20,
totalTask: 285,
tasks: '29/285',
budget: '28.4k',
hours: '142/420',
chipColor: 'error',
completedTask: 100,
deadline: '25/12/21',
startDate: '12/12/20',
members: '82 members',
budgetSpent: '$52.7k',
client: 'Jerry Greene',
title: 'Figma Dashboard',
avatar: '/images/logos/figma-bg.png',
description: "Time is our most valuable asset, that's why we want to help you save it.",
avatarGroup: [
{ avatar: '/images/avatars/5.png', name: 'Kim Merchent' },
{ avatar: '/images/avatars/6.png', name: "Sam D'souza" },
{ avatar: '/images/avatars/7.png', name: 'Nurvi Karlos' }
]
},
{
daysLeft: 4,
comments: 98,
budget: '$655',
totalTask: 290,
tasks: '29/290',
hours: '580/445',
completedTask: 290,
budgetSpent: '$1.3k',
chipColor: 'success',
deadline: '02/11/21',
startDate: '17/8/21',
title: 'Logo Design',
members: '16 members',
client: 'Olive Strickland',
avatar: '/images/logos/xd-bg.png',
description: 'Premium logo designs created by top logo designers. Create the branding.',
avatarGroup: [
{ avatar: '/images/avatars/8.png', name: 'Kim Karlos' },
{ avatar: '/images/avatars/1.png', name: 'Katy Turner' },
{ avatar: '/images/avatars/2.png', name: 'Peter Adward' }
]
}
],
connections: [
{
tasks: '834',
projects: '18',
isConnected: true,
connections: '129',
name: 'Mark Gilbert',
designation: 'UI Designer',
avatar: '/images/avatars/1.png',
chips: [
{
title: 'Figma',
color: 'secondary'
},
{
title: 'Sketch',
color: 'warning'
}
]
},
{
tasks: '2.31k',
projects: '112',
isConnected: false,
connections: '1.28k',
name: 'Eugenia Parsons',
designation: 'Developer',
avatar: '/images/avatars/2.png',
chips: [
{
color: 'error',
title: 'Angular'
},
{
color: 'info',
title: 'React'
}
]
},
{
tasks: '1.25k',
projects: '32',
isConnected: false,
connections: '890',
name: 'Francis Byrd',
designation: 'Developer',
avatar: '/images/avatars/3.png',
chips: [
{
title: 'HTML',
color: 'primary'
},
{
color: 'info',
title: 'React'
}
]
},
{
tasks: '12.4k',
projects: '86',
isConnected: false,
connections: '890',
name: 'Leon Lucas',
designation: 'UI/UX Designer',
avatar: '/images/avatars/4.png',
chips: [
{
title: 'Figma',
color: 'secondary'
},
{
title: 'Sketch',
color: 'warning'
},
{
color: 'primary',
title: 'Photoshop'
}
]
},
{
tasks: '23.8k',
projects: '244',
isConnected: true,
connections: '2.14k',
name: 'Jayden Rogers',
designation: 'Full Stack Developer',
avatar: '/images/avatars/5.png',
chips: [
{
color: 'info',
title: 'React'
},
{
title: 'HTML',
color: 'warning'
},
{
color: 'success',
title: 'Node.js'
}
]
},
{
tasks: '1.28k',
projects: '32',
isConnected: false,
designation: 'SEO',
connections: '1.27k',
name: 'Jeanette Powell',
avatar: '/images/avatars/6.png',
chips: [
{
title: 'Analysis',
color: 'secondary'
},
{
color: 'success',
title: 'Writing'
}
]
}
]
},
profileHeader: {
fullName: 'John Doe',
location: 'Vatican City',
joiningDate: 'April 2021',
designation: 'UX Designer',
profileImg: '/images/avatars/1.png',
designationIcon: 'tabler-palette',
coverImg: '/images/pages/profile-banner.png'
}
}

View File

@ -1,215 +0,0 @@
import type { CardStatsType } from '@/types/pages/widgetTypes'
export const db: CardStatsType = {
statsHorizontalWithAvatar: [
{
stats: '$24,983',
title: 'Total Earning',
avatarIcon: 'tabler-currency-dollar',
avatarColor: 'primary'
},
{
stats: '$8,647',
title: 'Unpaid Earning',
avatarIcon: 'tabler-gift',
avatarColor: 'success'
},
{
stats: '2,367',
title: 'Signups',
avatarIcon: 'tabler-users',
avatarColor: 'error'
},
{
stats: '4.5%',
title: 'Conversion Rate',
avatarIcon: 'tabler-infinity',
avatarColor: 'info'
}
],
statsHorizontalWithBorder: [
{
title: 'On route vehicles',
stats: 42,
trendNumber: 18.2,
avatarIcon: 'tabler-truck',
color: 'primary'
},
{
title: 'Vehicles with errors',
stats: 8,
trendNumber: -8.7,
avatarIcon: 'tabler-alert-triangle',
color: 'warning'
},
{
title: 'Deviated from route',
stats: 27,
trendNumber: 4.3,
avatarIcon: 'tabler-git-fork',
color: 'error'
},
{
title: 'Late vehicles',
stats: 13,
trendNumber: 2.5,
avatarIcon: 'tabler-clock',
color: 'info'
}
],
customerStats: [
{
color: 'primary',
avatarIcon: 'tabler-currency-dollar',
title: 'account balance',
stats: '$7480',
content: ' Credit Left',
description: 'Account balance for next purchase'
},
{
color: 'success',
avatarIcon: 'tabler-gift',
title: 'loyalty program',
chipLabel: 'Platinum member',
description: '3000 points to next tier'
},
{
color: 'warning',
avatarIcon: 'tabler-star',
title: 'wishlist',
stats: '15',
content: 'Items in wishlist',
description: 'Receive notifications on price drops'
},
{
color: 'info',
avatarIcon: 'tabler-crown',
title: 'coupons',
stats: '21',
content: 'Coupons you win',
description: 'Use coupon on next purchase'
}
],
statsSquare: [
{
avatarIcon: 'tabler-briefcase',
avatarColor: 'error',
avatarSize: 40,
avatarVariant: 'rounded',
avatarSkin: 'light',
stats: '97.8k',
statsTitle: 'Orders'
},
{
avatarIcon: 'tabler-message-dots',
avatarColor: 'success',
avatarSize: 40,
avatarVariant: 'rounded',
avatarSkin: 'light',
stats: '3.4k',
statsTitle: 'Review'
}
],
statsHorizontal: [
{
title: 'CPU Usage',
stats: '86%',
avatarIcon: 'tabler-cpu',
avatarColor: 'primary',
avatarSize: 42,
avatarSkin: 'light'
},
{
title: 'Memory Usage',
stats: '1.24gb',
avatarIcon: 'tabler-server',
avatarColor: 'success',
avatarSize: 42,
avatarSkin: 'light'
},
{
title: 'Download Ratio',
stats: '0.2%',
avatarIcon: 'tabler-chart-pie-2',
avatarColor: 'error',
avatarSize: 42,
avatarSkin: 'light'
},
{
title: 'Issues Found',
stats: '128',
avatarIcon: 'tabler-alert-octagon',
avatarColor: 'warning',
avatarSize: 42,
avatarSkin: 'light'
}
],
statsVertical: [
{
title: 'Total Profit',
subtitle: 'Last week',
stats: '1.28k',
avatarIcon: 'tabler-credit-card',
avatarColor: 'error',
avatarSize: 44,
avatarSkin: 'light',
chipText: '-12.2%',
chipColor: 'error',
chipVariant: 'tonal'
},
{
title: 'Total Sales',
subtitle: 'Monthly',
stats: '24.67k',
avatarIcon: 'tabler-currency-dollar',
avatarColor: 'success',
avatarSize: 44,
avatarSkin: 'light',
chipText: '+24.5%',
chipColor: 'success',
chipVariant: 'tonal'
}
],
statsWithAreaChart: [
{
stats: '92.6k',
chartColor: 'primary',
avatarSize: 42,
avatarColor: 'primary',
avatarIcon: 'tabler-users',
avatarSkin: 'light',
title: 'Subscribers Gained',
chartSeries: [{ data: [40, 4, 58, 12, 35, 10, 84] }]
},
{
title: 'Quarterly Sales',
stats: '36.5%',
avatarSize: 42,
avatarColor: 'error',
avatarIcon: 'tabler-shopping-cart',
avatarSkin: 'light',
chartColor: 'error',
chartSeries: [{ data: [44, 75, 24, 57, 6, 84] }]
},
{
title: 'Orders Received',
stats: '97.5k',
avatarSize: 42,
avatarColor: 'warning',
avatarIcon: 'tabler-box',
avatarSkin: 'light',
chartColor: 'warning',
chartSeries: [{ data: [30, 84, 11, 76, 0, 49, 9] }]
},
{
title: 'Revenue Generated',
stats: '91.8k',
avatarSize: 42,
avatarColor: 'success',
avatarIcon: 'tabler-credit-card',
avatarSkin: 'light',
chartColor: 'success',
chartSeries: [{ data: [6, 35, 25, 61, 32, 84, 70] }]
}
]
}

View File

@ -1,20 +1,13 @@
// Third-party Imports // Third-party Imports
import { configureStore } from '@reduxjs/toolkit' import { configureStore } from '@reduxjs/toolkit'
// Slice Imports
import chatReducer from '@/redux-store/slices/chat'
import calendarReducer from '@/redux-store/slices/calendar'
import kanbanReducer from '@/redux-store/slices/kanban'
import emailReducer from '@/redux-store/slices/email'
import productReducer from '@/redux-store/slices/product' import productReducer from '@/redux-store/slices/product'
import customerReducer from '@/redux-store/slices/customer'
export const store = configureStore({ export const store = configureStore({
reducer: { reducer: {
chatReducer, productReducer,
calendarReducer, customerReducer
kanbanReducer,
emailReducer,
productReducer
}, },
middleware: getDefaultMiddleware => getDefaultMiddleware({ serializableCheck: false }) middleware: getDefaultMiddleware => getDefaultMiddleware({ serializableCheck: false })
}) })

View File

@ -1,94 +0,0 @@
// Third-party Imports
import { createSlice } from '@reduxjs/toolkit'
import type { PayloadAction } from '@reduxjs/toolkit'
import type { EventInput } from '@fullcalendar/core'
// Type Imports
import type { CalendarFiltersType, CalendarType } from '@/types/apps/calendarTypes'
// Data Imports
import { events } from '@/fake-db/apps/calendar'
const initialState: CalendarType = {
events: events,
filteredEvents: events,
selectedEvent: null,
selectedCalendars: ['Personal', 'Business', 'Family', 'Holiday', 'ETC']
}
const filterEventsUsingCheckbox = (events: EventInput[], selectedCalendars: CalendarFiltersType[]) => {
return events.filter(event => selectedCalendars.includes(event.extendedProps?.calendar as CalendarFiltersType))
}
export const calendarSlice = createSlice({
name: 'calendar',
initialState: initialState,
reducers: {
filterEvents: state => {
state.filteredEvents = state.events
},
addEvent: (state, action) => {
const newEvent = { ...action.payload, id: `${parseInt(state.events[state.events.length - 1]?.id ?? '') + 1}` }
state.events.push(newEvent)
},
updateEvent: (state, action: PayloadAction<EventInput>) => {
state.events = state.events.map(event => {
if (action.payload._def && event.id === action.payload._def.publicId) {
return {
id: event.id,
url: action.payload._def.url,
title: action.payload._def.title,
allDay: action.payload._def.allDay,
end: action.payload._instance.range.end,
start: action.payload._instance.range.start,
extendedProps: action.payload._def.extendedProps
}
} else if (event.id === action.payload.id) {
return action.payload
} else {
return event
}
})
},
deleteEvent: (state, action) => {
state.events = state.events.filter(event => event.id !== action.payload)
},
selectedEvent: (state, action) => {
state.selectedEvent = action.payload
},
filterCalendarLabel: (state, action) => {
const index = state.selectedCalendars.indexOf(action.payload)
if (index !== -1) {
state.selectedCalendars.splice(index, 1)
} else {
state.selectedCalendars.push(action.payload)
}
state.events = filterEventsUsingCheckbox(state.filteredEvents, state.selectedCalendars)
},
filterAllCalendarLabels: (state, action) => {
state.selectedCalendars = action.payload ? ['Personal', 'Business', 'Family', 'Holiday', 'ETC'] : []
state.events = filterEventsUsingCheckbox(state.filteredEvents, state.selectedCalendars)
}
}
})
export const {
filterEvents,
addEvent,
updateEvent,
deleteEvent,
selectedEvent,
filterCalendarLabel,
filterAllCalendarLabels
} = calendarSlice.actions
export default calendarSlice.reducer

View File

@ -1,80 +0,0 @@
// Third-party Imports
import { createSlice } from '@reduxjs/toolkit'
import type { PayloadAction } from '@reduxjs/toolkit'
// Type Imports
import type { StatusType } from '@/types/apps/chatTypes'
// Data Imports
import { db } from '@/fake-db/apps/chat'
export const chatSlice = createSlice({
name: 'chat',
initialState: db,
reducers: {
getActiveUserData: (state, action: PayloadAction<number>) => {
const activeUser = state.contacts.find(user => user.id === action.payload)
const chat = state.chats.find(chat => chat.userId === action.payload)
if (chat && chat.unseenMsgs > 0) {
chat.unseenMsgs = 0
}
if (activeUser) {
state.activeUser = activeUser
}
},
addNewChat: (state, action) => {
const { id } = action.payload
state.contacts.find(contact => {
if (contact.id === id && !state.chats.find(chat => chat.userId === contact.id)) {
state.chats.unshift({
id: state.chats.length + 1,
userId: contact.id,
unseenMsgs: 0,
chat: []
})
}
})
},
setUserStatus: (state, action: PayloadAction<{ status: StatusType }>) => {
state.profileUser = {
...state.profileUser,
status: action.payload.status
}
},
sendMsg: (state, action: PayloadAction<{ msg: string }>) => {
const { msg } = action.payload
const existingChat = state.chats.find(chat => chat.userId === state.activeUser?.id)
if (existingChat) {
existingChat.chat.push({
message: msg,
time: new Date(),
senderId: state.profileUser.id,
msgStatus: {
isSent: true,
isDelivered: false,
isSeen: false
}
})
// Remove the chat from its current position
state.chats = state.chats.filter(chat => chat.userId !== state.activeUser?.id)
// Add the chat back to the beginning of the array
state.chats.unshift(existingChat)
}
}
}
})
export const { getActiveUserData, addNewChat, setUserStatus, sendMsg } = chatSlice.actions
export default chatSlice.reducer

View File

@ -0,0 +1,41 @@
// Third-party Imports
import type { PayloadAction } from '@reduxjs/toolkit'
import { createSlice } from '@reduxjs/toolkit'
// Type Imports
// Data Imports
import { Customer } from '../../types/services/customer'
const initialState: { currentCustomer: Customer } = {
currentCustomer: {
id: '',
name: '',
email: '',
phone: '',
address: '',
is_active: true,
organization_id: '',
is_default: false,
metadata: {},
created_at: '',
updated_at: ''
}
}
export const customerSlice = createSlice({
name: 'customer',
initialState,
reducers: {
setCustomer: (state, action: PayloadAction<Customer>) => {
state.currentCustomer = action.payload
},
resetCustomer: state => {
state.currentCustomer = initialState.currentCustomer
}
}
})
export const { setCustomer, resetCustomer } = customerSlice.actions
export default customerSlice.reducer

View File

@ -1,140 +0,0 @@
// Third-party Imports
import { createSlice } from '@reduxjs/toolkit'
// Type Imports
import type { Email, EmailState } from '@/types/apps/emailTypes'
// Data Imports
import { db } from '@/fake-db/apps/email'
// Constants
const initialState: EmailState = {
emails: db.emails,
filteredEmails: []
}
export const emailSlice = createSlice({
name: 'email',
initialState,
reducers: {
// Filter all emails based on folder and label
filterEmails: (state, action) => {
const { emails, folder, label, uniqueLabels } = action.payload
state.filteredEmails = emails.filter((email: Email) => {
if (folder === 'starred' && email.folder !== 'trash') {
return email.isStarred
} else if (uniqueLabels.includes(label) && email.folder !== 'trash') {
return email.labels.includes(label)
} else {
return email.folder === folder
}
})
},
// Move all selected emails to folder
moveEmailsToFolder: (state, action) => {
const { emailIds, folder } = action.payload
state.emails = state.emails.map(email => {
return emailIds.includes(email.id) ? { ...email, folder } : email
})
},
// Delete all selected emails from trash
deleteTrashEmails: (state, action) => {
const { emailIds } = action.payload
state.emails = state.emails.filter(email => !emailIds.includes(email.id))
},
// Toggle read/unread status of all selected emails
toggleReadEmails: (state, action) => {
const { emailIds } = action.payload
const doesContainUnread = state.filteredEmails
.filter(email => emailIds.includes(email.id))
.some(email => !email.isRead)
const areAllUnread = state.filteredEmails
.filter(email => emailIds.includes(email.id))
.every(email => !email.isRead)
const areAllRead = state.filteredEmails.filter(email => emailIds.includes(email.id)).every(email => email.isRead)
state.emails = state.emails.map(email => {
if (emailIds.includes(email.id) && (doesContainUnread || areAllUnread)) {
return { ...email, isRead: true }
} else if (emailIds.includes(email.id) && areAllRead) {
return { ...email, isRead: false }
}
return email
})
},
// Toggle label to all selected emails
toggleLabel: (state, action) => {
const { emailIds, label } = action.payload
state.emails = state.emails.map(email => {
if (emailIds.includes(email.id)) {
return email.labels.includes(label)
? { ...email, labels: email.labels.filter(l => l !== label) }
: { ...email, labels: [...email.labels, label] }
}
return email
})
},
// Toggle starred status of email
toggleStarEmail: (state, action) => {
const { emailId } = action.payload
state.emails = state.emails.map(email => {
return email.id === emailId ? { ...email, isStarred: !email.isStarred } : email
})
},
// Get current email and mark it as read
getCurrentEmail: (state, action) => {
state.currentEmailId = action.payload
state.emails = state.emails.map(email => {
return email.id === action.payload && !email.isRead ? { ...email, isRead: true } : email
})
},
// Navigate to next or previous email
navigateEmails: (state, action) => {
const { type, emails: filteredEmails, currentEmailId } = action.payload
const currentIndex = filteredEmails.findIndex((email: Email) => email.id === currentEmailId)
if (type === 'next' && currentIndex < filteredEmails.length - 1) {
state.currentEmailId = filteredEmails[currentIndex + 1].id
} else if (type === 'prev' && currentIndex > 0) {
state.currentEmailId = filteredEmails[currentIndex - 1].id
}
// Mark email as read on navigation
if (state.currentEmailId) {
state.emails.filter(email => email.id === state.currentEmailId)[0].isRead = true
}
}
}
})
export const {
filterEmails,
moveEmailsToFolder,
deleteTrashEmails,
toggleReadEmails,
toggleLabel,
toggleStarEmail,
getCurrentEmail,
navigateEmails
} = emailSlice.actions
export default emailSlice.reducer

View File

@ -1,124 +0,0 @@
// Third-party Imports
import { createSlice } from '@reduxjs/toolkit'
// Type Imports
import type { ColumnType, TaskType } from '@/types/apps/kanbanTypes'
// Data Imports
import { db } from '@/fake-db/apps/kanban'
export const kanbanSlice = createSlice({
name: 'kanban',
initialState: db,
reducers: {
addColumn: (state, action) => {
const maxId = Math.max(...state.columns.map(column => column.id))
const newColumn: ColumnType = {
id: maxId + 1,
title: action.payload,
taskIds: []
}
state.columns.push(newColumn)
},
editColumn: (state, action) => {
const { id, title } = action.payload
const column = state.columns.find(column => column.id === id)
if (column) {
column.title = title
}
},
deleteColumn: (state, action) => {
const { columnId } = action.payload
const column = state.columns.find(column => column.id === columnId)
state.columns = state.columns.filter(column => column.id !== columnId)
if (column) {
state.tasks = state.tasks.filter(task => !column.taskIds.includes(task.id))
}
},
updateColumns: (state, action) => {
state.columns = action.payload
},
updateColumnTaskIds: (state, action) => {
const { id, tasksList } = action.payload
state.columns = state.columns.map(column => {
if (column.id === id) {
return { ...column, taskIds: tasksList.map((task: TaskType) => task.id) }
}
return column
})
},
addTask: (state, action) => {
const { columnId, title } = action.payload
const newTask: TaskType = {
id: state.tasks[state.tasks.length - 1].id + 1,
title
}
const column = state.columns.find(column => column.id === columnId)
if (column) {
column.taskIds.push(newTask.id)
}
state.tasks.push(newTask)
return state
},
editTask: (state, action) => {
const { id, title, badgeText, dueDate } = action.payload
const task = state.tasks.find(task => task.id === id)
if (task) {
task.title = title
task.badgeText = badgeText
task.dueDate = dueDate
}
},
deleteTask: (state, action) => {
const taskId = action.payload
state.tasks = state.tasks.filter(task => task.id !== taskId)
state.columns = state.columns.map(column => {
return {
...column,
taskIds: column.taskIds.filter(id => id !== taskId)
}
})
},
getCurrentTask: (state, action) => {
state.currentTaskId = action.payload
}
}
})
export const {
addColumn,
editColumn,
deleteColumn,
updateColumns,
updateColumnTaskIds,
addTask,
editTask,
deleteTask,
getCurrentTask
} = kanbanSlice.actions
export default kanbanSlice.reducer

View File

@ -0,0 +1,52 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'
import { CustomerRequest } from '../../types/services/customer'
import { api } from '../api'
import { toast } from 'react-toastify'
export const useCustomersMutation = () => {
const queryClient = useQueryClient()
const createCustomer = useMutation({
mutationFn: async (newCustomer: CustomerRequest) => {
const response = await api.post('/customers', newCustomer)
return response.data
},
onSuccess: () => {
toast.success('Customer created successfully!')
queryClient.invalidateQueries({ queryKey: ['customers'] })
},
onError: (error: any) => {
toast.error(error.response?.data?.errors?.[0]?.cause || 'Create failed')
}
})
const updateCustomer = useMutation({
mutationFn: async ({ id, payload }: { id: string; payload: CustomerRequest }) => {
const response = await api.put(`/customers/${id}`, payload)
return response.data
},
onSuccess: () => {
toast.success('Customer updated successfully!')
queryClient.invalidateQueries({ queryKey: ['customers'] })
},
onError: (error: any) => {
toast.error(error.response?.data?.errors?.[0]?.cause || 'Update failed')
}
})
const deleteCustomer = useMutation({
mutationFn: async (id: string) => {
const response = await api.delete(`/customers/${id}`)
return response.data
},
onSuccess: () => {
toast.success('Customer deleted successfully!')
queryClient.invalidateQueries({ queryKey: ['customers'] })
},
onError: (error: any) => {
toast.error(error.response?.data?.errors?.[0]?.cause || 'Delete failed')
}
})
return { createCustomer, updateCustomer, deleteCustomer }
}

View File

@ -0,0 +1,36 @@
import { useQuery } from '@tanstack/react-query'
import { Customers } from '../../types/services/customer'
import { api } from '../api'
interface CustomersQueryParams {
page?: number
limit?: number
search?: string
}
export function useCustomers(params: CustomersQueryParams = {}) {
const { page = 1, limit = 10, search = '', ...filters } = params
return useQuery<Customers>({
queryKey: ['customers', { page, limit, search, ...filters }],
queryFn: async () => {
const queryParams = new URLSearchParams()
queryParams.append('page', page.toString())
queryParams.append('limit', limit.toString())
if (search) {
queryParams.append('search', search)
}
Object.entries(filters).forEach(([key, value]) => {
if (value !== undefined && value !== null && value !== '') {
queryParams.append(key, value.toString())
}
})
const res = await api.get(`/customers?${queryParams.toString()}`)
return res.data.data
}
})
}

View File

@ -0,0 +1,29 @@
export interface Customer {
id: string;
organization_id: string;
name: string;
email?: string;
phone?: string;
address?: string;
is_default: boolean;
is_active: boolean;
metadata: Record<string, any>;
created_at: string;
updated_at: string;
}
export interface Customers {
data: Customer[];
total_count: number;
page: number;
limit: number;
total_pages: number;
}
export interface CustomerRequest {
name: string;
email?: string;
phone?: string;
address?: string;
is_active?: boolean;
}

View File

@ -1,131 +0,0 @@
'use client'
// MUI Imports
import Card from '@mui/material/Card'
import CardContent from '@mui/material/CardContent'
import Chip from '@mui/material/Chip'
import Divider from '@mui/material/Divider'
import List from '@mui/material/List'
import ListItem from '@mui/material/ListItem'
import Typography from '@mui/material/Typography'
import useMediaQuery from '@mui/material/useMediaQuery'
import { useTheme } from '@mui/material/styles'
// Third-party Imports
import ReactPlayer from '@/libs/ReactPlayer'
// Type Imports
import type { CourseDetails } from '@/types/apps/academyTypes'
// Components Imports
import CustomAvatar from '@core/components/mui/Avatar'
import CustomIconButton from '@core/components/mui/IconButton'
const Details = ({ data }: { data?: CourseDetails }) => {
// Hooks
const theme = useTheme()
const smallScreen = useMediaQuery(theme.breakpoints.down('sm'))
return (
<Card>
<CardContent className='flex flex-wrap items-center justify-between gap-4'>
<div>
<Typography variant='h5'>UI/UX Basic Fundamentals</Typography>
<Typography>
Prof. <span className='font-medium text-textPrimary'>Devonne Wallbridge</span>
</Typography>
</div>
<div className='flex items-center gap-4'>
<Chip label='UI/UX' variant='tonal' size='small' color='error' />
<i className='tabler-share cursor-pointer' />
<i className='tabler-bookmarks cursor-pointer' />
</div>
</CardContent>
<CardContent>
<div className='border rounded'>
<div className='mli-2 mbs-2 overflow-hidden rounded'>
<ReactPlayer
playing
controls
url='https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4'
height={smallScreen ? 280 : 440}
className='bg-black !is-full'
light={
<img
src='/images/apps/academy/4.png'
alt='Thumbnail'
className='is-full bs-full object-cover bg-backgroundPaper'
/>
}
playIcon={
<CustomIconButton variant='contained' color='error' className='absolute rounded-full'>
<i className='tabler-player-play text-2xl' />
</CustomIconButton>
}
/>
</div>
<div className='flex flex-col gap-6 p-5'>
<div className='flex flex-col gap-4'>
<Typography variant='h5'>About this course</Typography>
<Typography>{data?.about}</Typography>
</div>
<Divider />
<div className='flex flex-col gap-4'>
<Typography variant='h5'>By the numbers</Typography>
<div className='flex flex-wrap gap-x-12 gap-y-2'>
<List role='list' component='div' className='flex flex-col gap-2 plb-0'>
<ListItem role='listitem' className='flex items-center gap-2 p-0'>
<i className='tabler-check text-xl text-textSecondary' />
<Typography>Skill level: {data?.skillLevel}</Typography>
</ListItem>
<ListItem role='listitem' className='flex items-center gap-2 p-0'>
<i className='tabler-users text-xl text-textSecondary' />
<Typography>Students: {data?.totalStudents.toLocaleString()}</Typography>
</ListItem>
<ListItem role='listitem' className='flex items-center gap-2 p-0'>
<i className='tabler-world text-xl text-textSecondary' />
<Typography>Languages: {data?.language}</Typography>
</ListItem>
<ListItem role='listitem' className='flex items-center gap-2 p-0'>
<i className='tabler-file text-xl text-textSecondary' />
<Typography>Captions: {data?.isCaptions ? 'Yes' : 'No'}</Typography>
</ListItem>
</List>
<List role='list' component='div' className='flex flex-col gap-2 plb-0'>
<ListItem role='listitem' className='flex items-center gap-2 p-0'>
<i className='tabler-video text-xl text-textSecondary' />
<Typography>Lectures: {data?.totalLectures}</Typography>
</ListItem>
<ListItem role='listitem' className='flex items-center gap-2 p-0'>
<i className='tabler-clock text-xl text-textSecondary' />
<Typography>Video: {data?.length}</Typography>
</ListItem>
</List>
</div>
</div>
<Divider />
<div className='flex flex-col gap-4'>
<Typography variant='h5'>Description</Typography>
{data?.description.map((value, index) => <Typography key={index}>{value}</Typography>)}
</div>
<Divider />
<div className='flex flex-col gap-4'>
<Typography variant='h5'>Instructor</Typography>
<div className='flex items-center gap-4'>
<CustomAvatar skin='light-static' color='error' src={data?.instructorAvatar} size={38} />
<div className='flex flex-col gap-1'>
<Typography className='font-medium' color='text.primary'>
{data?.instructor}
</Typography>
<Typography variant='body2'>{data?.instructorPosition}</Typography>
</div>
</div>
</div>
</div>
</div>
</CardContent>
</Card>
)
}
export default Details

View File

@ -1,151 +0,0 @@
'use client'
// React Imports
import { useState } from 'react'
import type { ChangeEvent, SyntheticEvent } from 'react'
// MUI Imports
import { styled } from '@mui/material/styles'
import MuiAccordion from '@mui/material/Accordion'
import MuiAccordionSummary from '@mui/material/AccordionSummary'
import MuiAccordionDetails from '@mui/material/AccordionDetails'
import Typography from '@mui/material/Typography'
import Checkbox from '@mui/material/Checkbox'
import ListItem from '@mui/material/ListItem'
import List from '@mui/material/List'
import ListItemIcon from '@mui/material/ListItemIcon'
import type { AccordionProps } from '@mui/material/Accordion'
import type { AccordionSummaryProps } from '@mui/material/AccordionSummary'
import type { AccordionDetailsProps } from '@mui/material/AccordionDetails'
// Type Imports
import type { CourseContent } from '@/types/apps/academyTypes'
type ItemsType = {
title: string
time: string
isCompleted: boolean
}[]
// Styled component for Accordion component
export const Accordion = styled(MuiAccordion)<AccordionProps>({
margin: '0 !important',
boxShadow: 'none !important',
border: '1px solid var(--mui-palette-divider) !important',
borderRadius: '0 !important',
overflow: 'hidden',
background: 'none',
'&:not(:last-of-type)': {
borderBottom: '0 !important'
},
'&:before': {
display: 'none'
},
'&:first-of-type': {
borderTopLeftRadius: 'var(--mui-shape-borderRadius) !important',
borderTopRightRadius: 'var(--mui-shape-borderRadius) !important'
},
'&:last-of-type': {
borderBottomLeftRadius: 'var(--mui-shape-borderRadius) !important',
borderBottomRightRadius: 'var(--mui-shape-borderRadius) !important'
}
})
// Styled component for AccordionSummary component
export const AccordionSummary = styled(MuiAccordionSummary)<AccordionSummaryProps>(({ theme }) => ({
padding: theme.spacing(3, 6),
transition: 'none',
backgroundColor: 'var(--mui-palette-action-hover)',
borderBlockEnd: '0 !important',
'&.Mui-expanded': {
borderBlockEnd: '1px solid var(--mui-palette-divider) !important'
}
}))
// Styled component for AccordionDetails component
export const AccordionDetails = styled(MuiAccordionDetails)<AccordionDetailsProps>(({ theme }) => ({
padding: `${theme.spacing(4, 3)} !important`,
backgroundColor: 'var(--mui-palette-background-paper)'
}))
const Sidebar = ({ content }: { content?: CourseContent[] }) => {
// States
const [expanded, setExpanded] = useState<number | false>(0)
const [items, setItems] = useState<ItemsType[]>(content?.map(item => item.topics) ?? [])
const handleChange = (panel: number) => (event: SyntheticEvent, isExpanded: boolean) => {
setExpanded(isExpanded ? panel : false)
}
const handleCheckboxChange = (e: ChangeEvent<HTMLInputElement>, index1: number, index2: number) => {
setItems(
items.map((item, i) => {
if (i === index1) {
return item.map((topic, j) => {
if (j === index2) {
return { ...topic, isCompleted: e.target.checked }
}
return topic
})
}
return item
})
)
}
return (
<>
{content?.map((item, index) => {
const totalTime = items[index]
.reduce((sum, topic) => {
const time = parseFloat(topic.time || '0')
return sum + time
}, 0)
.toFixed(2)
const selectedTopics = items[index].filter(topic => topic.isCompleted).length
return (
<Accordion key={index} expanded={expanded === index} onChange={handleChange(index)}>
<AccordionSummary
id='customized-panel-header-1'
expandIcon={<i className='tabler-chevron-right text-textSecondary' />}
aria-controls={'sd'}
>
<div>
<Typography variant='h5'>{item.title}</Typography>
<Typography className='!font-normal !text-textSecondary'>{`${selectedTopics} / ${item.topics.length} | ${parseFloat(totalTime)} min`}</Typography>
</div>
</AccordionSummary>
<AccordionDetails>
<List role='list' component='div' className='flex flex-col gap-4 plb-0'>
{item.topics.map((topic, i) => {
return (
<ListItem key={i} role='listitem' className='gap-3 p-0'>
<ListItemIcon>
<Checkbox
tabIndex={-1}
checked={items[index][i].isCompleted}
onChange={e => handleCheckboxChange(e, index, i)}
/>
</ListItemIcon>
<div>
<Typography className='font-medium !text-textPrimary'>{`${i + 1}. ${topic.title}`}</Typography>
<Typography variant='body2'>{topic.time}</Typography>
</div>
</ListItem>
)
})}
</List>
</AccordionDetails>
</Accordion>
)
})}
</>
)
}
export default Sidebar

View File

@ -1,76 +0,0 @@
// MUI Imports
import Card from '@mui/material/Card'
import CardHeader from '@mui/material/CardHeader'
import CardContent from '@mui/material/CardContent'
import Typography from '@mui/material/Typography'
import CircularProgress from '@mui/material/CircularProgress'
// Type Imports
import type { ThemeColor } from '@core/types'
// Components Imports
import CustomIconButton from '@core/components/mui/IconButton'
import OptionMenu from '@core/components/option-menu'
import DirectionalIcon from '@components/DirectionalIcon'
type DataType = {
title: string
tasks: number
progress: number
color: ThemeColor
}
// Vars
const data: DataType[] = [
{ title: 'User Experience Design', tasks: 120, progress: 72, color: 'primary' },
{ title: 'Basic fundamentals', tasks: 32, progress: 48, color: 'success' },
{ title: 'React Native components', tasks: 182, progress: 15, color: 'error' },
{ title: 'Basic of music theory', tasks: 56, progress: 24, color: 'info' }
]
const AssignmentProgress = () => {
return (
<Card>
<CardHeader title='Assignment Progress' action={<OptionMenu options={['Refresh', 'Update', 'Share']} />} />
<CardContent className='flex flex-col gap-8'>
{data.map((item, i) => (
<div key={i} className='flex items-center gap-4'>
<div className='relative flex items-center justify-center'>
<CircularProgress
variant='determinate'
size={54}
value={100}
thickness={3}
className='absolute text-[var(--mui-palette-customColors-trackBg)]'
/>
<CircularProgress
variant='determinate'
size={54}
value={item.progress}
thickness={3}
color={item.color}
sx={{ '& .MuiCircularProgress-circle': { strokeLinecap: 'round' } }}
/>
<Typography className='absolute font-medium' color='text.primary'>
{`${item.progress}%`}
</Typography>
</div>
<div className='flex justify-between items-center is-full gap-4'>
<div>
<Typography className='font-medium mbe-1.5' color='text.primary'>
{item.title}
</Typography>
<Typography variant='body2'>{`${item.tasks} Tasks`}</Typography>
</div>
<CustomIconButton size='small' variant='tonal' color='secondary' className='min-is-fit'>
<DirectionalIcon ltrIconClass='tabler-chevron-right' rtlIconClass='tabler-chevron-left' />
</CustomIconButton>
</div>
</div>
))}
</CardContent>
</Card>
)
}
export default AssignmentProgress

View File

@ -1,353 +0,0 @@
'use client'
// React Imports
import { useState, useEffect, useMemo } from 'react'
// Next Imports
import Link from 'next/link'
import { useParams } from 'next/navigation'
// MUI Imports
import Card from '@mui/material/Card'
import CardHeader from '@mui/material/CardHeader'
import Checkbox from '@mui/material/Checkbox'
import LinearProgress from '@mui/material/LinearProgress'
import TablePagination from '@mui/material/TablePagination'
import Typography from '@mui/material/Typography'
import type { TextFieldProps } from '@mui/material/TextField'
// Third-party Imports
import classnames from 'classnames'
import { rankItem } from '@tanstack/match-sorter-utils'
import {
createColumnHelper,
flexRender,
getCoreRowModel,
useReactTable,
getFilteredRowModel,
getFacetedRowModel,
getFacetedUniqueValues,
getFacetedMinMaxValues,
getPaginationRowModel,
getSortedRowModel
} from '@tanstack/react-table'
import type { ColumnDef, FilterFn } from '@tanstack/react-table'
import type { RankingInfo } from '@tanstack/match-sorter-utils'
// Type Imports
import type { Course } from '@/types/apps/academyTypes'
import type { Locale } from '@configs/i18n'
// Components Imports
import CustomAvatar from '@core/components/mui/Avatar'
import TablePaginationComponent from '@components/TablePaginationComponent'
import CustomTextField from '@core/components/mui/TextField'
// Util Imports
import { getLocalizedUrl } from '@/utils/i18n'
// Style Imports
import tableStyles from '@core/styles/table.module.css'
declare module '@tanstack/table-core' {
interface FilterFns {
fuzzy: FilterFn<unknown>
}
interface FilterMeta {
itemRank: RankingInfo
}
}
type CourseWithProgress = Course & {
progressValue?: string
}
const fuzzyFilter: FilterFn<any> = (row, columnId, value, addMeta) => {
// Rank the item
const itemRank = rankItem(row.getValue(columnId), value)
// Store the itemRank info
addMeta({
itemRank
})
// Return if the item should be filtered in/out
return itemRank.passed
}
const DebouncedInput = ({
value: initialValue,
onChange,
debounce = 500,
...props
}: {
value: string | number
onChange: (value: string | number) => void
debounce?: number
} & Omit<TextFieldProps, 'onChange'>) => {
// States
const [value, setValue] = useState(initialValue)
useEffect(() => {
setValue(initialValue)
}, [initialValue])
useEffect(() => {
const timeout = setTimeout(() => {
onChange(value)
}, debounce)
return () => clearTimeout(timeout)
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [value])
return <CustomTextField {...props} value={value} onChange={e => setValue(e.target.value)} />
}
// Column Definitions
const columnHelper = createColumnHelper<CourseWithProgress>()
const CourseTable = ({ courseData }: { courseData?: Course[] }) => {
// States
const [rowSelection, setRowSelection] = useState({})
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const [data, setData] = useState(...[courseData])
const [globalFilter, setGlobalFilter] = useState('')
// Hooks
const { lang: locale } = useParams()
const columns = useMemo<ColumnDef<CourseWithProgress, any>[]>(
() => [
{
id: 'select',
header: ({ table }) => (
<Checkbox
{...{
checked: table.getIsAllRowsSelected(),
indeterminate: table.getIsSomeRowsSelected(),
onChange: table.getToggleAllRowsSelectedHandler()
}}
/>
),
cell: ({ row }) => (
<Checkbox
{...{
checked: row.getIsSelected(),
disabled: !row.getCanSelect(),
indeterminate: row.getIsSomeSelected(),
onChange: row.getToggleSelectedHandler()
}}
/>
)
},
columnHelper.accessor('courseTitle', {
header: 'Course Name',
cell: ({ row }) => (
<div className='flex items-center gap-4'>
<CustomAvatar variant='rounded' skin='light' color={row.original.color}>
<i className={classnames('text-[28px]', row.original.logo)} />
</CustomAvatar>
<div className='flex flex-col'>
<Typography
component={Link}
href={getLocalizedUrl('/apps/academy/course-details', locale as Locale)}
className='font-medium hover:text-primary'
color='text.primary'
>
{row.original.courseTitle}
</Typography>
<div className='flex items-center gap-2'>
<CustomAvatar src={row.original.image} size={22} />
<Typography variant='body2' color='text.primary'>
{row.original.user}
</Typography>
</div>
</div>
</div>
)
}),
columnHelper.accessor('time', {
header: 'Time',
cell: ({ row }) => (
<Typography className='font-medium' color='text.primary'>
{row.original.time}
</Typography>
),
enableSorting: false
}),
columnHelper.accessor('progressValue', {
header: 'progress',
sortingFn: (rowA, rowB) => {
if (
!Math.floor((rowA.original.completedTasks / rowA.original.totalTasks) * 100) ||
!Math.floor((rowB.original.completedTasks / rowB.original.totalTasks) * 100)
)
return 0
return (
Number(Math.floor((rowA.original.completedTasks / rowA.original.totalTasks) * 100)) -
Number(Math.floor((rowB.original.completedTasks / rowB.original.totalTasks) * 100))
)
},
cell: ({ row }) => (
<div className='flex items-center gap-4 min-is-48'>
<Typography
className='font-medium'
color='text.primary'
>{`${Math.floor((row.original.completedTasks / row.original.totalTasks) * 100)}%`}</Typography>
<LinearProgress
color='primary'
value={Math.floor((row.original.completedTasks / row.original.totalTasks) * 100)}
variant='determinate'
className='is-full bs-2'
/>
<Typography variant='body2'>{`${row.original.completedTasks}/${row.original.totalTasks}`}</Typography>
</div>
)
}),
columnHelper.accessor('userCount', {
header: 'Status',
cell: ({ row }) => (
<div className='flex items-center justify-between gap-5'>
<div className='flex items-center gap-1.5'>
<i className='tabler-users text-primary' />
<Typography>{row.original.userCount}</Typography>
</div>
<div className='flex items-center gap-1.5'>
<i className='tabler-book text-info' />
<Typography>{row.original.note}</Typography>
</div>
<div className='flex items-center gap-1.5'>
<i className='tabler-video text-error' />
<Typography>{row.original.view}</Typography>
</div>
</div>
),
enableSorting: false
})
],
// eslint-disable-next-line react-hooks/exhaustive-deps
[]
)
const table = useReactTable({
data: data as Course[],
columns,
filterFns: {
fuzzy: fuzzyFilter
},
state: {
rowSelection,
globalFilter
},
initialState: {
pagination: {
pageSize: 5
}
},
enableRowSelection: true, //enable row selection for all rows
// enableRowSelection: row => row.original.age > 18, // or enable row selection conditionally per row
globalFilterFn: fuzzyFilter,
onRowSelectionChange: setRowSelection,
getCoreRowModel: getCoreRowModel(),
onGlobalFilterChange: setGlobalFilter,
getFilteredRowModel: getFilteredRowModel(),
getSortedRowModel: getSortedRowModel(),
getPaginationRowModel: getPaginationRowModel(),
getFacetedRowModel: getFacetedRowModel(),
getFacetedUniqueValues: getFacetedUniqueValues(),
getFacetedMinMaxValues: getFacetedMinMaxValues()
})
return (
<Card>
<CardHeader
title='Course you are taking'
action={
<DebouncedInput
value={globalFilter ?? ''}
onChange={value => setGlobalFilter(String(value))}
placeholder='Search Course'
/>
}
className='flex-wrap gap-4'
/>
<div className='overflow-x-auto'>
<table className={tableStyles.table}>
<thead>
{table.getHeaderGroups().map(headerGroup => (
<tr key={headerGroup.id}>
{headerGroup.headers.map(header => (
<th key={header.id}>
{header.isPlaceholder ? null : (
<>
<div
className={classnames({
'flex items-center': header.column.getIsSorted(),
'cursor-pointer select-none': header.column.getCanSort()
})}
onClick={header.column.getToggleSortingHandler()}
>
{flexRender(header.column.columnDef.header, header.getContext())}
{{
asc: <i className='tabler-chevron-up text-xl' />,
desc: <i className='tabler-chevron-down text-xl' />
}[header.column.getIsSorted() as 'asc' | 'desc'] ?? null}
</div>
</>
)}
</th>
))}
</tr>
))}
</thead>
{table.getFilteredRowModel().rows.length === 0 ? (
<tbody>
<tr>
<td colSpan={table.getVisibleFlatColumns().length} className='text-center'>
No data available
</td>
</tr>
</tbody>
) : (
<tbody>
{table
.getRowModel()
.rows.slice(0, table.getState().pagination.pageSize)
.map(row => {
return (
<tr key={row.id} className={classnames({ selected: row.getIsSelected() })}>
{row.getVisibleCells().map(cell => (
<td key={cell.id}>{flexRender(cell.column.columnDef.cell, cell.getContext())}</td>
))}
</tr>
)
})}
</tbody>
)}
</table>
</div>
<TablePagination
component={() => (
<TablePaginationComponent
pageIndex={table.getState().pagination.pageIndex + 1}
pageSize={table.getState().pagination.pageSize}
totalCount={table.getFilteredRowModel().rows.length}
onPageChange={(_, page) => {
table.setPageIndex(page - 1)
}}
/>
)}
count={table.getFilteredRowModel().rows.length}
rowsPerPage={table.getState().pagination.pageSize}
page={table.getState().pagination.pageIndex}
onPageChange={(_, page) => {
table.setPageIndex(page)
}}
/>
</Card>
)
}
export default CourseTable

View File

@ -1,193 +0,0 @@
'use client'
// Next Imports
import dynamic from 'next/dynamic'
// MUI Imports
import Card from '@mui/material/Card'
import Grid from '@mui/material/Grid2'
import CardHeader from '@mui/material/CardHeader'
import CardContent from '@mui/material/CardContent'
import Typography from '@mui/material/Typography'
import { useTheme } from '@mui/material/styles'
// Third-party Imports
import classnames from 'classnames'
import type { ApexOptions } from 'apexcharts'
// Components Imports
import OptionMenu from '@core/components/option-menu'
// Styled Component Imports
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
type DataType = {
title: string
value: number
colorClass: string
}
// Vars
const series = [
{
data: [35, 20, 14, 12, 10, 9]
}
]
const data1: DataType[] = [
{ title: 'UI Design', value: 35, colorClass: 'text-primary' },
{ title: 'UX Design', value: 20, colorClass: 'text-info' },
{ title: 'Music', value: 14, colorClass: 'text-success' }
]
const data2: DataType[] = [
{ title: 'Animation', value: 12, colorClass: 'text-secondary' },
{ title: 'React', value: 10, colorClass: 'text-error' },
{ title: 'SEO', value: 9, colorClass: 'text-warning' }
]
const labels = ['UI Design', 'UX Design', 'Music', 'Animation', 'React', 'SEO']
const InterestedTopics = () => {
// Hooks
const theme = useTheme()
// Vars
const options: ApexOptions = {
chart: {
parentHeightOffset: 0,
toolbar: { show: false }
},
plotOptions: {
bar: {
horizontal: true,
barHeight: '70%',
distributed: true,
borderRadius: 7,
borderRadiusApplication: 'end'
}
},
colors: [
'var(--mui-palette-primary-main)',
'var(--mui-palette-info-main)',
'var(--mui-palette-success-main)',
'var(--mui-palette-secondary-main)',
'var(--mui-palette-error-main)',
'var(--mui-palette-warning-main)'
],
grid: {
strokeDashArray: 8,
borderColor: 'var(--mui-palette-divider)',
xaxis: {
lines: { show: true }
},
yaxis: {
lines: { show: false }
},
padding: {
top: -25,
left: 21,
right: 25,
bottom: 0
}
},
dataLabels: {
enabled: true,
offsetY: 8,
style: {
colors: ['#fff'],
fontWeight: 500,
fontSize: '0.8125rem'
},
formatter(val: string, opt: any) {
return labels[opt.dataPointIndex]
}
},
tooltip: {
enabled: true,
style: {
fontSize: '0.75rem'
},
onDatasetHover: {
highlightDataSeries: false
}
},
legend: { show: false },
states: {
hover: {
filter: { type: 'none' }
},
active: {
filter: { type: 'none' }
}
},
xaxis: {
axisTicks: { show: false },
axisBorder: { show: false },
categories: ['6', '5', '4', '3', '2', '1'],
labels: {
formatter: val => `${val}%`,
style: {
fontSize: '0.8125rem',
colors: 'var(--mui-palette-text-disabled)'
}
}
},
yaxis: {
labels: {
align: theme.direction === 'rtl' ? 'right' : 'left',
style: {
fontWeight: 500,
fontSize: '0.8125rem',
colors: 'var(--mui-palette-text-disabled)'
},
offsetX: theme.direction === 'rtl' ? -15 : -30
}
}
}
return (
<Card>
<CardHeader
title='Topic you are interested in'
action={<OptionMenu options={['Refresh', 'Update', 'Share']} />}
/>
<CardContent>
<Grid container>
<Grid size={{ xs: 12, sm: 6 }} className='max-sm:mbe-6'>
<AppReactApexCharts type='bar' height={296} width='100%' series={series} options={options} />
</Grid>
<Grid size={{ xs: 12, sm: 6 }} alignSelf='center'>
<div className='flex justify-around items-start'>
<div className='flex flex-col gap-y-12'>
{data1.map((item, i) => (
<div key={i} className='flex gap-2'>
<i className={classnames('tabler-circle-filled text-xs m-[5px]', item.colorClass)} />
<div>
<Typography>{item.title}</Typography>
<Typography variant='h5'>{`${item.value}%`}</Typography>
</div>
</div>
))}
</div>
<div className='flex flex-col gap-y-12'>
{data2.map((item, i) => (
<div key={i} className='flex gap-2'>
<i className={classnames('tabler-circle-filled text-xs m-[5px]', item.colorClass)} />
<div>
<Typography>{item.title}</Typography>
<Typography variant='h5'>{`${item.value}%`}</Typography>
</div>
</div>
))}
</div>
</div>
</Grid>
</Grid>
</CardContent>
</Card>
)
}
export default InterestedTopics

View File

@ -1,59 +0,0 @@
// MUI Imports
import Card from '@mui/material/Card'
import CardHeader from '@mui/material/CardHeader'
import CardContent from '@mui/material/CardContent'
import Divider from '@mui/material/Divider'
import Typography from '@mui/material/Typography'
// Components Imports
import CustomAvatar from '@core/components/mui/Avatar'
import OptionMenu from '@core/components/option-menu'
type DataType = {
name: string
profession: string
totalCourses: number
avatar: string
}
// Vars
const data: DataType[] = [
{ name: 'Jordan Stevenson', profession: 'Business Intelligence', totalCourses: 33, avatar: '/images/avatars/1.png' },
{ name: 'Bentlee Emblin', profession: 'Digital Marketing', totalCourses: 52, avatar: '/images/avatars/2.png' },
{ name: 'Benedetto Rossiter', profession: 'UI/UX Design', totalCourses: 12, avatar: '/images/avatars/3.png' },
{ name: 'Beverlie Krabbe', profession: 'Vue', totalCourses: 8, avatar: '/images/avatars/4.png' }
]
const PopularInstructors = () => {
return (
<Card className='bs-full'>
<CardHeader title='Popular Instructors' action={<OptionMenu options={['Refresh', 'Update', 'Share']} />} />
<Divider />
<div className='flex justify-between plb-4 pli-6'>
<Typography className='uppercase'>instructors</Typography>
<Typography className='uppercase'>courses</Typography>
</div>
<Divider />
<CardContent className='flex flex-col gap-4'>
{data.map((item, i) => (
<div key={i} className='flex items-center gap-4'>
<CustomAvatar size={34} src={item.avatar} />
<div className='flex justify-between items-center is-full gap-4'>
<div>
<Typography className='font-medium' color='text.primary'>
{item.name}
</Typography>
<Typography variant='body2'>{item.profession}</Typography>
</div>
<Typography className='font-medium' color='text.primary'>
{item.totalCourses}
</Typography>
</div>
</div>
))}
</CardContent>
</Card>
)
}
export default PopularInstructors

View File

@ -1,54 +0,0 @@
// MUI Imports
import Card from '@mui/material/Card'
import CardHeader from '@mui/material/CardHeader'
import CardContent from '@mui/material/CardContent'
import Typography from '@mui/material/Typography'
import Chip from '@mui/material/Chip'
// Type Imports
import type { ThemeColor } from '@core/types'
// Components Imports
import CustomAvatar from '@core/components/mui/Avatar'
import OptionMenu from '@core/components/option-menu'
type DataType = {
title: string
views: string
icon: string
color: ThemeColor
}
// Vars
const data: DataType[] = [
{ title: 'Videography Basic Design Course', views: '1.2k', icon: 'tabler-video', color: 'primary' },
{ title: 'Basic Front-end Development Course', views: '834', icon: 'tabler-code', color: 'info' },
{ title: 'Basic Fundamentals of Photography', views: '3.7k', icon: 'tabler-camera', color: 'success' },
{ title: 'Advance Dribble Base Visual Design', views: '2.5k', icon: 'tabler-brand-dribbble', color: 'warning' },
{ title: 'Your First Singing Lesson', views: '948', icon: 'tabler-microphone-2', color: 'error' }
]
const TopCourses = () => {
return (
<Card>
<CardHeader title='Top Courses' action={<OptionMenu options={['Last 28 Days', 'Last Month', 'Last Year']} />} />
<CardContent className='flex flex-col gap-6'>
{data.map((item, i) => (
<div key={i} className='flex items-center gap-4'>
<CustomAvatar variant='rounded' skin='light' color={item.color}>
<i className={item.icon} />
</CustomAvatar>
<div className='flex justify-between items-center gap-4 is-full flex-wrap'>
<Typography className='font-medium flex-1' color='text.primary'>
{item.title}
</Typography>
<Chip label={`${item.views} Views`} variant='tonal' size='small' color='secondary' />
</div>
</div>
))}
</CardContent>
</Card>
)
}
export default TopCourses

View File

@ -1,61 +0,0 @@
// MUI Imports
import Card from '@mui/material/Card'
import CardContent from '@mui/material/CardContent'
import Button from '@mui/material/Button'
import Typography from '@mui/material/Typography'
// Third-party Imports
import classnames from 'classnames'
// Components Imports
import CustomAvatar from '@core/components/mui/Avatar'
type DataType = {
icon: string
title: string
value: string
}
// Vars
const data: DataType[] = [
{ icon: 'tabler-calendar', title: '17 Nov 23', value: 'Date' },
{ icon: 'tabler-clock', title: '32 Minutes', value: 'Duration' }
]
const UpcomingWebinar = () => {
return (
<Card>
<CardContent className='flex flex-col gap-4'>
<div className='flex justify-center pli-2.5 pbs-4 rounded bg-primaryLight'>
<img src='/images/illustrations/characters/4.png' className='bs-[146px]' />
</div>
<div>
<Typography variant='h5' className='mbe-2'>
Upcoming Webinar
</Typography>
<Typography variant='body2'>
Next Generation Frontend Architecture Using Layout Engine And React Native Web.
</Typography>
</div>
<div className='flex flex-wrap justify-between gap-4'>
{data.map((item, i) => (
<div key={i} className='flex items-center gap-3'>
<CustomAvatar variant='rounded' skin='light' color='primary'>
<i className={classnames('text-[28px]', item.icon)} />
</CustomAvatar>
<div>
<Typography color='text.primary' className='font-medium'>
{item.title}
</Typography>
<Typography variant='body2'>{item.value}</Typography>
</div>
</div>
))}
</div>
<Button variant='contained'>Join the event</Button>
</CardContent>
</Card>
)
}
export default UpcomingWebinar

View File

@ -1,218 +0,0 @@
'use client'
// React Imports
import type { ReactNode } from 'react'
// Next Imports
import dynamic from 'next/dynamic'
// MUI Imports
import Divider from '@mui/material/Divider'
import Chip from '@mui/material/Chip'
import Typography from '@mui/material/Typography'
import useMediaQuery from '@mui/material/useMediaQuery'
import { lighten, darken, useTheme } from '@mui/material/styles'
// Third-party Imports
import type { ApexOptions } from 'apexcharts'
// Type Imports
import type { ThemeColor } from '@core/types'
// Component Imports
import CustomAvatar from '@core/components/mui/Avatar'
// Styled Component Imports
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
type DataType = {
title: string
value: string
color: ThemeColor
icon: ReactNode
}
// Vars
const data: DataType[] = [
{
title: 'Hours Spent',
value: '34h',
color: 'primary',
icon: (
<svg xmlns='http://www.w3.org/2000/svg' width='38' height='38' viewBox='0 0 38 38' fill='none'>
<path
opacity='0.2'
d='M5.9375 26.125V10.6875C5.9375 10.0576 6.18772 9.45352 6.63312 9.00812C7.07852 8.56272 7.68261 8.3125 8.3125 8.3125H29.6875C30.3174 8.3125 30.9215 8.56272 31.3669 9.00812C31.8123 9.45352 32.0625 10.0576 32.0625 10.6875V26.125H5.9375Z'
fill='currentColor'
/>
<path
d='M5.9375 26.125V10.6875C5.9375 10.0576 6.18772 9.45352 6.63312 9.00812C7.07852 8.56272 7.68261 8.3125 8.3125 8.3125H29.6875C30.3174 8.3125 30.9215 8.56272 31.3669 9.00812C31.8123 9.45352 32.0625 10.0576 32.0625 10.6875V26.125M21.375 13.0625H16.625M3.5625 26.125H34.4375V28.5C34.4375 29.1299 34.1873 29.734 33.7419 30.1794C33.2965 30.6248 32.6924 30.875 32.0625 30.875H5.9375C5.30761 30.875 4.70352 30.6248 4.25812 30.1794C3.81272 29.734 3.5625 29.1299 3.5625 28.5V26.125Z'
stroke='currentColor'
strokeWidth='2'
strokeLinecap='round'
strokeLinejoin='round'
/>
</svg>
)
},
{
title: 'Test Results',
value: '82%',
color: 'info',
icon: (
<svg xmlns='http://www.w3.org/2000/svg' width='38' height='38' viewBox='0 0 38 38' fill='none'>
<path
opacity='0.2'
d='M11.682 24.7885C10.2683 23.6892 9.1233 22.2826 8.33376 20.6753C7.54423 19.0679 7.13087 17.3019 7.125 15.5111C7.09532 9.06896 12.2758 3.71037 18.718 3.56193C21.2112 3.50283 23.6598 4.2302 25.7164 5.6409C27.7731 7.05159 29.3334 9.07399 30.176 11.4213C31.0187 13.7686 31.1009 16.3216 30.4111 18.7182C29.7213 21.1149 28.2944 23.2335 26.3328 24.7736C25.8995 25.1086 25.5485 25.5382 25.3067 26.0296C25.0648 26.521 24.9386 27.0611 24.9375 27.6088V28.4994C24.9375 28.8144 24.8124 29.1164 24.5897 29.3391C24.367 29.5618 24.0649 29.6869 23.75 29.6869H14.25C13.9351 29.6869 13.633 29.5618 13.4103 29.3391C13.1876 29.1164 13.0625 28.8144 13.0625 28.4994V27.6088C13.0588 27.0652 12.9328 26.5295 12.6938 26.0413C12.4548 25.553 12.109 25.1249 11.682 24.7885Z'
fill='currentColor'
/>
<path
fillRule='evenodd'
clipRule='evenodd'
d='M25.1507 6.46554C23.2672 5.17364 21.0249 4.50752 18.7416 4.56165L18.7409 4.56167C18.4981 4.56726 18.2571 4.58096 18.0184 4.6025L18.6948 2.5622C21.3978 2.49826 24.0523 3.28688 26.282 4.81625C28.5118 6.34574 30.2035 8.53844 31.1171 11.0834C32.0307 13.6283 32.1199 16.3963 31.372 18.9948C30.6241 21.5933 29.077 23.8903 26.9503 25.5602L26.9443 25.5649L26.9443 25.5648C26.6316 25.8065 26.3783 26.1165 26.2038 26.4711C26.0293 26.8257 25.9382 27.2155 25.9374 27.6107V28.4994C25.9374 29.0796 25.7069 29.636 25.2967 30.0462C24.8865 30.4565 24.3301 30.6869 23.7499 30.6869H14.2499C13.6697 30.6869 13.1133 30.4565 12.7031 30.0462C12.2929 29.636 12.0624 29.0796 12.0624 28.4994V27.6125C12.0592 27.2201 11.968 26.8334 11.7955 26.4809C11.6229 26.1283 11.3734 25.819 11.0654 25.5758L11.7412 23.5373C11.9205 23.6971 12.1055 23.8511 12.2958 23.9991L11.6819 24.7885L12.3008 24.003C12.8456 24.4322 13.2869 24.9786 13.5919 25.6016C13.8968 26.2247 14.0576 26.9083 14.0624 27.602L14.0624 27.6088L14.0624 28.4994C14.0624 28.5492 14.0822 28.5969 14.1173 28.632C14.1525 28.6672 14.2002 28.6869 14.2499 28.6869H23.7499C23.7996 28.6869 23.8473 28.6672 23.8825 28.632C23.9176 28.5969 23.9374 28.5492 23.9374 28.4994V27.6088L23.9374 27.6069C23.9388 26.9067 24.1002 26.2162 24.4093 25.588C24.7179 24.961 25.1655 24.4128 25.7179 23.985C27.5129 22.5747 28.8186 20.6353 29.45 18.4416C30.0817 16.2468 30.0064 13.9088 29.2347 11.7592C28.463 9.60954 27.0341 7.75744 25.1507 6.46554ZM11.7411 23.5373L11.7412 23.5373L18.0184 4.6025L18.0178 4.60255L18.6942 2.56221C11.7041 2.72363 6.09308 8.5318 6.12491 15.5151C6.13137 17.4574 6.57975 19.3728 7.43609 21.1162C8.29203 22.8587 9.53309 24.3837 11.0654 25.5758L11.7411 23.5373ZM11.7411 23.5373C10.7006 22.6103 9.84758 21.4892 9.23122 20.2344C8.50859 18.7632 8.13026 17.1469 8.12489 15.5079L8.12489 15.5065C8.09882 9.84932 12.4635 5.10401 18.0178 4.60255L11.7411 23.5373ZM12.0625 34.437C12.0625 33.8847 12.5102 33.437 13.0625 33.437H24.9375C25.4898 33.437 25.9375 33.8847 25.9375 34.437C25.9375 34.9892 25.4898 35.437 24.9375 35.437H13.0625C12.5102 35.437 12.0625 34.9892 12.0625 34.437ZM20.3695 7.44477C19.825 7.35247 19.3087 7.71906 19.2164 8.26357C19.1241 8.80809 19.4907 9.32434 20.0352 9.41664C21.2825 9.62807 22.4333 10.2214 23.329 11.1148C24.2247 12.0082 24.821 13.1576 25.0356 14.4043C25.1293 14.9485 25.6465 15.3138 26.1907 15.2201C26.735 15.1264 27.1003 14.6092 27.0066 14.065C26.7217 12.4102 25.9303 10.8846 24.7414 9.69879C23.5526 8.51298 22.025 7.72541 20.3695 7.44477Z'
fill='currentColor'
/>
</svg>
)
},
{
title: 'Course Completed',
value: '14',
color: 'warning',
icon: (
<svg xmlns='http://www.w3.org/2000/svg' width='38' height='38' viewBox='0 0 38 38' fill='none'>
<path
opacity='0.2'
d='M8.08984 29.9102C6.72422 28.5445 7.62969 25.6797 6.93203 24.0023C6.23438 22.325 3.5625 20.8555 3.5625 19C3.5625 17.1445 6.20469 15.7344 6.93203 13.9977C7.65938 12.2609 6.72422 9.45547 8.08984 8.08984C9.45547 6.72422 12.3203 7.62969 13.9977 6.93203C15.675 6.23438 17.1445 3.5625 19 3.5625C20.8555 3.5625 22.2656 6.20469 24.0023 6.93203C25.7391 7.65938 28.5445 6.72422 29.9102 8.08984C31.2758 9.45547 30.3703 12.3203 31.068 13.9977C31.7656 15.675 34.4375 17.1445 34.4375 19C34.4375 20.8555 31.7953 22.2656 31.068 24.0023C30.3406 25.7391 31.2758 28.5445 29.9102 29.9102C28.5445 31.2758 25.6797 30.3703 24.0023 31.068C22.325 31.7656 20.8555 34.4375 19 34.4375C17.1445 34.4375 15.7344 31.7953 13.9977 31.068C12.2609 30.3406 9.45547 31.2758 8.08984 29.9102Z'
fill='currentColor'
/>
<path
d='M25.5312 15.4375L16.818 23.75L12.4687 19.5937M8.08984 29.9102C6.72422 28.5445 7.62969 25.6797 6.93203 24.0023C6.23437 22.325 3.5625 20.8555 3.5625 19C3.5625 17.1445 6.20469 15.7344 6.93203 13.9977C7.65937 12.2609 6.72422 9.45547 8.08984 8.08984C9.45547 6.72422 12.3203 7.62969 13.9977 6.93203C15.675 6.23437 17.1445 3.5625 19 3.5625C20.8555 3.5625 22.2656 6.20469 24.0023 6.93203C25.7391 7.65937 28.5445 6.72422 29.9102 8.08984C31.2758 9.45547 30.3703 12.3203 31.068 13.9977C31.7656 15.675 34.4375 17.1445 34.4375 19C34.4375 20.8555 31.7953 22.2656 31.068 24.0023C30.3406 25.7391 31.2758 28.5445 29.9102 29.9102C28.5445 31.2758 25.6797 30.3703 24.0023 31.068C22.325 31.7656 20.8555 34.4375 19 34.4375C17.1445 34.4375 15.7344 31.7953 13.9977 31.068C12.2609 30.3406 9.45547 31.2758 8.08984 29.9102Z'
stroke='currentColor'
strokeWidth='2'
strokeLinecap='round'
strokeLinejoin='round'
/>
</svg>
)
}
]
const WelcomeCard = () => {
// Hooks
const theme = useTheme()
const belowMdScreen = useMediaQuery(theme.breakpoints.down('md'))
// Vars
const options: ApexOptions = {
chart: {
sparkline: { enabled: true }
},
grid: {
padding: {
left: 20,
right: 20
}
},
colors: [
darken(theme.palette.success.main, 0.15),
darken(theme.palette.success.main, 0.1),
'var(--mui-palette-success-main)',
lighten(theme.palette.success.main, 0.2),
lighten(theme.palette.success.main, 0.4),
lighten(theme.palette.success.main, 0.6)
],
stroke: { width: 0 },
legend: { show: false },
tooltip: { theme: 'false' },
dataLabels: { enabled: false },
labels: ['36h', '56h', '16h', '32h', '56h', '16h'],
states: {
hover: {
filter: { type: 'none' }
},
active: {
filter: { type: 'none' }
}
},
plotOptions: {
pie: {
customScale: 0.9,
donut: {
size: '70%',
labels: {
show: true,
name: {
offsetY: 20,
fontSize: '0.875rem'
},
value: {
offsetY: -15,
fontWeight: 500,
fontSize: '1.125rem',
formatter: value => `${value}%`,
color: 'var(--mui-palette-text-primary)'
},
total: {
show: true,
fontSize: '0.8125rem',
label: 'Total',
color: 'var(--mui-palette-text-disabled)',
formatter: () => '231h'
}
}
}
}
}
}
return (
<div className='flex max-md:flex-col md:items-center gap-6 plb-6'>
<div className='md:is-8/12'>
<div className='flex items-baseline gap-1 mbe-2'>
<Typography variant='h5'>Welcome back,</Typography>
<Typography variant='h4'>Felecia 👋🏻</Typography>
</div>
<div className='mbe-4'>
<Typography>Your progress this week is Awesome. let&apos;s keep it up</Typography>
<Typography>and get a lot of points reward!</Typography>
</div>
<div className='flex flex-wrap max-md:flex-col justify-between gap-6'>
{data.map((item, i) => (
<div key={i} className='flex gap-4'>
<CustomAvatar variant='rounded' skin='light' size={54} color={item.color}>
{item.icon}
</CustomAvatar>
<div>
<Typography className='font-medium'>{item.title}</Typography>
<Typography variant='h4' color={`${item.color}.main`}>
{item.value}
</Typography>
</div>
</div>
))}
</div>
</div>
<Divider orientation={belowMdScreen ? 'horizontal' : 'vertical'} flexItem />
<div className='flex justify-between md:is-4/12'>
<div className='flex flex-col justify-between gap-6'>
<div>
<Typography variant='h5' className='mbe-1'>
Time spendings
</Typography>
<Typography>Weekly report</Typography>
</div>
<div>
<Typography variant='h4' className='mbe-2'>
231<span className='text-textSecondary'>h</span> 14<span className='text-textSecondary'>m</span>
</Typography>
<Chip label='+18.4%' variant='tonal' size='small' color='success' />
</div>
</div>
<AppReactApexCharts type='donut' height={189} width={150} options={options} series={[23, 35, 10, 20, 35, 23]} />
</div>
</div>
)
}
export default WelcomeCard

View File

@ -1,85 +0,0 @@
// MUI Imports
import Grid from '@mui/material/Grid2'
import Button from '@mui/material/Button'
import Typography from '@mui/material/Typography'
import { useTheme } from '@mui/material/styles'
// Third-party Imports
import classnames from 'classnames'
// Types Imports
import type { ThemeColor } from '@core/types'
type DataType = {
title: string
description: string
type: string
image: string
color: ThemeColor
imageColorClass?: string
bgColorClass?: string
}
// Vars
const data: DataType[] = [
{
title: 'Earn a Certificate',
description: 'Get the right professional certificate program for you.',
type: 'Programs',
image: '/images/illustrations/characters/8.png',
color: 'primary',
imageColorClass: 'bg-primaryLight',
bgColorClass: 'bg-primaryLighter'
},
{
title: 'Best Rated Courses',
description: 'Enroll now in the most popular and best rated courses.',
type: 'Courses',
image: '/images/illustrations/characters/9.png',
color: 'error',
imageColorClass: 'bg-errorLight',
bgColorClass: 'bg-errorLighter'
}
]
const ColoredCards = () => {
// Hooks
const theme = useTheme()
return (
<Grid container spacing={6}>
{data.map((item, index) => (
<Grid size={{ xs: 12, md: 6 }} key={index}>
<div
className={classnames(
'flex max-sm:flex-col items-center sm:items-start justify-between gap-6 rounded p-6',
item.bgColorClass
)}
>
<div className='flex flex-col items-center sm:items-start max-sm:text-center'>
<Typography variant='h5' color={`${item.color}.main`} className='mbe-2'>
{item.title}
</Typography>
<Typography className='mbe-4'>{item.description}</Typography>
<Button variant='contained' size='small' color={item.color}>{`View ${item.type}`}</Button>
</div>
<div
className={classnames(
'flex justify-center rounded min-is-[180px] max-sm:-order-1 pbs-[7px]',
item.imageColorClass
)}
>
<img
src={item.image}
alt={item.title}
className={classnames('bs-[120px]', { 'scale-x-[-1]': theme.direction === 'rtl' })}
/>
</div>
</div>
</Grid>
))}
</Grid>
)
}
export default ColoredCards

View File

@ -1,231 +0,0 @@
// React Imports
import type { ChangeEvent } from 'react'
import { useState, useEffect } from 'react'
// Next Imports
import Link from 'next/link'
import { useParams } from 'next/navigation'
// MUI Imports
import Grid from '@mui/material/Grid2'
import Card from '@mui/material/Card'
import CardContent from '@mui/material/CardContent'
import Chip from '@mui/material/Chip'
import Button from '@mui/material/Button'
import FormControl from '@mui/material/FormControl'
import FormControlLabel from '@mui/material/FormControlLabel'
import LinearProgress from '@mui/material/LinearProgress'
import MenuItem from '@mui/material/MenuItem'
import Pagination from '@mui/material/Pagination'
import Select from '@mui/material/Select'
import Switch from '@mui/material/Switch'
import Typography from '@mui/material/Typography'
// Type Imports
import type { Course } from '@/types/apps/academyTypes'
import type { Locale } from '@configs/i18n'
import type { ThemeColor } from '@core/types'
// Component Imports
import DirectionalIcon from '@components/DirectionalIcon'
// Util Imports
import { getLocalizedUrl } from '@/utils/i18n'
type ChipColorType = {
color: ThemeColor
}
type Props = {
courseData?: Course[]
searchValue: string
}
const chipColor: { [key: string]: ChipColorType } = {
Web: { color: 'primary' },
Art: { color: 'success' },
'UI/UX': { color: 'error' },
Psychology: { color: 'warning' },
Design: { color: 'info' }
}
const Courses = (props: Props) => {
// Props
const { courseData, searchValue } = props
// States
const [course, setCourse] = useState<Course['tags']>('All')
const [hideCompleted, setHideCompleted] = useState(true)
const [data, setData] = useState<Course[]>([])
const [activePage, setActivePage] = useState(0)
// Hooks
const { lang: locale } = useParams()
useEffect(() => {
let newData =
courseData?.filter(courseItem => {
if (course === 'All') return !hideCompleted || courseItem.completedTasks !== courseItem.totalTasks
return courseItem.tags === course && (!hideCompleted || courseItem.completedTasks !== courseItem.totalTasks)
}) ?? []
if (searchValue) {
newData = newData.filter(category => category.courseTitle.toLowerCase().includes(searchValue.toLowerCase()))
}
if (activePage > Math.ceil(newData.length / 6)) setActivePage(0)
setData(newData)
}, [searchValue, activePage, course, hideCompleted, courseData])
const handleChange = (e: ChangeEvent<HTMLInputElement>) => {
setHideCompleted(e.target.checked)
setActivePage(0)
}
return (
<Card>
<CardContent className='flex flex-col gap-6'>
<div className='flex flex-wrap items-center justify-between gap-4'>
<div>
<Typography variant='h5'>My Courses</Typography>
<Typography>Total 6 course you have purchased</Typography>
</div>
<div className='flex flex-wrap items-center gap-y-4 gap-x-6'>
<FormControl fullWidth size='small' className='is-[250px] flex-auto'>
<Select
fullWidth
id='select-course'
value={course}
onChange={e => {
setCourse(e.target.value)
setActivePage(0)
}}
labelId='course-select'
>
<MenuItem value='All'>All Courses</MenuItem>
<MenuItem value='Web'>Web</MenuItem>
<MenuItem value='Art'>Art</MenuItem>
<MenuItem value='UI/UX'>UI/UX</MenuItem>
<MenuItem value='Psychology'>Psychology</MenuItem>
<MenuItem value='Design'>Design</MenuItem>
</Select>
</FormControl>
<FormControlLabel
control={<Switch onChange={handleChange} checked={hideCompleted} />}
label='Hide completed'
/>
</div>
</div>
{data.length > 0 ? (
<Grid container spacing={6}>
{data.slice(activePage * 6, activePage * 6 + 6).map((item, index) => (
<Grid size={{ xs: 12, sm: 6, md: 4 }} key={index}>
<div className='border rounded bs-full'>
<div className='pli-2 pbs-2'>
<Link href={getLocalizedUrl('/apps/academy/course-details', locale as Locale)} className='flex'>
<img src={item.tutorImg} alt={item.courseTitle} className='is-full' />
</Link>
</div>
<div className='flex flex-col gap-4 p-5'>
<div className='flex items-center justify-between'>
<Chip label={item.tags} variant='tonal' size='small' color={chipColor[item.tags].color} />
<div className='flex items-start'>
<Typography className='font-medium mie-1'>{item.rating}</Typography>
<i className='tabler-star-filled text-warning mie-2' />
<Typography>{`(${item.ratingCount})`}</Typography>
</div>
</div>
<div className='flex flex-col gap-1'>
<Typography
variant='h5'
component={Link}
href={getLocalizedUrl('/apps/academy/course-details', locale as Locale)}
className='hover:text-primary'
>
{item.courseTitle}
</Typography>
<Typography>{item.desc}</Typography>
</div>
<div className='flex flex-col gap-1'>
{item.completedTasks === item.totalTasks ? (
<div className='flex items-center gap-1'>
<i className='tabler-check text-xl text-success' />
<Typography color='success.main'>Completed</Typography>
</div>
) : (
<div className='flex items-center gap-1'>
<i className='tabler-clock text-xl' />
<Typography>{`${item.time}`}</Typography>
</div>
)}
<LinearProgress
color='primary'
value={Math.floor((item.completedTasks / item.totalTasks) * 100)}
variant='determinate'
className='is-full bs-2'
/>
</div>
{item.completedTasks === item.totalTasks ? (
<Button
variant='tonal'
startIcon={<i className='tabler-rotate-clockwise-2' />}
component={Link}
href={getLocalizedUrl('/apps/academy/course-details', locale as Locale)}
>
Start Over
</Button>
) : (
<div className='flex flex-wrap gap-4'>
<Button
fullWidth
variant='tonal'
color='secondary'
startIcon={<i className='tabler-rotate-clockwise-2' />}
component={Link}
href={getLocalizedUrl('/apps/academy/course-details', locale as Locale)}
className='is-auto flex-auto'
>
Start Over
</Button>
<Button
fullWidth
variant='tonal'
endIcon={
<DirectionalIcon ltrIconClass='tabler-chevron-right' rtlIconClass='tabler-chevron-left' />
}
component={Link}
href={getLocalizedUrl('/apps/academy/course-details', locale as Locale)}
className='is-auto flex-auto'
>
Continue
</Button>
</div>
)}
</div>
</div>
</Grid>
))}
</Grid>
) : (
<Typography className='text-center'>No courses found</Typography>
)}
<div className='flex justify-center'>
<Pagination
count={Math.ceil(data.length / 6)}
page={activePage + 1}
showFirstButton
showLastButton
shape='rounded'
variant='tonal'
color='primary'
onChange={(e, page) => setActivePage(page - 1)}
/>
</div>
</CardContent>
</Card>
)
}
export default Courses

View File

@ -1,94 +0,0 @@
// MUI Imports
import Grid from '@mui/material/Grid2'
import Card from '@mui/material/Card'
import CardContent from '@mui/material/CardContent'
import Button from '@mui/material/Button'
import Typography from '@mui/material/Typography'
// Third-party Imports
import ReactPlayer from '@/libs/ReactPlayer'
// Components Imports
import CustomAvatar from '@core/components/mui/Avatar'
import CustomIconButton from '@core/components/mui/IconButton'
const FreeCourses = () => {
return (
<Card>
<CardContent>
<Grid container spacing={6}>
<Grid size={{ xs: 12, md: 4 }}>
<div className='flex flex-col items-center justify-center gap-y-4 bs-full text-center'>
<CustomAvatar variant='rounded' skin='light' color='primary' size={52}>
<i className='tabler-gift text-4xl' />
</CustomAvatar>
<Typography variant='h4'>Today&apos;s Free Courses</Typography>
<Typography>
We offers 284 Free Online courses from top tutors and companies to help you start or advance your career
skills. Learn online for free and fast today!
</Typography>
<Button variant='contained'>Get Premium Courses</Button>
</div>
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<div className='border rounded bs-full'>
<div className='mli-2 mbs-2 overflow-hidden rounded'>
<ReactPlayer
playing
controls
url='https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4'
height={200}
className='bg-black !is-full'
light={
<img src='/images/apps/academy/7.png' alt='Thumbnail' className='is-full bs-full object-cover' />
}
playIcon={
<CustomIconButton variant='contained' color='error' className='absolute rounded-full'>
<i className='tabler-player-play' />
</CustomIconButton>
}
/>
</div>
<div className='flex flex-col gap-2 p-6'>
<Typography variant='h5'>Your First Singing Lesson</Typography>
<Typography>
In the same way as any other artistic domain, singing lends itself perfectly to self-teaching.
</Typography>
</div>
</div>
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<div className='border rounded bs-full'>
<div className='mli-2 mbs-2 overflow-hidden rounded'>
<ReactPlayer
playing
controls
url='https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4'
height={200}
className='bg-black !is-full'
light={
<img src='/images/apps/academy/8.png' alt='Thumbnail' className='is-full bs-full object-cover' />
}
playIcon={
<CustomIconButton variant='contained' color='error' className='absolute rounded-full'>
<i className='tabler-player-play' />
</CustomIconButton>
}
/>
</div>
<div className='flex flex-col gap-2 p-6'>
<Typography variant='h5'>Guitar for Beginners</Typography>
<Typography>
The Fender Acoustic Guitar is the best choice for both beginners and professionals offering a great
sound.
</Typography>
</div>
</div>
</Grid>
</Grid>
</CardContent>
</Card>
)
}
export default FreeCourses

View File

@ -1,70 +0,0 @@
// MUI Imports
import Card from '@mui/material/Card'
import Typography from '@mui/material/Typography'
import { useTheme } from '@mui/material/styles'
// Third-party Imports
import classnames from 'classnames'
// Type Imports
import type { Mode } from '@core/types'
// Component Imports
import CustomIconButton from '@core/components/mui/IconButton'
import CustomTextField from '@core/components/mui/TextField'
// Hook Imports
import { useImageVariant } from '@core/hooks/useImageVariant'
type Props = {
mode: Mode
searchValue: string
setSearchValue: (value: string) => void
}
const MyCourseHeader = (props: Props) => {
// Props
const { mode, searchValue, setSearchValue } = props
// Vars
const lightIllustration = '/images/apps/academy/hand-with-bulb-light.png'
const darkIllustration = '/images/apps/academy/hand-with-bulb-dark.png'
// Hooks
const theme = useTheme()
const leftIllustration = useImageVariant(mode, lightIllustration, darkIllustration)
return (
<Card className='relative flex justify-center'>
<img src={leftIllustration} className='max-md:hidden absolute max-is-[100px] top-12 start-12' />
<div className='flex flex-col items-center gap-4 max-md:pli-5 plb-12 md:is-1/2'>
<Typography variant='h4' className='text-center md:is-3/4'>
Education, talents, and career opportunities. <span className='text-primary'>All in one place.</span>
</Typography>
<Typography className='text-center'>
Grow your skill with the most reliable online courses and certifications in marketing, information technology,
programming, and data science.
</Typography>
<div className='flex items-center gap-4 max-sm:is-full'>
<CustomTextField
placeholder='Find your course'
value={searchValue}
onChange={e => setSearchValue(e.target.value)}
className='sm:is-[350px] max-sm:flex-1'
/>
<CustomIconButton variant='contained' color='primary'>
<i className='tabler-search' />
</CustomIconButton>
</div>
</div>
<img
src='/images/apps/academy/9.png'
className={classnames('max-md:hidden absolute max-bs-[180px] bottom-0 end-0', {
'scale-x-[-1]': theme.direction === 'rtl'
})}
/>
</Card>
)
}
export default MyCourseHeader

View File

@ -1,46 +0,0 @@
'use client'
// React Imports
import { useState } from 'react'
// MUI Imports
import Grid from '@mui/material/Grid2'
// Type Imports
import type { Mode } from '@core/types'
import type { Course } from '@/types/apps/academyTypes'
// Component Imports
import MyCourseHeader from './MyCourseHeader'
import Courses from './Courses'
import ColoredCards from './ColoredCards'
import FreeCourses from './FreeCourses'
type Props = {
courseData?: Course[]
mode: Mode
}
const AcademyMyCourse = ({ courseData, mode }: Props) => {
// States
const [searchValue, setSearchValue] = useState('')
return (
<Grid container spacing={6}>
<Grid size={{ xs: 12 }}>
<MyCourseHeader mode={mode} searchValue={searchValue} setSearchValue={setSearchValue} />
</Grid>
<Grid size={{ xs: 12 }}>
<Courses courseData={courseData} searchValue={searchValue} />
</Grid>
<Grid size={{ xs: 12 }}>
<ColoredCards />
</Grid>
<Grid size={{ xs: 12 }}>
<FreeCourses />
</Grid>
</Grid>
)
}
export default AcademyMyCourse

View File

@ -1,359 +0,0 @@
// React Imports
import { useState, useEffect, forwardRef, useCallback } from 'react'
// MUI Imports
import Box from '@mui/material/Box'
import Drawer from '@mui/material/Drawer'
import Switch from '@mui/material/Switch'
import Button from '@mui/material/Button'
import MenuItem from '@mui/material/MenuItem'
import IconButton from '@mui/material/IconButton'
import Typography from '@mui/material/Typography'
import useMediaQuery from '@mui/material/useMediaQuery'
import FormControl from '@mui/material/FormControl'
import FormControlLabel from '@mui/material/FormControlLabel'
import type { SelectChangeEvent } from '@mui/material/Select'
import type { Theme } from '@mui/material/styles'
// Third-party Imports
import { useForm, Controller } from 'react-hook-form'
import PerfectScrollbar from 'react-perfect-scrollbar'
// Type Imports
import type { AddEventSidebarType, AddEventType } from '@/types/apps/calendarTypes'
// Component Imports
import CustomTextField from '@core/components/mui/TextField'
// Styled Component Imports
import AppReactDatepicker from '@/libs/styles/AppReactDatepicker'
// Slice Imports
import { addEvent, deleteEvent, updateEvent, selectedEvent, filterEvents } from '@/redux-store/slices/calendar'
interface PickerProps {
label?: string
error?: boolean
registername?: string
}
interface DefaultStateType {
url: string
title: string
allDay: boolean
calendar: string
description: string
endDate: Date
startDate: Date
guests: string[] | undefined
}
// Vars
const capitalize = (string: string) => string && string[0].toUpperCase() + string.slice(1)
// Vars
const defaultState: DefaultStateType = {
url: '',
title: '',
guests: [],
allDay: true,
description: '',
endDate: new Date(),
calendar: 'Business',
startDate: new Date()
}
const AddEventSidebar = (props: AddEventSidebarType) => {
// Props
const { calendarStore, dispatch, addEventSidebarOpen, handleAddEventSidebarToggle } = props
// States
const [values, setValues] = useState<DefaultStateType>(defaultState)
// Refs
const PickersComponent = forwardRef(({ ...props }: PickerProps, ref) => {
return (
<CustomTextField
inputRef={ref}
fullWidth
{...props}
label={props.label || ''}
className='is-full'
error={props.error}
/>
)
})
// Hooks
const isBelowSmScreen = useMediaQuery((theme: Theme) => theme.breakpoints.down('sm'))
const {
control,
setValue,
clearErrors,
handleSubmit,
formState: { errors }
} = useForm({ defaultValues: { title: '' } })
const resetToStoredValues = useCallback(() => {
if (calendarStore.selectedEvent !== null) {
const event = calendarStore.selectedEvent
setValue('title', event.title || '')
setValues({
url: event.url || '',
title: event.title || '',
allDay: event.allDay,
guests: event.extendedProps.guests || [],
description: event.extendedProps.description || '',
calendar: event.extendedProps.calendar || 'Business',
endDate: event.end !== null ? event.end : event.start,
startDate: event.start !== null ? event.start : new Date()
})
}
}, [setValue, calendarStore.selectedEvent])
const resetToEmptyValues = useCallback(() => {
setValue('title', '')
setValues(defaultState)
}, [setValue])
const handleSidebarClose = () => {
setValues(defaultState)
clearErrors()
dispatch(selectedEvent(null))
handleAddEventSidebarToggle()
}
const onSubmit = (data: { title: string }) => {
const modifiedEvent: AddEventType = {
url: values.url,
display: 'block',
title: data.title,
end: values.endDate,
allDay: values.allDay,
start: values.startDate,
extendedProps: {
calendar: capitalize(values.calendar),
guests: values.guests && values.guests.length ? values.guests : undefined,
description: values.description.length ? values.description : undefined
}
}
if (
calendarStore.selectedEvent === null ||
(calendarStore.selectedEvent !== null && !calendarStore.selectedEvent.title.length)
) {
dispatch(addEvent(modifiedEvent))
} else {
dispatch(updateEvent({ ...modifiedEvent, id: calendarStore.selectedEvent.id }))
}
dispatch(filterEvents())
handleSidebarClose()
}
const handleDeleteButtonClick = () => {
if (calendarStore.selectedEvent) {
dispatch(deleteEvent(calendarStore.selectedEvent.id))
dispatch(filterEvents())
}
// calendarApi.getEventById(calendarStore.selectedEvent.id).remove()
handleSidebarClose()
}
const handleStartDate = (date: Date | null) => {
if (date && date > values.endDate) {
setValues({ ...values, startDate: new Date(date), endDate: new Date(date) })
}
}
const RenderSidebarFooter = () => {
if (
calendarStore.selectedEvent === null ||
(calendarStore.selectedEvent && !calendarStore.selectedEvent.title.length)
) {
return (
<div className='flex gap-4'>
<Button type='submit' variant='contained'>
Add
</Button>
<Button variant='outlined' color='secondary' onClick={resetToEmptyValues}>
Reset
</Button>
</div>
)
} else {
return (
<div className='flex gap-4'>
<Button type='submit' variant='contained'>
Update
</Button>
<Button variant='outlined' color='secondary' onClick={resetToStoredValues}>
Reset
</Button>
</div>
)
}
}
const ScrollWrapper = isBelowSmScreen ? 'div' : PerfectScrollbar
useEffect(() => {
if (calendarStore.selectedEvent !== null) {
resetToStoredValues()
} else {
resetToEmptyValues()
}
}, [addEventSidebarOpen, resetToStoredValues, resetToEmptyValues, calendarStore.selectedEvent])
return (
<Drawer
anchor='right'
open={addEventSidebarOpen}
onClose={handleSidebarClose}
ModalProps={{ keepMounted: true }}
sx={{ '& .MuiDrawer-paper': { width: ['100%', 400] } }}
>
<Box className='flex justify-between items-center sidebar-header plb-5 pli-6 border-be'>
<Typography variant='h5'>
{calendarStore.selectedEvent && calendarStore.selectedEvent.title.length ? 'Update Event' : 'Add Event'}
</Typography>
{calendarStore.selectedEvent && calendarStore.selectedEvent.title.length ? (
<Box className='flex items-center' sx={{ gap: calendarStore.selectedEvent !== null ? 1 : 0 }}>
<IconButton size='small' onClick={handleDeleteButtonClick}>
<i className='tabler-trash text-2xl text-textPrimary' />
</IconButton>
<IconButton size='small' onClick={handleSidebarClose}>
<i className='tabler-x text-2xl text-textPrimary' />
</IconButton>
</Box>
) : (
<IconButton size='small' onClick={handleSidebarClose}>
<i className='tabler-x text-2xl text-textPrimary' />
</IconButton>
)}
</Box>
<ScrollWrapper
{...(isBelowSmScreen
? { className: 'bs-full overflow-y-auto overflow-x-hidden' }
: { options: { wheelPropagation: false, suppressScrollX: true } })}
>
<Box className='sidebar-body plb-5 pli-6'>
<form onSubmit={handleSubmit(onSubmit)} autoComplete='off' className='flex flex-col gap-6'>
<Controller
name='title'
control={control}
rules={{ required: true }}
render={({ field: { value, onChange } }) => (
<CustomTextField
fullWidth
label='Title'
value={value}
onChange={onChange}
{...(errors.title && { error: true, helperText: 'This field is required' })}
/>
)}
/>
<CustomTextField
select
fullWidth
label='Calendar'
value={values.calendar}
onChange={e => setValues({ ...values, calendar: e.target.value })}
>
<MenuItem value='Personal'>Personal</MenuItem>
<MenuItem value='Business'>Business</MenuItem>
<MenuItem value='Family'>Family</MenuItem>
<MenuItem value='Holiday'>Holiday</MenuItem>
<MenuItem value='ETC'>ETC</MenuItem>
</CustomTextField>
<AppReactDatepicker
selectsStart
id='event-start-date'
endDate={values.endDate}
selected={values.startDate}
startDate={values.startDate}
showTimeSelect={!values.allDay}
dateFormat={!values.allDay ? 'yyyy-MM-dd hh:mm' : 'yyyy-MM-dd'}
customInput={<PickersComponent label='Start Date' registername='startDate' />}
onChange={(date: Date | null) => date !== null && setValues({ ...values, startDate: new Date(date) })}
onSelect={handleStartDate}
/>
<AppReactDatepicker
selectsEnd
id='event-end-date'
endDate={values.endDate}
selected={values.endDate}
minDate={values.startDate}
startDate={values.startDate}
showTimeSelect={!values.allDay}
dateFormat={!values.allDay ? 'yyyy-MM-dd hh:mm' : 'yyyy-MM-dd'}
customInput={<PickersComponent label='End Date' registername='endDate' />}
onChange={(date: Date | null) => date !== null && setValues({ ...values, endDate: new Date(date) })}
/>
<FormControl>
<FormControlLabel
label='All Day'
control={
<Switch checked={values.allDay} onChange={e => setValues({ ...values, allDay: e.target.checked })} />
}
/>
</FormControl>
<CustomTextField
fullWidth
type='url'
id='event-url'
label='Event URL'
value={values.url}
onChange={e => setValues({ ...values, url: e.target.value })}
/>
<CustomTextField
fullWidth
select
label='Guests'
value={values.guests}
id='event-guests-select'
// eslint-disable-next-line lines-around-comment
// @ts-ignore
onChange={(e: SelectChangeEvent<(typeof values)['guests']>) => {
setValues({
...values,
guests: typeof e.target.value === 'string' ? e.target.value.split(',') : e.target.value
})
}}
slotProps={{
select: {
multiple: true
}
}}
>
<MenuItem value='bruce'>Bruce</MenuItem>
<MenuItem value='clark'>Clark</MenuItem>
<MenuItem value='diana'>Diana</MenuItem>
<MenuItem value='john'>John</MenuItem>
<MenuItem value='barry'>Barry</MenuItem>
</CustomTextField>
<CustomTextField
rows={4}
multiline
fullWidth
label='Description'
id='event-description'
value={values.description}
onChange={e => setValues({ ...values, description: e.target.value })}
/>
<div className='flex items-center'>
<RenderSidebarFooter />
</div>
</form>
</Box>
</ScrollWrapper>
</Drawer>
)
}
export default AddEventSidebar

Some files were not shown because too many files have changed in this diff Show More