From e8cd3d1cdaf1d69bfaa8b7393b173d2e651cd9e1 Mon Sep 17 00:00:00 2001 From: Anjali Rana <139739322+ct-anjali-rana@users.noreply.github.com> Date: Tue, 4 Nov 2025 15:58:10 +0530 Subject: [PATCH 1/3] Dev v4.1.0 (#39) * all changes done, eslint & build also checked * all changes done, eslint & build checked, design also checked * pr review free version 4.1.0 --------- Co-authored-by: Dikshit Moradiya --- .env | 2 +- README.md | 2 +- eslint.config.mjs | 14 +- index.html | 59 +- jsconfig.app.json | 6 +- jsconfig.json | 28 +- package.json | 56 +- src/assets/images/user/avatar-10.png | Bin 13737 -> 0 bytes src/assets/images/user/avatar-6.png | Bin 14401 -> 0 bytes src/assets/images/user/avatar-7.png | Bin 14777 -> 0 bytes src/assets/images/user/avatar-8.png | Bin 14098 -> 0 bytes src/assets/images/user/avatar-9.png | Bin 15227 -> 0 bytes .../scss/settings/_bootstrap-variables.scss | 120 +- .../scss/settings/_color-variables.scss | 22 + .../scss/settings/_theme-variables.scss | 7 +- src/assets/scss/style-preset.scss | 45 +- src/assets/scss/style.scss | 6 +- src/assets/scss/themes/_general.scss | 5 + src/assets/scss/themes/_generic.scss | 26 +- src/assets/scss/themes/components/_table.scss | 12 +- .../scss/themes/components/_widget.scss | 134 ++ .../scss/themes/layouts/_pc-common.scss | 40 +- .../scss/themes/layouts/_pc-sidebar.scss | 40 +- src/branding.json | 1 + src/components/MainCard.jsx | 89 +- .../{ => dashboard}/SalesPerformanceCard.jsx | 0 .../cards/{ => dashboard}/SocialStatsCard.jsx | 0 .../{ => dashboard}/StatIndicatorCard.jsx | 1 + src/components/third-party/SimpleBar.jsx | 12 +- src/config.js | 25 - src/global.scss | 30 + src/index.scss | 3 +- src/layout/Auth/index.jsx | 7 + .../Drawer/DrawerContent/NavCollapse.jsx | 169 ++ .../Drawer/DrawerContent/NavGroup.jsx | 93 + .../{Navigation => }/NavItem.jsx | 38 +- .../DrawerContent/Navigation/NavCollapse.jsx | 166 -- .../DrawerContent/Navigation/NavGroup.jsx | 129 -- .../Drawer/DrawerContent/Navigation/index.jsx | 83 - .../Dashboard/Drawer/DrawerContent/index.jsx | 208 +- src/layout/Dashboard/Drawer/index.jsx | 54 +- .../Drawer/vertical/VerticalDrawer.jsx | 57 + .../Drawer/vertical/VerticalDrawerContent.jsx | 15 + src/layout/Dashboard/Drawer/vertical/index.js | 2 + src/layout/Dashboard/Footer.jsx | 2 +- src/layout/Dashboard/index.jsx | 6 +- src/menu-items/charts-maps.jsx | 4 +- src/menu-items/forms.jsx | 2 +- src/menu-items/index.jsx | 6 +- src/menu-items/navigation.jsx | 5 +- src/menu-items/other.jsx | 4 +- src/menu-items/pages.jsx | 2 +- src/menu-items/tables.jsx | 2 +- src/menu-items/ui-components.jsx | 4 +- src/routes/PagesRoutes.jsx | 1 - src/routes/index.jsx | 10 +- src/sections/auth/AuthLogin.jsx | 13 +- src/sections/auth/AuthRegister.jsx | 5 +- src/sections/charts/apex-charts/BarChart.jsx | 114 +- .../charts/apex-charts/BarHorizontalChart.jsx | 62 +- .../apex-charts/BarHorizontalStackedChart.jsx | 96 +- .../charts/apex-charts/BarStackedChart.jsx | 78 +- .../components/basic/badges/LightBadge.jsx | 4 +- .../components/form-element/CheckRadio.jsx | 61 + .../form-element/CustomForms.jsx | 36 +- .../form-element/DataList.jsx | 2 +- .../form-element/FormControlState.jsx | 47 + .../components/form-element/FormControls.jsx | 68 + .../components/form-element/FormGrid.jsx | 95 + .../form-element/HorizontalForm.jsx | 97 + .../components/form-element/InlineForm.jsx | 49 + .../form-element/InputGroup.jsx | 2 +- .../{ => components}/form-element/Picker.jsx | 2 +- .../{ => components}/form-element/Sizing.jsx | 4 +- .../form-element/SupportedElements.jsx | 31 +- .../form-element/Tooltips.jsx | 4 +- .../form-element/ValidationForm.jsx | 2 +- src/sections/dashboard/EarningChart.jsx | 115 +- src/sections/dashboard/RecentUsersCard.jsx | 18 +- src/sections/dashboard/UsersMap.jsx | 71 +- src/sections/dashboard/default/RatingCard.jsx | 8 +- src/sections/form-element/ChecksandRadios.jsx | 52 - .../form-element/FormControlState.jsx | 43 - src/sections/form-element/FormControls.jsx | 62 - src/sections/form-element/FormGrid.jsx | 70 - src/sections/form-element/HorizontalForm.jsx | 82 - src/sections/form-element/InlineForm.jsx | 45 - src/sections/maps/google-maps/BasicMap.jsx | 29 + .../basic-table/BasicTable.jsx | 1 + .../basic-table/ContextualTable.jsx | 1 + .../bootstrap-table/basic-table/DarkTable.jsx | 1 + .../basic-table/HoverTable.jsx | 1 + .../basic-table/StripedTable.jsx | 1 + src/utils/getImageUrl.js | 14 - src/views/SamplePage.jsx | 4 +- src/views/auth/login/Login.jsx | 2 +- src/views/auth/register/Register.jsx | 2 +- src/views/charts/ApexChart.jsx | 24 +- src/views/forms/form-element/FormBasic.jsx | 34 +- src/views/maps/GoogleMap.jsx | 29 +- src/views/navigation/dashboard/Default.jsx | 6 +- vite.config.mjs | 54 +- yarn.lock | 1724 +++++++++-------- 103 files changed, 2800 insertions(+), 2419 deletions(-) delete mode 100644 src/assets/images/user/avatar-10.png delete mode 100644 src/assets/images/user/avatar-6.png delete mode 100644 src/assets/images/user/avatar-7.png delete mode 100644 src/assets/images/user/avatar-8.png delete mode 100644 src/assets/images/user/avatar-9.png create mode 100644 src/assets/scss/themes/components/_widget.scss rename src/components/cards/{ => dashboard}/SalesPerformanceCard.jsx (100%) rename src/components/cards/{ => dashboard}/SocialStatsCard.jsx (100%) rename src/components/cards/{ => dashboard}/StatIndicatorCard.jsx (99%) create mode 100644 src/layout/Dashboard/Drawer/DrawerContent/NavCollapse.jsx create mode 100644 src/layout/Dashboard/Drawer/DrawerContent/NavGroup.jsx rename src/layout/Dashboard/Drawer/DrawerContent/{Navigation => }/NavItem.jsx (52%) delete mode 100644 src/layout/Dashboard/Drawer/DrawerContent/Navigation/NavCollapse.jsx delete mode 100644 src/layout/Dashboard/Drawer/DrawerContent/Navigation/NavGroup.jsx delete mode 100644 src/layout/Dashboard/Drawer/DrawerContent/Navigation/index.jsx create mode 100644 src/layout/Dashboard/Drawer/vertical/VerticalDrawer.jsx create mode 100644 src/layout/Dashboard/Drawer/vertical/VerticalDrawerContent.jsx create mode 100644 src/layout/Dashboard/Drawer/vertical/index.js create mode 100644 src/sections/components/form-element/CheckRadio.jsx rename src/sections/{ => components}/form-element/CustomForms.jsx (62%) rename src/sections/{ => components}/form-element/DataList.jsx (83%) create mode 100644 src/sections/components/form-element/FormControlState.jsx create mode 100644 src/sections/components/form-element/FormControls.jsx create mode 100644 src/sections/components/form-element/FormGrid.jsx create mode 100644 src/sections/components/form-element/HorizontalForm.jsx create mode 100644 src/sections/components/form-element/InlineForm.jsx rename src/sections/{ => components}/form-element/InputGroup.jsx (98%) rename src/sections/{ => components}/form-element/Picker.jsx (81%) rename src/sections/{ => components}/form-element/Sizing.jsx (88%) rename src/sections/{ => components}/form-element/SupportedElements.jsx (51%) rename src/sections/{ => components}/form-element/Tooltips.jsx (98%) rename src/sections/{ => components}/form-element/ValidationForm.jsx (96%) delete mode 100644 src/sections/form-element/ChecksandRadios.jsx delete mode 100644 src/sections/form-element/FormControlState.jsx delete mode 100644 src/sections/form-element/FormControls.jsx delete mode 100644 src/sections/form-element/FormGrid.jsx delete mode 100644 src/sections/form-element/HorizontalForm.jsx delete mode 100644 src/sections/form-element/InlineForm.jsx create mode 100644 src/sections/maps/google-maps/BasicMap.jsx delete mode 100644 src/utils/getImageUrl.js diff --git a/.env b/.env index 1eab438..9b7f89f 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ -VITE_APP_VERSION=v4.0.0 +VITE_APP_VERSION=v4.1.0 GENERATE_SOURCEMAP=false PUBLIC_URL = https://codedthemes.com/demos/admin-templates/datta-able/react/free/ diff --git a/README.md b/README.md index 386ed68..03a3a3f 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,7 @@ Get started with a sweet set of features, including: - Bootstrap 5 - React Bootstrap -- React +- React 19.2 - npm/yarn package installer - Vite diff --git a/eslint.config.mjs b/eslint.config.mjs index 51aacd5..9dad347 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -53,21 +53,11 @@ export default [ 'jsx-a11y/label-has-associated-control': 'off', 'jsx-a11y/no-autofocus': 'off', - 'prettier/prettier': [ - 'warn', - { - bracketSpacing: true, - printWidth: 140, - singleQuote: true, - trailingComma: 'none', - tabWidth: 2, - useTabs: false - } - ] + 'prettier/prettier': 'warn', } }, { ignores: ['node_modules/**'], files: ['src/**/*.{js,jsx}'] } -]; +]; \ No newline at end of file diff --git a/index.html b/index.html index f96eb08..4ff17a1 100644 --- a/index.html +++ b/index.html @@ -1,34 +1,32 @@ - - - Welcome | Datta Able Free React Hooks + Admin Template - - - - - - - - - Datta Able React Admin Dashboard + + + Welcome | Datta Able Free React Hooks + Admin Template - - - - - - - -
- + + + + + + + + Datta Able React Admin Dashboard + + + + + + + + + +
+ - - - + + + + \ No newline at end of file diff --git a/jsconfig.app.json b/jsconfig.app.json index 316cf37..96e48b3 100644 --- a/jsconfig.app.json +++ b/jsconfig.app.json @@ -5,5 +5,7 @@ "moduleResolution": "Node", "allowSyntheticDefaultImports": true }, - "include": ["vite.config.mjs"] -} + "include": [ + "vite.config.mjs" + ] +} \ No newline at end of file diff --git a/jsconfig.json b/jsconfig.json index 3232afa..92573b5 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -2,7 +2,11 @@ "compilerOptions": { "target": "ESNext", "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], + "lib": [ + "ES2020", + "DOM", + "DOM.Iterable" + ], "allowJs": false, "skipLibCheck": true, "esModuleInterop": false, @@ -11,7 +15,6 @@ "module": "ESNext", "resolveJsonModule": true, "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", - /* Bundler mode */ "moduleResolution": "bundler", "allowImportingTsExtensions": true, @@ -20,7 +23,6 @@ "noEmit": true, "jsx": "react-jsx", "baseUrl": "src", - /* Linting */ "strict": true, "noUnusedLocals": true, @@ -28,7 +30,19 @@ "noFallthroughCasesInSwitch": true, "noUncheckedSideEffectImports": true }, - "exclude": ["node_modules", "vite.config.mjs"], // Exclude vite.config.mjs - "include": ["src", "**/*.js", "**/*.jsx", "src/**/*"], - "references": [{ "path": "./jsconfig.app.json" }] -} + "exclude": [ + "node_modules", + "vite.config.mjs" + ], // Exclude vite.config.mjs + "include": [ + "src", + "**/*.js", + "**/*.jsx", + "src/**/*" + ], + "references": [ + { + "path": "./jsconfig.app.json" + } + ] +} \ No newline at end of file diff --git a/package.json b/package.json index f023bda..23cfea7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,8 @@ { "name": "datta-able-free-react-admin-templete", - "version": "4.0.0", + "version": "4.1.0", "private": true, + "type": "module", "scripts": { "start": "vite", "build": "vite build", @@ -11,40 +12,39 @@ "preview": "vite preview" }, "dependencies": { - "@fontsource/open-sans": "5.2.5", - "@react-google-maps/api": "2.20.5", - "apexcharts": "4.5.0", - "axios": "1.7.9", - "bootstrap": "5.3.3", - "chance": "1.1.12", + "@fontsource/open-sans": "5.2.7", + "@react-google-maps/api": "2.20.7", + "apexcharts": "5.3.5", + "bootstrap": "5.3.8", + "chance": "1.1.13", "formik": "2.4.6", - "jsvectormap": "1.6.0", - "react": "18.2.0", - "react-apexcharts": "1.7.0", - "react-bootstrap": "2.10.6", + "jsvectormap": "1.7.0", + "react": "19.2.0", + "react-apexcharts": "1.8.0", + "react-bootstrap": "2.10.10", "react-device-detect": "2.2.3", - "react-dom": "18.2.0", - "react-hook-form": "7.54.2", - "react-router-dom": "7.0.2", - "simplebar-react": "3.3.0", - "swr": "2.3.2", - "vite": "6.0.2", + "react-dom": "19.2.0", + "react-hook-form": "7.65.0", + "react-router-dom": "7.9.5", + "simplebar-react": "3.3.2", + "swr": "2.3.6", + "vite": "7.1.12", "vite-jsconfig-paths": "2.0.1", - "yup": "1.6.1" + "yup": "1.7.1" }, "devDependencies": { - "@eslint/compat": "1.2.3", + "@eslint/compat": "1.4.1", "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.15.0", - "@vitejs/plugin-react": "4.3.4", - "eslint": "9.15.0", - "eslint-config-prettier": "9.1.0", + "@eslint/js": "9.38.0", + "@vitejs/plugin-react": "5.1.0", + "eslint": "9.38.0", + "eslint-config-prettier": "10.1.8", "eslint-plugin-jsx-a11y": "6.10.2", - "eslint-plugin-prettier": "5.2.1", + "eslint-plugin-prettier": "5.5.4", "eslint-plugin-react": "7.37.5", - "eslint-plugin-react-hooks": "5.0.0", - "prettier": "3.4.1", - "sass": "1.77.6" + "eslint-plugin-react-hooks": "7.0.1", + "prettier": "3.6.2", + "sass": "1.93.2" }, - "packageManager": "yarn@4.9.1" + "packageManager": "yarn@4.10.3" } diff --git a/src/assets/images/user/avatar-10.png b/src/assets/images/user/avatar-10.png deleted file mode 100644 index 7f8925f3e547899ef66a03c966e009f17ddc5d8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13737 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 TE)GOH00000NkvXXu0mjfv0;~K diff --git a/src/assets/images/user/avatar-6.png b/src/assets/images/user/avatar-6.png deleted file mode 100644 index b099c2cafef4094f7b0f4c38300f34a9478de1e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14401 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 Q`~Uy|07*qoM6N<$g2x)rKmY&$ diff --git a/src/assets/images/user/avatar-9.png b/src/assets/images/user/avatar-9.png deleted file mode 100644 index a8950393144a58d48f9a39114159ec1a07a3c3b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15227 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', '%3e'), ('#', '%23'), ('(', '%28'), (')', '%29')); +$escaped-characters: ( + ('<', '%3c'), + ('>', '%3e'), + ('#', '%23'), + ('(', '%28'), + (')', '%29') +); // Options // @@ -243,7 +249,7 @@ $spacers: ( 2: $spacer * 0.5, 3: $spacer, 4: $spacer * 1.5, - 5: $spacer * 3 + 5: $spacer * 3, ); // scss-docs-end spacer-variables-maps @@ -255,7 +261,7 @@ $spacers: ( $position-values: ( 0: 0, 50: 50%, - 100: 100% + 100: 100%, ); // scss-docs-end position-map @@ -265,6 +271,7 @@ $position-values: ( body { font-feature-settings: 'salt'; } + $body-bg: #f4f7fa; // change $body-color: #888; // change $body-text-align: null; @@ -300,7 +307,7 @@ $grid-breakpoints: ( md: 768px, lg: 992px, xl: 1200px, - xxl: 1400px + xxl: 1400px, ); // scss-docs-end grid-breakpoints @@ -317,7 +324,7 @@ $container-max-widths: ( md: 720px, lg: 960px, xl: 1140px, - xxl: 1320px + xxl: 1320px, ); // scss-docs-end container-max-widths @@ -347,7 +354,7 @@ $border-widths: ( 2: 2px, 3: 3px, 4: 4px, - 5: 5px + 5: 5px, ); $border-style: solid; @@ -390,7 +397,7 @@ $aspect-ratios: ( '1x1': 100%, '4x3': calc(3 / 4 * 100%), '16x9': calc(9 / 16 * 100%), - '21x9': calc(9 / 21 * 100%) + '21x9': calc(9 / 21 * 100%), ); // scss-docs-end aspect-ratios // stylelint-enable function-disallowed-list @@ -436,7 +443,7 @@ $font-sizes: ( 3: $h3-font-size, 4: $h4-font-size, 5: $h5-font-size, - 6: $h6-font-size + 6: $h6-font-size, ); // scss-docs-end font-sizes @@ -455,7 +462,7 @@ $display-font-sizes: ( 3: 4rem, 4: 3.5rem, 5: 3rem, - 6: 2.5rem + 6: 2.5rem, ); $display-font-weight: 300; @@ -549,7 +556,7 @@ $table-variants: ( 'warning': shift-color($warning, $table-bg-scale), 'danger': shift-color($danger, $table-bg-scale), 'light': $light, - 'dark': $dark + 'dark': $dark, ); // scss-docs-end table-variables @@ -601,8 +608,7 @@ $btn-font-size-lg: $input-btn-font-size-lg; $btn-border-width: $input-btn-border-width; $btn-font-weight: 500; -$btn-box-shadow: - inset 0 1px 0 rgba($white, 0.15), +$btn-box-shadow: inset 0 1px 0 rgba($white, 0.15), 0 1px 1px rgba($black, 0.075); $btn-focus-width: $input-btn-focus-width; $btn-focus-box-shadow: $input-btn-focus-box-shadow; @@ -619,8 +625,7 @@ $btn-border-radius: 4px; $btn-border-radius-sm: 2px; $btn-border-radius-lg: 6px; -$btn-transition: - color 0.15s ease-in-out, +$btn-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; @@ -693,12 +698,14 @@ $input-height-inner: add($input-line-height * 1em, calc($input-padding-y * 2)); $input-height-inner-half: add($input-line-height * 0.5em, $input-padding-y); $input-height-inner-quarter: add($input-line-height * 0.25em, calc($input-padding-y / 2)); -$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)); -$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)); -$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)); +$input-height: add($input-line-height * 1em, + add($input-padding-y * 2, $input-height-border, false)); +$input-height-sm: add($input-line-height * 1em, + add($input-padding-y-sm * 2, $input-height-border, false)); +$input-height-lg: add($input-line-height * 1em, + add($input-padding-y-lg * 2, $input-height-border, false)); -$input-transition: - border-color 0.15s ease-in-out, +$input-transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; $form-color-width: 3rem; @@ -710,8 +717,7 @@ $form-check-padding-start: $form-check-input-width + 0.5em; $form-check-margin-bottom: 0.125rem; $form-check-label-color: null; $form-check-label-cursor: null; -$form-check-transition: - background-color 0.15s ease-in-out, +$form-check-transition: background-color 0.15s ease-in-out, background-position 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; @@ -777,10 +783,8 @@ $form-select-bg-size: 16px 12px; // In pixels because image dimensions $form-select-indicator-color: $gray-800; $form-select-indicator: url("data:image/svg+xml,"); -$form-select-feedback-icon-padding-end: add( - 1em * 0.75, - (2 * $form-select-padding-y * 0.75) + $form-select-padding-x + $form-select-indicator-padding -); +$form-select-feedback-icon-padding-end: add(1em * 0.75, + (2 * $form-select-padding-y * 0.75) + $form-select-padding-x + $form-select-indicator-padding); $form-select-feedback-icon-position: center right ($form-select-padding-x + $form-select-indicator-padding); $form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half; @@ -820,14 +824,12 @@ $form-range-thumb-bg: $component-active-bg; $form-range-thumb-border: 0; $form-range-thumb-border-radius: 1rem; $form-range-thumb-box-shadow: 0 0.1rem 0.25rem rgba($black, 0.1); -$form-range-thumb-focus-box-shadow: - 0 0 0 1px $body-bg, +$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow; $form-range-thumb-focus-box-shadow-width: $input-focus-width; // For focus box shadow issue in Edge $form-range-thumb-active-bg: rgba(#{var(--bs-primary-rgb)}, 0.8); $form-range-thumb-disabled-bg: $gray-500; -$form-range-thumb-transition: - background-color 0.15s ease-in-out, +$form-range-thumb-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; @@ -860,14 +862,12 @@ $form-feedback-icon-invalid: url("data:image/svg+xml,") + ); + } + + &[type='radio'] { + background-image: escape-svg( + url("data:image/svg+xml,") + ); + } + } + } + + &.input-primary, + &.input-light-primary { &:focus { &[type='checkbox'], &[type='radio'] { @@ -107,7 +136,7 @@ $i: 1; } &.form-switch { - .form-check-input { + .form-check-input.input-light-primary { &:checked { background-image: escape-svg( url("data:image/svg+xml,") @@ -194,7 +223,7 @@ $i: 1; } $drp-icon: ( - 'preset-1': '\ea61' + 'preset-1': '\ea61', ); @each $key, $value in $drp-icon { [data-pc-drp-menu-icon='#{$key}'] { @@ -203,7 +232,7 @@ $drp-icon: ( } $drp-link-icon: ( - 'preset-1': '' + 'preset-1': '', ); @each $key, $value in $drp-link-icon { [data-pc-drp-menu-link-icon='#{$key}'] { diff --git a/src/assets/scss/style.scss b/src/assets/scss/style.scss index 4e04bbb..e204345 100644 --- a/src/assets/scss/style.scss +++ b/src/assets/scss/style.scss @@ -24,6 +24,9 @@ File: style.css ========================================================================= =================================================================================== */ +@use 'sass:map'; +@use 'sass:color'; +@use 'sass:string'; // main framework @import 'bootstrap/scss/functions'; @@ -89,6 +92,7 @@ File: style.css @import 'themes/components/progress'; @import 'themes/components/table'; @import 'themes/components/form'; +@import 'themes/components/widget'; // pages -@import 'themes/pages/authentication'; +@import 'themes/pages/authentication'; \ No newline at end of file diff --git a/src/assets/scss/themes/_general.scss b/src/assets/scss/themes/_general.scss index 9a14845..a3d295e 100644 --- a/src/assets/scss/themes/_general.scss +++ b/src/assets/scss/themes/_general.scss @@ -85,6 +85,11 @@ strong { border-radius: 50%; } +.apexcharts-tooltip-series-group.apexcharts-active, +.apexcharts-tooltip-series-group:last-child { + padding-bottom: 0 !important; +} + /* ================================ Blockquote Start ===================== */ @media (min-width: 1600px) { diff --git a/src/assets/scss/themes/_generic.scss b/src/assets/scss/themes/_generic.scss index 2930eb1..3233505 100644 --- a/src/assets/scss/themes/_generic.scss +++ b/src/assets/scss/themes/_generic.scss @@ -2,6 +2,8 @@ 1. Generic-class css start ========================== **/ /*====== Padding , Margin css starts ======*/ +@use 'sass:map'; + $i: 0; @while $i<=50 { .p { @@ -153,7 +155,7 @@ $social-colors: ( 'behance': #0057ff, 'dropbox': #3380ff, 'linkedin': #0077b5, - 'amazon': #000000 + 'amazon': #000000, ); @each $color, $value in $social-colors { .bg-light-#{$color} { @@ -292,7 +294,7 @@ $more-colors: ( 600: $blue-600, 700: $blue-700, 800: $blue-800, - 900: $blue-900 + 900: $blue-900, ), 'purple': ( 100: $purple-100, @@ -303,7 +305,7 @@ $more-colors: ( 600: $purple-600, 700: $purple-700, 800: $purple-800, - 900: $purple-900 + 900: $purple-900, ), 'pink': ( 100: $pink-100, @@ -314,7 +316,7 @@ $more-colors: ( 600: $pink-600, 700: $pink-700, 800: $pink-800, - 900: $pink-900 + 900: $pink-900, ), 'red': ( 100: $red-100, @@ -325,7 +327,7 @@ $more-colors: ( 600: $red-600, 700: $red-700, 800: $red-800, - 900: $red-900 + 900: $red-900, ), 'orange': ( 100: $orange-100, @@ -336,7 +338,7 @@ $more-colors: ( 600: $orange-600, 700: $orange-700, 800: $orange-800, - 900: $orange-900 + 900: $orange-900, ), 'yellow': ( 100: $yellow-100, @@ -347,7 +349,7 @@ $more-colors: ( 600: $yellow-600, 700: $yellow-700, 800: $yellow-800, - 900: $yellow-900 + 900: $yellow-900, ), 'green': ( 100: $green-100, @@ -358,7 +360,7 @@ $more-colors: ( 600: $green-600, 700: $green-700, 800: $green-800, - 900: $green-900 + 900: $green-900, ), 'cyan': ( 100: $cyan-100, @@ -369,7 +371,7 @@ $more-colors: ( 600: $cyan-600, 700: $cyan-700, 800: $cyan-800, - 900: $cyan-900 + 900: $cyan-900, ), 'gray': ( 100: $gray-100, @@ -380,8 +382,8 @@ $more-colors: ( 600: $gray-600, 700: $gray-700, 800: $gray-800, - 900: $gray-900 - ) + 900: $gray-900, + ), ); @each $name, $value in $more-colors { $i: 100; @@ -399,7 +401,7 @@ $more-colors: ( @each $name, $value in $more-colors { $i: 100; @while $i<=900 { - $temp: map-get($value, $i); + $temp: map.get($value, $i); --bs-#{$name}-#{$i}: #{$temp}; $i: $i + 100; } diff --git a/src/assets/scss/themes/components/_table.scss b/src/assets/scss/themes/components/_table.scss index 59f137d..7d7939f 100644 --- a/src/assets/scss/themes/components/_table.scss +++ b/src/assets/scss/themes/components/_table.scss @@ -1,6 +1,7 @@ // ============================ // 17. Table css start // ============================ +@use 'sass:color'; .table { &.table-align-center { @@ -11,9 +12,18 @@ } thead th { padding: 0.9rem 0.75rem; + border-bottom: 1px solid #f1f1f1; + font-size: 13px; + color: #262626; + background: rgba(244, 247, 250, 0.5); + text-transform: uppercase; } td, th { + border-top: 1px solid $border-color; + border-bottom: none; + white-space: nowrap; + padding: 0.7rem 0.75rem; vertical-align: middle; } &.table-borderless { @@ -25,7 +35,7 @@ } .table-hover tbody tr:hover { - background-color: transparentize($primary, 0.97); + background-color: #{color.adjust($primary, $alpha: -0.97)}; } // ============================ diff --git a/src/assets/scss/themes/components/_widget.scss b/src/assets/scss/themes/components/_widget.scss new file mode 100644 index 0000000..bc7370e --- /dev/null +++ b/src/assets/scss/themes/components/_widget.scss @@ -0,0 +1,134 @@ +// ============================ +// 10. Widget css start +// ============================ + +.Recent-Users { + .table { + tr { + &:first-child { + td { + border-top: 0; + } + } + } + + td { + vertical-align: middle; + } + + .label { + border-radius: 15px; + box-shadow: 0 5px 10px 0 rgba(0, 0, 0, 0.2); + } + } +} + +.card-social { + &:hover { + i { + font-size: 40px; + transition: all 0.3s ease-in-out; + } + } + + .progress { + height: 6px; + } + + .card-active > div + div { + border-left: 1px solid var(--bs-border-color); + } +} + +.card { + .card-body { + code { + background-color: #eee; + margin: 5px; + display: inline-block; + border-radius: 3px; + padding: 0 3px; + } + } +} + +/* ================ new css =================== */ + +.table-card .card-body, +.table-body.card-body { + padding-left: 0; + padding-right: 0; + padding-top: 0; + + .table { + > thead > tr > th { + border-top: 0; + } + + tr { + td, + th { + &:first-child { + padding-left: 25px; + + @include media-breakpoint-down(sm) { + padding-left: 20px; + } + } + + &:last-child { + padding-right: 25px; + + @include media-breakpoint-down(sm) { + padding-right: 20px; + } + } + } + } + + &.without-header { + tr { + &:first-child { + td { + border-top: none; + } + } + } + } + } +} + +.table-card { + .row-table { + display: flex; + align-items: center; + table-layout: fixed; + height: 100%; + width: 100%; + margin: 0; + + svg { + margin: 0 20px; + } + + i { + padding: 50px 20px; + } + + > [class*='col-'] { + display: table-cell; + float: none; + table-layout: fixed; + vertical-align: middle; + + .row { + display: flex; + align-items: center; + } + } + } +} + +// ============================ +// 10. Widget css end +// ============================ diff --git a/src/assets/scss/themes/layouts/_pc-common.scss b/src/assets/scss/themes/layouts/_pc-common.scss index 5a83764..2632f6e 100644 --- a/src/assets/scss/themes/layouts/_pc-common.scss +++ b/src/assets/scss/themes/layouts/_pc-common.scss @@ -13,6 +13,7 @@ padding-left: 40px; padding-right: 40px; padding-top: 20px; + @include media-breakpoint-down(xl) { &.container { max-width: 100%; @@ -20,11 +21,11 @@ } } - .page-header + .row { + .page-header+.row { padding-top: 24px; } - .page-header + .pc-content { + .page-header+.pc-content { padding-top: calc(30px + 55px); } } @@ -69,7 +70,7 @@ color: $primary; } - + .breadcrumb-item::before { + +.breadcrumb-item::before { position: relative; top: 2px; } @@ -92,8 +93,8 @@ margin-left: 0px; margin-right: 0px; - .page-header + .row, - .page-header + .pc-content, + .page-header+.row, + .page-header+.pc-content, .pc-content { padding-top: 20px; padding-left: 15px; @@ -115,6 +116,7 @@ padding-top: 0; padding-bottom: 5px; } + .pc-container { .pc-content { padding: 15px; @@ -125,8 +127,8 @@ padding-right: 0; } - .page-header + .row, - .page-header + .pc-content { + .page-header+.row, + .page-header+.pc-content { padding-left: 0; padding-right: 0; } @@ -156,29 +158,7 @@ position: relative; } -.simplebar-scrollbar { - position: absolute; - left: 0; - right: 0; - min-height: 10px; - - &:before { - position: absolute; - content: ''; - background: darken($body-bg, 25%); - border-radius: 7px; - left: 2px; - right: 2px; - opacity: 0; - transition: opacity 0.2s linear; - } - - &.simplebar-visible:before { - opacity: 0.5; - transition: opacity 0s linear; - } -} // ============================ // 6. Common layout css end -// ============================ +// ============================ \ No newline at end of file diff --git a/src/assets/scss/themes/layouts/_pc-sidebar.scss b/src/assets/scss/themes/layouts/_pc-sidebar.scss index 4a94091..1feb987 100644 --- a/src/assets/scss/themes/layouts/_pc-sidebar.scss +++ b/src/assets/scss/themes/layouts/_pc-sidebar.scss @@ -16,6 +16,7 @@ svg { stroke: #fff; } + i { color: #fff; } @@ -105,7 +106,7 @@ vertical-align: text-top; } - > svg { + >svg { width: 18px; height: 18px; display: inline-block; @@ -130,10 +131,10 @@ } } - .pc-navbar > .pc-item:not(.pc-caption) { + .pc-navbar>.pc-item:not(.pc-caption) { position: relative; - > .pc-link { + >.pc-link { &::after { content: ''; position: absolute; @@ -163,7 +164,7 @@ background: var(--pc-sidebar-active-color); } - > .pc-link { + >.pc-link { font-weight: 500; color: var(--pc-sidebar-main-active-color); @@ -175,8 +176,9 @@ .pc-submenu { padding: 15px 0; + .pc-item { - > .pc-link { + >.pc-link { &:after { content: ''; border-radius: 50%; @@ -192,7 +194,7 @@ &.pc-trigger, &.active { - > .pc-link { + >.pc-link { font-weight: 500; color: var(--pc-sidebar-active-color); @@ -206,7 +208,7 @@ &.active, &:focus, &:hover { - > .pc-link { + >.pc-link { &:after { opacity: 1; transform: scale(1.2); @@ -274,7 +276,7 @@ display: inline-block; transition: all 0.2s ease-in-out; - > svg { + >svg { width: 14px; height: 14px; } @@ -320,18 +322,18 @@ .pc-hasmenu { &:not(.pc-trigger) { - > .pc-submenu { + >.pc-submenu { display: none; } } &.pc-trigger { - > .pc-submenu { + >.pc-submenu { display: block; } - > .pc-link { - > .pc-arrow { + >.pc-link { + >.pc-arrow { transform: rotate(90deg); } } @@ -354,12 +356,12 @@ .pc-sidebar { transition: width 0.2s ease; - ~ .pc-header { + ~.pc-header { transition: left 0.2s ease; } - ~ .pc-footer, - ~ .pc-container { + ~.pc-footer, + ~.pc-container { transition: margin-left 0.2s ease; } @@ -367,12 +369,12 @@ width: 0; --pc-sidebar-border: none; - ~ .pc-header { + ~.pc-header { left: 0; } - ~ .pc-footer, - ~ .pc-container { + ~.pc-footer, + ~.pc-container { margin-left: 0px; } } @@ -408,4 +410,4 @@ // ============================ // 3. Sidebar css end -// ============================ +// ============================ \ No newline at end of file diff --git a/src/branding.json b/src/branding.json index d139f9c..e5be606 100644 --- a/src/branding.json +++ b/src/branding.json @@ -3,6 +3,7 @@ "title": "React Admin Dashboard Template", "Docs": "https://codedthemes.gitbook.io/datta", "changeLog": "https://codedthemes.gitbook.io/datta/changelog", + "buyNow": "https://codedthemes.com/item/datta-able-react-admin-template/", "company": { "name": "CodedThemes", "url": "https://codedthemes.com", diff --git a/src/components/MainCard.jsx b/src/components/MainCard.jsx index 766572a..7945ba4 100644 --- a/src/components/MainCard.jsx +++ b/src/components/MainCard.jsx @@ -1,4 +1,4 @@ -import { forwardRef } from 'react'; +import PropTypes from 'prop-types'; // react-bootstrap import Card from 'react-bootstrap/Card'; @@ -6,46 +6,51 @@ import Stack from 'react-bootstrap/Stack'; // ==============================|| MAIN CARD ||============================== // -const MainCard = forwardRef( - ( - { - children, - subheader, - footer, - secondary, - content = true, - codeString, - title, - className, - headerClassName, - bodyClassName, - footerClassName - }, - ref - ) => { - return ( - - {/* Header Section */} - {title && ( - - - - {typeof title === 'string' ?
{title}
: title} - {subheader && {subheader}} -
- {secondary} +export default function MainCard({ + children, + subheader, + footer, + secondary, + content = true, + title, + className, + headerClassName, + bodyClassName, + footerClassName, + ref +}) { + return ( + + {/* Header Section */} + {title && ( + + + + {typeof title === 'string' ?
{title}
: title} + {subheader && {subheader}}
-
- )} - {/* Content */} - {content && {children}} - {!content && children} - {/* Footer Section for Code Highlighting */} - {codeString &&
} - {footer && {footer}} -
- ); - } -); + {secondary} +
+
+ )} + {/* Content */} + {content && {children}} + {!content && children} + {footer && {footer}} +
+ ); +} -export default MainCard; +MainCard.propTypes = { + children: PropTypes.node, + subheader: PropTypes.oneOfType([PropTypes.string, PropTypes.node]), + footer: PropTypes.node, + secondary: PropTypes.node, + content: PropTypes.bool, + title: PropTypes.oneOfType([PropTypes.string, PropTypes.node]), + className: PropTypes.string, + headerClassName: PropTypes.string, + bodyClassName: PropTypes.string, + footerClassName: PropTypes.string, + ref: PropTypes.object +}; diff --git a/src/components/cards/SalesPerformanceCard.jsx b/src/components/cards/dashboard/SalesPerformanceCard.jsx similarity index 100% rename from src/components/cards/SalesPerformanceCard.jsx rename to src/components/cards/dashboard/SalesPerformanceCard.jsx diff --git a/src/components/cards/SocialStatsCard.jsx b/src/components/cards/dashboard/SocialStatsCard.jsx similarity index 100% rename from src/components/cards/SocialStatsCard.jsx rename to src/components/cards/dashboard/SocialStatsCard.jsx diff --git a/src/components/cards/StatIndicatorCard.jsx b/src/components/cards/dashboard/StatIndicatorCard.jsx similarity index 99% rename from src/components/cards/StatIndicatorCard.jsx rename to src/components/cards/dashboard/StatIndicatorCard.jsx index 7586a17..38c126c 100644 --- a/src/components/cards/StatIndicatorCard.jsx +++ b/src/components/cards/dashboard/StatIndicatorCard.jsx @@ -1,4 +1,5 @@ import PropTypes from 'prop-types'; + // react-bootstrap import Stack from 'react-bootstrap/Stack'; diff --git a/src/components/third-party/SimpleBar.jsx b/src/components/third-party/SimpleBar.jsx index 749e7f2..5c9d86e 100644 --- a/src/components/third-party/SimpleBar.jsx +++ b/src/components/third-party/SimpleBar.jsx @@ -6,10 +6,10 @@ import SimpleBar from 'simplebar-react'; // ==============================|| SIMPLE BAR SCROLL ||============================== // -export default function SimpleBarScroll({ children, className, style, ...other }) { +export default function SimpleBarScroll({ children, className, browserStyle, style, ...other }) { return ( <> - + {children} @@ -24,4 +24,10 @@ export default function SimpleBarScroll({ children, className, style, ...other } ); } -SimpleBarScroll.propTypes = { children: PropTypes.node, className: PropTypes.string, style: PropTypes.any, other: PropTypes.any }; +SimpleBarScroll.propTypes = { + children: PropTypes.node, + className: PropTypes.string, + browserStyle: PropTypes.any, + style: PropTypes.any, + other: PropTypes.any +}; diff --git a/src/config.js b/src/config.js index 7c64649..cc79fe1 100644 --- a/src/config.js +++ b/src/config.js @@ -3,30 +3,5 @@ export const APP_DEFAULT_PATH = '/dashboard/default'; export const DRAWER_WIDTH = 260; -export let MenuOrientation; - -(function (MenuOrientation) { - MenuOrientation['VERTICAL'] = 'vertical'; -})(MenuOrientation || (MenuOrientation = {})); - -// ==============================|| THEME CONFIG ||============================== // - -const config = { - fontFamily: `'Public Sans', sans-serif`, - i18n: 'en', - menuOrientation: MenuOrientation.VERTICAL, - container: false, - presetColor: 'default', - caption: true, - sidebarTheme: false, - customColor: 'preset-1', - headerColor: '', - navbarColor: '', - logoColor: '', - navbarCaptionColor: '', - navbarImg: '', - menuIcon: 'preset-1', - menuLinkIcon: 'preset-1' -}; export default config; diff --git a/src/global.scss b/src/global.scss index 5e11c05..4d8eb57 100644 --- a/src/global.scss +++ b/src/global.scss @@ -1,10 +1,14 @@ +@use 'sass:color'; + .bg-light[colspan] { @include media-breakpoint-up(sm) { padding-left: 40px; } + @include media-breakpoint-up(md) { padding-left: 48px; } + @include media-breakpoint-up(lg) { padding-left: 96px; } @@ -20,3 +24,29 @@ top: 16px; height: 0; } + +.apexcharts-tooltip-text-goals-value, +.apexcharts-tooltip-text-y-value, +.apexcharts-tooltip-text-z-value { + margin-left: 0 !important; +} + +.apexcharts-tooltip-series-group.apexcharts-active .apexcharts-tooltip-marker { + margin-bottom: 3px; +} + +.apexcharts-menu-item:hover { + background: #eee; +} + +.apexcharts-canvas .apexcharts-svg { + background: transparent !important; +} + +[data-pc-theme='dark'] { + + .apexcharts-menu-item:hover { + color: var(--bs-black); + } + +} \ No newline at end of file diff --git a/src/index.scss b/src/index.scss index 6ba14ac..038b3c1 100644 --- a/src/index.scss +++ b/src/index.scss @@ -2,8 +2,9 @@ @import './assets/fonts/tabler-icons.min.css'; @import 'simplebar-react/dist/simplebar.min.css'; +@import 'jsvectormap/dist/jsvectormap.css'; @import './assets/scss/themes/plugins/scrollbar'; @import 'assets/scss/style.scss'; @import 'assets/scss/style-preset.scss'; -@import './global.scss'; +@import './global.scss'; \ No newline at end of file diff --git a/src/layout/Auth/index.jsx b/src/layout/Auth/index.jsx index 089cf11..4308080 100644 --- a/src/layout/Auth/index.jsx +++ b/src/layout/Auth/index.jsx @@ -3,6 +3,13 @@ import { Outlet } from 'react-router-dom'; // project-imports import Loader from 'components/Loader'; +/** + * AuthLayout is a top-level component that wraps around the component + * from react-router-dom. It is used to set the page type of the application + * and renders the Configuration component (which is used to set the page title). + * + * @returns {React.ReactElement} The AuthLayout component. + */ // ==============================|| LAYOUT - AUTH ||============================== // diff --git a/src/layout/Dashboard/Drawer/DrawerContent/NavCollapse.jsx b/src/layout/Dashboard/Drawer/DrawerContent/NavCollapse.jsx new file mode 100644 index 0000000..b0aad78 --- /dev/null +++ b/src/layout/Dashboard/Drawer/DrawerContent/NavCollapse.jsx @@ -0,0 +1,169 @@ +import PropTypes from 'prop-types'; +import { useCallback, useEffect, useMemo, useState } from 'react'; +import { Link, matchPath, useLocation, useNavigate } from 'react-router-dom'; + +// react-bootstrap +import Badge from 'react-bootstrap/Badge'; +import Collapse from 'react-bootstrap/Collapse'; +import ListGroup from 'react-bootstrap/ListGroup'; + +// project-imports +import NavItem from './NavItem'; +import { useGetMenuMaster } from 'api/menu'; + +// ==============================|| NAVIGATION - COLLAPSE ||============================== // + +export default function NavCollapse({ menu, level, parentId, setSelectedItems, selectedItems, setSelectedLevel, selectedLevel }) { + const { menuMaster } = useGetMenuMaster(); + const navigation = useNavigate(); + const drawerOpen = menuMaster?.isDashboardDrawerOpened; + + const [open, setOpen] = useState(false); + const [selected, setSelected] = useState(null); + const { pathname } = useLocation(); + + const isMenuActive = useCallback((menu, currentPath) => { + if (menu.type === 'item') { + return menu.url === currentPath; + } + if (menu.type === 'collapse' && Array.isArray(menu.children)) { + return menu.children.some((child) => isMenuActive(child, currentPath)); + } + return false; + }, []); + + const handleClick = (isRedirect) => { + setSelectedLevel(level); + const willOpen = !open; + setOpen(willOpen); + setSelected(willOpen ? menu.id : null); + setSelectedItems(willOpen ? menu : undefined); + if (menu.url && isRedirect) navigation(menu.url); + }; + + useEffect(() => { + if (selected === selectedItems?.id) { + if (level === 1) { + setOpen(true); + } + } else { + if (level === selectedLevel) { + setOpen(false); + + if (drawerOpen) { + setSelected(null); + } + } + } + }, [selectedItems, level, selected, drawerOpen, selectedLevel]); + + useEffect(() => { + if (pathname === menu.url) { + setSelected(menu.id); + } + }, [pathname, menu.id, menu.url]); + + const checkOpenForParent = useCallback( + (child, id) => { + child.forEach((item) => { + if (item.url === pathname) { + setOpen(true); + setSelected(id); + } + }); + }, + [pathname] + ); + + // menu collapse for sub-levels + useEffect(() => { + setOpen(false); + if (!menu.children) return; + + for (const item of menu.children) { + if (item.children?.length) { + checkOpenForParent(item.children, menu.id); + } + + if (item.link && matchPath({ path: item?.link, end: false }, pathname)) { + setSelected(menu.id); + setOpen(true); + break; + } + + if (item.url === pathname) { + setSelected(menu.id); + setOpen(true); + break; + } + } + }, [pathname, menu.id, menu.children, checkOpenForParent]); + + useEffect(() => { + if (menu.url === pathname) { + setSelected(menu.id); + setOpen(true); + } + }, [pathname, menu.url, menu.id]); + const navCollapse = useMemo( + () => + menu.children?.map((item) => { + switch (item.type) { + case 'collapse': + return ( + + ); + case 'item': + return ; + default: + return ( +
+ Fix - Collapse or Item +
+ ); + } + }) ?? [], + [menu.children, setSelectedItems, setSelectedLevel, selectedLevel, selectedItems, level, parentId] + ); + + return ( + + handleClick(true)}> + {menu.icon && ( + + + + )} + {menu.title} + + + + {menu.badge && {menu.badge}} + + +
+
    {navCollapse}
