diff --git a/jsconfig.json b/jsconfig.json index f6a30b1..fcd02aa 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -1,8 +1,12 @@ { "compilerOptions": { "paths": { - "@/*": ["./src/*"], - "&/*": ["./public/*"], + "@/*": [ + "./src/*" + ], + "&/*": [ + "./public/*" + ] } } } diff --git a/next.config.js b/next.config.js index 03fb527..409876a 100644 --- a/next.config.js +++ b/next.config.js @@ -1,12 +1,12 @@ /** @type {import('next').NextConfig} */ const nextConfig = { - reactStrictMode: true, - i18n: { - defaultLocale: 'fa', - locales: ['fa'], - localeDetection: false, - }, + reactStrictMode: true, + i18n: { + defaultLocale: 'fa', + locales: ['fa'], + localeDetection: false, + }, } module.exports = nextConfig diff --git a/public/fontiran.scss b/public/fontiran.scss index 33b59b4..86d585d 100644 --- a/public/fontiran.scss +++ b/public/fontiran.scss @@ -17,145 +17,153 @@ This set of fonts are used in this project under the license: (.....) * **/ @font-face { - font-family: IRANSansFaNum; - font-style: normal; - font-weight: 900; - src: url('./fonts/eot/IRANSansWeb(FaNum)_Black.eot'); - src: url('./fonts/eot/IRANSansWeb(FaNum)_Black.eot?#iefix') format('embedded-opentype'),/* IE6-8 */ - url('./fonts/woff2/IRANSansWeb(FaNum)_Black.woff2') format('woff2'),/* FF39+,Chrome36+, Opera24+*/ - url('./fonts/woff/IRANSansWeb(FaNum)_Black.woff') format('woff'),/* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('./fonts/ttf/IRANSansWeb(FaNum)_Black.ttf') format('truetype'); + font-family: IRANSansFaNum; + font-style: normal; + font-weight: 900; + src: url('./fonts/eot/IRANSansWeb(FaNum)_Black.eot'); + src: url('./fonts/eot/IRANSansWeb(FaNum)_Black.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('./fonts/woff2/IRANSansWeb(FaNum)_Black.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('./fonts/woff/IRANSansWeb(FaNum)_Black.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('./fonts/ttf/IRANSansWeb(FaNum)_Black.ttf') format('truetype'); } @font-face { - font-family: IRANSansFaNum; - font-style: normal; - font-weight: bold; - src: url('./fonts/eot/IRANSansWeb(FaNum)_Bold.eot'); - src: url('./fonts/eot/IRANSansWeb(FaNum)_Bold.eot?#iefix') format('embedded-opentype'),/* IE6-8 */ - url('./fonts/woff2/IRANSansWeb(FaNum)_Bold.woff2') format('woff2'),/* FF39+,Chrome36+, Opera24+*/ - url('./fonts/woff/IRANSansWeb(FaNum)_Bold.woff') format('woff'),/* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('./fonts/ttf/IRANSansWeb(FaNum)_Bold.ttf') format('truetype'); + font-family: IRANSansFaNum; + font-style: normal; + font-weight: bold; + src: url('./fonts/eot/IRANSansWeb(FaNum)_Bold.eot'); + src: url('./fonts/eot/IRANSansWeb(FaNum)_Bold.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('./fonts/woff2/IRANSansWeb(FaNum)_Bold.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('./fonts/woff/IRANSansWeb(FaNum)_Bold.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('./fonts/ttf/IRANSansWeb(FaNum)_Bold.ttf') format('truetype'); } @font-face { - font-family: IRANSansFaNum; - font-style: normal; - font-weight: 500; - src: url('./fonts/eot/IRANSansWeb(FaNum)_Medium.eot'); - src: url('./fonts/eot/IRANSansWeb(FaNum)_Medium.eot?#iefix') format('embedded-opentype'),/* IE6-8 */ - url('./fonts/woff2/IRANSansWeb(FaNum)_Medium.woff2') format('woff2'),/* FF39+,Chrome36+, Opera24+*/ - url('./fonts/woff/IRANSansWeb(FaNum)_Medium.woff') format('woff'),/* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('./fonts/ttf/IRANSansWeb(FaNum)_Medium.ttf') format('truetype'); + font-family: IRANSansFaNum; + font-style: normal; + font-weight: 500; + src: url('./fonts/eot/IRANSansWeb(FaNum)_Medium.eot'); + src: url('./fonts/eot/IRANSansWeb(FaNum)_Medium.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('./fonts/woff2/IRANSansWeb(FaNum)_Medium.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('./fonts/woff/IRANSansWeb(FaNum)_Medium.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('./fonts/ttf/IRANSansWeb(FaNum)_Medium.ttf') format('truetype'); } @font-face { - font-family: IRANSansFaNum; - font-style: normal; - font-weight: 300; - src: url('./fonts/eot/IRANSansWeb(FaNum)_Light.eot'); - src: url('./fonts/eot/IRANSansWeb(FaNum)_Light.eot?#iefix') format('embedded-opentype'),/* IE6-8 */ - url('./fonts/woff2/IRANSansWeb(FaNum)_Light.woff2') format('woff2'),/* FF39+,Chrome36+, Opera24+*/ - url('./fonts/woff/IRANSansWeb(FaNum)_Light.woff') format('woff'),/* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('./fonts/ttf/IRANSansWeb(FaNum)_Light.ttf') format('truetype'); + font-family: IRANSansFaNum; + font-style: normal; + font-weight: 300; + src: url('./fonts/eot/IRANSansWeb(FaNum)_Light.eot'); + src: url('./fonts/eot/IRANSansWeb(FaNum)_Light.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('./fonts/woff2/IRANSansWeb(FaNum)_Light.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('./fonts/woff/IRANSansWeb(FaNum)_Light.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('./fonts/ttf/IRANSansWeb(FaNum)_Light.ttf') format('truetype'); } @font-face { - font-family: IRANSansFaNum; - font-style: normal; - font-weight: 200; - src: url('./fonts/eot/IRANSansWeb(FaNum)_UltraLight.eot'); - src: url('./fonts/eot/IRANSansWeb(FaNum)_UltraLight.eot?#iefix') format('embedded-opentype'),/* IE6-8 */ - url('./fonts/woff2/IRANSansWeb(FaNum)_UltraLight.woff2') format('woff2'),/* FF39+,Chrome36+, Opera24+*/ - url('./fonts/woff/IRANSansWeb(FaNum)_UltraLight.woff') format('woff'),/* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('./fonts/ttf/IRANSansWeb(FaNum)_UltraLight.ttf') format('truetype'); + font-family: IRANSansFaNum; + font-style: normal; + font-weight: 200; + src: url('./fonts/eot/IRANSansWeb(FaNum)_UltraLight.eot'); + src: url('./fonts/eot/IRANSansWeb(FaNum)_UltraLight.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('./fonts/woff2/IRANSansWeb(FaNum)_UltraLight.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('./fonts/woff/IRANSansWeb(FaNum)_UltraLight.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('./fonts/ttf/IRANSansWeb(FaNum)_UltraLight.ttf') format('truetype'); } @font-face { - font-family: IRANSansFaNum; - font-style: normal; - font-weight: normal; - src: url('./fonts/eot/IRANSansWeb(FaNum).eot'); - src: url('./fonts/eot/IRANSansWeb(FaNum).eot?#iefix') format('embedded-opentype'),/* IE6-8 */ - url('./fonts/woff2/IRANSansWeb(FaNum).woff2') format('woff2'),/* FF39+,Chrome36+, Opera24+*/ - url('./fonts/woff/IRANSansWeb(FaNum).woff') format('woff'),/* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('./fonts/ttf/IRANSansWeb(FaNum).ttf') format('truetype'); + font-family: IRANSansFaNum; + font-style: normal; + font-weight: normal; + src: url('./fonts/eot/IRANSansWeb(FaNum).eot'); + src: url('./fonts/eot/IRANSansWeb(FaNum).eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('./fonts/woff2/IRANSansWeb(FaNum).woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('./fonts/woff/IRANSansWeb(FaNum).woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('./fonts/ttf/IRANSansWeb(FaNum).ttf') format('truetype'); } + @font-face { - font-family: IRANSans; - font-style: normal; - font-weight: 900; - src: url('./fonts/eot/IRANSansWeb_Black.eot'); - src: url('./fonts/eot/IRANSansWeb_Black.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ - url('./fonts/woff2/IRANSansWeb_Black.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ - url('./fonts/woff/IRANSansWeb_Black.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('./fonts/ttf/IRANSansWeb_Black.ttf') format('truetype'); + font-family: IRANSans; + font-style: normal; + font-weight: 900; + src: url('./fonts/eot/IRANSansWeb_Black.eot'); + src: url('./fonts/eot/IRANSansWeb_Black.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('./fonts/woff2/IRANSansWeb_Black.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('./fonts/woff/IRANSansWeb_Black.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('./fonts/ttf/IRANSansWeb_Black.ttf') format('truetype'); } + @font-face { - font-family: IRANSans; - font-style: normal; - font-weight: bold; - src: url('./fonts/eot/IRANSansWeb_Bold.eot'); - src: url('./fonts/eot/IRANSansWeb_Bold.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ - url('./fonts/woff2/IRANSansWeb_Bold.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ - url('./fonts/woff/IRANSansWeb_Bold.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('./fonts/ttf/IRANSansWeb_Bold.ttf') format('truetype'); + font-family: IRANSans; + font-style: normal; + font-weight: bold; + src: url('./fonts/eot/IRANSansWeb_Bold.eot'); + src: url('./fonts/eot/IRANSansWeb_Bold.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('./fonts/woff2/IRANSansWeb_Bold.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('./fonts/woff/IRANSansWeb_Bold.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('./fonts/ttf/IRANSansWeb_Bold.ttf') format('truetype'); } + @font-face { - font-family: IRANSans; - font-style: normal; - font-weight: 500; - src: url('./fonts/eot/IRANSansWeb_Medium.eot'); - src: url('./fonts/eot/IRANSansWeb_Medium.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ - url('./fonts/woff2/IRANSansWeb_Medium.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ - url('./fonts/woff/IRANSansWeb_Medium.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('./fonts/ttf/IRANSansWeb_Medium.ttf') format('truetype'); + font-family: IRANSans; + font-style: normal; + font-weight: 500; + src: url('./fonts/eot/IRANSansWeb_Medium.eot'); + src: url('./fonts/eot/IRANSansWeb_Medium.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('./fonts/woff2/IRANSansWeb_Medium.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('./fonts/woff/IRANSansWeb_Medium.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('./fonts/ttf/IRANSansWeb_Medium.ttf') format('truetype'); } + @font-face { - font-family: IRANSans; - font-style: normal; - font-weight: 300; - src: url('./fonts/eot/IRANSansWeb_Light.eot'); - src: url('./fonts/eot/IRANSansWeb_Light.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ - url('./fonts/woff2/IRANSansWeb_Light.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ - url('./fonts/woff/IRANSansWeb_Light.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('./fonts/ttf/IRANSansWeb_Light.ttf') format('truetype'); + font-family: IRANSans; + font-style: normal; + font-weight: 300; + src: url('./fonts/eot/IRANSansWeb_Light.eot'); + src: url('./fonts/eot/IRANSansWeb_Light.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('./fonts/woff2/IRANSansWeb_Light.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('./fonts/woff/IRANSansWeb_Light.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('./fonts/ttf/IRANSansWeb_Light.ttf') format('truetype'); } + @font-face { - font-family: IRANSans; - font-style: normal; - font-weight: 200; - src: url('./fonts/eot/IRANSansWeb_UltraLight.eot'); - src: url('./fonts/eot/IRANSansWeb_UltraLight.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ - url('./fonts/woff2/IRANSansWeb_UltraLight.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ - url('./fonts/woff/IRANSansWeb_UltraLight.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('./fonts/ttf/IRANSansWeb_UltraLight.ttf') format('truetype'); + font-family: IRANSans; + font-style: normal; + font-weight: 200; + src: url('./fonts/eot/IRANSansWeb_UltraLight.eot'); + src: url('./fonts/eot/IRANSansWeb_UltraLight.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('./fonts/woff2/IRANSansWeb_UltraLight.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('./fonts/woff/IRANSansWeb_UltraLight.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('./fonts/ttf/IRANSansWeb_UltraLight.ttf') format('truetype'); } + @font-face { - font-family: IRANSans; - font-style: normal; - font-weight: normal; - src: url('./fonts/eot/IRANSansWeb.eot'); - src: url('./fonts/eot/IRANSansWeb.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ - url('./fonts/woff2/IRANSansWeb.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ - url('./fonts/woff/IRANSansWeb.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('./fonts/ttf/IRANSansWeb.ttf') format('truetype'); + font-family: IRANSans; + font-style: normal; + font-weight: normal; + src: url('./fonts/eot/IRANSansWeb.eot'); + src: url('./fonts/eot/IRANSansWeb.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('./fonts/woff2/IRANSansWeb.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('./fonts/woff/IRANSansWeb.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('./fonts/ttf/IRANSansWeb.ttf') format('truetype'); } + @font-face { - font-family: Parastoo; - font-style: normal; - font-weight: normal; - src: url('./fonts/eot/Parastoo.eot'); - src: url('./fonts/eot/Parastoo.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ - url('./fonts/woff/Parastoo.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('./fonts/ttf/Parastoo.ttf') format('truetype'); + font-family: Parastoo; + font-style: normal; + font-weight: normal; + src: url('./fonts/eot/Parastoo.eot'); + src: url('./fonts/eot/Parastoo.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('./fonts/woff/Parastoo.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('./fonts/ttf/Parastoo.ttf') format('truetype'); } + @font-face { - font-family: Parastoo; - font-style: normal; - font-weight: bold; - src: url('./fonts/eot/Parastoo-Bold.eot'); - src: url('./fonts/eot/Parastoo-Bold.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ - url('./fonts/woff/Parastoo-Bold.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('./fonts/ttf/Parastoo-Bold.ttf') format('truetype'); + font-family: Parastoo; + font-style: normal; + font-weight: bold; + src: url('./fonts/eot/Parastoo-Bold.eot'); + src: url('./fonts/eot/Parastoo-Bold.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('./fonts/woff/Parastoo-Bold.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('./fonts/ttf/Parastoo-Bold.ttf') format('truetype'); } diff --git a/public/images/change-password.svg b/public/images/change-password.svg index f3b65aa..d940442 100644 --- a/public/images/change-password.svg +++ b/public/images/change-password.svg @@ -1 +1,64 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/dashboard.svg b/public/images/dashboard.svg index ea3f11b..f7c0340 100644 --- a/public/images/dashboard.svg +++ b/public/images/dashboard.svg @@ -1 +1,104 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/loading_logo.svg b/public/images/loading_logo.svg index 48fde43..ba14232 100644 --- a/public/images/loading_logo.svg +++ b/public/images/loading_logo.svg @@ -1 +1,121 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/login.svg b/public/images/login.svg index e2854d2..cd7e24e 100644 --- a/public/images/login.svg +++ b/public/images/login.svg @@ -1 +1,60 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/logo.svg b/public/images/logo.svg index 5931dd4..eebb9fa 100644 --- a/public/images/logo.svg +++ b/public/images/logo.svg @@ -1,10 +1,19 @@ - - - - - + + + + + + + + MARHABA + - MARHABA - diff --git a/public/locales/fa/datatable.js b/public/locales/fa/datatable.js index 819a84b..fd43663 100644 --- a/public/locales/fa/datatable.js +++ b/public/locales/fa/datatable.js @@ -1,92 +1,92 @@ export const FA_DATATABLE_LOCALIZATION = { - actions: "عملیات", - and: "و", - cancel: "لغو", - changeFilterMode: "تغییر حالت فیلتر", - changeSearchMode: "تغییر حالت جستجو", - clearFilter: "پاک کردن فیلتر", - clearSearch: "پاک کردن جستجو", - clearSort: "پاک کردن مرتب سازی", - clickToCopy: "کلیک برای کپی", - collapse: "جمع شدن", - collapseAll: "جمع شدن همه", - columnActions: "عملیات ستون", - copiedToClipboard: "کپی شد", - dropToGroupBy: "رها کردن برای گروه بندی بر اساس {column}", - edit: "ویرایش", - expand: "باز شدن", - expandAll: "باز شدن همه", - filterArrIncludes: "شامل", - filterArrIncludesAll: "شامل همه", - filterArrIncludesSome: "شامل", - filterBetween: "میان", - filterBetweenInclusive: "میان با احتساب هر دو", - filterByColumn: "فیلتر بر اساس {column}", - filterContains: "شامل", - filterEmpty: "خالی", - filterEndsWith: "به پایان می‌رسد با", - filterEquals: "برابر", - filterEqualsString: "برابر", - filterFuzzy: "نزدیک", - filterGreaterThan: "بزرگتر از", - filterGreaterThanOrEqualTo: "بزرگتر یا مساوی", - filterInNumberRange: "میان", - filterIncludesString: "شامل", - filterIncludesStringSensitive: "شامل", - filterLessThan: "کوچکتر از", - filterLessThanOrEqualTo: "کوچکتر یا مساوی", - filterMode: "حالت فیلتر: {filterType}", - filterNotEmpty: "غیر خالی", - filterNotEquals: "نا برابر", - filterStartsWith: "شروع می‌شود با", - filterWeakEquals: "برابر", - filteringByColumn: "فیلتر بر اساس {column} - {filterType} {filterValue}", - goToFirstPage: "رفتن به صفحه اول", - goToLastPage: "رفتن به صفحه آخر", - goToNextPage: "رفتن به صفحه بعدی", - goToPreviousPage: "رفتن به صفحه قبلی", - grab: "گرفتن", - groupByColumn: "گروه بندی بر اساس {column}", - groupedBy: "گروه بندی شده بر اساس", - hideAll: "پنهان کردن همه", - hideColumn: "پنهان کردن ستون {column}", - max: "حداکثر", - min: "حداقل", - move: "انتقال", - noRecordsToDisplay: "هیچ رکوردی برای نمایش وجود ندارد", - noResultsFound: "نتیجه‌ای یافت نشد", - of: "از", - or: "یا", - pinToLeft: "چسباندن به سمت چپ", - pinToRight: "چسباندن به سمت راست", - resetColumnSize: "بازنشانی اندازه ستون", - resetOrder: "بازنشانی ترتیب", - rowActions: "عملیات ردیف", - rowNumber: "#", - rowNumbers: "شماره ردیف", - rowsPerPage: "ردیف در هر صفحه", - save: "ذخیره", - search: "جستجو", - selectedCountOfRowCountRowsSelected: - "{selectedCount} از {rowCount} ردیف انتخاب شده", - select: "انتخاب", - showAll: "نمایش همه", - showAllColumns: "نمایش همه ستون‌ها", - showHideColumns: "نمایش/مخفی کردن ستون‌ها", - showHideFilters: "نمایش/مخفی کردن فیلترها", - showHideSearch: "نمایش/مخفی کردن جستجو", - sortByColumnAsc: "مرتب سازی بر اساس {column} صعودی", - sortByColumnDesc: "مرتب سازی بر اساس {column} نزولی", - sortedByColumnAsc: "مرتب شده بر اساس {column} صعودی", - sortedByColumnDesc: "مرتب شده بر اساس {column} نزولی", - thenBy: "، سپس بر اساس ", - toggleDensity: "تغییر تراکم", - toggleFullScreen: "تغییر حالت تمام صفحه", - toggleSelectAll: "انتخاب/عدم انتخاب همه", - toggleSelectRow: "انتخاب/عدم انتخاب ردیف", - toggleVisibility: "تغییر پیدا/پنهان", - ungroupByColumn: "لغو گروه بندی بر اساس {column}", - unpin: "رها کردن", - unpinAll: "رها کردن همه", - unsorted: "بدون مرتب سازی", + actions: "عملیات", + and: "و", + cancel: "لغو", + changeFilterMode: "تغییر حالت فیلتر", + changeSearchMode: "تغییر حالت جستجو", + clearFilter: "پاک کردن فیلتر", + clearSearch: "پاک کردن جستجو", + clearSort: "پاک کردن مرتب سازی", + clickToCopy: "کلیک برای کپی", + collapse: "جمع شدن", + collapseAll: "جمع شدن همه", + columnActions: "عملیات ستون", + copiedToClipboard: "کپی شد", + dropToGroupBy: "رها کردن برای گروه بندی بر اساس {column}", + edit: "ویرایش", + expand: "باز شدن", + expandAll: "باز شدن همه", + filterArrIncludes: "شامل", + filterArrIncludesAll: "شامل همه", + filterArrIncludesSome: "شامل", + filterBetween: "میان", + filterBetweenInclusive: "میان با احتساب هر دو", + filterByColumn: "فیلتر بر اساس {column}", + filterContains: "شامل", + filterEmpty: "خالی", + filterEndsWith: "به پایان می‌رسد با", + filterEquals: "برابر", + filterEqualsString: "برابر", + filterFuzzy: "نزدیک", + filterGreaterThan: "بزرگتر از", + filterGreaterThanOrEqualTo: "بزرگتر یا مساوی", + filterInNumberRange: "میان", + filterIncludesString: "شامل", + filterIncludesStringSensitive: "شامل", + filterLessThan: "کوچکتر از", + filterLessThanOrEqualTo: "کوچکتر یا مساوی", + filterMode: "حالت فیلتر: {filterType}", + filterNotEmpty: "غیر خالی", + filterNotEquals: "نا برابر", + filterStartsWith: "شروع می‌شود با", + filterWeakEquals: "برابر", + filteringByColumn: "فیلتر بر اساس {column} - {filterType} {filterValue}", + goToFirstPage: "رفتن به صفحه اول", + goToLastPage: "رفتن به صفحه آخر", + goToNextPage: "رفتن به صفحه بعدی", + goToPreviousPage: "رفتن به صفحه قبلی", + grab: "گرفتن", + groupByColumn: "گروه بندی بر اساس {column}", + groupedBy: "گروه بندی شده بر اساس", + hideAll: "پنهان کردن همه", + hideColumn: "پنهان کردن ستون {column}", + max: "حداکثر", + min: "حداقل", + move: "انتقال", + noRecordsToDisplay: "هیچ رکوردی برای نمایش وجود ندارد", + noResultsFound: "نتیجه‌ای یافت نشد", + of: "از", + or: "یا", + pinToLeft: "چسباندن به سمت چپ", + pinToRight: "چسباندن به سمت راست", + resetColumnSize: "بازنشانی اندازه ستون", + resetOrder: "بازنشانی ترتیب", + rowActions: "عملیات ردیف", + rowNumber: "#", + rowNumbers: "شماره ردیف", + rowsPerPage: "ردیف در هر صفحه", + save: "ذخیره", + search: "جستجو", + selectedCountOfRowCountRowsSelected: + "{selectedCount} از {rowCount} ردیف انتخاب شده", + select: "انتخاب", + showAll: "نمایش همه", + showAllColumns: "نمایش همه ستون‌ها", + showHideColumns: "نمایش/مخفی کردن ستون‌ها", + showHideFilters: "نمایش/مخفی کردن فیلترها", + showHideSearch: "نمایش/مخفی کردن جستجو", + sortByColumnAsc: "مرتب سازی بر اساس {column} صعودی", + sortByColumnDesc: "مرتب سازی بر اساس {column} نزولی", + sortedByColumnAsc: "مرتب شده بر اساس {column} صعودی", + sortedByColumnDesc: "مرتب شده بر اساس {column} نزولی", + thenBy: "، سپس بر اساس ", + toggleDensity: "تغییر تراکم", + toggleFullScreen: "تغییر حالت تمام صفحه", + toggleSelectAll: "انتخاب/عدم انتخاب همه", + toggleSelectRow: "انتخاب/عدم انتخاب ردیف", + toggleVisibility: "تغییر پیدا/پنهان", + ungroupByColumn: "لغو گروه بندی بر اساس {column}", + unpin: "رها کردن", + unpinAll: "رها کردن همه", + unsorted: "بدون مرتب سازی", }; diff --git a/src/components/dashboard/change-password/index.jsx b/src/components/dashboard/change-password/index.jsx index c2b5fd4..4583549 100644 --- a/src/components/dashboard/change-password/index.jsx +++ b/src/components/dashboard/change-password/index.jsx @@ -1,184 +1,177 @@ import CenterLayout from "@/layouts/CenterLayout"; import DashboardLayouts from "@/layouts/dashboardLayouts"; -import { - Button, - Typography, - Stack, - Paper, - Container, - Box, -} from "@mui/material"; +import {Box, Button, Container, Paper, Stack, Typography,} from "@mui/material"; import Image from "next/image"; -import { Formik } from "formik"; +import {Formik} from "formik"; import * as Yup from "yup"; -import { useTranslations } from "next-intl"; +import {useTranslations} from "next-intl"; import PasswordField from "@/core/components/PasswordField"; import StyledForm from "@/core/components/StyledForm"; -import { CHANGE_PASSWORD } from "@/core/data/apiRoutes"; +import {CHANGE_PASSWORD} from "@/core/data/apiRoutes"; import useUser from "@/lib/app/hooks/useUser"; import axios from "axios"; import Notifications from "@/core/components/notifications"; import useDirection from "@/lib/app/hooks/useDirection"; -import { toast } from "react-toastify"; +import {toast} from "react-toastify"; const DashboardChangePasswordComponent = () => { - const t = useTranslations(); - const { token } = useUser(); - const { directionApp } = useDirection(); + const t = useTranslations(); + const {token} = useUser(); + const {directionApp} = useDirection(); - const handleSubmit = (values, { setSubmitting, resetForm }) => { - toast.dismiss(); - const pendingToast = toast(t("notifications.pending"), { - position: directionApp === "ltr" ? "top-left" : "top-right", - autoClose: false, - closeOnClick: false, - draggable: false, + const handleSubmit = (values, {setSubmitting, resetForm}) => { + toast.dismiss(); + const pendingToast = toast(t("notifications.pending"), { + position: directionApp === "ltr" ? "top-left" : "top-right", + autoClose: false, + closeOnClick: false, + draggable: false, + }); + axios + .post( + CHANGE_PASSWORD, + { + current_password: values.current_password, + new_password: values.new_password, + new_password_confirmation: values.new_password_confirmation, + }, + { + headers: {authorization: `Bearer ${token}`}, + } + ) + .then((response) => { + toast.dismiss(pendingToast); // Dismiss the pending toast notification + Notifications(directionApp, response, t); + resetForm(); + }) + .catch((error) => { + toast.dismiss(pendingToast); // Dismiss the pending toast notification + Notifications(directionApp, error.response, t); + }) + .finally(() => { + setSubmitting(false); // Set `setSubmitting` to false after the API request completes + }); + }; + const initialValues = { + current_password: "", + new_password: "", + new_password_confirmation: "", + }; + const validationSchema = Yup.object().shape({ + current_password: Yup.string().required( + t("ChangePassword.error_message_required") + ), + new_password: Yup.string() + .min(8, t("ChangePassword.error_message_password_length")) + .required(t("ChangePassword.error_message_required")), + new_password_confirmation: Yup.string() + .required(t("ChangePassword.error_message_required")) + .test( + t("ChangePassword.error_message_password_match"), + t("ChangePassword.error_message_password_not_match"), + function (value) { + return this.parent.new_password === value; + } + ), }); - axios - .post( - CHANGE_PASSWORD, - { - current_password: values.current_password, - new_password: values.new_password, - new_password_confirmation: values.new_password_confirmation, - }, - { - headers: { authorization: `Bearer ${token}` }, - } - ) - .then((response) => { - toast.dismiss(pendingToast); // Dismiss the pending toast notification - Notifications(directionApp, response, t); - resetForm(); - }) - .catch((error) => { - toast.dismiss(pendingToast); // Dismiss the pending toast notification - Notifications(directionApp, error.response, t); - }) - .finally(() => { - setSubmitting(false); // Set `setSubmitting` to false after the API request completes - }); - }; - const initialValues = { - current_password: "", - new_password: "", - new_password_confirmation: "", - }; - const validationSchema = Yup.object().shape({ - current_password: Yup.string().required( - t("ChangePassword.error_message_required") - ), - new_password: Yup.string() - .min(8, t("ChangePassword.error_message_password_length")) - .required(t("ChangePassword.error_message_required")), - new_password_confirmation: Yup.string() - .required(t("ChangePassword.error_message_required")) - .test( - t("ChangePassword.error_message_password_match"), - t("ChangePassword.error_message_password_not_match"), - function (value) { - return this.parent.new_password === value; - } - ), - }); - return ( - - - - - {(props) => ( - { - e.preventDefault(); - props.handleSubmit(); - }} - > - - - + + + - - - - {t("ChangePassword.typography_change_password")} - - - - - - - - - - - - - - - )} - - - - - ); + {(props) => ( + { + e.preventDefault(); + props.handleSubmit(); + }} + > + + + + + + + {t("ChangePassword.typography_change_password")} + + + + + + + + + + + + + + + )} + + + + + ); }; export default DashboardChangePasswordComponent; diff --git a/src/components/dashboard/edit-profile/index.jsx b/src/components/dashboard/edit-profile/index.jsx index fa3e2e1..9391754 100644 --- a/src/components/dashboard/edit-profile/index.jsx +++ b/src/components/dashboard/edit-profile/index.jsx @@ -2,277 +2,268 @@ import StyledForm from "@/core/components/StyledForm"; import CenterLayout from "@/layouts/CenterLayout"; import DashboardLayouts from "@/layouts/dashboardLayouts"; import useUser from "@/lib/app/hooks/useUser"; -import { - Box, - Button, - Container, - Grid, - Paper, - Stack, - TextField, - Typography, -} from "@mui/material"; +import {Box, Container, Grid, Paper, Stack, TextField, Typography,} from "@mui/material"; import * as Yup from "yup"; -import { Field, Formik } from "formik"; -import { useTranslations } from "next-intl"; +import {Field, Formik} from "formik"; +import {useTranslations} from "next-intl"; import AvatarUpload from "@/core/components/AvatarUpload"; import axios from "axios"; -import { UPDATE_PROFILE, UPDATE_AVATAR } from "@/core/data/apiRoutes"; +import {UPDATE_AVATAR} from "@/core/data/apiRoutes"; import useDirection from "@/lib/app/hooks/useDirection"; import Notifications from "@/core/components/notifications"; import ImageResizer from "@/core/components/ImageConvertor"; const DashboardEditProfile = () => { - const t = useTranslations(); - const { user, token, getUser, changeUser } = useUser(); - console.log(user); - const { directionApp } = useDirection(); + const t = useTranslations(); + const {user, token, getUser, changeUser} = useUser(); + console.log(user); + const {directionApp} = useDirection(); - const editAvatar = async (avatar) => { - try { - const formData = new FormData(); + const editAvatar = async (avatar) => { + try { + const formData = new FormData(); - if (avatar != null) { - var resizedAvatar; - resizedAvatar = await ImageResizer(avatar); - formData.append("avatar", resizedAvatar); - } + if (avatar != null) { + var resizedAvatar; + resizedAvatar = await ImageResizer(avatar); + formData.append("avatar", resizedAvatar); + } - await axios.post(UPDATE_AVATAR, formData, { - headers: { - authorization: `Bearer ${token}`, - "Content-Type": "multipart/form-data", - }, - }); - } catch (error) { - Notifications(directionApp, error.response, t); - throw error; - } - }; - const handleSubmit = (values, { setSubmitting }) => { - // const formData = new FormData(); - // formData.append("email", values.expert_email); - // if (values.change_avatar !== false) { - // editAvatar(values.expert_avatar) - // .then(() => { - // return axios.post(UPDATE_PROFILE, formData, { - // headers: { - // authorization: `Bearer ${token}`, - // "Content-Type": "multipart/form-data", - // }, - // }); - // }) - // .then((response) => { - // Notifications(directionApp, response, t); - // getUser((data) => { - // changeUser(data); - // }); - // }) - // .catch((error) => { - // Notifications(directionApp, error.response, t); - // }) - // .finally(() => { - // setSubmitting(false); - // }); - // } else { - // axios - // .post(UPDATE_PROFILE, formData, { - // headers: { - // authorization: `Bearer ${token}`, - // "Content-Type": "multipart/form-data", - // }, - // }) - // .then((response) => { - // Notifications(directionApp, response, t); - // getUser((data) => { - // changeUser(data); - // }); - // }) - // .catch((error) => { - // Notifications(directionApp, error.response, t); - // }) - // .finally(() => { - // setSubmitting(false); - // }); - // } - }; - const initialValues = { - expert_avatar: null, - username: user.username, - name: user.name, - email: user.email, - province_name: user.province_name, - position: user.position, - }; - const validationSchema = Yup.object().shape({ - // username: Yup.string().required(t("UpdateProfile.error_message_required")), - // name: Yup.string().required(t("UpdateProfile.error_message_required")), - // email: Yup.string() - // .email(t("UpdateProfile.error_invalid_email")) - // .required(t("UpdateProfile.error_message_required")), - // province_name: Yup.string().required( - // t("UpdateProfile.error_message_required") - // ), - // position: Yup.string().required(t("UpdateProfile.error_message_required")), - }); + await axios.post(UPDATE_AVATAR, formData, { + headers: { + authorization: `Bearer ${token}`, + "Content-Type": "multipart/form-data", + }, + }); + } catch (error) { + Notifications(directionApp, error.response, t); + throw error; + } + }; + const handleSubmit = (values, {setSubmitting}) => { + // const formData = new FormData(); + // formData.append("email", values.expert_email); + // if (values.change_avatar !== false) { + // editAvatar(values.expert_avatar) + // .then(() => { + // return axios.post(UPDATE_PROFILE, formData, { + // headers: { + // authorization: `Bearer ${token}`, + // "Content-Type": "multipart/form-data", + // }, + // }); + // }) + // .then((response) => { + // Notifications(directionApp, response, t); + // getUser((data) => { + // changeUser(data); + // }); + // }) + // .catch((error) => { + // Notifications(directionApp, error.response, t); + // }) + // .finally(() => { + // setSubmitting(false); + // }); + // } else { + // axios + // .post(UPDATE_PROFILE, formData, { + // headers: { + // authorization: `Bearer ${token}`, + // "Content-Type": "multipart/form-data", + // }, + // }) + // .then((response) => { + // Notifications(directionApp, response, t); + // getUser((data) => { + // changeUser(data); + // }); + // }) + // .catch((error) => { + // Notifications(directionApp, error.response, t); + // }) + // .finally(() => { + // setSubmitting(false); + // }); + // } + }; + const initialValues = { + expert_avatar: null, + username: user.username, + name: user.name, + email: user.email, + province_name: user.province_name, + position: user.position, + }; + const validationSchema = Yup.object().shape({ + // username: Yup.string().required(t("UpdateProfile.error_message_required")), + // name: Yup.string().required(t("UpdateProfile.error_message_required")), + // email: Yup.string() + // .email(t("UpdateProfile.error_invalid_email")) + // .required(t("UpdateProfile.error_message_required")), + // province_name: Yup.string().required( + // t("UpdateProfile.error_message_required") + // ), + // position: Yup.string().required(t("UpdateProfile.error_message_required")), + }); - return ( - - - - - {(props) => ( - { - e.preventDefault(); - props.handleSubmit(); - }} - > - - - - {t("UpdateProfile.typography_edit_profile")} - - + + + - - - - - - - - - - - - + {(props) => ( + { + e.preventDefault(); + props.handleSubmit(); + }} + > + + + + {t("UpdateProfile.typography_edit_profile")} + + + + + + + + + + + + + + - - - - - - - - {/* */} - - - - )} - - - - - ); + + + + )} + + + + + ); }; export default DashboardEditProfile; diff --git a/src/components/dashboard/first/index.jsx b/src/components/dashboard/first/index.jsx index c693380..ee4f80a 100644 --- a/src/components/dashboard/first/index.jsx +++ b/src/components/dashboard/first/index.jsx @@ -1,7 +1,7 @@ import DashboardLayouts from "@/layouts/dashboardLayouts"; const DashboardFirstComponent = () => { - return ; + return ; }; export default DashboardFirstComponent; diff --git a/src/components/dashboard/machinary-office/Form/ConfirmForm.jsx b/src/components/dashboard/machinary-office/Form/ConfirmForm.jsx index f2988ef..a0d8017 100644 --- a/src/components/dashboard/machinary-office/Form/ConfirmForm.jsx +++ b/src/components/dashboard/machinary-office/Form/ConfirmForm.jsx @@ -1,140 +1,132 @@ -import { CONFIRM_MACHINARY_OFFICE } from "@/core/data/apiRoutes"; -import { - Dialog, - DialogTitle, - DialogContent, - DialogContentText, - DialogActions, - Button, - TextField, -} from "@mui/material"; -import { useTranslations } from "next-intl"; -import { useState } from "react"; -import { useFormik } from "formik"; +import {CONFIRM_MACHINARY_OFFICE} from "@/core/data/apiRoutes"; +import {Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, TextField,} from "@mui/material"; +import {useTranslations} from "next-intl"; +import {useState} from "react"; +import {useFormik} from "formik"; import * as Yup from "yup"; import UploadSystem from "@/core/components/UploadSystem"; import UploadFileNotification from "@/core/components/notifications/UploadFileNotification"; import useDirection from "@/lib/app/hooks/useDirection"; -const ConfirmForm = ({ open, handleClose, rowId, confirmData }) => { - const t = useTranslations(); - const { directionApp } = useDirection(); - const [proposedAmount, setProposedAmount] = useState(""); - const [description, setDescription] = useState(""); - const [selectedImage, setSelectedImage] = useState(""); - const [fileType, setfileType] = useState(null); - const [fileName, setfileName] = useState(null); - const [showAddIcon, setShowAddIcon] = useState(true); +const ConfirmForm = ({open, handleClose, rowId, confirmData}) => { + const t = useTranslations(); + const {directionApp} = useDirection(); + const [proposedAmount, setProposedAmount] = useState(""); + const [description, setDescription] = useState(""); + const [selectedImage, setSelectedImage] = useState(""); + const [fileType, setfileType] = useState(null); + const [fileName, setfileName] = useState(null); + const [showAddIcon, setShowAddIcon] = useState(true); - //formik - const validationSchema = Yup.object().shape({ - proposed_amount: Yup.string().required(t("ConfirmDialog.amount_error")), - }); - const formik = useFormik({ - initialValues: { - proposed_amount: "", - description: "", - }, - validationSchema, - onSubmit: () => { - const formData = new FormData(); - formData.append("proposed_amount", proposedAmount); - if (description != "") formData.append("expert_description", description); - handleClose(); - confirmData(CONFIRM_MACHINARY_OFFICE, rowId, formData); - }, - }); + //formik + const validationSchema = Yup.object().shape({ + proposed_amount: Yup.string().required(t("ConfirmDialog.amount_error")), + }); + const formik = useFormik({ + initialValues: { + proposed_amount: "", + description: "", + }, + validationSchema, + onSubmit: () => { + const formData = new FormData(); + formData.append("proposed_amount", proposedAmount); + if (description != "") formData.append("expert_description", description); + handleClose(); + confirmData(CONFIRM_MACHINARY_OFFICE, rowId, formData); + }, + }); - const handleDescriptionChange = (event) => { - setDescription(event.target.value); - }; - const handleAmountChange = (event) => { - if (/^\d*$/.test(event.target.value)) { - setProposedAmount(event.target.value); - } - formik.handleChange(event); - }; + const handleDescriptionChange = (event) => { + setDescription(event.target.value); + }; + const handleAmountChange = (event) => { + if (/^\d*$/.test(event.target.value)) { + setProposedAmount(event.target.value); + } + formik.handleChange(event); + }; - const handleUploadChange = (event) => { - const uploadedFile = event.target?.files?.[0]; - if (uploadedFile) { - const maxFileSize = 2 * 1024 * 1024; - if (uploadedFile.size > maxFileSize) { - UploadFileNotification(directionApp, t); - event.target.value = ""; - return; - } - const fileType = event.target?.files?.[0].type; - const fileName = event.target?.files?.[0].name; - setSelectedImage(URL.createObjectURL(uploadedFile)); - setfileType(fileType); - setfileName(fileName); - formik.setFieldValue("confirm_img", uploadedFile); - setShowAddIcon(false); - } - }; - return ( - - {t("ConfirmDialog.confirm")} - - {t("ConfirmDialog.context")} - - - - - - - - - - ); + const handleUploadChange = (event) => { + const uploadedFile = event.target?.files?.[0]; + if (uploadedFile) { + const maxFileSize = 2 * 1024 * 1024; + if (uploadedFile.size > maxFileSize) { + UploadFileNotification(directionApp, t); + event.target.value = ""; + return; + } + const fileType = event.target?.files?.[0].type; + const fileName = event.target?.files?.[0].name; + setSelectedImage(URL.createObjectURL(uploadedFile)); + setfileType(fileType); + setfileName(fileName); + formik.setFieldValue("confirm_img", uploadedFile); + setShowAddIcon(false); + } + }; + return ( + + {t("ConfirmDialog.confirm")} + + {t("ConfirmDialog.context")} + + + + + + + + + + ); }; export default ConfirmForm; diff --git a/src/components/dashboard/machinary-office/Form/RejectForm.jsx b/src/components/dashboard/machinary-office/Form/RejectForm.jsx index b7a37e9..06f7292 100644 --- a/src/components/dashboard/machinary-office/Form/RejectForm.jsx +++ b/src/components/dashboard/machinary-office/Form/RejectForm.jsx @@ -1,116 +1,108 @@ -import { REJECT_MACHINARY_OFFICE } from "@/core/data/apiRoutes"; -import { - Dialog, - DialogTitle, - DialogContent, - DialogContentText, - DialogActions, - Button, - TextField, -} from "@mui/material"; -import { useTranslations } from "next-intl"; -import { useFormik } from "formik"; +import {REJECT_MACHINARY_OFFICE} from "@/core/data/apiRoutes"; +import {Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, TextField,} from "@mui/material"; +import {useTranslations} from "next-intl"; +import {useFormik} from "formik"; import * as Yup from "yup"; -import { useState } from "react"; +import {useState} from "react"; import UploadSystem from "@/core/components/UploadSystem"; import UploadFileNotification from "@/core/components/notifications/UploadFileNotification"; import useDirection from "@/lib/app/hooks/useDirection"; -const RejectForm = ({ open, handleClose, rowId, rejectData }) => { - const t = useTranslations(); - const { directionApp } = useDirection(); - const [description, setDescription] = useState(""); - const [selectedImage, setSelectedImage] = useState(""); - const [fileType, setfileType] = useState(null); - const [fileName, setfileName] = useState(null); - const [showAddIcon, setShowAddIcon] = useState(true); +const RejectForm = ({open, handleClose, rowId, rejectData}) => { + const t = useTranslations(); + const {directionApp} = useDirection(); + const [description, setDescription] = useState(""); + const [selectedImage, setSelectedImage] = useState(""); + const [fileType, setfileType] = useState(null); + const [fileName, setfileName] = useState(null); + const [showAddIcon, setShowAddIcon] = useState(true); - const validationSchema = Yup.object().shape({ - description: Yup.string().required(t("RejectDialog.description_error")), - }); + const validationSchema = Yup.object().shape({ + description: Yup.string().required(t("RejectDialog.description_error")), + }); - const formik = useFormik({ - initialValues: { - description: "", - }, - validationSchema, - onSubmit: () => { - const formData = new FormData(); - formData.append("expert_description", description); - handleClose(); - rejectData(REJECT_MACHINARY_OFFICE, rowId, formData); - }, - }); + const formik = useFormik({ + initialValues: { + description: "", + }, + validationSchema, + onSubmit: () => { + const formData = new FormData(); + formData.append("expert_description", description); + handleClose(); + rejectData(REJECT_MACHINARY_OFFICE, rowId, formData); + }, + }); - const handleDescriptionChange = (event) => { - setDescription(event.target.value); - formik.handleChange(event); - }; + const handleDescriptionChange = (event) => { + setDescription(event.target.value); + formik.handleChange(event); + }; - const handleUploadChange = (event) => { - const uploadedFile = event.target?.files?.[0]; - if (uploadedFile) { - const maxFileSize = 2 * 1024 * 1024; - if (uploadedFile.size > maxFileSize) { - UploadFileNotification(directionApp, t); - event.target.value = ""; - return; - } - const fileType = event.target?.files?.[0].type; - const fileName = event.target?.files?.[0].name; - setSelectedImage(URL.createObjectURL(uploadedFile)); - setfileType(fileType); - setfileName(fileName); - formik.setFieldValue("reject_img", uploadedFile); - setShowAddIcon(false); - } - }; + const handleUploadChange = (event) => { + const uploadedFile = event.target?.files?.[0]; + if (uploadedFile) { + const maxFileSize = 2 * 1024 * 1024; + if (uploadedFile.size > maxFileSize) { + UploadFileNotification(directionApp, t); + event.target.value = ""; + return; + } + const fileType = event.target?.files?.[0].type; + const fileName = event.target?.files?.[0].name; + setSelectedImage(URL.createObjectURL(uploadedFile)); + setfileType(fileType); + setfileName(fileName); + formik.setFieldValue("reject_img", uploadedFile); + setShowAddIcon(false); + } + }; - return ( - - {t("RejectDialog.reject")} - - {t("RejectDialog.context")} - - - - - - - - - ); + return ( + + {t("RejectDialog.reject")} + + {t("RejectDialog.context")} + + + + + + + + + ); }; export default RejectForm; diff --git a/src/components/dashboard/machinary-office/TableRowActions.jsx b/src/components/dashboard/machinary-office/TableRowActions.jsx index 30367b9..13c6e7b 100644 --- a/src/components/dashboard/machinary-office/TableRowActions.jsx +++ b/src/components/dashboard/machinary-office/TableRowActions.jsx @@ -1,60 +1,60 @@ import ThumbUpAltIcon from "@mui/icons-material/ThumbUpAlt"; import ThumbDownIcon from "@mui/icons-material/ThumbDown"; -import { Box, IconButton, Tooltip } from "@mui/material"; -import { useContext } from "react"; +import {Box, IconButton, Tooltip} from "@mui/material"; +import {useContext} from "react"; import ConfirmForm from "./Form/ConfirmForm"; import RejectForm from "./Form/RejectForm"; -import { useTranslations } from "next-intl"; -import { DataTableContext } from "@/lib/app/contexts/DatatableContext"; +import {useTranslations} from "next-intl"; +import {DataTableContext} from "@/lib/app/contexts/DatatableContext"; -const TableRowActions = ({ row }) => { - const t = useTranslations(); - const { - openConfirmDialog, - openRejectDialog, - handleOpenConfirmDialog, - handleOpenRejectDialog, - handleCloseConfirmDialog, - handleCloseRejectDialog, - rowId, - confirmData, - rejectData, - } = useContext(DataTableContext); - return ( - - - { - handleOpenConfirmDialog(row); - }} - > - - - - {openConfirmDialog && ( - - )} - - handleOpenRejectDialog(row)}> - - - - {openRejectDialog && ( - - )} - - ); +const TableRowActions = ({row}) => { + const t = useTranslations(); + const { + openConfirmDialog, + openRejectDialog, + handleOpenConfirmDialog, + handleOpenRejectDialog, + handleCloseConfirmDialog, + handleCloseRejectDialog, + rowId, + confirmData, + rejectData, + } = useContext(DataTableContext); + return ( + + + { + handleOpenConfirmDialog(row); + }} + > + + + + {openConfirmDialog && ( + + )} + + handleOpenRejectDialog(row)}> + + + + {openRejectDialog && ( + + )} + + ); }; export default TableRowActions; diff --git a/src/components/dashboard/machinary-office/TableTolbar.jsx b/src/components/dashboard/machinary-office/TableTolbar.jsx index 3f06d3b..e267691 100644 --- a/src/components/dashboard/machinary-office/TableTolbar.jsx +++ b/src/components/dashboard/machinary-office/TableTolbar.jsx @@ -1,13 +1,13 @@ -import { Stack, Tooltip } from "@mui/material"; -import { useTranslations } from "next-intl"; +import {Stack, Tooltip} from "@mui/material"; +import {useTranslations} from "next-intl"; function TableToolbar() { - const t = useTranslations(); - return ( - - - - ); + const t = useTranslations(); + return ( + + + + ); } export default TableToolbar; diff --git a/src/components/dashboard/machinary-office/index.jsx b/src/components/dashboard/machinary-office/index.jsx index 30415e4..63061ce 100644 --- a/src/components/dashboard/machinary-office/index.jsx +++ b/src/components/dashboard/machinary-office/index.jsx @@ -1,244 +1,241 @@ import DataTableStructure from "@/core/components/DatatableStructure"; import DashboardLayouts from "@/layouts/dashboardLayouts"; -import { Box, IconButton, Typography } from "@mui/material"; +import {Box, IconButton, Typography} from "@mui/material"; import ClearIcon from "@mui/icons-material/Clear"; -import { useMemo } from "react"; +import {useMemo} from "react"; // import TableToolbar from "./TableTollbar"; -import { GET_MACHINARY_OFFICE } from "@/core/data/apiRoutes"; -import { useTranslations } from "next-intl"; +import {GET_MACHINARY_OFFICE} from "@/core/data/apiRoutes"; +import {useTranslations} from "next-intl"; import TableRowActions from "./TableRowActions"; -import { - LocalizationProvider, - MobileDateTimePicker, -} from "@mui/x-date-pickers"; -import { AdapterDateFnsJalali } from "@mui/x-date-pickers/AdapterDateFnsJalali"; +import {LocalizationProvider, MobileDateTimePicker,} from "@mui/x-date-pickers"; +import {AdapterDateFnsJalali} from "@mui/x-date-pickers/AdapterDateFnsJalali"; import moment from "jalali-moment"; -import { faIR } from "@mui/x-date-pickers/locales"; +import {faIR} from "@mui/x-date-pickers/locales"; function DashboardMachinaryOfficeComponent() { - const t = useTranslations(); - const columns = useMemo( - () => [ - { - accessorFn: (row) => row.id, - id: "id", - header: t("PassengerOffice.id"), - enableColumnFilter: true, - datatype: "numeric", - filterFn: "equals", - maxSize: 100, - columnFilterModeOptions: [ - "equals", - "notEquals", - "contains", - "lessThan", - "greaterThan", - "between", + const t = useTranslations(); + const columns = useMemo( + () => [ + { + accessorFn: (row) => row.id, + id: "id", + header: t("PassengerOffice.id"), + enableColumnFilter: true, + datatype: "numeric", + filterFn: "equals", + maxSize: 100, + columnFilterModeOptions: [ + "equals", + "notEquals", + "contains", + "lessThan", + "greaterThan", + "between", + ], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.name, + id: "name", + header: t("MachinaryOffice.name"), + enableColumnFilter: true, + datatype: "text", + filterFn: "contains", + columnFilterModeOptions: ["contains", "equals", "notEquals"], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.national_id, + id: "national_id", + header: t("MachinaryOffice.national_id"), + enableColumnFilter: true, + datatype: "numeric", + filterFn: "equals", + columnFilterModeOptions: [ + "equals", + "notEquals", + "contains", + "lessThan", + "greaterThan", + "between", + ], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.phone_number, + id: "phone_number", + header: t("MachinaryOffice.phone_number"), + enableColumnFilter: true, + datatype: "numeric", + filterFn: "equals", + columnFilterModeOptions: [ + "equals", + "notEquals", + "contains", + "lessThan", + "greaterThan", + "between", + ], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => + moment(row.created_at).locale("fa").format("HH:mm | yyyy/MM/DD"), + id: "created_at", + header: t("MachinaryOffice.created_at"), + enableColumnFilter: true, + datatype: "date", + filterFn: "lessThan", + minSize: 200, + columnFilterModeOptions: ["lessThan", "greaterThan"], + Cell: ({renderedCellValue}) => { + return {renderedCellValue}; + }, + Header: ({column}) => {column.columnDef.header}, + Filter: ({column}) => { + const filterFnValue = column.columnDef._filterFn; + return ( + + + { + const date = new Date(newValue); + const formattedDate = moment(date) + .locale("en") + .format("YYYY-MM-DD HH:mm"); + column.setFilterValue(formattedDate); + }} + slotProps={{ + textField: { + placeholder: "تاریخ خود را وارد کنید", + helperText: `${t("filter_mode")}: ${t(filterFnValue)}`, + sx: {minWidth: "120px"}, + variant: "standard", + }, + }} + value={ + column.getFilterValue() + ? new Date(column.getFilterValue()) + : null + } + /> + + { + column.setFilterValue(null); + }} + sx={{ + color: column.getFilterValue() + ? "rgba(0, 0, 0, 0.54)" + : "#bfbfbf", + }} + > + + + + ); + }, + }, + { + accessorFn: (row) => + moment(row.updated_at).locale("fa").format("HH:mm | yyyy/MM/DD"), + id: "updated_at", + header: t("MachinaryOffice.updated_at"), + enableColumnFilter: false, + datatype: "numeric", + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.navgan_id, + id: "navgan_id", + header: t("MachinaryOffice.navgan_id"), + enableColumnFilter: true, + datatype: "numeric", + filterFn: "equals", + maxSize: 100, + columnFilterModeOptions: [ + "equals", + "notEquals", + "contains", + "lessThan", + "greaterThan", + "between", + ], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.vehicle_type, + id: "vehicle_type", + header: t("MachinaryOffice.vehicle_type"), + enableColumnFilter: true, + datatype: "text", + filterFn: "contains", + columnFilterModeOptions: ["contains", "equals", "notEquals"], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.state_name, + id: "state_id", + header: t("MachinaryOffice.state_name"), + enableColumnFilter: false, + datatype: "numeric", + minSize: 300, + // filterFn: "equals", + // filterSelectOptions: [ + // ], + // filterVariant: "select", + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, ], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.name, - id: "name", - header: t("MachinaryOffice.name"), - enableColumnFilter: true, - datatype: "text", - filterFn: "contains", - columnFilterModeOptions: ["contains", "equals", "notEquals"], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.national_id, - id: "national_id", - header: t("MachinaryOffice.national_id"), - enableColumnFilter: true, - datatype: "numeric", - filterFn: "equals", - columnFilterModeOptions: [ - "equals", - "notEquals", - "contains", - "lessThan", - "greaterThan", - "between", - ], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.phone_number, - id: "phone_number", - header: t("MachinaryOffice.phone_number"), - enableColumnFilter: true, - datatype: "numeric", - filterFn: "equals", - columnFilterModeOptions: [ - "equals", - "notEquals", - "contains", - "lessThan", - "greaterThan", - "between", - ], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => - moment(row.created_at).locale("fa").format("HH:mm | yyyy/MM/DD"), - id: "created_at", - header: t("MachinaryOffice.created_at"), - enableColumnFilter: true, - datatype: "date", - filterFn: "lessThan", - minSize: 200, - columnFilterModeOptions: ["lessThan", "greaterThan"], - Cell: ({ renderedCellValue }) => { - return {renderedCellValue}; - }, - Header: ({ column }) => {column.columnDef.header}, - Filter: ({ column }) => { - const filterFnValue = column.columnDef._filterFn; - return ( - - - { - const date = new Date(newValue); - const formattedDate = moment(date) - .locale("en") - .format("YYYY-MM-DD HH:mm"); - column.setFilterValue(formattedDate); - }} - slotProps={{ - textField: { - placeholder: "تاریخ خود را وارد کنید", - helperText: `${t("filter_mode")}: ${t(filterFnValue)}`, - sx: { minWidth: "120px" }, - variant: "standard", - }, - }} - value={ - column.getFilterValue() - ? new Date(column.getFilterValue()) - : null - } + [] + ); + return ( + + + } + enableLastUpdate={true} + enablePinning={true} + enableDensityToggle={true} + enableColumnFilters={true} + enableHiding={true} + enableFullScreenToggle={false} + enableGlobalFilter={false} + enableColumnResizing={false} // if you want true this you shold change renderRowActions props ** see https://www.material-react-table.com/docs/guides/row-actions + enableRowActions={true} + renderRowActions={({row}) => } /> - - { - column.setFilterValue(null); - }} - sx={{ - color: column.getFilterValue() - ? "rgba(0, 0, 0, 0.54)" - : "#bfbfbf", - }} - > - - - ); - }, - }, - { - accessorFn: (row) => - moment(row.updated_at).locale("fa").format("HH:mm | yyyy/MM/DD"), - id: "updated_at", - header: t("MachinaryOffice.updated_at"), - enableColumnFilter: false, - datatype: "numeric", - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.navgan_id, - id: "navgan_id", - header: t("MachinaryOffice.navgan_id"), - enableColumnFilter: true, - datatype: "numeric", - filterFn: "equals", - maxSize: 100, - columnFilterModeOptions: [ - "equals", - "notEquals", - "contains", - "lessThan", - "greaterThan", - "between", - ], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.vehicle_type, - id: "vehicle_type", - header: t("MachinaryOffice.vehicle_type"), - enableColumnFilter: true, - datatype: "text", - filterFn: "contains", - columnFilterModeOptions: ["contains", "equals", "notEquals"], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.state_name, - id: "state_id", - header: t("MachinaryOffice.state_name"), - enableColumnFilter: false, - datatype: "numeric", - minSize: 300, - // filterFn: "equals", - // filterSelectOptions: [ - // ], - // filterVariant: "select", - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - ], - [] - ); - return ( - - - } - enableLastUpdate={true} - enablePinning={true} - enableDensityToggle={true} - enableColumnFilters={true} - enableHiding={true} - enableFullScreenToggle={false} - enableGlobalFilter={false} - enableColumnResizing={false} // if you want true this you shold change renderRowActions props ** see https://www.material-react-table.com/docs/guides/row-actions - enableRowActions={true} - renderRowActions={({ row }) => } - /> - - - ); + + ); } export default DashboardMachinaryOfficeComponent; diff --git a/src/components/dashboard/passenger-boss/Form/ConfirmForm.jsx b/src/components/dashboard/passenger-boss/Form/ConfirmForm.jsx index ec01590..f12c0bc 100644 --- a/src/components/dashboard/passenger-boss/Form/ConfirmForm.jsx +++ b/src/components/dashboard/passenger-boss/Form/ConfirmForm.jsx @@ -1,142 +1,134 @@ -import { CONFIRM_PASSENGER_BOSS } from "@/core/data/apiRoutes"; -import { - Dialog, - DialogTitle, - DialogContent, - DialogContentText, - DialogActions, - Button, - TextField, -} from "@mui/material"; -import { useTranslations } from "next-intl"; -import { useState } from "react"; -import { useFormik } from "formik"; +import {CONFIRM_PASSENGER_BOSS} from "@/core/data/apiRoutes"; +import {Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, TextField,} from "@mui/material"; +import {useTranslations} from "next-intl"; +import {useState} from "react"; +import {useFormik} from "formik"; import * as Yup from "yup"; import UploadSystem from "@/core/components/UploadSystem"; import UploadFileNotification from "@/core/components/notifications/UploadFileNotification"; import useDirection from "@/lib/app/hooks/useDirection"; -const ConfirmForm = ({ open, handleClose, rowId, confirmData }) => { - const t = useTranslations(); - const { directionApp } = useDirection(); - const [proposedAmount, setProposedAmount] = useState(""); - const [description, setDescription] = useState(""); - const [selectedImage, setSelectedImage] = useState(""); - const [fileType, setfileType] = useState(null); - const [fileName, setfileName] = useState(null); - const [showAddIcon, setShowAddIcon] = useState(true); +const ConfirmForm = ({open, handleClose, rowId, confirmData}) => { + const t = useTranslations(); + const {directionApp} = useDirection(); + const [proposedAmount, setProposedAmount] = useState(""); + const [description, setDescription] = useState(""); + const [selectedImage, setSelectedImage] = useState(""); + const [fileType, setfileType] = useState(null); + const [fileName, setfileName] = useState(null); + const [showAddIcon, setShowAddIcon] = useState(true); - //formik - const validationSchema = Yup.object().shape({ - proposed_amount: Yup.string().required( - t("ConfirmDialog.approved_amount_error") - ), - }); - const formik = useFormik({ - initialValues: { - proposed_amount: "", - description: "", - }, - validationSchema, - onSubmit: () => { - const formData = new FormData(); - formData.append("approved_amount", proposedAmount); - if (description != "") formData.append("expert_description", description); - handleClose(); - confirmData(CONFIRM_PASSENGER_BOSS, rowId, formData); - }, - }); + //formik + const validationSchema = Yup.object().shape({ + proposed_amount: Yup.string().required( + t("ConfirmDialog.approved_amount_error") + ), + }); + const formik = useFormik({ + initialValues: { + proposed_amount: "", + description: "", + }, + validationSchema, + onSubmit: () => { + const formData = new FormData(); + formData.append("approved_amount", proposedAmount); + if (description != "") formData.append("expert_description", description); + handleClose(); + confirmData(CONFIRM_PASSENGER_BOSS, rowId, formData); + }, + }); - const handleDescriptionChange = (event) => { - setDescription(event.target.value); - }; - const handleAmountChange = (event) => { - if (/^\d*$/.test(event.target.value)) { - setProposedAmount(event.target.value); - } - formik.handleChange(event); - }; - const handleUploadChange = (event) => { - const uploadedFile = event.target?.files?.[0]; - if (uploadedFile) { - const maxFileSize = 2 * 1024 * 1024; - if (uploadedFile.size > maxFileSize) { - UploadFileNotification(directionApp, t); - event.target.value = ""; - return; - } - const fileType = event.target?.files?.[0].type; - const fileName = event.target?.files?.[0].name; - setSelectedImage(URL.createObjectURL(uploadedFile)); - setfileType(fileType); - setfileName(fileName); - formik.setFieldValue("confirm_img", uploadedFile); - setShowAddIcon(false); - } - }; + const handleDescriptionChange = (event) => { + setDescription(event.target.value); + }; + const handleAmountChange = (event) => { + if (/^\d*$/.test(event.target.value)) { + setProposedAmount(event.target.value); + } + formik.handleChange(event); + }; + const handleUploadChange = (event) => { + const uploadedFile = event.target?.files?.[0]; + if (uploadedFile) { + const maxFileSize = 2 * 1024 * 1024; + if (uploadedFile.size > maxFileSize) { + UploadFileNotification(directionApp, t); + event.target.value = ""; + return; + } + const fileType = event.target?.files?.[0].type; + const fileName = event.target?.files?.[0].name; + setSelectedImage(URL.createObjectURL(uploadedFile)); + setfileType(fileType); + setfileName(fileName); + formik.setFieldValue("confirm_img", uploadedFile); + setShowAddIcon(false); + } + }; - return ( - - {t("ConfirmDialog.confirm")} - - {t("ConfirmDialog.context")} - - - - - - - - - - ); + return ( + + {t("ConfirmDialog.confirm")} + + {t("ConfirmDialog.context")} + + + + + + + + + + ); }; export default ConfirmForm; diff --git a/src/components/dashboard/passenger-boss/Form/RejectForm.jsx b/src/components/dashboard/passenger-boss/Form/RejectForm.jsx index 955a487..e8dd93e 100644 --- a/src/components/dashboard/passenger-boss/Form/RejectForm.jsx +++ b/src/components/dashboard/passenger-boss/Form/RejectForm.jsx @@ -1,116 +1,108 @@ -import { REJECT_PASSENGER_BOSS } from "@/core/data/apiRoutes"; -import { - Dialog, - DialogTitle, - DialogContent, - DialogContentText, - DialogActions, - Button, - TextField, -} from "@mui/material"; -import { useTranslations } from "next-intl"; -import { useFormik } from "formik"; +import {REJECT_PASSENGER_BOSS} from "@/core/data/apiRoutes"; +import {Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, TextField,} from "@mui/material"; +import {useTranslations} from "next-intl"; +import {useFormik} from "formik"; import * as Yup from "yup"; -import { useState } from "react"; +import {useState} from "react"; import UploadSystem from "@/core/components/UploadSystem"; import UploadFileNotification from "@/core/components/notifications/UploadFileNotification"; import useDirection from "@/lib/app/hooks/useDirection"; -const RejectForm = ({ open, handleClose, rowId, rejectData }) => { - const t = useTranslations(); - const { directionApp } = useDirection(); - const [description, setDescription] = useState(""); - const [selectedImage, setSelectedImage] = useState(""); - const [fileType, setfileType] = useState(null); - const [fileName, setfileName] = useState(null); - const [showAddIcon, setShowAddIcon] = useState(true); +const RejectForm = ({open, handleClose, rowId, rejectData}) => { + const t = useTranslations(); + const {directionApp} = useDirection(); + const [description, setDescription] = useState(""); + const [selectedImage, setSelectedImage] = useState(""); + const [fileType, setfileType] = useState(null); + const [fileName, setfileName] = useState(null); + const [showAddIcon, setShowAddIcon] = useState(true); - const validationSchema = Yup.object().shape({ - description: Yup.string().required(t("RejectDialog.description_error")), - }); + const validationSchema = Yup.object().shape({ + description: Yup.string().required(t("RejectDialog.description_error")), + }); - const formik = useFormik({ - initialValues: { - description: "", - }, - validationSchema, - onSubmit: () => { - const formData = new FormData(); - formData.append("expert_description", description); - handleClose(); - rejectData(REJECT_PASSENGER_BOSS, rowId, formData); - }, - }); + const formik = useFormik({ + initialValues: { + description: "", + }, + validationSchema, + onSubmit: () => { + const formData = new FormData(); + formData.append("expert_description", description); + handleClose(); + rejectData(REJECT_PASSENGER_BOSS, rowId, formData); + }, + }); - const handleDescriptionChange = (event) => { - setDescription(event.target.value); - formik.handleChange(event); - }; + const handleDescriptionChange = (event) => { + setDescription(event.target.value); + formik.handleChange(event); + }; - const handleUploadChange = (event) => { - const uploadedFile = event.target?.files?.[0]; - if (uploadedFile) { - const maxFileSize = 2 * 1024 * 1024; - if (uploadedFile.size > maxFileSize) { - UploadFileNotification(directionApp, t); - event.target.value = ""; - return; - } - const fileType = event.target?.files?.[0].type; - const fileName = event.target?.files?.[0].name; - setSelectedImage(URL.createObjectURL(uploadedFile)); - setfileType(fileType); - setfileName(fileName); - formik.setFieldValue("reject_img", uploadedFile); - setShowAddIcon(false); - } - }; + const handleUploadChange = (event) => { + const uploadedFile = event.target?.files?.[0]; + if (uploadedFile) { + const maxFileSize = 2 * 1024 * 1024; + if (uploadedFile.size > maxFileSize) { + UploadFileNotification(directionApp, t); + event.target.value = ""; + return; + } + const fileType = event.target?.files?.[0].type; + const fileName = event.target?.files?.[0].name; + setSelectedImage(URL.createObjectURL(uploadedFile)); + setfileType(fileType); + setfileName(fileName); + formik.setFieldValue("reject_img", uploadedFile); + setShowAddIcon(false); + } + }; - return ( - - {t("RejectDialog.reject")} - - {t("RejectDialog.context")} - - - - - - - - - ); + return ( + + {t("RejectDialog.reject")} + + {t("RejectDialog.context")} + + + + + + + + + ); }; export default RejectForm; diff --git a/src/components/dashboard/passenger-boss/TableRowActions.jsx b/src/components/dashboard/passenger-boss/TableRowActions.jsx index 30367b9..13c6e7b 100644 --- a/src/components/dashboard/passenger-boss/TableRowActions.jsx +++ b/src/components/dashboard/passenger-boss/TableRowActions.jsx @@ -1,60 +1,60 @@ import ThumbUpAltIcon from "@mui/icons-material/ThumbUpAlt"; import ThumbDownIcon from "@mui/icons-material/ThumbDown"; -import { Box, IconButton, Tooltip } from "@mui/material"; -import { useContext } from "react"; +import {Box, IconButton, Tooltip} from "@mui/material"; +import {useContext} from "react"; import ConfirmForm from "./Form/ConfirmForm"; import RejectForm from "./Form/RejectForm"; -import { useTranslations } from "next-intl"; -import { DataTableContext } from "@/lib/app/contexts/DatatableContext"; +import {useTranslations} from "next-intl"; +import {DataTableContext} from "@/lib/app/contexts/DatatableContext"; -const TableRowActions = ({ row }) => { - const t = useTranslations(); - const { - openConfirmDialog, - openRejectDialog, - handleOpenConfirmDialog, - handleOpenRejectDialog, - handleCloseConfirmDialog, - handleCloseRejectDialog, - rowId, - confirmData, - rejectData, - } = useContext(DataTableContext); - return ( - - - { - handleOpenConfirmDialog(row); - }} - > - - - - {openConfirmDialog && ( - - )} - - handleOpenRejectDialog(row)}> - - - - {openRejectDialog && ( - - )} - - ); +const TableRowActions = ({row}) => { + const t = useTranslations(); + const { + openConfirmDialog, + openRejectDialog, + handleOpenConfirmDialog, + handleOpenRejectDialog, + handleCloseConfirmDialog, + handleCloseRejectDialog, + rowId, + confirmData, + rejectData, + } = useContext(DataTableContext); + return ( + + + { + handleOpenConfirmDialog(row); + }} + > + + + + {openConfirmDialog && ( + + )} + + handleOpenRejectDialog(row)}> + + + + {openRejectDialog && ( + + )} + + ); }; export default TableRowActions; diff --git a/src/components/dashboard/passenger-boss/TableTollbar.jsx b/src/components/dashboard/passenger-boss/TableTollbar.jsx index 3f06d3b..e267691 100644 --- a/src/components/dashboard/passenger-boss/TableTollbar.jsx +++ b/src/components/dashboard/passenger-boss/TableTollbar.jsx @@ -1,13 +1,13 @@ -import { Stack, Tooltip } from "@mui/material"; -import { useTranslations } from "next-intl"; +import {Stack, Tooltip} from "@mui/material"; +import {useTranslations} from "next-intl"; function TableToolbar() { - const t = useTranslations(); - return ( - - - - ); + const t = useTranslations(); + return ( + + + + ); } export default TableToolbar; diff --git a/src/components/dashboard/passenger-boss/index.jsx b/src/components/dashboard/passenger-boss/index.jsx index a741312..72f567e 100644 --- a/src/components/dashboard/passenger-boss/index.jsx +++ b/src/components/dashboard/passenger-boss/index.jsx @@ -1,245 +1,242 @@ import DataTableStructure from "@/core/components/DatatableStructure"; import DashboardLayouts from "@/layouts/dashboardLayouts"; -import { Box, IconButton, Typography } from "@mui/material"; +import {Box, IconButton, Typography} from "@mui/material"; import ClearIcon from "@mui/icons-material/Clear"; -import { useMemo } from "react"; +import {useMemo} from "react"; // import TableToolbar from "./TableTollbar"; -import { GET_PASSENGER_BOSS } from "@/core/data/apiRoutes"; -import { useTranslations } from "next-intl"; +import {GET_PASSENGER_BOSS} from "@/core/data/apiRoutes"; +import {useTranslations} from "next-intl"; import TableRowActions from "./TableRowActions"; -import { - LocalizationProvider, - MobileDateTimePicker, -} from "@mui/x-date-pickers"; -import { AdapterDateFnsJalali } from "@mui/x-date-pickers/AdapterDateFnsJalali"; +import {LocalizationProvider, MobileDateTimePicker,} from "@mui/x-date-pickers"; +import {AdapterDateFnsJalali} from "@mui/x-date-pickers/AdapterDateFnsJalali"; import moment from "jalali-moment"; -import { faIR } from "@mui/x-date-pickers/locales"; +import {faIR} from "@mui/x-date-pickers/locales"; function DashboardPassengerOfficeComponent() { - const t = useTranslations(); + const t = useTranslations(); - const columns = useMemo( - () => [ - { - accessorFn: (row) => row.id, - id: "id", - header: t("PassengerBoss.id"), - enableColumnFilter: true, - datatype: "numeric", - filterFn: "equals", - maxSize: 100, - columnFilterModeOptions: [ - "equals", - "notEquals", - "contains", - "lessThan", - "greaterThan", - "between", + const columns = useMemo( + () => [ + { + accessorFn: (row) => row.id, + id: "id", + header: t("PassengerBoss.id"), + enableColumnFilter: true, + datatype: "numeric", + filterFn: "equals", + maxSize: 100, + columnFilterModeOptions: [ + "equals", + "notEquals", + "contains", + "lessThan", + "greaterThan", + "between", + ], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.name, + id: "name", + header: t("PassengerBoss.name"), + enableColumnFilter: true, + datatype: "text", + filterFn: "contains", + columnFilterModeOptions: ["contains", "equals", "notEquals"], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.national_id, + id: "national_id", + header: t("PassengerBoss.national_id"), + enableColumnFilter: true, + datatype: "numeric", + filterFn: "equals", + columnFilterModeOptions: [ + "equals", + "notEquals", + "contains", + "lessThan", + "greaterThan", + "between", + ], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.phone_number, + id: "phone_number", + header: t("PassengerBoss.phone_number"), + enableColumnFilter: true, + datatype: "numeric", + filterFn: "equals", + columnFilterModeOptions: [ + "equals", + "notEquals", + "contains", + "lessThan", + "greaterThan", + "between", + ], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => + moment(row.created_at).locale("fa").format("HH:mm | yyyy/MM/DD"), + id: "created_at", + header: t("PassengerBoss.created_at"), + enableColumnFilter: true, + datatype: "date", + filterFn: "lessThan", + minSize: 200, + columnFilterModeOptions: ["lessThan", "greaterThan"], + Cell: ({renderedCellValue}) => { + return {renderedCellValue}; + }, + Header: ({column}) => {column.columnDef.header}, + Filter: ({column}) => { + const filterFnValue = column.columnDef._filterFn; + return ( + + + { + const date = new Date(newValue); + const formattedDate = moment(date) + .locale("en") + .format("YYYY-MM-DD HH:mm"); + column.setFilterValue(formattedDate); + }} + slotProps={{ + textField: { + placeholder: "تاریخ خود را وارد کنید", + helperText: `${t("filter_mode")}: ${t(filterFnValue)}`, + sx: {minWidth: "120px"}, + variant: "standard", + }, + }} + value={ + column.getFilterValue() + ? new Date(column.getFilterValue()) + : null + } + /> + + { + column.setFilterValue(null); + }} + sx={{ + color: column.getFilterValue() + ? "rgba(0, 0, 0, 0.54)" + : "#bfbfbf", + }} + > + + + + ); + }, + }, + { + accessorFn: (row) => + moment(row.updated_at).locale("fa").format("HH:mm | yyyy/MM/DD"), + id: "updated_at", + header: t("PassengerBoss.updated_at"), + enableColumnFilter: false, + datatype: "numeric", + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.navgan_id, + id: "navgan_id", + header: t("PassengerBoss.navgan_id"), + enableColumnFilter: true, + datatype: "numeric", + filterFn: "equals", + maxSize: 100, + columnFilterModeOptions: [ + "equals", + "notEquals", + "contains", + "lessThan", + "greaterThan", + "between", + ], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.vehicle_type, + id: "vehicle_type", + header: t("PassengerBoss.vehicle_type"), + enableColumnFilter: true, + datatype: "text", + filterFn: "contains", + columnFilterModeOptions: ["contains", "equals", "notEquals"], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.state_name, + id: "state_id", + header: t("PassengerBoss.state_name"), + enableColumnFilter: false, + datatype: "numeric", + minSize: 300, + // filterFn: "equals", + // filterSelectOptions: [ + // ], + // filterVariant: "select", + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, ], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.name, - id: "name", - header: t("PassengerBoss.name"), - enableColumnFilter: true, - datatype: "text", - filterFn: "contains", - columnFilterModeOptions: ["contains", "equals", "notEquals"], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.national_id, - id: "national_id", - header: t("PassengerBoss.national_id"), - enableColumnFilter: true, - datatype: "numeric", - filterFn: "equals", - columnFilterModeOptions: [ - "equals", - "notEquals", - "contains", - "lessThan", - "greaterThan", - "between", - ], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.phone_number, - id: "phone_number", - header: t("PassengerBoss.phone_number"), - enableColumnFilter: true, - datatype: "numeric", - filterFn: "equals", - columnFilterModeOptions: [ - "equals", - "notEquals", - "contains", - "lessThan", - "greaterThan", - "between", - ], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => - moment(row.created_at).locale("fa").format("HH:mm | yyyy/MM/DD"), - id: "created_at", - header: t("PassengerBoss.created_at"), - enableColumnFilter: true, - datatype: "date", - filterFn: "lessThan", - minSize: 200, - columnFilterModeOptions: ["lessThan", "greaterThan"], - Cell: ({ renderedCellValue }) => { - return {renderedCellValue}; - }, - Header: ({ column }) => {column.columnDef.header}, - Filter: ({ column }) => { - const filterFnValue = column.columnDef._filterFn; - return ( - - - { - const date = new Date(newValue); - const formattedDate = moment(date) - .locale("en") - .format("YYYY-MM-DD HH:mm"); - column.setFilterValue(formattedDate); - }} - slotProps={{ - textField: { - placeholder: "تاریخ خود را وارد کنید", - helperText: `${t("filter_mode")}: ${t(filterFnValue)}`, - sx: { minWidth: "120px" }, - variant: "standard", - }, - }} - value={ - column.getFilterValue() - ? new Date(column.getFilterValue()) - : null - } + [] + ); + return ( + + + } + enableLastUpdate={true} + enablePinning={true} + enableDensityToggle={true} + enableColumnFilters={true} + enableHiding={true} + enableFullScreenToggle={false} + enableGlobalFilter={false} + enableColumnResizing={false} // if you want true this you shold change renderRowActions props ** see https://www.material-react-table.com/docs/guides/row-actions + enableRowActions={true} + renderRowActions={({row}) => } /> - - { - column.setFilterValue(null); - }} - sx={{ - color: column.getFilterValue() - ? "rgba(0, 0, 0, 0.54)" - : "#bfbfbf", - }} - > - - - ); - }, - }, - { - accessorFn: (row) => - moment(row.updated_at).locale("fa").format("HH:mm | yyyy/MM/DD"), - id: "updated_at", - header: t("PassengerBoss.updated_at"), - enableColumnFilter: false, - datatype: "numeric", - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.navgan_id, - id: "navgan_id", - header: t("PassengerBoss.navgan_id"), - enableColumnFilter: true, - datatype: "numeric", - filterFn: "equals", - maxSize: 100, - columnFilterModeOptions: [ - "equals", - "notEquals", - "contains", - "lessThan", - "greaterThan", - "between", - ], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.vehicle_type, - id: "vehicle_type", - header: t("PassengerBoss.vehicle_type"), - enableColumnFilter: true, - datatype: "text", - filterFn: "contains", - columnFilterModeOptions: ["contains", "equals", "notEquals"], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.state_name, - id: "state_id", - header: t("PassengerBoss.state_name"), - enableColumnFilter: false, - datatype: "numeric", - minSize: 300, - // filterFn: "equals", - // filterSelectOptions: [ - // ], - // filterVariant: "select", - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - ], - [] - ); - return ( - - - } - enableLastUpdate={true} - enablePinning={true} - enableDensityToggle={true} - enableColumnFilters={true} - enableHiding={true} - enableFullScreenToggle={false} - enableGlobalFilter={false} - enableColumnResizing={false} // if you want true this you shold change renderRowActions props ** see https://www.material-react-table.com/docs/guides/row-actions - enableRowActions={true} - renderRowActions={({ row }) => } - /> - - - ); + + ); } export default DashboardPassengerOfficeComponent; diff --git a/src/components/dashboard/passenger-office/Form/ConfirmForm.jsx b/src/components/dashboard/passenger-office/Form/ConfirmForm.jsx index 1e02f33..c5abc13 100644 --- a/src/components/dashboard/passenger-office/Form/ConfirmForm.jsx +++ b/src/components/dashboard/passenger-office/Form/ConfirmForm.jsx @@ -1,106 +1,98 @@ import UploadSystem from "@/core/components/UploadSystem"; import UploadFileNotification from "@/core/components/notifications/UploadFileNotification"; -import { CONFIRM_PASSENGER_OFFICE } from "@/core/data/apiRoutes"; +import {CONFIRM_PASSENGER_OFFICE} from "@/core/data/apiRoutes"; import useDirection from "@/lib/app/hooks/useDirection"; -import { - Dialog, - DialogTitle, - DialogContent, - DialogContentText, - DialogActions, - Button, - TextField, -} from "@mui/material"; -import { useFormik } from "formik"; -import { useTranslations } from "next-intl"; -import { useRef, useState } from "react"; +import {Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, TextField,} from "@mui/material"; +import {useFormik} from "formik"; +import {useTranslations} from "next-intl"; +import {useState} from "react"; -const ConfirmForm = ({ open, handleClose, rowId, confirmData }) => { - const t = useTranslations(); - const { directionApp } = useDirection(); - const [description, setDescription] = useState(""); - const [selectedImage, setSelectedImage] = useState(""); - const [fileType, setfileType] = useState(null); - const [fileName, setfileName] = useState(null); - const [showAddIcon, setShowAddIcon] = useState(true); +const ConfirmForm = ({open, handleClose, rowId, confirmData}) => { + const t = useTranslations(); + const {directionApp} = useDirection(); + const [description, setDescription] = useState(""); + const [selectedImage, setSelectedImage] = useState(""); + const [fileType, setfileType] = useState(null); + const [fileName, setfileName] = useState(null); + const [showAddIcon, setShowAddIcon] = useState(true); - const formik = useFormik({ - initialValues: { - description: "", - }, - onSubmit: () => { - const formData = new FormData(); - if (description !== "") - formData.append("expert_description", description); - handleClose(); - confirmData(CONFIRM_PASSENGER_OFFICE, rowId, formData); - }, - }); + const formik = useFormik({ + initialValues: { + description: "", + }, + onSubmit: () => { + const formData = new FormData(); + if (description !== "") + formData.append("expert_description", description); + handleClose(); + confirmData(CONFIRM_PASSENGER_OFFICE, rowId, formData); + }, + }); - const handleDescriptionChange = (event) => { - setDescription(event.target.value); - formik.handleChange(event); - }; + const handleDescriptionChange = (event) => { + setDescription(event.target.value); + formik.handleChange(event); + }; - const handleUploadChange = (event) => { - const uploadedFile = event.target?.files?.[0]; - if (uploadedFile) { - const maxFileSize = 2 * 1024 * 1024; - if (uploadedFile.size > maxFileSize) { - UploadFileNotification(directionApp, t); - event.target.value = ""; - return; - } - const fileType = event.target?.files?.[0].type; - const fileName = event.target?.files?.[0].name; - setSelectedImage(URL.createObjectURL(uploadedFile)); - setfileType(fileType); - setfileName(fileName); - formik.setFieldValue("confirm_img", uploadedFile); - setShowAddIcon(false); - } - }; + const handleUploadChange = (event) => { + const uploadedFile = event.target?.files?.[0]; + if (uploadedFile) { + const maxFileSize = 2 * 1024 * 1024; + if (uploadedFile.size > maxFileSize) { + UploadFileNotification(directionApp, t); + event.target.value = ""; + return; + } + const fileType = event.target?.files?.[0].type; + const fileName = event.target?.files?.[0].name; + setSelectedImage(URL.createObjectURL(uploadedFile)); + setfileType(fileType); + setfileName(fileName); + formik.setFieldValue("confirm_img", uploadedFile); + setShowAddIcon(false); + } + }; - return ( - - {t("ConfirmDialog.confirm")} - - {t("ConfirmDialog.context")} - - - - - - - - - ); + return ( + + {t("ConfirmDialog.confirm")} + + {t("ConfirmDialog.context")} + + + + + + + + + ); }; export default ConfirmForm; diff --git a/src/components/dashboard/passenger-office/Form/RejectForm.jsx b/src/components/dashboard/passenger-office/Form/RejectForm.jsx index 6b66c7a..ec3b07a 100644 --- a/src/components/dashboard/passenger-office/Form/RejectForm.jsx +++ b/src/components/dashboard/passenger-office/Form/RejectForm.jsx @@ -1,114 +1,106 @@ -import { REJECT_PASSENGER_OFFICE } from "@/core/data/apiRoutes"; -import { - Dialog, - DialogTitle, - DialogContent, - DialogContentText, - DialogActions, - Button, - TextField, -} from "@mui/material"; -import { useTranslations } from "next-intl"; -import { useFormik } from "formik"; +import {REJECT_PASSENGER_OFFICE} from "@/core/data/apiRoutes"; +import {Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, TextField,} from "@mui/material"; +import {useTranslations} from "next-intl"; +import {useFormik} from "formik"; import * as Yup from "yup"; -import { useState } from "react"; +import {useState} from "react"; import UploadSystem from "@/core/components/UploadSystem"; import UploadFileNotification from "@/core/components/notifications/UploadFileNotification"; import useDirection from "@/lib/app/hooks/useDirection"; -const RejectForm = ({ open, handleClose, rowId, rejectData }) => { - const t = useTranslations(); - const { directionApp } = useDirection(); - const [description, setDescription] = useState(""); - const [selectedImage, setSelectedImage] = useState(""); - const [fileType, setfileType] = useState(null); - const [fileName, setfileName] = useState(null); - const [showAddIcon, setShowAddIcon] = useState(true); +const RejectForm = ({open, handleClose, rowId, rejectData}) => { + const t = useTranslations(); + const {directionApp} = useDirection(); + const [description, setDescription] = useState(""); + const [selectedImage, setSelectedImage] = useState(""); + const [fileType, setfileType] = useState(null); + const [fileName, setfileName] = useState(null); + const [showAddIcon, setShowAddIcon] = useState(true); - const validationSchema = Yup.object().shape({ - description: Yup.string().required(t("RejectDialog.description_error")), - }); + const validationSchema = Yup.object().shape({ + description: Yup.string().required(t("RejectDialog.description_error")), + }); - const formik = useFormik({ - initialValues: { - description: "", - }, - validationSchema, - onSubmit: () => { - const formData = new FormData(); - formData.append("expert_description", description); - handleClose(); - rejectData(REJECT_PASSENGER_OFFICE, rowId, formData); - }, - }); + const formik = useFormik({ + initialValues: { + description: "", + }, + validationSchema, + onSubmit: () => { + const formData = new FormData(); + formData.append("expert_description", description); + handleClose(); + rejectData(REJECT_PASSENGER_OFFICE, rowId, formData); + }, + }); - const handleDescriptionChange = (event) => { - setDescription(event.target.value); - formik.handleChange(event); - }; - const handleUploadChange = (event) => { - const uploadedFile = event.target?.files?.[0]; - if (uploadedFile) { - const maxFileSize = 2 * 1024 * 1024; - if (uploadedFile.size > maxFileSize) { - UploadFileNotification(directionApp, t); - event.target.value = ""; - return; - } - const fileType = event.target?.files?.[0].type; - const fileName = event.target?.files?.[0].name; - setSelectedImage(URL.createObjectURL(uploadedFile)); - setfileType(fileType); - setfileName(fileName); - formik.setFieldValue("reject_img", uploadedFile); - setShowAddIcon(false); - } - }; - return ( - - {t("RejectDialog.reject")} - - {t("RejectDialog.context")} - - - - - - - - - ); + const handleDescriptionChange = (event) => { + setDescription(event.target.value); + formik.handleChange(event); + }; + const handleUploadChange = (event) => { + const uploadedFile = event.target?.files?.[0]; + if (uploadedFile) { + const maxFileSize = 2 * 1024 * 1024; + if (uploadedFile.size > maxFileSize) { + UploadFileNotification(directionApp, t); + event.target.value = ""; + return; + } + const fileType = event.target?.files?.[0].type; + const fileName = event.target?.files?.[0].name; + setSelectedImage(URL.createObjectURL(uploadedFile)); + setfileType(fileType); + setfileName(fileName); + formik.setFieldValue("reject_img", uploadedFile); + setShowAddIcon(false); + } + }; + return ( + + {t("RejectDialog.reject")} + + {t("RejectDialog.context")} + + + + + + + + + ); }; export default RejectForm; diff --git a/src/components/dashboard/passenger-office/TableRowActions.jsx b/src/components/dashboard/passenger-office/TableRowActions.jsx index 30367b9..13c6e7b 100644 --- a/src/components/dashboard/passenger-office/TableRowActions.jsx +++ b/src/components/dashboard/passenger-office/TableRowActions.jsx @@ -1,60 +1,60 @@ import ThumbUpAltIcon from "@mui/icons-material/ThumbUpAlt"; import ThumbDownIcon from "@mui/icons-material/ThumbDown"; -import { Box, IconButton, Tooltip } from "@mui/material"; -import { useContext } from "react"; +import {Box, IconButton, Tooltip} from "@mui/material"; +import {useContext} from "react"; import ConfirmForm from "./Form/ConfirmForm"; import RejectForm from "./Form/RejectForm"; -import { useTranslations } from "next-intl"; -import { DataTableContext } from "@/lib/app/contexts/DatatableContext"; +import {useTranslations} from "next-intl"; +import {DataTableContext} from "@/lib/app/contexts/DatatableContext"; -const TableRowActions = ({ row }) => { - const t = useTranslations(); - const { - openConfirmDialog, - openRejectDialog, - handleOpenConfirmDialog, - handleOpenRejectDialog, - handleCloseConfirmDialog, - handleCloseRejectDialog, - rowId, - confirmData, - rejectData, - } = useContext(DataTableContext); - return ( - - - { - handleOpenConfirmDialog(row); - }} - > - - - - {openConfirmDialog && ( - - )} - - handleOpenRejectDialog(row)}> - - - - {openRejectDialog && ( - - )} - - ); +const TableRowActions = ({row}) => { + const t = useTranslations(); + const { + openConfirmDialog, + openRejectDialog, + handleOpenConfirmDialog, + handleOpenRejectDialog, + handleCloseConfirmDialog, + handleCloseRejectDialog, + rowId, + confirmData, + rejectData, + } = useContext(DataTableContext); + return ( + + + { + handleOpenConfirmDialog(row); + }} + > + + + + {openConfirmDialog && ( + + )} + + handleOpenRejectDialog(row)}> + + + + {openRejectDialog && ( + + )} + + ); }; export default TableRowActions; diff --git a/src/components/dashboard/passenger-office/TableTollbar.jsx b/src/components/dashboard/passenger-office/TableTollbar.jsx index 3f06d3b..e267691 100644 --- a/src/components/dashboard/passenger-office/TableTollbar.jsx +++ b/src/components/dashboard/passenger-office/TableTollbar.jsx @@ -1,13 +1,13 @@ -import { Stack, Tooltip } from "@mui/material"; -import { useTranslations } from "next-intl"; +import {Stack, Tooltip} from "@mui/material"; +import {useTranslations} from "next-intl"; function TableToolbar() { - const t = useTranslations(); - return ( - - - - ); + const t = useTranslations(); + return ( + + + + ); } export default TableToolbar; diff --git a/src/components/dashboard/passenger-office/index.jsx b/src/components/dashboard/passenger-office/index.jsx index 5401adc..5f8ddc5 100644 --- a/src/components/dashboard/passenger-office/index.jsx +++ b/src/components/dashboard/passenger-office/index.jsx @@ -1,247 +1,243 @@ import DataTableStructure from "@/core/components/DatatableStructure"; import DashboardLayouts from "@/layouts/dashboardLayouts"; -import { Box, IconButton, Typography } from "@mui/material"; +import {Box, IconButton, Typography} from "@mui/material"; import ClearIcon from "@mui/icons-material/Clear"; -import { useMemo } from "react"; -import { faIR } from "@mui/x-date-pickers/locales"; +import {useMemo} from "react"; +import {faIR} from "@mui/x-date-pickers/locales"; // import TableToolbar from "./TableTollbar"; -import { GET_PASSENGER_OFFICE } from "@/core/data/apiRoutes"; -import { useTranslations } from "next-intl"; +import {GET_PASSENGER_OFFICE} from "@/core/data/apiRoutes"; +import {useTranslations} from "next-intl"; import TableRowActions from "./TableRowActions"; -import { - LocalizationProvider, - MobileDateTimePicker, -} from "@mui/x-date-pickers"; -import { AdapterDateFnsJalali } from "@mui/x-date-pickers/AdapterDateFnsJalali"; +import {LocalizationProvider, MobileDateTimePicker,} from "@mui/x-date-pickers"; +import {AdapterDateFnsJalali} from "@mui/x-date-pickers/AdapterDateFnsJalali"; import moment from "jalali-moment"; -import dayjs from "dayjs"; function DashboardPassengerOfficeComponent() { - const t = useTranslations(); + const t = useTranslations(); - const columns = useMemo( - () => [ - { - accessorFn: (row) => row.id, - id: "id", - header: t("PassengerOffice.id"), - enableColumnFilter: true, - datatype: "numeric", - maxSize: 100, - filterFn: "equals", - columnFilterModeOptions: [ - "equals", - "notEquals", - "contains", - "lessThan", - "greaterThan", - "between", + const columns = useMemo( + () => [ + { + accessorFn: (row) => row.id, + id: "id", + header: t("PassengerOffice.id"), + enableColumnFilter: true, + datatype: "numeric", + maxSize: 100, + filterFn: "equals", + columnFilterModeOptions: [ + "equals", + "notEquals", + "contains", + "lessThan", + "greaterThan", + "between", + ], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.name, + id: "name", + header: t("PassengerOffice.name"), + enableColumnFilter: true, + datatype: "text", + filterFn: "contains", + columnFilterModeOptions: ["contains", "equals", "notEquals"], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.national_id, + id: "national_id", + header: t("PassengerOffice.national_id"), + enableColumnFilter: true, + datatype: "numeric", + filterFn: "equals", + columnFilterModeOptions: [ + "equals", + "notEquals", + "contains", + "lessThan", + "greaterThan", + "between", + ], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.phone_number, + id: "phone_number", + header: t("PassengerOffice.phone_number"), + enableColumnFilter: true, + datatype: "numeric", + filterFn: "equals", + columnFilterModeOptions: [ + "equals", + "notEquals", + "contains", + "lessThan", + "greaterThan", + "between", + ], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => + moment(row.created_at).locale("fa").format("HH:mm | yyyy/MM/DD"), + id: "created_at", + header: t("PassengerOffice.created_at"), + enableColumnFilter: true, + datatype: "date", + filterFn: "lessThan", + minSize: 200, + columnFilterModeOptions: ["lessThan", "greaterThan"], + Cell: ({renderedCellValue}) => { + return {renderedCellValue}; + }, + Header: ({column}) => {column.columnDef.header}, + Filter: ({column}) => { + const filterFnValue = column.columnDef._filterFn; + return ( + + + { + const date = new Date(newValue); + const formattedDate = moment(date) + .locale("en") + .format("YYYY-MM-DD HH:mm"); + column.setFilterValue(formattedDate); + }} + slotProps={{ + textField: { + placeholder: "تاریخ خود را وارد کنید", + helperText: `${t("filter_mode")}: ${t(filterFnValue)}`, + sx: {minWidth: "120px"}, + variant: "standard", + actionBar: {actions: ["accept", "today"]}, + }, + }} + value={ + column.getFilterValue() + ? new Date(column.getFilterValue()) + : null + } + /> + + { + column.setFilterValue(null); + }} + sx={{ + color: column.getFilterValue() + ? "rgba(0, 0, 0, 0.54)" + : "#bfbfbf", + }} + > + + + + ); + }, + }, + { + accessorFn: (row) => + moment(row.updated_at).locale("fa").format("HH:mm | YYYY/MM/DD"), + id: "updated_at", + header: t("PassengerOffice.updated_at"), + enableColumnFilter: false, + datatype: "numeric", + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.navgan_id, + id: "navgan_id", + header: t("PassengerOffice.navgan_id"), + enableColumnFilter: true, + datatype: "numeric", + maxSize: 100, + filterFn: "equals", + columnFilterModeOptions: [ + "equals", + "notEquals", + "contains", + "lessThan", + "greaterThan", + "between", + ], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.vehicle_type, + id: "vehicle_type", + header: t("PassengerOffice.vehicle_type"), + enableColumnFilter: true, + datatype: "text", + filterFn: "contains", + columnFilterModeOptions: ["contains", "equals", "notEquals"], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.state_name, + id: "state_id", + header: t("PassengerOffice.state_name"), + enableColumnFilter: false, + datatype: "numeric", + minSize: 300, + // filterFn: "equals", + // filterSelectOptions: [ + // ], + // filterVariant: "select", + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, ], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.name, - id: "name", - header: t("PassengerOffice.name"), - enableColumnFilter: true, - datatype: "text", - filterFn: "contains", - columnFilterModeOptions: ["contains", "equals", "notEquals"], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.national_id, - id: "national_id", - header: t("PassengerOffice.national_id"), - enableColumnFilter: true, - datatype: "numeric", - filterFn: "equals", - columnFilterModeOptions: [ - "equals", - "notEquals", - "contains", - "lessThan", - "greaterThan", - "between", - ], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.phone_number, - id: "phone_number", - header: t("PassengerOffice.phone_number"), - enableColumnFilter: true, - datatype: "numeric", - filterFn: "equals", - columnFilterModeOptions: [ - "equals", - "notEquals", - "contains", - "lessThan", - "greaterThan", - "between", - ], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => - moment(row.created_at).locale("fa").format("HH:mm | yyyy/MM/DD"), - id: "created_at", - header: t("PassengerOffice.created_at"), - enableColumnFilter: true, - datatype: "date", - filterFn: "lessThan", - minSize: 200, - columnFilterModeOptions: ["lessThan", "greaterThan"], - Cell: ({ renderedCellValue }) => { - return {renderedCellValue}; - }, - Header: ({ column }) => {column.columnDef.header}, - Filter: ({ column }) => { - const filterFnValue = column.columnDef._filterFn; - return ( - - - { - const date = new Date(newValue); - const formattedDate = moment(date) - .locale("en") - .format("YYYY-MM-DD HH:mm"); - column.setFilterValue(formattedDate); - }} - slotProps={{ - textField: { - placeholder: "تاریخ خود را وارد کنید", - helperText: `${t("filter_mode")}: ${t(filterFnValue)}`, - sx: { minWidth: "120px" }, - variant: "standard", - actionBar: { actions: ["accept", "today"] }, - }, - }} - value={ - column.getFilterValue() - ? new Date(column.getFilterValue()) - : null - } + [] + ); + return ( + + + } + enableLastUpdate={true} + enablePinning={true} + enableDensityToggle={true} + enableColumnFilters={true} + enableHiding={true} + enableFullScreenToggle={false} + enableGlobalFilter={false} + enableColumnResizing={false} // if you want true this you shold change renderRowActions props ** see https://www.material-react-table.com/docs/guides/row-actions + enableRowActions={true} + renderRowActions={({row}) => } /> - - { - column.setFilterValue(null); - }} - sx={{ - color: column.getFilterValue() - ? "rgba(0, 0, 0, 0.54)" - : "#bfbfbf", - }} - > - - - ); - }, - }, - { - accessorFn: (row) => - moment(row.updated_at).locale("fa").format("HH:mm | YYYY/MM/DD"), - id: "updated_at", - header: t("PassengerOffice.updated_at"), - enableColumnFilter: false, - datatype: "numeric", - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.navgan_id, - id: "navgan_id", - header: t("PassengerOffice.navgan_id"), - enableColumnFilter: true, - datatype: "numeric", - maxSize: 100, - filterFn: "equals", - columnFilterModeOptions: [ - "equals", - "notEquals", - "contains", - "lessThan", - "greaterThan", - "between", - ], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.vehicle_type, - id: "vehicle_type", - header: t("PassengerOffice.vehicle_type"), - enableColumnFilter: true, - datatype: "text", - filterFn: "contains", - columnFilterModeOptions: ["contains", "equals", "notEquals"], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.state_name, - id: "state_id", - header: t("PassengerOffice.state_name"), - enableColumnFilter: false, - datatype: "numeric", - minSize: 300, - // filterFn: "equals", - // filterSelectOptions: [ - // ], - // filterVariant: "select", - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - ], - [] - ); - return ( - - - } - enableLastUpdate={true} - enablePinning={true} - enableDensityToggle={true} - enableColumnFilters={true} - enableHiding={true} - enableFullScreenToggle={false} - enableGlobalFilter={false} - enableColumnResizing={false} // if you want true this you shold change renderRowActions props ** see https://www.material-react-table.com/docs/guides/row-actions - enableRowActions={true} - renderRowActions={({ row }) => } - /> - - - ); + + ); } export default DashboardPassengerOfficeComponent; diff --git a/src/components/dashboard/province-manager/Form/ConfirmForm.jsx b/src/components/dashboard/province-manager/Form/ConfirmForm.jsx index 69e3a62..e456631 100644 --- a/src/components/dashboard/province-manager/Form/ConfirmForm.jsx +++ b/src/components/dashboard/province-manager/Form/ConfirmForm.jsx @@ -1,106 +1,98 @@ import UploadSystem from "@/core/components/UploadSystem"; import UploadFileNotification from "@/core/components/notifications/UploadFileNotification"; -import { CONFIRM_PROVINCE_MANAGER } from "@/core/data/apiRoutes"; +import {CONFIRM_PROVINCE_MANAGER} from "@/core/data/apiRoutes"; import useDirection from "@/lib/app/hooks/useDirection"; -import { - Dialog, - DialogTitle, - DialogContent, - DialogContentText, - DialogActions, - Button, - TextField, -} from "@mui/material"; -import { useFormik } from "formik"; -import { useTranslations } from "next-intl"; -import { useRef, useState } from "react"; +import {Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, TextField,} from "@mui/material"; +import {useFormik} from "formik"; +import {useTranslations} from "next-intl"; +import {useState} from "react"; -const ConfirmForm = ({ open, handleClose, rowId, confirmData }) => { - const t = useTranslations(); - const { directionApp } = useDirection(); - const [description, setDescription] = useState(""); - const [selectedImage, setSelectedImage] = useState(""); - const [fileType, setfileType] = useState(null); - const [fileName, setfileName] = useState(null); - const [showAddIcon, setShowAddIcon] = useState(true); +const ConfirmForm = ({open, handleClose, rowId, confirmData}) => { + const t = useTranslations(); + const {directionApp} = useDirection(); + const [description, setDescription] = useState(""); + const [selectedImage, setSelectedImage] = useState(""); + const [fileType, setfileType] = useState(null); + const [fileName, setfileName] = useState(null); + const [showAddIcon, setShowAddIcon] = useState(true); - const formik = useFormik({ - initialValues: { - description: "", - }, - onSubmit: () => { - const formData = new FormData(); - if (description !== "") - formData.append("expert_description", description); - handleClose(); - confirmData(CONFIRM_PROVINCE_MANAGER, rowId, formData); - }, - }); + const formik = useFormik({ + initialValues: { + description: "", + }, + onSubmit: () => { + const formData = new FormData(); + if (description !== "") + formData.append("expert_description", description); + handleClose(); + confirmData(CONFIRM_PROVINCE_MANAGER, rowId, formData); + }, + }); - const handleDescriptionChange = (event) => { - setDescription(event.target.value); - formik.handleChange(event); - }; + const handleDescriptionChange = (event) => { + setDescription(event.target.value); + formik.handleChange(event); + }; - const handleUploadChange = (event) => { - const uploadedFile = event.target?.files?.[0]; - if (uploadedFile) { - const maxFileSize = 2 * 1024 * 1024; - if (uploadedFile.size > maxFileSize) { - UploadFileNotification(directionApp, t); - event.target.value = ""; - return; - } - const fileType = event.target?.files?.[0].type; - const fileName = event.target?.files?.[0].name; - setSelectedImage(URL.createObjectURL(uploadedFile)); - setfileType(fileType); - setfileName(fileName); - formik.setFieldValue("confirm_img", uploadedFile); - setShowAddIcon(false); - } - }; + const handleUploadChange = (event) => { + const uploadedFile = event.target?.files?.[0]; + if (uploadedFile) { + const maxFileSize = 2 * 1024 * 1024; + if (uploadedFile.size > maxFileSize) { + UploadFileNotification(directionApp, t); + event.target.value = ""; + return; + } + const fileType = event.target?.files?.[0].type; + const fileName = event.target?.files?.[0].name; + setSelectedImage(URL.createObjectURL(uploadedFile)); + setfileType(fileType); + setfileName(fileName); + formik.setFieldValue("confirm_img", uploadedFile); + setShowAddIcon(false); + } + }; - return ( - - {t("ConfirmDialog.confirm")} - - {t("ConfirmDialog.context")} - - - - - - - - - ); + return ( + + {t("ConfirmDialog.confirm")} + + {t("ConfirmDialog.context")} + + + + + + + + + ); }; export default ConfirmForm; diff --git a/src/components/dashboard/province-manager/Form/RejectForm.jsx b/src/components/dashboard/province-manager/Form/RejectForm.jsx index f1e266d..a50bcf0 100644 --- a/src/components/dashboard/province-manager/Form/RejectForm.jsx +++ b/src/components/dashboard/province-manager/Form/RejectForm.jsx @@ -1,115 +1,107 @@ -import { REJECT_PROVINCE_MANAGER } from "@/core/data/apiRoutes"; -import { - Dialog, - DialogTitle, - DialogContent, - DialogContentText, - DialogActions, - Button, - TextField, -} from "@mui/material"; -import { useTranslations } from "next-intl"; -import { useFormik } from "formik"; +import {REJECT_PROVINCE_MANAGER} from "@/core/data/apiRoutes"; +import {Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, TextField,} from "@mui/material"; +import {useTranslations} from "next-intl"; +import {useFormik} from "formik"; import * as Yup from "yup"; -import { useState } from "react"; +import {useState} from "react"; import UploadSystem from "@/core/components/UploadSystem"; import UploadFileNotification from "@/core/components/notifications/UploadFileNotification"; import useDirection from "@/lib/app/hooks/useDirection"; -const RejectForm = ({ open, handleClose, rowId, rejectData }) => { - const t = useTranslations(); - const { directionApp } = useDirection(); - const [description, setDescription] = useState(""); - const [selectedImage, setSelectedImage] = useState(""); - const [fileType, setfileType] = useState(null); - const [fileName, setfileName] = useState(null); - const [showAddIcon, setShowAddIcon] = useState(true); +const RejectForm = ({open, handleClose, rowId, rejectData}) => { + const t = useTranslations(); + const {directionApp} = useDirection(); + const [description, setDescription] = useState(""); + const [selectedImage, setSelectedImage] = useState(""); + const [fileType, setfileType] = useState(null); + const [fileName, setfileName] = useState(null); + const [showAddIcon, setShowAddIcon] = useState(true); - const validationSchema = Yup.object().shape({ - description: Yup.string().required(t("RejectDialog.description_error")), - }); + const validationSchema = Yup.object().shape({ + description: Yup.string().required(t("RejectDialog.description_error")), + }); - const formik = useFormik({ - initialValues: { - description: "", - }, - validationSchema, - onSubmit: () => { - const formData = new FormData(); - formData.append("expert_description", description); - handleClose(); - rejectData(REJECT_PROVINCE_MANAGER, rowId, formData); - }, - }); + const formik = useFormik({ + initialValues: { + description: "", + }, + validationSchema, + onSubmit: () => { + const formData = new FormData(); + formData.append("expert_description", description); + handleClose(); + rejectData(REJECT_PROVINCE_MANAGER, rowId, formData); + }, + }); - const handleDescriptionChange = (event) => { - setDescription(event.target.value); - formik.handleChange(event); - }; - const handleUploadChange = (event) => { - const uploadedFile = event.target?.files?.[0]; - if (uploadedFile) { - const maxFileSize = 2 * 1024 * 1024; - if (uploadedFile.size > maxFileSize) { - UploadFileNotification(directionApp, t); - event.target.value = ""; - return; - } - const fileType = event.target?.files?.[0].type; - const fileName = event.target?.files?.[0].name; - setSelectedImage(URL.createObjectURL(uploadedFile)); - setfileType(fileType); - setfileName(fileName); - formik.setFieldValue("reject_img", uploadedFile); - setShowAddIcon(false); - } - }; + const handleDescriptionChange = (event) => { + setDescription(event.target.value); + formik.handleChange(event); + }; + const handleUploadChange = (event) => { + const uploadedFile = event.target?.files?.[0]; + if (uploadedFile) { + const maxFileSize = 2 * 1024 * 1024; + if (uploadedFile.size > maxFileSize) { + UploadFileNotification(directionApp, t); + event.target.value = ""; + return; + } + const fileType = event.target?.files?.[0].type; + const fileName = event.target?.files?.[0].name; + setSelectedImage(URL.createObjectURL(uploadedFile)); + setfileType(fileType); + setfileName(fileName); + formik.setFieldValue("reject_img", uploadedFile); + setShowAddIcon(false); + } + }; - return ( - - {t("RejectDialog.reject")} - - {t("RejectDialog.context")} - - - - - - - - - ); + return ( + + {t("RejectDialog.reject")} + + {t("RejectDialog.context")} + + + + + + + + + ); }; export default RejectForm; diff --git a/src/components/dashboard/province-manager/TableRowActions.jsx b/src/components/dashboard/province-manager/TableRowActions.jsx index 30367b9..13c6e7b 100644 --- a/src/components/dashboard/province-manager/TableRowActions.jsx +++ b/src/components/dashboard/province-manager/TableRowActions.jsx @@ -1,60 +1,60 @@ import ThumbUpAltIcon from "@mui/icons-material/ThumbUpAlt"; import ThumbDownIcon from "@mui/icons-material/ThumbDown"; -import { Box, IconButton, Tooltip } from "@mui/material"; -import { useContext } from "react"; +import {Box, IconButton, Tooltip} from "@mui/material"; +import {useContext} from "react"; import ConfirmForm from "./Form/ConfirmForm"; import RejectForm from "./Form/RejectForm"; -import { useTranslations } from "next-intl"; -import { DataTableContext } from "@/lib/app/contexts/DatatableContext"; +import {useTranslations} from "next-intl"; +import {DataTableContext} from "@/lib/app/contexts/DatatableContext"; -const TableRowActions = ({ row }) => { - const t = useTranslations(); - const { - openConfirmDialog, - openRejectDialog, - handleOpenConfirmDialog, - handleOpenRejectDialog, - handleCloseConfirmDialog, - handleCloseRejectDialog, - rowId, - confirmData, - rejectData, - } = useContext(DataTableContext); - return ( - - - { - handleOpenConfirmDialog(row); - }} - > - - - - {openConfirmDialog && ( - - )} - - handleOpenRejectDialog(row)}> - - - - {openRejectDialog && ( - - )} - - ); +const TableRowActions = ({row}) => { + const t = useTranslations(); + const { + openConfirmDialog, + openRejectDialog, + handleOpenConfirmDialog, + handleOpenRejectDialog, + handleCloseConfirmDialog, + handleCloseRejectDialog, + rowId, + confirmData, + rejectData, + } = useContext(DataTableContext); + return ( + + + { + handleOpenConfirmDialog(row); + }} + > + + + + {openConfirmDialog && ( + + )} + + handleOpenRejectDialog(row)}> + + + + {openRejectDialog && ( + + )} + + ); }; export default TableRowActions; diff --git a/src/components/dashboard/province-manager/TableTollbar.jsx b/src/components/dashboard/province-manager/TableTollbar.jsx index 3f06d3b..e267691 100644 --- a/src/components/dashboard/province-manager/TableTollbar.jsx +++ b/src/components/dashboard/province-manager/TableTollbar.jsx @@ -1,13 +1,13 @@ -import { Stack, Tooltip } from "@mui/material"; -import { useTranslations } from "next-intl"; +import {Stack, Tooltip} from "@mui/material"; +import {useTranslations} from "next-intl"; function TableToolbar() { - const t = useTranslations(); - return ( - - - - ); + const t = useTranslations(); + return ( + + + + ); } export default TableToolbar; diff --git a/src/components/dashboard/province-manager/index.jsx b/src/components/dashboard/province-manager/index.jsx index 062e866..5054e02 100644 --- a/src/components/dashboard/province-manager/index.jsx +++ b/src/components/dashboard/province-manager/index.jsx @@ -1,245 +1,242 @@ import DataTableStructure from "@/core/components/DatatableStructure"; import DashboardLayouts from "@/layouts/dashboardLayouts"; -import { Box, IconButton, Typography } from "@mui/material"; +import {Box, IconButton, Typography} from "@mui/material"; import ClearIcon from "@mui/icons-material/Clear"; -import { useMemo } from "react"; +import {useMemo} from "react"; // import TableToolbar from "./TableTollbar"; -import { GET_PROVINCE_MANAGER } from "@/core/data/apiRoutes"; -import { useTranslations } from "next-intl"; +import {GET_PROVINCE_MANAGER} from "@/core/data/apiRoutes"; +import {useTranslations} from "next-intl"; import TableRowActions from "./TableRowActions"; -import { - LocalizationProvider, - MobileDateTimePicker, -} from "@mui/x-date-pickers"; -import { AdapterDateFnsJalali } from "@mui/x-date-pickers/AdapterDateFnsJalali"; +import {LocalizationProvider, MobileDateTimePicker,} from "@mui/x-date-pickers"; +import {AdapterDateFnsJalali} from "@mui/x-date-pickers/AdapterDateFnsJalali"; import moment from "jalali-moment"; -import { faIR } from "@mui/x-date-pickers/locales"; +import {faIR} from "@mui/x-date-pickers/locales"; function DashboardProvinceManagerComponent() { - const t = useTranslations(); + const t = useTranslations(); - const columns = useMemo( - () => [ - { - accessorFn: (row) => row.id, - id: "id", - header: t("ProvinceManager.id"), - enableColumnFilter: true, - datatype: "numeric", - filterFn: "equals", - maxSize: 100, - columnFilterModeOptions: [ - "equals", - "notEquals", - "contains", - "lessThan", - "greaterThan", - "between", + const columns = useMemo( + () => [ + { + accessorFn: (row) => row.id, + id: "id", + header: t("ProvinceManager.id"), + enableColumnFilter: true, + datatype: "numeric", + filterFn: "equals", + maxSize: 100, + columnFilterModeOptions: [ + "equals", + "notEquals", + "contains", + "lessThan", + "greaterThan", + "between", + ], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.name, + id: "name", + header: t("ProvinceManager.name"), + enableColumnFilter: true, + datatype: "text", + filterFn: "contains", + columnFilterModeOptions: ["contains", "equals", "notEquals"], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.national_id, + id: "national_id", + header: t("ProvinceManager.national_id"), + enableColumnFilter: true, + datatype: "numeric", + filterFn: "equals", + columnFilterModeOptions: [ + "equals", + "notEquals", + "contains", + "lessThan", + "greaterThan", + "between", + ], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.phone_number, + id: "phone_number", + header: t("ProvinceManager.phone_number"), + enableColumnFilter: true, + datatype: "numeric", + filterFn: "equals", + columnFilterModeOptions: [ + "equals", + "notEquals", + "contains", + "lessThan", + "greaterThan", + "between", + ], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => + moment(row.created_at).locale("fa").format("HH:mm | yyyy/MM/DD"), + id: "created_at", + header: t("ProvinceManager.created_at"), + enableColumnFilter: true, + datatype: "date", + filterFn: "lessThan", + minSize: 200, + columnFilterModeOptions: ["lessThan", "greaterThan"], + Cell: ({renderedCellValue}) => { + return {renderedCellValue}; + }, + Header: ({column}) => {column.columnDef.header}, + Filter: ({column}) => { + const filterFnValue = column.columnDef._filterFn; + return ( + + + { + const date = new Date(newValue); + const formattedDate = moment(date) + .locale("en") + .format("YYYY-MM-DD HH:mm"); + column.setFilterValue(formattedDate); + }} + slotProps={{ + textField: { + placeholder: "تاریخ خود را وارد کنید", + helperText: `${t("filter_mode")}: ${t(filterFnValue)}`, + sx: {minWidth: "120px"}, + variant: "standard", + }, + }} + value={ + column.getFilterValue() + ? new Date(column.getFilterValue()) + : null + } + /> + + { + column.setFilterValue(null); + }} + sx={{ + color: column.getFilterValue() + ? "rgba(0, 0, 0, 0.54)" + : "#bfbfbf", + }} + > + + + + ); + }, + }, + { + accessorFn: (row) => + moment(row.updated_at).locale("fa").format("HH:mm | yyyy/MM/DD"), + id: "updated_at", + header: t("ProvinceManager.updated_at"), + enableColumnFilter: false, + datatype: "numeric", + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.navgan_id, + id: "navgan_id", + header: t("ProvinceManager.navgan_id"), + enableColumnFilter: true, + datatype: "numeric", + filterFn: "equals", + maxSize: 100, + columnFilterModeOptions: [ + "equals", + "notEquals", + "contains", + "lessThan", + "greaterThan", + "between", + ], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.vehicle_type, + id: "vehicle_type", + header: t("ProvinceManager.vehicle_type"), + enableColumnFilter: true, + datatype: "text", + filterFn: "contains", + columnFilterModeOptions: ["contains", "equals", "notEquals"], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.state_name, + id: "state_id", + header: t("ProvinceManager.state_name"), + enableColumnFilter: false, + datatype: "numeric", + minSize: 300, + // filterFn: "equals", + // filterSelectOptions: [ + // ], + // filterVariant: "select", + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, ], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.name, - id: "name", - header: t("ProvinceManager.name"), - enableColumnFilter: true, - datatype: "text", - filterFn: "contains", - columnFilterModeOptions: ["contains", "equals", "notEquals"], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.national_id, - id: "national_id", - header: t("ProvinceManager.national_id"), - enableColumnFilter: true, - datatype: "numeric", - filterFn: "equals", - columnFilterModeOptions: [ - "equals", - "notEquals", - "contains", - "lessThan", - "greaterThan", - "between", - ], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.phone_number, - id: "phone_number", - header: t("ProvinceManager.phone_number"), - enableColumnFilter: true, - datatype: "numeric", - filterFn: "equals", - columnFilterModeOptions: [ - "equals", - "notEquals", - "contains", - "lessThan", - "greaterThan", - "between", - ], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => - moment(row.created_at).locale("fa").format("HH:mm | yyyy/MM/DD"), - id: "created_at", - header: t("ProvinceManager.created_at"), - enableColumnFilter: true, - datatype: "date", - filterFn: "lessThan", - minSize: 200, - columnFilterModeOptions: ["lessThan", "greaterThan"], - Cell: ({ renderedCellValue }) => { - return {renderedCellValue}; - }, - Header: ({ column }) => {column.columnDef.header}, - Filter: ({ column }) => { - const filterFnValue = column.columnDef._filterFn; - return ( - - - { - const date = new Date(newValue); - const formattedDate = moment(date) - .locale("en") - .format("YYYY-MM-DD HH:mm"); - column.setFilterValue(formattedDate); - }} - slotProps={{ - textField: { - placeholder: "تاریخ خود را وارد کنید", - helperText: `${t("filter_mode")}: ${t(filterFnValue)}`, - sx: { minWidth: "120px" }, - variant: "standard", - }, - }} - value={ - column.getFilterValue() - ? new Date(column.getFilterValue()) - : null - } + [] + ); + return ( + + + } + enableLastUpdate={true} + enablePinning={true} + enableDensityToggle={true} + enableColumnFilters={true} + enableHiding={true} + enableFullScreenToggle={false} + enableGlobalFilter={false} + enableColumnResizing={false} // if you want true this you shold change renderRowActions props ** see https://www.material-react-table.com/docs/guides/row-actions + enableRowActions={true} + renderRowActions={({row}) => } /> - - { - column.setFilterValue(null); - }} - sx={{ - color: column.getFilterValue() - ? "rgba(0, 0, 0, 0.54)" - : "#bfbfbf", - }} - > - - - ); - }, - }, - { - accessorFn: (row) => - moment(row.updated_at).locale("fa").format("HH:mm | yyyy/MM/DD"), - id: "updated_at", - header: t("ProvinceManager.updated_at"), - enableColumnFilter: false, - datatype: "numeric", - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.navgan_id, - id: "navgan_id", - header: t("ProvinceManager.navgan_id"), - enableColumnFilter: true, - datatype: "numeric", - filterFn: "equals", - maxSize: 100, - columnFilterModeOptions: [ - "equals", - "notEquals", - "contains", - "lessThan", - "greaterThan", - "between", - ], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.vehicle_type, - id: "vehicle_type", - header: t("ProvinceManager.vehicle_type"), - enableColumnFilter: true, - datatype: "text", - filterFn: "contains", - columnFilterModeOptions: ["contains", "equals", "notEquals"], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.state_name, - id: "state_id", - header: t("ProvinceManager.state_name"), - enableColumnFilter: false, - datatype: "numeric", - minSize: 300, - // filterFn: "equals", - // filterSelectOptions: [ - // ], - // filterVariant: "select", - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - ], - [] - ); - return ( - - - } - enableLastUpdate={true} - enablePinning={true} - enableDensityToggle={true} - enableColumnFilters={true} - enableHiding={true} - enableFullScreenToggle={false} - enableGlobalFilter={false} - enableColumnResizing={false} // if you want true this you shold change renderRowActions props ** see https://www.material-react-table.com/docs/guides/row-actions - enableRowActions={true} - renderRowActions={({ row }) => } - /> - - - ); + + ); } export default DashboardProvinceManagerComponent; diff --git a/src/components/dashboard/transportation-assistance/Form/ConfirmForm.jsx b/src/components/dashboard/transportation-assistance/Form/ConfirmForm.jsx index 8067eee..f7f7b88 100644 --- a/src/components/dashboard/transportation-assistance/Form/ConfirmForm.jsx +++ b/src/components/dashboard/transportation-assistance/Form/ConfirmForm.jsx @@ -1,102 +1,94 @@ import UploadSystem from "@/core/components/UploadSystem"; -import { CONFIRM_TRANSPORTATION_ASSISTANCE } from "@/core/data/apiRoutes"; +import {CONFIRM_TRANSPORTATION_ASSISTANCE} from "@/core/data/apiRoutes"; import useDirection from "@/lib/app/hooks/useDirection"; -import { - Dialog, - DialogTitle, - DialogContent, - DialogContentText, - DialogActions, - Button, - TextField, -} from "@mui/material"; -import { useFormik } from "formik"; -import { useTranslations } from "next-intl"; -import { useState } from "react"; +import {Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, TextField,} from "@mui/material"; +import {useFormik} from "formik"; +import {useTranslations} from "next-intl"; +import {useState} from "react"; import UploadFileNotification from "@/core/components/notifications/UploadFileNotification"; -const ConfirmForm = ({ open, handleClose, rowId, confirmData }) => { - const t = useTranslations(); - const { directionApp } = useDirection(); - const [description, setDescription] = useState(""); - const [selectedImage, setSelectedImage] = useState(""); - const [fileType, setfileType] = useState(null); - const [fileName, setfileName] = useState(null); - const [showAddIcon, setShowAddIcon] = useState(true); +const ConfirmForm = ({open, handleClose, rowId, confirmData}) => { + const t = useTranslations(); + const {directionApp} = useDirection(); + const [description, setDescription] = useState(""); + const [selectedImage, setSelectedImage] = useState(""); + const [fileType, setfileType] = useState(null); + const [fileName, setfileName] = useState(null); + const [showAddIcon, setShowAddIcon] = useState(true); - const formik = useFormik({ - initialValues: { - description: "", - }, - onSubmit: () => { - const formData = new FormData(); - if (description != "") formData.append("expert_description", description); - handleClose(); - confirmData(CONFIRM_TRANSPORTATION_ASSISTANCE, rowId, formData); - }, - }); + const formik = useFormik({ + initialValues: { + description: "", + }, + onSubmit: () => { + const formData = new FormData(); + if (description != "") formData.append("expert_description", description); + handleClose(); + confirmData(CONFIRM_TRANSPORTATION_ASSISTANCE, rowId, formData); + }, + }); - const handleDescriptionChange = (event) => { - setDescription(event.target.value); - }; - const handleUploadChange = (event) => { - const uploadedFile = event.target?.files?.[0]; - if (uploadedFile) { - const maxFileSize = 2 * 1024 * 1024; - if (uploadedFile.size > maxFileSize) { - UploadFileNotification(directionApp, t); - event.target.value = ""; - return; - } + const handleDescriptionChange = (event) => { + setDescription(event.target.value); + }; + const handleUploadChange = (event) => { + const uploadedFile = event.target?.files?.[0]; + if (uploadedFile) { + const maxFileSize = 2 * 1024 * 1024; + if (uploadedFile.size > maxFileSize) { + UploadFileNotification(directionApp, t); + event.target.value = ""; + return; + } - const fileType = event.target?.files?.[0].type; - const fileName = event.target?.files?.[0].name; - setSelectedImage(URL.createObjectURL(uploadedFile)); - setfileType(fileType); - setfileName(fileName); - formik.setFieldValue("confirm_img", uploadedFile); - setShowAddIcon(false); - } - }; - return ( - - {t("ConfirmDialog.confirm")} - - {t("ConfirmDialog.context")} - - - - - - - - - ); + const fileType = event.target?.files?.[0].type; + const fileName = event.target?.files?.[0].name; + setSelectedImage(URL.createObjectURL(uploadedFile)); + setfileType(fileType); + setfileName(fileName); + formik.setFieldValue("confirm_img", uploadedFile); + setShowAddIcon(false); + } + }; + return ( + + {t("ConfirmDialog.confirm")} + + {t("ConfirmDialog.context")} + + + + + + + + + ); }; export default ConfirmForm; diff --git a/src/components/dashboard/transportation-assistance/Form/RejectForm.jsx b/src/components/dashboard/transportation-assistance/Form/RejectForm.jsx index fb3a290..f7643ab 100644 --- a/src/components/dashboard/transportation-assistance/Form/RejectForm.jsx +++ b/src/components/dashboard/transportation-assistance/Form/RejectForm.jsx @@ -1,113 +1,105 @@ -import { REJECT_TRANSPORTATION_ASSISTANCE } from "@/core/data/apiRoutes"; -import { - Dialog, - DialogTitle, - DialogContent, - DialogContentText, - DialogActions, - Button, - TextField, -} from "@mui/material"; -import { useTranslations } from "next-intl"; -import { useFormik } from "formik"; +import {REJECT_TRANSPORTATION_ASSISTANCE} from "@/core/data/apiRoutes"; +import {Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, TextField,} from "@mui/material"; +import {useTranslations} from "next-intl"; +import {useFormik} from "formik"; import * as Yup from "yup"; -import { useState } from "react"; +import {useState} from "react"; import UploadSystem from "@/core/components/UploadSystem"; import UploadFileNotification from "@/core/components/notifications/UploadFileNotification"; import useDirection from "@/lib/app/hooks/useDirection"; -const RejectForm = ({ open, handleClose, rowId, rejectData }) => { - const [description, setDescription] = useState(""); - const [selectedImage, setSelectedImage] = useState(""); - const [fileType, setfileType] = useState(null); - const [fileName, setfileName] = useState(null); - const [showAddIcon, setShowAddIcon] = useState(true); - const t = useTranslations(); - const { directionApp } = useDirection(); +const RejectForm = ({open, handleClose, rowId, rejectData}) => { + const [description, setDescription] = useState(""); + const [selectedImage, setSelectedImage] = useState(""); + const [fileType, setfileType] = useState(null); + const [fileName, setfileName] = useState(null); + const [showAddIcon, setShowAddIcon] = useState(true); + const t = useTranslations(); + const {directionApp} = useDirection(); - const validationSchema = Yup.object().shape({ - description: Yup.string().required(t("RejectDialog.description_error")), - }); + const validationSchema = Yup.object().shape({ + description: Yup.string().required(t("RejectDialog.description_error")), + }); - const formik = useFormik({ - initialValues: { - description: "", - }, - validationSchema, - onSubmit: () => { - const formData = new FormData(); - formData.append("expert_description", description); - handleClose(); - rejectData(REJECT_TRANSPORTATION_ASSISTANCE, rowId, formData); - }, - }); + const formik = useFormik({ + initialValues: { + description: "", + }, + validationSchema, + onSubmit: () => { + const formData = new FormData(); + formData.append("expert_description", description); + handleClose(); + rejectData(REJECT_TRANSPORTATION_ASSISTANCE, rowId, formData); + }, + }); - const handleDescriptionChange = (event) => { - setDescription(event.target.value); - formik.handleChange(event); - }; - const handleUploadChange = (event) => { - const uploadedFile = event.target?.files?.[0]; - if (uploadedFile) { - const maxFileSize = 2 * 1024 * 1024; - if (uploadedFile.size > maxFileSize) { - UploadFileNotification(directionApp, t); - event.target.value = ""; - return; - } - const fileType = event.target?.files?.[0].type; - const fileName = event.target?.files?.[0].name; - setSelectedImage(URL.createObjectURL(uploadedFile)); - setfileType(fileType); - setfileName(fileName); - formik.setFieldValue("reject_img", uploadedFile); - setShowAddIcon(false); - } - }; - return ( - - {t("RejectDialog.reject")} - - {t("RejectDialog.context")} - - - - - - - - - ); + const handleDescriptionChange = (event) => { + setDescription(event.target.value); + formik.handleChange(event); + }; + const handleUploadChange = (event) => { + const uploadedFile = event.target?.files?.[0]; + if (uploadedFile) { + const maxFileSize = 2 * 1024 * 1024; + if (uploadedFile.size > maxFileSize) { + UploadFileNotification(directionApp, t); + event.target.value = ""; + return; + } + const fileType = event.target?.files?.[0].type; + const fileName = event.target?.files?.[0].name; + setSelectedImage(URL.createObjectURL(uploadedFile)); + setfileType(fileType); + setfileName(fileName); + formik.setFieldValue("reject_img", uploadedFile); + setShowAddIcon(false); + } + }; + return ( + + {t("RejectDialog.reject")} + + {t("RejectDialog.context")} + + + + + + + + + ); }; export default RejectForm; diff --git a/src/components/dashboard/transportation-assistance/TableRowActions.jsx b/src/components/dashboard/transportation-assistance/TableRowActions.jsx index e4b8334..1306d2c 100644 --- a/src/components/dashboard/transportation-assistance/TableRowActions.jsx +++ b/src/components/dashboard/transportation-assistance/TableRowActions.jsx @@ -1,61 +1,61 @@ import ThumbUpAltIcon from "@mui/icons-material/ThumbUpAlt"; import ThumbDownIcon from "@mui/icons-material/ThumbDown"; -import { Box, IconButton, Tooltip } from "@mui/material"; -import { useContext } from "react"; +import {Box, IconButton, Tooltip} from "@mui/material"; +import {useContext} from "react"; import ConfirmForm from "./Form/ConfirmForm"; import RejectForm from "./Form/RejectForm"; -import { useTranslations } from "next-intl"; -import { DataTableContext } from "@/lib/app/contexts/DatatableContext"; +import {useTranslations} from "next-intl"; +import {DataTableContext} from "@/lib/app/contexts/DatatableContext"; -const TableRowActions = ({ row }) => { - const t = useTranslations(); +const TableRowActions = ({row}) => { + const t = useTranslations(); - const { - openConfirmDialog, - openRejectDialog, - handleOpenConfirmDialog, - handleOpenRejectDialog, - handleCloseConfirmDialog, - handleCloseRejectDialog, - rowId, - confirmData, - rejectData, - } = useContext(DataTableContext); - return ( - - - { - handleOpenConfirmDialog(row); - }} - > - - - - {openConfirmDialog && ( - - )} - - handleOpenRejectDialog(row)}> - - - - {openRejectDialog && ( - - )} - - ); + const { + openConfirmDialog, + openRejectDialog, + handleOpenConfirmDialog, + handleOpenRejectDialog, + handleCloseConfirmDialog, + handleCloseRejectDialog, + rowId, + confirmData, + rejectData, + } = useContext(DataTableContext); + return ( + + + { + handleOpenConfirmDialog(row); + }} + > + + + + {openConfirmDialog && ( + + )} + + handleOpenRejectDialog(row)}> + + + + {openRejectDialog && ( + + )} + + ); }; export default TableRowActions; diff --git a/src/components/dashboard/transportation-assistance/TableTollbar.jsx b/src/components/dashboard/transportation-assistance/TableTollbar.jsx index 3f06d3b..e267691 100644 --- a/src/components/dashboard/transportation-assistance/TableTollbar.jsx +++ b/src/components/dashboard/transportation-assistance/TableTollbar.jsx @@ -1,13 +1,13 @@ -import { Stack, Tooltip } from "@mui/material"; -import { useTranslations } from "next-intl"; +import {Stack, Tooltip} from "@mui/material"; +import {useTranslations} from "next-intl"; function TableToolbar() { - const t = useTranslations(); - return ( - - - - ); + const t = useTranslations(); + return ( + + + + ); } export default TableToolbar; diff --git a/src/components/dashboard/transportation-assistance/index.jsx b/src/components/dashboard/transportation-assistance/index.jsx index fa6dbd9..51b780d 100644 --- a/src/components/dashboard/transportation-assistance/index.jsx +++ b/src/components/dashboard/transportation-assistance/index.jsx @@ -1,245 +1,242 @@ import DataTableStructure from "@/core/components/DatatableStructure"; import DashboardLayouts from "@/layouts/dashboardLayouts"; -import { Box, IconButton, Typography } from "@mui/material"; +import {Box, IconButton, Typography} from "@mui/material"; import ClearIcon from "@mui/icons-material/Clear"; -import { useMemo } from "react"; +import {useMemo} from "react"; // import TableToolbar from "./TableTollbar"; -import { GET_TRANSPORTATION_ASSISTANCE } from "@/core/data/apiRoutes"; -import { useTranslations } from "next-intl"; +import {GET_TRANSPORTATION_ASSISTANCE} from "@/core/data/apiRoutes"; +import {useTranslations} from "next-intl"; import TableRowActions from "./TableRowActions"; -import { - LocalizationProvider, - MobileDateTimePicker, -} from "@mui/x-date-pickers"; -import { AdapterDateFnsJalali } from "@mui/x-date-pickers/AdapterDateFnsJalali"; -import { faIR } from "@mui/x-date-pickers/locales"; +import {LocalizationProvider, MobileDateTimePicker,} from "@mui/x-date-pickers"; +import {AdapterDateFnsJalali} from "@mui/x-date-pickers/AdapterDateFnsJalali"; +import {faIR} from "@mui/x-date-pickers/locales"; import moment from "jalali-moment"; function DashboardTransportationAssistanceComponent() { - const t = useTranslations(); - const columns = useMemo( - () => [ - { - accessorFn: (row) => row.id, - id: "id", - header: t("TransportationAssistance.id"), - enableColumnFilter: true, - datatype: "numeric", - filterFn: "equals", - maxSize: 100, - columnFilterModeOptions: [ - "equals", - "notEquals", - "contains", - "lessThan", - "greaterThan", - "between", - ], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.name, - id: "name", - header: t("TransportationAssistance.name"), - enableColumnFilter: true, - datatype: "text", - filterFn: "contains", - columnFilterModeOptions: ["contains", "equals", "notEquals"], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, + const t = useTranslations(); + const columns = useMemo( + () => [ + { + accessorFn: (row) => row.id, + id: "id", + header: t("TransportationAssistance.id"), + enableColumnFilter: true, + datatype: "numeric", + filterFn: "equals", + maxSize: 100, + columnFilterModeOptions: [ + "equals", + "notEquals", + "contains", + "lessThan", + "greaterThan", + "between", + ], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.name, + id: "name", + header: t("TransportationAssistance.name"), + enableColumnFilter: true, + datatype: "text", + filterFn: "contains", + columnFilterModeOptions: ["contains", "equals", "notEquals"], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, - { - accessorFn: (row) => row.national_id, - id: "national_id", - header: t("TransportationAssistance.national_id"), - enableColumnFilter: true, - datatype: "numeric", - filterFn: "equals", - columnFilterModeOptions: [ - "equals", - "notEquals", - "contains", - "lessThan", - "greaterThan", - "between", + { + accessorFn: (row) => row.national_id, + id: "national_id", + header: t("TransportationAssistance.national_id"), + enableColumnFilter: true, + datatype: "numeric", + filterFn: "equals", + columnFilterModeOptions: [ + "equals", + "notEquals", + "contains", + "lessThan", + "greaterThan", + "between", + ], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.phone_number, + id: "phone_number", + header: t("TransportationAssistance.phone_number"), + enableColumnFilter: true, + datatype: "numeric", + filterFn: "equals", + columnFilterModeOptions: [ + "equals", + "notEquals", + "contains", + "lessThan", + "greaterThan", + "between", + ], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => + moment(row.created_at).locale("fa").format("HH:mm | yyyy/MM/DD"), + id: "created_at", + header: t("TransportationAssistance.created_at"), + enableColumnFilter: true, + datatype: "date", + minSize: 200, + filterFn: "lessThan", + columnFilterModeOptions: ["lessThan", "greaterThan"], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + Header: ({column}) => {column.columnDef.header}, + Filter: ({column}) => { + const filterFnValue = column.columnDef._filterFn; + return ( + + + { + const date = new Date(newValue); + const formattedDate = moment(date) + .locale("en") + .format("YYYY-MM-DD HH:mm"); + column.setFilterValue(formattedDate); + }} + slotProps={{ + textField: { + placeholder: "تاریخ خود را وارد کنید", + helperText: `${t("filter_mode")}: ${t(filterFnValue)}`, + sx: {minWidth: "120px"}, + variant: "standard", + }, + }} + value={ + column.getFilterValue() + ? new Date(column.getFilterValue()) + : null + } + /> + + { + column.setFilterValue(null); + }} + sx={{ + color: column.getFilterValue() + ? "rgba(0, 0, 0, 0.54)" + : "#bfbfbf", + }} + > + + + + ); + }, + }, + { + accessorFn: (row) => + moment(row.updated_at).locale("fa").format("HH:mm | yyyy/MM/DD"), + id: "updated_at", + header: t("TransportationAssistance.updated_at"), + enableColumnFilter: false, + datatype: "numeric", + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.navgan_id, + id: "navgan_id", + header: t("TransportationAssistance.navgan_id"), + enableColumnFilter: true, + datatype: "numeric", + filterFn: "equals", + maxSize: 100, + columnFilterModeOptions: [ + "equals", + "notEquals", + "contains", + "lessThan", + "greaterThan", + "between", + ], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.vehicle_type, + id: "vehicle_type", + header: t("TransportationAssistance.vehicle_type"), + enableColumnFilter: true, + datatype: "text", + filterFn: "contains", + columnFilterModeOptions: ["contains", "equals", "notEquals"], + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, + { + accessorFn: (row) => row.state_name, + id: "state_id", + header: t("TransportationAssistance.state_name"), + enableColumnFilter: false, + datatype: "numeric", + minSize: 300, + // filterFn: "equals", + // filterSelectOptions: [ + // ], + // filterVariant: "select", + Cell: ({renderedCellValue}) => ( + {renderedCellValue} + ), + }, ], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.phone_number, - id: "phone_number", - header: t("TransportationAssistance.phone_number"), - enableColumnFilter: true, - datatype: "numeric", - filterFn: "equals", - columnFilterModeOptions: [ - "equals", - "notEquals", - "contains", - "lessThan", - "greaterThan", - "between", - ], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => - moment(row.created_at).locale("fa").format("HH:mm | yyyy/MM/DD"), - id: "created_at", - header: t("TransportationAssistance.created_at"), - enableColumnFilter: true, - datatype: "date", - minSize: 200, - filterFn: "lessThan", - columnFilterModeOptions: ["lessThan", "greaterThan"], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - Header: ({ column }) => {column.columnDef.header}, - Filter: ({ column }) => { - const filterFnValue = column.columnDef._filterFn; - return ( - - - { - const date = new Date(newValue); - const formattedDate = moment(date) - .locale("en") - .format("YYYY-MM-DD HH:mm"); - column.setFilterValue(formattedDate); - }} - slotProps={{ - textField: { - placeholder: "تاریخ خود را وارد کنید", - helperText: `${t("filter_mode")}: ${t(filterFnValue)}`, - sx: { minWidth: "120px" }, - variant: "standard", - }, - }} - value={ - column.getFilterValue() - ? new Date(column.getFilterValue()) - : null - } + [] + ); + return ( + + + } + enableLastUpdate={true} + enablePinning={true} + enableDensityToggle={true} + enableColumnFilters={true} + enableHiding={true} + enableFullScreenToggle={false} + enableGlobalFilter={false} + enableColumnResizing={false} // if you want true this you shold change renderRowActions props ** see https://www.material-react-table.com/docs/guides/row-actions + enableRowActions={true} + renderRowActions={({row}) => } /> - - { - column.setFilterValue(null); - }} - sx={{ - color: column.getFilterValue() - ? "rgba(0, 0, 0, 0.54)" - : "#bfbfbf", - }} - > - - - ); - }, - }, - { - accessorFn: (row) => - moment(row.updated_at).locale("fa").format("HH:mm | yyyy/MM/DD"), - id: "updated_at", - header: t("TransportationAssistance.updated_at"), - enableColumnFilter: false, - datatype: "numeric", - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.navgan_id, - id: "navgan_id", - header: t("TransportationAssistance.navgan_id"), - enableColumnFilter: true, - datatype: "numeric", - filterFn: "equals", - maxSize: 100, - columnFilterModeOptions: [ - "equals", - "notEquals", - "contains", - "lessThan", - "greaterThan", - "between", - ], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.vehicle_type, - id: "vehicle_type", - header: t("TransportationAssistance.vehicle_type"), - enableColumnFilter: true, - datatype: "text", - filterFn: "contains", - columnFilterModeOptions: ["contains", "equals", "notEquals"], - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - { - accessorFn: (row) => row.state_name, - id: "state_id", - header: t("TransportationAssistance.state_name"), - enableColumnFilter: false, - datatype: "numeric", - minSize: 300, - // filterFn: "equals", - // filterSelectOptions: [ - // ], - // filterVariant: "select", - Cell: ({ renderedCellValue }) => ( - {renderedCellValue} - ), - }, - ], - [] - ); - return ( - - - } - enableLastUpdate={true} - enablePinning={true} - enableDensityToggle={true} - enableColumnFilters={true} - enableHiding={true} - enableFullScreenToggle={false} - enableGlobalFilter={false} - enableColumnResizing={false} // if you want true this you shold change renderRowActions props ** see https://www.material-react-table.com/docs/guides/row-actions - enableRowActions={true} - renderRowActions={({ row }) => } - /> - - - ); + + ); } export default DashboardTransportationAssistanceComponent; diff --git a/src/components/first/index.jsx b/src/components/first/index.jsx index adf4393..9304403 100644 --- a/src/components/first/index.jsx +++ b/src/components/first/index.jsx @@ -1,53 +1,53 @@ import dahsboardImage from "&/images/dashboard.svg"; -import { NextLinkComposed } from "@/core/components/LinkRouting"; +import {NextLinkComposed} from "@/core/components/LinkRouting"; import StyledImage from "@/core/components/StyledImage"; import CenterLayout from "@/layouts/CenterLayout"; import FullPageLayout from "@/layouts/FullPageLayout"; import useUser from "@/lib/app/hooks/useUser"; -import { Button, Typography } from "@mui/material"; -import { useTranslations } from "next-intl"; +import {Button, Typography} from "@mui/material"; +import {useTranslations} from "next-intl"; const FirstComponent = () => { - const t = useTranslations(); - const { isAuth } = useUser(); + const t = useTranslations(); + const {isAuth} = useUser(); - return ( - - - - - {t("app_name")} - - {isAuth ? ( - - ) : ( - - )} - - - ); + return ( + + + + + {t("app_name")} + + {isAuth ? ( + + ) : ( + + )} + + + ); }; export default FirstComponent; diff --git a/src/components/login-expert/index.jsx b/src/components/login-expert/index.jsx index 4d6af4a..10ac3b6 100644 --- a/src/components/login-expert/index.jsx +++ b/src/components/login-expert/index.jsx @@ -2,158 +2,149 @@ import LinkRouting from "@/core/components/LinkRouting"; // import Notifications from "@/core/components/notifications"; import PasswordField from "@/core/components/PasswordField"; import StyledForm from "@/core/components/StyledForm"; -import { GET_USER_TOKEN } from "@/core/data/apiRoutes"; +import {GET_USER_TOKEN} from "@/core/data/apiRoutes"; import CenterLayout from "@/layouts/CenterLayout"; import FullPageLayout from "@/layouts/FullPageLayout"; -import useDirection from "@/lib/app/hooks/useDirection"; import useUser from "@/lib/app/hooks/useUser"; import LoginIcon from "@mui/icons-material/Login"; -import { - Box, - Button, - Container, - Paper, - Stack, - TextField, - Typography, -} from "@mui/material"; +import {Box, Button, Container, Paper, Stack, TextField, Typography,} from "@mui/material"; import axios from "axios"; -import { Field, Formik } from "formik"; -import { useTranslations } from "next-intl"; +import {Field, Formik} from "formik"; +import {useTranslations} from "next-intl"; import Image from "next/image"; -import { useSearchParams } from "next/navigation"; +import {useSearchParams} from "next/navigation"; import * as Yup from "yup"; const LoginComponent = () => { - const t = useTranslations(); - // const { directionApp } = useDirection(); // should delete because we dont have direction anymore - const { setToken } = useUser(); // pass token to set token + const t = useTranslations(); + // const { directionApp } = useDirection(); // should delete because we dont have direction anymore + const {setToken} = useUser(); // pass token to set token - // gettin url query - const searchParams = useSearchParams(); - const backUrlDecodedPath = searchParams.get("back_url"); + // gettin url query + const searchParams = useSearchParams(); + const backUrlDecodedPath = searchParams.get("back_url"); - //formik properties - const handleSubmit = async (values, props) => { - await axios - .post(GET_USER_TOKEN, { - username: values.username, - password: values.password, - }) - .then(function (response) { - setToken(response.data.token); - }) - .catch(function (error) { - // Notifications(directionApp, error.response, t); - props.setSubmitting(false); - }); - }; - const initialValues = { - username: "", - password: "", - }; - const validationSchema = Yup.object().shape({ - username: Yup.string().required(t("LoginPage.error_message_required")), - password: Yup.string().required(t("LoginPage.error_message_required")), - }); + //formik properties + const handleSubmit = async (values, props) => { + await axios + .post(GET_USER_TOKEN, { + username: values.username, + password: values.password, + }) + .then(function (response) { + setToken(response.data.token); + }) + .catch(function (error) { + // Notifications(directionApp, error.response, t); + props.setSubmitting(false); + }); + }; + const initialValues = { + username: "", + password: "", + }; + const validationSchema = Yup.object().shape({ + username: Yup.string().required(t("LoginPage.error_message_required")), + password: Yup.string().required(t("LoginPage.error_message_required")), + }); - return ( - - - - - - {(props) => ( - - - {t("app_name")} - - - {t("login_expert")} - - - - - - - - - - - - )} - - - - - - - {t("LoginPage.link_routing_back_to")}{" "} - {backUrlDecodedPath - ? t("LoginPage.link_routing_previuos_page") - : t("LoginPage.link_routing_main_page")} - - - - ); + {(props) => ( + + + {t("app_name")}/ + + + {t("login_expert")} + + + + + + + + + + + + )} + + + + + + + {t("LoginPage.link_routing_back_to")}{" "} + {backUrlDecodedPath + ? t("LoginPage.link_routing_previuos_page") + : t("LoginPage.link_routing_main_page")} + + + + ); }; export default LoginComponent; diff --git a/src/core/components/AvatarUpload.jsx b/src/core/components/AvatarUpload.jsx index e1ade5c..03a9cba 100644 --- a/src/core/components/AvatarUpload.jsx +++ b/src/core/components/AvatarUpload.jsx @@ -1,128 +1,128 @@ -import { Avatar, Box, TextField } from "@mui/material"; -import { useState } from "react"; +import {Avatar, Box, TextField} from "@mui/material"; +import {useState} from "react"; import DeleteIcon from "@mui/icons-material/Delete"; import AddIcon from "@mui/icons-material/Add"; -const AvatarUpload = ({ user, setFieldValue, valueAvatar, changeFlag }) => { - const [selectedImage, setSelectedImage] = useState(user.expert_avatar); - const [isHovered, setIsHovered] = useState(false); +const AvatarUpload = ({user, setFieldValue, valueAvatar, changeFlag}) => { + const [selectedImage, setSelectedImage] = useState(user.expert_avatar); + const [isHovered, setIsHovered] = useState(false); - const handleImageChange = (event) => { - const newImage = event.target?.files?.[0]; - if (newImage) { - setSelectedImage(URL.createObjectURL(newImage)); - setFieldValue(valueAvatar, newImage); - setFieldValue(changeFlag, true); - } else { - setSelectedImage(""); - setFieldValue(valueAvatar, null); - } - }; + const handleImageChange = (event) => { + const newImage = event.target?.files?.[0]; + if (newImage) { + setSelectedImage(URL.createObjectURL(newImage)); + setFieldValue(valueAvatar, newImage); + setFieldValue(changeFlag, true); + } else { + setSelectedImage(""); + setFieldValue(valueAvatar, null); + } + }; - const handleDeleteImage = () => { - setSelectedImage(""); - setFieldValue(valueAvatar, null); - setFieldValue(changeFlag, true); - }; + const handleDeleteImage = () => { + setSelectedImage(""); + setFieldValue(valueAvatar, null); + setFieldValue(changeFlag, true); + }; - const handleMouseEnter = () => { - setIsHovered(true); - }; + const handleMouseEnter = () => { + setIsHovered(true); + }; - const handleMouseLeave = () => { - setIsHovered(false); - }; + const handleMouseLeave = () => { + setIsHovered(false); + }; - return ( - - + return ( - - {isHovered && ( + > - {selectedImage ? ( - - ) : ( - - )} + + + {isHovered && ( + + {selectedImage ? ( + + ) : ( + + )} + + )} + - )} + - - - - ); + ); }; export default AvatarUpload; diff --git a/src/core/components/Datatable.jsx b/src/core/components/Datatable.jsx index 2d34ece..060e089 100644 --- a/src/core/components/Datatable.jsx +++ b/src/core/components/Datatable.jsx @@ -1,174 +1,174 @@ -import { ReloadDataTableContext } from "@/lib/app/contexts/ReloadDatatableContext"; +import {ReloadDataTableContext} from "@/lib/app/contexts/ReloadDatatableContext"; import useLanguage from "@/lib/app/hooks/useLanguage"; -import { Typography } from "@mui/material"; +import {Typography} from "@mui/material"; import axios from "axios"; import MaterialReactTable from "material-react-table"; import moment from "moment-jalaali"; -import { useTranslations } from "next-intl"; -import { useContext, useEffect, useMemo, useState } from "react"; +import {useTranslations} from "next-intl"; +import {useContext, useEffect, useMemo, useState} from "react"; import useSWR from "swr"; const DataTable = (props) => { - const { reloadDataTable, setReloadDataTable } = useContext( - ReloadDataTableContext - ); - - const fetcher = (...args) => { - return axios - .get(args, { - headers: { - Authorization: `Bearer ${props.token}`, - }, - }) - .then((res) => { - setRowCount(res.data.meta.totalRowCount); - return res.data.data; - }); - }; - const t = useTranslations(); - const { languageApp, languageList } = useLanguage(); - const [columnFilters, setColumnFilters] = useState([]); - const [columnFilterFns, setColumnFilterFns] = useState(() => { - let output = {}; - const list = props.columns.map((item) => - item.enableColumnFilter ? { [item.id]: item.filterFn } : { [item.id]: "" } + const {reloadDataTable, setReloadDataTable} = useContext( + ReloadDataTableContext ); - for (var key in list) { - var nestedObj = list[key]; - for (var nestedKey in nestedObj) { - output[nestedKey] = nestedObj[nestedKey]; - } - } - return output; - }); - const [sorting, setSorting] = useState([]); - const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 10 }); - const [rowCount, setRowCount] = useState(0); - const [updateTime, setupdateTime] = useState( - moment().format("HH:mm | jYYYY/jM/jD") - ); - const tableLocalization = useMemo( - () => - languageList.find((item) => item.key == languageApp).tableLocalization, - [languageApp, languageList] - ); - - const fetchUrl = useMemo(() => { - const url = new URL(props.tableUrl /* send your api */); - url.searchParams.set( - "start", - `${pagination.pageIndex * pagination.pageSize}` - ); - const filters = columnFilters.map((filter) => { - let datatype; - for (const i in props.columns) { - if (props.columns[i].id == filter.id) { - datatype = props.columns[i].datatype; + const fetcher = (...args) => { + return axios + .get(args, { + headers: { + Authorization: `Bearer ${props.token}`, + }, + }) + .then((res) => { + setRowCount(res.data.meta.totalRowCount); + return res.data.data; + }); + }; + const t = useTranslations(); + const {languageApp, languageList} = useLanguage(); + const [columnFilters, setColumnFilters] = useState([]); + const [columnFilterFns, setColumnFilterFns] = useState(() => { + let output = {}; + const list = props.columns.map((item) => + item.enableColumnFilter ? {[item.id]: item.filterFn} : {[item.id]: ""} + ); + for (var key in list) { + var nestedObj = list[key]; + for (var nestedKey in nestedObj) { + output[nestedKey] = nestedObj[nestedKey]; + } } - } - return { - ...filter, - fn: columnFilterFns[filter.id], - datatype: datatype, - }; + return output; }); - url.searchParams.set("size", pagination.pageSize); - url.searchParams.set("filters", JSON.stringify(filters ?? [])); - url.searchParams.set("sorting", JSON.stringify(sorting ?? [])); - return url; - }, [ - props.tableUrl, - columnFilters, - columnFilterFns, - pagination, - sorting, - props.columns, - ]); - const { data, isLoading, isValidating, mutate } = useSWR(fetchUrl, fetcher, { - revalidateOnFocus: false, - }); + const [sorting, setSorting] = useState([]); + const [pagination, setPagination] = useState({pageIndex: 0, pageSize: 10}); + const [rowCount, setRowCount] = useState(0); + const [updateTime, setupdateTime] = useState( + moment().format("HH:mm | jYYYY/jM/jD") + ); - useEffect(() => { - if (reloadDataTable) { - mutate(fetchUrl).then(() => { - setReloadDataTable(false); // Set reloadDataTable to false after mutation is complete - }); - } - }, [reloadDataTable, setReloadDataTable]); + const tableLocalization = useMemo( + () => + languageList.find((item) => item.key == languageApp).tableLocalization, + [languageApp, languageList] + ); - useEffect(() => { - setupdateTime(moment().format("HH:mm | jYYYY/jM/jD")); - }, [isValidating, languageApp]); - - return ( - ( - <> - {props.enableCustomToolbar /* send condition */ - ? props.CustomToolbar /* send component */ - : ""} - - )} - renderBottomToolbarCustomActions={({ table }) => ( - <> - {props.enableLastUpdate /* send condition */ ? ( - - {t("last_updated_at")}: {updateTime} - - ) : ( - "" - )} - - )} - state={{ - isLoading, + const fetchUrl = useMemo(() => { + const url = new URL(props.tableUrl /* send your api */); + url.searchParams.set( + "start", + `${pagination.pageIndex * pagination.pageSize}` + ); + const filters = columnFilters.map((filter) => { + let datatype; + for (const i in props.columns) { + if (props.columns[i].id == filter.id) { + datatype = props.columns[i].datatype; + } + } + return { + ...filter, + fn: columnFilterFns[filter.id], + datatype: datatype, + }; + }); + url.searchParams.set("size", pagination.pageSize); + url.searchParams.set("filters", JSON.stringify(filters ?? [])); + url.searchParams.set("sorting", JSON.stringify(sorting ?? [])); + return url; + }, [ + props.tableUrl, columnFilters, columnFilterFns, pagination, sorting, - }} - positionActionsColumn={"last"} - enableRowActions={props.enableRowActions} - {...props} - /> - ); + props.columns, + ]); + const {data, isLoading, isValidating, mutate} = useSWR(fetchUrl, fetcher, { + revalidateOnFocus: false, + }); + + useEffect(() => { + if (reloadDataTable) { + mutate(fetchUrl).then(() => { + setReloadDataTable(false); // Set reloadDataTable to false after mutation is complete + }); + } + }, [reloadDataTable, setReloadDataTable]); + + useEffect(() => { + setupdateTime(moment().format("HH:mm | jYYYY/jM/jD")); + }, [isValidating, languageApp]); + + return ( + ( + <> + {props.enableCustomToolbar /* send condition */ + ? props.CustomToolbar /* send component */ + : ""} + + )} + renderBottomToolbarCustomActions={({table}) => ( + <> + {props.enableLastUpdate /* send condition */ ? ( + + {t("last_updated_at")}: {updateTime} + + ) : ( + "" + )} + + )} + state={{ + isLoading, + columnFilters, + columnFilterFns, + pagination, + sorting, + }} + positionActionsColumn={"last"} + enableRowActions={props.enableRowActions} + {...props} + /> + ); }; export default DataTable; diff --git a/src/core/components/DatatableStructure.jsx b/src/core/components/DatatableStructure.jsx index e13ed16..ae97461 100644 --- a/src/core/components/DatatableStructure.jsx +++ b/src/core/components/DatatableStructure.jsx @@ -1,15 +1,15 @@ -import { DataTableProvider } from "@/lib/app/contexts/DatatableContext"; +import {DataTableProvider} from "@/lib/app/contexts/DatatableContext"; import DataTable from "./Datatable"; -import { ReloadDataTableProvider } from "@/lib/app/contexts/ReloadDatatableContext"; +import {ReloadDataTableProvider} from "@/lib/app/contexts/ReloadDatatableContext"; function DataTableStructure(props) { - return ( - - - - - - ); + return ( + + + + + + ); } export default DataTableStructure; diff --git a/src/core/components/FormErrorMassage.jsx b/src/core/components/FormErrorMassage.jsx index 4bf74e3..e1d155b 100644 --- a/src/core/components/FormErrorMassage.jsx +++ b/src/core/components/FormErrorMassage.jsx @@ -1,10 +1,11 @@ -import { Typography } from "@mui/material"; +import {Typography} from "@mui/material"; + const FormErrorMessage = (props) => { - return ( - - {props.children} - - ); + return ( + + {props.children} + + ); }; export default FormErrorMessage; diff --git a/src/core/components/ImageConvertor.jsx b/src/core/components/ImageConvertor.jsx index 667182e..9f99bc1 100644 --- a/src/core/components/ImageConvertor.jsx +++ b/src/core/components/ImageConvertor.jsx @@ -1,22 +1,22 @@ import ImageResize from "image-resize"; const ImageResizer = async (image) => { - const imageResize = new ImageResize({ - quality: 1, - format: "jpg", - outputType: "base64", - width: 400, - }); + const imageResize = new ImageResize({ + quality: 1, + format: "jpg", + outputType: "base64", + width: 400, + }); - const get = await imageResize.get(image); - const resize = await imageResize.resize(get).then(); - const output = await imageResize.output(resize).then(); + const get = await imageResize.get(image); + const resize = await imageResize.resize(get).then(); + const output = await imageResize.output(resize).then(); - const avatar = await (await import("image-to-file-converter")) - .base64ToFile(output) - .then(); + const avatar = await (await import("image-to-file-converter")) + .base64ToFile(output) + .then(); - return avatar; + return avatar; }; export default ImageResizer; diff --git a/src/core/components/LinkRouting.jsx b/src/core/components/LinkRouting.jsx index ff33c86..f8fac0a 100644 --- a/src/core/components/LinkRouting.jsx +++ b/src/core/components/LinkRouting.jsx @@ -1,116 +1,116 @@ import MuiLink from "@mui/material/Link"; -import { styled } from "@mui/material/styles"; +import {styled} from "@mui/material/styles"; import clsx from "clsx"; import NextLink from "next/link"; -import { useRouter } from "next/router"; +import {useRouter} from "next/router"; import * as React from "react"; // Add support for the sx prop for consistency with the other branches. const Anchor = styled("a")({}); export const NextLinkComposed = React.forwardRef(function NextLinkComposed( - props, - ref + props, + ref ) { - const { - to, - linkAs, - replace, - scroll, - shallow, - prefetch, - legacyBehavior = true, - locale, - ...other - } = props; + const { + to, + linkAs, + replace, + scroll, + shallow, + prefetch, + legacyBehavior = true, + locale, + ...other + } = props; - return ( - - - - ); + return ( + + + + ); }); // A styled version of the Next.js Link component: // https://nextjs.org/docs/api-reference/next/link const LinkRouting = React.forwardRef(function Link(props, ref) { - const { - activeClassName = "active", - as, - className: classNameProps, - href, - legacyBehavior, - linkAs: linkAsProp, - locale, - noLinkStyle, - prefetch, - replace, - role, // Link don't have roles. - scroll, - shallow, - ...other - } = props; + const { + activeClassName = "active", + as, + className: classNameProps, + href, + legacyBehavior, + linkAs: linkAsProp, + locale, + noLinkStyle, + prefetch, + replace, + role, // Link don't have roles. + scroll, + shallow, + ...other + } = props; - const router = useRouter(); - const pathname = typeof href === "string" ? href : href.pathname; - const className = clsx(classNameProps, { - [activeClassName]: router.pathname === pathname && activeClassName, - }); + const router = useRouter(); + const pathname = typeof href === "string" ? href : href.pathname; + const className = clsx(classNameProps, { + [activeClassName]: router.pathname === pathname && activeClassName, + }); - const isExternal = - typeof href === "string" && - (href.indexOf("http") === 0 || href.indexOf("mailto:") === 0); + const isExternal = + typeof href === "string" && + (href.indexOf("http") === 0 || href.indexOf("mailto:") === 0); - if (isExternal) { - if (noLinkStyle) { - return ; + if (isExternal) { + if (noLinkStyle) { + return ; + } + + return ; } - return ; - } + const linkAs = linkAsProp || as; + const nextjsProps = { + to: href, + linkAs, + replace, + scroll, + shallow, + prefetch, + legacyBehavior, + locale, + }; - const linkAs = linkAsProp || as; - const nextjsProps = { - to: href, - linkAs, - replace, - scroll, - shallow, - prefetch, - legacyBehavior, - locale, - }; + if (noLinkStyle) { + return ( + + ); + } - if (noLinkStyle) { return ( - + ); - } - - return ( - - ); }); export default LinkRouting; diff --git a/src/core/components/LoadingHardPage.jsx b/src/core/components/LoadingHardPage.jsx index 5a86af8..d0f1c3f 100644 --- a/src/core/components/LoadingHardPage.jsx +++ b/src/core/components/LoadingHardPage.jsx @@ -1,44 +1,44 @@ -import { Backdrop, Fade, styled } from "@mui/material"; +import {Backdrop, Fade, styled} from "@mui/material"; import StyledImage from "./StyledImage"; const LoadingImage = styled(StyledImage)({ - "@keyframes load": { - "0%": { - // opacity: 0, - transform: "scale(1)", + "@keyframes load": { + "0%": { + // opacity: 0, + transform: "scale(1)", + }, + "50%": { + // opacity: 1, + transform: "scale(2)", + }, + "100%": { + // opacity: 0, + transform: "scale(1)", + }, }, - "50%": { - // opacity: 1, - transform: "scale(2)", - }, - "100%": { - // opacity: 0, - transform: "scale(1)", - }, - }, - animation: "load 2s infinite", + animation: "load 2s infinite", }); -const LoadingHardPage = ({ children, loading }) => { - return ( - <> - theme.zIndex.drawer + 1 }} - open={loading} - > - - - - - {children} - - ); +const LoadingHardPage = ({children, loading}) => { + return ( + <> + theme.zIndex.drawer + 1}} + open={loading} + > + + + + + {children} + + ); }; export default LoadingHardPage; diff --git a/src/core/components/Messages.jsx b/src/core/components/Messages.jsx index e80c572..bc53b6e 100644 --- a/src/core/components/Messages.jsx +++ b/src/core/components/Messages.jsx @@ -2,21 +2,21 @@ import CenterLayout from "@/layouts/CenterLayout"; import FullPageLayout from "@/layouts/FullPageLayout"; import StyledImage from "./StyledImage"; -const Message = ({ text, actions }) => { - return ( - - - - {text} - {actions} - - - ); +const Message = ({text, actions}) => { + return ( + + + + {text} + {actions} + + + ); }; export default Message; diff --git a/src/core/components/MuiDatePicker.jsx b/src/core/components/MuiDatePicker.jsx index d906666..de6c5d5 100644 --- a/src/core/components/MuiDatePicker.jsx +++ b/src/core/components/MuiDatePicker.jsx @@ -1,35 +1,35 @@ -import { LocalizationProvider, DatePicker } from "@mui/x-date-pickers"; -import { AdapterDateFnsJalali } from "@mui/x-date-pickers/AdapterDateFnsJalali"; +import {DatePicker, LocalizationProvider} from "@mui/x-date-pickers"; +import {AdapterDateFnsJalali} from "@mui/x-date-pickers/AdapterDateFnsJalali"; import moment from "jalali-moment"; -import { useTranslations } from "next-intl"; +import {useTranslations} from "next-intl"; export default function MuiDatePicker({ - setFieldValue, - selectType, - error, - helperText, -}) { - const t = useTranslations(); + setFieldValue, + selectType, + error, + helperText, + }) { + const t = useTranslations(); - const handleDateChange = (date) => { - const selectedDate = moment(date).locale("fa"); // should add .format() at the end to format the data - setFieldValue(selectType, selectedDate); - }; + const handleDateChange = (date) => { + const selectedDate = moment(date).locale("fa"); // should add .format() at the end to format the data + setFieldValue(selectType, selectedDate); + }; - return ( - - - - ); + return ( + + + + ); } diff --git a/src/core/components/PasswordField.jsx b/src/core/components/PasswordField.jsx index 5747bdb..d109b73 100644 --- a/src/core/components/PasswordField.jsx +++ b/src/core/components/PasswordField.jsx @@ -1,33 +1,33 @@ -import { useState } from "react"; -import { IconButton, InputAdornment, TextField } from "@mui/material"; -import { Visibility, VisibilityOff } from "@mui/icons-material"; -import { Field } from "formik"; +import {useState} from "react"; +import {IconButton, InputAdornment, TextField} from "@mui/material"; +import {Visibility, VisibilityOff} from "@mui/icons-material"; +import {Field} from "formik"; const PasswordField = (props) => { - const [showPassword, setShowPassword] = useState(false); + const [showPassword, setShowPassword] = useState(false); - const handleClickShowPassword = () => { - setShowPassword(!showPassword); - }; + const handleClickShowPassword = () => { + setShowPassword(!showPassword); + }; - return ( - - - {showPassword ? : } - - - ), - }} - /> - ); + return ( + + + {showPassword ? : } + + + ), + }} + /> + ); }; export default PasswordField; diff --git a/src/core/components/StyledForm.jsx b/src/core/components/StyledForm.jsx index 1f299bb..41eeabc 100644 --- a/src/core/components/StyledForm.jsx +++ b/src/core/components/StyledForm.jsx @@ -1,5 +1,5 @@ -import { styled } from "@mui/material"; -import { Form } from "formik"; +import {styled} from "@mui/material"; +import {Form} from "formik"; const StyledForm = styled(Form)``; diff --git a/src/core/components/StyledImage.jsx b/src/core/components/StyledImage.jsx index 64391ad..58dd65f 100644 --- a/src/core/components/StyledImage.jsx +++ b/src/core/components/StyledImage.jsx @@ -1,4 +1,4 @@ -import { styled } from "@mui/material"; +import {styled} from "@mui/material"; import Image from "next/image"; const StyledImage = styled(Image)``; diff --git a/src/core/components/TitlePage.jsx b/src/core/components/TitlePage.jsx index 7bdcfc2..77c72ee 100644 --- a/src/core/components/TitlePage.jsx +++ b/src/core/components/TitlePage.jsx @@ -1,15 +1,15 @@ -import { useTranslations } from "next-intl"; +import {useTranslations} from "next-intl"; import Head from "next/head"; -const TitlePage = ({ text }) => { - const t = useTranslations(); - return ( - - - {text ? `${t("app_short_name")} | ${t(text)}` : t("app_short_name")} - - - ); +const TitlePage = ({text}) => { + const t = useTranslations(); + return ( + + + {text ? `${t("app_short_name")} | ${t(text)}` : t("app_short_name")} + + + ); }; export default TitlePage; diff --git a/src/core/components/UploadSystem.jsx b/src/core/components/UploadSystem.jsx index fe04b73..b40fb46 100644 --- a/src/core/components/UploadSystem.jsx +++ b/src/core/components/UploadSystem.jsx @@ -1,176 +1,175 @@ -import { Box, Button, Paper, Typography } from "@mui/material"; -import { useTranslations } from "next-intl"; -import Image from "next/image"; +import {Box, Button, Paper, Typography} from "@mui/material"; +import {useTranslations} from "next-intl"; import AddIcon from "@mui/icons-material/Add"; import DeleteForeverIcon from "@mui/icons-material/DeleteForever"; -import { useRef } from "react"; +import {useRef} from "react"; const UploadSystem = ({ - selectedImage, - setselectedImage, - handleUploadChange, - fieldname, - setFieldValue, - imageAlt, - imageSize, - fileType, - fileName, - setShowAddIcon, - showAddIcon, -}) => { - const t = useTranslations(); - const fileInputRef = useRef(null); + selectedImage, + setselectedImage, + handleUploadChange, + fieldname, + setFieldValue, + imageAlt, + imageSize, + fileType, + fileName, + setShowAddIcon, + showAddIcon, + }) => { + const t = useTranslations(); + const fileInputRef = useRef(null); - const handleClick = () => { - fileInputRef.current.click(); - }; + const handleClick = () => { + fileInputRef.current.click(); + }; - const handleDeleteImage = () => { - setselectedImage(null); - setFieldValue(fieldname, null); - setShowAddIcon(true); - if (fileInputRef.current) { - fileInputRef.current.value = ""; - } - }; + const handleDeleteImage = () => { + setselectedImage(null); + setFieldValue(fieldname, null); + setShowAddIcon(true); + if (fileInputRef.current) { + fileInputRef.current.value = ""; + } + }; - const isDocumentFormat = (fileType) => { - const documentFormats = [ - "application/pdf", - "application/msword", - "application/vnd.openxmlformats-officedocument.wordprocessingml.document", - "application/vnd.ms-excel", - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - ]; - return documentFormats.includes(fileType); - }; + const isDocumentFormat = (fileType) => { + const documentFormats = [ + "application/pdf", + "application/msword", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "application/vnd.ms-excel", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + ]; + return documentFormats.includes(fileType); + }; - return ( - - {showAddIcon ? ( - // Show the add icon and "Upload File" text when no image is selected - <> - + {showAddIcon ? ( + // Show the add icon and "Upload File" text when no image is selected + <> + - - - {t("UploadSystem.upload_file")} - - - - ) : ( - // Show the uploaded content along with the delete button when an image or document is selected - <> - {fileType && fileType.startsWith("image/") ? ( - - - - ) : ( - fileType && - isDocumentFormat(fileType) && ( - - - {fileName} - - - ) - )} - - - )} - - - ); + height: imageSize[1], + }} + onClick={handleClick} + > + + + {t("UploadSystem.upload_file")} + + + + ) : ( + // Show the uploaded content along with the delete button when an image or document is selected + <> + {fileType && fileType.startsWith("image/") ? ( + + + + ) : ( + fileType && + isDocumentFormat(fileType) && ( + + + {fileName} + + + ) + )} + + + )} + + + ); }; export default UploadSystem; diff --git a/src/core/components/isBotHandler.jsx b/src/core/components/isBotHandler.jsx index 0fde3e3..5a4c4e1 100644 --- a/src/core/components/isBotHandler.jsx +++ b/src/core/components/isBotHandler.jsx @@ -1,8 +1,8 @@ -import { NoSsr } from "@mui/material"; +import {NoSsr} from "@mui/material"; -const NoSsrHandler = ({ isBot, children }) => { - if (isBot) return children; - return {children}; +const NoSsrHandler = ({isBot, children}) => { + if (isBot) return children; + return {children}; }; export default NoSsrHandler; diff --git a/src/core/components/notifications/ErrorNotification.jsx b/src/core/components/notifications/ErrorNotification.jsx index f0c887d..e6ac204 100644 --- a/src/core/components/notifications/ErrorNotification.jsx +++ b/src/core/components/notifications/ErrorNotification.jsx @@ -1,40 +1,40 @@ import DangerousIcon from "@mui/icons-material/Dangerous"; -import { Box, Typography } from "@mui/material"; -import { toast } from "react-toastify"; +import {Box, Typography} from "@mui/material"; +import {toast} from "react-toastify"; const ErrorNotification = (directionApp, status, t, message) => { - toast( - () => ( - <> - - - - - - {t("notifications.error")} ({t("notifications.code")}: {status}) - - - {message || t("notifications.error_static_text")} - - - - - - ), - { - position: directionApp === "ltr" ? "top-left" : "top-right", - autoClose: false, - closeOnClick: false, - draggable: false, - } - ); + toast( + () => ( + <> + + + + + + {t("notifications.error")} ({t("notifications.code")}: {status}) + + + {message || t("notifications.error_static_text")} + + + + + + ), + { + position: directionApp === "ltr" ? "top-left" : "top-right", + autoClose: false, + closeOnClick: false, + draggable: false, + } + ); }; export default ErrorNotification; diff --git a/src/core/components/notifications/SuccessNotification.jsx b/src/core/components/notifications/SuccessNotification.jsx index ea484d6..085b154 100644 --- a/src/core/components/notifications/SuccessNotification.jsx +++ b/src/core/components/notifications/SuccessNotification.jsx @@ -1,43 +1,43 @@ import BeenhereIcon from "@mui/icons-material/Beenhere"; -import { Box, Typography } from "@mui/material"; -import { toast } from "react-toastify"; +import {Box, Typography} from "@mui/material"; +import {toast} from "react-toastify"; const SuccessNotification = (directionApp, status, t) => { - toast( - () => ( - <> - - - - - - {t("notifications.success")} ({t("notifications.code")}:{" "} - {status}) - - - {t("notifications.success_static_text")} - - - - - - ), - { - position: directionApp === "ltr" ? "top-left" : "top-right", - autoClose: 3000, - hideProgressBar: true, - pauseOnHover: true, - closeOnClick: false, - draggable: true, - } - ); + toast( + () => ( + <> + + + + + + {t("notifications.success")} ({t("notifications.code")}:{" "} + {status}) + + + {t("notifications.success_static_text")} + + + + + + ), + { + position: directionApp === "ltr" ? "top-left" : "top-right", + autoClose: 3000, + hideProgressBar: true, + pauseOnHover: true, + closeOnClick: false, + draggable: true, + } + ); }; export default SuccessNotification; diff --git a/src/core/components/notifications/UploadFileNotification.jsx b/src/core/components/notifications/UploadFileNotification.jsx index d06783b..51e2761 100644 --- a/src/core/components/notifications/UploadFileNotification.jsx +++ b/src/core/components/notifications/UploadFileNotification.jsx @@ -1,37 +1,37 @@ import DangerousIcon from "@mui/icons-material/Dangerous"; -import { Box, Typography } from "@mui/material"; -import { toast } from "react-toastify"; +import {Box, Typography} from "@mui/material"; +import {toast} from "react-toastify"; const UploadFileNotification = (directionApp, t) => { - toast( - ({ closeToast }) => ( - <> - - - - - - {t("UploadSystem.uploadfile_error")} - - - - - - ), - { - position: directionApp === "ltr" ? "top-left" : "top-right", - autoClose: false, - closeOnClick: false, - draggable: false, - } - ); + toast( + ({closeToast}) => ( + <> + + + + + + {t("UploadSystem.uploadfile_error")} + + + + + + ), + { + position: directionApp === "ltr" ? "top-left" : "top-right", + autoClose: false, + closeOnClick: false, + draggable: false, + } + ); }; export default UploadFileNotification; diff --git a/src/core/components/notifications/WarningNotification.jsx b/src/core/components/notifications/WarningNotification.jsx index 8a2bfa3..8e3280e 100644 --- a/src/core/components/notifications/WarningNotification.jsx +++ b/src/core/components/notifications/WarningNotification.jsx @@ -1,41 +1,41 @@ import ReportIcon from "@mui/icons-material/Report"; -import { Box, Typography } from "@mui/material"; -import { toast } from "react-toastify"; +import {Box, Typography} from "@mui/material"; +import {toast} from "react-toastify"; const WarningNotification = (directionApp, status, t) => { - toast( - () => ( - <> - - - - - - {t("notifications.warning")} ({t("notifications.code")}:{" "} - {status}) - - - {t("notifications.warning_static_text")} - - - - - - ), - { - position: directionApp === "ltr" ? "top-left" : "top-right", - autoClose: false, - closeOnClick: false, - draggable: false, - } - ); + toast( + () => ( + <> + + + + + + {t("notifications.warning")} ({t("notifications.code")}:{" "} + {status}) + + + {t("notifications.warning_static_text")} + + + + + + ), + { + position: directionApp === "ltr" ? "top-left" : "top-right", + autoClose: false, + closeOnClick: false, + draggable: false, + } + ); }; export default WarningNotification; diff --git a/src/core/components/notifications/index.jsx b/src/core/components/notifications/index.jsx index ef63918..41a1896 100644 --- a/src/core/components/notifications/index.jsx +++ b/src/core/components/notifications/index.jsx @@ -3,37 +3,37 @@ import WarningNotification from "./WarningNotification"; import SuccessNotification from "./SuccessNotification"; const Notifications = async (directionApp, response, t) => { - const { status, data } = response; + const {status, data} = response; - switch (status) { - case 200: - SuccessNotification(directionApp, status, t); - break; - case 400: - ErrorNotification(directionApp, status, t); - break; - case 401: - ErrorNotification(directionApp, status, t); - break; - case 403: - ErrorNotification(directionApp, status, t); - break; - case 422: - ErrorNotification(directionApp, status, t, data.message); - break; - case 500: - WarningNotification(directionApp, status, t); - break; - case 503: - WarningNotification(directionApp, status, t); - break; - case 504: - WarningNotification(directionApp, status, t); - break; - default: - // Handle other cases if needed - break; - } + switch (status) { + case 200: + SuccessNotification(directionApp, status, t); + break; + case 400: + ErrorNotification(directionApp, status, t); + break; + case 401: + ErrorNotification(directionApp, status, t); + break; + case 403: + ErrorNotification(directionApp, status, t); + break; + case 422: + ErrorNotification(directionApp, status, t, data.message); + break; + case 500: + WarningNotification(directionApp, status, t); + break; + case 503: + WarningNotification(directionApp, status, t); + break; + case 504: + WarningNotification(directionApp, status, t); + break; + default: + // Handle other cases if needed + break; + } }; export default Notifications; diff --git a/src/core/data/apiRoutes.js b/src/core/data/apiRoutes.js index 2c84765..cf01622 100644 --- a/src/core/data/apiRoutes.js +++ b/src/core/data/apiRoutes.js @@ -14,55 +14,55 @@ export const GET_USER_ROUTE = BASE_URL + "/dashboard/profile/info"; //passenger office export const GET_PASSENGER_OFFICE = - BASE_URL + "/dashboard/passenger_office_chief/show"; + BASE_URL + "/dashboard/passenger_office_chief/show"; export const CONFIRM_PASSENGER_OFFICE = - BASE_URL + "/dashboard/passenger_office_chief/confirm"; + BASE_URL + "/dashboard/passenger_office_chief/confirm"; export const REJECT_PASSENGER_OFFICE = - BASE_URL + "/dashboard/passenger_office_chief/reject"; + BASE_URL + "/dashboard/passenger_office_chief/reject"; //passenger office //passenger boss export const GET_PASSENGER_BOSS = - BASE_URL + "/dashboard/province_working_group/show"; + BASE_URL + "/dashboard/province_working_group/show"; export const CONFIRM_PASSENGER_BOSS = - BASE_URL + "/dashboard/province_working_group/confirm"; + BASE_URL + "/dashboard/province_working_group/confirm"; export const REJECT_PASSENGER_BOSS = - BASE_URL + "/dashboard/province_working_group/reject"; + BASE_URL + "/dashboard/province_working_group/reject"; //passenger boss //transportation assistance export const GET_TRANSPORTATION_ASSISTANCE = - BASE_URL + "/dashboard/transportation_assistant/show"; + BASE_URL + "/dashboard/transportation_assistant/show"; export const CONFIRM_TRANSPORTATION_ASSISTANCE = - BASE_URL + "/dashboard/transportation_assistant/confirm"; + BASE_URL + "/dashboard/transportation_assistant/confirm"; export const REJECT_TRANSPORTATION_ASSISTANCE = - BASE_URL + "/dashboard/transportation_assistant/reject"; + BASE_URL + "/dashboard/transportation_assistant/reject"; //transportation assistance //machinary office export const GET_MACHINARY_OFFICE = - BASE_URL + "/dashboard/machinery_expert/show"; + BASE_URL + "/dashboard/machinery_expert/show"; export const CONFIRM_MACHINARY_OFFICE = - BASE_URL + "/dashboard/machinery_expert/confirm"; + BASE_URL + "/dashboard/machinery_expert/confirm"; export const REJECT_MACHINARY_OFFICE = - BASE_URL + "/dashboard/machinery_expert/reject"; + BASE_URL + "/dashboard/machinery_expert/reject"; //passenger office //province manager export const GET_PROVINCE_MANAGER = - BASE_URL + "/dashboard/province_manager/show"; + BASE_URL + "/dashboard/province_manager/show"; export const CONFIRM_PROVINCE_MANAGER = - BASE_URL + "/dashboard/province_manager/confirm"; + BASE_URL + "/dashboard/province_manager/confirm"; export const REJECT_PROVINCE_MANAGER = - BASE_URL + "/dashboard/province_manager/reject"; + BASE_URL + "/dashboard/province_manager/reject"; //province manager diff --git a/src/core/data/headerProfileItems.jsx b/src/core/data/headerProfileItems.jsx index 63e661a..577fba3 100644 --- a/src/core/data/headerProfileItems.jsx +++ b/src/core/data/headerProfileItems.jsx @@ -2,18 +2,18 @@ import BorderColorIcon from "@mui/icons-material/BorderColor"; import PasswordIcon from "@mui/icons-material/Password"; const headerProfileItems = [ - { - key: 0, - name: "header.edit_profile", - route: "/dashboard/edit-profile", - icon: , - }, - { - key: 1, - name: "header.change_password", - route: "/dashboard/change-password", - icon: , - }, + { + key: 0, + name: "header.edit_profile", + route: "/dashboard/edit-profile", + icon: , + }, + { + key: 1, + name: "header.change_password", + route: "/dashboard/change-password", + icon: , + }, ]; export default headerProfileItems; diff --git a/src/core/data/sidebarMenu.jsx b/src/core/data/sidebarMenu.jsx index 667c688..352b424 100644 --- a/src/core/data/sidebarMenu.jsx +++ b/src/core/data/sidebarMenu.jsx @@ -6,58 +6,58 @@ import AssignmentIndIcon from "@mui/icons-material/AssignmentInd"; import DesktopWindowsIcon from "@mui/icons-material/DesktopWindows"; const sidebarMenu = [ - [ - { - key: "sidebar.dashboard", - type: "page", - route: "/dashboard", - icon: , - selected: false, - role: "all", - }, - { - key: "sidebar.passenger-office-chief", - secondary: "secondary.passenger-office", - type: "page", - route: "/dashboard/passenger-office-chief", - icon: , - selected: false, - role: "passenger_office_chief", - }, - { - key: "sidebar.machinary-expert", - type: "page", - route: "/dashboard/machinary-expert", - icon: , - selected: false, - role: "machinery_expert", - }, - { - key: "sidebar.passenger-boss", - secondary: "secondary.passenger-boss", - type: "page", - route: "/dashboard/passenger-boss", - icon: , - selected: false, - role: "passenger_office_chief", - }, - { - key: "sidebar.transportation-assistant", - type: "page", - route: "/dashboard/transportation-assistant", - icon: , - selected: false, - role: "transportation_assistant", - }, - { - key: "sidebar.province-manager", - type: "page", - route: "/dashboard/province-manager", - icon: , - selected: false, - role: "province_manager", - }, - ], + [ + { + key: "sidebar.dashboard", + type: "page", + route: "/dashboard", + icon: , + selected: false, + role: "all", + }, + { + key: "sidebar.passenger-office-chief", + secondary: "secondary.passenger-office", + type: "page", + route: "/dashboard/passenger-office-chief", + icon: , + selected: false, + role: "passenger_office_chief", + }, + { + key: "sidebar.machinary-expert", + type: "page", + route: "/dashboard/machinary-expert", + icon: , + selected: false, + role: "machinery_expert", + }, + { + key: "sidebar.passenger-boss", + secondary: "secondary.passenger-boss", + type: "page", + route: "/dashboard/passenger-boss", + icon: , + selected: false, + role: "passenger_office_chief", + }, + { + key: "sidebar.transportation-assistant", + type: "page", + route: "/dashboard/transportation-assistant", + icon: , + selected: false, + role: "transportation_assistant", + }, + { + key: "sidebar.province-manager", + type: "page", + route: "/dashboard/province-manager", + icon: , + selected: false, + role: "province_manager", + }, + ], ]; export default sidebarMenu; diff --git a/src/core/utils/createEmotionCache.jsx b/src/core/utils/createEmotionCache.jsx index 06add02..413fafe 100644 --- a/src/core/utils/createEmotionCache.jsx +++ b/src/core/utils/createEmotionCache.jsx @@ -1,38 +1,38 @@ import createCache from "@emotion/cache"; -import { prefixer } from "stylis"; +import {prefixer} from "stylis"; import stylisRTLPlugin from "stylis-plugin-rtl"; const isBrowser = typeof document !== "undefined"; export const createEmotionCacheLtr = () => { - let insertionPoint; + let insertionPoint; - if (isBrowser) { - const emotionInsertionPoint = document.querySelector( - 'meta[name="emotion-insertion-point"]' - ); - insertionPoint = emotionInsertionPoint ?? undefined; - } + if (isBrowser) { + const emotionInsertionPoint = document.querySelector( + 'meta[name="emotion-insertion-point"]' + ); + insertionPoint = emotionInsertionPoint ?? undefined; + } - return createCache({ - key: "mui-style", - insertionPoint, - }); + return createCache({ + key: "mui-style", + insertionPoint, + }); }; export const createEmotionCacheRtl = () => { - let insertionPoint; + let insertionPoint; - if (isBrowser) { - const emotionInsertionPoint = document.querySelector( - 'meta[name="emotion-insertion-point"]' - ); - insertionPoint = emotionInsertionPoint ?? undefined; - } + if (isBrowser) { + const emotionInsertionPoint = document.querySelector( + 'meta[name="emotion-insertion-point"]' + ); + insertionPoint = emotionInsertionPoint ?? undefined; + } - return createCache({ - key: "muirtl", - stylisPlugins: [prefixer, stylisRTLPlugin], - insertionPoint, - }); + return createCache({ + key: "muirtl", + stylisPlugins: [prefixer, stylisRTLPlugin], + insertionPoint, + }); }; diff --git a/src/core/utils/theme-rtl.jsx b/src/core/utils/theme-rtl.jsx index 2d0fdab..fb0bbaa 100644 --- a/src/core/utils/theme-rtl.jsx +++ b/src/core/utils/theme-rtl.jsx @@ -1,12 +1,12 @@ -import { createTheme } from "@mui/material/styles"; +import {createTheme} from "@mui/material/styles"; import theme from "./theme"; const themeRtl = createTheme({ - direction: "rtl", - typography: { - fontFamily: `IRANSansFaNum, sans-serif`, - }, - ...theme, + direction: "rtl", + typography: { + fontFamily: `IRANSansFaNum, sans-serif`, + }, + ...theme, }); export default themeRtl; diff --git a/src/core/utils/theme.jsx b/src/core/utils/theme.jsx index e921777..1679552 100644 --- a/src/core/utils/theme.jsx +++ b/src/core/utils/theme.jsx @@ -1,30 +1,30 @@ -import { faIR } from "@mui/x-date-pickers/locales"; +import {faIR} from "@mui/x-date-pickers/locales"; const theme = { - palette: { - primary: { - main: "#084070", - contrastText: "#fff", - light: "#2c6291", - dark: "#11293e", - }, - secondary: { - main: "#FF4E00", - contrastText: "#fff", - light: "#ed743e", - dark: "#ad3a07", - }, - }, - faIR, - components: { - MuiBackdrop: { - styleOverrides: { - root: { - backgroundColor: "#02020226", // Replace with your desired backdrop color and opacity + palette: { + primary: { + main: "#084070", + contrastText: "#fff", + light: "#2c6291", + dark: "#11293e", + }, + secondary: { + main: "#FF4E00", + contrastText: "#fff", + light: "#ed743e", + dark: "#ad3a07", + }, + }, + faIR, + components: { + MuiBackdrop: { + styleOverrides: { + root: { + backgroundColor: "#02020226", // Replace with your desired backdrop color and opacity + }, + }, }, - }, }, - }, }; export default theme; diff --git a/src/layouts/AppLayout.jsx b/src/layouts/AppLayout.jsx index 4845f6d..d2c5da5 100644 --- a/src/layouts/AppLayout.jsx +++ b/src/layouts/AppLayout.jsx @@ -4,96 +4,96 @@ import useLoading from "@/lib/app/hooks/useLoading"; import useUser from "@/lib/app/hooks/useUser"; import Head from "next/head"; import NextNProgress from "nextjs-progressbar"; -import { useEffect } from "react"; +import {useEffect} from "react"; -function AppLayout({ children, isBot }) { - const { languageIsReady } = useLanguage(); - const { setLoadingPage } = useLoading(); - const { userChangedLanguage, token, isAuth } = useUser(); - useEffect(() => { - if (languageIsReady) { - if (token) { - if (isAuth) { - if (userChangedLanguage) { - setLoadingPage(true); - return; - } - setLoadingPage(false); - return; - } - setLoadingPage(true); - return; - } - setLoadingPage(false); - return; - } - setLoadingPage(true); - }, [languageIsReady, token, isAuth, userChangedLanguage]); +function AppLayout({children, isBot}) { + const {languageIsReady} = useLanguage(); + const {setLoadingPage} = useLoading(); + const {userChangedLanguage, token, isAuth} = useUser(); + useEffect(() => { + if (languageIsReady) { + if (token) { + if (isAuth) { + if (userChangedLanguage) { + setLoadingPage(true); + return; + } + setLoadingPage(false); + return; + } + setLoadingPage(true); + return; + } + setLoadingPage(false); + return; + } + setLoadingPage(true); + }, [languageIsReady, token, isAuth, userChangedLanguage]); - if (!isBot) { - if (userChangedLanguage) return; - if (!languageIsReady) return; - } + if (!isBot) { + if (userChangedLanguage) return; + if (!languageIsReady) return; + } - return ( - <> - - - - - - - - - - - - - - - - - - - - - - {children} - - ); + return ( + <> + + + + + + + + + + + + + + + + + + + + + + {children} + + ); } export default AppLayout; diff --git a/src/layouts/CenterLayout.jsx b/src/layouts/CenterLayout.jsx index 4c8767f..1e1b8bf 100644 --- a/src/layouts/CenterLayout.jsx +++ b/src/layouts/CenterLayout.jsx @@ -1,18 +1,18 @@ -import { Fade, Stack } from "@mui/material"; +import {Fade, Stack} from "@mui/material"; const CenterLayout = (props) => { - return ( - - - {props.children} - - - ); + return ( + + + {props.children} + + + ); }; export default CenterLayout; diff --git a/src/layouts/FullPageLayout.jsx b/src/layouts/FullPageLayout.jsx index cbf2102..d6ed61e 100644 --- a/src/layouts/FullPageLayout.jsx +++ b/src/layouts/FullPageLayout.jsx @@ -1,21 +1,21 @@ -import { Stack } from "@mui/material"; +import {Stack} from "@mui/material"; const FullPageLayout = (props) => { - return ( - - {props.children} - - ); + return ( + + {props.children} + + ); }; export default FullPageLayout; diff --git a/src/layouts/MuiLayout.jsx b/src/layouts/MuiLayout.jsx index ba891d0..2614ac2 100644 --- a/src/layouts/MuiLayout.jsx +++ b/src/layouts/MuiLayout.jsx @@ -1,76 +1,74 @@ import NoSsrHandler from "@/core/components/isBotHandler"; -import { - createEmotionCacheRtl -} from "@/core/utils/createEmotionCache"; +import {createEmotionCacheRtl} from "@/core/utils/createEmotionCache"; import themeRtl from "@/core/utils/theme-rtl"; -import { CacheProvider } from "@emotion/react"; -import { GlobalStyles } from "@mui/material"; +import {CacheProvider} from "@emotion/react"; +import {GlobalStyles} from "@mui/material"; import CssBaseline from "@mui/material/CssBaseline"; -import { ThemeProvider } from "@mui/material/styles"; +import {ThemeProvider} from "@mui/material/styles"; import Head from "next/head"; const clientSideEmotionCacheRtl = createEmotionCacheRtl(); -const MuiLayout = ({ children, isBot }) => { +const MuiLayout = ({children, isBot}) => { - const emotionCache = clientSideEmotionCacheRtl; + const emotionCache = clientSideEmotionCacheRtl; - const theme = themeRtl; - return ( - - - - - - - + + + + + + + body: { + width: "100vw", + height: "100vh", + }, + "#__next": { + width: "100%", + height: "100%", + }, + }} + /> - - {children} - - - - ); + + {children} + + + + ); }; export default MuiLayout; diff --git a/src/layouts/ScrollableLayout.jsx b/src/layouts/ScrollableLayout.jsx index 5ab58ca..583edd7 100644 --- a/src/layouts/ScrollableLayout.jsx +++ b/src/layouts/ScrollableLayout.jsx @@ -1,25 +1,25 @@ -import { Box, Fade } from "@mui/material"; +import {Box, Fade} from "@mui/material"; const ScrollableLayout = (props) => { - const overflowY = props?.y || "hidden"; - const overflowX = props?.x || "hidden"; + const overflowY = props?.y || "hidden"; + const overflowX = props?.x || "hidden"; - return ( - - - {props.children} - - - ); + return ( + + + {props.children} + + + ); }; export default ScrollableLayout; diff --git a/src/layouts/dashboardLayouts/breadcrumbs/BreadcrumbItem.jsx b/src/layouts/dashboardLayouts/breadcrumbs/BreadcrumbItem.jsx index ccff4c9..c233be3 100644 --- a/src/layouts/dashboardLayouts/breadcrumbs/BreadcrumbItem.jsx +++ b/src/layouts/dashboardLayouts/breadcrumbs/BreadcrumbItem.jsx @@ -1,19 +1,19 @@ import LinkRouting from "@/core/components/LinkRouting"; -import { Typography } from "@mui/material"; -import { useTranslations } from "next-intl"; +import {Typography} from "@mui/material"; +import {useTranslations} from "next-intl"; export default function BreadcrumbItem(props) { - const t = useTranslations(); - const isLast = props.index === props.RouterArray.length - 1; - const url = `/${props.RouterArray.slice(0, props.index + 1).join("/")}`; + const t = useTranslations(); + const isLast = props.index === props.RouterArray.length - 1; + const url = `/${props.RouterArray.slice(0, props.index + 1).join("/")}`; - return isLast ? ( - - {t("sidebar." + props.label)} - - ) : ( - - {t("sidebar." + props.label)} - - ); + return isLast ? ( + + {t("sidebar." + props.label)} + + ) : ( + + {t("sidebar." + props.label)} + + ); } diff --git a/src/layouts/dashboardLayouts/breadcrumbs/index.jsx b/src/layouts/dashboardLayouts/breadcrumbs/index.jsx index 3123a12..9ab234e 100644 --- a/src/layouts/dashboardLayouts/breadcrumbs/index.jsx +++ b/src/layouts/dashboardLayouts/breadcrumbs/index.jsx @@ -1,49 +1,49 @@ -import { useRouter } from "next/router"; -import { Box, Breadcrumbs } from "@mui/material"; -import { useTheme } from "@mui/material/styles"; -import { NavigateBefore, NavigateNext } from "@mui/icons-material"; +import {useRouter} from "next/router"; +import {Box, Breadcrumbs} from "@mui/material"; +import {useTheme} from "@mui/material/styles"; +import {NavigateBefore, NavigateNext} from "@mui/icons-material"; import BreadcrumbItem from "./BreadcrumbItem"; const BreadCrumbs = (props) => { - const { isVisible } = props; - const theme = useTheme(); - const router = useRouter(); + const {isVisible} = props; + const theme = useTheme(); + const router = useRouter(); - if (!isVisible) { - return null; - } + if (!isVisible) { + return null; + } - const { pathname } = router; - const RouterArray = pathname.split("/").filter((segment) => segment !== ""); + const {pathname} = router; + const RouterArray = pathname.split("/").filter((segment) => segment !== ""); - if (RouterArray.length === 1) { - return null; - } + if (RouterArray.length === 1) { + return null; + } - return ( - - - ) : ( - - ) - } - aria-label="breadcrumb" - > - {RouterArray.map((segment, index) => ( - - ))} - - - ); + return ( + + + ) : ( + + ) + } + aria-label="breadcrumb" + > + {RouterArray.map((segment, index) => ( + + ))} + + + ); }; export default BreadCrumbs; diff --git a/src/layouts/dashboardLayouts/header/ProfileData.jsx b/src/layouts/dashboardLayouts/header/ProfileData.jsx index e07dba6..548378b 100644 --- a/src/layouts/dashboardLayouts/header/ProfileData.jsx +++ b/src/layouts/dashboardLayouts/header/ProfileData.jsx @@ -1,18 +1,18 @@ -import { Avatar, Stack, Typography } from "@mui/material"; +import {Avatar, Stack, Typography} from "@mui/material"; import useUser from "@/lib/app/hooks/useUser"; export default function ProfileData() { - const { user } = useUser(); - return ( - - - - {user.username} - - - ); + const {user} = useUser(); + return ( + + + + {user.username} + + + ); } diff --git a/src/layouts/dashboardLayouts/header/ProfileMenu.jsx b/src/layouts/dashboardLayouts/header/ProfileMenu.jsx index 1c53ef5..415d501 100644 --- a/src/layouts/dashboardLayouts/header/ProfileMenu.jsx +++ b/src/layouts/dashboardLayouts/header/ProfileMenu.jsx @@ -1,61 +1,62 @@ -import { Avatar, Menu, IconButton, Tooltip } from "@mui/material"; -import { useState } from "react"; +import {Avatar, IconButton, Menu, Tooltip} from "@mui/material"; +import {useState} from "react"; import ProfileData from "./ProfileData"; import ProfileOptions from "./ProfileOptions"; -import { useTranslations } from "next-intl"; +import {useTranslations} from "next-intl"; import useUser from "@/lib/app/hooks/useUser"; function ProfileMenu() { - const t = useTranslations(); - const [anchorElUser, setAnchorElUser] = useState(null); - const { user } = useUser(); + const t = useTranslations(); + const [anchorElUser, setAnchorElUser] = useState(null); + const {user} = useUser(); - const handleOpenUserMenu = (event) => { - setAnchorElUser(event.currentTarget); - }; - const handleCloseUserMenu = () => { - setAnchorElUser(null); - }; + const handleOpenUserMenu = (event) => { + setAnchorElUser(event.currentTarget); + }; + const handleCloseUserMenu = () => { + setAnchorElUser(null); + }; - return ( - <> - - - - - - - - - - - ); + return ( + <> + + + + + + + + + + + ); } + export default ProfileMenu; diff --git a/src/layouts/dashboardLayouts/header/ProfileOptionLogOut.jsx b/src/layouts/dashboardLayouts/header/ProfileOptionLogOut.jsx index f56db6c..2a6cf85 100644 --- a/src/layouts/dashboardLayouts/header/ProfileOptionLogOut.jsx +++ b/src/layouts/dashboardLayouts/header/ProfileOptionLogOut.jsx @@ -1,49 +1,49 @@ -import { Box, Button, MenuItem, Typography } from "@mui/material"; +import {Box, Button, MenuItem, Typography} from "@mui/material"; import MeetingRoomIcon from "@mui/icons-material/MeetingRoom"; import useUser from "@/lib/app/hooks/useUser"; -import { useTranslations } from "next-intl"; +import {useTranslations} from "next-intl"; -export default function ProfileOptionLogOut({ handleCloseUserMenu }) { - const t = useTranslations(); - const { clearToken } = useUser(); - const handleClickLogOut = () => { - handleCloseUserMenu(); - clearToken(); - }; - return ( - <> - - - - - - - {t("header.logout")} - - - - - ); +export default function ProfileOptionLogOut({handleCloseUserMenu}) { + const t = useTranslations(); + const {clearToken} = useUser(); + const handleClickLogOut = () => { + handleCloseUserMenu(); + clearToken(); + }; + return ( + <> + + + + + + + {t("header.logout")} + + + + + ); } diff --git a/src/layouts/dashboardLayouts/header/ProfileOptions.jsx b/src/layouts/dashboardLayouts/header/ProfileOptions.jsx index bf63212..6e7bdba 100644 --- a/src/layouts/dashboardLayouts/header/ProfileOptions.jsx +++ b/src/layouts/dashboardLayouts/header/ProfileOptions.jsx @@ -1,49 +1,49 @@ -import { Box, MenuItem, Typography } from "@mui/material"; -import { NextLinkComposed } from "@/core/components/LinkRouting"; -import { useTranslations } from "next-intl"; +import {Box, MenuItem, Typography} from "@mui/material"; +import {NextLinkComposed} from "@/core/components/LinkRouting"; +import {useTranslations} from "next-intl"; import headerProfileItems from "@/core/data/headerProfileItems"; import ProfileOptionLogOut from "./ProfileOptionLogOut"; -export default function ProfileOptions({ handleCloseUserMenu }) { - const t = useTranslations(); +export default function ProfileOptions({handleCloseUserMenu}) { + const t = useTranslations(); - return ( - <> - {headerProfileItems.map((profile_item) => ( - - - - {profile_item.icon} - - - {t(profile_item.name)} - - - - ))} - - - ); + return ( + <> + {headerProfileItems.map((profile_item) => ( + + + + {profile_item.icon} + + + {t(profile_item.name)} + + + + ))} + + + ); } diff --git a/src/layouts/dashboardLayouts/header/index.jsx b/src/layouts/dashboardLayouts/header/index.jsx index cd1e4a0..8760960 100644 --- a/src/layouts/dashboardLayouts/header/index.jsx +++ b/src/layouts/dashboardLayouts/header/index.jsx @@ -1,80 +1,72 @@ import MenuIcon from "@mui/icons-material/Menu"; -import { - AppBar, - Box, - Container, - CssBaseline, - IconButton, - Stack, - Toolbar, - useTheme -} from "@mui/material"; +import {AppBar, Box, Container, CssBaseline, IconButton, Stack, Toolbar, useTheme} from "@mui/material"; import ProfileMenu from "./ProfileMenu"; -function Header({ drawerWidth, handleDrawerToggle }) { - const theme = useTheme(); +function Header({drawerWidth, handleDrawerToggle}) { + const theme = useTheme(); - return ( - <> - - - - - - - - - - - + + - - - - - - - - - - ); + > + + + + + + + + + + + + + + + + + + + ); } + export default Header; diff --git a/src/layouts/dashboardLayouts/index.jsx b/src/layouts/dashboardLayouts/index.jsx index f1478bf..ed0ee31 100644 --- a/src/layouts/dashboardLayouts/index.jsx +++ b/src/layouts/dashboardLayouts/index.jsx @@ -1,50 +1,50 @@ -import { useState } from "react"; +import {useState} from "react"; import FullPageLayout from "../FullPageLayout"; import Header from "./header"; import Sidebar from "./sidebar"; -import { Toolbar } from "@mui/material"; +import {Toolbar} from "@mui/material"; import BreadCrumbs from "./breadcrumbs"; -import { ToastContainer } from "react-toastify"; +import {ToastContainer} from "react-toastify"; import "react-toastify/dist/ReactToastify.css"; import useDirection from "@/lib/app/hooks/useDirection"; const drawerWidth = 240; const DashboardLayouts = (props) => { - const { directionApp } = useDirection(); - const { window } = props; - const [mobileOpen, setMobileOpen] = useState(false); - const container = - window !== undefined ? () => window().document.body : undefined; + const {directionApp} = useDirection(); + const {window} = props; + const [mobileOpen, setMobileOpen] = useState(false); + const container = + window !== undefined ? () => window().document.body : undefined; - const handleDrawerToggle = () => { - setMobileOpen(!mobileOpen); - }; - return ( - -
- - - - - - {props.children} + const handleDrawerToggle = () => { + setMobileOpen(!mobileOpen); + }; + return ( + +
+ + + + + + {props.children} + + + {directionApp === "rtl" ? : } - - {directionApp === "rtl" ? : } - - ); + ); }; export default DashboardLayouts; diff --git a/src/layouts/dashboardLayouts/sidebar/SidebarDrawer.jsx b/src/layouts/dashboardLayouts/sidebar/SidebarDrawer.jsx index 6eb5e60..fecc252 100644 --- a/src/layouts/dashboardLayouts/sidebar/SidebarDrawer.jsx +++ b/src/layouts/dashboardLayouts/sidebar/SidebarDrawer.jsx @@ -1,29 +1,28 @@ -import { Divider, Stack, Toolbar, Typography } from "@mui/material"; -import { useTranslations } from "next-intl"; +import {Divider, Stack, Toolbar, Typography} from "@mui/material"; +import {useTranslations} from "next-intl"; import SidebarList from "./SidebarList"; -import StyledImage from "@/core/components/StyledImage"; -const SidebarDrawer = ({ handleDrawerToggle }) => { - const t = useTranslations(); - return ( - <> - - - - {t("app_short_name")} - - - { - t("expert") /* make if on thease t("user_welfare_services") +const SidebarDrawer = ({handleDrawerToggle}) => { + const t = useTranslations(); + return ( + <> + + + + {t("app_short_name")} + + + { + t("expert") /* make if on thease t("user_welfare_services") t("user_navy") */ - } - - - - - - - ); + } + + + + + + + ); }; export default SidebarDrawer; diff --git a/src/layouts/dashboardLayouts/sidebar/SidebarList.jsx b/src/layouts/dashboardLayouts/sidebar/SidebarList.jsx index c47cf2b..dffd844 100644 --- a/src/layouts/dashboardLayouts/sidebar/SidebarList.jsx +++ b/src/layouts/dashboardLayouts/sidebar/SidebarList.jsx @@ -1,57 +1,57 @@ -import { Divider, List } from "@mui/material"; -import { useEffect, useReducer } from "react"; +import {Divider, List} from "@mui/material"; +import {useEffect, useReducer} from "react"; import SidebarListItem from "./SidebarListItem"; import sidebarMenu from "@/core/data/sidebarMenu"; -import { useRouter } from "next/router"; +import {useRouter} from "next/router"; import useUser from "@/lib/app/hooks/useUser"; function reducer(state, action) { - switch (action.type) { - case "COLLAPSE_MENU": - return state.map((itemsArr) => - itemsArr.map((item) => - action.key == item.key - ? { ...item, showSubItem: !item.showSubItem } - : item - ) - ); - case "SELECTED": - return state.map((itemsArr) => - itemsArr.map((item) => - action.route == item.route - ? { ...item, selected: true } - : { ...item, selected: false } - ) - ); - default: - throw new Error(); - } + switch (action.type) { + case "COLLAPSE_MENU": + return state.map((itemsArr) => + itemsArr.map((item) => + action.key == item.key + ? {...item, showSubItem: !item.showSubItem} + : item + ) + ); + case "SELECTED": + return state.map((itemsArr) => + itemsArr.map((item) => + action.route == item.route + ? {...item, selected: true} + : {...item, selected: false} + ) + ); + default: + throw new Error(); + } } -export default function SidebarList({ handleDrawerToggle }) { - const [itemMenu, dispatch] = useReducer(reducer, sidebarMenu); - const { user } = useUser(); - const router = useRouter(); +export default function SidebarList({handleDrawerToggle}) { + const [itemMenu, dispatch] = useReducer(reducer, sidebarMenu); + const {user} = useUser(); + const router = useRouter(); - useEffect(() => { - dispatch({ type: "SELECTED", route: router.pathname }); - }, [router.pathname]); + useEffect(() => { + dispatch({type: "SELECTED", route: router.pathname}); + }, [router.pathname]); - const filteredItemMenu = itemMenu[0].filter( - (item) => user.role.includes(item.role) || item.role === "all" - ); + const filteredItemMenu = itemMenu[0].filter( + (item) => user.role.includes(item.role) || item.role === "all" + ); - return ( - - {filteredItemMenu.map((item, index) => ( - - ))} - {filteredItemMenu.length > 0 && } - - ); + return ( + + {filteredItemMenu.map((item, index) => ( + + ))} + {filteredItemMenu.length > 0 && } + + ); } diff --git a/src/layouts/dashboardLayouts/sidebar/SidebarListItem.jsx b/src/layouts/dashboardLayouts/sidebar/SidebarListItem.jsx index 949b171..f14ae1d 100644 --- a/src/layouts/dashboardLayouts/sidebar/SidebarListItem.jsx +++ b/src/layouts/dashboardLayouts/sidebar/SidebarListItem.jsx @@ -1,84 +1,77 @@ -import { NextLinkComposed } from "@/core/components/LinkRouting"; +import {NextLinkComposed} from "@/core/components/LinkRouting"; import ExpandLess from "@mui/icons-material/ExpandLess"; import ExpandMore from "@mui/icons-material/ExpandMore"; -import { - Badge, - ListItem, - ListItemButton, - ListItemIcon, - ListItemText, - Typography, -} from "@mui/material"; -import { useTranslations } from "next-intl"; -import { Fragment } from "react"; +import {Badge, ListItem, ListItemButton, ListItemIcon, ListItemText, Typography,} from "@mui/material"; +import {useTranslations} from "next-intl"; +import {Fragment} from "react"; import SidebarListSubItem from "./SidebarListSubItem"; -const SidebarListItem = ({ item, dispatch, handleDrawerToggle }) => { - const t = useTranslations(); +const SidebarListItem = ({item, dispatch, handleDrawerToggle}) => { + const t = useTranslations(); - return ( - - - { - if (item.type == "menu") { - dispatch({ type: "COLLAPSE_MENU", key: item.key }); - } - handleDrawerToggle(); - }} - sx={{ - minHeight: 48, - }} - > - - {item.icon} - - - {t(item.secondary)} - - ) : null - } - /> + return ( + + + { + if (item.type == "menu") { + dispatch({type: "COLLAPSE_MENU", key: item.key}); + } + handleDrawerToggle(); + }} + sx={{ + minHeight: 48, + }} + > + + {item.icon} + + + {t(item.secondary)} + + ) : null + } + /> - {item.type == "menu" && - (item.showSubItem ? : )} - - - - {item.subItem && ( - - )} - - ); + {item.type == "menu" && + (item.showSubItem ? : )} + + + + {item.subItem && ( + + )} + + ); }; export default SidebarListItem; diff --git a/src/layouts/dashboardLayouts/sidebar/SidebarListSubItem.jsx b/src/layouts/dashboardLayouts/sidebar/SidebarListSubItem.jsx index f960efb..3407081 100644 --- a/src/layouts/dashboardLayouts/sidebar/SidebarListSubItem.jsx +++ b/src/layouts/dashboardLayouts/sidebar/SidebarListSubItem.jsx @@ -1,54 +1,48 @@ -import { NextLinkComposed } from "@/core/components/LinkRouting"; +import {NextLinkComposed} from "@/core/components/LinkRouting"; import InboxIcon from "@mui/icons-material/MoveToInbox"; -import { - Collapse, - List, - ListItemButton, - ListItemIcon, - ListItemText, -} from "@mui/material"; -import { useTranslations } from "next-intl"; -import { Fragment } from "react"; +import {Collapse, List, ListItemButton, ListItemIcon, ListItemText,} from "@mui/material"; +import {useTranslations} from "next-intl"; +import {Fragment} from "react"; -const SidebarListSubItem = ({ item, handleDrawerToggle }) => { - const t = useTranslations(); +const SidebarListSubItem = ({item, handleDrawerToggle}) => { + const t = useTranslations(); - return ( - - - {item.subItem.map((subitem, index) => ( - - { - if (item.type == "menu") { - dispatch({ type: "COLLAPSE_MENU", key: item.key }); - } - handleDrawerToggle(); - }} - > - - - - - - - ))} - - - ); + return ( + + + {item.subItem.map((subitem, index) => ( + + { + if (item.type == "menu") { + dispatch({type: "COLLAPSE_MENU", key: item.key}); + } + handleDrawerToggle(); + }} + > + + + + + + + ))} + + + ); }; export default SidebarListSubItem; diff --git a/src/layouts/dashboardLayouts/sidebar/index.jsx b/src/layouts/dashboardLayouts/sidebar/index.jsx index dcf7fe2..2498dfd 100644 --- a/src/layouts/dashboardLayouts/sidebar/index.jsx +++ b/src/layouts/dashboardLayouts/sidebar/index.jsx @@ -1,46 +1,46 @@ -import { Box, Drawer } from "@mui/material"; +import {Box, Drawer} from "@mui/material"; import SidebarDrawer from "./SidebarDrawer"; const Sidebar = (props) => { - return ( - - - - - - - - - ); + return ( + + + + + + + + + ); }; export default Sidebar; diff --git a/src/lib/app/contexts/DatatableContext.jsx b/src/lib/app/contexts/DatatableContext.jsx index 94bc016..27fa6ac 100644 --- a/src/lib/app/contexts/DatatableContext.jsx +++ b/src/lib/app/contexts/DatatableContext.jsx @@ -1,14 +1,14 @@ -import { createContext } from "react"; +import {createContext} from "react"; import useDataTable from "../hooks/useDatatable"; export const DataTableContext = createContext(); export const DataTableProvider = (props) => { - const contextValue = useDataTable(); + const contextValue = useDataTable(); - return ( - - {props.children} - - ); + return ( + + {props.children} + + ); }; diff --git a/src/lib/app/contexts/ReloadDatatableContext.jsx b/src/lib/app/contexts/ReloadDatatableContext.jsx index 05c788b..de359c5 100644 --- a/src/lib/app/contexts/ReloadDatatableContext.jsx +++ b/src/lib/app/contexts/ReloadDatatableContext.jsx @@ -1,15 +1,15 @@ -import { createContext, useState } from "react"; +import {createContext, useState} from "react"; export const ReloadDataTableContext = createContext(); -export const ReloadDataTableProvider = ({ children }) => { - const [reloadDataTable, setReloadDataTable] = useState(false); +export const ReloadDataTableProvider = ({children}) => { + const [reloadDataTable, setReloadDataTable] = useState(false); - return ( - - {children} - - ); + return ( + + {children} + + ); }; diff --git a/src/lib/app/contexts/language.jsx b/src/lib/app/contexts/language.jsx index c8ac313..e3f41f4 100644 --- a/src/lib/app/contexts/language.jsx +++ b/src/lib/app/contexts/language.jsx @@ -1,99 +1,99 @@ -import { FA_DATATABLE_LOCALIZATION } from "&/locales/fa/datatable"; -import { useRouter } from "next/router"; -import { createContext, useEffect, useState } from "react"; +import {FA_DATATABLE_LOCALIZATION} from "&/locales/fa/datatable"; +import {useRouter} from "next/router"; +import {createContext, useEffect, useState} from "react"; import useUser from "../hooks/useUser"; export const LanguageContext = createContext(); -export const LanguageProvider = ({ children }) => { - const router = useRouter(); - const languageList = [ - { - key: "fa", - dir: "rtl", - name: "فارسی", - fontFamily: `IRANSans, sans-serif`, - tableLocalization: FA_DATATABLE_LOCALIZATION, - } - ]; - const { user, userChangedLanguage, changeLanguageState } = useUser(); - const [languageIsReady, setLanguageIsReady] = useState(false); - const [languageApp, setLanguageApp] = useState(); - const [directionApp, setDirectionApp] = useState( - process.env.NEXT_PUBLIC_DEFAULT_DIRECTION - ); - - useEffect(() => { - const lang = localStorage.getItem("_language"); - - if (!lang && !languageApp) { - setLanguageApp(process.env.NEXT_PUBLIC_DEFAULT_LANGUAGE); - } else if (lang) { - setLanguageApp(lang); - } - }, []); - - useEffect(() => { - if (!languageApp) return; - - const lang = localStorage.getItem("_language"); - - if (!lang) { - localStorage.setItem("_language", languageApp); - } else { - if (languageApp != lang) { - localStorage.setItem("_language", languageApp); - } - } - }, [languageApp]); - - useEffect(() => { - if (!router.isReady) return; - if (user.user_language) { - if (user.user_language != languageApp) { - setLanguageApp(user.user_language); - return; - } - } - - if (languageApp != router.locale) { - router.replace( - { pathname: router.pathname, query: router.query }, - router.asPath, +export const LanguageProvider = ({children}) => { + const router = useRouter(); + const languageList = [ { - locale: languageApp, + key: "fa", + dir: "rtl", + name: "فارسی", + fontFamily: `IRANSans, sans-serif`, + tableLocalization: FA_DATATABLE_LOCALIZATION, } - ); - return; - } - for (const lang of languageList) { - if (languageApp != lang.key) continue; - setDirectionApp(lang.dir); - document.dir = lang.dir; - } + ]; + const {user, userChangedLanguage, changeLanguageState} = useUser(); + const [languageIsReady, setLanguageIsReady] = useState(false); + const [languageApp, setLanguageApp] = useState(); + const [directionApp, setDirectionApp] = useState( + process.env.NEXT_PUBLIC_DEFAULT_DIRECTION + ); - const timer = setTimeout(() => { - changeLanguageState(false); - setLanguageIsReady(true); - }, 1000); + useEffect(() => { + const lang = localStorage.getItem("_language"); - return () => { - clearTimeout(timer); - }; - }, [router.locale, router.isReady, userChangedLanguage, languageApp]); + if (!lang && !languageApp) { + setLanguageApp(process.env.NEXT_PUBLIC_DEFAULT_LANGUAGE); + } else if (lang) { + setLanguageApp(lang); + } + }, []); - return ( - - {children} - - ); + useEffect(() => { + if (!languageApp) return; + + const lang = localStorage.getItem("_language"); + + if (!lang) { + localStorage.setItem("_language", languageApp); + } else { + if (languageApp != lang) { + localStorage.setItem("_language", languageApp); + } + } + }, [languageApp]); + + useEffect(() => { + if (!router.isReady) return; + if (user.user_language) { + if (user.user_language != languageApp) { + setLanguageApp(user.user_language); + return; + } + } + + if (languageApp != router.locale) { + router.replace( + {pathname: router.pathname, query: router.query}, + router.asPath, + { + locale: languageApp, + } + ); + return; + } + for (const lang of languageList) { + if (languageApp != lang.key) continue; + setDirectionApp(lang.dir); + document.dir = lang.dir; + } + + const timer = setTimeout(() => { + changeLanguageState(false); + setLanguageIsReady(true); + }, 1000); + + return () => { + clearTimeout(timer); + }; + }, [router.locale, router.isReady, userChangedLanguage, languageApp]); + + return ( + + {children} + + ); }; diff --git a/src/lib/app/contexts/loading.jsx b/src/lib/app/contexts/loading.jsx index 6e95a8c..f5b8a47 100644 --- a/src/lib/app/contexts/loading.jsx +++ b/src/lib/app/contexts/loading.jsx @@ -1,14 +1,14 @@ import LoadingHardPage from "@/core/components/LoadingHardPage"; -import { createContext, useState } from "react"; +import {createContext, useState} from "react"; export const LoadingContext = createContext(); -export const LoadingProvider = ({ children }) => { - const [loadingPage, setLoadingPage] = useState(false); - return ( - - - {children} - - ); +export const LoadingProvider = ({children}) => { + const [loadingPage, setLoadingPage] = useState(false); + return ( + + + {children} + + ); }; diff --git a/src/lib/app/contexts/user.jsx b/src/lib/app/contexts/user.jsx index 30875d9..1dcdb1f 100644 --- a/src/lib/app/contexts/user.jsx +++ b/src/lib/app/contexts/user.jsx @@ -1,124 +1,122 @@ -import { - GET_USER_ROUTE, - SET_LANGUAGE -} from "@/core/data/apiRoutes"; +import {GET_USER_ROUTE} from "@/core/data/apiRoutes"; import axios from "axios"; -import { createContext, useCallback, useEffect, useReducer } from "react"; +import {createContext, useCallback, useEffect, useReducer} from "react"; const initialUser = { - isAuth: false, - userChangedLanguage: false, - token: null, - user: {}, + isAuth: false, + userChangedLanguage: false, + token: null, + user: {}, }; const reducer = (state, action) => { - switch (action.type) { - case "CLEAR_USER": - return { ...state, user: {} }; - case "CHANGE_USER": - return { ...state, user: action.user }; - case "CHANGE_USER_LANGUAGE": - return { - ...state, - user: { ...state.user, user_language: action.language }, - }; - case "CHANGE_AUTH_STATE": - return { ...state, isAuth: action.isAuth }; - case "CHANGE_LANGUAGE_STATE": - return { ...state, userChangedLanguage: action.userChangedLanguage }; - case "CLEAR_TOKEN": - localStorage.removeItem("_token"); - return { ...state, token: null }; - case "SET_TOKEN": - localStorage.setItem("_token", action.token); - return { ...state, token: action.token }; - default: - return state; - } + switch (action.type) { + case "CLEAR_USER": + return {...state, user: {}}; + case "CHANGE_USER": + return {...state, user: action.user}; + case "CHANGE_USER_LANGUAGE": + return { + ...state, + user: {...state.user, user_language: action.language}, + }; + case "CHANGE_AUTH_STATE": + return {...state, isAuth: action.isAuth}; + case "CHANGE_LANGUAGE_STATE": + return {...state, userChangedLanguage: action.userChangedLanguage}; + case "CLEAR_TOKEN": + localStorage.removeItem("_token"); + return {...state, token: null}; + case "SET_TOKEN": + localStorage.setItem("_token", action.token); + return {...state, token: action.token}; + default: + return state; + } }; export const UserContext = createContext(); -export const UserProvider = ({ children }) => { - const [state, dispatch] = useReducer(reducer, initialUser); +export const UserProvider = ({children}) => { + const [state, dispatch] = useReducer(reducer, initialUser); - const clearUser = useCallback(() => { - dispatch({ type: "CLEAR_USER" }); - }, []); + const clearUser = useCallback(() => { + dispatch({type: "CLEAR_USER"}); + }, []); - const changeUser = useCallback((user) => { - dispatch({ type: "CHANGE_USER", user }); - }, []); + const changeUser = useCallback((user) => { + dispatch({type: "CHANGE_USER", user}); + }, []); - const changeUserLanguage = useCallback(/* use in multi language app */); + const changeUserLanguage = useCallback(/* use in multi language app */); - const changeAuthState = useCallback((isAuth) => { - dispatch({ type: "CHANGE_AUTH_STATE", isAuth }); - }, []); + const changeAuthState = useCallback((isAuth) => { + dispatch({type: "CHANGE_AUTH_STATE", isAuth}); + }, []); - const changeLanguageState = useCallback((userChangedLanguage) => { - dispatch({ type: "CHANGE_LANGUAGE_STATE", userChangedLanguage }); - }, []); + const changeLanguageState = useCallback((userChangedLanguage) => { + dispatch({type: "CHANGE_LANGUAGE_STATE", userChangedLanguage}); + }, []); - const clearToken = useCallback(() => { - dispatch({ type: "CLEAR_TOKEN" }); - }, []); + const clearToken = useCallback(() => { + dispatch({type: "CLEAR_TOKEN"}); + }, []); - const setToken = useCallback((token) => { - dispatch({ type: "SET_TOKEN", token }); - }, []); + const setToken = useCallback((token) => { + dispatch({type: "SET_TOKEN", token}); + }, []); - const getUser = useCallback( - (callback = () => {}) => { - axios - .get(GET_USER_ROUTE, { - headers: { authorization: `Bearer ${state.token}` }, - }) - .then(({ data }) => { - if (typeof callback === "function") callback(data); + const getUser = useCallback( + (callback = () => { + }) => { + axios + .get(GET_USER_ROUTE, { + headers: {authorization: `Bearer ${state.token}`}, + }) + .then(({data}) => { + if (typeof callback === "function") callback(data); + }); + }, + [state.token] + ); + + useEffect(() => { + const localToken = localStorage.getItem("_token"); + if (localToken) dispatch({type: "SET_TOKEN", token: localToken}); + }, []); + + useEffect(() => { + if (!state.token) { + clearUser(); + changeAuthState(false); + changeLanguageState(false); + return; + } + getUser((data) => { + changeUser(data); + changeAuthState(true); + changeLanguageState(true); }); - }, - [state.token] - ); + }, [state.token]); - useEffect(() => { - const localToken = localStorage.getItem("_token"); - if (localToken) dispatch({ type: "SET_TOKEN", token: localToken }); - }, []); - - useEffect(() => { - if (!state.token) { - clearUser(); - changeAuthState(false); - changeLanguageState(false); - return; - } - getUser((data) => { - changeUser(data); - changeAuthState(true); - changeLanguageState(true); - }); - }, [state.token]); - - return ( - - {children} - - ); + return ( + + {children} + + ); }; diff --git a/src/lib/app/hooks/useDatatable.jsx b/src/lib/app/hooks/useDatatable.jsx index ddde95f..ff44b61 100644 --- a/src/lib/app/hooks/useDatatable.jsx +++ b/src/lib/app/hooks/useDatatable.jsx @@ -1,113 +1,113 @@ import axios from "axios"; -import { useCallback, useContext, useReducer, useState } from "react"; -import { ReloadDataTableContext } from "../contexts/ReloadDatatableContext"; +import {useCallback, useContext, useReducer, useState} from "react"; +import {ReloadDataTableContext} from "../contexts/ReloadDatatableContext"; import useUser from "./useUser"; import Notifications from "@/core/components/notifications"; import useDirection from "./useDirection"; -import { useTranslations } from "next-intl"; +import {useTranslations} from "next-intl"; const initialValues = { - url: "", - rowID: "", - values: {}, + url: "", + rowID: "", + values: {}, }; const reducer = (state, action) => { - switch (action.type) { - case "CONFIRM_DATA": - return { - ...state, - url: action.url, - rowID: action.rowID, - }; - case "REJECT_DATA": - return { - ...state, - url: action.url, - rowID: action.rowID, - values: {}, - }; - default: - return state; - } + switch (action.type) { + case "CONFIRM_DATA": + return { + ...state, + url: action.url, + rowID: action.rowID, + }; + case "REJECT_DATA": + return { + ...state, + url: action.url, + rowID: action.rowID, + values: {}, + }; + default: + return state; + } }; const useDataTable = () => { - const { setReloadDataTable } = useContext(ReloadDataTableContext); - const [state, dispatch] = useReducer(reducer, initialValues); - const [openConfirmDialog, setOpenConfirmDialog] = useState(false); - const [openRejectDialog, setOpenRejectDialog] = useState(false); - const [rowId, setRowId] = useState(null); - const { directionApp } = useDirection(); - const t = useTranslations(); + const {setReloadDataTable} = useContext(ReloadDataTableContext); + const [state, dispatch] = useReducer(reducer, initialValues); + const [openConfirmDialog, setOpenConfirmDialog] = useState(false); + const [openRejectDialog, setOpenRejectDialog] = useState(false); + const [rowId, setRowId] = useState(null); + const {directionApp} = useDirection(); + const t = useTranslations(); - const { token } = useUser(); + const {token} = useUser(); - const confirmData = useCallback(async (url, rowID, values) => { - dispatch({ type: "CONFIRM_DATA", url: url, rowID: rowID, values: values }); - axios - .post(`${url}/${rowID}`, values, { - headers: { authorization: `Bearer ${token}` }, - }) - .then((response) => { - setReloadDataTable(true); - Notifications(directionApp, response, t); - }) - .catch((error) => { - Notifications(directionApp, error.response, t); - }); - }, []); + const confirmData = useCallback(async (url, rowID, values) => { + dispatch({type: "CONFIRM_DATA", url: url, rowID: rowID, values: values}); + axios + .post(`${url}/${rowID}`, values, { + headers: {authorization: `Bearer ${token}`}, + }) + .then((response) => { + setReloadDataTable(true); + Notifications(directionApp, response, t); + }) + .catch((error) => { + Notifications(directionApp, error.response, t); + }); + }, []); - const rejectData = useCallback(async (url, rowID, values) => { - dispatch({ type: "REJECT_DATA", url: url, rowID: rowID, values: values }); - axios - .post(`${url}/${rowID}`, values, { - headers: { authorization: `Bearer ${token}` }, - }) - .then((response) => { - setReloadDataTable(true); - Notifications(directionApp, response, t); - }) - .catch((error) => { - console.log(error); - Notifications(directionApp, error.response, t); - }); - }, []); + const rejectData = useCallback(async (url, rowID, values) => { + dispatch({type: "REJECT_DATA", url: url, rowID: rowID, values: values}); + axios + .post(`${url}/${rowID}`, values, { + headers: {authorization: `Bearer ${token}`}, + }) + .then((response) => { + setReloadDataTable(true); + Notifications(directionApp, response, t); + }) + .catch((error) => { + console.log(error); + Notifications(directionApp, error.response, t); + }); + }, []); - //Confirm Data - const handleOpenConfirmDialog = (row) => { - setRowId(row.getValue("id")); - setOpenConfirmDialog(true); - }; + //Confirm Data + const handleOpenConfirmDialog = (row) => { + setRowId(row.getValue("id")); + setOpenConfirmDialog(true); + }; - const handleCloseConfirmDialog = () => { - setOpenConfirmDialog(false); - }; - //End Confirm Data + const handleCloseConfirmDialog = () => { + setOpenConfirmDialog(false); + }; + //End Confirm Data - // Reject Data - const handleOpenRejectDialog = (row) => { - setRowId(row.getValue("id")); - setOpenRejectDialog(true); - }; + // Reject Data + const handleOpenRejectDialog = (row) => { + setRowId(row.getValue("id")); + setOpenRejectDialog(true); + }; - const handleCloseRejectDialog = () => { - setOpenRejectDialog(false); - }; - // End Reject Data + const handleCloseRejectDialog = () => { + setOpenRejectDialog(false); + }; + // End Reject Data - const contextValue = { - handleOpenConfirmDialog, - handleCloseConfirmDialog, - handleOpenRejectDialog, - handleCloseRejectDialog, - rowId, - openConfirmDialog, - openRejectDialog, - rejectData, - confirmData, - }; - return contextValue; + const contextValue = { + handleOpenConfirmDialog, + handleCloseConfirmDialog, + handleOpenRejectDialog, + handleCloseRejectDialog, + rowId, + openConfirmDialog, + openRejectDialog, + rejectData, + confirmData, + }; + return contextValue; }; export default useDataTable; diff --git a/src/lib/app/hooks/useDirection.jsx b/src/lib/app/hooks/useDirection.jsx index e45cb24..b2e01fe 100644 --- a/src/lib/app/hooks/useDirection.jsx +++ b/src/lib/app/hooks/useDirection.jsx @@ -1,10 +1,10 @@ -import { useContext } from "react"; -import { LanguageContext } from "../contexts/language"; +import {useContext} from "react"; +import {LanguageContext} from "../contexts/language"; const useDirection = () => { - const { directionApp } = useContext(LanguageContext); + const {directionApp} = useContext(LanguageContext); - return { directionApp }; + return {directionApp}; }; export default useDirection; diff --git a/src/lib/app/hooks/useLanguage.jsx b/src/lib/app/hooks/useLanguage.jsx index 66e2ee0..d663835 100644 --- a/src/lib/app/hooks/useLanguage.jsx +++ b/src/lib/app/hooks/useLanguage.jsx @@ -1,28 +1,28 @@ -import { useContext } from "react"; -import { LanguageContext } from "../contexts/language"; +import {useContext} from "react"; +import {LanguageContext} from "../contexts/language"; import useUser from "./useUser"; const useLanguage = () => { - const { isAuth, changeUserLanguage } = useUser(); - const { - languageApp, - setLanguageApp, - languageIsReady, - setLanguageIsReady, - languageList, - } = useContext(LanguageContext); + const {isAuth, changeUserLanguage} = useUser(); + const { + languageApp, + setLanguageApp, + languageIsReady, + setLanguageIsReady, + languageList, + } = useContext(LanguageContext); - const changeLanguage = (lang) => { - if (lang == languageApp) return; + const changeLanguage = (lang) => { + if (lang == languageApp) return; - setLanguageIsReady(false); - setLanguageApp(lang); - if (isAuth) { - changeUserLanguage(lang); - } - }; + setLanguageIsReady(false); + setLanguageApp(lang); + if (isAuth) { + changeUserLanguage(lang); + } + }; - return { languageApp, changeLanguage, languageIsReady, languageList }; + return {languageApp, changeLanguage, languageIsReady, languageList}; }; export default useLanguage; diff --git a/src/lib/app/hooks/useLoading.jsx b/src/lib/app/hooks/useLoading.jsx index d74a87e..a691bd7 100644 --- a/src/lib/app/hooks/useLoading.jsx +++ b/src/lib/app/hooks/useLoading.jsx @@ -1,10 +1,10 @@ -import { useContext } from "react"; -import { LoadingContext } from "../contexts/loading"; +import {useContext} from "react"; +import {LoadingContext} from "../contexts/loading"; const useLoading = () => { - const { setLoadingPage } = useContext(LoadingContext); + const {setLoadingPage} = useContext(LoadingContext); - return { setLoadingPage }; + return {setLoadingPage}; }; export default useLoading; diff --git a/src/lib/app/hooks/useUser.jsx b/src/lib/app/hooks/useUser.jsx index 56bdf7c..b0bbc1a 100644 --- a/src/lib/app/hooks/useUser.jsx +++ b/src/lib/app/hooks/useUser.jsx @@ -1,34 +1,34 @@ -import { useContext } from "react"; -import { UserContext } from "../contexts/user"; +import {useContext} from "react"; +import {UserContext} from "../contexts/user"; const useUser = () => { - const { - isAuth, - userChangedLanguage, - token, - user, - getUser, - clearUser, - changeUser, - changeAuthState, - changeLanguageState, - clearToken, - setToken, - } = useContext(UserContext); + const { + isAuth, + userChangedLanguage, + token, + user, + getUser, + clearUser, + changeUser, + changeAuthState, + changeLanguageState, + clearToken, + setToken, + } = useContext(UserContext); - return { - isAuth, - userChangedLanguage, - token, - user, - getUser, - clearUser, - changeUser, - changeAuthState, - changeLanguageState, - clearToken, - setToken, - }; + return { + isAuth, + userChangedLanguage, + token, + user, + getUser, + clearUser, + changeUser, + changeAuthState, + changeLanguageState, + clearToken, + setToken, + }; }; export default useUser; diff --git a/src/middlewares/RolePermission.jsx b/src/middlewares/RolePermission.jsx index 2cf2baa..9fece10 100644 --- a/src/middlewares/RolePermission.jsx +++ b/src/middlewares/RolePermission.jsx @@ -1,43 +1,43 @@ -import { NextLinkComposed } from "@/core/components/LinkRouting"; +import {NextLinkComposed} from "@/core/components/LinkRouting"; import Message from "@/core/components/Messages"; import useUser from "@/lib/app/hooks/useUser"; -import { Button, Typography } from "@mui/material"; -import { useTranslations } from "next-intl"; +import {Button, Typography} from "@mui/material"; +import {useTranslations} from "next-intl"; -const RolePermission = ({ children, requiredPermissions }) => { - const { user } = useUser(); - const t = useTranslations(); +const RolePermission = ({children, requiredPermissions}) => { + const {user} = useUser(); + const t = useTranslations(); - const hasPermission = requiredPermissions.some((permission) => - user?.role?.includes(permission) - ); - - if (!hasPermission) { - return ( - - {t("Permission.typography_you_dont_have_access")} - - } - actions={ - <> - - - } - /> + const hasPermission = requiredPermissions.some((permission) => + user?.role?.includes(permission) ); - } - return <>{children}; + if (!hasPermission) { + return ( + + {t("Permission.typography_you_dont_have_access")} + + } + actions={ + <> + + + } + /> + ); + } + + return <>{children}; }; export default RolePermission; diff --git a/src/middlewares/WithAuth.jsx b/src/middlewares/WithAuth.jsx index 3fa5f43..b20d8b3 100644 --- a/src/middlewares/WithAuth.jsx +++ b/src/middlewares/WithAuth.jsx @@ -1,42 +1,42 @@ -import { NextLinkComposed } from "@/core/components/LinkRouting"; +import {NextLinkComposed} from "@/core/components/LinkRouting"; import Message from "@/core/components/Messages"; import useUser from "@/lib/app/hooks/useUser"; -import { Button, Typography } from "@mui/material"; -import { useTranslations } from "next-intl"; -import { useRouter } from "next/router"; +import {Button, Typography} from "@mui/material"; +import {useTranslations} from "next-intl"; +import {useRouter} from "next/router"; -const WithAuthMiddleware = ({ children }) => { - const { isAuth } = useUser(); - const t = useTranslations(); - const router = useRouter(); +const WithAuthMiddleware = ({children}) => { + const {isAuth} = useUser(); + const t = useTranslations(); + const router = useRouter(); - if (!isAuth) - return ( - - {t( - "Authorization.typography_your_access_to_this_page_has_expired_Please_login_again" - )} - - } - actions={ - <> - - - } - /> - ); - return <>{children}; + if (!isAuth) + return ( + + {t( + "Authorization.typography_your_access_to_this_page_has_expired_Please_login_again" + )} + + } + actions={ + <> + + + } + /> + ); + return <>{children}; }; export default WithAuthMiddleware; diff --git a/src/middlewares/WithoutAuth.jsx b/src/middlewares/WithoutAuth.jsx index cb8e571..594ffc5 100644 --- a/src/middlewares/WithoutAuth.jsx +++ b/src/middlewares/WithoutAuth.jsx @@ -1,56 +1,56 @@ import Message from "@/core/components/Messages"; import useUser from "@/lib/app/hooks/useUser"; -import { Stack, Typography } from "@mui/material"; -import { useTranslations } from "next-intl"; -import { useSearchParams } from "next/navigation"; -import { useRouter } from "next/router"; -import { useEffect } from "react"; +import {Stack, Typography} from "@mui/material"; +import {useTranslations} from "next-intl"; +import {useSearchParams} from "next/navigation"; +import {useRouter} from "next/router"; +import {useEffect} from "react"; -const WithoutAuthMiddleware = ({ children }) => { - const { isAuth } = useUser(); - const t = useTranslations(); - const router = useRouter(); +const WithoutAuthMiddleware = ({children}) => { + const {isAuth} = useUser(); + const t = useTranslations(); + const router = useRouter(); - // gettin url query - const searchParams = useSearchParams(); - const backUrlDecodedPath = searchParams.get("back_url"); + // gettin url query + const searchParams = useSearchParams(); + const backUrlDecodedPath = searchParams.get("back_url"); - useEffect(() => { - if (!isAuth) return; - const timer = setTimeout(() => { - router.replace( - backUrlDecodedPath - ? decodeURIComponent(backUrlDecodedPath) - : "/dashboard" - ); - }, 2000); + useEffect(() => { + if (!isAuth) return; + const timer = setTimeout(() => { + router.replace( + backUrlDecodedPath + ? decodeURIComponent(backUrlDecodedPath) + : "/dashboard" + ); + }, 2000); - return () => { - clearTimeout(timer); - }; - }, [isAuth]); + return () => { + clearTimeout(timer); + }; + }, [isAuth]); - if (isAuth) - return ( - - - {t( - "Authorization.typography_your_login_is_valid_and_you_do_not_need_to_login_again" - )} - - - {t("Authorization.typography_redirect_to")}{" "} - {backUrlDecodedPath - ? t("Authorization.typography_routing_previuos_page") - : t("Authorization.typography_routing_dashbaord_page")} - - - } - /> - ); - return <>{children}; + if (isAuth) + return ( + + + {t( + "Authorization.typography_your_login_is_valid_and_you_do_not_need_to_login_again" + )} + + + {t("Authorization.typography_redirect_to")}{" "} + {backUrlDecodedPath + ? t("Authorization.typography_routing_previuos_page") + : t("Authorization.typography_routing_dashbaord_page")} + + + } + /> + ); + return <>{children}; }; export default WithoutAuthMiddleware; diff --git a/src/pages/_app.jsx b/src/pages/_app.jsx index be5d828..573bef2 100644 --- a/src/pages/_app.jsx +++ b/src/pages/_app.jsx @@ -1,30 +1,30 @@ import "&/fontiran.scss"; import AppLayout from "@/layouts/AppLayout"; import MuiLayout from "@/layouts/MuiLayout"; -import { LanguageProvider } from "@/lib/app/contexts/language"; -import { LoadingProvider } from "@/lib/app/contexts/loading"; -import { UserProvider } from "@/lib/app/contexts/user"; +import {LanguageProvider} from "@/lib/app/contexts/language"; +import {LoadingProvider} from "@/lib/app/contexts/loading"; +import {UserProvider} from "@/lib/app/contexts/user"; import "moment/locale/fa"; -import { NextIntlProvider } from "next-intl"; +import {NextIntlProvider} from "next-intl"; -const App = ({ Component, pageProps }) => { - return ( - <> - - - - - - - - - - - - - - - ); +const App = ({Component, pageProps}) => { + return ( + <> + + + + + + + + + + + + + + + ); }; export default App; diff --git a/src/pages/_document.jsx b/src/pages/_document.jsx index e763884..f71303f 100644 --- a/src/pages/_document.jsx +++ b/src/pages/_document.jsx @@ -1,67 +1,65 @@ -import { - createEmotionCacheLtr -} from "@/core/utils/createEmotionCache"; +import {createEmotionCacheLtr} from "@/core/utils/createEmotionCache"; import theme from "@/core/utils/theme"; import createEmotionServer from "@emotion/server/create-instance"; -import Document, { Head, Html, Main, NextScript } from "next/document"; +import Document, {Head, Html, Main, NextScript} from "next/document"; export default function MyDocument(props) { - const { emotionStyleTags } = props; + const {emotionStyleTags} = props; - return ( - - - - - - - - {emotionStyleTags} - - -
- - - - ); + return ( + + + + + + + + {emotionStyleTags} + + +
+ + + + ); } MyDocument.getInitialProps = async (ctx) => { - const originalRenderPage = ctx.renderPage; - let cache; - switch (ctx.locale) { - case "fa": - cache = createEmotionCacheLtr(); - break; - } + const originalRenderPage = ctx.renderPage; + let cache; + switch (ctx.locale) { + case "fa": + cache = createEmotionCacheLtr(); + break; + } - const { extractCriticalToChunks } = createEmotionServer(cache); + const {extractCriticalToChunks} = createEmotionServer(cache); - ctx.renderPage = () => - originalRenderPage({ - enhanceApp: (App) => - function EnhanceApp(props) { - return ; - }, - }); + ctx.renderPage = () => + originalRenderPage({ + enhanceApp: (App) => + function EnhanceApp(props) { + return ; + }, + }); - const initialProps = await Document.getInitialProps(ctx); + const initialProps = await Document.getInitialProps(ctx); - const emotionStyles = extractCriticalToChunks(initialProps.html); - const emotionStyleTags = emotionStyles.styles.map((style) => ( -