Side Menu layer 2 updated

This commit is contained in:
berkay 2025-01-08 12:06:30 +03:00
parent 2dd267a570
commit 2a80db4544
7 changed files with 319 additions and 113 deletions

View File

@ -43,6 +43,15 @@ async function retrieveAvailableEvents() {
return decrpytAccessObject ? JSON.parse(decrpytAccessObject) : null;
}
async function retrieveavailablePages() {
const cookieStore = await cookies();
const encrpytAccessObject = cookieStore.get("availablePages")?.value || "";
const decrpytAccessObject = await nextCrypto.decrypt(encrpytAccessObject);
return decrpytAccessObject
? JSON.parse(decrpytAccessObject)?.availablePages || []
: null;
}
async function retrieveAvatarInfo() {
const response = await fetchDataWithToken(
`${baseUrl}/authentication/avatar`,
@ -119,4 +128,5 @@ export {
retrieveAccessObjects,
retrieveAvailableEvents,
retrieveUserSelection,
retrieveavailablePages,
};

View File

@ -7,24 +7,71 @@ import { PagesInfosAndEndpoints } from "@/apimaps/mappingApi";
const availableEventsURL = `${baseUrl}/access/endpoints/available`;
async function checkPageAvaliablityByEndpoint(availableEvents: any) {
let availablePages: string[] = [];
const availableEventsList: string[] = availableEvents || [];
PagesInfosAndEndpoints.map((page) => {
function iterateOverPageLayers(
availableEventsList: any,
availablePages: any,
iterLevel: any
) {
console.log("iterLevel", iterLevel);
if (Array.isArray(iterLevel)) {
iterLevel.map((page: any) => {
const pageInfo = page?.pageInfo?.tr || [];
if (pageInfo.length > 0) {
pageInfo.map((pageInfoItem) => {
pageInfo.map((pageInfoItem: any) => {
const endpoint = pageInfoItem?.endpoint || "";
if (
availableEventsList.includes(endpoint) &&
!availablePages.includes(page.name)
) {
if (page.name) {
availablePages.push(page.name);
}
return;
}
});
}
});
} else {
const pageInfo = iterLevel?.pageInfo?.tr || [];
if (pageInfo.length > 0) {
pageInfo.map((pageInfoItem: any) => {
const endpoint = pageInfoItem?.endpoint || "";
if (
availableEventsList.includes(endpoint) &&
!availablePages.includes(iterLevel.name)
) {
availablePages.push(iterLevel.name);
return;
}
});
}
}
}
async function checkPageAvaliablityByEndpoint(availableEvents: any) {
let availablePages: string[] = [];
const availableEventsList: string[] = availableEvents || [];
let pageLayers = null;
PagesInfosAndEndpoints.map((page) => {
if (page.subCategories) {
pageLayers = page?.subCategories;
if (pageLayers) {
iterateOverPageLayers(availableEventsList, availablePages, pageLayers);
const nestedLayers = pageLayers.find(
(layer) => layer.subCategories
)?.subCategories;
if (nestedLayers) {
iterateOverPageLayers(
availableEventsList,
availablePages,
nestedLayers
);
}
}
}
iterateOverPageLayers(availableEventsList, availablePages, page);
});
return availablePages;
}
@ -44,15 +91,22 @@ async function setAvailableEvents() {
const availableEventDataRes = await checkPageAvaliablityByEndpoint(
availableEventData
);
console.log("availableEventDataRes", availableEventDataRes);
const availableEvents = await nextCrypto.encrypt(
JSON.stringify({ availableEvents: availableEventData })
);
const availablePages = await nextCrypto.encrypt(
JSON.stringify({ availablePages: availableEventDataRes })
);
cookieStore.set({
name: "availableEvents",
value: availableEvents,
...cookieObject,
});
cookieStore.set({
name: "availablePages",
value: availablePages,
...cookieObject,
});
}
}

View File

@ -7,6 +7,7 @@ import MainPage from "@/components/commons/MainPage";
import { checkServerPageAvaliable } from "@/hooks/serverCheckPageAvailable";
import { MainPageProps } from "@/schemas/mainPage";
import { retrieveavailablePages } from "@/apicalls/cookies/token";
interface MainBodyWithHeaderProps {
children: any;
@ -18,6 +19,7 @@ const MainBodyWithHeader: React.FC<MainBodyWithHeaderProps> = async ({
section,
}) => {
const user = await checkServerPageAvaliable();
const restrictions = await retrieveavailablePages();
return (
<div className="flex w-full h-full">
<Suspense fallback={<div>Loading Profile...</div>}>
@ -26,7 +28,7 @@ const MainBodyWithHeader: React.FC<MainBodyWithHeaderProps> = async ({
<SideMenuProfile profileInfo={user} />
</div>
<div className="basis-3/4 p-4 border-2 border-black">
<SideMenu section={section} lang={user?.lang ?? "tr"} />
<SideMenu section={section} lang={user?.lang ?? "tr"} restrictions={restrictions} />
</div>
</div>
</Suspense>

View File

@ -6,14 +6,19 @@ import { getIconByName } from "@/Icons/icons";
import { MainPageProps } from "@/schemas/mainPage";
import { getThreeLayerByPageName } from "@/lib/getPageFromMappings";
import { LanguagesSelectable } from "@/apimaps/mappingApi";
import { checkEndpointAvailability } from "@/apimaps/mappingApiFunctions";
import { FirstLayerMenu, SecondLayerMenu } from "./SideMenuButtons";
interface SideMenuProps {
lang: string;
section: MainPageProps;
restrictions: Array<string>;
}
const SideMenu: React.FC<SideMenuProps> = async ({ section, lang }) => {
const SideMenu: React.FC<SideMenuProps> = async ({
section,
lang,
restrictions,
}) => {
const { layer, currentPage, firstLayer, secondLayer, thirdLayer } = section;
const pages = getThreeLayerByPageName({
lang,
@ -25,117 +30,40 @@ const SideMenu: React.FC<SideMenuProps> = async ({ section, lang }) => {
const firstLayerPage = pages?.firstLayer;
const secondLayerPage = pages?.secondLayer;
const thirdLayerPage = pages?.thirdLayer;
const fourthLayerPage = pages?.fourthLayer;
const language = lang as LanguagesSelectable;
if (layer === 1) {
return (
<nav className="flex flex-col text-sm">
{PagesInfosAndEndpoints.map((page) => {
const isActive = page.name === currentPage;
const Icon = getIconByName(page.icon);
if (isActive) {
return (
<div>
<Link
href={page.url}
className={`px-10 border-gray-100 rounded-xl border-2 m-1 select-none pointer-events-none drag w-full p-4 flex items-center gap-2 "bg-gray-700 `}
>
<Icon />
{page.title?.[lang as LanguagesSelectable]}
</Link>
<div className="mb-6 mt-3 px-4">
{secondLayerPage.map((subPage: any) => {
const SubIcon = getIconByName(subPage.icon);
return (
<Link
key={subPage.name}
href={subPage.url}
className={`w-full p-4 my-3 rounded-2xl m-1 flex items-center gap-2 bg-slate-300 hover:bg-slate-500`}
>
<SubIcon />
{subPage.title?.[lang as LanguagesSelectable]}
</Link>
<FirstLayerMenu
key={page.name}
page={page}
currentPage={currentPage}
mappedLayers={pages}
restrictionsList={restrictions}
lang={lang as LanguagesSelectable}
/>
);
})}
</div>
</div>
);
} else {
return (
<div>
<Link
href={page.url}
className={`w-full p-4 rounded-xl m-1 flex items-center gap-2 bg-gray-100 hover:bg-gray-300`}
>
<Icon />
{page.title?.[lang as LanguagesSelectable]}
</Link>
</div>
);
}
})}
</nav>
);
} else if (layer === 2) {
return (
<nav className="flex flex-col text-sm">
{PagesInfosAndEndpoints.map((page) => {
const isActive = firstLayerPage.name === page.name;
const Icon = getIconByName(page.icon);
if (isActive) {
return (
<div>
<Link
href={page.url}
className={`w-full p-4 rounded-xl m-1 flex items-center gap-2 bg-gray-100 hover:bg-gray-300`}
>
<Icon />
{page.title?.[lang as LanguagesSelectable]}
</Link>
<div className="mb-6 mt-3 px-4">
{secondLayerPage.map((subPage: any) => {
const SubIcon = getIconByName(subPage.icon);
const isActive = subPage.name === currentPage;
if (isActive) {
return (
<Link
key={subPage.name}
href={subPage.url}
className={`px-10 border-gray-100 rounded-xl border-2 m-1 select-none pointer-events-none drag w-full p-4 flex items-center gap-2 "bg-gray-700 `}
>
<SubIcon />
{subPage.title?.[lang as LanguagesSelectable]}
</Link>
<SecondLayerMenu
key={page.name}
page={page}
currentPage={currentPage}
mappedLayers={pages}
restrictionsList={restrictions}
lang={lang as LanguagesSelectable}
/>
);
} else {
return (
<Link
key={subPage.name}
href={subPage.url}
className={`w-full p-4 my-3 rounded-2xl m-1 flex items-center gap-2 bg-slate-300 hover:bg-slate-500`}
>
<SubIcon />
{subPage.title?.[lang as LanguagesSelectable]}
</Link>
);
}
})}
</div>
</div>
);
} else {
return (
<div>
<Link
href={page.url}
className={`w-full p-4 rounded-xl m-1 flex items-center gap-2 bg-gray-100 hover:bg-gray-300`}
>
<Icon />
{page.title?.[lang as LanguagesSelectable]}
</Link>
</div>
);
}
})}
</nav>
);

View File

@ -0,0 +1,212 @@
"use server";
import Link from "next/link";
import React from "react";
import { getIconByName } from "@/Icons/icons";
interface ButtonInterface {
url: string;
title: string;
Icon: React.FC;
}
interface MappedLayersInterface {
firstLayer: any;
secondLayer: any;
thirdLayer: any;
fourthLayer: any;
}
interface ActiveButtonInterface {
key: string;
url: string;
title: string;
Icon: React.FC;
}
interface RenderMenuInterface {
key: string;
page: any;
currentPage: string;
mappedLayers: any | MappedLayersInterface;
lang: string;
restrictionsList?: any;
}
const DisableButton: React.FC<ButtonInterface> = ({ url, title, Icon }) => {
return (
<Link
href={url}
className={`px-10 border-gray-100 rounded-xl border-2 m-1 select-none pointer-events-none drag w-full p-4 flex items-center gap-2 "bg-gray-700 `}
>
<Icon />
{title}
</Link>
);
};
const ActiveButton: React.FC<ActiveButtonInterface> = ({
key,
url,
title,
Icon,
}) => {
return (
<Link
key={key}
href={url}
className={`w-full p-4 my-3 rounded-2xl m-1 flex items-center gap-2 bg-slate-300 hover:bg-slate-500`}
>
<Icon />
{title}
</Link>
);
};
const ActiveButtonLight: React.FC<ActiveButtonInterface> = ({
key,
url,
title,
Icon,
}) => {
return (
<Link
key={key}
href={url}
className={`w-full p-4 rounded-xl m-1 flex items-center gap-2 bg-gray-100 hover:bg-gray-300`}
>
<Icon />
{title}
</Link>
);
};
const LayerButton: React.FC<ActiveButtonInterface> = ({
key,
url,
title,
Icon,
}) => {
return (
<Link
key={key}
href={url}
className={`px-10 border-gray-100 rounded-xl border-2 m-1 select-none pointer-events-none drag w-full p-4 flex items-center gap-2 "bg-gray-700 `}
>
<Icon />
{title}
</Link>
);
};
const FirstLayerMenu: React.FC<RenderMenuInterface> = ({
key,
page,
currentPage,
mappedLayers,
restrictionsList,
lang,
}) => {
if (restrictionsList.includes(String(page.name))) {
if (page.name === currentPage) {
return (
<div key={key}>
<DisableButton
url={page.url}
title={page.title?.[lang]}
Icon={getIconByName(page.icon)}
/>
<div className="mb-6 mt-3 px-4">
{mappedLayers.secondLayer.map((subPage: any) => {
if (restrictionsList.includes(String(subPage.name))) {
return (
<ActiveButton
key={subPage.name}
url={subPage.url}
title={subPage.title?.[lang]}
Icon={getIconByName(subPage.icon)}
/>
);
}
})}
</div>
</div>
);
}
if (restrictionsList.includes(String(page.name))) {
return (
<>
<ActiveButton
key={page.name}
url={page.url}
title={page.title?.[lang]}
Icon={getIconByName(page.icon)}
/>
</>
);
}
}
};
const SecondLayerMenu: React.FC<RenderMenuInterface> = ({
key,
page,
currentPage,
mappedLayers,
restrictionsList,
lang,
}) => {
if (restrictionsList.includes(String(mappedLayers.firstLayer.name))) {
if (mappedLayers.firstLayer.name === page.name) {
return (
<div key={key}>
<ActiveButton
key={page.name}
url={page.url}
title={page.title?.[lang]}
Icon={getIconByName(page.icon)}
/>
<div className="mb-6 mt-3 px-4">
{mappedLayers.secondLayer.map((subPage: any) => {
console.log("subPage", subPage);
if (restrictionsList.includes(String(subPage.name))) {
if (subPage.name === currentPage) {
return (
<LayerButton
key={subPage.name}
url={subPage.url}
title={subPage.title?.[lang]}
Icon={getIconByName(subPage.icon)}
/>
);
} else {
return (
<ActiveButton
key={subPage.name}
url={subPage.url}
title={subPage.title?.[lang]}
Icon={getIconByName(subPage.icon)}
/>
);
}
}
})}
</div>
</div>
);
}
if (restrictionsList.includes(String(page.name))) {
return (
<div>
<ActiveButton
key={page.name}
url={page.url}
title={page.title?.[lang]}
Icon={getIconByName(page.icon)}
/>
</div>
);
}
}
};
export { FirstLayerMenu, SecondLayerMenu };

View File

@ -51,8 +51,9 @@ export function getThreeLayerByPageName({
const thirdLayerPage = retrievePageByComponentName(thirdLayer || "", lang);
return {
firstLayer: firstLayerpage,
secondLayer: secondLayerPage,
thirdLayer: thirdLayerPage,
secondLayer: firstLayerpage?.subCategories || null,
thirdLayer: secondLayerPage?.subCategories || null,
fourthLayer: thirdLayerPage?.subCategories || null,
layer: 3,
};
}

View File

@ -12,7 +12,6 @@ const SelectEmployeeFrom: React.FC<InterfaceSelectEmployeeFrom> = ({
companyList,
}) => {
const router = useRouter();
console.log("companyList", companyList);
function onClick(data: any) {
loginSelectEmployee({ company_uu_id: data?.uu_id })
.then((responseData: any) => {