+
+
+
+ ); +} + +NavCollapse.propTypes = { + menu: PropTypes.any, + level: PropTypes.number, + parentId: PropTypes.string, + setSelectedItems: PropTypes.oneOfType([PropTypes.func, PropTypes.any]), + selectedItems: PropTypes.any, + setSelectedLevel: PropTypes.func, + selectedLevel: PropTypes.number +}; diff --git a/src/layout/Dashboard/Drawer/DrawerContent/NavGroup.jsx b/src/layout/Dashboard/Drawer/DrawerContent/NavGroup.jsx new file mode 100644 index 0000000..6992473 --- /dev/null +++ b/src/layout/Dashboard/Drawer/DrawerContent/NavGroup.jsx @@ -0,0 +1,93 @@ +import { Fragment, useCallback, useEffect, useMemo, useState } from 'react'; +import { matchPath, useLocation } from 'react-router-dom'; + +// project-imports +import NavItem from './NavItem'; +import NavCollapse from './NavCollapse'; + +// ==============================|| NAVIGATION - GROUP ||============================== // + +export default function NavGroup(props) { + const { item, lastItem, remItems, lastItemId, setSelectedID, setSelectedItems, selectedItems, setSelectedLevel, selectedLevel } = props; + + const { pathname } = useLocation(); + const [currentItem, setCurrentItem] = useState(item); + + // Combine items if this is the last grouped item + useEffect(() => { + if (lastItem && item.id === lastItemId) { + const children = remItems.flatMap((ele) => ele.children ?? []); + setCurrentItem({ ...item, children }); + } else { + setCurrentItem(item); + } + }, [item, lastItem, lastItemId, remItems]); + + // Helper: Recursively check if route matches + const findMatchingChild = useCallback( + (children, parentId) => { + children.forEach((child) => { + if (child.children?.length) findMatchingChild(child.children, parentId); + const path = child.link || child.url; + if (path && matchPath({ path, end: true }, pathname)) { + setSelectedID(parentId); + } + }); + }, + [pathname, setSelectedID] + ); + + // On-load selection + useEffect(() => { + const children = currentItem.children ?? []; + children.forEach((child) => { + if (child.children?.length) findMatchingChild(child.children, currentItem.id); + const path = child.link || child.url; + if (path && matchPath({ path, end: true }, pathname)) { + setSelectedID(currentItem.id); + } + }); + }, [pathname, currentItem, findMatchingChild, setSelectedID]); + + // Memoized children render + const navCollapse = useMemo(() => { + if (!currentItem.children) return null; + + return currentItem.children.map((menuItem, index) => { + const key = menuItem.id || `${menuItem.type}-${index}`; + + switch (menuItem.type) { + case 'collapse': + return ( + + ); + case 'item': + return ; + default: + return ( +
+ Fix - Group Collapse or Items +
+ ); + } + }); + }, [currentItem, selectedItems, selectedLevel, setSelectedItems, setSelectedLevel]); + + return ( + +
  • + +
  • + {navCollapse} +
    + ); +} diff --git a/src/layout/Dashboard/Drawer/DrawerContent/Navigation/NavItem.jsx b/src/layout/Dashboard/Drawer/DrawerContent/NavItem.jsx similarity index 52% rename from src/layout/Dashboard/Drawer/DrawerContent/Navigation/NavItem.jsx rename to src/layout/Dashboard/Drawer/DrawerContent/NavItem.jsx index cb94ff6..f97c613 100644 --- a/src/layout/Dashboard/Drawer/DrawerContent/Navigation/NavItem.jsx +++ b/src/layout/Dashboard/Drawer/DrawerContent/NavItem.jsx @@ -8,28 +8,28 @@ import { handlerDrawerOpen } from 'api/menu'; export default function NavItem({ item }) { const { pathname } = useLocation(); - const itemPath = item?.link || item?.url; - let itemTarget = '_self'; - if (item.target) { - itemTarget = '_blank'; - } + const itemPath = item?.link || item?.url; + const itemTarget = item?.target ? '_blank' : '_self'; const isSelected = itemPath ? !!matchPath({ path: itemPath, end: true }, pathname) : false; + const isMobile = window.innerWidth <= 1024; + + const handleClick = () => { + // close drawer on mobile + if (isMobile) handlerDrawerOpen(false); + }; + + const renderIcon = () => + item?.icon && ( + + + + ); + return ( -
  • - { - handlerDrawerOpen(false); - }} - > - {item?.icon && ( - - - - )} +
  • + + {renderIcon()} {item.title}
  • diff --git a/src/layout/Dashboard/Drawer/DrawerContent/Navigation/NavCollapse.jsx b/src/layout/Dashboard/Drawer/DrawerContent/Navigation/NavCollapse.jsx deleted file mode 100644 index 0586c81..0000000 --- a/src/layout/Dashboard/Drawer/DrawerContent/Navigation/NavCollapse.jsx +++ /dev/null @@ -1,166 +0,0 @@ -import PropTypes from 'prop-types'; -import { useEffect, useState, useMemo, useCallback } from 'react'; -import { matchPath, useLocation, useNavigate } from 'react-router-dom'; - -// react-bootstrap -import Badge from 'react-bootstrap/Badge'; -import ListGroup from 'react-bootstrap/ListGroup'; - -// project-imports -import NavItem from './NavItem'; -import { useGetMenuMaster } from 'api/menu'; - -// ==============================|| NAVIGATION - COLLAPSE ||============================== // - -export default function NavCollapse({ menu, level, parentId, setSelectedItems, selectedItems, setSelectedLevel, selectedLevel }) { - const { menuMaster } = useGetMenuMaster(); - const navigation = useNavigate(); - const drawerOpen = menuMaster?.isDashboardDrawerOpened; - - const [open, setOpen] = useState(false); - const [selected, setSelected] = useState(null); - const location = useLocation(); - - const isMenuActive = (menu, currentPath) => { - if (menu.type === 'item') { - return menu.url === currentPath; - } - if (menu.type === 'collapse' && Array.isArray(menu.children)) { - return menu.children.some((child) => isMenuActive(child, currentPath)); - } - return false; - }; - - const handleClick = (isRedirect) => { - const isMobile = window.innerWidth <= 1024; - setSelectedLevel(level); - - if (isMobile || !drawerOpen) { - setOpen(!open); - setSelected(!selected ? menu.id : null); - setSelectedItems(!selected ? menu : selectedItems); - if (menu.url && isRedirect) navigation(`${menu.url}`); - } - }; - - useMemo(() => { - if (selected === selectedItems?.id) { - if (level === 1) { - setOpen(true); - } - } else { - if (level === selectedLevel) { - setOpen(false); - - if (drawerOpen) { - setSelected(null); - } - } - } - }, [selectedItems, level, selected, drawerOpen, selectedLevel]); - - const { pathname } = useLocation(); - - useEffect(() => { - if (pathname === menu.url) { - setSelected(menu.id); - } - }, [pathname, menu.id, menu.url]); - - const checkOpenForParent = useCallback( - (child, id) => { - child.forEach((item) => { - if (item.url === pathname) { - setOpen(true); - setSelected(id); - } - }); - }, - [pathname] - ); - - // menu collapse for sub-levels - useEffect(() => { - setOpen(false); - if (menu.children) { - menu.children.forEach((item) => { - if (item.children?.length) { - checkOpenForParent(item.children, menu.id); - } - - if (item.link && !!matchPath({ path: item?.link, end: false }, pathname)) { - setSelected(menu.id); - setOpen(true); - } - - if (item.url === pathname) { - setSelected(menu.id); - setOpen(true); - } - }); - } - }, [pathname, menu.id, menu.children, checkOpenForParent]); - - useEffect(() => { - if (menu.url === pathname) { - setSelected(menu.id); - setOpen(true); - } - }, [pathname, menu]); - - const navCollapse = menu.children?.map((item) => { - switch (item.type) { - case 'collapse': - return ( - - ); - case 'item': - return ; - default: - return ( -
    - Fix - Collapse or Item -
    - ); - } - }); - - return ( - <> - - handleClick(true)}> - {menu.icon && ( - - - - )} - {menu.title} - - - - {menu.badge && {menu.badge}} - - {open === true &&
      {navCollapse}
    } -
    - - ); -} - -NavCollapse.propTypes = { - menu: PropTypes.any, - level: PropTypes.number, - parentId: PropTypes.string, - setSelectedItems: PropTypes.oneOfType([PropTypes.func, PropTypes.any]), - selectedItems: PropTypes.any, - setSelectedLevel: PropTypes.func, - selectedLevel: PropTypes.number -}; diff --git a/src/layout/Dashboard/Drawer/DrawerContent/Navigation/NavGroup.jsx b/src/layout/Dashboard/Drawer/DrawerContent/Navigation/NavGroup.jsx deleted file mode 100644 index c7dd044..0000000 --- a/src/layout/Dashboard/Drawer/DrawerContent/Navigation/NavGroup.jsx +++ /dev/null @@ -1,129 +0,0 @@ -import PropTypes from 'prop-types'; -import { Fragment, useCallback, useEffect, useState } from 'react'; -import { matchPath, useLocation } from 'react-router-dom'; - -// project-imports -import NavItem from './NavItem'; -import NavCollapse from './NavCollapse'; - -// ==============================|| NAVIGATION - GROUP ||============================== // - -export default function NavGroup({ - item, - lastItem, - remItems, - lastItemId, - setSelectedID, - setSelectedItems, - selectedItems, - setSelectedLevel, - selectedLevel -}) { - const [anchorEl, setAnchorEl] = useState(null); - const [currentItem, setCurrentItem] = useState(item); - const { pathname } = useLocation(); - - const openMini = Boolean(anchorEl); - - useEffect(() => { - if (lastItem) { - if (item.id === lastItemId) { - const localItem = { ...item }; - const elements = remItems.map((ele) => ele?.children); - localItem.children = elements.flat(1); - setCurrentItem(localItem); - } else { - setCurrentItem(item); - } - } - }, [item, lastItem, lastItemId, remItems, setCurrentItem]); - - const checkOpenForParent = useCallback( - (child, id) => { - child.forEach((ele) => { - if (ele.children?.length) { - checkOpenForParent(ele.children, currentItem.id); - } - - if (ele.url && !!matchPath({ path: ele?.link ? ele.link : ele.url, end: true }, pathname)) { - setSelectedID(id); - } - }); - }, - [currentItem.id, pathname, setSelectedID] - ); - - const checkSelectedOnload = useCallback( - (data) => { - const children = data.children ?? []; - children.forEach((itemCheck) => { - if (!itemCheck) return; - - if (itemCheck.children?.length) { - checkOpenForParent(itemCheck.children, currentItem.id); - } - - if (itemCheck.url && matchPath({ path: itemCheck.link ? itemCheck.link : itemCheck.url, end: true }, pathname)) { - setSelectedID(currentItem.id); - } - }); - }, - [pathname, currentItem, checkOpenForParent, setSelectedID] - ); - - useEffect(() => { - checkSelectedOnload(currentItem); - if (openMini) setAnchorEl(null); - }, [pathname, currentItem, checkSelectedOnload, openMini, setAnchorEl]); - - const navCollapse = item.children?.map((menuItem, index) => { - const key = menuItem.id || `${menuItem.type}-${index}`; - switch (menuItem.type) { - case 'collapse': - return ( - - ); - case 'item': - return ; - default: - return ( -
    - Fix - Group Collapse or Items -
    - ); - } - }); - - return ( - <> - -
  • - -
  • - {navCollapse} -
    - - ); -} - -NavGroup.propTypes = { - item: PropTypes.any, - lastItem: PropTypes.number, - remItems: PropTypes.array, - lastItemId: PropTypes.string, - setSelectedID: PropTypes.oneOfType([PropTypes.func, PropTypes.any]), - setSelectedItems: PropTypes.oneOfType([PropTypes.func, PropTypes.any]), - selectedItems: PropTypes.any, - setSelectedLevel: PropTypes.func, - selectedLevel: PropTypes.number, - setSelectTab: PropTypes.func -}; diff --git a/src/layout/Dashboard/Drawer/DrawerContent/Navigation/index.jsx b/src/layout/Dashboard/Drawer/DrawerContent/Navigation/index.jsx deleted file mode 100644 index 9447a45..0000000 --- a/src/layout/Dashboard/Drawer/DrawerContent/Navigation/index.jsx +++ /dev/null @@ -1,83 +0,0 @@ -import PropTypes from 'prop-types'; -import { useState } from 'react'; - -// react-bootstrap -import ListGroup from 'react-bootstrap/ListGroup'; - -// project-imports -import NavItem from './NavItem'; -import NavGroup from './NavGroup'; -import menuItems from 'menu-items'; - -// ==============================|| NAVIGATION ||============================== // - -export default function Navigation({ selectedItems, setSelectedItems, setSelectTab }) { - const [selectedID, setSelectedID] = useState(''); - const [selectedLevel, setSelectedLevel] = useState(0); - - const lastItem = null; - let lastItemIndex = menuItems.items.length - 1; - let remItems = []; - let lastItemId; - - if (lastItem && lastItem < menuItems.items.length) { - lastItemId = menuItems.items[lastItem - 1].id; - lastItemIndex = lastItem - 1; - remItems = menuItems.items.slice(lastItem - 1, menuItems.items.length).map((item) => ({ - id: item.id, // Ensure id is included - type: item.type, // Add the missing type field - title: item.title, - elements: item.children, - icon: item.icon, - ...(item.url && { - url: item.url - }) - })); - } - - const navGroups = menuItems.items.slice(0, lastItemIndex + 1).map((item, index) => { - switch (item.type) { - case 'group': - if (item.url && item.id !== lastItemId) { - return ( - <> - - - - - ); - } - - return ( - {})} - /> - ); - default: - return ( -
    - Fix - Navigation Group -
    - ); - } - }); - - return
      {navGroups}
    ; -} - -Navigation.propTypes = { - selectedItems: PropTypes.any, - setSelectedItems: PropTypes.oneOfType([PropTypes.func, PropTypes.any]), - setSelectTab: PropTypes.oneOfType([PropTypes.func, PropTypes.any]) -}; diff --git a/src/layout/Dashboard/Drawer/DrawerContent/index.jsx b/src/layout/Dashboard/Drawer/DrawerContent/index.jsx index a07c594..6be26e3 100644 --- a/src/layout/Dashboard/Drawer/DrawerContent/index.jsx +++ b/src/layout/Dashboard/Drawer/DrawerContent/index.jsx @@ -1,153 +1,81 @@ import PropTypes from 'prop-types'; -import { useCallback, useEffect, useState } from 'react'; -import { Link, useLocation } from 'react-router-dom'; +import { useState } from 'react'; // react-bootstrap import ListGroup from 'react-bootstrap/ListGroup'; -// project-imports -import Navigation from './Navigation'; -import { useGetMenuMaster } from 'api/menu'; -import SimpleBarScroll from 'components/third-party/SimpleBar'; +// project imports +import NavItem from './NavItem'; +import NavGroup from './NavGroup'; import menuItems from 'menu-items'; -// ==============================|| DRAWER CONTENT - NAVIGATION ||============================== // - -export default function DrawerContent({ selectedItems, setSelectedItems }) { - const [selectTab, setSelectTab] = useState(menuItems.items[0]); - const { menuMaster } = useGetMenuMaster(); - const { pathname } = useLocation(); - const drawerOpen = menuMaster?.isDashboardDrawerOpened; - - const [open, setOpen] = useState({}); - - const handleClick = (item) => { - if (!item.id) return; - - const isMobile = window.innerWidth <= 1024; - - setOpen((prev) => ({ - ...prev, - [item.id]: !prev[item.id] +// ==============================|| DRAWER CONTENT ||============================== // + +export default function Navigation({ selectedItems, setSelectedItems, setSelectTab }) { + const [selectedID, setSelectedID] = useState(''); + const [selectedLevel, setSelectedLevel] = useState(0); + + const lastItem = null; + let lastItemIndex = menuItems.items.length - 1; + let remItems = []; + let lastItemId; + + if (lastItem && lastItem < menuItems.items.length) { + lastItemId = menuItems.items[lastItem - 1].id; + lastItemIndex = lastItem - 1; + remItems = menuItems.items.slice(lastItem - 1, menuItems.items.length).map((item) => ({ + id: item.id, + type: item.type, + title: item.title, + elements: item.children, + icon: item.icon, + ...(item.url && { + url: item.url + }) })); - - if (isMobile || !drawerOpen) { - setSelectedItems(item); + } + + const navGroups = menuItems.items.slice(0, lastItemIndex + 1).map((item) => { + switch (item.type) { + case 'group': + if (item.url && item.id !== lastItemId) { + return ( + + + + ); + } + + return ( + {})} + /> + ); } - }; - - const isActive = useCallback( - (item) => { - if (!item.url) return false; - return pathname.toLowerCase().includes(item.url.toLowerCase()); - }, - [pathname] - ); - - const autoOpenParents = useCallback( - (items) => { - const openMap = {}; - - const findAndMark = (entries = []) => { - entries.forEach((item) => { - if (item.children) { - const match = item.children.find((child) => isActive(child) || child.children?.some(isActive)); - if (match) openMap[item.id] = true; - - findAndMark(item.children); - } - }); - }; - - findAndMark(items); - setOpen(openMap); - }, - [isActive, setOpen] - ); - - useEffect(() => { - autoOpenParents(selectTab?.children); - }, [autoOpenParents, selectTab]); - return ( - <> - - - -
    -
    - -
      - {selectTab?.children?.map((item) => ( - - handleClick(item)}> - {item.icon && ( - - - - )} - {item.title} - {item.type === 'collapse' && ( - - - - )} - - {open[item.id] && item.children && ( -
        - {item.children.map((child) => ( -
      • - { - handleClick(child); - }} - > - {child.icon && ( - - - - )} - {child.title} - {child.type === 'collapse' && ( - - - - )} - + return ( +
        + Fix - Navigation Group +
        + ); + }); - {open[child.id] && child.children && ( -
          - {child.children.map((value) => ( -
        • - - {value.icon && ( - - - - )} - {value.title} - -
        • - ))} -
        - )} -
      • - ))} -
      - )} -
      - ))} -
    -
    -
    -
    - - ); + return
      {navGroups}
    ; } -DrawerContent.propTypes = { selectedItems: PropTypes.any, setSelectedItems: PropTypes.oneOfType([PropTypes.func, PropTypes.any]) }; +Navigation.propTypes = { + selectedItems: PropTypes.any, + setSelectedItems: PropTypes.oneOfType([PropTypes.func, PropTypes.any]), + setSelectTab: PropTypes.oneOfType([PropTypes.func, PropTypes.any]) +}; diff --git a/src/layout/Dashboard/Drawer/index.jsx b/src/layout/Dashboard/Drawer/index.jsx index f495206..021bd0a 100644 --- a/src/layout/Dashboard/Drawer/index.jsx +++ b/src/layout/Dashboard/Drawer/index.jsx @@ -1,58 +1,8 @@ -import { useEffect, useRef, useState } from 'react'; - -// react-bootstrap -import Image from 'react-bootstrap/Image'; - -// third-party - // project-imports -import DrawerContent from './DrawerContent'; -import { handlerDrawerOpen, useGetMenuMaster } from 'api/menu'; - -// assets -import logo from 'assets/images/logo-white.svg'; +import { VerticalDrawer } from '../Drawer/vertical'; // ==============================|| MAIN LAYOUT - DRAWER ||============================== // export default function MainDrawer() { - const { menuMaster } = useGetMenuMaster(); - const drawerOpen = menuMaster?.isDashboardDrawerOpened; - const [selectedItems, setSelectedItems] = useState(); - const [isMobile, setIsMobile] = useState(window.innerWidth <= 1024); - const overlayRef = useRef(null); - - useEffect(() => { - const handleResize = () => setIsMobile(window.innerWidth <= 1024); - window.addEventListener('resize', handleResize); - return () => window.removeEventListener('resize', handleResize); - }, []); - - useEffect(() => { - const handleClickOutside = (event) => { - if (overlayRef.current?.contains(event.target)) { - handlerDrawerOpen(false); - } - }; - if (isMobile) { - document.addEventListener('mousedown', handleClickOutside); - } - return () => document.removeEventListener('mousedown', handleClickOutside); - }, [isMobile]); - - return ( - - ); + return ; } diff --git a/src/layout/Dashboard/Drawer/vertical/VerticalDrawer.jsx b/src/layout/Dashboard/Drawer/vertical/VerticalDrawer.jsx new file mode 100644 index 0000000..227bde8 --- /dev/null +++ b/src/layout/Dashboard/Drawer/vertical/VerticalDrawer.jsx @@ -0,0 +1,57 @@ +import { useEffect, useRef, useState } from 'react'; +import { Link } from 'react-router-dom'; + +// react-bootstrap +import Image from 'react-bootstrap/Image'; + +// project-imports +import VerticalDrawerContent from './VerticalDrawerContent'; +import { handlerDrawerOpen, useGetMenuMaster } from 'api/menu'; + +// assets +import logo from 'assets/images/logo-white.svg'; + +// ==============================|| VERTICAL DRAWER ||============================== // + +export const VerticalDrawer = () => { + const { menuMaster } = useGetMenuMaster(); + const drawerOpen = menuMaster?.isDashboardDrawerOpened; + const [selectedItems, setSelectedItems] = useState(); + const [isMobile, setIsMobile] = useState(window.innerWidth <= 1024); + const overlayRef = useRef(null); + + useEffect(() => { + const handleResize = () => setIsMobile(window.innerWidth <= 1024); + window.addEventListener('resize', handleResize); + return () => window.removeEventListener('resize', handleResize); + }, []); + + useEffect(() => { + const handleClickOutside = (event) => { + if (overlayRef.current?.contains(event.target)) { + handlerDrawerOpen(false); + } + }; + if (isMobile) { + document.addEventListener('mousedown', handleClickOutside); + } + return () => document.removeEventListener('mousedown', handleClickOutside); + }, [isMobile]); + + return ( + + ); +}; diff --git a/src/layout/Dashboard/Drawer/vertical/VerticalDrawerContent.jsx b/src/layout/Dashboard/Drawer/vertical/VerticalDrawerContent.jsx new file mode 100644 index 0000000..582ecd4 --- /dev/null +++ b/src/layout/Dashboard/Drawer/vertical/VerticalDrawerContent.jsx @@ -0,0 +1,15 @@ +import PropTypes from 'prop-types'; + +// project-imports +import SimpleBarScroll from 'components/third-party/SimpleBar'; +import Navigation from '../DrawerContent'; + +export default function VerticalDrawerContent({ selectedItems, setSelectedItems }) { + return ( + + + + ); +} + +VerticalDrawerContent.propTypes = { selectedItems: PropTypes.any, setSelectedItems: PropTypes.oneOfType([PropTypes.func, PropTypes.any]) }; diff --git a/src/layout/Dashboard/Drawer/vertical/index.js b/src/layout/Dashboard/Drawer/vertical/index.js new file mode 100644 index 0000000..88c68a8 --- /dev/null +++ b/src/layout/Dashboard/Drawer/vertical/index.js @@ -0,0 +1,2 @@ +export { VerticalDrawer } from './VerticalDrawer'; +export { default as VerticalDrawerContent } from './VerticalDrawerContent'; diff --git a/src/layout/Dashboard/Footer.jsx b/src/layout/Dashboard/Footer.jsx index 9f7b8fd..24bd407 100644 --- a/src/layout/Dashboard/Footer.jsx +++ b/src/layout/Dashboard/Footer.jsx @@ -11,7 +11,7 @@ import branding from 'branding.json'; export default function Footer() { return (