UNPKG

@kwiz/common

Version:

KWIZ common utilities and helpers for M365 platform

881 lines 38.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PageContainerTypes = exports.SPBasePermissions = exports.KWIZ_CONTROLLER_FIELD_NAME = void 0; exports.IsClassicPage = IsClassicPage; exports.restoreExperience = restoreExperience; exports.ensureClassicExperience = ensureClassicExperience; exports.setExperienceCookie = setExperienceCookie; exports.switchToClassicExperience = switchToClassicExperience; exports.switchToModernExperience = switchToModernExperience; exports.SchemaXmlToJson = SchemaXmlToJson; exports.SchemaJsonToXml = SchemaJsonToXml; exports.NormalizeListName = NormalizeListName; exports.CleanupUserClaimsLogin = CleanupUserClaimsLogin; exports.IsSPPeoplePickerControlFormEntity = IsSPPeoplePickerControlFormEntity; exports.getPrincipalTypeFromPickerEntity = getPrincipalTypeFromPickerEntity; exports.NormalizeRestObject = NormalizeRestObject; exports.extendFieldInfo = extendFieldInfo; exports.extendFieldInfos = extendFieldInfos; exports.getFieldOutputType = getFieldOutputType; exports.isDocLib = isDocLib; exports.GetOrderByFromCaml = GetOrderByFromCaml; exports.RemoveOrderByFromCaml = RemoveOrderByFromCaml; exports.EnsureViewFields = EnsureViewFields; exports.ParseThumbnalFieldValue = ParseThumbnalFieldValue; exports.isTitleField = isTitleField; exports.isSingleViewPage = isSingleViewPage; exports.splitViewFieldsByBatch = splitViewFieldsByBatch; exports.UserPhoto = UserPhoto; exports.IsFolderContentType = IsFolderContentType; exports.GetModernPageContainers = GetModernPageContainers; exports.AddCamlQueryFragmentToViewQuery = AddCamlQueryFragmentToViewQuery; exports.IsUserEntityValueType = IsUserEntityValueType; exports.IsMultiUserEntityValueType = IsMultiUserEntityValueType; exports.IsUrlValueType = IsUrlValueType; exports.IsRetentionLabelValueType = IsRetentionLabelValueType; exports.isHostedInTeams = isHostedInTeams; exports.isClassicAppIframe = isClassicAppIframe; exports.isNumberFieldType = isNumberFieldType; exports.isSharePointOnline = isSharePointOnline; exports.isSharePointOnlineSync = isSharePointOnlineSync; exports.isAppWeb = isAppWeb; exports.isAppWebSync = isAppWebSync; exports.isSPPageContextInfoReady = isSPPageContextInfoReady; exports.isSPPageContextInfoReadySync = isSPPageContextInfoReadySync; exports.isExternalUser = isExternalUser; exports.GetPageAsJson = GetPageAsJson; exports.GetPageAsJsonSync = GetPageAsJsonSync; const sharepoint_types_1 = require("../types/sharepoint.types"); const consolelogger_1 = require("../utils/consolelogger"); const localstoragecache_1 = require("../utils/localstoragecache"); const rest_1 = require("../utils/rest"); const list_1 = require("../utils/sharepoint.rest/list"); const user_1 = require("../utils/sharepoint.rest/user"); const web_1 = require("../utils/sharepoint.rest/web"); const browser_1 = require("./browser"); const collections_base_1 = require("./collections.base"); const cookies_1 = require("./cookies"); const emails_1 = require("./emails"); const json_1 = require("./json"); const objects_1 = require("./objects"); const strings_1 = require("./strings"); const typecheckers_1 = require("./typecheckers"); const url_1 = require("./url"); exports.KWIZ_CONTROLLER_FIELD_NAME = "kwizcomcontrollerfield"; const MODERN_EXPERIENCE_COOKIE_NAME = "splnu"; const MODERN_EXPERIENCE_TEMP_COOKIE_NAME = `${MODERN_EXPERIENCE_COOKIE_NAME}_kwizcom_original`; const MOBILE_EXPERIENCE_COOKIE_NAME = "mobile"; const MOBILE_EXPERIENCE_TEMP_COOKIE_NAME = `${MOBILE_EXPERIENCE_COOKIE_NAME}_kwizcom_original`; const logger = consolelogger_1.ConsoleLogger.get("helpers/sharepoint"); function IsClassicPage() { if (!(0, typecheckers_1.isTypeofFullNameUndefined)("_spClientSideComponentIds")) { //only modern pages have the _spClientSideComponentIds object created on the page inline, not a in script that //can be loaded return false; } if (!(0, typecheckers_1.isTypeofFullNameUndefined)("_spWebPartComponents") || !(0, typecheckers_1.isTypeofFullNameUndefined)("g_Workspace") || (0, typecheckers_1.isTypeofFullNameFunction)("$_global_ie55up") || !(0, typecheckers_1.isTypeofFullNameUndefined)("_spBodyOnLoadCalled")) { //_spWebPartComponents = inline global var that contains web part info //g_Workspace = inline global var that contains the worskpace element selector //$_global_ie55up = global function for IE polyfills on classic pages //_spBodyOnLoadCalled = inline global var return true; } if (!(0, typecheckers_1.isTypeofFullNameNullOrUndefined)("document.body.childNodes") && document.body.childNodes.length > 0) { //only classic pages have the s4-workspace element let s4workspaceEle = document.getElementById("s4-workspace"); if ((0, browser_1.isElement)(s4workspaceEle)) { return true; } } return false; } function restoreExperience() { var splnu_original = (0, cookies_1.getCookie)(MODERN_EXPERIENCE_TEMP_COOKIE_NAME); (0, cookies_1.deleteCookie)(MODERN_EXPERIENCE_TEMP_COOKIE_NAME); (0, cookies_1.deleteCookie)(MODERN_EXPERIENCE_COOKIE_NAME); if ((0, typecheckers_1.isString)(splnu_original)) { (0, cookies_1.setCookie)(MODERN_EXPERIENCE_COOKIE_NAME, splnu_original); } var mobile_original = (0, cookies_1.getCookie)(MOBILE_EXPERIENCE_TEMP_COOKIE_NAME); (0, cookies_1.deleteCookie)(MOBILE_EXPERIENCE_TEMP_COOKIE_NAME); (0, cookies_1.deleteCookie)(MOBILE_EXPERIENCE_COOKIE_NAME); if ((0, typecheckers_1.isString)(mobile_original)) { (0, cookies_1.setCookie)(MOBILE_EXPERIENCE_COOKIE_NAME, mobile_original, null, "/"); } } function ensureClassicExperience(listId) { var splnu = (0, cookies_1.getCookie)(MODERN_EXPERIENCE_COOKIE_NAME); var mobile = (0, cookies_1.getCookie)(MOBILE_EXPERIENCE_COOKIE_NAME); if ((0, typecheckers_1.isString)(splnu)) { (0, cookies_1.setCookie)(MODERN_EXPERIENCE_TEMP_COOKIE_NAME, splnu); } if ((0, typecheckers_1.isString)(mobile)) { (0, cookies_1.setCookie)(MOBILE_EXPERIENCE_TEMP_COOKIE_NAME, mobile); } (0, cookies_1.setCookie)(MOBILE_EXPERIENCE_COOKIE_NAME, "0", null, "/"); switchToClassicExperience(listId); } function setExperienceCookie(value, reload) { (0, cookies_1.setCookie)(MODERN_EXPERIENCE_COOKIE_NAME, value); if (reload === true) { window.location.reload(); } } function switchToClassicExperience(listId, reload) { setExperienceCookie(listId ? `{${(0, strings_1.normalizeGuid)(listId)}}` : "0", reload); } function switchToModernExperience(reload) { setExperienceCookie("1", reload); } /** Gets field schema XML and converts it into JSON object */ function SchemaXmlToJson(xml) { let result = { Attributes: {}, Customizations: {} }; try { if (xml) { //IE9+ supports this, we don't need to support IE8 anymore let SchemaXmlDoc = new DOMParser().parseFromString(xml, "text/xml"); let xField = SchemaXmlDoc.getElementsByTagName("Field")[0]; for (var i = 0; i < xField.attributes.length; i++) { result.Attributes[xField.attributes[i].name] = xField.attributes[i].value; } let properties = xField.querySelectorAll("Customization>ArrayOfProperty>Property"); properties.forEach(p => { let name = p.querySelector("Name"); let value = p.querySelector("Value"); if (name && value && !(0, typecheckers_1.isNullOrEmptyString)(name.textContent)) result.Customizations[name.textContent] = value.textContent; }); } } catch (e) { } return result; } function SchemaJsonToXml(json) { let doc = new Document(); let fieldElm = doc.createElement("Field"); (0, collections_base_1.forEach)(json.Attributes, (name, value) => { fieldElm.setAttribute(name, value); }); if (Object.keys(json.Customizations).length) { let custElm = doc.createElement("Customization"); fieldElm.appendChild(custElm); let arrElm = doc.createElement("ArrayOfProperty"); custElm.appendChild(arrElm); (0, collections_base_1.forEach)(json.Customizations, (name, value) => { let propElm = doc.createElement("Property"); arrElm.appendChild(propElm); let nameElm = doc.createElement("Name"); propElm.appendChild(nameElm); let valElm = doc.createElement("Value"); propElm.appendChild(valElm); nameElm.textContent = name; valElm.textContent = value; }); } if ((0, typecheckers_1.isNotEmptyArray)(json["Choices"])) { let choices = doc.createElement("CHOICES"); fieldElm.appendChild(choices); json["Choices"].forEach(c => { let choice = doc.createElement("CHOICE"); choice.textContent = c; choices.appendChild(choice); }); } return fieldElm.outerHTML; } function NormalizeListName(list) { let Name = list.EntityTypeName; //get list name. if it is a list, it will be [Name]List so cut the list out. try { if (list.BaseType === 0 && Name.endsWith("List")) Name = Name.substr(0, Name.length - 4); //remove List } catch (e) { } return Name; } class SPBasePermissions { constructor(EffectiveBasePermissions) { this.$High = 0; this.$Low = 0; if (!(0, typecheckers_1.isNullOrUndefined)(EffectiveBasePermissions.High)) this.initPropertiesFromJson(EffectiveBasePermissions); else this.set(EffectiveBasePermissions); } set(perm) { if (perm === sharepoint_types_1.SPBasePermissionKind.FullMask) { this.$Low = 65535; this.$High = 32767; return; } if (!perm) { this.$Low = 0; this.$High = 0; return; } var $v_0 = perm; $v_0 = $v_0 - 1; var $v_1 = 1; if ($v_0 >= 0 && $v_0 < 32) { $v_1 = $v_1 << $v_0; this.$Low = this.$Low | $v_1; } else if ($v_0 >= 32 && $v_0 < 64) { $v_1 = $v_1 << $v_0 - 32; this.$High = this.$High | $v_1; } } clear(perm) { var $v_0 = perm; $v_0 = $v_0 - 1; var $v_1 = 1; if ($v_0 >= 0 && $v_0 < 32) { $v_1 = $v_1 << $v_0; $v_1 = ~$v_1; this.$Low = this.$Low & $v_1; } else if ($v_0 >= 32 && $v_0 < 64) { $v_1 = $v_1 << $v_0 - 32; $v_1 = ~$v_1; this.$High = this.$High & $v_1; } } clearAll() { this.$High = 0; this.$Low = 0; } has(perm) { if (!perm) { return true; } if (perm === sharepoint_types_1.SPBasePermissionKind.FullMask) { return (this.$High & 32767) === 32767 && this.$Low === 65535; } var $v_0 = perm; $v_0 = $v_0 - 1; var $v_1 = 1; if ($v_0 >= 0 && $v_0 < 32) { $v_1 = $v_1 << $v_0; return 0 !== (this.$Low & $v_1); } else if ($v_0 >= 32 && $v_0 < 64) { $v_1 = $v_1 << $v_0 - 32; return 0 !== (this.$High & $v_1); } return false; } hasAny(...requestedPerms) { return (requestedPerms || []).some((t) => { return this.has(t); }); } haAll(...requestedPerms) { return (requestedPerms || []).every((t) => { return this.has(t); }); } hasPermissions(requestedPerms) { return (this.$High & requestedPerms.High) === requestedPerms.High && (this.$Low & requestedPerms.Low) === requestedPerms.Low; } hasAnyPermissions(...requestedPerms) { return (requestedPerms || []).some((t) => { return this.hasPermissions(t); }); } hasAllPermissions(...requestedPerms) { return (requestedPerms || []).every((t) => { return this.hasPermissions(t); }); } initPropertiesFromJson(EffectiveBasePermissions) { this.$High = 0; this.$Low = 0; if ((0, typecheckers_1.isNullOrUndefined)(EffectiveBasePermissions)) return; if (!(0, typecheckers_1.isNullOrNaN)(EffectiveBasePermissions.High)) { this.$High = EffectiveBasePermissions.High; } if (!(0, typecheckers_1.isNullOrNaN)(EffectiveBasePermissions.Low)) { this.$Low = EffectiveBasePermissions.Low; } } toJson() { return { High: this.$High, Low: this.$Low }; } } exports.SPBasePermissions = SPBasePermissions; /** remove i:0#.f|membership| prefix from login */ function CleanupUserClaimsLogin(login) { if (login.indexOf('|membership|') >= 0) return login.slice(login.lastIndexOf('|') + 1); else return login; } function IsSPPeoplePickerControlFormEntity(entity) { let asType = entity; return !(0, typecheckers_1.isNullOrUndefined)(entity) && !(0, typecheckers_1.isNullOrEmptyString)(asType.Key) && (!(0, typecheckers_1.isNullOrUndefined)(asType.EntityData) || !(0, typecheckers_1.isNullOrUndefined)(asType.Resolved)); } function getPrincipalTypeFromPickerEntity(entity) { if (entity.EntityType === "FormsRole" || entity.EntityType === "SecGroup" || entity.EntityData && entity.EntityData.PrincipalType === "SecurityGroup") { return sharepoint_types_1.PrincipalType.SecurityGroup; } if (entity.EntityType === "SPGroup" || entity.EntityData && ((0, typecheckers_1.isNumeric)(entity.EntityData.SPGroupID) || entity.EntityData.PrincipalType === "SharePointGroup")) { return sharepoint_types_1.PrincipalType.SharePointGroup; } if (entity.EntityType === "User" || entity.EntityType === "" && entity.EntityData && entity.EntityData.PrincipalType === "User") { if (entity.EntityData && (0, emails_1.isValidEmail)(entity.EntityData.Email) || (0, typecheckers_1.isString)(entity.EntityData.SIPAddress)) { return sharepoint_types_1.PrincipalType.User; } var keyparts = entity.Key.split("|"); if (keyparts.length === 3 && (0, emails_1.isValidEmail)(keyparts[keyparts.length - 1])) { //sharepoint online key for a user is in the form xxxx|membership|email; return sharepoint_types_1.PrincipalType.User; } else if (keyparts.length === 2 && (0, strings_1.isValidDomainLogin)(keyparts[keyparts.length - 1])) { //sharepoint onpremise key for a user is in the form xxxx|domain\\user; return sharepoint_types_1.PrincipalType.User; } else { //SharePoint groups on saved classic forms item are shown with EntityType = User but dont have a SIPAddress/Email //and the key does not contain a valid domain login/email return sharepoint_types_1.PrincipalType.SharePointGroup; } } return sharepoint_types_1.PrincipalType.User; } /** rest object might put array values under ".results", this will place them at the property value directly */ function NormalizeRestObject(o) { //extract collections such as choice field "choices" if (o) { Object.keys(o).forEach(key => { if (!(0, typecheckers_1.isNullOrUndefined)(o[key]) && (0, objects_1.hasOwnProperty)(o[key], "results") && Array.isArray(o[key].results)) o[key] = o[key].results; }); } return o; } /** * Extends a field info into field info EX (adding SchemaJson) * @param field REST field data * @param allFields Optional - all list fields, used for discovering multi TaxonomyField's update hidden text field */ function extendFieldInfo(field, allFields) { let fieldEx = field; fieldEx.Id = (0, strings_1.normalizeGuid)(field.Id); if (field.InternalName === "ContentType") { fieldEx.Required = true; } else { switch (fieldEx.TypeAsString) { case "TaxonomyFieldTypeMulti": //find the hidden rich text for updates! { let taxonomyField = fieldEx; let textFieldId = (0, strings_1.normalizeGuid)(taxonomyField.TextField); let related = (0, typecheckers_1.isNotEmptyArray)(allFields) ? (0, collections_base_1.firstOrNull)(allFields, relatedField => relatedField.Id === textFieldId) : null; if (related !== null) taxonomyField.HiddenMultiValueFieldName = related.InternalName; } break; } } fieldEx.OutputTypeAsString = getFieldOutputType(fieldEx); if ((0, typecheckers_1.isNullOrUndefined)(fieldEx.SchemaJson)) { Object.defineProperty(fieldEx, 'SchemaJson', { get: function () { if ((0, typecheckers_1.isUndefined)(this._schemaJson)) { this._schemaJson = SchemaXmlToJson(this.SchemaXml); } return this._schemaJson; } }); } if (field.InternalName === exports.KWIZ_CONTROLLER_FIELD_NAME) { //not hidden by SharePoint so its shown in views/forms but as far as our products concerned - should be treated as hidden field.Hidden = true; } return fieldEx; } function extendFieldInfos(fields) { return fields.map(f => extendFieldInfo(f, fields)); } function getFieldOutputType(field) { let outputType = field.TypeAsString; if (outputType === "Calculated") { switch (field.OutputType) { case sharepoint_types_1.FieldTypes.DateTime: outputType = "DateTime"; break; case sharepoint_types_1.FieldTypes.Boolean: outputType = "Boolean"; break; case sharepoint_types_1.FieldTypes.Currency: outputType = "Currency"; break; case sharepoint_types_1.FieldTypes.Number: outputType = "Number"; break; default: outputType = "Text"; break; } } return outputType; } function isDocLib(list) { return list && list.BaseType === 1; } function GetOrderByFromCaml(camlQuery) { let xmlDoc = new DOMParser().parseFromString(camlQuery, "text/xml"); let orderByElm = xmlDoc.querySelector("OrderBy"); let OrderBy = []; if (orderByElm) { let orderFieldsElms = orderByElm.querySelectorAll("FieldRef"); orderFieldsElms.forEach(f => { let name = f.getAttribute("Name"); let asc = f.getAttribute("Ascending") || ""; //Issue 1019 default value is true if ommitted - https://learn.microsoft.com/en-us/sharepoint/dev/schema/fieldref-element-query let IsAscending = asc.toUpperCase() !== "FALSE"; if (!(0, typecheckers_1.isNullOrEmptyString)(name)) OrderBy.push({ Name: name, IsAscending: IsAscending }); }); } return OrderBy; } function RemoveOrderByFromCaml(camlQuery) { let xmlDoc = new DOMParser().parseFromString(camlQuery, "text/xml"); let orderByElm = xmlDoc.querySelector("OrderBy"); //let OrderBy: { Name: string; IsAscending: boolean; }[] = []; if (orderByElm) { orderByElm.remove(); return xmlDoc.documentElement.outerHTML; } return camlQuery; } function EnsureViewFields(camlQuery, fields, forceCreateViewFields, removeAllOthers) { let xmlDoc = new DOMParser().parseFromString(camlQuery, "text/xml"); let viewElm = xmlDoc.querySelector("View"); if (!(0, typecheckers_1.isNullOrUndefined)(viewElm)) { let viewFieldsElm = viewElm.querySelector("ViewFields"); if (forceCreateViewFields && (0, typecheckers_1.isNullOrUndefined)(viewFieldsElm)) { viewFieldsElm = xmlDoc.createElement("ViewFields"); viewElm.appendChild(viewFieldsElm); } if (!(0, typecheckers_1.isNullOrUndefined)(viewFieldsElm)) { let viewFieldsElms = viewFieldsElm.querySelectorAll("FieldRef"); if (removeAllOthers) viewFieldsElms.forEach(e => e.remove()); let viewFields = removeAllOthers ? [] : Array.from(viewFieldsElms).map(viewFieldNode => { let name = viewFieldNode.getAttribute("Name"); return name.toLowerCase(); }); let changed = false; fields.forEach(f => { if (viewFields.indexOf(f.toLowerCase()) === -1) { let newViewFieldElm = xmlDoc.createElement("FieldRef"); newViewFieldElm.setAttribute("Name", f); viewFieldsElm.appendChild(newViewFieldElm); changed = true; } }); if (viewFieldsElm.querySelectorAll("FieldRef").length < 1 && !forceCreateViewFields) { //don't leave an empty object viewFieldsElm.remove(); changed = true; } if (changed) return xmlDoc.documentElement.outerHTML; } } return camlQuery; } /**If it is a thumbnail field - parse and return a typed value */ function ParseThumbnalFieldValue(value, context) { if (!(0, typecheckers_1.isNullOrEmptyString)(value)) { try { let parsed = (0, json_1.jsonParse)(value); if ((0, typecheckers_1.isNullOrUndefined)(parsed)) { return null; } if (!(0, typecheckers_1.isNullOrEmptyString)(parsed.serverRelativeUrl)) { return parsed; } else if (!(0, typecheckers_1.isNullOrEmptyString)(parsed.fileName) && !(0, typecheckers_1.isNullOrUndefined)(context) && (0, typecheckers_1.isNumber)(context.itemId) && !(0, typecheckers_1.isNullOrEmptyString)(context.rootFolder)) { let { itemId, rootFolder } = context; parsed.serverRelativeUrl = `${(0, url_1.makeServerRelativeUrl)(rootFolder)}/Attachments/${itemId}/${parsed.fileName}`; return parsed; } } catch (e) { } } return null; } function isTitleField(fieldName) { return fieldName === "Title" || fieldName === "LinkTitleNoMenu" || fieldName === "LinkTitle"; } /** we are on a list view page, not a web part page with possible multiple list views */ function isSingleViewPage() { return !(0, typecheckers_1.isNullOrUndefined)(_spPageContextInfo) && (0, typecheckers_1.isValidGuid)(_spPageContextInfo.viewId); } /** * Splits the ViewFields of a CAML query into separate entries based on the batch size. * @param {string} camlQuery - The CAML query string. * @param {number} batchSize - The size of each batch (number of ViewFields per entry). */ function splitViewFieldsByBatch(camlQuery, allListFieldsToLowerHash, batchSize) { let xmlDoc = new DOMParser().parseFromString(camlQuery, 'text/xml'); let viewNode = xmlDoc.querySelector("View, view"); let viewFieldsNode = viewNode && viewNode.querySelector("ViewFields, viewfields"); if ((0, typecheckers_1.isNullOrUndefined)(viewFieldsNode)) { return [camlQuery]; // No ViewFields element found, return the original query as is } let viewFieldNodes = Array.from(viewFieldsNode.children); let numberOfEntries = Math.ceil(viewFieldNodes.length / batchSize); let splitQueries = []; for (let i = 0; i < numberOfEntries; i++) { let startIndex = i * batchSize; let endIndex = startIndex + batchSize; let slicedViewFields = viewFieldNodes.slice(startIndex, endIndex); let clonedXmlDoc = xmlDoc.cloneNode(true); let clonedViewFieldsElement = clonedXmlDoc.getElementsByTagName('ViewFields')[0]; // Remove existing child nodes from cloned ViewFields while (clonedViewFieldsElement.firstChild) { clonedViewFieldsElement.removeChild(clonedViewFieldsElement.firstChild); } // Append sliced ViewFields to cloned ViewFields for (let slicedViewField of slicedViewFields) { clonedViewFieldsElement.appendChild(slicedViewField.cloneNode(true)); } let splitQuery = new XMLSerializer().serializeToString(clonedXmlDoc); splitQueries.push(splitQuery); } return splitQueries; } /** Size=S = 48×48 px, M = 72×72 px, L = 300×300 px */ function UserPhoto(siteUrl, userName, size = "L") { return `${(0, url_1.normalizeUrl)(siteUrl)}/_layouts/15/userphoto.aspx?size=${size}&accountname=${encodeURIComponent(userName)}`; } function IsFolderContentType(contentTypeId) { //item:0x0100 //file:0x0101 //folder:0x0120 //item in MS Lists:0x00 Issue 7121 return contentTypeId.startsWith("0x0120"); } var PageContainerTypes; (function (PageContainerTypes) { PageContainerTypes[PageContainerTypes["M365SPFx"] = 0] = "M365SPFx"; PageContainerTypes[PageContainerTypes["M365OOBListForm"] = 1] = "M365OOBListForm"; PageContainerTypes[PageContainerTypes["SP2019SPFx"] = 2] = "SP2019SPFx"; PageContainerTypes[PageContainerTypes["SP2019ListForm"] = 3] = "SP2019ListForm"; PageContainerTypes[PageContainerTypes["M365ListView"] = 4] = "M365ListView"; })(PageContainerTypes || (exports.PageContainerTypes = PageContainerTypes = {})); function GetModernPageContainers() { let mainContent = document.querySelector("section.mainContent"); if (mainContent) return { mainContent, commandBar: document.querySelector(".commandBarWrapper"), type: PageContainerTypes.M365SPFx }; if ("location" in globalThis && globalThis.location.pathname.toLowerCase().indexOf("kwizform.aspx") !== -1) { mainContent = document.querySelector(".Files-contentAreaFlexContainer"); if (mainContent) { return { mainContent, commandBar: null, type: PageContainerTypes.M365ListView }; } } mainContent = document.querySelector("div[class^=canvasWrapper]"); //document.querySelector("div.SPCanvas"); if (mainContent) return { mainContent, commandBar: document.querySelector(".commandBarWrapper"), type: PageContainerTypes.SP2019SPFx }; mainContent = document.querySelector(".flex-mainColumn"); if (mainContent) return { mainContent, commandBar: null, type: PageContainerTypes.M365OOBListForm }; mainContent = document.querySelector(".Files-mainColumn"); if (mainContent) return { mainContent, commandBar: null, type: PageContainerTypes.SP2019ListForm }; return { mainContent: null, commandBar: null, type: PageContainerTypes.SP2019ListForm }; } function AddCamlQueryFragmentToViewQuery(viewXml, queryFragmentXml) { const combineWithExistingConditions = (doc, existingConditions, newConditionXml) => { const parser = new DOMParser(); const newConditionDoc = parser.parseFromString(newConditionXml, 'text/xml'); const newCondition = doc.importNode(newConditionDoc.documentElement, true); if (existingConditions.length === 0) { return newCondition; } else if (existingConditions.length === 1) { const andElement = doc.createElement("And"); andElement.appendChild(existingConditions[0]); andElement.appendChild(newCondition); return andElement; } else { const lastCondition = existingConditions.pop(); const andElement = doc.createElement("And"); andElement.appendChild(combineWithExistingConditions(doc, existingConditions, "")); andElement.appendChild(lastCondition); return andElement; } }; try { const parser = new DOMParser(); const xmlDoc = parser.parseFromString(viewXml, 'text/xml'); const whereClause = xmlDoc.querySelector('Where') || xmlDoc.createElement('Where'); const existingConditions = Array.from(whereClause.children); const combinedCondition = combineWithExistingConditions(xmlDoc, existingConditions, queryFragmentXml); whereClause.textContent = ''; // Clear existing conditions whereClause.appendChild(combinedCondition); const query = xmlDoc.querySelector('Query') || xmlDoc.createElement('Query'); query.appendChild(whereClause); const view = xmlDoc.querySelector('View') || xmlDoc.createElement('View'); view.appendChild(query); const serializer = new XMLSerializer(); let modifiedCamlXml = serializer.serializeToString(xmlDoc); return modifiedCamlXml; } catch (error) { return viewXml; } } function IsUserEntityValueType(value) { if ((0, typecheckers_1.isNullOrUndefined)(value) || (0, typecheckers_1.isString)(value)) { return false; } var asUserEntityValueType = value; var isEntityValueType = asUserEntityValueType.principalType === sharepoint_types_1.PrincipalType.SharePointGroup || asUserEntityValueType.principalType === sharepoint_types_1.PrincipalType.User || asUserEntityValueType.principalType === sharepoint_types_1.PrincipalType.SecurityGroup; return isEntityValueType; } function IsMultiUserEntityValueType(value) { if ((0, typecheckers_1.isNullOrUndefined)(value) || (0, typecheckers_1.isString)(value) || !Array.isArray(value)) { return false; } return value.every((v) => { return IsUserEntityValueType(v); }); } function IsUrlValueType(value) { if ((0, typecheckers_1.isNullOrUndefined)(value) || (0, typecheckers_1.isString)(value)) { return false; } let asType = value; return !(0, typecheckers_1.isNullOrUndefined)(asType.Url) && !(0, typecheckers_1.isNullOrUndefined)(asType.Description); } function IsRetentionLabelValueType(value) { if ((0, typecheckers_1.isNullOrUndefined)(value) || (0, typecheckers_1.isString)(value)) { return false; } let asType = value; return (0, typecheckers_1.isValidGuid)(asType.TagId) && !(0, typecheckers_1.isNullOrEmptyString)(asType.TagName); } function isHostedInTeams() { return window.location.pathname.toLowerCase().indexOf("teamshostedapp.aspx") >= 0; } function isClassicAppIframe() { return window.location.search.toLowerCase().indexOf("sphosturl=") >= 0 && window.location.search.toLowerCase().indexOf("spappweburl=") >= 0; } function isNumberFieldType(fieldInfo) { let targetColumnOutputType = getFieldOutputType(fieldInfo); return targetColumnOutputType === "Currency" || targetColumnOutputType === "Number" || targetColumnOutputType === "Counter" || targetColumnOutputType === "Integer"; } async function isSharePointOnline() { if (isSPOCommonUrl() === true || isSPOCachedURL() === true || (!(0, typecheckers_1.isTypeofFullNameNullOrUndefined)("_spPageContextInfo") && _spPageContextInfo.isSPO === true)) { return true; } // Can be an expensive call await isSPPageContextInfoReady(); return getAndCacheIsSharePointOnlineResult(); } function isSharePointOnlineSync() { if (isSPOCommonUrl() === true || isSPOCachedURL() === true || (!(0, typecheckers_1.isTypeofFullNameNullOrUndefined)("_spPageContextInfo") && _spPageContextInfo.isSPO === true)) { return true; } // Can be an expensive call isSPPageContextInfoReadySync(); return getAndCacheIsSharePointOnlineResult(); } function isSPOCommonUrl() { let url = new URL(window.location.href); //Most cases are satisfied by this check. Very few customers have custom domains for SharePoint online. if (url.host.toLowerCase().endsWith(".sharepoint.com")) { return true; } return false; } function isSPOCachedURL() { let isSPO = (0, localstoragecache_1.getCacheItem)(`${window.location.host}_isSPO`); return isSPO === true; } function getAndCacheIsSharePointOnlineResult() { let isSPO = !(0, typecheckers_1.isTypeofFullNameUndefined)("_spPageContextInfo") && _spPageContextInfo.isSPO === true; (0, localstoragecache_1.setCacheItem)(`${window.location.host}_isSPO`, isSPO === true, { days: 365 }); return isSPO === true; } async function isAppWeb() { let contextReady = await (0, browser_1.waitFor)(() => { return !(0, typecheckers_1.isTypeofFullNameUndefined)("_spPageContextInfo"); }); if (contextReady) { return _spPageContextInfo.isAppWeb === true; } return false; } function isAppWebSync() { if (!(0, typecheckers_1.isTypeofFullNameUndefined)("_spPageContextInfo")) { return _spPageContextInfo.isAppWeb === true; } return false; } async function isSPPageContextInfoReady() { const contextReady = await (0, browser_1.waitForWindowObject)("_spPageContextInfo", null, 1000); if (contextReady !== true) { let pageAsJson = await GetPageAsJson(); if (!(0, typecheckers_1.isNullOrUndefined)(pageAsJson) && !(0, typecheckers_1.isNullOrUndefined)(pageAsJson.spPageContextInfo)) { globalThis["_spPageContextInfo"] = pageAsJson.spPageContextInfo; } } if (!(0, typecheckers_1.isTypeofFullNameNullOrUndefined)("_spPageContextInfo")) { expandPageContext(); return true; } return false; } function isSPPageContextInfoReadySync() { const contextReady = !(0, typecheckers_1.isTypeofFullNameNullOrUndefined)("_spPageContextInfo"); if (contextReady !== true) { let pageAsJson = GetPageAsJsonSync(); if (!(0, typecheckers_1.isNullOrUndefined)(pageAsJson) && !(0, typecheckers_1.isNullOrUndefined)(pageAsJson.spPageContextInfo)) { globalThis["_spPageContextInfo"] = pageAsJson.spPageContextInfo; } } if (!(0, typecheckers_1.isTypeofFullNameNullOrUndefined)("_spPageContextInfo")) { expandPageContext(); return true; } return false; } function isExternalUser(loginName) { if ((0, typecheckers_1.isNullOrEmptyString)(loginName)) return false; return loginName.indexOf("#ext#@") >= 0; } function expandPageContext() { if (!(0, typecheckers_1.isTypeofFullNameNullOrUndefined)("_spPageContextInfo") && _spPageContextInfo["_hasExpandPageContext"] === true) { return; } logger.groupSync("expandPageContext", log => { const ctx = _spPageContextInfo; ctx["_hasExpandPageContext"] = true; if ((0, typecheckers_1.isNullOrUndefined)(ctx.siteId)) { log("GetSiteIdSync"); ctx.siteId = (0, web_1.GetSiteIdSync)(ctx.siteServerRelativeUrl); } if ((0, typecheckers_1.isNullOrEmptyString)(ctx.webId)) { log("GetWebIdSync"); ctx.webId = (0, web_1.GetWebIdSync)(ctx.webServerRelativeUrl); } if ((0, typecheckers_1.isNullOrUndefined)(ctx.hasManageWebPermissions) && !(0, typecheckers_1.isNullOrUndefined)(ctx.webPermMasks)) { log("hasManageWebPermissions"); let webPerms = new SPBasePermissions(_spPageContextInfo.webPermMasks); ctx.hasManageWebPermissions = webPerms.has(sharepoint_types_1.SPBasePermissionKind.ManageWeb); } if ((0, typecheckers_1.isNullOrEmptyString)(ctx.listId)) { log("ctx.listId"); ctx.listId = ctx.pageListId; } if ((0, typecheckers_1.isNotEmptyString)(ctx.listId)) { //has list if ((0, typecheckers_1.isNullOrEmptyString)(ctx.listUrl)) { log("GetListRootFolderSync"); ctx.listUrl = (0, list_1.GetListRootFolderSync)(ctx.webServerRelativeUrl, ctx.listId).ServerRelativeUrl; } if ((0, typecheckers_1.isNullOrNaN)(ctx.listBaseTemplate)) { log("GetListSync"); const list = (0, list_1.GetListSync)(ctx.webServerRelativeUrl, ctx.listId); ctx.listTitle = list.Title; ctx.listBaseTemplate = list.BaseTemplate; //ctx.listBaseType = list.BaseType; ctx.listPermsMask = list.EffectiveBasePermissions; } if ((0, typecheckers_1.isNullOrUndefined)(ctx.pageItemId)) { log("ctx.pageItemId"); let idParam = (0, url_1.getQueryStringParameter)("ID"); if ((0, typecheckers_1.isNotEmptyString)(idParam) && (0, typecheckers_1.isNumeric)(idParam)) { ctx.pageItemId = Number(idParam); } } if ((0, typecheckers_1.isNullOrNaN)(ctx.pageItemId)) { //no item, in a view if ((0, typecheckers_1.isNullOrUndefined)(ctx.viewId)) { log("GetListViewsSync"); const viewEndsWith = window.location.pathname.substr(window.location.pathname.lastIndexOf("/")).toLowerCase(); const views = (0, list_1.GetListViewsSync)(ctx.webServerRelativeUrl, ctx.listId); const view = (0, collections_base_1.firstOrNull)(views, v => v.ServerRelativeUrl.toLowerCase().endsWith(viewEndsWith)); if (view) ctx.viewId = view.Id; } } if ((0, typecheckers_1.isNullOrEmptyString)(ctx.userEmail)) { log("GetCurrentUserSync"); const user = (0, user_1.GetCurrentUserSync)(ctx.webServerRelativeUrl); ctx.userEmail = user.Email; ctx.userDisplayName = user.Title; } log({ label: "expanded", value: ctx }); } }); } function _getPageAsJsonRequestParams(url) { if ((0, typecheckers_1.isNullOrEmptyString)(url)) { url = window.location.pathname; } return [ `${url}?as=json`, null, { ...rest_1.longLocalCache, headers: { "Content-Type": "application/json;charset=utf-8", "ACCEPT": "application/json; odata.metadata=minimal", "ODATA-VERSION": "4.0" } } ]; } async function GetPageAsJson(url) { try { let response = await (0, rest_1.GetJson)(..._getPageAsJsonRequestParams(url)); return response; } catch { } return null; } function GetPageAsJsonSync(url) { try { let response = (0, rest_1.GetJsonSync)(..._getPageAsJsonRequestParams(url)); return response.success === true ? response.result : null; } catch { } return null; } //# sourceMappingURL=sharepoint.js.map