@kwiz/common
Version:
KWIZ common utilities and helpers for M365 platform
881 lines • 38.7 kB
JavaScript
"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