diff --git a/src/components/Select.tsx b/src/components/Select.tsx index 4d0a614..d42a569 100644 --- a/src/components/Select.tsx +++ b/src/components/Select.tsx @@ -1,5 +1,6 @@ import { FC, SelectHTMLAttributes } from 'react' import { clx } from '../helpers/utils' +import { ArrowDown2 } from 'iconsax-react' export type ItemsSelectType = { value: string, @@ -23,7 +24,7 @@ const Select: FC = (props: Props) => { } + { props.error_text && props.error_text !== '' ?
diff --git a/src/config/Pages.ts b/src/config/Pages.ts index face8e3..912c635 100644 --- a/src/config/Pages.ts +++ b/src/config/Pages.ts @@ -12,8 +12,9 @@ export const Pages = { }, transactions: "/transactions", receipts: { - index: "/receipts", - detail: "/receipts/", + index: "/receipts/list", + detail: "/receipts/detail/", + create: "/receipts/create", }, ticket: { list: "/tickets", diff --git a/src/config/SideBarSubMenu.ts b/src/config/SideBarSubMenu.ts new file mode 100644 index 0000000..8f4557a --- /dev/null +++ b/src/config/SideBarSubMenu.ts @@ -0,0 +1,7 @@ +export const SideBarItemHasSubMenu = [ + "services", + "customers", + "receipts", + "users", + "transactions", +]; diff --git a/src/langs/fa.json b/src/langs/fa.json index ecf3347..18b0684 100644 --- a/src/langs/fa.json +++ b/src/langs/fa.json @@ -68,6 +68,9 @@ "setting": "تنظیمات", "logout": "خروج" }, + "submenu": { + "services_list": "لیست سرویس ها" + }, "header": { "search": "جستجو" }, @@ -240,7 +243,9 @@ "percent": "درصد" }, "receip": { + "receips": "صورتحساب ها", "receip_list": "لیست صورتحساب ها", + "add_receip": "افزودن صورتحساب", "dont_pay": "پرداخت نشده", "dont_confrim": "تایید نشده", "paid": "پرداخت شده", @@ -269,7 +274,19 @@ "date_factor": "تاریخ صدور فاکتور", "due_date": "تاریخ سررسید فاکتور", "factor_number": "شماره فاکتور", - "status_factor": "وضعیت فاکتور" + "status_factor": "وضعیت فاکتور", + "submit_receip": "ثبت صورتحساب", + "customer_information": "اطلاعات مشتری", + "customer": "مشتری", + "receipt_information": "اطلاعات صورتحساب", + "number": "شماره", + "product_name": "نام کالا", + "count": "تعداد", + "unit_amount": "مبلغ واحد", + "discount": "تخفیف(٪)", + "total_amount": "مبلغ کل(ریال)", + "tax": "مالیات بر ارزش افزوده (۰.۹ درصد)", + "total": "جمع" }, "edit": "ویرایش", "transaction": { diff --git a/src/pages/annoncement/Detail.tsx b/src/pages/annoncement/Detail.tsx index 1c32e7b..60ea2e4 100644 --- a/src/pages/annoncement/Detail.tsx +++ b/src/pages/annoncement/Detail.tsx @@ -2,6 +2,7 @@ import { FC } from 'react' import { useTranslation } from 'react-i18next' import StatusWithText from '../../components/StatusWithText' import { useNavigate } from 'react-router-dom' +import { ArrowLeft2 } from 'iconsax-react' const AnnouncementDetail: FC = () => { @@ -14,8 +15,9 @@ const AnnouncementDetail: FC = () => {
{t('announcement.text_announcement')}
-
navigate(-1)} className='text-xs font-extralight'> +
navigate(-1)} className='text-xs flex gap-0.5 items-center font-extralight'> {t('back')} +
diff --git a/src/pages/home/components/DanakLearning.tsx b/src/pages/home/components/DanakLearning.tsx index 580f1b2..e87affa 100644 --- a/src/pages/home/components/DanakLearning.tsx +++ b/src/pages/home/components/DanakLearning.tsx @@ -26,14 +26,14 @@ const DanakLearning: FC = () => {
-
+
لورم ایپسوم متن ساختگی با تولید سادگی
-
+
دیزاین ,
۲۴ دقیقه
-
+
آذر ماه 1403
diff --git a/src/pages/receipts/Create.tsx b/src/pages/receipts/Create.tsx new file mode 100644 index 0000000..d3cb775 --- /dev/null +++ b/src/pages/receipts/Create.tsx @@ -0,0 +1,224 @@ +import { FC } from 'react' +import { useTranslation } from 'react-i18next' +import Button from '../../components/Button' +import { Add, TickCircle, TickSquare } from 'iconsax-react' +import Select from '../../components/Select' +import Input from '../../components/Input' + +const CreateReceipt: FC = () => { + + const { t } = useTranslation('global') + + return ( +
+
+
+ {t('receip.add_receip')} +
+
+ +
+
+ +
+
+
+ {t('receip.customer_information')} +
+ +
+
+ +
+ +
+
+ {t('receip.count')} +
+ +
+ +
+
+ {t('receip.unit_amount')} +
+ +
+ +
+
+ {t('receip.discount')} +
+ +
+ +
+
+ {t('receip.total_amount')} +
+ +
+ +
+ +
+
+ +
+
+
+ {t('receip.tax')} +
+
+ 100,000 +
+
+
+
+ {t('receip.total')} +
+
+ 100,000 +
+
+
+ +
+ +
+
+ {t('ticket.title_hint')} +
+ +
+
+
+ +
+
+ سوالات - مشکلاتی که به یک موضوع مربوط میشوند را در یک درخواست پشتیبانی پیگیر باشید و چند درخواست برای یک موضوع باز نکنید. +
+
+
+
+ +
+
+ لطفاً برای بررسی و رفع مشکلات احتمالی صبور باشید بررسی و رفع مشکلات در برخی موارد زمان گیر است. +
+
+
+
+ +
+
+ پاسخگویی 24 ساعته تلفنی را تنها از میهن وب هاست می توانید انتظار داشته باشید .بخش پشتیبانی در هر ساعتی حتی در روز های تعطیل آماده پیگیری سریع مشکلات کاربران است. +
+
+
+
+
+
+ ) +} + +export default CreateReceipt \ No newline at end of file diff --git a/src/pages/service/MyServices.tsx b/src/pages/service/MyServices.tsx index 4313184..340330c 100644 --- a/src/pages/service/MyServices.tsx +++ b/src/pages/service/MyServices.tsx @@ -41,53 +41,49 @@ const MyServices: FC = () => {
- -
- + +
+ -
- -
1 {t('service.active_menu')}
-
+
1 {t('service.active_menu')}
+
+ + + + +
+ +
1 {t('service.active_menu')}
- -
- + +
+ -
- -
1 {t('service.active_menu')}
-
+
1 {t('service.active_menu')}
- -
- + +
+ -
- -
1 {t('service.active_menu')}
-
-
- - -
- -
- -
1 {t('service.active_menu')}
-
+
1 {t('service.active_menu')}
+
diff --git a/src/pages/setting/Setting.tsx b/src/pages/setting/Setting.tsx index 990f707..3f0c88f 100644 --- a/src/pages/setting/Setting.tsx +++ b/src/pages/setting/Setting.tsx @@ -45,104 +45,104 @@ const Setting: FC = () => {
-
+
{t('setting.notification_announcement')}
-
+
+
+ {t('setting.email')} +
{ }} /> -
- {t('setting.email')} -
-
+
+
+ {t('setting.sms')} +
{ }} /> -
- {t('setting.sms')} -
-
+
{t('setting.notification_announcement')}
-
+
+
+ {t('setting.email')} +
{ }} /> -
- {t('setting.email')} -
-
+
+
+ {t('setting.sms')} +
{ }} /> -
- {t('setting.sms')} -
-
+
{t('setting.notification_announcement')}
-
+
+
+ {t('setting.email')} +
{ }} /> -
- {t('setting.email')} -
-
+
+
+ {t('setting.sms')} +
{ }} /> -
- {t('setting.sms')} -
-
+
{t('setting.notification_announcement')}
-
+
+
+ {t('setting.email')} +
{ }} /> -
- {t('setting.email')} -
-
+
+
+ {t('setting.sms')} +
{ }} /> -
- {t('setting.sms')} -
diff --git a/src/router/Main.tsx b/src/router/Main.tsx index 3553c33..f387636 100644 --- a/src/router/Main.tsx +++ b/src/router/Main.tsx @@ -27,14 +27,25 @@ import OtherServices from '../pages/service/OtherServices' import Footer from '../shared/Footer' import AnnouncementDetail from '../pages/annoncement/Detail' import DetailService from '../pages/service/DetailService' +import { clx } from '../helpers/utils' +import { useSharedStore } from '../shared/store/sharedStore' +import CreateReceipt from '../pages/receipts/Create' const MainRouter: FC = () => { + + const { hasSubMenu } = useSharedStore() + return (
-
-
+
+
} /> @@ -53,6 +64,7 @@ const MainRouter: FC = () => { } /> } /> } /> + } /> } /> } /> } /> diff --git a/src/shared/Header.tsx b/src/shared/Header.tsx index e7e73fe..e1e404c 100644 --- a/src/shared/Header.tsx +++ b/src/shared/Header.tsx @@ -14,7 +14,7 @@ const Header: FC = () => { const { setOpenSidebar, openSidebar } = useSharedStore() return ( -
+
{
{/* */} -
- +
+ - +
-
+
diff --git a/src/shared/SideBar.tsx b/src/shared/SideBar.tsx index d655f59..ac32e6b 100644 --- a/src/shared/SideBar.tsx +++ b/src/shared/SideBar.tsx @@ -1,5 +1,6 @@ -import { FC } from 'react' +import { FC, useEffect } from 'react' import LogoImage from '../assets/images/logo.svg' +import LogoSmall from '../assets/images/logo-small.svg' import { useTranslation } from 'react-i18next' import { Card, Code, CodeCircle, DocumentLike, DocumentText, Element3, Home2, Logout, Messages3, NotificationStatus, People, Profile, Receipt21, Setting2, SmsTracking, Teacher, TicketDiscount, UserSquare } from 'iconsax-react' import SideBarItem from './SideBarItem' @@ -7,19 +8,43 @@ import { useLocation } from 'react-router-dom' import { Pages } from '../config/Pages' import { useSharedStore } from './store/sharedStore' import { clx } from '../helpers/utils' +import ServicesSubMenu from './components/ServicesSubMenu' +import { SideBarItemHasSubMenu } from '../config/SideBarSubMenu' +import TransactionsSubMenu from './components/TransactionsSubMenu' +import ReceiptSubMenu from './components/ReceiptSubMenu' const SideBar: FC = () => { const { t } = useTranslation('global') - const { openSidebar, setOpenSidebar } = useSharedStore() + const { openSidebar, setOpenSidebar, hasSubMenu, setSubMenuName, setSubtMenu, subMenuName } = useSharedStore() const location = useLocation() const isActive = (name: string) => { return location.pathname.includes(name) } + useEffect(() => { + + const split = location.pathname.split('/') + console.log('split', split); + + + if (SideBarItemHasSubMenu.includes(split[1])) { + setSubMenuName(split[1]) + setSubtMenu(true) + } else { + setSubMenuName('') + setSubtMenu(false) + } + + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [location.pathname]) + + const iconSizeSideBar = 20 + return ( <> { @@ -28,15 +53,24 @@ const SideBar: FC = () => {
- + { + !hasSubMenu ? + + : + + }
-
+
{t('sidebar.menu')}
@@ -52,6 +86,7 @@ const SideBar: FC = () => { title={t('sidebar.services')} isActive={isActive('services')} link={Pages.services.mine} + name='services' /> } @@ -105,7 +140,10 @@ const SideBar: FC = () => { />
-
+
{t('sidebar.other')}
@@ -129,7 +167,10 @@ const SideBar: FC = () => {
-
+
{t('sidebar.mnage_content')}
@@ -200,6 +241,22 @@ const SideBar: FC = () => {
+ + { + hasSubMenu && (openSidebar || window.innerWidth > 1000) && +
+ { + subMenuName === 'services' ? + + : + subMenuName === 'transactions' ? + + : subMenuName === 'receipts' ? + + : null + } +
+ } ) } diff --git a/src/shared/SideBarItem.tsx b/src/shared/SideBarItem.tsx index 271c00e..fd22bce 100644 --- a/src/shared/SideBarItem.tsx +++ b/src/shared/SideBarItem.tsx @@ -2,6 +2,7 @@ import { FC, ReactNode } from 'react' import { Link } from 'react-router-dom' import { clx } from '../helpers/utils' import { Pages } from '../config/Pages' +import { useSharedStore } from './store/sharedStore' type Props = { icon: ReactNode, @@ -9,22 +10,38 @@ type Props = { isActive: boolean, link: string, isLogout?: boolean, + name?: string } const SideBarItem: FC = (props: Props) => { + const { hasSubMenu, setSubMenuName, setSubtMenu } = useSharedStore() const handleLogout = () => { localStorage.removeItem(import.meta.env.VITE_TOKEN_NAME) window.location.href = Pages.auth.login } + const handleClick = () => { + if (props.name) { + setSubMenuName(props.name) + setSubtMenu(true) + } + } + return ( - +
-
+
{props.icon}
{props.title} diff --git a/src/shared/components/ReceiptSubMenu.tsx b/src/shared/components/ReceiptSubMenu.tsx new file mode 100644 index 0000000..d86c205 --- /dev/null +++ b/src/shared/components/ReceiptSubMenu.tsx @@ -0,0 +1,46 @@ +import { Receipt21 } from 'iconsax-react' +import { FC } from 'react' +import { useTranslation } from 'react-i18next' +import SubMenuItem from './SubMenuItem' +import { useLocation } from 'react-router-dom' +import { Pages } from '../../config/Pages' + +const ReceiptSubMenu: FC = () => { + + const location = useLocation() + const { t } = useTranslation('global') + + const isActive = (name: string) => { + return location.pathname.includes(name) + } + + return ( +
+
+ +
+ {t('receip.receips')} +
+
+ +
+ + +
+
+ ) +} + +export default ReceiptSubMenu \ No newline at end of file diff --git a/src/shared/components/ServicesSubMenu.tsx b/src/shared/components/ServicesSubMenu.tsx new file mode 100644 index 0000000..70a999c --- /dev/null +++ b/src/shared/components/ServicesSubMenu.tsx @@ -0,0 +1,41 @@ +import { Element3 } from 'iconsax-react' +import { FC } from 'react' +import { useTranslation } from 'react-i18next' +import SubMenuItem from './SubMenuItem' +import { useLocation } from 'react-router-dom' + +const ServicesSubMenu: FC = () => { + + const location = useLocation() + const { t } = useTranslation('global') + + + const isActive = (name: string) => { + return location.pathname.includes(name) + } + + return ( +
+
+ +
+ {t('sidebar.services')} +
+
+ +
+ +
+
+ ) +} + +export default ServicesSubMenu \ No newline at end of file diff --git a/src/shared/components/SubMenuItem.tsx b/src/shared/components/SubMenuItem.tsx new file mode 100644 index 0000000..59451f4 --- /dev/null +++ b/src/shared/components/SubMenuItem.tsx @@ -0,0 +1,33 @@ +import { FC } from 'react' +import { Link } from 'react-router-dom' +import { clx } from '../../helpers/utils' + +type Props = { + title: string, + isActive: boolean, + link: string, + isLogout?: boolean, +} + +const SubMenuItem: FC = (props: Props) => { + return ( + +
+
+
+ {props.title} +
+
+ + + ) +} + +export default SubMenuItem \ No newline at end of file diff --git a/src/shared/components/TransactionsSubMenu.tsx b/src/shared/components/TransactionsSubMenu.tsx new file mode 100644 index 0000000..20e3f23 --- /dev/null +++ b/src/shared/components/TransactionsSubMenu.tsx @@ -0,0 +1,38 @@ +import { Card } from 'iconsax-react' +import { FC } from 'react' +import { useTranslation } from 'react-i18next' +import SubMenuItem from './SubMenuItem' + +const TransactionsSubMenu: FC = () => { + + const { t } = useTranslation('global') + + const isActive = (name: string) => { + return location.pathname.includes(name) + } + + return ( +
+
+ +
+ {t('sidebar.transactions')} +
+
+ +
+ +
+
+ ) +} + +export default TransactionsSubMenu \ No newline at end of file diff --git a/src/shared/store/sharedStore.ts b/src/shared/store/sharedStore.ts index 731c65a..d5c810c 100644 --- a/src/shared/store/sharedStore.ts +++ b/src/shared/store/sharedStore.ts @@ -4,4 +4,8 @@ import { SharedStoreType } from "../types/SharedTypes"; export const useSharedStore = create((set) => ({ openSidebar: false, setOpenSidebar: (value) => set({ openSidebar: value }), + hasSubMenu: false, + setSubtMenu: (value: boolean) => set({ hasSubMenu: value }), + subMenuName: "", + setSubMenuName: (value: string) => set({ subMenuName: value }), })); diff --git a/src/shared/types/SharedTypes.ts b/src/shared/types/SharedTypes.ts index b681e51..1b7e445 100644 --- a/src/shared/types/SharedTypes.ts +++ b/src/shared/types/SharedTypes.ts @@ -1,4 +1,8 @@ export type SharedStoreType = { openSidebar: boolean; setOpenSidebar: (value: boolean) => void; + hasSubMenu: boolean; + setSubtMenu: (value: boolean) => void; + subMenuName: string; + setSubMenuName: (value: string) => void; };