@kwiz/common
Version:
KWIZ common utilities and helpers for M365 platform
87 lines (77 loc) • 3.73 kB
text/typescript
import { isNullOrEmptyString, isNullOrUndefined } from "../../helpers/typecheckers";
import { INavLinkInfo } from "../../types/sharepoint.types";
import { ConsoleLogger } from "../consolelogger";
import { GetJson } from "../rest";
import { GetRestBaseUrl, GetSiteUrl } from "./common";
const logger = ConsoleLogger.get("SharePoint.Rest.Navigation-Links");
/**
* Get all navigation links in the top and side navigation of a SharePoint site
* @param siteUrl The URL of the SharePoint site
* @returns An array containing all navigation links
*/
export async function GetNavigationLinks(siteUrl?: string): Promise<INavLinkInfo[]> {
siteUrl = GetSiteUrl(siteUrl);
const topNavUrl = `${GetRestBaseUrl(siteUrl)}/web/navigation/topnavigationbar`;
const sideNavUrl = `${GetRestBaseUrl(siteUrl)}/web/navigation/quicklaunch`;
try {
const topNavResponse = await GetJson<{ d: { results: INavLinkInfo[] } }>(topNavUrl);
const sideNavResponse = await GetJson<{ d: { results: INavLinkInfo[] } }>(sideNavUrl);
const topNavLinks: INavLinkInfo[] = topNavResponse.d.results.map((link: INavLinkInfo) => ({ ...link, Location: "topnavigationbar" }));
const sideNavLinks: INavLinkInfo[] = sideNavResponse.d.results.map((link: INavLinkInfo) => ({ ...link, Location: "quicklaunch" }));
return [...topNavLinks, ...sideNavLinks];
} catch (error) {
logger.error(`Error fetching navigation links: ${error.message}`);
}
return [];
}
/**
* Add a navigation link to the specified location (top navigation or side navigation)
* @param title The title of the navigation link
* @param url The url of the navigation link
* @param location The location where the link will be added ('topnavigationbar' or 'quicklaunch'). Default is 'quicklaunch'.
* @Logs If the location is invalid or if adding the link fails
*/
export async function AddNavigationLink(title: string, url: string, location: 'topnavigationbar' | 'quicklaunch' = 'quicklaunch'): Promise<INavLinkInfo> {
try {
let siteUrl = GetSiteUrl();
let navigationUrl = "";
navigationUrl = `${GetRestBaseUrl(siteUrl)}/web/navigation/${location}`;
const response = await GetJson<{ d: INavLinkInfo }>(navigationUrl, JSON.stringify({
'__metadata': { 'type': 'SP.NavigationNode' },
'Title': title,
'Url': url
}), {
spWebUrl: siteUrl,
});
if (!isNullOrUndefined(response) && !isNullOrUndefined(response.d)) {
return response.d;
}
} catch (error) {
logger.error('Error adding link');
}
}
/**
* Delete navigation links by title and URL
* @param navLinks An array of navigation links to be deleted
* @Logs If the location is invalid or if deleting the links fails
*/
export async function DeleteNavigationLinks(navLinks: INavLinkInfo[]): Promise<void> {
try {
const siteUrl = GetSiteUrl();
for (const navLink of navLinks) {
const navigationUrl = `${GetRestBaseUrl(siteUrl)}/web/Navigation/GetNodeById(${navLink.Id})`;
// Use the same convention to make the DELETE request
const response = await GetJson<any>(navigationUrl, null, {
method: 'POST',
spWebUrl: siteUrl,
xHttpMethod: 'DELETE'
});
if (!isNullOrEmptyString(response) && !response.ok) {
logger.error('Failed to delete link');
}
}
logger.info('Navigation links deleted successfully');
} catch (error) {
logger.error('Error deleting links');
}
}