From 64b39d9cdecffa9c79f1bf145caff33ca550763b Mon Sep 17 00:00:00 2001
From: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Fri, 4 Sep 2026 15:06:01 +0800
Subject: [PATCH] refactor(ux): move template, report and tool pages into
tabbed/folder layout
Reorganize existing pages into the tabbed/folder navigation pattern:
- Template pages paired with their list pages via tabOptions.json tabs
- SharePoint/OneDrive Sharing and Permissions reports grouped under teams-share/reports/
- Template Library, Catalog and Package Manager grouped under tools/template-tools/
- Sidebar nav, universal search and legacy-path redirects updated to match
No backend or tenant Configuration-page changes; frontend navigation only.
---
.../CippCards/CippUniversalSearchV2.jsx | 30 ++-
frontend/src/layouts/config.jsx | 191 +++++-------------
.../contacts-template/index.jsx | 8 +-
.../email/administration/contacts/index.jsx | 8 +-
.../administration/contacts/tabOptions.json | 12 ++
.../index.jsx | 8 +-
.../tenant-allow-block-lists/index.jsx | 8 +-
.../tenant-allow-block-lists/tabOptions.json | 12 ++
.../list-connectionfilter-templates/index.jsx | 8 +-
.../list-connectionfilter/index.jsx | 8 +-
.../list-connectionfilter/tabOptions.json | 12 ++
.../spamfilter/list-spamfilter/index.jsx | 8 +-
.../list-spamfilter/tabOptions.json | 12 ++
.../email/spamfilter/list-templates/index.jsx | 8 +-
.../list-connector-templates/index.jsx | 8 +-
.../email/transport/list-connectors/index.jsx | 8 +-
.../transport/list-connectors/tabOptions.json | 12 ++
.../email/transport/list-rules/index.jsx | 8 +-
.../transport/list-rules/tabOptions.json | 12 ++
.../email/transport/list-templates/index.jsx | 8 +-
.../MEM/assignment-filter-templates/index.jsx | 8 +-
.../endpoint/MEM/assignment-filters/index.jsx | 8 +-
.../MEM/assignment-filters/tabOptions.json | 12 ++
.../endpoint/MEM/list-policies/index.jsx | 8 +-
.../MEM/list-policies/tabOptions.json | 12 ++
.../endpoint/MEM/list-templates/index.jsx | 8 +-
.../MEM/reusable-settings-templates/index.jsx | 8 +-
.../endpoint/MEM/reusable-settings/index.jsx | 8 +-
.../MEM/reusable-settings/tabOptions.json | 12 ++
.../endpoint/applications/list/index.jsx | 8 +-
.../applications/list/tabOptions.json | 12 ++
.../endpoint/applications/templates/index.jsx | 8 +-
.../administration/group-templates/index.jsx | 8 +-
.../identity/administration/groups/index.jsx | 8 +-
.../administration/groups/tabOptions.json | 12 ++
.../jit-admin-templates/index.jsx | 8 +-
.../administration/jit-admin/index.jsx | 8 +-
.../administration/jit-admin/tabOptions.json | 17 ++
.../jit-role-templates/index.jsx | 8 +-
.../compliance/dlp-templates/index.jsx | 8 +-
.../pages/security/compliance/dlp/index.jsx | 8 +-
.../security/compliance/dlp/tabOptions.json | 12 ++
.../compliance/labels-templates/index.jsx | 8 +-
.../security/compliance/labels/index.jsx | 8 +-
.../compliance/labels/tabOptions.json | 12 ++
.../compliance/retention-templates/index.jsx | 8 +-
.../security/compliance/retention/index.jsx | 8 +-
.../compliance/retention/tabOptions.json | 12 ++
.../compliance/sit-templates/index.jsx | 8 +-
.../pages/security/compliance/sit/index.jsx | 8 +-
.../security/compliance/sit/tabOptions.json | 12 ++
.../safelinks/safelinks-template/index.jsx | 8 +-
.../security/safelinks/safelinks/index.jsx | 8 +-
.../safelinks/safelinks/tabOptions.json | 12 ++
.../permissions-report/index.jsx | 28 +--
.../{ => reports}/sharing-report/index.jsx | 28 +--
.../sharepoint-templates/index.jsx | 8 +-
.../pages/teams-share/sharepoint/index.jsx | 8 +-
.../teams-share/sharepoint/tabOptions.json | 12 ++
.../conditional/list-policies/index.jsx | 8 +-
.../conditional/list-policies/tabOptions.json | 12 ++
.../conditional/list-template/index.jsx | 8 +-
.../community-repos/catalog.jsx | 10 +-
.../community-repos/index.jsx | 22 +-
.../community-repos/repo.jsx | 4 +-
.../template-packages/index.jsx | 6 +-
.../templatelib/index.jsx | 14 +-
frontend/src/utils/route-redirects.js | 13 ++
68 files changed, 648 insertions(+), 243 deletions(-)
create mode 100644 frontend/src/pages/email/administration/contacts/tabOptions.json
create mode 100644 frontend/src/pages/email/administration/tenant-allow-block-lists/tabOptions.json
create mode 100644 frontend/src/pages/email/spamfilter/list-connectionfilter/tabOptions.json
create mode 100644 frontend/src/pages/email/spamfilter/list-spamfilter/tabOptions.json
create mode 100644 frontend/src/pages/email/transport/list-connectors/tabOptions.json
create mode 100644 frontend/src/pages/email/transport/list-rules/tabOptions.json
create mode 100644 frontend/src/pages/endpoint/MEM/assignment-filters/tabOptions.json
create mode 100644 frontend/src/pages/endpoint/MEM/list-policies/tabOptions.json
create mode 100644 frontend/src/pages/endpoint/MEM/reusable-settings/tabOptions.json
create mode 100644 frontend/src/pages/endpoint/applications/list/tabOptions.json
create mode 100644 frontend/src/pages/identity/administration/groups/tabOptions.json
create mode 100644 frontend/src/pages/identity/administration/jit-admin/tabOptions.json
create mode 100644 frontend/src/pages/security/compliance/dlp/tabOptions.json
create mode 100644 frontend/src/pages/security/compliance/labels/tabOptions.json
create mode 100644 frontend/src/pages/security/compliance/retention/tabOptions.json
create mode 100644 frontend/src/pages/security/compliance/sit/tabOptions.json
create mode 100644 frontend/src/pages/security/safelinks/safelinks/tabOptions.json
rename frontend/src/pages/teams-share/{ => reports}/permissions-report/index.jsx (91%)
rename frontend/src/pages/teams-share/{ => reports}/sharing-report/index.jsx (94%)
create mode 100644 frontend/src/pages/teams-share/sharepoint/tabOptions.json
create mode 100644 frontend/src/pages/tenant/conditional/list-policies/tabOptions.json
rename frontend/src/pages/tools/{ => template-tools}/community-repos/catalog.jsx (84%)
rename frontend/src/pages/tools/{ => template-tools}/community-repos/index.jsx (96%)
rename frontend/src/pages/tools/{ => template-tools}/community-repos/repo.jsx (74%)
rename frontend/src/pages/tools/{ => template-tools}/template-packages/index.jsx (75%)
rename frontend/src/pages/tools/{ => template-tools}/templatelib/index.jsx (95%)
diff --git a/frontend/src/components/CippCards/CippUniversalSearchV2.jsx b/frontend/src/components/CippCards/CippUniversalSearchV2.jsx
index a017782e50..6b36f0f841 100644
--- a/frontend/src/components/CippCards/CippUniversalSearchV2.jsx
+++ b/frontend/src/components/CippCards/CippUniversalSearchV2.jsx
@@ -63,14 +63,35 @@ async function loadTabOptions() {
"/tenant/gdap-management",
"/tenant/gdap-management/relationships/relationship",
"/cipp/settings",
+ // Template pages folded into their parent pages as tabs — listed here so the
+ // universal page search still indexes them (they are no longer nav leaves).
+ "/email/administration/contacts",
+ "/email/administration/tenant-allow-block-lists",
+ "/email/transport/list-rules",
+ "/email/transport/list-connectors",
+ "/email/spamfilter/list-spamfilter",
+ "/email/spamfilter/list-connectionfilter",
+ "/security/safelinks/safelinks",
+ "/security/compliance/dlp",
+ "/security/compliance/retention",
+ "/security/compliance/labels",
+ "/security/compliance/sit",
+ "/identity/administration/groups",
+ "/identity/administration/jit-admin",
+ "/endpoint/MEM/list-policies",
+ "/endpoint/MEM/reusable-settings",
+ "/endpoint/MEM/assignment-filters",
+ "/endpoint/applications/list",
+ "/tenant/conditional/list-policies",
+ "/teams-share/sharepoint",
];
const tabOptions = [];
for (const basePath of tabOptionPaths) {
try {
- const module = await import(`../../pages${basePath}/tabOptions.json`);
- const options = module.default || module;
+ const tabModule = await import(`../../pages${basePath}/tabOptions.json`);
+ const options = tabModule.default || tabModule;
options.forEach((option) => {
tabOptions.push({
@@ -242,6 +263,11 @@ export const CippUniversalSearchV2 = React.forwardRef(
const normalizedTabPath = tab.path.replace(/\/$/, "");
const normalizedBasePath = tab.basePath?.replace(/\/$/, "");
+ // A tab whose own path is a real nav leaf is already surfaced as a Page result
+ // (every tabOptions list starts with its parent). Skip it here so it is not listed
+ // twice — the same page once as "Page" and once as "Tab".
+ if (leafItemIndex[normalizedTabPath]) return null;
+
let pageItem = leafItemIndex[normalizedTabPath];
if (!pageItem && normalizedBasePath) {
diff --git a/frontend/src/layouts/config.jsx b/frontend/src/layouts/config.jsx
index b6872c326f..809c9207da 100644
--- a/frontend/src/layouts/config.jsx
+++ b/frontend/src/layouts/config.jsx
@@ -46,12 +46,6 @@ export const nativeMenuItems = [
path: '/identity/administration/groups',
permissions: ['Identity.Group.*'],
},
- {
- title: 'Group Templates',
- path: '/identity/administration/group-templates',
- permissions: ['Identity.Group.*'],
- scope: 'global',
- },
{
title: 'Devices',
path: '/identity/administration/devices',
@@ -72,18 +66,6 @@ export const nativeMenuItems = [
path: '/identity/administration/jit-admin',
permissions: ['Identity.Role.*'],
},
- {
- title: 'JIT Admin Templates',
- path: '/identity/administration/jit-admin-templates',
- permissions: ['Identity.Role.*'],
- scope: 'global',
- },
- {
- title: 'JIT Role Templates',
- path: '/identity/administration/jit-role-templates',
- permissions: ['Identity.Role.*'],
- scope: 'global',
- },
{
title: 'Vacation Mode',
path: '/identity/administration/vacation-mode',
@@ -251,10 +233,9 @@ export const nativeMenuItems = [
permissions: ['Tenant.ConditionalAccess.*'],
},
{
- title: 'CA Templates',
- path: '/tenant/conditional/list-template',
+ title: 'CA Vacation Mode',
+ path: '/tenant/conditional/deploy-vacation',
permissions: ['Tenant.ConditionalAccess.*'],
- scope: 'global',
},
{
title: 'Named Locations',
@@ -406,12 +387,6 @@ export const nativeMenuItems = [
path: '/security/safelinks/safelinks',
permissions: ['Security.SafeLinksPolicy.*'],
},
- {
- title: 'Safe Links Templates',
- path: '/security/safelinks/safelinks-template',
- permissions: ['Security.SafeLinksPolicy.*'],
- scope: 'global',
- },
],
},
{
@@ -428,45 +403,21 @@ export const nativeMenuItems = [
path: '/security/compliance/dlp',
permissions: ['Security.DlpCompliancePolicy.*'],
},
- {
- title: 'DLP Policy Templates',
- path: '/security/compliance/dlp-templates',
- permissions: ['Security.DlpCompliancePolicy.*'],
- scope: 'global',
- },
{
title: 'Retention Policies',
path: '/security/compliance/retention',
permissions: ['Security.RetentionCompliancePolicy.*'],
},
- {
- title: 'Retention Policy Templates',
- path: '/security/compliance/retention-templates',
- permissions: ['Security.RetentionCompliancePolicy.*'],
- scope: 'global',
- },
{
title: 'Sensitivity Labels',
path: '/security/compliance/labels',
permissions: ['Security.SensitivityLabel.*'],
},
- {
- title: 'Sensitivity Label Templates',
- path: '/security/compliance/labels-templates',
- permissions: ['Security.SensitivityLabel.*'],
- scope: 'global',
- },
{
title: 'Sensitive Information Types',
path: '/security/compliance/sit',
permissions: ['Security.SensitiveInfoType.*'],
},
- {
- title: 'Sensitive Info Type Templates',
- path: '/security/compliance/sit-templates',
- permissions: ['Security.SensitiveInfoType.*'],
- scope: 'global',
- },
],
},
],
@@ -555,13 +506,6 @@ export const nativeMenuItems = [
path: '/endpoint/applications/queue',
permissions: ['Endpoint.Application.*'],
},
- {
- title: 'Application Templates',
- path: '/endpoint/applications/templates',
- docsPath: 'endpoint/applications/application-templates',
- permissions: ['Endpoint.Application.*'],
- scope: 'global',
- },
],
},
{
@@ -624,39 +568,18 @@ export const nativeMenuItems = [
docsPath: 'endpoint/mem/list-appprotection-policies',
permissions: ['Endpoint.MEM.*'],
},
- {
- title: 'Policy Templates',
- path: '/endpoint/MEM/list-templates',
- docsPath: 'endpoint/mem/list-templates',
- permissions: ['Endpoint.MEM.*'],
- scope: 'global',
- },
{
title: 'Reusable Settings',
path: '/endpoint/MEM/reusable-settings',
docsPath: 'endpoint/mem/reusable-settings',
permissions: ['Endpoint.MEM.*'],
},
- {
- title: 'Reusable Settings Templates',
- path: '/endpoint/MEM/reusable-settings-templates',
- docsPath: 'endpoint/mem/reusable-settings-templates',
- permissions: ['Endpoint.MEM.*'],
- scope: 'global',
- },
{
title: 'Assignment Filters',
path: '/endpoint/MEM/assignment-filters',
docsPath: 'endpoint/mem/assignment-filters',
permissions: ['Endpoint.MEM.*'],
},
- {
- title: 'Assignment Filter Templates',
- path: '/endpoint/MEM/assignment-filter-templates',
- docsPath: 'endpoint/mem/assignment-filter-templates',
- permissions: ['Endpoint.MEM.*'],
- scope: 'global',
- },
{
title: 'Scripts',
path: '/endpoint/MEM/list-scripts',
@@ -729,25 +652,28 @@ export const nativeMenuItems = [
path: '/teams-share/sharepoint',
permissions: ['Sharepoint.Admin.*'],
},
- {
- title: 'SharePoint Templates',
- path: '/teams-share/sharepoint-templates',
- permissions: ['Sharepoint.Admin.*'],
- },
{
title: 'Deleted Sites',
path: '/teams-share/deleted-sites',
permissions: ['Sharepoint.Admin.*'],
},
{
- title: 'Sharing Report',
- path: '/teams-share/sharing-report',
- permissions: ['Sharepoint.Site.*'],
- },
- {
- title: 'Permissions Report',
- path: '/teams-share/permissions-report',
+ title: 'Reports',
permissions: ['Sharepoint.Site.*'],
+ items: [
+ {
+ title: 'Sharing Report',
+ path: '/teams-share/reports/sharing-report',
+ docsPath: 'teams-share/sharing-report',
+ permissions: ['Sharepoint.Site.*'],
+ },
+ {
+ title: 'Permissions Report',
+ path: '/teams-share/reports/permissions-report',
+ docsPath: 'teams-share/permissions-report',
+ permissions: ['Sharepoint.Site.*'],
+ },
+ ],
},
{
title: 'External Users',
@@ -828,12 +754,6 @@ export const nativeMenuItems = [
path: '/email/administration/contacts',
permissions: ['Exchange.Contact.*'],
},
- {
- title: 'Contact Templates',
- path: '/email/administration/contacts-template',
- permissions: ['Exchange.Contact.*'],
- scope: 'global',
- },
{
title: 'Quarantine',
path: '/email/administration/quarantine',
@@ -849,12 +769,6 @@ export const nativeMenuItems = [
path: '/email/administration/tenant-allow-block-lists',
permissions: ['Exchange.SpamFilter.*'],
},
- {
- title: 'Allow/Block List Templates',
- path: '/email/administration/tenant-allow-block-list-templates',
- permissions: ['Exchange.SpamFilter.*'],
- scope: 'global',
- },
{
title: 'Retention Policies & Tags',
path: '/email/administration/exchange-retention/policies',
@@ -871,23 +785,11 @@ export const nativeMenuItems = [
path: '/email/transport/list-rules',
permissions: ['Exchange.TransportRule.*'],
},
- {
- title: 'Transport Templates',
- path: '/email/transport/list-templates',
- permissions: ['Exchange.TransportRule.*'],
- scope: 'global',
- },
{
title: 'Connectors',
path: '/email/transport/list-connectors',
permissions: ['Exchange.Connector.*'],
},
- {
- title: 'Connector Templates',
- path: '/email/transport/list-connector-templates',
- permissions: ['Exchange.Connector.*'],
- scope: 'global',
- },
],
},
{
@@ -899,23 +801,11 @@ export const nativeMenuItems = [
path: '/email/spamfilter/list-spamfilter',
permissions: ['Exchange.SpamFilter.*'],
},
- {
- title: 'Spamfilter Templates',
- path: '/email/spamfilter/list-templates',
- permissions: ['Exchange.SpamFilter.*'],
- scope: 'global',
- },
{
title: 'Connection Filter',
path: '/email/spamfilter/list-connectionfilter',
permissions: ['Exchange.ConnectionFilter.*'],
},
- {
- title: 'Connection Filter Templates',
- path: '/email/spamfilter/list-connectionfilter-templates',
- permissions: ['Exchange.ConnectionFilter.*'],
- scope: 'global',
- },
{
title: 'Quarantine Policies',
path: '/email/spamfilter/list-quarantine-policies',
@@ -1158,25 +1048,34 @@ export const nativeMenuItems = [
scope: 'global',
},
{
- title: 'Template Library',
- path: '/tools/templatelib',
- roles: ['editor', 'admin', 'superadmin'],
- permissions: ['CIPP.Core.*'],
- scope: 'global',
- },
- {
- title: 'Catalog',
- path: '/tools/community-repos',
- roles: ['editor', 'admin', 'superadmin'],
- permissions: ['CIPP.Core.*'],
- scope: 'global',
- },
- {
- title: 'Template Package Manager',
- path: '/tools/template-packages',
- roles: ['editor', 'admin', 'superadmin'],
- permissions: ['Tenant.ConditionalAccess.*', 'Endpoint.MEM.*'],
- scope: 'global',
+ title: 'Template Tools',
+ permissions: ['CIPP.Core.*', 'Tenant.ConditionalAccess.*', 'Endpoint.MEM.*'],
+ items: [
+ {
+ title: 'Template Library',
+ path: '/tools/template-tools/templatelib',
+ docsPath: 'tools/templatelib',
+ roles: ['editor', 'admin', 'superadmin'],
+ permissions: ['CIPP.Core.*'],
+ scope: 'global',
+ },
+ {
+ title: 'Catalog',
+ path: '/tools/template-tools/community-repos',
+ docsPath: 'tools/community-repos',
+ roles: ['editor', 'admin', 'superadmin'],
+ permissions: ['CIPP.Core.*'],
+ scope: 'global',
+ },
+ {
+ title: 'Template Package Manager',
+ path: '/tools/template-tools/template-packages',
+ docsPath: 'tools/template-packages',
+ roles: ['editor', 'admin', 'superadmin'],
+ permissions: ['Tenant.ConditionalAccess.*', 'Endpoint.MEM.*'],
+ scope: 'global',
+ },
+ ],
},
{
title: 'Scheduler',
diff --git a/frontend/src/pages/email/administration/contacts-template/index.jsx b/frontend/src/pages/email/administration/contacts-template/index.jsx
index 81bedc7302..2d7f3e6890 100644
--- a/frontend/src/pages/email/administration/contacts-template/index.jsx
+++ b/frontend/src/pages/email/administration/contacts-template/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "../contacts/tabOptions.json";
import { CippIcons } from "../../../../utils/icon-registry"
import { Button } from "@mui/material";
import Link from "next/link";
@@ -112,5 +114,9 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/email/administration/contacts/index.jsx b/frontend/src/pages/email/administration/contacts/index.jsx
index 9e3d08916c..d4ebd719e9 100644
--- a/frontend/src/pages/email/administration/contacts/index.jsx
+++ b/frontend/src/pages/email/administration/contacts/index.jsx
@@ -1,6 +1,8 @@
import { useMemo } from "react";
import { CippIcons } from "../../../../utils/icon-registry"
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "./tabOptions.json";
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import { CippAddContactDrawer } from "../../../../components/CippComponents/CippAddContactDrawer";
import { CippDeployContactTemplateDrawer } from "../../../../components/CippComponents/CippDeployContactTemplateDrawer";
@@ -106,5 +108,9 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/email/administration/contacts/tabOptions.json b/frontend/src/pages/email/administration/contacts/tabOptions.json
new file mode 100644
index 0000000000..bb36cc7757
--- /dev/null
+++ b/frontend/src/pages/email/administration/contacts/tabOptions.json
@@ -0,0 +1,12 @@
+[
+ {
+ "label": "Contacts",
+ "path": "/email/administration/contacts",
+ "icon": "People"
+ },
+ {
+ "label": "Contact Templates",
+ "path": "/email/administration/contacts-template",
+ "icon": "Description"
+ }
+]
diff --git a/frontend/src/pages/email/administration/tenant-allow-block-list-templates/index.jsx b/frontend/src/pages/email/administration/tenant-allow-block-list-templates/index.jsx
index f4f586c3f5..db4a47b09c 100644
--- a/frontend/src/pages/email/administration/tenant-allow-block-list-templates/index.jsx
+++ b/frontend/src/pages/email/administration/tenant-allow-block-list-templates/index.jsx
@@ -1,6 +1,8 @@
import { useState } from 'react'
import { CippIcons } from '../../../../utils/icon-registry'
import { Layout as DashboardLayout } from '../../../../layouts/index'
+import { TabbedLayout } from '../../../../layouts/TabbedLayout'
+import tabOptions from '../tenant-allow-block-lists/tabOptions.json'
import { CippTablePage } from '../../../../components/CippComponents/CippTablePage.jsx'
import CippJsonView from '../../../../components/CippFormPages/CippJSONView'
import { CippTenantAllowBlockListTemplateDrawer } from '../../../../components/CippComponents/CippTenantAllowBlockListTemplateDrawer.jsx'
@@ -72,5 +74,9 @@ const Page = () => {
)
}
-Page.getLayout = (page) => {page}
+Page.getLayout = (page) => (
+
+ {page}
+
+)
export default Page
diff --git a/frontend/src/pages/email/administration/tenant-allow-block-lists/index.jsx b/frontend/src/pages/email/administration/tenant-allow-block-lists/index.jsx
index 901c58d3ef..be32a7fd05 100644
--- a/frontend/src/pages/email/administration/tenant-allow-block-lists/index.jsx
+++ b/frontend/src/pages/email/administration/tenant-allow-block-lists/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from '../../../../layouts/index'
+import { TabbedLayout } from '../../../../layouts/TabbedLayout'
+import tabOptions from './tabOptions.json'
import { CippIcons } from '../../../../utils/icon-registry'
import { CippTablePage } from '../../../../components/CippComponents/CippTablePage.jsx'
import { CippAddTenantAllowBlockListDrawer } from '../../../../components/CippComponents/CippAddTenantAllowBlockListDrawer.jsx'
@@ -72,6 +74,10 @@ const Page = () => {
);
}
-Page.getLayout = (page) => {page}
+Page.getLayout = (page) => (
+
+ {page}
+
+)
export default Page
diff --git a/frontend/src/pages/email/administration/tenant-allow-block-lists/tabOptions.json b/frontend/src/pages/email/administration/tenant-allow-block-lists/tabOptions.json
new file mode 100644
index 0000000000..f611f7fddc
--- /dev/null
+++ b/frontend/src/pages/email/administration/tenant-allow-block-lists/tabOptions.json
@@ -0,0 +1,12 @@
+[
+ {
+ "label": "Tenant Allow/Block Lists",
+ "path": "/email/administration/tenant-allow-block-lists",
+ "icon": "Block"
+ },
+ {
+ "label": "Allow/Block List Templates",
+ "path": "/email/administration/tenant-allow-block-list-templates",
+ "icon": "Description"
+ }
+]
diff --git a/frontend/src/pages/email/spamfilter/list-connectionfilter-templates/index.jsx b/frontend/src/pages/email/spamfilter/list-connectionfilter-templates/index.jsx
index 0d1e9ff097..e4a5e695d5 100644
--- a/frontend/src/pages/email/spamfilter/list-connectionfilter-templates/index.jsx
+++ b/frontend/src/pages/email/spamfilter/list-connectionfilter-templates/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "../list-connectionfilter/tabOptions.json";
import { CippIcons } from "../../../../utils/icon-registry"
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import { ApiGetCall } from "../../../../api/ApiCall";
@@ -99,5 +101,9 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/email/spamfilter/list-connectionfilter/index.jsx b/frontend/src/pages/email/spamfilter/list-connectionfilter/index.jsx
index 9255ae4573..e152268c7c 100644
--- a/frontend/src/pages/email/spamfilter/list-connectionfilter/index.jsx
+++ b/frontend/src/pages/email/spamfilter/list-connectionfilter/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "./tabOptions.json";
import { CippIcons } from "../../../../utils/icon-registry"
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import { Button } from "@mui/material";
@@ -58,5 +60,9 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/email/spamfilter/list-connectionfilter/tabOptions.json b/frontend/src/pages/email/spamfilter/list-connectionfilter/tabOptions.json
new file mode 100644
index 0000000000..5f42cda43e
--- /dev/null
+++ b/frontend/src/pages/email/spamfilter/list-connectionfilter/tabOptions.json
@@ -0,0 +1,12 @@
+[
+ {
+ "label": "Connection Filter",
+ "path": "/email/spamfilter/list-connectionfilter",
+ "icon": "FilterAlt"
+ },
+ {
+ "label": "Connection Filter Templates",
+ "path": "/email/spamfilter/list-connectionfilter-templates",
+ "icon": "Description"
+ }
+]
diff --git a/frontend/src/pages/email/spamfilter/list-spamfilter/index.jsx b/frontend/src/pages/email/spamfilter/list-spamfilter/index.jsx
index 3761252308..67f453ccd6 100644
--- a/frontend/src/pages/email/spamfilter/list-spamfilter/index.jsx
+++ b/frontend/src/pages/email/spamfilter/list-spamfilter/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "./tabOptions.json";
import { CippIcons } from "../../../../utils/icon-registry"
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import { Button } from "@mui/material";
@@ -112,5 +114,9 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/email/spamfilter/list-spamfilter/tabOptions.json b/frontend/src/pages/email/spamfilter/list-spamfilter/tabOptions.json
new file mode 100644
index 0000000000..e408134bd0
--- /dev/null
+++ b/frontend/src/pages/email/spamfilter/list-spamfilter/tabOptions.json
@@ -0,0 +1,12 @@
+[
+ {
+ "label": "Spamfilter",
+ "path": "/email/spamfilter/list-spamfilter",
+ "icon": "Shield"
+ },
+ {
+ "label": "Spamfilter Templates",
+ "path": "/email/spamfilter/list-templates",
+ "icon": "Description"
+ }
+]
diff --git a/frontend/src/pages/email/spamfilter/list-templates/index.jsx b/frontend/src/pages/email/spamfilter/list-templates/index.jsx
index 0db4af52d0..7df7f7bca1 100644
--- a/frontend/src/pages/email/spamfilter/list-templates/index.jsx
+++ b/frontend/src/pages/email/spamfilter/list-templates/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "../list-spamfilter/tabOptions.json";
import { CippIcons } from "../../../../utils/icon-registry"
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import { ApiGetCall } from "../../../../api/ApiCall";
@@ -97,5 +99,9 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/email/transport/list-connector-templates/index.jsx b/frontend/src/pages/email/transport/list-connector-templates/index.jsx
index 2c75eed0ec..1958cdb92a 100644
--- a/frontend/src/pages/email/transport/list-connector-templates/index.jsx
+++ b/frontend/src/pages/email/transport/list-connector-templates/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "../list-connectors/tabOptions.json";
import { CippIcons } from "../../../../utils/icon-registry"
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import ConnectorTemplateDetails from "../../../../components/CippComponents/ConnectorTemplateDetails";
@@ -92,5 +94,9 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/email/transport/list-connectors/index.jsx b/frontend/src/pages/email/transport/list-connectors/index.jsx
index 360439362a..4d9e0766ac 100644
--- a/frontend/src/pages/email/transport/list-connectors/index.jsx
+++ b/frontend/src/pages/email/transport/list-connectors/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "./tabOptions.json";
import { CippIcons } from "../../../../utils/icon-registry"
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import { CippAddConnectorDrawer } from "../../../../components/CippComponents/CippAddConnectorDrawer";
@@ -105,5 +107,9 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/email/transport/list-connectors/tabOptions.json b/frontend/src/pages/email/transport/list-connectors/tabOptions.json
new file mode 100644
index 0000000000..7d4265b6dc
--- /dev/null
+++ b/frontend/src/pages/email/transport/list-connectors/tabOptions.json
@@ -0,0 +1,12 @@
+[
+ {
+ "label": "Connectors",
+ "path": "/email/transport/list-connectors",
+ "icon": "SettingsEthernet"
+ },
+ {
+ "label": "Connector Templates",
+ "path": "/email/transport/list-connector-templates",
+ "icon": "Description"
+ }
+]
diff --git a/frontend/src/pages/email/transport/list-rules/index.jsx b/frontend/src/pages/email/transport/list-rules/index.jsx
index 95aa3a761a..90f7984485 100644
--- a/frontend/src/pages/email/transport/list-rules/index.jsx
+++ b/frontend/src/pages/email/transport/list-rules/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "./tabOptions.json";
import { CippIcons } from "../../../../utils/icon-registry"
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import { CippAddTransportRuleDrawer } from "../../../../components/CippComponents/CippAddTransportRuleDrawer";
@@ -146,5 +148,9 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/email/transport/list-rules/tabOptions.json b/frontend/src/pages/email/transport/list-rules/tabOptions.json
new file mode 100644
index 0000000000..e0018902b3
--- /dev/null
+++ b/frontend/src/pages/email/transport/list-rules/tabOptions.json
@@ -0,0 +1,12 @@
+[
+ {
+ "label": "Transport Rules",
+ "path": "/email/transport/list-rules",
+ "icon": "Mail"
+ },
+ {
+ "label": "Transport Templates",
+ "path": "/email/transport/list-templates",
+ "icon": "Description"
+ }
+]
diff --git a/frontend/src/pages/email/transport/list-templates/index.jsx b/frontend/src/pages/email/transport/list-templates/index.jsx
index 889f8f3227..06ff763aea 100644
--- a/frontend/src/pages/email/transport/list-templates/index.jsx
+++ b/frontend/src/pages/email/transport/list-templates/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "../list-rules/tabOptions.json";
import { CippIcons } from "../../../../utils/icon-registry"
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import { ApiGetCall } from "../../../../api/ApiCall";
@@ -88,5 +90,9 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/endpoint/MEM/assignment-filter-templates/index.jsx b/frontend/src/pages/endpoint/MEM/assignment-filter-templates/index.jsx
index e7ab411a2b..bf38d28f77 100644
--- a/frontend/src/pages/endpoint/MEM/assignment-filter-templates/index.jsx
+++ b/frontend/src/pages/endpoint/MEM/assignment-filter-templates/index.jsx
@@ -2,6 +2,8 @@ import { Button } from "@mui/material";
import { CippIcons } from "../../../../utils/icon-registry"
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "../assignment-filters/tabOptions.json";
import Link from "next/link";
import { ApiGetCall } from "../../../../api/ApiCall";
import { CippPropertyListCard } from "../../../../components/CippCards/CippPropertyListCard";
@@ -129,6 +131,10 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/endpoint/MEM/assignment-filters/index.jsx b/frontend/src/pages/endpoint/MEM/assignment-filters/index.jsx
index b88a40ddf6..1e9be7f2ae 100644
--- a/frontend/src/pages/endpoint/MEM/assignment-filters/index.jsx
+++ b/frontend/src/pages/endpoint/MEM/assignment-filters/index.jsx
@@ -2,6 +2,8 @@ import { Button } from "@mui/material";
import { CippIcons } from "../../../../utils/icon-registry"
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "./tabOptions.json";
import Link from "next/link";
import { Stack } from "@mui/system";
import { useCippReportDB } from "../../../../components/CippComponents/CippReportDBControls";
@@ -104,6 +106,10 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/endpoint/MEM/assignment-filters/tabOptions.json b/frontend/src/pages/endpoint/MEM/assignment-filters/tabOptions.json
new file mode 100644
index 0000000000..f2e5cb0c84
--- /dev/null
+++ b/frontend/src/pages/endpoint/MEM/assignment-filters/tabOptions.json
@@ -0,0 +1,12 @@
+[
+ {
+ "label": "Assignment Filters",
+ "path": "/endpoint/MEM/assignment-filters",
+ "icon": "FilterList"
+ },
+ {
+ "label": "Assignment Filter Templates",
+ "path": "/endpoint/MEM/assignment-filter-templates",
+ "icon": "Description"
+ }
+]
diff --git a/frontend/src/pages/endpoint/MEM/list-policies/index.jsx b/frontend/src/pages/endpoint/MEM/list-policies/index.jsx
index 35390d845b..d0d29207a8 100644
--- a/frontend/src/pages/endpoint/MEM/list-policies/index.jsx
+++ b/frontend/src/pages/endpoint/MEM/list-policies/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from '../../../../layouts/index'
+import { TabbedLayout } from '../../../../layouts/TabbedLayout'
+import tabOptions from './tabOptions.json'
import { CippTablePage } from '../../../../components/CippComponents/CippTablePage.jsx'
import { PermissionButton } from '../../../../utils/permissions'
import { CippPolicyDeployDrawer } from '../../../../components/CippComponents/CippPolicyDeployDrawer.jsx'
@@ -80,5 +82,9 @@ const Page = () => {
);
}
-Page.getLayout = (page) => {page}
+Page.getLayout = (page) => (
+
+ {page}
+
+)
export default Page
diff --git a/frontend/src/pages/endpoint/MEM/list-policies/tabOptions.json b/frontend/src/pages/endpoint/MEM/list-policies/tabOptions.json
new file mode 100644
index 0000000000..724b7aed9e
--- /dev/null
+++ b/frontend/src/pages/endpoint/MEM/list-policies/tabOptions.json
@@ -0,0 +1,12 @@
+[
+ {
+ "label": "Configuration Policies",
+ "path": "/endpoint/MEM/list-policies",
+ "icon": "Settings"
+ },
+ {
+ "label": "Policy Templates",
+ "path": "/endpoint/MEM/list-templates",
+ "icon": "Description"
+ }
+]
diff --git a/frontend/src/pages/endpoint/MEM/list-templates/index.jsx b/frontend/src/pages/endpoint/MEM/list-templates/index.jsx
index 584bc73d50..772b81aee8 100644
--- a/frontend/src/pages/endpoint/MEM/list-templates/index.jsx
+++ b/frontend/src/pages/endpoint/MEM/list-templates/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from '../../../../layouts/index'
+import { TabbedLayout } from '../../../../layouts/TabbedLayout'
+import tabOptions from '../list-policies/tabOptions.json'
import { CippIcons } from '../../../../utils/icon-registry'
import { CippTablePage } from '../../../../components/CippComponents/CippTablePage.jsx'
import CippJsonView from '../../../../components/CippFormPages/CippJSONView'
@@ -278,5 +280,9 @@ const Page = () => {
)
}
-Page.getLayout = (page) => {page}
+Page.getLayout = (page) => (
+
+ {page}
+
+)
export default Page
diff --git a/frontend/src/pages/endpoint/MEM/reusable-settings-templates/index.jsx b/frontend/src/pages/endpoint/MEM/reusable-settings-templates/index.jsx
index a4cf637035..8827a7e3a5 100644
--- a/frontend/src/pages/endpoint/MEM/reusable-settings-templates/index.jsx
+++ b/frontend/src/pages/endpoint/MEM/reusable-settings-templates/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "../reusable-settings/tabOptions.json";
import { CippIcons } from "../../../../utils/icon-registry"
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import CippJsonView from "../../../../components/CippFormPages/CippJSONView";
@@ -105,5 +107,9 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/endpoint/MEM/reusable-settings/index.jsx b/frontend/src/pages/endpoint/MEM/reusable-settings/index.jsx
index 5d0cc3e469..40480c5d20 100644
--- a/frontend/src/pages/endpoint/MEM/reusable-settings/index.jsx
+++ b/frontend/src/pages/endpoint/MEM/reusable-settings/index.jsx
@@ -3,6 +3,8 @@ import { CippIcons } from "../../../../utils/icon-registry"
import { CippReusableSettingsDeployDrawer } from "../../../../components/CippComponents/CippReusableSettingsDeployDrawer.jsx";
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "./tabOptions.json";
import { useSettings } from "../../../../hooks/use-settings";
import CippJsonView from "../../../../components/CippFormPages/CippJSONView";
import { Stack } from "@mui/system";
@@ -93,6 +95,10 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/endpoint/MEM/reusable-settings/tabOptions.json b/frontend/src/pages/endpoint/MEM/reusable-settings/tabOptions.json
new file mode 100644
index 0000000000..cf18a774cd
--- /dev/null
+++ b/frontend/src/pages/endpoint/MEM/reusable-settings/tabOptions.json
@@ -0,0 +1,12 @@
+[
+ {
+ "label": "Reusable Settings",
+ "path": "/endpoint/MEM/reusable-settings",
+ "icon": "Tune"
+ },
+ {
+ "label": "Reusable Settings Templates",
+ "path": "/endpoint/MEM/reusable-settings-templates",
+ "icon": "Description"
+ }
+]
diff --git a/frontend/src/pages/endpoint/applications/list/index.jsx b/frontend/src/pages/endpoint/applications/list/index.jsx
index 75892b0cb4..fc05ede350 100644
--- a/frontend/src/pages/endpoint/applications/list/index.jsx
+++ b/frontend/src/pages/endpoint/applications/list/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from '../../../../layouts/index'
+import { TabbedLayout } from '../../../../layouts/TabbedLayout'
+import tabOptions from './tabOptions.json'
import { CippIcons } from '../../../../utils/icon-registry'
import { CippTablePage } from '../../../../components/CippComponents/CippTablePage.jsx'
import { CippApiDialog } from '../../../../components/CippComponents/CippApiDialog.jsx'
@@ -408,5 +410,9 @@ const Page = () => {
);
}
-Page.getLayout = (page) => {page}
+Page.getLayout = (page) => (
+
+ {page}
+
+)
export default Page
diff --git a/frontend/src/pages/endpoint/applications/list/tabOptions.json b/frontend/src/pages/endpoint/applications/list/tabOptions.json
new file mode 100644
index 0000000000..8ff927a43e
--- /dev/null
+++ b/frontend/src/pages/endpoint/applications/list/tabOptions.json
@@ -0,0 +1,12 @@
+[
+ {
+ "label": "Applications",
+ "path": "/endpoint/applications/list",
+ "icon": "Apps"
+ },
+ {
+ "label": "Application Templates",
+ "path": "/endpoint/applications/templates",
+ "icon": "Description"
+ }
+]
diff --git a/frontend/src/pages/endpoint/applications/templates/index.jsx b/frontend/src/pages/endpoint/applications/templates/index.jsx
index 89ac3d1e39..6e2ea924a1 100644
--- a/frontend/src/pages/endpoint/applications/templates/index.jsx
+++ b/frontend/src/pages/endpoint/applications/templates/index.jsx
@@ -1,6 +1,8 @@
import { useState } from 'react'
import { CippIcons } from '../../../../utils/icon-registry'
import { Layout as DashboardLayout } from '../../../../layouts/index'
+import { TabbedLayout } from '../../../../layouts/TabbedLayout'
+import tabOptions from '../list/tabOptions.json'
import { CippTablePage } from '../../../../components/CippComponents/CippTablePage.jsx'
import { CippAppTemplateDrawer } from '../../../../components/CippComponents/CippAppTemplateDrawer'
import CippJsonView from '../../../../components/CippFormPages/CippJSONView'
@@ -179,5 +181,9 @@ const Page = () => {
)
}
-Page.getLayout = (page) => {page}
+Page.getLayout = (page) => (
+
+ {page}
+
+)
export default Page
diff --git a/frontend/src/pages/identity/administration/group-templates/index.jsx b/frontend/src/pages/identity/administration/group-templates/index.jsx
index 862a86389c..df7ff621c8 100644
--- a/frontend/src/pages/identity/administration/group-templates/index.jsx
+++ b/frontend/src/pages/identity/administration/group-templates/index.jsx
@@ -2,6 +2,8 @@ import { Button } from "@mui/material";
import { CippIcons } from "../../../../utils/icon-registry"
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "../groups/tabOptions.json";
import Link from "next/link";
import { ApiGetCall } from "../../../../api/ApiCall";
import { CippPropertyListCard } from "../../../../components/CippCards/CippPropertyListCard";
@@ -129,6 +131,10 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/identity/administration/groups/index.jsx b/frontend/src/pages/identity/administration/groups/index.jsx
index b0d966123e..ca492a218a 100644
--- a/frontend/src/pages/identity/administration/groups/index.jsx
+++ b/frontend/src/pages/identity/administration/groups/index.jsx
@@ -2,6 +2,8 @@ import { Button } from '@mui/material'
import { CippIcons } from '../../../../utils/icon-registry'
import { CippTablePage } from '../../../../components/CippComponents/CippTablePage.jsx'
import { Layout as DashboardLayout } from '../../../../layouts/index'
+import { TabbedLayout } from '../../../../layouts/TabbedLayout'
+import tabOptions from './tabOptions.json'
import Link from 'next/link'
import { Stack } from '@mui/system'
import { useSettings } from '../../../../hooks/use-settings'
@@ -655,6 +657,10 @@ const Page = () => {
);
}
-Page.getLayout = (page) => {page}
+Page.getLayout = (page) => (
+
+ {page}
+
+)
export default Page
diff --git a/frontend/src/pages/identity/administration/groups/tabOptions.json b/frontend/src/pages/identity/administration/groups/tabOptions.json
new file mode 100644
index 0000000000..28224bb376
--- /dev/null
+++ b/frontend/src/pages/identity/administration/groups/tabOptions.json
@@ -0,0 +1,12 @@
+[
+ {
+ "label": "Groups",
+ "path": "/identity/administration/groups",
+ "icon": "Groups"
+ },
+ {
+ "label": "Group Templates",
+ "path": "/identity/administration/group-templates",
+ "icon": "Description"
+ }
+]
diff --git a/frontend/src/pages/identity/administration/jit-admin-templates/index.jsx b/frontend/src/pages/identity/administration/jit-admin-templates/index.jsx
index 3ca0d84b89..9ec39e6e1a 100644
--- a/frontend/src/pages/identity/administration/jit-admin-templates/index.jsx
+++ b/frontend/src/pages/identity/administration/jit-admin-templates/index.jsx
@@ -2,6 +2,8 @@ import { Button } from "@mui/material";
import { CippIcons } from "../../../../utils/icon-registry"
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "../jit-admin/tabOptions.json";
import Link from "next/link";
import { ApiGetCall } from "../../../../api/ApiCall";
import { CippPropertyListCard } from "../../../../components/CippCards/CippPropertyListCard";
@@ -136,6 +138,10 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/identity/administration/jit-admin/index.jsx b/frontend/src/pages/identity/administration/jit-admin/index.jsx
index 62bb5ab167..61b6676aac 100644
--- a/frontend/src/pages/identity/administration/jit-admin/index.jsx
+++ b/frontend/src/pages/identity/administration/jit-admin/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "./tabOptions.json";
import { CippIcons } from "../../../../utils/icon-registry"
import CippTablePage from "../../../../components/CippComponents/CippTablePage";
import { Button } from "@mui/material";
@@ -48,6 +50,10 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/identity/administration/jit-admin/tabOptions.json b/frontend/src/pages/identity/administration/jit-admin/tabOptions.json
new file mode 100644
index 0000000000..558d21283c
--- /dev/null
+++ b/frontend/src/pages/identity/administration/jit-admin/tabOptions.json
@@ -0,0 +1,17 @@
+[
+ {
+ "label": "JIT Admin",
+ "path": "/identity/administration/jit-admin",
+ "icon": "AdminPanelSettings"
+ },
+ {
+ "label": "JIT Admin Templates",
+ "path": "/identity/administration/jit-admin-templates",
+ "icon": "Description"
+ },
+ {
+ "label": "JIT Role Templates",
+ "path": "/identity/administration/jit-role-templates",
+ "icon": "Description"
+ }
+]
diff --git a/frontend/src/pages/identity/administration/jit-role-templates/index.jsx b/frontend/src/pages/identity/administration/jit-role-templates/index.jsx
index 2c76126ddf..686ad4b714 100644
--- a/frontend/src/pages/identity/administration/jit-role-templates/index.jsx
+++ b/frontend/src/pages/identity/administration/jit-role-templates/index.jsx
@@ -2,6 +2,8 @@ import { Button } from "@mui/material";
import { CippIcons } from "../../../../utils/icon-registry"
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "../jit-admin/tabOptions.json";
import Link from "next/link";
import { CippPropertyListCard } from "../../../../components/CippCards/CippPropertyListCard";
import { getCippTranslation } from "../../../../utils/get-cipp-translation";
@@ -73,6 +75,10 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/security/compliance/dlp-templates/index.jsx b/frontend/src/pages/security/compliance/dlp-templates/index.jsx
index 7d8152d7d0..40eda5d543 100644
--- a/frontend/src/pages/security/compliance/dlp-templates/index.jsx
+++ b/frontend/src/pages/security/compliance/dlp-templates/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "../dlp/tabOptions.json";
import { CippIcons } from "../../../../utils/icon-registry"
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import { ApiGetCall } from "../../../../api/ApiCall";
@@ -103,5 +105,9 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/security/compliance/dlp/index.jsx b/frontend/src/pages/security/compliance/dlp/index.jsx
index 842282aaee..6f6b47c533 100644
--- a/frontend/src/pages/security/compliance/dlp/index.jsx
+++ b/frontend/src/pages/security/compliance/dlp/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from '../../../../layouts/index'
+import { TabbedLayout } from '../../../../layouts/TabbedLayout'
+import tabOptions from './tabOptions.json'
import { CippIcons } from '../../../../utils/icon-registry'
import { CippTablePage } from '../../../../components/CippComponents/CippTablePage.jsx'
import { CippDeployCompliancePolicyDrawer } from '../../../../components/CippComponents/CippDeployCompliancePolicyDrawer.jsx'
@@ -110,5 +112,9 @@ const Page = () => {
)
}
-Page.getLayout = (page) => {page}
+Page.getLayout = (page) => (
+
+ {page}
+
+)
export default Page
diff --git a/frontend/src/pages/security/compliance/dlp/tabOptions.json b/frontend/src/pages/security/compliance/dlp/tabOptions.json
new file mode 100644
index 0000000000..2e2eca98fd
--- /dev/null
+++ b/frontend/src/pages/security/compliance/dlp/tabOptions.json
@@ -0,0 +1,12 @@
+[
+ {
+ "label": "DLP Policies",
+ "path": "/security/compliance/dlp",
+ "icon": "Policy"
+ },
+ {
+ "label": "DLP Policy Templates",
+ "path": "/security/compliance/dlp-templates",
+ "icon": "Description"
+ }
+]
diff --git a/frontend/src/pages/security/compliance/labels-templates/index.jsx b/frontend/src/pages/security/compliance/labels-templates/index.jsx
index 4f7eb4dfd5..46284bfa9e 100644
--- a/frontend/src/pages/security/compliance/labels-templates/index.jsx
+++ b/frontend/src/pages/security/compliance/labels-templates/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "../labels/tabOptions.json";
import { CippIcons } from "../../../../utils/icon-registry"
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import { ApiGetCall } from "../../../../api/ApiCall";
@@ -110,5 +112,9 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/security/compliance/labels/index.jsx b/frontend/src/pages/security/compliance/labels/index.jsx
index 8a47097ae7..5167aaa5ec 100644
--- a/frontend/src/pages/security/compliance/labels/index.jsx
+++ b/frontend/src/pages/security/compliance/labels/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from '../../../../layouts/index'
+import { TabbedLayout } from '../../../../layouts/TabbedLayout'
+import tabOptions from './tabOptions.json'
import { CippIcons } from '../../../../utils/icon-registry'
import { CippTablePage } from '../../../../components/CippComponents/CippTablePage.jsx'
import { CippDeployCompliancePolicyDrawer } from '../../../../components/CippComponents/CippDeployCompliancePolicyDrawer.jsx'
@@ -113,5 +115,9 @@ const Page = () => {
)
}
-Page.getLayout = (page) => {page}
+Page.getLayout = (page) => (
+
+ {page}
+
+)
export default Page
diff --git a/frontend/src/pages/security/compliance/labels/tabOptions.json b/frontend/src/pages/security/compliance/labels/tabOptions.json
new file mode 100644
index 0000000000..a56435f1a8
--- /dev/null
+++ b/frontend/src/pages/security/compliance/labels/tabOptions.json
@@ -0,0 +1,12 @@
+[
+ {
+ "label": "Sensitivity Labels",
+ "path": "/security/compliance/labels",
+ "icon": "Label"
+ },
+ {
+ "label": "Sensitivity Label Templates",
+ "path": "/security/compliance/labels-templates",
+ "icon": "Description"
+ }
+]
diff --git a/frontend/src/pages/security/compliance/retention-templates/index.jsx b/frontend/src/pages/security/compliance/retention-templates/index.jsx
index eb3632835e..02a73994d7 100644
--- a/frontend/src/pages/security/compliance/retention-templates/index.jsx
+++ b/frontend/src/pages/security/compliance/retention-templates/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "../retention/tabOptions.json";
import { CippIcons } from "../../../../utils/icon-registry"
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import { ApiGetCall } from "../../../../api/ApiCall";
@@ -103,5 +105,9 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/security/compliance/retention/index.jsx b/frontend/src/pages/security/compliance/retention/index.jsx
index ccb5fecf49..17ce522992 100644
--- a/frontend/src/pages/security/compliance/retention/index.jsx
+++ b/frontend/src/pages/security/compliance/retention/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from '../../../../layouts/index'
+import { TabbedLayout } from '../../../../layouts/TabbedLayout'
+import tabOptions from './tabOptions.json'
import { CippIcons } from '../../../../utils/icon-registry'
import { CippTablePage } from '../../../../components/CippComponents/CippTablePage.jsx'
import { CippDeployCompliancePolicyDrawer } from '../../../../components/CippComponents/CippDeployCompliancePolicyDrawer.jsx'
@@ -112,5 +114,9 @@ const Page = () => {
)
}
-Page.getLayout = (page) => {page}
+Page.getLayout = (page) => (
+
+ {page}
+
+)
export default Page
diff --git a/frontend/src/pages/security/compliance/retention/tabOptions.json b/frontend/src/pages/security/compliance/retention/tabOptions.json
new file mode 100644
index 0000000000..10cb5e07d3
--- /dev/null
+++ b/frontend/src/pages/security/compliance/retention/tabOptions.json
@@ -0,0 +1,12 @@
+[
+ {
+ "label": "Retention Policies",
+ "path": "/security/compliance/retention",
+ "icon": "Schedule"
+ },
+ {
+ "label": "Retention Policy Templates",
+ "path": "/security/compliance/retention-templates",
+ "icon": "Description"
+ }
+]
diff --git a/frontend/src/pages/security/compliance/sit-templates/index.jsx b/frontend/src/pages/security/compliance/sit-templates/index.jsx
index 1b8da08203..05db58e050 100644
--- a/frontend/src/pages/security/compliance/sit-templates/index.jsx
+++ b/frontend/src/pages/security/compliance/sit-templates/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "../sit/tabOptions.json";
import { CippIcons } from "../../../../utils/icon-registry"
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import { ApiGetCall } from "../../../../api/ApiCall";
@@ -106,5 +108,9 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/security/compliance/sit/index.jsx b/frontend/src/pages/security/compliance/sit/index.jsx
index 4cb80026f1..7e46d2eb0e 100644
--- a/frontend/src/pages/security/compliance/sit/index.jsx
+++ b/frontend/src/pages/security/compliance/sit/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from '../../../../layouts/index'
+import { TabbedLayout } from '../../../../layouts/TabbedLayout'
+import tabOptions from './tabOptions.json'
import { CippIcons } from '../../../../utils/icon-registry'
import { CippTablePage } from '../../../../components/CippComponents/CippTablePage.jsx'
import { CippDeployCompliancePolicyDrawer } from '../../../../components/CippComponents/CippDeployCompliancePolicyDrawer.jsx'
@@ -85,5 +87,9 @@ const Page = () => {
)
}
-Page.getLayout = (page) => {page}
+Page.getLayout = (page) => (
+
+ {page}
+
+)
export default Page
diff --git a/frontend/src/pages/security/compliance/sit/tabOptions.json b/frontend/src/pages/security/compliance/sit/tabOptions.json
new file mode 100644
index 0000000000..06f41eda7e
--- /dev/null
+++ b/frontend/src/pages/security/compliance/sit/tabOptions.json
@@ -0,0 +1,12 @@
+[
+ {
+ "label": "Sensitive Information Types",
+ "path": "/security/compliance/sit",
+ "icon": "Fingerprint"
+ },
+ {
+ "label": "Sensitive Info Type Templates",
+ "path": "/security/compliance/sit-templates",
+ "icon": "Description"
+ }
+]
diff --git a/frontend/src/pages/security/safelinks/safelinks-template/index.jsx b/frontend/src/pages/security/safelinks/safelinks-template/index.jsx
index ae3eef4d04..87bfeaddfa 100644
--- a/frontend/src/pages/security/safelinks/safelinks-template/index.jsx
+++ b/frontend/src/pages/security/safelinks/safelinks-template/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "../safelinks/tabOptions.json";
import { CippIcons } from "../../../../utils/icon-registry"
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import { Button } from "@mui/material";
@@ -117,5 +119,9 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
\ No newline at end of file
diff --git a/frontend/src/pages/security/safelinks/safelinks/index.jsx b/frontend/src/pages/security/safelinks/safelinks/index.jsx
index 2681dabb69..f9bd0c6481 100644
--- a/frontend/src/pages/security/safelinks/safelinks/index.jsx
+++ b/frontend/src/pages/security/safelinks/safelinks/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "./tabOptions.json";
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import { CippIcons } from "../../../../utils/icon-registry"
import { Button } from "@mui/material";
@@ -179,5 +181,9 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
\ No newline at end of file
diff --git a/frontend/src/pages/security/safelinks/safelinks/tabOptions.json b/frontend/src/pages/security/safelinks/safelinks/tabOptions.json
new file mode 100644
index 0000000000..67e90bdb4e
--- /dev/null
+++ b/frontend/src/pages/security/safelinks/safelinks/tabOptions.json
@@ -0,0 +1,12 @@
+[
+ {
+ "label": "Safe Links Policies",
+ "path": "/security/safelinks/safelinks",
+ "icon": "Link"
+ },
+ {
+ "label": "Safe Links Templates",
+ "path": "/security/safelinks/safelinks-template",
+ "icon": "Description"
+ }
+]
diff --git a/frontend/src/pages/teams-share/permissions-report/index.jsx b/frontend/src/pages/teams-share/reports/permissions-report/index.jsx
similarity index 91%
rename from frontend/src/pages/teams-share/permissions-report/index.jsx
rename to frontend/src/pages/teams-share/reports/permissions-report/index.jsx
index 06a73b31c4..e8f791afbf 100644
--- a/frontend/src/pages/teams-share/permissions-report/index.jsx
+++ b/frontend/src/pages/teams-share/reports/permissions-report/index.jsx
@@ -1,20 +1,20 @@
import { useRef, useState } from 'react'
-import { CippIcons } from '../../../utils/icon-registry'
-import { Layout as DashboardLayout } from '../../../layouts/index'
-import { CippInfoBar } from '../../../components/CippCards/CippInfoBar'
-import { CippChartCard } from '../../../components/CippCards/CippChartCard'
-import { CippImageCard } from '../../../components/CippCards/CippImageCard'
-import { CippDataTable } from '../../../components/CippTable/CippDataTable'
-import { CippApiDialog } from '../../../components/CippComponents/CippApiDialog'
-import { CippMultiQueueTracker } from '../../../components/CippComponents/CippMultiQueueTracker'
-import { CippQueryRefreshButton } from '../../../components/CippComponents/CippQueryRefreshButton'
-import { PermissionsReportButton } from '../../../components/CippPdf/PermissionsReportButton'
-import { useDialog } from '../../../hooks/use-dialog'
-import { ApiGetCall } from '../../../api/ApiCall'
-import { useSettings } from '../../../hooks/use-settings'
+import { CippIcons } from '../../../../utils/icon-registry'
+import { Layout as DashboardLayout } from '../../../../layouts/index'
+import { CippInfoBar } from '../../../../components/CippCards/CippInfoBar'
+import { CippChartCard } from '../../../../components/CippCards/CippChartCard'
+import { CippImageCard } from '../../../../components/CippCards/CippImageCard'
+import { CippDataTable } from '../../../../components/CippTable/CippDataTable'
+import { CippApiDialog } from '../../../../components/CippComponents/CippApiDialog'
+import { CippMultiQueueTracker } from '../../../../components/CippComponents/CippMultiQueueTracker'
+import { CippQueryRefreshButton } from '../../../../components/CippComponents/CippQueryRefreshButton'
+import { PermissionsReportButton } from '../../../../components/CippPdf/PermissionsReportButton'
+import { useDialog } from '../../../../hooks/use-dialog'
+import { ApiGetCall } from '../../../../api/ApiCall'
+import { useSettings } from '../../../../hooks/use-settings'
import { Alert, Button, Container, Stack, SvgIcon, Typography } from '@mui/material'
import { Grid } from '@mui/system'
-import { CippExpandableAlert } from '../../../components/CippComponents/CippExpandableAlert'
+import { CippExpandableAlert } from '../../../../components/CippComponents/CippExpandableAlert'
// This report is compiled from one cache, so Sync starts a single queue.
const syncRows = [{ Name: 'SharePointPermissions' }]
diff --git a/frontend/src/pages/teams-share/sharing-report/index.jsx b/frontend/src/pages/teams-share/reports/sharing-report/index.jsx
similarity index 94%
rename from frontend/src/pages/teams-share/sharing-report/index.jsx
rename to frontend/src/pages/teams-share/reports/sharing-report/index.jsx
index cb27cc756c..e60d721158 100644
--- a/frontend/src/pages/teams-share/sharing-report/index.jsx
+++ b/frontend/src/pages/teams-share/reports/sharing-report/index.jsx
@@ -1,18 +1,18 @@
import { useRef, useState } from 'react'
-import { CippIcons } from '../../../utils/icon-registry'
-import { Layout as DashboardLayout } from '../../../layouts/index'
-import { CippInfoBar } from '../../../components/CippCards/CippInfoBar'
-import { CippMultiQueueTracker } from '../../../components/CippComponents/CippMultiQueueTracker'
-import { CippQueryRefreshButton } from '../../../components/CippComponents/CippQueryRefreshButton'
-import { SharingReportButton } from '../../../components/CippPdf/SharingReportButton'
-import { CippChartCard } from '../../../components/CippCards/CippChartCard'
-import { CippImageCard } from '../../../components/CippCards/CippImageCard'
-import { CippPropertyListCard } from '../../../components/CippCards/CippPropertyListCard'
-import { CippDataTable } from '../../../components/CippTable/CippDataTable'
-import { CippApiDialog } from '../../../components/CippComponents/CippApiDialog'
-import { useDialog } from '../../../hooks/use-dialog'
-import { ApiGetCall } from '../../../api/ApiCall'
-import { useSettings } from '../../../hooks/use-settings'
+import { CippIcons } from '../../../../utils/icon-registry'
+import { Layout as DashboardLayout } from '../../../../layouts/index'
+import { CippInfoBar } from '../../../../components/CippCards/CippInfoBar'
+import { CippMultiQueueTracker } from '../../../../components/CippComponents/CippMultiQueueTracker'
+import { CippQueryRefreshButton } from '../../../../components/CippComponents/CippQueryRefreshButton'
+import { SharingReportButton } from '../../../../components/CippPdf/SharingReportButton'
+import { CippChartCard } from '../../../../components/CippCards/CippChartCard'
+import { CippImageCard } from '../../../../components/CippCards/CippImageCard'
+import { CippPropertyListCard } from '../../../../components/CippCards/CippPropertyListCard'
+import { CippDataTable } from '../../../../components/CippTable/CippDataTable'
+import { CippApiDialog } from '../../../../components/CippComponents/CippApiDialog'
+import { useDialog } from '../../../../hooks/use-dialog'
+import { ApiGetCall } from '../../../../api/ApiCall'
+import { useSettings } from '../../../../hooks/use-settings'
import {
Alert,
Button,
diff --git a/frontend/src/pages/teams-share/sharepoint-templates/index.jsx b/frontend/src/pages/teams-share/sharepoint-templates/index.jsx
index ae5fe10050..e7b35c77d6 100644
--- a/frontend/src/pages/teams-share/sharepoint-templates/index.jsx
+++ b/frontend/src/pages/teams-share/sharepoint-templates/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from '../../../layouts/index'
+import { TabbedLayout } from '../../../layouts/TabbedLayout'
+import tabOptions from '../sharepoint/tabOptions.json'
import { CippIcons } from '../../../utils/icon-registry'
import { CippTablePage } from '../../../components/CippComponents/CippTablePage.jsx'
import { CippSharePointTemplateDeployDrawer } from '../../../components/CippComponents/CippSharePointTemplateDeployDrawer.jsx'
@@ -92,6 +94,10 @@ const Page = () => {
)
}
-Page.getLayout = (page) => {page}
+Page.getLayout = (page) => (
+
+ {page}
+
+)
export default Page
diff --git a/frontend/src/pages/teams-share/sharepoint/index.jsx b/frontend/src/pages/teams-share/sharepoint/index.jsx
index baaa56b6b5..3080043a14 100644
--- a/frontend/src/pages/teams-share/sharepoint/index.jsx
+++ b/frontend/src/pages/teams-share/sharepoint/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from '../../../layouts/index'
+import { TabbedLayout } from '../../../layouts/TabbedLayout'
+import tabOptions from './tabOptions.json'
import { CippIcons } from '../../../utils/icon-registry'
import { CippTablePage } from '../../../components/CippComponents/CippTablePage.jsx'
import { Alert, Button, Dialog, DialogActions, DialogContent, DialogTitle } from '@mui/material'
@@ -801,6 +803,10 @@ const Page = () => {
)
}
-Page.getLayout = (page) => {page}
+Page.getLayout = (page) => (
+
+ {page}
+
+)
export default Page
diff --git a/frontend/src/pages/teams-share/sharepoint/tabOptions.json b/frontend/src/pages/teams-share/sharepoint/tabOptions.json
new file mode 100644
index 0000000000..03c8f8f9df
--- /dev/null
+++ b/frontend/src/pages/teams-share/sharepoint/tabOptions.json
@@ -0,0 +1,12 @@
+[
+ {
+ "label": "SharePoint",
+ "path": "/teams-share/sharepoint",
+ "icon": "Cloud"
+ },
+ {
+ "label": "SharePoint Templates",
+ "path": "/teams-share/sharepoint-templates",
+ "icon": "Description"
+ }
+]
diff --git a/frontend/src/pages/tenant/conditional/list-policies/index.jsx b/frontend/src/pages/tenant/conditional/list-policies/index.jsx
index f8b213d2c8..d70831951e 100644
--- a/frontend/src/pages/tenant/conditional/list-policies/index.jsx
+++ b/frontend/src/pages/tenant/conditional/list-policies/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "./tabOptions.json";
import { CippIcons } from "../../../../utils/icon-registry"
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import { Box } from "@mui/material";
@@ -185,5 +187,9 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/tenant/conditional/list-policies/tabOptions.json b/frontend/src/pages/tenant/conditional/list-policies/tabOptions.json
new file mode 100644
index 0000000000..e3f8e27120
--- /dev/null
+++ b/frontend/src/pages/tenant/conditional/list-policies/tabOptions.json
@@ -0,0 +1,12 @@
+[
+ {
+ "label": "CA Policies",
+ "path": "/tenant/conditional/list-policies",
+ "icon": "Security"
+ },
+ {
+ "label": "CA Templates",
+ "path": "/tenant/conditional/list-template",
+ "icon": "Description"
+ }
+]
diff --git a/frontend/src/pages/tenant/conditional/list-template/index.jsx b/frontend/src/pages/tenant/conditional/list-template/index.jsx
index 8d74a5ab56..4a7e4903a1 100644
--- a/frontend/src/pages/tenant/conditional/list-template/index.jsx
+++ b/frontend/src/pages/tenant/conditional/list-template/index.jsx
@@ -1,4 +1,6 @@
import { Layout as DashboardLayout } from "../../../../layouts/index";
+import { TabbedLayout } from "../../../../layouts/TabbedLayout";
+import tabOptions from "../list-policies/tabOptions.json";
import { CippIcons } from "../../../../utils/icon-registry"
import { CippTablePage } from "../../../../components/CippComponents/CippTablePage.jsx";
import { Button, Box } from "@mui/material";
@@ -180,6 +182,10 @@ const Page = () => {
);
};
-Page.getLayout = (page) => {page};
+Page.getLayout = (page) => (
+
+ {page}
+
+);
export default Page;
diff --git a/frontend/src/pages/tools/community-repos/catalog.jsx b/frontend/src/pages/tools/template-tools/community-repos/catalog.jsx
similarity index 84%
rename from frontend/src/pages/tools/community-repos/catalog.jsx
rename to frontend/src/pages/tools/template-tools/community-repos/catalog.jsx
index ce5288606f..48fad01c85 100644
--- a/frontend/src/pages/tools/community-repos/catalog.jsx
+++ b/frontend/src/pages/tools/template-tools/community-repos/catalog.jsx
@@ -1,11 +1,11 @@
import { useMemo } from "react";
-import { CippIcons } from "../../../utils/icon-registry";
+import { CippIcons } from "../../../../utils/icon-registry";
import { useRouter } from "next/router";
-import { Layout as DashboardLayout } from "../../../layouts/index";
+import { Layout as DashboardLayout } from "../../../../layouts/index";
import { Box, Button, Container, Stack, Typography } from "@mui/material";
import Link from "next/link";
-import { CippHead } from "../../../components/CippComponents/CippHead";
-import { CippTemplateCatalog } from "../../../components/CippComponents/CippTemplateCatalog";
+import { CippHead } from "../../../../components/CippComponents/CippHead";
+import { CippTemplateCatalog } from "../../../../components/CippComponents/CippTemplateCatalog";
const Page = () => {
const router = useRouter();
@@ -44,7 +44,7 @@ const Page = () => {
variant="outlined"
startIcon={}
component={Link}
- href="/tools/community-repos"
+ href="/tools/template-tools/community-repos"
>
Back to Sources
diff --git a/frontend/src/pages/tools/community-repos/index.jsx b/frontend/src/pages/tools/template-tools/community-repos/index.jsx
similarity index 96%
rename from frontend/src/pages/tools/community-repos/index.jsx
rename to frontend/src/pages/tools/template-tools/community-repos/index.jsx
index 02b149155a..f64e0f672f 100644
--- a/frontend/src/pages/tools/community-repos/index.jsx
+++ b/frontend/src/pages/tools/template-tools/community-repos/index.jsx
@@ -1,8 +1,8 @@
import { useState } from "react";
-import { CippIcons } from "../../../utils/icon-registry"
+import { CippIcons } from "../../../../utils/icon-registry"
import { useRouter } from "next/router";
import NextLink from "next/link";
-import { Layout as DashboardLayout } from "../../../layouts/index";
+import { Layout as DashboardLayout } from "../../../../layouts/index";
import {
Box,
Button,
@@ -29,13 +29,13 @@ import { Grid } from "@mui/system";
import ListItemIcon from "@mui/material/ListItemIcon";
import ListItemText from "@mui/material/ListItemText";
import { useForm, FormProvider } from "react-hook-form";
-import { ApiGetCall, ApiPostCall } from "../../../api/ApiCall";
-import { CippHead } from "../../../components/CippComponents/CippHead";
-import { CippApiResults } from "../../../components/CippComponents/CippApiResults";
-import CippFormComponent from "../../../components/CippComponents/CippFormComponent";
-import { CippFormCondition } from "../../../components/CippComponents/CippFormCondition";
-import { CippAutoComplete } from "../../../components/CippComponents/CippAutocomplete";
-import { getTemplateTypeLabel } from "../../../components/CippComponents/CippTemplateCatalog";
+import { ApiGetCall, ApiPostCall } from "../../../../api/ApiCall";
+import { CippHead } from "../../../../components/CippComponents/CippHead";
+import { CippApiResults } from "../../../../components/CippComponents/CippApiResults";
+import CippFormComponent from "../../../../components/CippComponents/CippFormComponent";
+import { CippFormCondition } from "../../../../components/CippComponents/CippFormCondition";
+import { CippAutoComplete } from "../../../../components/CippComponents/CippAutocomplete";
+import { getTemplateTypeLabel } from "../../../../components/CippComponents/CippTemplateCatalog";
const typeOptions = [
{ label: "Intune Policy", value: "IntuneTemplate" },
@@ -147,7 +147,7 @@ const Page = () => {
};
const handleOpenRepo = (repo) => {
- router.push(`/tools/community-repos/catalog?Repo=${encodeURIComponent(repo.FullName)}`);
+ router.push(`/tools/template-tools/community-repos/catalog?Repo=${encodeURIComponent(repo.FullName)}`);
};
const handleAddRepo = () => {
@@ -206,7 +206,7 @@ const Page = () => {
variant="outlined"
startIcon={}
component={NextLink}
- href="/tools/community-repos/catalog"
+ href="/tools/template-tools/community-repos/catalog"
>
Browse All Templates
diff --git a/frontend/src/pages/tools/community-repos/repo.jsx b/frontend/src/pages/tools/template-tools/community-repos/repo.jsx
similarity index 74%
rename from frontend/src/pages/tools/community-repos/repo.jsx
rename to frontend/src/pages/tools/template-tools/community-repos/repo.jsx
index 36d84ecac9..e231451ed7 100644
--- a/frontend/src/pages/tools/community-repos/repo.jsx
+++ b/frontend/src/pages/tools/template-tools/community-repos/repo.jsx
@@ -1,13 +1,13 @@
import { useEffect } from "react";
import { useRouter } from "next/router";
-import { Layout as DashboardLayout } from "../../../layouts";
+import { Layout as DashboardLayout } from "../../../../layouts";
// The per-repo template browser has been replaced by the unified community template catalog.
const Page = () => {
const router = useRouter();
useEffect(() => {
- router.replace("/tools/community-repos");
+ router.replace("/tools/template-tools/community-repos");
}, [router]);
return null;
diff --git a/frontend/src/pages/tools/template-packages/index.jsx b/frontend/src/pages/tools/template-tools/template-packages/index.jsx
similarity index 75%
rename from frontend/src/pages/tools/template-packages/index.jsx
rename to frontend/src/pages/tools/template-tools/template-packages/index.jsx
index 78153b2e11..0f8428bb84 100644
--- a/frontend/src/pages/tools/template-packages/index.jsx
+++ b/frontend/src/pages/tools/template-tools/template-packages/index.jsx
@@ -1,7 +1,7 @@
import { Box, Container, Stack, Typography } from '@mui/material'
-import { Layout as DashboardLayout } from '../../../layouts/index'
-import { CippHead } from '../../../components/CippComponents/CippHead'
-import { CippTemplatePackageManager } from '../../../components/CippComponents/CippTemplatePackageManager'
+import { Layout as DashboardLayout } from '../../../../layouts/index'
+import { CippHead } from '../../../../components/CippComponents/CippHead'
+import { CippTemplatePackageManager } from '../../../../components/CippComponents/CippTemplatePackageManager'
const Page = () => {
return (
diff --git a/frontend/src/pages/tools/templatelib/index.jsx b/frontend/src/pages/tools/template-tools/templatelib/index.jsx
similarity index 95%
rename from frontend/src/pages/tools/templatelib/index.jsx
rename to frontend/src/pages/tools/template-tools/templatelib/index.jsx
index 63ac09f820..748a4090fb 100644
--- a/frontend/src/pages/tools/templatelib/index.jsx
+++ b/frontend/src/pages/tools/template-tools/templatelib/index.jsx
@@ -2,14 +2,14 @@ import { useEffect } from "react";
import { Divider, Typography, Alert, Chip, Link } from "@mui/material";
import NextLink from "next/link";
import { useForm, useWatch } from "react-hook-form";
-import { Layout as DashboardLayout } from "../../../layouts/index";
-import CippFormPage from "../../../components/CippFormPages/CippFormPage";
-import CippFormComponent from "../../../components/CippComponents/CippFormComponent";
-import { CippFormTenantSelector } from "../../../components/CippComponents/CippFormTenantSelector";
+import { Layout as DashboardLayout } from "../../../../layouts/index";
+import CippFormPage from "../../../../components/CippFormPages/CippFormPage";
+import CippFormComponent from "../../../../components/CippComponents/CippFormComponent";
+import { CippFormTenantSelector } from "../../../../components/CippComponents/CippFormTenantSelector";
import { Grid } from "@mui/system";
-import { CippFormCondition } from "../../../components/CippComponents/CippFormCondition";
-import { CippDataTable } from "../../../components/CippTable/CippDataTable";
-import { ApiGetCall } from "../../../api/ApiCall";
+import { CippFormCondition } from "../../../../components/CippComponents/CippFormCondition";
+import { CippDataTable } from "../../../../components/CippTable/CippDataTable";
+import { ApiGetCall } from "../../../../api/ApiCall";
// react-query key for the "configured template libraries" table below. Passed to CippFormPage as a
// related query key so creating a new library refreshes the table without a manual reload.
diff --git a/frontend/src/utils/route-redirects.js b/frontend/src/utils/route-redirects.js
index e4ab3bcecd..c44787a5fd 100644
--- a/frontend/src/utils/route-redirects.js
+++ b/frontend/src/utils/route-redirects.js
@@ -33,6 +33,19 @@ export const routeRedirects = {
// User Templates moved from Manage Tenant tabs to the Users tabbed layout.
'/tenant/manage/user-defaults':
'/identity/administration/users/user-defaults',
+ // The SharePoint/OneDrive Sharing and Permissions reports moved under a Reports group
+ // in the Teams & SharePoint section.
+ '/teams-share/sharing-report': '/teams-share/reports/sharing-report',
+ '/teams-share/permissions-report':
+ '/teams-share/reports/permissions-report',
+ // Template Library, Catalog and Template Package Manager moved under a Template Tools
+ // group in the Tools section.
+ '/tools/templatelib': '/tools/template-tools/templatelib',
+ '/tools/community-repos': '/tools/template-tools/community-repos',
+ '/tools/community-repos/catalog':
+ '/tools/template-tools/community-repos/catalog',
+ '/tools/community-repos/repo': '/tools/template-tools/community-repos/repo',
+ '/tools/template-packages': '/tools/template-tools/template-packages',
}
export const getRedirectTarget = (pathname) => {