UNPKG

@kwiz/common

Version:

KWIZ common utilities and helpers for M365 platform

725 lines 33.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isExternalUser = exports.isSPPageContextInfoReadySync = exports.isSPPageContextInfoReady = exports.isAppWebSync = exports.isAppWeb = exports.isSharePointOnlineSync = exports.isSharePointOnline = exports.isNumberFieldType = exports.isClassicAppIframe = exports.isHostedInTeams = exports.IsRetentionLabelValueType = exports.IsUrlValueType = exports.IsMultiUserEntityValueType = exports.IsUserEntityValueType = exports.AddCamlQueryFragmentToViewQuery = exports.GetModernPageContainers = exports.PageContainerTypes = exports.IsFolderContentType = exports.UserPhoto = exports.splitViewFieldsByBatch = exports.isSingleViewPage = exports.isTitleField = exports.ParseThumbnalFieldValue = exports.EnsureViewFields = exports.RemoveOrderByFromCaml = exports.GetOrderByFromCaml = exports.isDocLib = exports.getFieldOutputType = exports.extendFieldInfos = exports.extendFieldInfo = exports.NormalizeRestObject = exports.getPrincipalTypeFromPickerEntity = exports.IsSPPeoplePickerControlFormEntity = exports.CleanupUserClaimsLogin = exports.SPBasePermissions = exports.NormalizeListName = exports.SchemaJsonToXml = exports.SchemaXmlToJson = exports.switchToModernExperience = exports.switchToClassicExperience = exports.setExperienceCookie = exports.ensureClassicExperience = exports.restoreExperience = exports.IsClassicPage = exports.KWIZ_CONTROLLER_FIELD_NAME = void 0; const sharepoint_types_1 = require("../types/sharepoint.types"); 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.get("_modules/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; } exports.IsClassicPage = IsClassicPage; 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, "/"); } } exports.restoreExperience = restoreExperience; 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, splnu); } (0, cookies_1.setCookie)(MOBILE_EXPERIENCE_COOKIE_NAME, "0", null, "/"); switchToClassicExperience(listId); } exports.ensureClassicExperience = ensureClassicExperience; function setExperienceCookie(value, reload) { (0, cookies_1.setCookie)(MODERN_EXPERIENCE_COOKIE_NAME, value); if (reload === true) { window.location.reload(); } } exports.setExperienceCookie = setExperienceCookie; function switchToClassicExperience(listId, reload) { setExperienceCookie(listId ? `{${(0, strings_1.normalizeGuid)(listId)}}` : "0", reload); } exports.switchToClassicExperience = switchToClassicExperience; function switchToModernExperience(reload) { setExperienceCookie("1", reload); } exports.switchToModernExperience = switchToModernExperience; /** Gets field schema XML and converts it into JSON object */ function SchemaXmlToJson(xml) { let result = { Attributes: {}, Customizations: {} }; try { if (!(0, typecheckers_1.isNullOrEmptyString)(xml !== null)) { //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"); if (properties && properties.length > 0) { 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; } exports.SchemaXmlToJson = SchemaXmlToJson; 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; } exports.SchemaJsonToXml = SchemaJsonToXml; 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; } exports.NormalizeListName = NormalizeListName; class SPBasePermissions { constructor(EffectiveBasePermissions) { this.$High = 0; this.$Low = 0; this.initPropertiesFromJson(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; } } } 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; } exports.CleanupUserClaimsLogin = CleanupUserClaimsLogin; 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)); } exports.IsSPPeoplePickerControlFormEntity = IsSPPeoplePickerControlFormEntity; 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; } exports.getPrincipalTypeFromPickerEntity = getPrincipalTypeFromPickerEntity; /** 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; } exports.NormalizeRestObject = NormalizeRestObject; /** * 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; } exports.extendFieldInfo = extendFieldInfo; function extendFieldInfos(fields) { return fields.map(f => extendFieldInfo(f, fields)); } exports.extendFieldInfos = extendFieldInfos; 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; } exports.getFieldOutputType = getFieldOutputType; function isDocLib(list) { return list && list.BaseType === 1; } exports.isDocLib = isDocLib; 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; } exports.GetOrderByFromCaml = GetOrderByFromCaml; 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; } exports.RemoveOrderByFromCaml = RemoveOrderByFromCaml; 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; } exports.EnsureViewFields = EnsureViewFields; /**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; } exports.ParseThumbnalFieldValue = ParseThumbnalFieldValue; function isTitleField(fieldName) { return fieldName === "Title" || fieldName === "LinkTitleNoMenu" || fieldName === "LinkTitle"; } exports.isTitleField = isTitleField; /** 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); } exports.isSingleViewPage = isSingleViewPage; /** * 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; } exports.splitViewFieldsByBatch = splitViewFieldsByBatch; /** 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)}`; } exports.UserPhoto = UserPhoto; function IsFolderContentType(contentTypeId) { //item:0x0100 //file:0x0101 //folder:0x0120 //item in MS Lists:0x00 Issue 7121 return contentTypeId.startsWith("0x0120"); } exports.IsFolderContentType = IsFolderContentType; 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 || (exports.PageContainerTypes = PageContainerTypes = {})); function GetModernPageContainers() { let mainContent = document.querySelector("section.mainContent"); if (mainContent) return { mainContent, commandBar: document.querySelector(".commandBarWrapper"), type: PageContainerTypes.M365SPFx }; 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 }; } exports.GetModernPageContainers = GetModernPageContainers; 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; } } exports.AddCamlQueryFragmentToViewQuery = AddCamlQueryFragmentToViewQuery; 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; } exports.IsUserEntityValueType = IsUserEntityValueType; 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); }); } exports.IsMultiUserEntityValueType = IsMultiUserEntityValueType; 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); } exports.IsUrlValueType = IsUrlValueType; 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); } exports.IsRetentionLabelValueType = IsRetentionLabelValueType; function isHostedInTeams() { return window.location.pathname.toLowerCase().indexOf("teamshostedapp.aspx") >= 0; } exports.isHostedInTeams = isHostedInTeams; function isClassicAppIframe() { return window.location.search.toLowerCase().indexOf("sphosturl=") >= 0 && window.location.search.toLowerCase().indexOf("spappweburl=") >= 0; } exports.isClassicAppIframe = isClassicAppIframe; function isNumberFieldType(fieldInfo) { let targetColumnOutputType = getFieldOutputType(fieldInfo); return targetColumnOutputType === "Currency" || targetColumnOutputType === "Number" || targetColumnOutputType === "Counter" || targetColumnOutputType === "Integer"; } exports.isNumberFieldType = isNumberFieldType; async function isSharePointOnline() { 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; } let contextReady = await (0, browser_1.waitFor)(() => { return !(0, typecheckers_1.isTypeofFullNameUndefined)("_spPageContextInfo"); }); if (contextReady) { return _spPageContextInfo.isSPO === true; } return false; } exports.isSharePointOnline = isSharePointOnline; function isSharePointOnlineSync() { 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; } if (!(0, typecheckers_1.isTypeofFullNameUndefined)("_spPageContextInfo")) { return _spPageContextInfo.isSPO === true; } return false; } exports.isSharePointOnlineSync = isSharePointOnlineSync; async function isAppWeb() { let contextReady = await (0, browser_1.waitFor)(() => { return !(0, typecheckers_1.isTypeofFullNameUndefined)("_spPageContextInfo"); }); if (contextReady) { return _spPageContextInfo.isAppWeb === true; } return false; } exports.isAppWeb = isAppWeb; function isAppWebSync() { if (!(0, typecheckers_1.isTypeofFullNameUndefined)("_spPageContextInfo")) { return _spPageContextInfo.isAppWeb === true; } return false; } exports.isAppWebSync = isAppWebSync; async function isSPPageContextInfoReady() { return await (0, browser_1.waitForWindowObject)("_spPageContextInfo"); } exports.isSPPageContextInfoReady = isSPPageContextInfoReady; function isSPPageContextInfoReadySync() { return !(0, typecheckers_1.isTypeofFullNameNullOrUndefined)("_spPageContextInfo"); } exports.isSPPageContextInfoReadySync = isSPPageContextInfoReadySync; function isExternalUser(loginName) { if ((0, typecheckers_1.isNullOrEmptyString)(loginName)) return false; return loginName.indexOf("#ext#@") >= 0; } exports.isExternalUser = isExternalUser; //# sourceMappingURL=sharepoint.js.map