fix: clean folder
This commit is contained in:
parent
5f24ec7899
commit
a72a64215a
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
// Component Imports
|
|
||||||
import ChatWrapper from '@views/apps/chat'
|
|
||||||
|
|
||||||
const ChatApp = () => {
|
|
||||||
return <ChatWrapper />
|
|
||||||
}
|
|
||||||
|
|
||||||
export default ChatApp
|
|
||||||
@ -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
|
|
||||||
@ -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
|
||||||
|
|||||||
@ -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>
|
||||||
)
|
)
|
||||||
|
|||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
// Component Imports
|
|
||||||
import EmailWrapper from '@views/apps/email'
|
|
||||||
|
|
||||||
const EmailPage = () => {
|
|
||||||
return <EmailWrapper folder='inbox' />
|
|
||||||
}
|
|
||||||
|
|
||||||
export default EmailPage
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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>
|
||||||
)
|
)
|
||||||
|
|||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
// Component Imports
|
|
||||||
import AcademyDashboard from '../../apps/academy/dashboard/page'
|
|
||||||
|
|
||||||
const DashboardAcademy = async () => {
|
|
||||||
return <AcademyDashboard />
|
|
||||||
}
|
|
||||||
|
|
||||||
export default DashboardAcademy
|
|
||||||
@ -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>
|
||||||
)
|
)
|
||||||
|
|||||||
@ -1,7 +0,0 @@
|
|||||||
import LogisticsDashboard from '../../apps/logistics/dashboard/page'
|
|
||||||
|
|
||||||
const DashboardLogistics = () => {
|
|
||||||
return <LogisticsDashboard />
|
|
||||||
}
|
|
||||||
|
|
||||||
export default DashboardLogistics
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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's official docs for more details on component'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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
// Component Imports
|
|
||||||
import CheckoutWizard from '@views/pages/wizard-examples/checkout'
|
|
||||||
|
|
||||||
const CheckoutPage = () => {
|
|
||||||
return <CheckoutWizard />
|
|
||||||
}
|
|
||||||
|
|
||||||
export default CheckoutPage
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
// Component Imports
|
|
||||||
import CreateDeal from '@views/pages/wizard-examples/create-deal'
|
|
||||||
|
|
||||||
const CreateDealPage = () => {
|
|
||||||
return <CreateDeal />
|
|
||||||
}
|
|
||||||
|
|
||||||
export default CreateDealPage
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
// Component Imports
|
|
||||||
import PropertyListing from '@views/pages/wizard-examples/property-listing'
|
|
||||||
|
|
||||||
const PropertyListingPage = () => {
|
|
||||||
return <PropertyListing />
|
|
||||||
}
|
|
||||||
|
|
||||||
export default PropertyListingPage
|
|
||||||
@ -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
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
// Component Imports
|
|
||||||
import Checkout from '@views/front-pages/CheckoutPage'
|
|
||||||
|
|
||||||
const CheckoutPage = () => {
|
|
||||||
return <Checkout />
|
|
||||||
}
|
|
||||||
|
|
||||||
export default CheckoutPage
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
// Component Imports
|
|
||||||
import Questions from '@views/front-pages/help-center/Questions'
|
|
||||||
|
|
||||||
const Article = () => {
|
|
||||||
return <Questions />
|
|
||||||
}
|
|
||||||
|
|
||||||
export default Article
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
// Component Imports
|
|
||||||
import HelpCenterWrapper from '@views/front-pages/help-center'
|
|
||||||
|
|
||||||
function HelpCenterPage() {
|
|
||||||
return <HelpCenterWrapper />
|
|
||||||
}
|
|
||||||
|
|
||||||
export default HelpCenterPage
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
@ -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
|
||||||
|
|||||||
@ -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 }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@ -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
@ -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()}`
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@ -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)
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -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']
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@ -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'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@ -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 manufacturer’s warranty provided by us. To purchase or find out more about the extended warranty program, visit Extended Warranty section here.'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@ -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'
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@ -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 don’t 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'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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] }]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -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 })
|
||||||
})
|
})
|
||||||
|
|||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
41
src/redux-store/slices/customer.ts
Normal file
41
src/redux-store/slices/customer.ts
Normal 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
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
52
src/services/mutations/customers.ts
Normal file
52
src/services/mutations/customers.ts
Normal 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 }
|
||||||
|
}
|
||||||
36
src/services/queries/customers.ts
Normal file
36
src/services/queries/customers.ts
Normal 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
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
29
src/types/services/customer.ts
Normal file
29
src/types/services/customer.ts
Normal 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;
|
||||||
|
}
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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'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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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'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
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
@ -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
Loading…
x
Reference in New Issue
Block a user