From b26277a67f9f0fcdd7ba832b93f24b6b9048719d Mon Sep 17 00:00:00 2001 From: Viktor Kuzhelnyi Date: Wed, 14 Sep 2022 16:13:51 +0500 Subject: [PATCH] add: dashboard page & other logic --- components/AsideMenu.tsx | 17 +- components/AsideMenuItem.tsx | 53 +++- components/AsideMenuLayer.tsx | 15 +- components/AsideMenuList.tsx | 4 +- components/BaseButton.tsx | 44 ++-- components/BaseButtons.tsx | 25 +- components/BaseDivider.tsx | 2 +- components/BaseIcon.tsx | 18 +- components/BaseLevel.tsx | 16 +- components/CardBox.tsx | 32 +-- components/CardBoxClient.tsx | 50 ++++ components/CardBoxComponentBody.tsx | 6 +- components/CardBoxComponentFooter.tsx | 2 +- components/CardBoxTransaction.tsx | 57 ++++ components/CardBoxWIdget.tsx | 61 +++++ components/IconRounded.tsx | 10 +- components/NavBar.tsx | 9 +- components/NavBarItem.tsx | 16 +- components/NavBarItemPlain.tsx | 21 +- components/NavBarMenuList.tsx | 9 +- components/NotificationBar.tsx | 58 ++++ components/NumberDynamic.tsx | 52 ++++ components/OverlayLayer.tsx | 21 +- components/PillTag.tsx | 28 ++ components/PillTagPlain.tsx | 32 +++ components/PillTagTrend.tsx | 34 +++ components/SectionBanner.tsx | 14 + components/SectionBannerStarOnGitHub.tsx | 26 ++ components/SectionFullScreen.tsx | 2 +- components/SectionTitleLineWithButton.tsx | 6 +- components/TableSampleClients.tsx | 96 +++++++ components/UserAvatar.tsx | 25 +- components/UserAvatarCurrentUser.tsx | 4 +- components/charts/LineSample.tsx | 37 +++ components/charts/config.ts | 54 ++++ components/globals/DarkMode.tsx | 17 +- components/globals/Style.tsx | 17 +- components/justboil/Logo.tsx | 2 +- components/layouts/Authenticated.tsx | 37 +-- hooks/sampleData.ts | 24 ++ interfaces/index.ts | 72 +++-- next.config.mjs | 8 - package-lock.json | 308 +++++++++++++--------- package.json | 10 +- pages/_app.tsx | 2 +- pages/dashboard.tsx | 136 ++++++++++ pages/{Error.tsx => error.tsx} | 0 pages/index.tsx | 80 ++++-- postcss.config.js | 1 + public/data-sources/clients.json | 1 + public/data-sources/history.json | 1 + src/config.ts | 4 +- src/menuNavBar.ts | 2 +- src/stores/hooks.ts | 2 +- src/stores/mainSlice.ts | 16 +- src/stores/store.ts | 2 +- src/stores/styleSlice.ts | 53 ++-- src/styles.ts | 20 +- styles/_checkbox-radio-switch.css | 120 +++++---- styles/_progress.css | 38 +-- styles/_scrollbars.css | 96 +++---- styles/_table.css | 92 +++---- tailwind.config.js | 6 +- 63 files changed, 1550 insertions(+), 573 deletions(-) create mode 100644 components/CardBoxClient.tsx create mode 100644 components/CardBoxTransaction.tsx create mode 100644 components/NotificationBar.tsx create mode 100644 components/NumberDynamic.tsx create mode 100644 components/PillTag.tsx create mode 100644 components/PillTagPlain.tsx create mode 100644 components/PillTagTrend.tsx create mode 100644 components/SectionBanner.tsx create mode 100644 components/SectionBannerStarOnGitHub.tsx create mode 100644 components/TableSampleClients.tsx create mode 100644 components/charts/LineSample.tsx create mode 100644 components/charts/config.ts create mode 100644 hooks/sampleData.ts create mode 100644 pages/dashboard.tsx rename pages/{Error.tsx => error.tsx} (100%) create mode 100644 public/data-sources/clients.json create mode 100644 public/data-sources/history.json diff --git a/components/AsideMenu.tsx b/components/AsideMenu.tsx index f32d31d..275a17a 100644 --- a/components/AsideMenu.tsx +++ b/components/AsideMenu.tsx @@ -1,21 +1,30 @@ import React from 'react' +import { MenuAsideItem } from '../interfaces' import AsideMenuLayer from './AsideMenuLayer' import OverlayLayer from './OverlayLayer' +type Props = { + menu: MenuAsideItem[] + isAsideMobileExpanded: boolean + isAsideLgActive: boolean + onAsideLgClose: Function +} + export default function AsideMenu({ - menu, isAsideMobileExpanded = false, isAsideLgActive = false, -}) { + ...props +}: Props) { return ( <> - {isAsideLgActive && } + {isAsideLgActive && } ) } diff --git a/components/AsideMenuItem.tsx b/components/AsideMenuItem.tsx index 21131d0..54e0697 100644 --- a/components/AsideMenuItem.tsx +++ b/components/AsideMenuItem.tsx @@ -1,5 +1,4 @@ - -import React, { useState } from 'react' +import React, { useEffect, useState } from 'react' import { mdiMinus, mdiPlus } from '@mdi/js' import BaseIcon from './BaseIcon' import Link from 'next/link' @@ -7,25 +6,55 @@ import { getButtonColor } from '../src/colors' import AsideMenuList from './AsideMenuList' import { MenuAsideItem } from '../interfaces' import { useAppSelector } from '../src/stores/hooks' +import { useRouter } from 'next/router' type Props = { - item: MenuAsideItem, + item: MenuAsideItem isDropdownList?: boolean } -export default function AsideMenuItem({ item, isDropdownList = false }: Props) { +const AsideMenuItem = ({ item, isDropdownList = false }: Props) => { + const [isLinkActive, setIsLinkActive] = useState(false) const [isDropdownActive, setIsDropdownActive] = useState(false) + const asideMenuItemStyle = useAppSelector((state) => state.style.asideMenuItemStyle) const asideMenuDropdownStyle = useAppSelector((state) => state.style.asideMenuDropdownStyle) + const asideMenuItemActiveStyle = useAppSelector((state) => state.style.asideMenuItemActiveStyle) + + const activeClassAddon = !item.color && isLinkActive ? asideMenuItemActiveStyle : '' + + const { asPath, isReady } = useRouter() + + useEffect(() => { + if (item.href && isReady) { + const linkPathName = new URL(item.href, location.href).pathname + + const activePathname = new URL(asPath, location.href).pathname + + if (linkPathName === activePathname) { + setIsLinkActive(true) + } + } + }) const asideMenuItemInnerContents = ( <> - {item.icon && } - + {item.icon && ( + + )} + {item.label} {item.menu && ( - + )} ) @@ -41,11 +70,15 @@ export default function AsideMenuItem({ item, isDropdownList = false }: Props) { return (
  • {item.href && ( - + {asideMenuItemInnerContents} )} - {!item.href &&
    {asideMenuItemInnerContents}
    } + {!item.href && ( +
    setIsDropdownActive(!isDropdownActive)}> + {asideMenuItemInnerContents} +
    + )} {item.menu && ( ) } + +export default AsideMenuItem diff --git a/components/AsideMenuLayer.tsx b/components/AsideMenuLayer.tsx index 3ddf6c9..b72ec0b 100644 --- a/components/AsideMenuLayer.tsx +++ b/components/AsideMenuLayer.tsx @@ -7,11 +7,12 @@ import { MenuAsideItem } from '../interfaces' import { useAppSelector } from '../src/stores/hooks' type Props = { - menu: MenuAsideItem[], + menu: MenuAsideItem[] className?: string + onAsideLgCloseClick: Function } -export default function AsideMenuLayer({ menu, className='' }: Props) { +export default function AsideMenuLayer({ menu, className = '', ...props }: Props) { const asideStyle = useAppSelector((state) => state.style.asideStyle) const asideBrandStyle = useAppSelector((state) => state.style.asideBrandStyle) const asideScrollbarsStyle = useAppSelector((state) => state.style.asideScrollbarsStyle) @@ -24,6 +25,11 @@ export default function AsideMenuLayer({ menu, className='' }: Props) { isLogout: true, } + const handleAsideLgCloseClick = (e: React.MouseEvent) => { + e.preventDefault() + props.onAsideLgCloseClick() + } + return (