/********************************************************************************************
* Use: Microsoft CRM Portals
* Author: Pobal
*
* Last Changed: 22/10/2020
* Version: 1.0.0.0
*
* Notes: This JavaScript file will have all generic functions being used on Pobal MS CRM Portals so they can be used as a library
*
* Revision Notes:
* [Author] : [yyyyMMdd]
* [Note]
*********************************************************************************************/
/*
######################################################
# Note to the developer: #
# On every current file update, please update the #
# file version variable below with date-time i.e. #
# __FileVersion_JsLibjs = '2021.02.10'; #
######################################################
*/
__FileVersion_JsLibjs = '2025.09.04';
_FixDeprecatedMaskLengthReduction = false;
//https://francomusso.com/authenticate-with-power-pages-portal-web-api-using-the-wrapper-ajax-function
(function(webapi, $) {
function safeAjax(ajaxOptions) {
var deferredAjax = $.Deferred();
shell.getTokenDeferred().done(function(token) {
// add headers for AJAX
if (!ajaxOptions.headers) {
$.extend(ajaxOptions, {
headers: {
"__RequestVerificationToken": token
}
});
} else {
ajaxOptions.headers["__RequestVerificationToken"] = token;
}
$.ajax(ajaxOptions).done(function(data, textStatus, jqXHR) {
validateLoginSession(data, textStatus, jqXHR, deferredAjax.resolve);
}).fail(deferredAjax.reject);
//AJAX
}).fail(function() {
deferredAjax.rejectWith(this, arguments);
// on token failure pass the token AJAX and args
});
return deferredAjax.promise();
}
webapi.safeAjax = safeAjax;
}
)(window.webapi = window.webapi || {}, jQuery)
if (!Array.prototype.includes) {
Object.defineProperty(Array.prototype, 'includes', {
value: function(searchElement, fromIndex) {
if (this == null) {
throw new TypeError('"this" is null or not defined');
}
// 1. Let O be ? ToObject(this value).
var o = Object(this);
// 2. Let len be ? ToLength(? Get(O, "length")).
var len = o.length >>> 0;
// 3. If len is 0, return false.
if (len === 0) {
return false;
}
// 4. Let n be ? ToInteger(fromIndex).
// (If fromIndex is undefined, this step produces the value 0.)
var n = fromIndex | 0;
// 5. If n ≥ 0, then
// a. Let k be n.
// 6. Else n < 0,
// a. Let k be len + n.
// b. If k < 0, let k be 0.
var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
function sameValueZero(x, y) {
return x === y || (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y));
}
// 7. Repeat, while k < len
while (k < len) {
// a. Let elementK be the result of ? Get(O, ! ToString(k)).
// b. If SameValueZero(searchElement, elementK) is true, return true.
if (sameValueZero(o[k], searchElement)) {
return true;
}
// c. Increase k by 1.
k++;
}
// 8. Return false
return false;
}
});
}
//https://gist.github.com/cscheng/907237
$.fn.truncateLines = function(options) {
options = $.extend($.fn.truncateLines.defaults, options);
return this.each(function(index, container) {
container = $(container);
containerText = container.find('.text');
var containerLineHeight = Math.ceil(parseFloat(container.css('line-height')));
var maxHeight = options.lines * containerLineHeight;
var truncated = false;
var truncatedText = $.trim(containerText.text());
var overflowRatio = container.height() / maxHeight;
if (overflowRatio > 2) {
truncatedText = truncatedText.substr(0, parseInt(truncatedText.length / (overflowRatio - 1), 10) + 1);
// slice string based on how much text is overflowing
containerText.text(truncatedText);
truncated = true;
}
var oldTruncatedText;
// verify that the text has been truncated, otherwise you'll get an endless loop
while (container.height() > maxHeight && oldTruncatedText != truncatedText) {
oldTruncatedText = truncatedText;
truncatedText = truncatedText.replace(/\s.[^\s]*\s?$/, '');
// remove last word
containerText.text(truncatedText);
truncated = true;
}
if (truncated) {
truncatedText = options.ellipsis ? truncatedText + ' ' + options.ellipsis : truncatedText;
containerText.text(truncatedText);
if (container.height() > maxHeight) {
truncatedText = truncatedText.replace(/\s.[^\s]*\s?...$/, '');
// remove last word and ellipsis
truncatedText = options.ellipsis ? truncatedText + ' ' + options.ellipsis : truncatedText;
containerText.text(truncatedText);
}
}
});
}
;
$.fn.truncateLines.defaults = {
lines: 3,
ellipsis: '... '
};
//Global prototypes
String.prototype.format = function() {
var formatted = this;
for (var i = 0; i < arguments.length; i++) {
var regexp = new RegExp('\\{' + i + '\\}','gi');
formatted = formatted.replace(regexp, arguments[i]);
}
return formatted;
};
__Defaults = {
Intl: {
Locale: {
en: 'en-IE',
ie: 'pt-BR',
},
Numbering: {
Options: {
Euro: {
style: 'currency',
currency: 'EUR',
},
Decimal: {
style: 'decimal',
currency: 'EUR',
minimumFractionDigits: 2,
maximumFractionDigits: 2,
},
Percent: {
style: 'percent',
minimumFractionDigits: 2,
maximumFractionDigits: 2,
},
},
},
},
};
if (typeof (JsLib) == "undefined")
JsLib = {
//Global Variables
//...
//Version: __FileVersion_JsLibjs,
Consts: {
OffsetType: {
'Number': 'Number',
'Year': 'Year',
'Month': 'Month',
'Week': 'Week',
'Day': 'Day'
},
Regex: {
Email: /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/g,
TRN: /^\d{7}[a-zA-Z]{2}$|^\d{7}[a-zA-Z]{1}$|^\d{1}[a-zA-Z]{1}\d{5}[a-zA-Z]{2}$|^\d{1}[a-zA-Z]{1}\d{5}[a-zA-Z]{1}$/g,
},
Masks: {
TRN: '0A00000SS',
},
GrantType: {
CapitalAndEquipment: 919200001,
EquipmentOnly: 919200002,
CapitalOnly: 919200003,
//ReliefScheme: 919200004,
},
OrganisationType: {
LocalAuthorities: 'be88f4f7-4bcc-ef11-a72e-6045bddfe56a',
NationalGoverningBodyofSport: '98c2cffa-4bcc-ef11-a72e-7c1e52881235',
DiocesanTrust: 'b888f4f7-4bcc-ef11-a72e-6045bddfe56a',
LocalSportsPartnership: '97c2cffa-4bcc-ef11-a72e-7c1e52881235',
EducationAndTrainingBoard: 'bd88f4f7-4bcc-ef11-a72e-6045bddfe56a',
CommunityGroup: 'b788f4f7-4bcc-ef11-a72e-6045bddfe56a',
DisabilityGroup: 'bb88f4f7-4bcc-ef11-a72e-6045bddfe56a',
OutdoorEducationCentre: '96c2cffa-4bcc-ef11-a72e-7c1e52881235',
School: '95c2cffa-4bcc-ef11-a72e-7c1e52881235',
SpecialInterestGroup: '599d45f7-4bcc-ef11-a72e-7c1e522162c1',
SportsStadium: '5a9d45f7-4bcc-ef11-a72e-7c1e522162c1',
ThirdLevelCollege: '589d45f7-4bcc-ef11-a72e-7c1e522162c1',
},
OwnershipType: {
Leasehold: 919200002,
Freehold: 919200001,
},
YesNo: {
No: 919200000,
Yes: 919200001,
},
ProjectSize: {
Local: 919200001,
Regional: 919200002,
},
SocialMedia: {
Other: 919200000,
Facebook: 919200001,
Instagram: 919200002,
TwitterX: 919200003,
},
SocialMediaIcons: {
Other: '',
Facebook: '',
Instagram: '',
//TwitterX: '',//old
TwitterX: ' 𝕏 ',
//new
},
SchemeType: {
Open: 919200001,
Closed: 919200002,
Targeted: 919200003,
},
ResultStatus: {
Draft: 919200001,
Waiting: 919200002,
Approved: 919200003,
Declined: 919200004,
},
},
Euro: Intl.NumberFormat(__Defaults.Intl.Locale.en, __Defaults.Intl.Numbering.Options.Euro),
Decimal: Intl.NumberFormat(__Defaults.Intl.Locale.en, __Defaults.Intl.Numbering.Options.Decimal),
Percent: Intl.NumberFormat(__Defaults.Intl.Locale.en, __Defaults.Intl.Numbering.Options.Percent),
///
/// Everything inside of this method will be called when the form loads
///
/// Name of the parameter the user wants to retrieve
/// Entire URL
GetURLParameter: function(name, url) {
//Example: GetURLParameters("id", window.location.search);
if (!url)
url = location.href;
name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
var regexS = "[\\?&]" + name + "=([^]*)";
var regex = new RegExp(regexS);
var results = regex.exec(url);
return (results == null) ? null : results[1];
},
LoadCachedScript: function(url, options) {
// Allow user to set any option except for dataType, cache, and url
options = $.extend( options || {}, {
dataType: "script",
cache: true,
url: url
});
return jQuery.ajax( options );
},
ExecuteOnScriptLoad: function(url, functionToExecute) {
JsLib.LoadCachedScript(url).done(function(script, textStatus) {
if (functionToExecute != undefined)
functionToExecute();
});
},
NumberDefinitions: {
DecimalSeparator: function() {
return (JsLib.GetPortalLanguageIndex() == 0) ? '.' : ',';
},
ThousandsSeparator: function() {
return (JsLib.GetPortalLanguageIndex() == 0) ? ',' : '.';
},
},
MaskDecimalNumberValidationCheck: function(valueInput, e, field, options) {
var value = $(field).val();
if (valueInput != null && valueInput.startsWith('00') && valueInput.length > 2 || value.startsWith('0' + JsLib.NumberDefinitions.ThousandsSeparator()) || value.startsWith('0') && value.indexOf(JsLib.NumberDefinitions.DecimalSeparator()) > 1 || value.startsWith('0') && value.indexOf(JsLib.NumberDefinitions.DecimalSeparator()) == -1 && value.length > 3 || value.startsWith(JsLib.NumberDefinitions.ThousandsSeparator())) {
while ((value.startsWith('0') || value.startsWith(JsLib.NumberDefinitions.ThousandsSeparator())) && value.length > 1 && value.substring(1, 2) != JsLib.NumberDefinitions.DecimalSeparator()) {
value = value.substring(1);
$(field).val(value);
}
}
if (value.startsWith(JsLib.NumberDefinitions.DecimalSeparator()))
$(field).val('0' + value);
},
GetDecimalFieldMask: function(fieldLength, precision) {
if (fieldLength == null || fieldLength == '')
fieldLength = 22;
if (precision != 0 && (precision == null || precision == ''))
precision = 2;
if (precision > 2)
precision = 2;
if (_FixDeprecatedMaskLengthReduction == false)
fieldLength--;
//seems that maxLength is always 1 more than max length!
var mask = "";
if (precision > 0) {
mask += JsLib.NumberDefinitions.DecimalSeparator();
for (var i = 0; i < precision; i++)
mask += "0";
}
var separatorsCount = 0;
while (mask.length - separatorsCount < fieldLength) {
for (var i = 0; (i < 3 && mask.length - separatorsCount < fieldLength); i++)
mask = "0" + mask;
if (mask.length - separatorsCount + 1 < fieldLength) {
mask = JsLib.NumberDefinitions.ThousandsSeparator() + mask;
separatorsCount++;
} else
break;
}
return mask;
},
SetupAllDecimalNumberFields: function(selector) {
var defaultPrecision = 2;
var defaultMaxLength = 17;
$(selector).each(function() {
var mask = JsLib.GetDecimalFieldMask(defaultMaxLength, defaultPrecision);
//var mask = JsLib.GetDecimalFieldMask($(this).attr('maxlength'), $(this).attr('precision'));
//$(this).attr('originalMaxlength', $(this).attr('maxlength'));
$(this).attr('maxlength', mask.length);
//$(this).attr('maskUsed', mask);
$(this).mask(mask, {
reverse: true,
onKeyPress: JsLib.MaskDecimalNumberValidationCheck
});
JsLib.CheckForMaskOnKeyPressConflicts($(this));
});
},
SetupAllNumberFields: function() {
var defaultMaxLength = 9;
$('input.integer').each(function() {
var mask = "";
for (var i = 0; i < defaultMaxLength; i++)
mask = "0" + mask;
$(this).attr('maxlength', mask.length);
$(this).mask(mask, {
reverse: true,
onKeyPress: JsLib.MaskDecimalNumberValidationCheck
});
JsLib.CheckForMaskOnKeyPressConflicts($(this));
});
},
SetupAllDecimalFields: function() {
JsLib.SetupAllDecimalNumberFields('input.decimal');
},
SetupAllMoneyFields: function() {
$('input.money').each(function() {
//Check if money symbol is already in there
if ($(this).parent("div").find("span").length == 1)
return;
else
//Add class to parent div
$(this).parent("div").addClass("input-group").prepend("€");
});
JsLib.SetupAllDecimalNumberFields('input.money');
},
SetupAllCheckboxFields: function() {
$('.checkbox-cell').each(function() {
$(this).find('.table-info .field-label').attr('for', $(this).find('.control .checkbox input[type=checkbox]').attr('id'));
});
},
SetupAllGrids: function() {
$('.subgrid.entity-grid').each(function() {
var grid = $(this);
var inputGrid = $('');
grid.append(inputGrid);
grid.on('loaded', function(paramGrid) {
//NOTE TO DEVELOPER - This seems to only bring acurate info in the first load, but not afterwards i.e. when sorting on a grid column
/*var paramGridTargetProperties = Object.getOwnPropertyNames(paramGrid.target);
var target = null;
$.each(paramGridTargetProperties, function(index, propertyName){
if (paramGrid.target[propertyName] != null && paramGrid.target[propertyName].viewLayouts != null)
target = paramGrid.target[propertyName];
});
var rowCount = target != null ? target.totalRecordCount : 0;*/
//NOTE TO DEVELOPER - This only counts visible rows in the paginated grid
var rowCount = grid.find('.view-grid tbody tr').length;
grid.find('input.gridRowCount').val(rowCount).trigger('change');
});
});
$('.subgrid.sharepoint-grid').each(function() {
var grid = $(this);
var inputGrid = $('');
grid.append(inputGrid);
var target = grid.find('.sharepoint-loading');
// Create an observer instance.
var observer = new MutationObserver(function(mutations) {
var rowCount = grid.find('.view-grid tbody tr').length;
grid.find('input.gridRowCount').val(rowCount).trigger('change');
}
);
// Pass in the target node, as well as the observer options.
observer.observe(target[0], {
attributes: true,
childList: true,
characterData: true
});
});
},
/*PrintFunction: function () {
if (confirm("Do you wish to print the page?") == true) {
setTimeout(function () {
//Apply_FixGridWidth();
window.print();
}, 3000);
setTimeout(window.close, 5000);
} else {
window.close();
}
},*/
ShowErrorException: function(errorMessage) {
var msg = JsLib.GetLocalizedString('Default_JSRuntime_ErrorMessageFormat').format(errorMessage);
alert(msg);
return false;
},
SetupTruncatableElement: function(originalTextElement, options) {
var containerLineHeight = Math.ceil(parseFloat(originalTextElement.css('line-height')));
var maxLines = options && options.lines ? options.lines : 3;
var maxHeight = maxLines * containerLineHeight;
if (originalTextElement.height() > maxHeight) {
originalTextElement.wrapInner('').wrapInner('
');
var fullText = originalTextElement.find('.fullText');
var linkFormat = '{1}';
var truncatedText = fullText.clone().removeClass('fullText').addClass('lessText').append($(linkFormat.format('showmore', JsLib.GetLocalizedString('Default_JSRuntime_TextTruncate_More'))));
fullText.append($(linkFormat.format('showless', JsLib.GetLocalizedString('Default_JSRuntime_TextTruncate_Less'))));
fullText.hide();
originalTextElement.append(truncatedText);
truncatedText.truncateLines(options);
originalTextElement.find('.ellipsisToggle').on('click', function() {
$(this).parent().hide();
if ($(this).is('.showless'))
originalTextElement.find('.lessText').show();
else
originalTextElement.find('.fullText').show();
});
}
},
GetErrorToastHeader: function(settings) {
var headerText = 'Error';
if (settings != undefined && settings.headerText != null)
headerText = settings.headerText;
var toastHeader = '';
return toastHeader;
},
AddErrorToastWithDetails: function(localizedText) {
var toastHeader = JsLib.GetErrorToastHeader({
headerText: JsLib.GetLocalizedString('Default_JSRuntime_EditableGrid_ErrorWithDetails_Title')
});
var options = {
animation: true,
autohide: false,
//delay: 3000,
};
var settings = {
locationSelector: '.pageContent',
text: JsLib.GetLocalizedString('Default_JSRuntime_EditableGrid_ErrorWithDetails').format(localizedText),
header: toastHeader,
};
JsLib.AddToast(settings, options);
},
AddToast: function(settings, options) {
if (settings != undefined) {
var locationSelector = settings.locationSelector ? settings.locationSelector : 'body';
var toastContainer = $(locationSelector).find('.toast-container');
if (toastContainer.length == 0) {
var toastContainerHtml = '';
toastContainer = $(toastContainerHtml);
$(locationSelector).prepend($(toastContainerHtml));
}
var toastHtml = '';
var toast = $(toastHtml);
toast.find('.toast-body').prepend(settings.text ? settings.text : 'Text not defined for toast');
if (settings.header != null)
toast.prepend($(settings.header));
if (options == undefined)
options = {
animation: true,
autohide: true,
delay: 3000,
};
$(locationSelector).find('.toast-container').append(toast);
toast.toast(options).toast('show');
}
},
DoRequestCheck: function(requestConfig, callback, preValidationCallback) {
var input = $(requestConfig.elementSelectorToCheck);
var inputHidden = $(requestConfig.elementSelectorToCheckHidden);
input.removeClass('is-valid');
var inputGroup = input.closest('.input-group');
var preCheckSuccessful = (preValidationCallback == undefined || preValidationCallback(requestConfig.elementSelectorToCheck) == true);
if (preCheckSuccessful == false) {
inputGroup.find('.btn.btn-primary').attr('disabled', 'disabled').addClass('disabled');
return;
} else
inputGroup.find('.btn.btn-primary').removeAttr('disabled').removeClass('disabled');
if (requestConfig.elementSelectorToBlockSubmit != null)
$(requestConfig.elementSelectorToBlockSubmit).addClass('disabled').attr('disabled', 'disabled');
/*if (input.val() == '' || input.val().match(requestConfig.regex) == null)
{
callback(null);
return;
}*/
function startRequestAnimation() {
inputGroup //.find('.btn').attr('disable', 'disable')
.find('.spinnerText').text(JsLib.GetLocalizedString('Default_RequestChecker_Loading'));
inputGroup.find('.spinnerIcon').show();
inputHidden.val('untested').trigger('change');
}
function endRequestAnimation() {
inputGroup //.find('.btn').removeProp('disable')
.find('.spinnerText').text(JsLib.GetLocalizedString('Default_RequestChecker_Ready'));
inputGroup.find('.spinnerIcon').hide();
}
var urlToCheck = '/RequestChecker/?function={0}&value={1}'.format(requestConfig.typeOfCheck, input.val());
// + "&bypassCache=" + (new Date().getTime());
startRequestAnimation();
$(function() {
$.ajax({
method: "GET",
url: urlToCheck
}).done(function(msg) {
if (msg == null || msg == undefined) {
alert("An error occurred executing the request.\n\nRefresh the page, and if the issue persists please contact support.");
return;
}
endRequestAnimation();
//console.log(msg);
if (requestConfig.elementSelectorToBlockSubmit != null)
$(requestConfig.elementSelectorToBlockSubmit).removeClass('disabled').removeAttr('disabled');
callback(msg);
});
});
},
SetupRequestChecker: function(requestConfig, callback, preValidationCallback) {
var checkButton = $(''.format(requestConfig.typeOfCheck)).append('').append('' + JsLib.GetLocalizedString('Default_RequestChecker_Ready') + '');
$(requestConfig.elementSelectorToCheck).addClass('dummy')//Note: this class is just to be sacrificed, as due to a PowerPages bug, it will get concatenated with an 'is-valid/is-invalid' class when opening a confirmation modal
.wrap("").closest('.input-group').append(checkButton);
$('.{0}Checker'.format(requestConfig.typeOfCheck)).on('click', function() {
JsLib.DoRequestCheck(requestConfig, callback);
});
$(requestConfig.elementSelectorToCheckHidden).val('').trigger('change');
$(requestConfig.elementSelectorToCheck).on('change keyup', function() {
$(requestConfig.elementSelectorToCheck).removeClass('is-valid').removeClass('is-invalid');
if (requestConfig.elementSelectorToBlockSubmit != null) {
$(requestConfig.elementSelectorToBlockSubmit).addClass('disabled').attr('disabled', 'disabled');
}
});
$(requestConfig.elementSelectorToCheck).on('change', function() {
$(requestConfig.elementSelectorToCheckHidden).val('').trigger('change');
JsLib.DoRequestCheck(requestConfig, callback, preValidationCallback);
});
if ($(requestConfig.elementSelectorToCheck).val() != '')
JsLib.DoRequestCheck(requestConfig, callback);
},
/*ReplaceButtonForEvent: function (buttonSelector, newButtonID, event, callback) {
//add new button and hide existing
var newButton =
$('')
.addClass($(buttonSelector).attr('class')).addClass('replacementButton')
.attr('title', $(buttonSelector).attr('title'))
.attr('id', newButtonID).insertAfter($(buttonSelector));
if ($(buttonSelector).is('input'))
newButton.text($(buttonSelector).val())
if ($(buttonSelector).is('a'))
newButton.text($(buttonSelector).text())
$(buttonSelector).hide();
newButton.on(event, function(){
callback(buttonSelector, event);
});
},//*/
ClearCustomAlertOnPage: function(containerSelector) {
$('.alert.replacementButton').fadeOut().remove();
},
AddCustomAlertOnPage: function(containerSelector, message, removePrevious, alertTypeCss, insertAtTheEnd) {
if (alertTypeCss == null)
alertTypeCss = 'danger';
if (removePrevious == true)
$('.alert.replacementButton').fadeOut().remove();
var errorAlert = $(''.format(alertTypeCss));
//errorAlert.append($(''));
errorAlert.append($(''));
errorAlert.append($('').html(message));
errorAlert.append($(''));
if (insertAtTheEnd == true)
$(containerSelector).append(errorAlert);
else
$(containerSelector).prepend(errorAlert);
},
AddInformationIcon: function(fieldID, infoText) {
var myId = '{0}_icon'.format(fieldID);
var fieldLabelElement = '#{0}_label'.format(fieldID);
var popoverHtml = "";
var label = $(fieldLabelElement).length ? $(fieldLabelElement) : $('label[for="{0}"]'.format(fieldID));
label.append(popoverHtml);
var popoverElem = new bootstrap.Popover($("#" + myId));
},
GetLengthAsIfForCRM: function(str) {
//replaces each newLine char by 2 spaces so that the counting reduces accordingly
return (str + '').replace(/[\r\n]/g, ' ').length;
},
CreateCustomModalHtml: function(parent, config) {
function appendCloseButton(parent, headerConfig) {
var buttonText = headerConfig.text ?? JsStrings.ResourceManagerOverride['Modal_CloseButton_Title'];
var buttonTemplate = '';
parent.append($(buttonTemplate.format(buttonText)));
}
function appendButton(parent, buttonConfig) {
switch (buttonConfig.type) {
case 'submit':
var buttonText = buttonConfig.text ?? JsStrings.ResourceManagerOverride['Form_SubmitButton_Label'];
var buttonTemplate = '';
parent.append($(buttonTemplate.format(buttonText)));
break;
case 'cancel':
var buttonText = buttonConfig.text ?? JsStrings.ResourceManagerOverride['Modal_CancelButton_Label'];
var buttonTemplate = '';
parent.append($(buttonTemplate.format(buttonText)));
break;
default:
break;
}
}
var dialog = $('');
var content = $('');
var header = $(''.format(config.header.title));
if (config.header.renderCloseButton == true)
appendCloseButton(header, config.header);
var body = $('{0}
'.format(config.body.content));
var footer = $('');
$.each(config.footer.buttons, function(index, value) {
appendButton(footer, value);
});
content.append(header).append(body).append(footer).wrapAll(dialog);
dialog.append(content);
parent.append(dialog);
},
ValidatorsAndBehaviours_UpdateCharCount: function(element) {
var template = JsLib.GetLocalizedString('Multiline_CharCounter_format');
if (template == undefined)
template = '({characters} characters remaining)';
if (element.is('[maxlength]'))
maxlength = parseInt(element.attr('maxlength'));
var characters = maxlength - JsLib.GetLengthAsIfForCRM(element.val());
element.parent().find('.charCounter').text(template.replace("{characters}", characters));
},
ValidatorsAndBehaviours_SetCharacterCounter: function(element) {
var template = JsLib.GetLocalizedString('Multiline_CharCounter_format');
if (template == undefined)
template = '({characters} characters remaining)';
var maxlength = 2000;
if (element.is('[maxlength]'))
maxlength = parseInt(element.attr('maxlength'));
//if (element.is('[MyPobalMaxLength]'))
// maxlength = parseInt(element.attr('MyPobalMaxLength'));
var characters = maxlength - JsLib.GetLengthAsIfForCRM(element.val());
if (element.parent().find('.charCounter').length == 0) {
var text = template.replace("{characters}", characters);
$('').addClass('charCounter').attr('defaultText', text).text(text).insertAfter(element);
}
element.on('updateCharCount', function() {
JsLib.ValidatorsAndBehaviours_UpdateCharCount(element)
}).on('change keyup mouseup', function() {
element.trigger('updateCharCount');
});
},
ValidatorsAndBehaviours_ResetCharacterCounter: function(element) {
element.parent().find('.charCounter').each(function() {
//$(this).text($(this).attr('defaultText'));
$(this).val($(this).attr('defaultText'));
});
},
ValidatorsAndBehaviours_SetCharactersCounters: function() {
$(".control textarea").each(function() {
JsLib.ValidatorsAndBehaviours_SetCharacterCounter($(this));
});
},
InsertLoadingScreen: function() {
if ($(".submitting-frame").length > 0) {
return;
}
var frame = $("");
var spinner = $('' + 'Loading...' + '
').appendTo(frame);
frame.appendTo('body').css('opacity', '0').animate({
opacity: 0.7
}, 'fast');
},
GetDate: function(date, isInUTC) {
return JsLib.GetDateWithOffset(date, isInUTC);
},
GetDateWithOffset: function(date, isInUTC, offsetType, offsetValue) {
if (date == null || date == '' || date == 'Invalid date') {
return 0;
}
if (date == '[Today]')
date = moment().startOf('day');
if (offsetType == null || offsetType == '' || offsetValue == null || offsetValue == '') {
return moment(date);
}
if (isInUTC == true)
date = moment.utc(date).local();
else
date = moment(date).local();
switch (offsetType) {
case JsLib.Consts.OffsetType.Year:
return moment.utc(date).add(offsetValue, 'years');
case JsLib.Consts.OffsetType.Month:
return moment.utc(date).add(offsetValue, 'months');
case JsLib.Consts.OffsetType.Week:
return moment.utc(date).add(offsetValue, 'weeks');
case JsLib.Consts.OffsetType.Day:
return moment.utc(date).add(offsetValue, 'days');
default:
return 0;
}
},
RegisterValidator: function(elementID, errorConfig, validationFunc, fieldsSelectorToHookup) {
if (typeof (Page_Validators) == 'undefined')
return;
function EvaluateTabErrorFlagging(val, elementID, result) {
var cell = $(f).closest('.cell');
cell.removeClass('customValidation').removeClass('customValidationFailed').removeClass('customValidationPassed');
if (!cell.is('.customValidationFixedRequired')) {
cell.addClass('customValidation');
if (result == false)
cell.addClass('customValidationFailed');
else
cell.addClass('customValidationPassed');
}
var tabList = $('#' + elementID).closest('.MyCustomTabs');
if (tabList.length > 0) {
var tabPane = $('#' + elementID).closest('.tab-pane');
var tabNavigationItem = tabList.find('#' + tabPane.attr('id') + '-li');
var tabNavigationLink = tabNavigationItem.find('a');
var hasTabPaneValidationErrors = false;
tabNavigationLink.find($('span.errorTab[validator="' + val.id + '"]')).remove();
tabNavigationItem.removeClass('hasErrors').removeClass('valid');
if (result == false) {
tabNavigationLink.append($(''));
} else {
//check remaining validations from that tabPane
hasTabPaneValidationErrors = JsLib.HasValidationErrorsOnTab(tabPane, false)
/*tabPane.find('.validators span').each(function(){
var validatorID = $(this).attr('id');
var foundValidation = GetValidatorByID(validatorID);
if (foundValidation!= null && foundValidation.isvalid == null)
ValidatorValidate(foundValidation);
if (foundValidation!= null && foundValidation.isvalid == false)
hasTabPaneValidationErrors = true;
});*/
}
//else
// tabPane.find('span.errorsOnPreviousSteps').remove();
if (result == false || hasTabPaneValidationErrors)
tabNavigationItem.addClass('hasErrors');
else
tabNavigationItem.addClass('valid');
tabNavigationLink.find($('span.errorTabFlag')).remove();
if (tabNavigationLink.find('span.errorTab').length > 0) {
tabNavigationLink.append($(''));
}
}
}
function FormatSummaryErrorMessage(elementID, errorConfig) {
return '' + errorConfig.msg + '';
//ToDo: open corresponding tab
}
function GenerateUniqueValidatorName(elementID, valIndex) {
var preffix = 'RequiredX';
var nameToUse = preffix + 'Validator' + elementID + '_' + valIndex;
if (Page_Validators.filter(function(val) {
return (val.id === nameToUse);
}).length > 0)
return GenerateUniqueValidatorName(elementID, valIndex + 1);
return nameToUse;
}
//alert('InitiatingValidation:' + elementID);
var newValidator = document.createElement('span');
//newValidator.style.display = "inline";
newValidator.id = GenerateUniqueValidatorName(elementID, 0);
newValidator.controltovalidate = elementID;
if (errorConfig.skipErrorMessage != true)
newValidator.errormessage = FormatSummaryErrorMessage(elementID, errorConfig);
newValidator.initialvalue = "";
newValidator.display = "Dynamic";
newValidator.evaluationfunction = function() {
var result = validationFunc();
EvaluateTabErrorFlagging(this, elementID, result);
return result;
}
;
Page_Validators.push(newValidator);
function GetValidatorByID(validatorID) {
return Page_Validators.find(element => (element.id == validatorID));
}
function onValidationEvent(validatorID) {
var foundValidation = GetValidatorByID(validatorID);
//Page_Validators.find(element => (element.id == validator.id));
//alert($('#' + foundValidation.controltovalidate).getVal());
if (foundValidation && foundValidation.isvalid != 'undefined') {
ValidatorValidate(foundValidation);
$('#' + foundValidation.controltovalidate).closest('.control').find('.validators > #' + foundValidation.id).toggle(!foundValidation.isvalid);
//if (foundValidation.isvalid)
if (!JsLib.HasValidationErrorsOnField(foundValidation.controltovalidate, false))
$('#' + foundValidation.controltovalidate).closest('.control').removeClass('hasErrors').closest('.cell').removeClass('hasErrors');
else
$('#' + foundValidation.controltovalidate).closest('.control').addClass('hasErrors').closest('.cell').addClass('hasErrors');
} else {
$('#' + foundValidation.controltovalidate).closest('.control').find('.validators > #' + foundValidation.id).hide();
$('#' + foundValidation.controltovalidate).closest('.control').removeClass('hasErrors').closest('.cell').removeClass('hasErrors');
}
}
function registerChoicesChangeEvent(id, callback) {
//https://www.engineeredcode.com/blog/power-pages-multiselect-change-event
const hiddenInput = $('#' + id);
let previousValue = hiddenInput.val();
// 1: create `MutationObserver` instance
const observer = new MutationObserver( (mutations) => {
// 2: iterate over `MutationRecord` array
mutations.forEach(mutation => {
// 3.1: check if the mutation type and the attribute name match
// 3.2: check if value changed
if (mutation.type === 'attributes' && mutation.attributeName === 'value' && hiddenInput.val() !== previousValue) {
previousValue = hiddenInput.val();
callback.call(hiddenInput[0]);
}
}
);
}
);
observer.observe(hiddenInput[0], {
attributes: true
});
}
function HookupControls(fieldIDsToHookup, validatorID) {
function onlyUniqueNotEmpty(value, index, array) {
return value != '' && array.indexOf(value) === index;
}
var uniqueFieldIDsToHookup = (fieldIDsToHookup + ',').split(',').filter(onlyUniqueNotEmpty);
$.each(uniqueFieldIDsToHookup, function(index, controlID) {
var elementToHookup = 0;
if ($('#' + controlID).getType() == "input.radiolist")
//.is('span.boolean-radio'))
elementToHookup = $('#' + controlID).find('input');
if ($('#' + controlID).getType().startsWith("input.text") || $('#' + controlID).getType().startsWith("input.checkbox") || $('#' + controlID).getType().startsWith("input.select") || $('#' + controlID).getType() == "input.radio")
//.is('input[type="text"],input[type="email"],input[type="checkbox"],textarea,select'))
elementToHookup = $('#' + controlID);
//if ($('#' + controlID).getType() == "input.radio")//.is('input[type="radio"]'))
// elementToHookup = $('#' + controlID);
if ($('#' + controlID).getType() == "input.file") //.is('input[type="file"]'))
{
const hiddenFilename = $('#{0}hidden_filename'.format(controlID));
// 1: create `MutationObserver` instance
const observer = new MutationObserver( (mutations) => {
$('#' + controlID).trigger('change');
}
);
observer.observe(hiddenFilename[0], {
attributes: true
});
elementToHookup = hiddenFilename;
}
if ($('#' + controlID).getType().startsWith("complex.datetime")) //.is('.datetime'))
{
$('#' + controlID).closest('div.control').on("dp.change jsLibEvent", function(e) {
$('#' + controlID).trigger('change');
});
elementToHookup = $('#' + controlID);
}
if ($('#' + controlID).getType() == "complex.lookup")
//.is('.lookup'))
elementToHookup = $('#' + controlID);
//ToDo: check later if there is a better way for identifying the multiselection option sets
if ($('#' + controlID).getType() == "complex.msop") {
//$("span#" + controlID + "_Container > span#PcfControlConfig_" + controlID).length == 1){
var choicesField = $("#" + controlID + "_Container");
registerChoicesChangeEvent(controlID, function() {
var checkboxDataItem = choicesField.find("li>>input.msos-checkbox").on("change jsLibEvent", function(e) {
choicesField.trigger('change');
});
});
choicesField.find("li>>input.msos-checkbox").trigger('change');
elementToHookup = choicesField;
}
if ($('#' + controlID).getType() == "complex.subgrid" || $('#' + controlID).getType() == "complex.SPOgrid") {
var rowCountField = $('#' + controlID).find('input.gridRowCount');
rowCountField.trigger('change');
elementToHookup = rowCountField;
}
if (elementToHookup == 0)
return;
ValidatorHookupControl(elementToHookup, GetValidatorByID(validatorID));
elementToHookup.on('change jsLibEvent', function() {
onValidationEvent(validatorID);
});
//.trigger('change');//ToDo: investigate why this was uncommented
});
$('#' + elementID).on('change jsLibEvent', function() {
onValidationEvent(validatorID);
});
//.trigger('change');//ToDo: investigate why this was uncommented
}
var f = '#' + elementID;
//var validatorsDiv = $(f).next('.validators');
var validatorsDiv = $(f).closest('.control').find('.validators');
if (validatorsDiv.length == 0) {
validatorsDiv = $('').addClass('validators');
validatorsDiv.prependTo($('#' + elementID).closest('.control'));
//validations will show above the editable control
//validatorsDiv.appendTo($('#' + elementID).closest('.control'));//validations will show below the editable control
}
if (errorConfig.asHtml == true)
validatorsDiv.append($('').addClass('error text-danger')/*.addClass('label label-danger')*/
.attr('id', newValidator.id).html(errorConfig.msg).hide());
else
validatorsDiv.append($('').addClass('error text-danger')/*.addClass('label label-danger')*/
.attr('id', newValidator.id).text(errorConfig.msg).hide());
HookupControls(elementID + ',' + fieldsSelectorToHookup, newValidator.id);
},
ClearFieldMode: function(targetElement, clearFieldMode) {
if (clearFieldMode != null) {
var valueToSet = "";
if (clearFieldMode != true)
valueToSet = clearFieldMode;
if (clearFieldMode == true) {
if (clearFieldMode == true && $(targetElement).getType().startsWith("complex.subgrid")) {
$(targetElement).find('.entity-grid .view-grid thead tr .editable_headerActions').remove();
$(targetElement).find('.entity-grid').trigger('refresh');
return;
}
$(targetElement).removeClass('dirty');
}
$(targetElement).setVal(valueToSet);
if ($(targetElement).getType().startsWith("input.textarea"))
$(targetElement).trigger('updateCharCount');
$(targetElement).trigger('jsLibEvent');
}
},
HideControlBasedOnRule: function(elementID, behaviourFunc, clearFieldMode) {
var targetElement = '#' + elementID;
var rulesAreMet = behaviourFunc();
if (rulesAreMet)
$(targetElement).closest('.cell').hide();
else
$(targetElement).closest('.cell').show();
//$(targetElement).closest('.cell').toggle(rulesAreMet == true);
if (rulesAreMet)
JsLib.ClearFieldMode(targetElement, clearFieldMode);
},
//Param keepEnabled is only setup form input controls so far.
LockControlBasedOnRule: function(elementID, behaviourFunc, clearFieldMode, keepEnabled) {
var targetElement = '#' + elementID;
var rulesAreMet = behaviourFunc();
var stateChanged = false;
var disabledAttr = (keepEnabled != true) ? 'disabled' : 'readonly';
if (rulesAreMet == false) {
//$(strSelector).removeAttr('disabled').removeClass('disabled');
if ($(targetElement).getType().startsWith("input")) {
$(targetElement).removeClass('disabled');
if ($(targetElement).getType() == "input.textarea")
//if ($(targetElement).is('.textarea'))
$(targetElement).removeAttr('readonly');
else
$(targetElement).removeAttr(disabledAttr);
if ($(targetElement).is('.money'))
$(targetElement).closest('.input-group').find('.input-group-text').removeClass('disabled');
}
if ($(targetElement).getType().startsWith("input.file"))
$(targetElement).closest('.file-control-container').removeClass('disabled').find('input[type="file"], button').removeAttr('disabled').removeClass('disabled');
if ($(targetElement).getType().startsWith("input.radio"))
//if ($(targetElement).is('.picklistRadio'))
$(targetElement).find('input[type="radio"]').removeAttr('disabled').removeClass('disabled');
if ($(targetElement).getType().startsWith("complex.datetime"))
$(targetElement).closest('.control').find('.datetimepicker .input-text-box, .datetimepicker .input-group-addon').removeClass('disabled').removeAttr('disabled');
if ($(targetElement).getType().startsWith("complex.lookup"))
$(targetElement).closest('.input-group').find('.lookup, .btn').removeClass('disabled').removeAttr('disabled');
if ($(targetElement).getType().startsWith("complex.msop"))
$(targetElement).closest('.control').find('.msos-container').find('.msos-input,.msos-caret-button,.msos-quick-delete').removeClass('disabled').removeAttr('disabled');
if ($(targetElement).getType().startsWith("complex.subgrid")) {
$(targetElement).find('.entity-grid').find('a, button').removeAttr('disabled').removeClass('disabled');
//$(targetElement).find('.entity-grid').trigger('jsStateChanged');
}
if ($(targetElement).getType().startsWith("complex.SPOgrid"))
$(targetElement).find('.sharepoint-grid').find('a, button').removeAttr('disabled').removeClass('disabled');
$(targetElement).find('.btn, a').removeAttr('disabled').removeClass('disabled');
$(targetElement).closest('.cell').find('.table-info').removeAttr('disabled').removeClass('disabled');
stateChanged = $(targetElement).is('.disabled');
$(targetElement).removeClass('disabled');
//eircodeStuff
if ($(targetElement).siblings('#eircodeDiv').length > 0)
$(targetElement).siblings('#eircodeDiv').find('.btn, a, input').removeAttr('disabled').removeClass('disabled');
} else {
//$(strSelector).attr('disabled', 'disabled').addClass('disabled');
if ($(targetElement).getType().startsWith("input")) {
$(targetElement).addClass('disabled');
if ($(targetElement).getType() == "input.textarea")
//if ($(targetElement).is('.textarea'))
$(targetElement).attr('readonly', 'readonly');
else
$(targetElement).attr(disabledAttr, disabledAttr);
if ($(targetElement).is('.money'))
$(targetElement).closest('.input-group').find('.input-group-text').addClass('disabled');
}
if ($(targetElement).getType().startsWith("input.file"))
$(targetElement).closest('.file-control-container').addClass('disabled').find('input[type="file"], button').attr('disabled', 'disabled').addClass('disabled');
if ($(targetElement).getType().startsWith("input.radio"))
//if ($(targetElement).is('.picklistRadio'))
$(targetElement).find('input[type="radio"]').attr('disabled', 'disabled').addClass('disabled');
if ($(targetElement).getType().startsWith("complex.datetime"))
$(targetElement).closest('.control').find('.datetimepicker .input-text-box, .datetimepicker .input-group-addon').addClass('disabled').attr('disabled', 'disabled');
if ($(targetElement).getType().startsWith("complex.lookup"))
$(targetElement).closest('.input-group').find('.lookup, .btn').addClass('disabled').attr('disabled', 'disabled');
if ($(targetElement).getType().startsWith("complex.msop"))
$(targetElement).closest('.control').find('.msos-container').find('.msos-input,.msos-caret-button,.msos-quick-delete').addClass('disabled').attr('disabled', 'disabled');
if ($(targetElement).getType().startsWith("complex.subgrid")) {
$(targetElement).find('.entity-grid').find('a, button').attr('disabled', 'disabled').addClass('disabled');
//$(targetElement).find('.entity-grid').trigger('jsStateChanged');
}
if ($(targetElement).getType().startsWith("complex.SPOgrid"))
$(targetElement).find('.sharepoint-grid').find('a, button').attr('disabled', 'disabled').addClass('disabled');
$(targetElement).find('.btn, a').attr('disabled', 'disabled').addClass('disabled');
$(targetElement).closest('.cell').find('.table-info').attr('disabled', 'disabled').addClass('disabled');
stateChanged = ($(targetElement).is('.disabled') == false);
$(targetElement).addClass('disabled');
//eircodeStuff
if ($(targetElement).siblings('#eircodeDiv').length > 0) {
$(targetElement).siblings('#eircodeDiv').find('.btn, a, input').attr('disabled', 'disabled').addClass('disabled');
$(targetElement).siblings('#eircodeDiv').find('.autoaddress-options-msg .autoaddress-close-msg').trigger('click');
//closing any pending message
}
}
if (rulesAreMet || (stateChanged && $(targetElement).getType().startsWith("complex.subgrid")))
this.ClearFieldMode(targetElement, clearFieldMode);
},
RegisterHideBehaviour: function(elementID, behaviourFunc, fieldIDsToHookup, clearFieldMode) {
JsLib = this;
function onlyUniqueNotEmpty(value, index, array) {
return value != '' && array.indexOf(value) === index;
}
var uniqueFieldIDsToHookup = (fieldIDsToHookup + ',').split(',').filter(onlyUniqueNotEmpty);
$.each(uniqueFieldIDsToHookup, function(index, fieldIdToHookup) {
var elementToHookup = 0;
if ($('#' + fieldIdToHookup).getType() == "complex.datetime") //.is('.datetime'))//TODO
{
$('#' + fieldIdToHookup).closest('div.control').on("dp.change jsLibEvent", function(e) {
JsLib.HideControlBasedOnRule(elementID, behaviourFunc, clearFieldMode);
});
elementToHookup = $('#' + fieldIdToHookup);
return;
}
if ($('#' + fieldIdToHookup).getType() == "input.radiolist") {
}
//general fallback
$('#' + fieldIdToHookup)//.on('change', function(){ JsLib.HideControlBasedOnRule(elementID, behaviourFunc, clearFieldMode); });
.on('change jsLibEvent', function() {
JsLib.HideControlBasedOnRule(elementID, behaviourFunc, clearFieldMode);
});
JsLib.HideControlBasedOnRule(elementID, behaviourFunc, clearFieldMode);
});
},
RegisterLockBehaviour: function(elementID, behaviourFunc, fieldIDsToHookup, clearFieldMode, keepEnabled) {
JsLib = this;
function onlyUniqueNotEmpty(value, index, array) {
return value != '' && array.indexOf(value) === index;
}
var uniqueFieldIDsToHookup = (fieldIDsToHookup + ',').split(',').filter(onlyUniqueNotEmpty);
$.each(uniqueFieldIDsToHookup, function(index, fieldIdToHookup) {
var elementToHookup = 0;
if ($('#' + fieldIdToHookup).getType() == "complex.datetime") //.is('.datetime'))//TODO
{
$('#' + fieldIdToHookup).closest('div.control').on("dp.change jsLibEvent", function(e) {
JsLib.LockControlBasedOnRule(elementID, behaviourFunc, clearFieldMode, keepEnabled);
});
elementToHookup = $('#' + fieldIdToHookup);
return;
}
if ($('#' + fieldIdToHookup).getType() == "complex.subgrid") {
$('#' + fieldIdToHookup).on('loaded jsLibEvent', function() {
JsLib.LockControlBasedOnRule(elementID, behaviourFunc, clearFieldMode, keepEnabled);
});
return;
}
if ($('#' + fieldIdToHookup).getType() == "complex.SPOgrid") //TODO
{
var target = $('#' + fieldIdToHookup).find('.sharepoint-loading');
// Create an observer instance.
var observer = new MutationObserver(function(mutations) {
JsLib.LockControlBasedOnRule(fieldIdToHookup, behaviourFunc, clearFieldMode, keepEnabled);
}
);
// Pass in the target node, as well as the observer options.
observer.observe(target[0], {
attributes: true,
childList: true,
characterData: true
});
return;
}
/*if ($('#' + fieldIdToHookup).getType() == "input.radiolist")
{
}//*/
//general fallback
$('#' + fieldIdToHookup)//.on('change', function(){ JsLib.LockControlBasedOnRule(elementID, behaviourFunc, clearFieldMode, keepEnabled); });
.on('change jsLibEvent', function() {
JsLib.LockControlBasedOnRule(elementID, behaviourFunc, clearFieldMode, keepEnabled);
});
JsLib.LockControlBasedOnRule(elementID, behaviourFunc, clearFieldMode, keepEnabled);
});
},
LockField: function(elementID, clearFieldMode) {
JsLib.LockControlBasedOnRule(elementID, function() {
return true;
}, clearFieldMode);
},
HideField: function(elementID, clearFieldMode) {
JsLib.HideControlBasedOnRule(elementID, function() {
return true;
}, clearFieldMode);
},
UnlockField: function(elementID, clearFieldMode) {
JsLib.LockControlBasedOnRule(elementID, function() {
return false;
}, clearFieldMode);
},
UnhideField: function(elementID, clearFieldMode) {
JsLib.HideControlBasedOnRule(elementID, function() {
return false;
}, clearFieldMode);
},
RegisterDefaultMandatoryValidation: function(elementID, errorConfig) {
var f = '#' + elementID;
$(f).closest('.cell').addClass('customValidationFixedRequired');
JsLib.RegisterValidator(elementID, errorConfig, function(n=elementID + "Validation") {
$(f).attr('validationName', n);
return (//type a condition to pass validation
$(f).isNotBlank() || $(f).isLocked() || $(f).isHidden());
}, elementID);
//fields to monitor
},
RegisterDefaultLock: function(elementID) {
if ($('#' + elementID).getType().startsWith('complex.subgrid') || $('#' + elementID).getType().startsWith('complex.SPOgrid')) {
var gridSelector = '#' + elementID;
if ($(gridSelector).getType().startsWith('complex.subgrid')) {
$(gridSelector).on('loaded', function() {
JsLib.LockField(elementID);
});
}
if ($(gridSelector).getType().startsWith('complex.SPOgrid')) {
var target = $(gridSelector).find('.sharepoint-loading');
// Create an observer instance.
var observer = new MutationObserver(function(mutations) {
JsLib.LockField(elementID);
}
);
// Pass in the target node, as well as the observer options.
observer.observe(target[0], {
attributes: true,
childList: true,
characterData: true
});
}
} else
JsLib.LockField(elementID);
},
HasValidationErrorsOnValidator(validator, triggerUpdates) {
if (validator.isvalid == null)
ValidatorValidate(validator);
if (triggerUpdates) {
var control = $('#' + validator.controltovalidate);
if (control.getType() == 'complex.msop' && control.val() == '')
control.val('[]');
control.trigger('change');
}
return (validator.isvalid == false);
//return (validator.evaluationfunction() == false);
},
HasValidationErrorsOnTab(tab, triggerUpdates) {
var tabHasErrors = false;
tab.find('.control .validators span').each(function() {
var validatorID = $(this).attr('id');
//for (var index = 0; index < Page_Validators.length; index++) {
// var validator = Page_Validators[index];
$.each(Page_Validators, function(index, validator) {
if (validator.id == validatorID && JsLib.HasValidationErrorsOnValidator(validator, triggerUpdates))
//{
tabHasErrors = true;
// break;
//}
//}
});
});
return tabHasErrors;
},
HasValidationErrorsOnField(elementID, triggerUpdates) {
//debugger;
var fieldHasErrors = false;
$.each(Page_Validators, function(index, validator) {
//for (var index = 0; index < Page_Validators.length; index++) {
// var validator = Page_Validators[index];
if (validator.controltovalidate == elementID)
if (JsLib.HasValidationErrorsOnValidator(validator, triggerUpdates)) {
fieldHasErrors = true;
//console.log(validator.id);
return;
// break;
}
//}
});
return fieldHasErrors;
},
GoToFieldValidationErrors(elementID) {
JsLib.HasValidationErrorsOnField(elementID, true);
$('.MyCustomTabList li#' + $('#' + elementID).closest('.tab-pane').attr('id') + '-li a').tab('show');
if ($('#' + elementID).getType() == 'complex.subgrid' || $('#' + elementID).getType() == 'complex.SPOgrid')
scrollToAndFocus(elementID, elementID);
else
scrollToAndFocus(elementID + '_label', elementID);
},
GetAlertHeadingHtml(headingIconCSS, headingText) {
var alertHeading = '' + '
'.format(headingIconCSS) + '
{0}
'.format(headingText) + '
';
return alertHeading;
},
CheckForMaskOnKeyPressConflicts(control) {
var conflictingValue = 'javascript:return LengthError(this, event);';
if (control.attr('onkeypress') == conflictingValue) {
control.attr('onkeypress_original', conflictingValue).removeAttr('onkeypress');
}
},
DecorateButtonWithSpanClass(form, originalButtonSelector) {
$(originalButtonSelector).wrap($('').addClass(form.submit.button.decorateButtonWithSpanClass));
},
ReplaceButtonWithValueFormat(form, originalButtonSelector) {/*
//this functionality fails when the submit is cancelled due to validations
//RF at 2025/09/02: enabled as I cannot find where this is failing anymore
var newHtml = form.submit.button.replaceButtonWithValueFormat.format($(originalButtonSelector).val());
var replacementButton = $('')
.addClass($(originalButtonSelector).attr('class'))
.addClass('btnNoMargins')
.attr('title', $(originalButtonSelector).attr('title'))
.html(newHtml)
.insertAfter($(originalButtonSelector))
.on('click', function(){
if (Page_ClientValidate() == false)
return;
$(this)
//.attr('disabled','disabled')
//.addClass('disabled');
//.text(JsLib.GetLocalizedString("Replacement_Button_Default_LoadingText"));
//$(this).hide();
//$(originalButtonSelector).show().click();
$(originalButtonSelector).click();
});
$(originalButtonSelector).hide();
//*/
},
SetMaxLength(fieldID, field) {
$('#' + fieldID).attr('maxlength', field.maxlength);
},
RenderTextAreaAsPrintable(textArea) {
if (textArea.is('.renderingComplete'))
return;
var label = null;
var labelContent = textArea.text();
if (textArea.is('.removeRichTextStyles')) {
var tempDiv = $('').html(labelContent);
tempDiv.find('[style]').each(function() {
$(this).removeAttr('style');
});
labelContent = tempDiv.html();
}
if (textArea.is('.renderAsRichText'))
label = $('').html(labelContent);
else
label = $('').text(labelContent);
label.insertAfter(textArea);
textArea.addClass('renderingComplete').attr('style', 'display:none !important');
textArea.parent('.control').find('.charCounter').hide();
},
GetLocalizedOptionText(entityName, optionValue) {
var languageOptionIndex = JsLib.GetPortalLanguageIndex();
var localizedText = 'Unknown localized value';
$.each(JsDataTranslations[entityName], function(index, item) {
if (item.value == optionValue) {
var languageSuffix = languageOptionIndex == 0 ? '_en' : '_ie';
localizedText = item['text' + languageSuffix];
}
});
return localizedText;
},
SetupForm(forms) {
function ActivateTab(form, tabElement) {
$('#' + tabElement.attr('id') + '-li a').tab('show');
}
function TabNavigationLinkMarkup(tabSetup, tabID, tabTitle, tabNumber) {
var linkContent = '' + tabTitle + '';
linkContent = '' + tabNumber + '' + linkContent;
return '' + linkContent + '';
}
function TabsMarkup(form) {
var containerCss = ' col-xl-9 col-md-9 ';
var navigationCss = ' col-xl-3 col-md-3 flex-column ms-auto ';
if (form.renderAsPrintable == true)
containerCss = ' nav-tabs col-xl-8 col-md-8 ';
else {
if (form.tabSetup.showNavigationTabs == false)
containerCss = 'col-xl-6 col-md-6 offset-xl-3 offset-md-3';
}
if (form.tabSetup.showNavigationTabsSize != null)
navigationCss = form.tabSetup.showNavigationTabsSize;
if (form.tabContainerSize != null)
containerCss = form.tabContainerSize;
if (form.renderAsPrintable != true)
containerCss = 'tab-content ' + containerCss;
var navigationList = '';
var navigationDiv = '' + navigationList + '
';
var tabContainer = '';
var content = tabContainer;
//if (form.tabSetup.showNavigationTabs != false)
content += navigationDiv;
return '' + content + '
';
}
function TabCommandPrev(cssClass, iconClass, text) {
return '';
}
function TabCommandNext(cssClass, iconClass, text, isLastTab) {
if (isLastTab)
return '';
else
return '';
}
function TabPaneMarkup(form, tab, tabID, tabNumber) {
var tabPaneCss = '';
if (tab != null && tab.tabSize != null)
tabPaneCss += tab.tabSize;
if (form.renderAsPrintable == true)
tabPaneCss += ' printableTabPane';
return '';
}
function TabFieldsetMarkup(form, tab, tabID) {
var legend = tab.tabLegend;
if (form.renderAsPrintable == true || legend == null)
legend = tab.tabTitle;
if (legend != null)
legend = '';
return '';
}
function SetTabNavigationButtons() {
//var tabCount = $('.entity-form .tab-pane').length;
$('.entity-form .tab-pane:not(.tabNotInUse)').each(function(index) {
var tabPane = $(this);
var prevLinksTemplate = $('');
var nextLinksTemplate = $('');
if (index != 0)
prevLinksTemplate.find('.tab-commands-row').append($(TabCommandPrev('', 'bi bi-chevron-left', JsLib.GetLocalizedString('TabCommands_Back'))));
//nextPrevLinksTemplate.find('.row').append($(''));
var isLastTab = tabPane.is('.entity-form .tab-pane:nth-last-child(1)');
tabPane.prepend(prevLinksTemplate);
if (isLastTab) {
var actions = $('.entity-form ~ .actions, .entity-form ~ .form-custom-actions');
var newSubmitButtonContainer = tabPane.append($('')).find('.tab-commands-container-bottom');
//move original update button into last tab in case of tabs
actions.detach().appendTo(newSubmitButtonContainer);
} else {
nextLinksTemplate.find('.tab-commands-row').append($(TabCommandNext('', ''/*'bi bi-chevron-right'*/
, JsLib.GetLocalizedString('TabCommands_Next'), isLastTab)));
tabPane.append(nextLinksTemplate);
}
});
}
function CreateTabPanesFromCRMTab(form) {
var tabCount = 0;
$('.entity-form .tab').each(function(index) {
var tab = $(this);
var tabNumber = tabCount;
var tabID = tab.attr('data-name');
var tabTitle = tab.prev('h2').text();
if (tabTitle == '')
tabTitle = tabID;
var link = $(TabNavigationLinkMarkup(form.tabSetup, tabID, tabTitle, tabNumber));
//if (form.tabSetup.useTabsFromCRM == true)
link.appendTo($('ul.MyCustomTabList'));
var tabPane = $(TabPaneMarkup(form, null, tabID, tabNumber));
tabPane.appendTo($('div#MyCustomTabListContent'));
tab.attr('id', tabID).prev('h2').detach().appendTo(tabPane);
tab.attr('id', tabID)/*.addClass('tab-pane')*/
.detach().appendTo(tabPane);
if (form.tabSetup.defaultTabID != null && form.tabSetup.defaultTabID == tabID)
ActivateTab(form, tab);
tabCount++;
if (form.tabSetup.useTabsFromCRM == false) {
//tab.closest('.tab-pane').addClass('tabNotInUse').hide();
tabPane.addClass('tabNotInUse').hide();
$('.MyCustomTabList .nav-item[tabnumber=' + tabNumber + ']').hide();
}
});
}
function CreateCustomPane(form, tab) {
var currentTabNumber = $('.tab-pane').length;
var tabNumber = currentTabNumber;
var tabID = 'MyCustomTab' + tabNumber;
//alert('setting up tab(' + tabID + '):' + tab.tabTitle);
$(TabNavigationLinkMarkup(form.tabSetup, tabID, tab.tabTitle, tabNumber)).appendTo($('ul.MyCustomTabList'));
$(TabPaneMarkup(form, tab, tabID, tabNumber)).appendTo($('div#MyCustomTabListContent'));
$(TabFieldsetMarkup(form, tab, tabID)).appendTo($('#' + tabID));
$.each(tab.tabFields, function(index, tabField) {
$('#' + tabField).closest('tr').detach().appendTo($('.' + tabID + '-tbody'));
});
}
function GetSubmitButton() {
return $('.actions input.submit-btn, .form-custom-actions input.submit-btn');
}
function SetTabStatusFromButton(saveAsDraftConfig, buttonElement) {
var tabStatusValue = GetTabStatusFromSaveButton(buttonElement);
$('#' + saveAsDraftConfig.tabStatusField).val(tabStatusValue);
}
function GetTabStatusFromSaveButton(buttonElement) {
var tabStatusValue = '';
if (buttonElement.is('.saveAndExit'))
tabStatusValue = buttonElement.closest('.tab-pane').attr('tabNumber') + '#' + 'exit';
if (buttonElement.is('.saveAndContinue'))
tabStatusValue = buttonElement.closest('.tab-pane').next('.tab-pane').attr('tabNumber') + '#' + 'continue';
if (buttonElement.is('.confirm'))
tabStatusValue = '1#' + 'confirm';
return tabStatusValue;
}
function DoSaveAsDraft(form, buttonElement) {
var saveAsDraftConfig = form.saveAsDraft;
var disableValidations = 'all';
if (buttonElement.is('.saveAndContinue') && form.saveAsDraft != null && form.saveAsDraft.enableSaveAndContinueValidationOnEachTab == true)
disableValidations = 'furtherStepsOnly';
var currentTab = buttonElement.closest('.tab-pane');
if (disableValidations != null) {
if (disableValidations == 'furtherStepsOnly') {
/*var nextTabs = currentTab.nextAll('.tab-pane').each(function(index){
DisableTabValidators($(this));
});*/
if (!JsLib.HasValidationErrorsOnTab(currentTab, true)) //if (!JsLib.HasValidationErrorsOnTab(currentTab, false))
{
var currentStepsValidators = [];
currentTab.find('.control .validators span').each(function() {
//var validator = GetValidatorByID($(this).attr('id'));
//ValidatorValidate(validator);
//validator.isvalid
currentStepsValidators.push($(this).attr('id'));
});
$.each(Page_Validators, function(index, validator) {
if (!currentStepsValidators.includes(validator.id))
ValidatorEnable(validator, false);
});
}
}
if (disableValidations == 'all') {
$.each(Page_Validators, function(index, validator) {
ValidatorEnable(validator, false);
});
}
}
if (!JsLib.HasValidationErrorsOnTab(currentTab, false)) {
buttonElement.text(JsLib.GetLocalizedString("SaveAsDraft_Button_Default_LoadingText")).addClass("disabled");
SetTabStatusFromButton(saveAsDraftConfig, buttonElement);
}
//enabling inputs so that readonly fields can still save their value, in case they got updated by code
$('input[disabled=disabled],select[disabled=disabled]').removeAttr('disabled');
var submitButton = GetSubmitButton();
submitButton.trigger('click');
}
function SetupSaveAsDraft(form) {
$('#' + form.saveAsDraft.tabStatusField).closest('.cell').hide();
var saveAsDraftConfig = form.saveAsDraft;
var originalSubmitButtonContainer = $('.actions .form-action-container-left, .form-custom-actions .form-action-container-left');
var saveAsDraftButtonContainer = originalSubmitButtonContainer;
if ($('.MyCustomTabs').length > 0) {
var lastTab = $('.MyCustomTabs .tab-pane:last .tab-commands-container-bottom');
//lastTab.append($(''));
saveAsDraftButtonContainer = $('.MyCustomTabs .tab-command-next').add($('.submit-btn').parent());
//var actions = $('.entity-form ~ .actions, .entity-form ~ .form-custom-actions');
}
var ancestorColumnSizing = saveAsDraftButtonContainer.parent();
if (ancestorColumnSizing.is('.col-md-6') && saveAsDraftButtonContainer.parents('.narrowCrmEntityFormView').length > 0)
ancestorColumnSizing.addClass('col-md-12').removeClass('col-md-6');
var submitButton = GetSubmitButton();
submitButton.addClass('confirm');
$('').text(JsLib.GetLocalizedString("SaveAndExit_Button_Default_Text")).addClass('btn btn-secondary saveAndExit').addClass(form.saveAsDraft.additionalCssClass).appendTo(saveAsDraftButtonContainer);
$('.tab-commands-container-bottom .tab-command-next .nextTabButton').each(function() {
if (saveAsDraftConfig.enableSaveAndContinueOnEachTab && !$(this).closest('.tab-pane').is(':last'))
$(this).addClass('btn btn-primary btn-lg button submit-btn saveAndContinue').removeClass('nextTabButton').unbind('click');
});
$('.saveAndExit, .saveAndContinue').on("click", function() {
DoSaveAsDraft(form, $(this));
});
return;
}
/* function HandleSaveAsDraftRedirection(form) {
var tabStatusValue = $('#' + form.handleSaveAsDraftRedirection.tabStatusField).val();
var tabStatusMode = (tabStatusValue + '#').split('#')[1];
if (tabStatusMode == 'exit')
{
window.location.replace(form.handleSaveAsDraftRedirection.listRelativeUrl);
return;
}
if (tabStatusMode == 'continue')
{
var tabNumber = (tabStatusValue + '#').split('#')[0];
var paramID = JsLib.GetURLParameter('id', window.location.search);
var url = window.location;
if (form.renderEditLinks != null)
{
url = form.renderEditLinks.redirectionRelativeUrl;
if (form.renderEditLinks.appendParams == true)
url += '?id={0}&tab={1}'.format(paramID, tabNumber);
if (form.renderEditLinks.appendCustomParamStr != null)
url += form.renderEditLinks.appendCustomParamStr;
}
window.location.replace(url);
return;
}
//if (tabStatusMode == 'confirm')
// return;
return;
}*/
function CheckInitialTabToShow(form) {
var initialTab = JsLib.GetURLParameter('tab', window.location.search);
if (initialTab != null)
ActivateTab(form, $('.entity-form .tab-content .tab-pane:not(.tabNotInUse)[tabnumber=' + initialTab + ']'));
else {
if (form.saveAsDraft != null && form.saveAsDraft.tabStatusField != undefined) {
var tabNumber = ($('#' + form.saveAsDraft.tabStatusField).val() + '#').split('#')[0];
if (tabNumber == '')
tabNumber = $('.entity-form .tab-content .tab-pane:not(.tabNotInUse)').filter(':first').attr('tabNumber');
var tabToEnable = '.MyCustomTabList li.nav-item[tabNumber="' + tabNumber + '"] a';
//alert('enabling tab('+$(tabToEnable).length+'):' + tabToEnable);
$(tabToEnable).tab('show');
}
if ($('.entity-form .tab-content .tab-pane.active').length == 0)
ActivateTab(form, $('.entity-form .tab-content .tab-pane:not(.tabNotInUse):first'));
}
//we need to clear this so that the OOTB submit send the field cleared
if (form.saveAsDraft != null && form.saveAsDraft.tabStatusField != undefined)
$('#' + form.saveAsDraft.tabStatusField).val('');
}
function AnimateSubmit() {/*var old_entityFormClientValidate = entityFormClientValidate;
entityFormClientValidate = function(){
JsLib.InsertLoadingScreen();
old_entityFormClientValidate();
};*/
}
function SetupSubmit(form) {
if (form.submit == null)
return;
if (form.submit.animate == true)
AnimateSubmit();
if (form.submit.button != null && form.submit.button.additionalCssClass != null)
$('input.submit-btn').addClass(form.submit.button.additionalCssClass);
if (form.submit.button != null && form.submit.button.replaceButtonWithValueFormat != null)
JsLib.ReplaceButtonWithValueFormat(form, 'input.submit-btn');
if (form.submit.button != null && form.submit.button.decorateButtonWithSpanClass != null)
JsLib.DecorateButtonWithSpanClass(form, 'input.submit-btn');
}
function AddPrintButton(form) {
var printText = JsLib.GetLocalizedString('Default_PrintableForm_PrintButton_Text');
var printingText = JsLib.GetLocalizedString('Default_PrintableForm_PrintButton_ClickedText');
var printButton = $('').addClass('btn btn-secondary printButton').attr('href', '#').text(printText);
printButton.on('click', function() {
function launchPrintScreen() {
//ensures a bit of time for the iframe to render in case the print button is clicked while the accordion is still closing
setTimeout(function() {
window.print();
}, 500);
$("#PrintButton span").text(printText);
$("#PrintButton").attr("disabled", false);
}
function waitToLaunchPrintScreen() {
var hasLoadingGrids = false;
//$('.entity-grid.subgrid .view-loading').each(function (index) {
// if ($(this).css('display') != "none")
// hasLoadingGrids = true;
//});
if (hasLoadingGrids || $('iframe#OrganidationDetailsQuickView[mypobal-iframe-status!="ready"]').length > 0)
setTimeout(function() {
waitToLaunchPrintScreen();
}, 500);
else
launchPrintScreen();
}
$("#PrintButton span").text(printingText);
$("#PrintButton").attr("disabled", true);
waitToLaunchPrintScreen();
});
//*/
//printButton.insertAfter($('input.submit-btn'));
printButton.appendTo($('.actions'));
}
function ProcessTabValidators() {
$('.entity-form .tab-pane:not(.tabNotInUse)').each(function(index) {
var tabPane = $(this);
var tabNumber = tabPane.attr('tabnumber');
var tabStep = $('.MyCustomTabList .nav-item[tabnumber="' + tabNumber + '"] ');
if (JsLib.HasValidationErrorsOnTab(tabPane, false))
tabStep.addClass('hasErrors');
else
tabStep.addClass('valid');
});
}
function ProcessValidationsSummary(form) {
$('.validation-summary').each(function() {
//there is just one anyway
var alert = $(this);
alert.addClass('custom-validation-summary');
var errorHeading = JsLib.GetLocalizedString('Default_JSRuntime_ValidationSummary_ErrorTitle');
var errorHeadingHtml = JsLib.GetAlertHeadingHtml('bi-exclamation-circle', errorHeading);
var validationSummaryID = alert.attr('id');
var currentValidationSummaryHtml = window[validationSummaryID].headertext;
window[validationSummaryID].headertext = errorHeadingHtml + currentValidationSummaryHtml;
if (form.hideValidationSummaryOnActionClick == true) {
$(".crmEntityFormView a, .crmEntityFormView button").on('click', function() {
alert.hide();
});
}
});
}
function ProcessServerValidationMessages() {
$('#MessagePanel #MessageLabel').each(function() {
//there is just one anyway
var originalText = $(this).text().trim();
var localizedText = '';
if (originalText.startsWith('[code 000]')) {
var errorTxt = originalText.replace('[code 000]', '').trim();
localizedText = JsLib.GetLocalizedString('Default_JSRuntime_ValidationSummary_SystemErrorMessageFormat').format(errorTxt);
} else
localizedText = JsLib.GetLocalizedString(originalText);
var localizedErrorStr = JsLib.GetLocalizedString('Default_JSRuntime_ValidationSummary_ErrorTitle');
var html = $(this).html().replace(originalText, '');
var new_pTitle = $('').text(localizedErrorStr);
var new_pText = $('').text(localizedText);
$(this).html(html).append(new_pText).find('p:first').append(new_pTitle).find('.fa-exclamation-triangle').removeClass('fa').removeClass('fa-exclamation-triangle').addClass('bi bi-exclamation-circle');
});
}
function EnableTabs(form) {
if (form.tabSetup != null) {
$(TabsMarkup(form)).appendTo('.entity-form');
CreateTabPanesFromCRMTab(form);
if (form.tabSetup.showNavigationTabs == false) {
$('ul.MyCustomTabList').hide();
}
if (form.tabSetup.showDefaultCRMTab != true) {
$('.tab-title').closest('.tab-pane').hide();
}
if (form.tabSetup.showDefaultCRMSection != true) {
$('.tab-title ~ .tab').hide();
}
}
$.each(form.customTabs, function(index, tab) {
if (tab.tabTitle != null)
CreateCustomPane(form, tab);
});
if (form.tabSetup != null) {
if (form.tabSetup.useNextPrevLinks == true) {
SetTabNavigationButtons();
$('.entity-form .tab-pane .tab-command-prev a').on('click', function(index) {
var button = $(this);
ActivateTab(form, button.closest('.tab-pane').prev('.tab-pane'));
});
$('.entity-form .tab-pane .tab-command-next a.nextTabButton').on('click', function(index) {
var button = $(this);
if (form.tabSetup.showNavigationTabs == true || JsLib.HasValidationErrorsOnTab(button.closest('.tab-pane'), true) == false)
ActivateTab(form, button.closest('.tab-pane').next('.tab-pane'));
});
/*
if ($('.MyCustomTabs').length > 0)
{
var actions = $('.entity-form ~ .actions, .entity-form ~ .form-custom-actions');
//var submitButton = $('.entity-form ~ .actions input.submit-btn, .entity-form ~ .form-custom-actions input.submit-btn');
var lastTab = $('.MyCustomTabs .tab-pane:last .tab-commands-container-bottom');
var originalSubmitButtonContainer = $('.actions .form-action-container-left, .form-custom-actions .form-action-container-left');
var newSubmitButtonContainer = lastTab.find('.tab-command-next');
//move original update button into last tab in case of tabs
if (newSubmitButtonContainer != originalSubmitButtonContainer)
//submitButton.detach().prependTo(newSubmitButtonContainer);
actions.detach().prependTo(newSubmitButtonContainer);
}*/
}
if (form.renderAsPrintable == true) {
$(".MyCustomTabList .nav-item .nav-link").on('click', function() {
//alert("PRESSED TAB!");
var tabElement = $(this);
$('html,body').animate({
scrollTop: $(tabElement.attr('data-bs-target') + ' fieldset .section').offset() ? $(tabElement.attr('data-bs-target') + ' fieldset .section').offset().top / 2 : 0
}, 500);
});
$(".MyCustomTabs .printableTabPane").each(function(index) {
var tabPane = $(this);
tabPane.find("fieldset").each(function(index) {
var fieldset = $(this);
fieldset.find("table.section").each(function(index) {
var table = $(this);
table.find("tr").each(function(index) {
var tr = $(this);
tr.find("td").each(function(index) {
var td = $(this);
var labelSize = 'col-xl-5 col-md-5 align-self-center';
var controlSize = 'col-xl-7 col-md-7 align-self-center';
if (td.closest('td').is('.table,.subgrid-cell'))
labelSize = controlSize = 'col-xl-12 col-md-12 g-0';
td.find(".table-info").each(function(index) {
var label = $(this);
label.addClass(labelSize);
});
td.find(".control").each(function(index) {
var control = $(this);
control.addClass(controlSize);
});
td.addClass('row');
});
});
});
if (form.renderEditLinks != null) {
fieldset.find('legend').wrapInner('');
var paramID = JsLib.GetURLParameter('id', window.location.search);
var link = form.renderEditLinks.redirectionRelativeUrl;
if (form.renderEditLinks.appendParams == true)
link += '?id={0}&tab={1}'.format(paramID, tabPane.attr('tabnumber'));
if (form.renderEditLinks.appendCustomParamStr != null)
link += form.renderEditLinks.appendCustomParamStr;
var changeLink = $('').append($('').text(JsLib.GetLocalizedString('Default_PrintableForm_ChangeLink_Text')));
fieldset.find('legend').append(changeLink);
fieldset.find('legend').wrapInner('');
}
});
});
}
}
}
function GetErrorConfig(customRule, fieldLabel) {
var errorConfig = {};
errorConfig.msg = customRule.errorMessage;
if (errorConfig.msg == null && customRule.errorMessageFormat != null)
errorConfig.msg = customRule.errorMessageFormat.format(fieldLabel);
if (customRule.errorMessageAsHtml == true)
errorConfig.asHtml = true;
if (customRule.skipErrorMessage == true)
errorConfig.skipErrorMessage = true;
if (errorConfig.msg == null)
errorConfig.msg = JsLib.GetLocalizedString('Default_MandatoryFieldMessageFormat').format(fieldLabel);
return errorConfig;
}
function SortSelectLocalizedOptions(control) {
var options = control.find('option');
var selectedValue = options.filter('[selected="selected"]').attr('value');
options.sort(function(o1, o2) {
const o1t = $(o1).text();
const o2t = $(o2).text();
const o1v = $(o1).val();
const o2v = $(o2).val();
if (o1v == "")
return -1;
if (o2v == "")
return 1;
return o1t.localeCompare(o2t);
});
control.html(options);
control.val(selectedValue);
}
function SetupBehavioursAndValidations(form) {
$.each(form.fields, function(index, field) {
if (field.fieldSelector == null)
return;
var fieldID = $(field.fieldSelector).attr('id');
if (field.placeholder != undefined && $(field.fieldSelector).is('input,textarea'))
$(field.fieldSelector).attr('placeholder', field.placeholder);
if (field.formCellCSS != undefined)
$(field.fieldSelector).closest('.cell').addClass(field.formCellCSS);
var fieldLabel = JsLib.GetControlLabel(fieldID);
if (field.inputMask != undefined) {
var optionsParam = null;
if (field.inputMask.optionsStr != null && field.inputMask.optionsStr != '')
optionsParam = JSON.parse(field.inputMask.optionsStr);
$(field.fieldSelector).mask(field.inputMask.mask, optionsParam);
JsLib.CheckForMaskOnKeyPressConflicts($(field.fieldSelector));
}
if (field.tip != undefined)
JsLib.AddInformationIcon(fieldID, field.tip.innerHtml);
//JsLib.RenderTipWithText_OnLoad(fieldID + '_label', field.tip.innerHtml, field.tip.attributesStr);
if (field.required == true) {
var errorConfig = {
msg: JsLib.GetLocalizedString('Default_MandatoryFieldMessageFormat').format(fieldLabel)
};
if (field.requiredErrorMessage != null)
errorConfig.msg = field.requiredErrorMessage;
JsLib.RegisterDefaultMandatoryValidation(fieldID, errorConfig);
}
if (field.readonly == true)
JsLib.RegisterDefaultLock(fieldID);
if (field.maxlength != undefined)
JsLib.SetMaxLength(fieldID, field);
if (field.actions != null) {
$.each(field.actions.customRules, function(index, customRule) {
if (customRule.rule == null || customRule.type == null)
return;
var eventRule = customRule.rule;
switch (customRule.type.toLowerCase()) {
case 'ensurethat':
var errorConfig = GetErrorConfig(customRule, fieldLabel);
eventRule(fieldID, errorConfig);
break;
case 'hiddenwhen':
eventRule(fieldID, customRule.clearFieldMode);
break;
case 'readonlywhen':
eventRule(fieldID, customRule.clearFieldMode, customRule.keepControlEnabledForSubmit);
break;
default:
break;
}
});
}
if (field.lookupSettings != null) {
var lookupSettings = field.lookupSettings;
if (lookupSettings.modalLookupForm != null) {
var modalLookupForm = lookupSettings.modalLookupForm;
if (modalLookupForm.fieldView != null) {
var fieldView = modalLookupForm.fieldView;
$('#' + fieldID + '_lookupmodal .entity-grid').on('loaded', function() {
if (fieldView.dataTranslatedFields != null) {
var dataTranslatedFields = fieldView.dataTranslatedFields;
$.each(dataTranslatedFields, function(index, dataTranslatedField) {
var tdList = $('#' + fieldID + '_lookupmodal .view-grid td[data-attribute="' + dataTranslatedField.fieldName + '"]');
var tdListHeaderLink = tdList.first().closest('.view-grid').find('th a[aria-label="' + tdList.first().data('th') + '"]');
var tdListHeader = tdListHeaderLink.closest('th');
if (JsLib.GetPortalLanguage() != dataTranslatedField.language) {
tdList.hide();
tdListHeader.hide();
} else {
if (lookupSettings.replaceLocalizedOptions == true)
tdListHeader.not('.sort').find('a:first').click();
}
});
}
});
}
}
if (lookupSettings.replaceLocalizedOptions == true && lookupSettings.replaceLocalizedOptions_EntityName != null) {
var entityName = lookupSettings.replaceLocalizedOptions_EntityName;
if ($('#' + fieldID).getType().startsWith("input.select")) {
$('#' + fieldID + ' option[value]:not([enLanguageText])').each(function() {
var optionValue = $(this).val();
if (optionValue == null || optionValue == '')
return;
$(this).attr('enLanguageText', $(this).text());
var localizedText = JsLib.GetLocalizedOptionText(entityName, optionValue);
$(this).text(localizedText);
});
SortSelectLocalizedOptions($('#' + fieldID));
}
if ($('#' + fieldID).getType().startsWith("complex.lookup")) {
var languageOptionIndex = JsLib.GetPortalLanguageIndex();
$('#' + fieldID + '_lookupmodal .entity-grid').on('loaded', function() {
$(this).find('.view-grid tbody tr').each(function() {
var languageSuffix = languageOptionIndex == 0 ? '' : '_ie';
var tdLanguage = $(this).find('td[data-attribute="scp_name' + languageSuffix + '"]');
$(this).attr('data-name', tdLanguage.text());
});
});
var optionValue = $('#' + fieldID).val();
if (optionValue == null || optionValue == '')
return;
var localizedText = JsLib.GetLocalizedOptionText(entityName, optionValue);
$('#' + fieldID + '_name').val(localizedText);
}
}
}
if (field.formCellCSS != null)
$(field.fieldSelector).closest('.cell').addClass(field.FormCellCSS);
if (field.showSubgridActionsAsLinks == true)
JsLib.ShowGridActionsAsLinks(field.fieldSelector);
if (field.moveSubgridActionsButtonsToBottom == true)
JsLib.MoveSubgridActionsButtonsToBottom(field.fieldSelector);
if (field.helpText != null)
JsLib.AddHelpSection(fieldID, field.helpText);
if (field.renderingSettings != null) {
var renderingSettings = field.renderingSettings;
if (renderingSettings.renderAsRichText == true)
$(field.fieldSelector).addClass('renderAsRichText');
if (renderingSettings.removeRichTextStyles == true)
$(field.fieldSelector).addClass('removeRichTextStyles');
}
});
$('.tab-pane.tabNotInUse').each(function() {
DisableTabValidators($(this));
});
SetupSubgrids(form);
}
function DisableTabValidators(tabPane) {
tabPane.find('.control .validators span').each(function() {
var span = $(this);
ValidatorEnable(Page_Validators.find(element => (element.id == span.attr('id'))), false);
});
}
function ReplaceOriginalRequiredFieldValidators(form) {
$('.crmEntityFormView').addClass('originalRequiredFieldMarkingsHidden');
$('.cell .table-info .validators span[id^="RequiredFieldValidator"]').each(function(index) {
var validatorID = $(this).attr('id');
var validator = Page_Validators.find( (pageValidator) => pageValidator.id === validatorID);
var elementID = validator.controltovalidate;
var errorConfig = {
msg: JsLib.GetLocalizedString('Default_MandatoryFieldMessageFormat').format($('#' + validator.controltovalidate + '_label').text())
};
var f = '#' + elementID;
JsLib.RegisterValidator(elementID, errorConfig, function(n="ReplacementRequiredFieldValidator" + elementID) {
$(f).attr('validationName', n);
return ($(f).isNotBlank());
}, elementID);
//ValidatorEnable(validator, false);
//Page_Validators.remove(validator);
Page_Validators = Page_Validators.filter(function(item) {
return item !== validator
})
});
var old_entityFormClientValidate = entityFormClientValidate;
entityFormClientValidate = function() {
var old_return = old_entityFormClientValidate();
//ValidatorUpdateIsValid();
Page_ClientValidate();
var result = old_return && Page_IsValid;
if (result)
{
//enabling inputs so that readonly fields can still save their value, in case they got updated by code
$('input[disabled=disabled],select[disabled=disabled]').removeAttr('disabled');
}
return result;
/*var allSucceded = true;
$.each(Page_Validators, function(index, validator) {
//$('#' + validator.controltovalidate).trigger('change');
if (validator == null || validator.controltovalidate == null)
return;
if(validator.isvalid == null)
ValidatorValidate(validator);
if (validator.evaluationfunction != null && validator.evaluationfunction() == true)
{
console.log('The validator: ' + validator.id + ' is failing');
allSucceded = false;
}
});
//return old_return && Page_IsValid;
return old_return && allSucceded;//*/
}
;
}
function SetupSubgrids(form) {
if ($('.crmEntityFormView').length > 0) {
var selector = //'.crmEntityFormView .subgrid .sharepoint-grid.subgrid,' +
'.crmEntityFormView .subgrid .entity-grid.subgrid';
$(selector).each(function(index) {
var grid = $(this);
grid.on('loaded', function() {//grid.find('.view-toolbar.grid-actions').insertAfter(grid.find('.view-pagination'));
});
});
}
}
function RenderFormAsPrintable(form) {
$('textarea').each(function() {
JsLib.RenderTextAreaAsPrintable($(this));
});
$('input[type=text]').each(function() {
var value = $(this).val();
if ($(this).getType().startsWith('complex.datetime'))
return;
if ($(this).getType().startsWith('input.text.money'))
value = $(this).attr('value');
var label = $('').text(value);
label.insertAfter($(this));
$(this).attr('style', 'display:none !important');
});
$('select').each(function() {
var label = $('').text($(this).find('option[value!=""]:selected').text());
label.insertAfter($(this));
$(this).attr('style', 'display:none !important');
});
}
if (forms == undefined)
return;
var stepID = JsLib.GetURLParameter('stepid', window.location.search);
$.each(forms, function(index, form) {
if (form.formStepID != null && form.formStepID.toLowerCase() != stepID.toLowerCase())
return;
//if (form.handleSaveAsDraftRedirection != null)
// HandleSaveAsDraftRedirection(form);
if (JsLib.GetURLParameter('disableTabs') == null) {
EnableTabs(form);
if (form.renderPrintButton == true)
AddPrintButton(form);
if (form.saveAsDraft != null)
SetupSaveAsDraft(form);
CheckInitialTabToShow(form);
$("a, button").on('click', function() {
$('.informationIcon').popover('hide');
});
}
if (form.entityFormCSS != null)
$('.crmEntityFormView').addClass(form.entityFormCSS);
if (JsLib.GetURLParameter('disableBehaviours') == null) {
SetupBehavioursAndValidations(form);
if (form.submit != null)
SetupSubmit(form);
if (form.replaceRequiredFieldValidatorsAutomatically == true)
ReplaceOriginalRequiredFieldValidators(form);
}
if (form.renderAsPrintable)
RenderFormAsPrintable(form);
ProcessTabValidators();
ProcessServerValidationMessages();
ProcessValidationsSummary(form);
$('.crmEntityFormView').addClass('customCrmEntityFormView');
$('.formLoadingOverlay').fadeOut();
});
},
MSOS: {
//https://powerusers.microsoft.com/t5/Front-end-Code-Samples/Manipulating-Choices-Multiselect-OptionSet-via-JavaScript/td-p/1862803
GetChoicesValue(fieldName) {
var choicesField = $("#" + fieldName + "_Container");
var selectedValues = [];
choicesField.find('.msos-selected-display-item').each(function() {
selectedValues.push($(this).data('value'));
});
//console.log(selectedValues);
return selectedValues;
},
SetChoicesValues(fieldName, valuesToSelect, clearSelectedChoices) {
var choicesField = $("#" + fieldName + "_Container");
if (!valuesToSelect || !valuesToSelect.length) {
return;
}
if (!!clearSelectedChoices) {
ClearChoicesValues(fieldName)
}
valuesToSelect.forEach(function(item) {
var valuesSelected = GetChoicesValue(fieldName);
if (!!valuesSelected && valuesSelected.indexOf(item) == -1) {
var checkboxDataItem = choicesField.find("li>>input.msos-checkbox[value='" + item + "']");
if (!!checkboxDataItem) {
checkboxDataItem.click();
}
}
});
},
ClearChoicesValues(fieldName) {
var choicesField = $("#" + fieldName + "_Container");
var checkboxDataItem = choicesField.find("li>>input.msos-checkbox");
if (!!checkboxDataItem) {
checkboxDataItem.trigger('change', false);
}
},
SelectAllChoicesValues(fieldName) {
var choicesField = $("#" + fieldName + "_Container");
var checkboxDataItem = choicesField.find("li>>input.msos-checkbox");
if (!!checkboxDataItem) {
checkboxDataItem.trigger('change', true);
}
},
},
StyleEntityListColumnBasedOnValues(gridConfig) {
var gridSelector = '.entity-grid';
if (gridConfig != null && gridConfig.selector != null && gridConfig.selector != '')
gridSelector = gridConfig.selector;
$(gridSelector).on('loaded', function() {
$(this).find('.view-grid tbody tr').each(function(index) {
var td = $(this).find('td[data-attribute="' + gridConfig.columnDecoration + '"]');
if (td.length == 0)
return;
var jsonValue = td.data('value');
/*jsonValue = {"Value":919200001,"ExtensionData":null} */
$.each(gridConfig.columnDecorationArray, function(index, item) {
if (item.value == jsonValue.Value) {
if (item.wrapAround != null)
td.wrapInner($(item.wrapAround));
if (item.wrapAround != null)
td.addClass(item.class);
}
});
});
});
},
RenameGridViews(gridConfig) {
var gridSelector = '.entity-grid';
if (gridConfig != null && gridConfig.selector != null && gridConfig.selector != '')
gridSelector = gridConfig.selector;
var target = $(gridSelector).find('.view-loading');
// Create an observer instance.
var observer = new MutationObserver(function(mutations) {
$(gridSelector).find('.view-select .nav-item .nav-link').each(function(index) {
var viewLink = $(this);
$.each(gridConfig.viewNamesArray, function(index, item) {
if (item.defaultName == viewLink.text())
viewLink.text(JsLib.GetLocalizedString(item.strName));
});
});
/*$.each(gridConfig.linkViewNamesArray, function(index, item){
if (item.renderLinkUrlFormat != null)
{
var linkNavLinkUrl = item.renderLinkUrlFormat.format(window.location.search);
var linkNavLink = '{1}'
.format(linkNavLinkUrl, JsLib.GetLocalizedString(item.strName), item.position, item.linkCssClass);
var linkNavItem = $('{0}'.format(linkNavLink));
$(gridSelector).find('.view-select').append(linkNavItem);
}
});//*/
}
);
// Pass in the target node, as well as the observer options.
observer.observe(target[0], {
attributes: true,
childList: true,
characterData: true
});
/*$(gridSelector).on('loaded', function(){
$(gridSelector).find('.view-select .nav-item .nav-link').each(function(index){
var viewLink = $(this);
$.each(gridConfig.viewNamesArray, function(index, item){
if (item.defaultName == viewLink.text())
viewLink.text(JsLib.GetLocalizedString(item.strName));
});
});
});*/
},
ShowGridActionsAsLinks(entityListSelector) {
if (entityListSelector == null || entityListSelector == '')
entityListSelector = '.entity-grid';
/*if ($(entityListSelector).getType().startsWith('complex.subgrid'))
{
$(entityListSelector).on('loaded', function(){
$(this).find('.view-grid tbody tr').each(function(index){
var dropdown = $(this).find('td .dropdown.action');
var td = dropdown.closest('td');
var links = dropdown.find('.dropdown-item');
td.prepend(links);
dropdown.remove();
});
});
}
if ($(entityListSelector).getType().startsWith('complex.SPOgrid'))
{
var target = $(entityListSelector).find('.sharepoint-loading');
// Create an observer instance.
var observer = new MutationObserver(function(mutations) {
$(entityListSelector).find('.view-grid tbody tr').each(function(index){
var dropdown = $(this).find('td .dropdown.action');
var td = dropdown.closest('td');
var links = dropdown.find('.dropdown-item');
td.prepend(links);
dropdown.remove();
});
});
// Pass in the target node, as well as the observer options.
observer.observe(target[0], {
attributes: true,
childList: true,
characterData: true
});
}//*/
},
AddHelpSection(controlID, helpTextConfig) {
var container = $('#' + controlID).closest('.cell').find('.field-label');
var helpContent = $('');
var helpContentLabel = $('').html(helpTextConfig.mainContent);
helpContent.append(helpContentLabel);
if (helpTextConfig.collapseLinkText != null) {
var helpLink = $('');
var helpLinkCollapseContent = $('').html(helpTextConfig.collapsibleContent);
var helpLinkCollapse = $(''.format(controlID)).append(helpLinkCollapseContent);
var link = $(''.format(controlID)).text(helpTextConfig.collapseLinkText);
helpLink.append(link);
helpContent.append(helpLink).append(helpLinkCollapse);
}
container.before(helpContent);
},
MoveSubgridActionsButtonsToBottom(subgridSelector) {
var subgrid = $(subgridSelector);
if (subgrid.getType().startsWith('complex.subgrid')) {
subgrid.on('loaded', function() {
var container = subgrid.find('.entity-grid');
if (container.find('.customTop-toolbar-actions').length > 0)
return;
var toolbarToMove = container.find('.view-toolbar').insertAfter(container.find('.view-pagination'));
toolbarToMove.addClass('originalButMovedToBottom').find('.toolbar-actions').removeClass('float-end');
toolbarToMove.find('.toolbar-actions .create-action').removeClass('btn-primary').addClass('btn-secondary');
});
}
if (subgrid.getType().startsWith('complex.SPOgrid')) {
var target = subgrid.find('.sharepoint-loading');
// Create an observer instance.
var observer = new MutationObserver(function(mutations) {
var container = subgrid.find('.sharepoint-grid');
//if (container.find('.customTop-toolbar-actions').length > 0)
// return;
var toolbarToMove = container.find('.view-toolbar').insertAfter(container.find('.sharepoint-pagination'));
toolbarToMove.addClass('originalButMovedToBottom').find('div.float-end').removeClass('float-end');
toolbarToMove.find('.action.btn-primary,.action.btn-info').removeClass('btn-info').removeClass('btn-primary').addClass('btn-secondary btn-sm');
}
);
// Pass in the target node, as well as the observer options.
observer.observe(target[0], {
attributes: true,
childList: true,
characterData: true
});
}
},
SetActionsColumnTitle(entityListSelector, gridConfig) {
if (entityListSelector == null || entityListSelector == '')
entityListSelector = '.entity-grid';
$(entityListSelector).on('loaded', function() {
var container = $(entityListSelector);
if (!$(entityListSelector).is('.entity-grid'))
container = $(entityListSelector).find('.entity-grid');
var lastColumnHeader = container.find('.view-grid table thead tr th:last');
lastColumnHeader.text(gridConfig.setActionsColumnTitle).addClass('actionColumn');
});
},
MoveEntityListActionsButtons(entityListSelector, gridConfig) {
if (entityListSelector == null || entityListSelector == '')
entityListSelector = '.entity-grid';
$(entityListSelector).on('loaded', function() {
var container = $(entityListSelector);
if (!$(entityListSelector).is('.entity-grid'))
container = $(entityListSelector).find('.entity-grid');
container.find('.customTop-toolbar-actions').remove();
var toolbar = $(this).find('.toolbar-actions');
var linkToClone = toolbar.find('.action.create-action');
var clonedLink = linkToClone.clone();
if (gridConfig.redecorateEntityListActionsButtonsValueFormat != null) {
clonedLink.addClass('btn-lg').html(gridConfig.redecorateEntityListActionsButtonsValueFormat.format(clonedLink.text()));
}
clonedLink.removeClass('float-end').prependTo(container).wrap('');
toolbar.addClass('clonedAndMovedToBottom');
});
},
ShowEntityListViewsAsTabs(entityListSelector) {
if (entityListSelector == null || entityListSelector == '')
entityListSelector = '.entity-grid';
$(entityListSelector).on('loaded', function() {
$(entityListSelector).find('.view-toolbar.grid-actions').addClass('showEntityListViewsAsTabs');
var tabs = $(this).find('.view-select').addClass('nav-tabs').removeClass('nav-pills');
var li = tabs.find('ul.dropdown-menu li');
li.addClass('nav-item').find('a').addClass('nav-link')
li.filter('.active').find('a').addClass('active');
tabs.prepend(li);
tabs.find('li#filterDropdownId').remove();
});
},
GenerateLinksAsTabs(entityListSelector, gridConfig) {
if (entityListSelector == null || entityListSelector == '')
entityListSelector = '.entity-grid';
$(entityListSelector).on('loaded', function() {
$(entityListSelector).find('.view-toolbar').remove();
$(entityListSelector).find('.view-toolbar.grid-actions').addClass('generateLinksAsTabs');
var viewToolbar = $('');
var viewSelect = $('');
var li = '{0}';
$.each(gridConfig.linksArray, function(index, link) {
var linkText = JsLib.GetLocalizedString(link.strName);
viewSelect.append($(li.format(linkText, link.linkUrl, link.css)));
});
viewToolbar
.append(viewSelect)
.insertBefore($(entityListSelector).find('.view-grid'));
});
},
SetEntityListTranslatedFields(entityListSelector, gridConfig) {
if (entityListSelector == null || entityListSelector == '')
entityListSelector = '.entity-grid';
$(entityListSelector).on('loaded', function() {
$.each(gridConfig.dataTranslatedFields, function(index, dataTranslatedField) {
var headerRow = $(entityListSelector + ' .view-grid thead tr');
var fieldPositionToHide = (JsLib.GetPortalLanguageIndex() == 1) ? dataTranslatedField.fieldPosition_en : dataTranslatedField.fieldPosition_ie;
var headerCell = headerRow.find('th:nth-child(' + fieldPositionToHide + ')');
var tdListHeaderIE = headerRow.find('th:nth-child(' + dataTranslatedField.fieldPosition_ie + ')');
var tdListHeaderIELink = tdListHeaderIE.find('a');
if (JsLib.GetPortalLanguageIndex() == 1 && dataTranslatedField.checkSorting == true && headerCell.is('.sort-enabled.sort')) {
tdListHeaderIELink.trigger('click');
return;
}
headerCell.hide();
var rows = $(entityListSelector + ' .view-grid tbody tr');
if (JsLib.GetPortalLanguageIndex() == 1 && dataTranslatedField.headerText_ie != null && dataTranslatedField.fieldPosition_ie != null) {
if (tdListHeaderIELink != null)
tdListHeaderIELink.replaceText(dataTranslatedField.headerText_ie, dataTranslatedField.headerText_ie);
else
tdListHeaderIE.replaceText(dataTranslatedField.headerText_ie);
//*/
}
$.each(rows, function(index, row) {
$(row).find('td:nth-child(' + fieldPositionToHide + ')').hide();
});
});
});
},
ProcessSubgrid(gridConfig) {
var stringConstructor = "test".constructor;
var objectConstructor = ({}).constructor;
var entityListSelector = '.entity-grid';
if (gridConfig != null && gridConfig.selector != null && gridConfig.selector != '')
entityListSelector = gridConfig.selector;
if (gridConfig.constructor === objectConstructor) {
$(entityListSelector).addClass('custom-grid-processing');
if (gridConfig.columnDecoration != null && gridConfig.columnDecorationArray != null)
JsLib.StyleEntityListColumnBasedOnValues(gridConfig);
if (gridConfig.viewNamesArray != null)
JsLib.RenameGridViews(gridConfig);
if (gridConfig.formCellCSS != null)
$(entityListSelector).addClass(gridConfig.formCellCSS);
if (gridConfig.showEntityListViewsAsTabs == true)
JsLib.ShowEntityListViewsAsTabs(entityListSelector);
if (gridConfig.generateLinksAsTabs == true)
JsLib.GenerateLinksAsTabs(entityListSelector, gridConfig);
if (gridConfig.showGridActionsAsLinks == true)
JsLib.ShowGridActionsAsLinks(entityListSelector);
if (gridConfig.moveEntityListActionsButtons == true)
JsLib.MoveEntityListActionsButtons(entityListSelector, gridConfig);
if (gridConfig.dataTranslatedFields != null)
JsLib.SetEntityListTranslatedFields(entityListSelector, gridConfig);
if (gridConfig.setActionsColumnTitle != null)
JsLib.SetActionsColumnTitle(entityListSelector, gridConfig);
}
},
ProcessForm(forms) {
JsLib.ValidatorsAndBehaviours_SetCharactersCounters();
JsLib.SetupAllNumberFields();
JsLib.SetupAllDecimalFields();
JsLib.SetupAllMoneyFields();
JsLib.SetupAllCheckboxFields();
JsLib.SetupAllGrids();
JsLib.SetupForm(forms);
JsLib.ApplyGeneralFixes();
JsLib.OnPageLoad();
},
GetControlLabel(controlID) {
return $('#' + controlID).closest('.cell').find('.field-label').text();
},
GetPortalLanguageCodeByID(id) {
var portalLanguage = '';
$.each(JsStrings.languages, function(index, language) {
if (language.id == id)
portalLanguage = language.portalCode;
});
//debugger;
return portalLanguage;
},
GetPortalLanguage() {
var language = window.location.pathname.split('/')[1];
if (language == '_portal')
language = JsLib.GetPortalLanguageCodeByID(JsLib.GetURLParameter('languagecode'));
return language;
},
GetPortalLanguageIndex: function() {
return (JsLib.GetPortalLanguage() == JsStrings.languages.en.portalCode) ? 0 : 1;
},
GetEnglishString(name) {
var str = undefined;
$.each(JsStrings.strings, function(index, contentSnippet) {
if (contentSnippet.name == name)
str = contentSnippet.value_en;
});
if (str == undefined)
str = 'Unknown localized entry ({0})'.format(name);
return str;
},
GetIrishString(name) {
var str = undefined;
$.each(JsStrings.strings, function(index, contentSnippet) {
if (contentSnippet.name == name)
str = contentSnippet.value_ie;
});
if (str == undefined)
str = 'Unknown localized entry ({0})'.format(name);
return str;
},
GetLocalizedString(name) {
var str = undefined;
//var selectedLanguageIndex = 0;
//if (window.location.pathname.startsWith('/ga/'))
// selectedLanguageIndex = 1;
if (JsLib.GetPortalLanguageIndex() == 0)
str = JsLib.GetEnglishString(name);
else
str = JsLib.GetIrishString(name)
return str;
},
GetGuidelineHelptip(name) {
var str = undefined;
$.each(JsDataTranslations.scp_guidancehelptips, function(index, guidancehelptip) {
if (guidancehelptip.name == name) {
if (JsLib.GetPortalLanguageIndex() == 0)
str = guidancehelptip.text_en;
else
str = guidancehelptip.text_ie;
}
});
return str;
},
GetSchemeNameByID(id) {
var str = undefined;
$.each(JsDataTranslations.scp_schemes, function(index, scheme) {
if (scheme.value == id) {
if (JsLib.GetPortalLanguageIndex() == 0)
str = scheme.text_en;
else
str = scheme.text_ie;
}
});
return str;
},
GetSchemeDescriptionByID(id) {
var str = undefined;
$.each(JsDataTranslations.scp_schemes, function(index, scheme) {
if (scheme.value == id) {
if (JsLib.GetPortalLanguageIndex() == 0)
str = scheme.description_en;
else
str = scheme.description_ie;
}
});
return str;
},
RemoveLanguageFromUrlPath(urlPath) {
var langPathPrefix = '/{0}/'.format(JsStrings.languages.en.portalCode);
if (urlPath.startsWith(langPathPrefix))
urlPath = urlPath.substring(langPathPrefix.length - 1);
langPathPrefix = '/{0}/'.format(JsStrings.languages.ie.portalCode);
if (urlPath.startsWith(langPathPrefix))
urlPath = urlPath.substring(langPathPrefix.length - 1);
return urlPath;
},
/*
GetLocalizedDataByID: function(items, idMember, idToSearch)
{
var valueFound = null;
$.each(items, function(index, item){
if (item[idMember] == idToSearch)
valueFound = item;
});
return valueFound;
},*/
UpdateResourcesForMSOS: function() {
//based on https://www.engineeredcode.com/blog/power-pages-multiselect-load-event
// get the JSON config, stored in the data-pcf-control attribute
var pcfControls = $('.cell.form-control-cell .control span[data-pcf-control][pcf-controlcontext]');
pcfControls.each(function() {
var pcfControl = $(this);
var pcfControlContext = pcfControl.attr('pcf-controlcontext');
var pcfControlContextJSON = JSON.parse(pcfControlContext);
if (pcfControlContextJSON != null && pcfControlContextJSON.ControlName == 'MscrmControls.MultiSelectPicklist.UpdMSPicklistControl') {
var pcfControlConfig = pcfControl.data('pcf-control');
$.each(pcfControlConfig.Resources, function(index, resource) {
if (resource.Path != null && resource.Path.contains('"LocalizedStrings"')) {
var path = JSON.parse(resource.Path);
if (path.Data != null && path.Data.LocStrings != null) {
path.Data.LocStrings = JsStrings.MSOS_Resources;
resource.Path = JSON.stringify(path);
}
pcfControlConfig.Resources[index] = resource;
}
});
// update the attribute with our changes
pcfControl.attr('data-pcf-control', JSON.stringify(pcfControlConfig));
}
});
},
UpdateNumbering() {
JsLib.Euro = Intl.NumberFormat(__Defaults.Intl.Locale.ie, __Defaults.Intl.Numbering.Options.Euro);
JsLib.Decimal = Intl.NumberFormat(__Defaults.Intl.Locale.ie, __Defaults.Intl.Numbering.Options.Decimal);
JsLib.Percent = Intl.NumberFormat(__Defaults.Intl.Locale.ie, __Defaults.Intl.Numbering.Options.Percent);
},
PortalLocalizationOverrides_OnPreLoad() {
if (JsLib.GetPortalLanguageIndex() != 0) {
//if irish
JsLib.UpdateResourcesForMSOS();
JsLib.UpdateNumbering();
}
},
PortalLocalizationOverrides_OnPageLoad() {
if (JsLib.GetPortalLanguageIndex() != 0) {
//if irish
//then do standard overrides
//$('input.datetime.form-control').datetimepicker({ locale: 'pt-br' });
//register events on async controls, i.e. grids
//ToDo
//this.UpdateResourcesForMSOS();
//file upload
$('.file-control-container').each(function() {
var fileUpload = $(this);
fileUpload.find('.container-file-input .btn-for-file-input').replaceTextAndLabels('Text_For_Choose_File');
fileUpload.find('.container-filelink-delete .btn-for-delete').replaceTextAndLabels('FileUpload_DeleteAttachment_Label');
fileUpload.find('.container-filelink-delete .file-name-container div').defaultTextAndLabels('Text_For_No_File');
});
//select
$('.picklist-cell .form-select.picklist.form-control, .lookup.cell select.lookup.form-control').each(function() {
var select = $(this);
select.find('option:first[value=""]').defaultTextAndLabels('Select_UnselectedValueOption_Label');
});
//datetimepicker
$('div.datetimepicker').each(function() {
var datetimepicker = $(this);
datetimepicker.find('.input-group-addon.btn').attr('title', window.ResourceManager['Datetimepicker_Datepicker_Label']);
var target = datetimepicker;
// Create an observer instance.
var observer = new MutationObserver(function(mutations) {
datetimepicker.find('.bootstrap-datetimepicker-widget').each(function() {
var widget = $(this);
widget.find('.datepicker .datepicker-days thead .prev button').attr('title', window.ResourceManager['Previous_Month']);
widget.find('.datepicker .datepicker-days thead .next button').attr('title', window.ResourceManager['Next_Month']);
widget.find('.datepicker .datepicker-months thead .prev button').attr('title', window.ResourceManager['Previous_Year']);
widget.find('.datepicker .datepicker-months thead .next button').attr('title', window.ResourceManager['Next_Year']);
widget.find('.datepicker .datepicker-years thead .prev button').attr('title', window.ResourceManager['Previous_Decade']);
widget.find('.datepicker .datepicker-years thead .next button').attr('title', window.ResourceManager['Next_Decade']);
widget.find('.datepicker .datepicker-decades thead .prev button').attr('title', window.ResourceManager['Previous_Century']);
widget.find('.datepicker .datepicker-decades thead .next button').attr('title', window.ResourceManager['Next_Century']);
});
}
);
// Pass in the target node, as well as the observer options.
observer.observe(target[0], {
childList: true,
//subtree: true,
});
});
//*/
//entity-grid
$('.entity-grid.entitylist, .entity-grid.subgrid').each(function() {
var grid = $(this);
grid.find('.view-loading').defaultTextAndLabels('Grid_Loading_Message');
grid.find('.view-empty.message').replaceTextAndLabels('Default_Grid_Empty_Message');
/*grid.on('loaded', function(){
var gridData = grid.find('.view-grid');
//gridData.find('tbody tr td a.edit-link').defaultTextAndLabels('Grid_Row_EditAction_Title');
//gridData.find('tbody tr td a.details-link').defaultTextAndLabels('Grid_Row_ViewAction_Title');
//gridData.find('tbody tr td a.delete-link').defaultTextAndLabels('Grid_Row_DeleteAction_Title');
});//*/
});
//lookup replacements
//alert('lookup replacements');
$('input.form-control.lookup').each(function() {
var lookup = $(this);
var lookupCell = lookup.closest('.form-control-cell');
lookupCell.find('.btn.clearlookupfield').replaceTextAndLabels('Modal_ClearButton_Title');
lookupCell.find('.btn.launchentitylookup').replaceTextAndLabels('Modal_LaunchButton_Title');
lookupCell.find('.lookup-modal .entity-lookup').on('loaded', function() {
var entityLookup = $(this);
entityLookup.find('.modal-lookup .modal-title').defaultTextAndLabels('Lookup_Modal_Title');
entityLookup.find('.modal-lookup .toolbar-actions .query').defaultTextAndLabels('Lookup_Modal_SearchInput_Title');
entityLookup.find('.modal-lookup .toolbar-actions .query').attr('placeholder', window.ResourceManager['Search_DefaultText']);
entityLookup.find('.modal-lookup .btn.primary').defaultTextAndLabels('Lookup_Modal_SelectButton_Label');
entityLookup.find('.modal-lookup .btn.remove-value').defaultTextAndLabels('Lookup_Modal_ClearButton_Label');
});
});
//modal replacements (workflow, etc)
//alert('modal replacements');
$('.modal').each(function() {
var modal = $(this);
modal.find('.modal-header .form-close').replaceTextAndLabels('Modal_CloseButton_Title');
modal.find('.modal-footer .btn.cancel').defaultTextAndLabels('Modal_CancelButton_Label');
modal.filter('.modal-deactivate').each(function() {
var modalDeactivate = $(this);
modalDeactivate.find('.modal-header .modal-title').defaultTextAndLabels('Workflow_Modal_Title')
modalDeactivate.find('.modal-footer .btn.primary').defaultTextAndLabels('Workflow_Modal_PrimaryButton_Label');
});
});
$('.modal-submit .modal-title').defaultTextAndLabels('Form_ConfirmationModal_Title');
$('.modal-form').each(function() {
var modalForm = $(this);
//var spinnerOnPopup = '';
var spinnerOnPopup = '';
//modalForm.find('.form-loading').html(spinnerOnPopup);
modalForm.find('.form-loading').append($(spinnerOnPopup));
});
//spo grid replacements
$('.subgrid.sharepoint-grid').each(function() {
var grid = $(this);
if (grid.parent().getType().startsWith('complex.SPOgrid')) {
grid.find('.grid-actions .add-file').replaceTextAndLabels('Add_Files');
grid.find('.grid-actions .add-folder').replaceTextAndLabels('ElFinder_New_Folder');
grid.find('.sharepoint-loading').replaceTextAndLabels('SpoGrid_Loading_Message');
grid.find('.sharepoint-empty.message').replaceTextAndLabels('SpoGrid_Empty_Message');
function processSharepointGrid(grid) {
grid.find('.sharepoint-data .dropdown-item.delete-link').defaultTextAndLabels('SpoGrid_Row_Delete_Label');
var goUpTr = grid.find('.sharepoint-data tr[data-folderpath]').has('.fa-level-up');
var goUpLink = goUpTr.find('.folder-link .sharepoint-custom-underline');
goUpLink.text(goUpLink.text().replace('Até', window.ResourceManager['SpoGrid_Row_Folder_GoUp_Label']));
//grid.find('.modal .btn.cancel').defaultTextAndLabels('Modal_CancelButton_Label');
grid.find('.modal-add-file .modal-title').defaultTextAndLabels('SpoGrid_AddFileModal_Title');
grid.find('.modal-add-folder .modal-title').defaultTextAndLabels('SpoGrid_AddFolderModal_Title');
grid.find('.modal-delete-file .modal-title').defaultTextAndLabels('SpoGrid_DeleteFileModal_Title');
grid.find('.modal-delete-folder .modal-title').defaultTextAndLabels('SpoGrid_DeleteFolderModal_Title');
grid.find('.modal-add-file .modal-body .add-file .margin-addfile .control-label-addfile').defaultTextAndLabels('SpoGrid_AddFileModal_ChooseFiles_Label');
grid.find('.modal-add-file .modal-body .add-file .margin-addfile input[type="file"]').attr('aria-label', window.ResourceManager['SpoGrid_AddFileModal_ChooseFiles_Control_Label']);
grid.find('.modal-add-file .modal-body .add-file .checkbox label').replaceTextAndLabels('SpoGrid_AddFileModal_Overwrite_Label');
grid.find('.modal-add-file .modal-body .add-file .destination-group .control-label-addfile').defaultTextAndLabels('SpoGrid_AddFileModal_Destination_Label');
grid.find('.modal-add-folder .modal-body .add-folder .row label').defaultTextAndLabels('SpoGrid_AddFolderModal_Name_Label');
grid.find('.modal-add-folder .modal-body .add-folder .row input.form-control').defaultTextAndLabels('SpoGrid_AddFolderModal_Name_Label');
grid.find('.modal-add-folder .modal-body .add-folder .row input.form-control').attr('placeholder', window.ResourceManager['SpoGrid_AddFolderModal_Name_Label']);
grid.find('.modal-add-folder .modal-body .add-folder .destination-group label').defaultTextAndLabels('SpoGrid_AddFolderModal_Destination_Label');
grid.find('.modal-delete-file .modal-body p').defaultTextAndLabels('SpoGrid_DeleteFileModal_Body');
grid.find('.modal-delete-folder .modal-body p').defaultTextAndLabels('SpoGrid_DeleteFolderModal_Body');
grid.find('.modal-add-file .modal-footer .btn.primary').defaultTextAndLabels('SpoGrid_AddFileModal_Button_Label');
grid.find('.modal-add-folder .modal-footer .btn.primary').defaultTextAndLabels('SpoGrid_AddFolderModal_Button_Label');
grid.find('.modal-delete-file .modal-footer .btn.primary').defaultTextAndLabels('SpoGrid_DeleteFileModal_Button_Label');
grid.find('.modal-delete-folder .modal-footer .btn.primary').defaultTextAndLabels('SpoGrid_DeleteFolderModal_Button_Label');
}
var target = grid.find('.sharepoint-loading');
// Create an observer instance.
var observer = new MutationObserver(function(mutations) {
processSharepointGrid(grid);
}
);
// Pass in the target node, as well as the observer options.
observer.observe(target[0], {
attributes: true,
childList: true,
characterData: true
});
var data_table = grid.find('.sharepoint-data .view-grid .table');
if (data_table.find('tbody').length == 1)
processSharepointGrid(grid);
}
});
var config = $("#PcfControlConfig_scp_ifyeswhatfacilitiesdoyouhave");
var configText = config.attr('data-pcf-control');
var choicesField = $("#scp_ifyeswhatfacilitiesdoyouhave_Container");
//$("#scp_ifyeswhatfacilitiesdoyouhave").multiSelectOptionSet(configText).getValues();
//form buttons
$('#UpdateButton').defaultTextAndLabels('Form_SubmitButton_Label');
} else {}
},
//this event is to process the page controls after the initial libraries are loaded (i.e. JsLib) but processing hasn't started yet (i.e. pcf controls)
OnPreLoad: function() {
if ($('.disablePortalLocalizationOverrides').length == 0)
this.PortalLocalizationOverrides_OnPreLoad();
},
OnPageLoad: function() {
if ($('.disablePortalLocalizationOverrides').length == 0)
this.PortalLocalizationOverrides_OnPageLoad();
$('.formLoadingSpinner').hide();
},
// ------- Eir Code API --------- \\
SetupEirCodeAPI: function(fieldToAppend, autoddressKey, eircodeLanguageName, f_eircode, f_addressline1, f_addressline2, f_towncity, f_county) {
if ($('#eircodeDiv + #' + fieldToAppend).length > 0)
return;
$('#' + fieldToAppend).before('');
//var fields = mappingFields.split(",");
$('head').append($('').attr('href', 'https://api.autoaddress.ie/2.0/control/css/autoaddress.min.css'));
$.when($.getScript("https://api.autoaddress.ie/2.0/control/js/jquery.autoaddress.min.js"), $.Deferred(function(deferred) {
$(deferred.resolve);
})).done(function() {
$(function() {
$("#eircodeDiv").AutoAddress({
key: autoddressKey,
vanityMode: true,
country: "ie",
//NOTE TO DEVELOPER: setting ga language seems to make the plugin to ignore the custom translations
language: eircodeLanguageName != null ? eircodeLanguageName : "en",
defaultSearch: false,
//localized strings start, see https://docs2.autoaddress.com/en/articles/3214914#message_properties
//english
placeHolderLabel: JsLib.GetEnglishString('AutoAddress_placeHolderLabel'),
//searchButtonLabel: JsLib.GetEnglishString('AutoAddress_searchButtonLabel'),
//optionsFoundLabel: JsLib.GetEnglishString('AutoAddress_optionsFoundLabel'),
//incompleteAddressLabel: JsLib.GetEnglishString('AutoAddress_incompleteAddressLabel'),
//partialAddressLabel: JsLib.GetEnglishString('AutoAddress_partialAddressLabel'),
nuaAddressFoundLabel: JsLib.GetEnglishString('AutoAddress_nuaAddressFoundLabel'),
//noResultFoundLabel: JsLib.GetEnglishString('AutoAddress_noResultFoundLabel'),
addressFoundLabel: JsLib.GetEnglishString('AutoAddress_addressFoundLabel'),
noEircodeAppendedLabel: JsLib.GetEnglishString('AutoAddress_noEircodeAppendedLabel'),
inputRequiredLabel: JsLib.GetEnglishString('AutoAddress_inputRequiredLabel'),
//errorMessageLabel: JsLib.GetEnglishString('AutoAddress_errorMessageLabel'),
//addressTabLabel: JsLib.GetEnglishString('AutoAddress_addressTabLabel'),
//businessTabLabel: JsLib.GetEnglishString('AutoAddress_businessTabLabel'),
/*
//irish
placeHolderLabel_ga: JsLib.GetIrishString('AutoAddress_placeHolderLabel'),
searchButtonLabel_ga: JsLib.GetIrishString('AutoAddress_searchButtonLabel'),
optionsFoundLabel_ga: JsLib.GetIrishString('AutoAddress_optionsFoundLabel'),
incompleteAddressLabel_ga: JsLib.GetIrishString('AutoAddress_incompleteAddressLabel'),
//partialAddressLabel_ga: JsLib.GetIrishString('AutoAddress_partialAddressLabel'),
nuaAddressFoundLabel_ga: JsLib.GetIrishString('AutoAddress_nuaAddressFoundLabel'),
noResultFoundLabel_ga: JsLib.GetIrishString('AutoAddress_noResultFoundLabel'),
addressFoundLabel_ga: JsLib.GetIrishString('AutoAddress_addressFoundLabel'),
noEircodeAppendedLabel_ga: JsLib.GetIrishString('AutoAddress_noEircodeAppendedLabel'),
inputRequiredLabel_ga: JsLib.GetIrishString('AutoAddress_inputRequiredLabel'),
errorMessageLabel_ga: JsLib.GetIrishString('AutoAddress_errorMessageLabel'),
addressTabLabel_ga: JsLib.GetIrishString('AutoAddress_addressTabLabel'),
businessTabLabel_ga: JsLib.GetIrishString('AutoAddress_businessTabLabel'),
//*/
//localized strings end
onAddressFound: function(data) {
//alert(JSON.stringify(data));
if (data.vanityAddress) {
if (data.postcode) {
$(f_eircode).val(data.postcode).trigger('change');
}
if (data.vanityAddress.length == 6) {
$(f_addressline1).val(data.vanityAddress[0] + ", " + data.vanityAddress[1]).trigger('change');
$(f_addressline2).val(data.vanityAddress[2] + ", " + data.vanityAddress[3]).trigger('change');
$(f_towncity).val(data.vanityAddress[4]).trigger('change');
} else if (data.vanityAddress.length == 5) {
$(f_addressline1).val(data.vanityAddress[0] + ", " + data.vanityAddress[1]).trigger('change');
$(f_addressline2).val(data.vanityAddress[2]).trigger('change');
$(f_towncity).val(data.vanityAddress[3]).trigger('change');
if (data.vanityAddress[3] == null) {
$(f_towncity).val(data.vanityAddress[4]).trigger('change');
}
} else if (data.vanityAddress.length == 4) {
$(f_addressline1).val(data.vanityAddress[0]).trigger('change');
$(f_addressline2).val(data.vanityAddress[1]).trigger('change');
if (data.vanityAddress[2] != null) {
$(f_towncity).val(data.vanityAddress[2]).trigger('change');
} else {
$(f_towncity).val(data.vanityAddress[3]).trigger('change');
}
} else if (data.vanityAddress.length == 3) {
$(f_addressline1).val(data.vanityAddress[0]).trigger('change');
$(f_addressline2).val(data.vanityAddress[1]).trigger('change');
$(f_towncity).val(data.vanityAddress[2]).trigger('change');
} else if (data.vanityAddress.length <= 2) {
$(f_addressline1).val(data.vanityAddress[0]).trigger('change');
$(f_towncity).val(data.vanityAddress[1]).trigger('change');
}
//County: the index for the County was identified to be the vanityAddress last position: data.vanityAddress.length - 1
var county = data.vanityAddress[data.vanityAddress.length - 1];
county = county.replace("Co. ", "");
county = county.replace(/ \d+/g, '');
//removes ""digits" at the end
$(f_county + " option").filter(function() {
return $(this).text().toLowerCase() == county.toLowerCase();
}).prop("selected", true);
$(f_county).trigger('change');
//$('#scp_county').attr('aria-invalid','false');
//TRIGGER VALIDATIONS
//return MyPobalPages.Do('MyPobal_Forms_InlineFieldValidation');
}
}
});
$(".autoaddress-text-box").addClass("text form-control ");
$(".autoaddress-button").addClass("btn btn-xs btn-secondary button submit-btn").removeClass("autoaddress-button");
$(".autoaddress-control").append("")
$(".autoaddress-text-box").appendTo("#flexDiv");
$(".autoaddress-control .btn").appendTo("#flexDiv");
$(".autoaddress-autocomplete").insertAfter("#flexDiv");
$("#eircodeDiv").trigger('jsLibEvent');
});
});
},
GetEirCodeAPILanguage: function(portalLanguageName) {
return portalLanguageName == JsStrings.languages.en.portalCode ? 'en' : 'ga'
},
// ------- Eir Code API --------- \\
ApplyGeneralFixes: function() {
$('.picklist-cell .picklist.vertical').each(function() {
var radioList = $(this);
radioList.find('input[type="radio"]').each(function() {
inputRadio = $(this);
inputRadio.wrap('');
var label = radioList.find('label[for="{0}"]'.format(inputRadio.attr('id')));
inputRadio.parent('.verticalRadio').append(label);
});
radioList.find('br').remove();
});
},
// ------- EditableGrid --------- \\
EditableGrid_thActionsTemplate: function() {
return '';
},
EditableGrid_editActionTemplate: function() {
return ''.format(JsLib.GetLocalizedString('Default_JSRuntime_EditableGrid_ActionButton_Save'));
},
EditableGrid_tdActionsTemplate: function() {
return ' | ';
},
EditableGrid_deleteActionTemplate: function() {
return ''.format(JsLib.GetLocalizedString('Default_JSRuntime_EditableGrid_ActionButton_Delete'));
},
EditableGrid_saveNewActionTemplate: function() {
return ''.format(JsLib.GetLocalizedString('Default_JSRuntime_EditableGrid_ActionButton_Add'));
},
EditableGrid_workingActionTemplate: function() {
return '{0}
'.format(JsLib.GetLocalizedString('Default_JSRuntime_EditableGrid_ActionButton_InProgress'));
},
EditableGrid_newRowTrTemplate: function() {
return '
';
},
EditableGrid_newRowTdTemplate: function() {
return '{0} | ';
},
EditableGrid_newRowTdActionsTemplate: function() {
return '{0} | ';
},
EditableGrid_GetHtmlType: function(column) {
switch (column.Metadata.AttributeTypeName.Value) {
case 'LookupType':
return 'Microsoft.Xrm.Sdk.EntityReference';
case 'MoneyType':
return 'Microsoft.Xrm.Sdk.Money';
case 'IntegerType':
return 'System.Int32';
case 'StringType':
default:
return 'System.String';
}
},
EditableGrid_GetColumn: function(config, logicalName) {
//console.log('finding {0}'.format(logicalName));
var returnColumn = null;
$.each(config.viewLayouts.Columns, function(index, column) {
if (column.LogicalName == logicalName || column.LogicalName.endsWith('.' + logicalName)) {
returnColumn = column;
returnColumn.foundAtIndex = index;
}
});
//console.log('found {0}'.format(JSON.stringify(returnColumn)));
return returnColumn;
},
EditableGrid_GetColumnByTitle: function(config, displayName) {
var returnColumn = null;
$.each(config.viewLayouts.Columns, function(index, column) {
if (column.Name == displayName)
returnColumn = column;
});
return returnColumn;
},
EditableGrid_GetConfigAttribute: function(config, attributeName) {
var returnAttribute = null;
$.each(config.attributes, function(index, attribute) {
if (attribute.name == attributeName //|| attribute.lookupRelatedFieldName != null && attributeName.endsWith('.' + attribute.lookupRelatedFieldName)
)
returnAttribute = attribute;
});
return returnAttribute;
},
EditableGrid_GetUnformattedValue: function(row, column) {
if (row != null) {
var td = row.find('td[data-attribute="{0}"]'.format(column.LogicalName));
var datatype = td.data('type');
var datavalue = td.attr('data-value');
if (datavalue != null && datavalue != '') {
switch (column.Metadata.AttributeTypeName.Value) {
case 'LookupType':
datavalue = JSON.parse(datavalue);
return datavalue.Id;
case 'PicklistType':
datavalue = JSON.parse(datavalue);
return datavalue.Value;
case 'MoneyType':
datavalue = JSON.parse(datavalue);
var moneyValue = parseFloat(datavalue.Value).toFixed(2);
return moneyValue;
case 'StringType':
default:
return datavalue;
break;
}
}
//else
// return td.attr('editable_displayValue');
}
return '';
},
EditableGrid_Setup: function(config) {
if (config.grid.is('.disabled'))
return;
if (config.settings.allowCreate == true || config.settings.allowEdit == true || config.settings.allowDelete == true) {
JsLib.EditableGrid_SetupActionColumnHeader(config);
JsLib.EditableGrid_SetupRowActions(config);
}
if (config.settings.allowCreate == true)
JsLib.EditableGrid_SetupNewRecordRow(config);
if (config.settings.cacheAPIRecords == true)
JsLib.EditableGrid_CacheAPIRecords(config);
JsLib.EditableGrid_SetupAttributes(config);
},
EditableGrid_SetupAttributes: function(config) {
var languageOptionIndex = JsLib.GetPortalLanguageIndex();
$.each(config.attributes, function(index, attribute) {
/*if (attribute.lookup != null)
{
//disabling sorting on lookup columns as they dont work correctly when in Irish version
var column = JsLib.EditableGrid_GetColumn(config, attribute.name);
var th = config.grid.find('.view-grid thead th:nth-child({0})'.format(column.foundAtIndex + 1))
th.find('a')
.attr('disabled', 'disabled')
.find('span').hide();
}*/
if (attribute.lookup != null && languageOptionIndex == 1) //irish
{
var attributeName = /*attribute.lookupRelatedFieldName != null ? attribute.lookupRelatedFieldName :*/
attribute.name;
var column = JsLib.EditableGrid_GetColumn(config, attributeName);
config.grid.find('.view-grid tbody tr:not(.editable_newRecordRow)').each(function() {
var row = $(this);
var cell = row.find('td[data-attribute="{0}"]'.format(column.LogicalName));
var textIE = /*attribute.lookupRelatedFieldName != null ? cell.data("value") : */
JsLib.GetLocalizedOptionText(attribute.lookup.entityName, cell.data("value").Id);
cell.text(textIE);
});
}
if (attribute.name != null) {
if (attribute.displayNameHtml != null) {
var column = JsLib.EditableGrid_GetColumn(config, attribute.name);
var th = config.grid.find('.view-grid thead th:nth-child({0})'.format(column.foundAtIndex + 1))
var th_cell = th;
if (th.has('a'))
th_cell = th.find('a');
th_cell.html(attribute.displayNameHtml);
if (th_cell.is('[aria-label]'))
th_cell.attr('aria-label', th_cell.text());
}
}
});
},
EditableGrid_SetupActionColumnHeader: function(config) {
if (config.grid.find('.view-grid thead tr .editable_headerActions').length == 0) {
var thMarkup = JsLib.EditableGrid_thActionsTemplate().format(JsLib.GetLocalizedString('Default_JSRuntime_EditableGrid_ActionsHeader_Text'));
var th = $(thMarkup);
th.appendTo(config.grid.find('.view-grid thead tr'));
}
},
EditableGrid_SetupRowActions: function(config) {
config.grid.find('tbody tr').each(function() {
var tr = $(this);
var tdActions = $(JsLib.EditableGrid_tdActionsTemplate());
tdActions.appendTo(tr);
JsLib.EditableGrid_AddRowAction(config, tr, JsLib.EditableGrid_workingActionTemplate());
if (config.settings.allowDelete == true)
JsLib.EditableGrid_AddRowAction(config, tr, JsLib.EditableGrid_deleteActionTemplate(), JsLib.EditableGrid_HandleDeleteEvent);
if (config.settings.allowEdit == true) {
tr.on('dblclick', function() {
if (!$(this).is('.editable_editing'))
JsLib.EditableGrid_MakeRowEditable(config, $(this));
});
}
});
if (config.settings.autoCancelEditOnFocusOut == true) {
config.grid.click(function(event) {
event.stopPropagation();
});
config.grid.closest('form').on('click', function() {
JsLib.EditableGrid_ResetEditableRows(config);
});
}
},
EditableGrid_CacheAPIRecords: function(config) {
var condition = '';
$.each(config.linkage.lookupLinkage, function(index, lookup) {
var lookupValue = null;
switch (lookup.parentRecordFieldLocation) {
case 'querystring':
lookupValue = JsLib.GetURLParameter(lookup.parentRecordField);
break;
case 'subgrid':
lookupValue = config.grid.find('.subgrid').data('ref-id');
break;
default:
lookupValue = $('#{0}'.format(lookup.parentRecordField)).val();
break;
}
if (condition != '')
condition += ' and ';
condition += "_{0}_value eq {1}".format(lookup.subRecordApiField.toLowerCase(), lookupValue.toLowerCase());
});
var filter = '$filter=({0})'.format(condition);
config.grid.find('.view-grid tbody tr:not(.editable_newRecordRow)').each(function() {
var row = $(this);
var rowID = row.data('id');
var rowFilter = ' and {0}id eq {1}'.format(config.linkage.entityName, rowID);
filter += rowFilter;
var apiMethodName = 'GET';
var apiUrl = "/_api/{0}?$select={1}id&{2}".format(config.linkage.entityPluralName, config.linkage.entityName, filter, rowFilter);
//console.log('calling ' + apiUrl);
webapi.safeAjax({
type: apiMethodName,
contentType: "application/json",
url: apiUrl,
success: function(data, textStatus, xhr) {
//console.log("EditableGrid CacheAPIRecords Success");
config.settings.cacheAPIRecords = false;
},
error: function(xhr, textStatus, errorThrown) {
console.log("EditableGrid CacheAPIRecords error");
console.log(xhr);
}
});
});
},
EditableGrid_CallAPI: function(config, row, method, record) {
var rowID = row.is('[data-id]') ? row.data('id') : 'newRecord';
var apiMethodName = null;
var apiUrl = "/_api/{0}".format(config.linkage.entityPluralName);
var msgID = null;
if (rowID.startsWith('newRecord')) {
apiMethodName = 'POST';
msgID = 'Default_JSRuntime_EditableGrid_RecordCreated';
} else {
apiUrl += "({0})".format(rowID);
apiMethodName = (method == 'delete') ? 'DELETE' : 'PATCH';
msgID = (method == 'delete') ? 'Default_JSRuntime_EditableGrid_RecordDeleted' : 'Default_JSRuntime_EditableGrid_RecordUpdated';
}
JsLib.EditableGrid_DisableRowActionButtons(config, row);
webapi.safeAjax({
type: apiMethodName,
contentType: "application/json",
url: apiUrl,
data: JSON.stringify(record),
success: function(data, textStatus, xhr) {
JsLib.EditableGrid_EnableRowActionButtons(config, row);
//console.log("Success");
JsLib.AddToast({
locationSelector: '.pageContent',
text: JsLib.GetLocalizedString(msgID)
});
config.grid.find('.entity-grid').trigger('refresh');
if (config.events.successCallback != undefined)
config.events.successCallback(config, row, record);
},
error: function(xhr, textStatus, errorThrown) {
JsLib.EditableGrid_EnableRowActionButtons(config, row);
//console.log(xhr);
if (config.events.errorCallback != undefined)
config.events.errorCallback(config, row, record, xhr, errorThrown);
else
JsLib.AddToast({
locationSelector: '.pageContent',
text: JsLib.GetLocalizedString('Default_JSRuntime_EditableGrid_Error')
});
}
});
},
EditableGrid_HandleSaveEvent: function(config, row, mode) {
var rowID = row.is('[data-id]') ? row.data('id') : 'newRecord';
var foundErrors = false;
row.find('td .editable_cellEdit .form-control').each(function(index, inputControl) {
foundErrors = foundErrors || JsLib.EditableGrid_ValidateAttribute(config, row, inputControl);
});
if (!foundErrors) {
if (row.is('.saving'))
return;
row.addClass('saving');
var record = JsLib.EditableGrid_BuildRecord(config, row, mode);
if (record != null) {
//console.log('Handling Save Event on row: ' + rowID + ' with JSON: ' + JSON.stringify(record));
JsLib.EditableGrid_CallAPI(config, row, 'save', record);
}
}
},
EditableGrid_HandleDeleteEvent: function(config, row) {
//console.log('Handling Delete Event of record id: ' + row.data('id'));
JsLib.EditableGrid_CallAPI(config, row, 'delete', null);
},
EditableGrid_BuildRecord: function(config, row, mode) {
var record = {};
//record["scp_name"] = '';
$.each(config.linkage.lookupLinkage, function(index, lookup) {
var lookupValue = null;
switch (lookup.parentRecordFieldLocation) {
case 'querystring':
lookupValue = JsLib.GetURLParameter(lookup.parentRecordField);
break;
case 'subgrid':
lookupValue = config.grid.find('.subgrid').data('ref-id');
break;
default:
lookupValue = $('#{0}'.format(lookup.parentRecordField)).val();
break;
}
record["{0}@odata.bind".format(lookup.subRecordApiField)] = "/{0}({1})".format(lookup.entityPluralName, lookupValue);
});
var dirtyRow = false;
row.find('td .editable_cellEdit .editable_isdirty').each(function(index, itemControl) {
dirtyRow = true;
var attributeName = $(itemControl).closest('td').data('attribute');
var attribute = JsLib.EditableGrid_GetConfigAttribute(config, attributeName);
var column = JsLib.EditableGrid_GetColumn(config, attributeName);
var attributeValue = $(itemControl).getVal();
var columnTypeName = /*(attribute.lookupRelatedFieldName != null) ? 'LookupType' :*/
column.Metadata.AttributeTypeName.Value;
switch (columnTypeName) {
case 'LookupType':
if (attribute.lookup != undefined)
record["{0}@odata.bind".format(attribute.lookup.subRecordApiField)] = "/{0}({1})".format(attribute.lookup.entityPluralName, attributeValue);
break;
case 'IntegerType':
case 'PicklistType':
attributeValue = Number(attributeValue);
record[attribute.name] = attributeValue;
break;
case 'MoneyType':
attributeValue = Number(parseFloat(attributeValue).toFixed(4));
record[attribute.name] = attributeValue;
break;
default:
record[attribute.name] = attributeValue;
break;
}
});
var hasAllRequiredAttributes = true;
$.each(config.attributes, function(index, attribute){
if (attribute.required == true && record[attribute.name] == null)
hasAllRequiredAttributes = false;
});
//console.log('hasAllRequiredAttributes=' + hasAllRequiredAttributes);
if (dirtyRow && (mode == 'update' || hasAllRequiredAttributes))
return record;
return null;
},
EditableGrid_ValidateAttribute: function(config, row, inputControl) {
var foundErrors = false;
var foundAttributeError = false;
var attributeName = $(inputControl).closest('td').data('attribute');
var attribute = JsLib.EditableGrid_GetConfigAttribute(config, attributeName);
var column = JsLib.EditableGrid_GetColumn(config, attributeName);
foundAttributeError = foundAttributeError || (attribute.required == true && $(inputControl).isBlank());
foundAttributeError = foundAttributeError || (attribute.validationCallback != undefined && !attribute.validationCallback(config, column, inputControl));
foundErrors = foundErrors || foundAttributeError;
$(inputControl).removeClass('is-valid is-invalid').addClass(foundAttributeError ? 'is-invalid' : 'is-valid');
return foundErrors;
},
EditableGrid_ValidateChangedAttribute: function(config, row, attribute, inputControl) {
$(inputControl).removeClass('editable_isdirty');
if ($(inputControl).isNotBlank())
$(inputControl).addClass('editable_isdirty');
return JsLib.EditableGrid_ValidateAttribute(config, row, inputControl);
},
EditableGrid_DisableRowActionButtons: function(config, row) {
row.find('td.editable_rowActions a').hide();
row.find('td.editable_rowActions .editable_rowActionInProgress').show();
},
EditableGrid_EnableRowActionButtons: function(config, row) {
row.find('td.editable_rowActions a').show();
row.find('td.editable_rowActions .editable_rowActionInProgress').hide();
},
EditableGrid_CancelEditableRow: function(config, row) {
row.find('td').each(function() {
var td = $(this);
td.text(td.attr('editable_displayvalue'));
});
console.log('EditableGrid_CancelEditableRow');
},
EditableGrid_ResetEditableRows: function(config) {
config.grid.find('.view-grid tbody tr.editable_editing').removeClass('editable_editing').each(function(index, row) {
$(row).find('td:not(.editable_rowActions)').each(function(index, td) {
$(td).text($(td).attr('editable_displayvalue')).removeAttr('editable_displayvalue');
});
});
config.grid.find('.view-grid tbody tr.editable td.editable_rowActions .editable_rowActionSave').remove();
},
EditableGrid_MakeRowEditable: function(config, clickedTR) {
JsLib.EditableGrid_ResetEditableRows(config);
clickedTR.addClass("editable editable_editing").find('td:not(.editable)').each(function() {
var itemTD = $(this);
var formattedValue = itemTD.text();
itemTD.attr('editable_displayValue', formattedValue);
var attributeName = null;
if (itemTD.is('[data-attribute]'))
attributeName = itemTD.data('attribute');
else {
var columnTitle = itemTD.data('th');
column = JsLib.EditableGrid_GetColumnByTitle(config, columnTitle);
attributeName = column.LogicalName;
}
//console.log('setting up {0} with formattedValue: {1}'.format(attributeName, formattedValue));
var attribute = JsLib.EditableGrid_GetConfigAttribute(config, attributeName);
if (attribute.editable != false) {
itemTD.text('');
JsLib.EditableGrid_AppendControlForAttribute(config, attributeName, clickedTR, itemTD);
}
});
var tdActions = clickedTR.find('.editable_rowActions');
if (tdActions.find('.editable_rowActionSave').length == 0)
JsLib.EditableGrid_AddRowAction(config, clickedTR, JsLib.EditableGrid_editActionTemplate(), JsLib.EditableGrid_HandleSaveEvent);
//console.log('EditableGrid_MakeRowEditable');
},
EditableGrid_AddRowAction: function(config, tr, template, onClickCallback) {
var action = $(template);
tr.find('.editable_rowActions').append(action);
if (onClickCallback != undefined) {
action.on('click', function() {
onClickCallback(config, tr, 'update');
});
}
},
EditableGrid_SetupNewRecordRow: function(config) {
//starts by removing an existing newRecordRow, in case multiple refresh events are running simultaneously
config.grid.find('.view-grid tbody .editable_newRecordRow').remove();
var trMarkup = JsLib.EditableGrid_newRowTrTemplate().format(config.linkage.entityName, 'template record');
var newTR = $(trMarkup);
if (config.grid.find('.view-grid tbody').length == 0)
config.grid.find('.view-grid table').append($(''));
newTR.appendTo(config.grid.find('.view-grid tbody'));
$.each(config.viewLayouts.Columns, function(index, column) {
var formattedValue = '';
var tdMarkup = JsLib.EditableGrid_newRowTdTemplate().format(formattedValue, JsLib.EditableGrid_GetHtmlType(column), column.LogicalName, '', '', '', '');
var td = $(tdMarkup);
td.appendTo(newTR);
JsLib.EditableGrid_AppendControlForAttribute(config, column.LogicalName, newTR, td);
});
var tdActionsMarkup = JsLib.EditableGrid_newRowTdActionsTemplate().format(JsLib.EditableGrid_saveNewActionTemplate());
var tdActions = $(tdActionsMarkup);
tdActions.appendTo(newTR);
JsLib.EditableGrid_AddRowAction(config, newTR, JsLib.EditableGrid_workingActionTemplate());
newTR.find('.editable_rowActionAdd').on('click', function() {
JsLib.EditableGrid_HandleSaveEvent(config, newTR, 'create');
});
JsLib.SetupAllDecimalNumberFields(config.selector + ' .money');
},
EditableGrid_AppendControlForAttribute: function(config, attributeName, row, parentTd) {
var column = JsLib.EditableGrid_GetColumn(config, attributeName);
var attribute = JsLib.EditableGrid_GetConfigAttribute(config, attributeName);
var unformattedValue = JsLib.EditableGrid_GetUnformattedValue(row, column);
var controlID = row.is('[data-id]') ? row.data('id') : 'newRecord';
controlID += "_" + attributeName;
var control = null;
var wrapperCell = null;
var controlCSS = 'form-control ';
if (attribute.controlCallback != undefined) {
wrapperCell = attribute.controlCallback(config, column, parentTd, controlID, unformattedValue);
control = wrapperCell.is('.form-control') ? wrapperCell : wrapperCell.find('.form-control');
} else {
switch (column.Metadata.AttributeTypeName.Value) {
case 'MoneyType':
controlCSS += 'text money';
control = $(''.format(controlID, controlCSS, unformattedValue));
wrapperCell = $('').append($('€')).append(control);
parentTd.append(wrapperCell);
JsLib.SetupAllDecimalNumberFields('#' + controlID);
break;
//case 'LookupType':
// controlCSS += 'form-select picklist';
// break;
//case 'IntegerType':
// break;
case 'StringType':
default:
controlCSS += 'text';
control = $(''.format(controlID, controlCSS, unformattedValue));
wrapperCell = $('').append(control);
parentTd.append(wrapperCell);
break;
}
}
control.on('change', function() {
var foundErrors = JsLib.EditableGrid_ValidateChangedAttribute(config, row, attribute, this);
if (!foundErrors && config.settings.autoSaveOnChange == true)
JsLib.EditableGrid_HandleSaveEvent(config, $(this).closest('tr'), 'update');
});
return parentTd;
},
SetupEditableGridBasedOnSubgrid: function(config) {
var grid = $(config.selector);
if (grid.length == 0)
return;
config.grid = grid;
config.viewLayouts = JSON.parse(base64DecodeUnicode(grid.find('.entity-grid').data("view-layouts")))[0];
config.grid.on('loaded', function() {
//console.log('loaded');
JsLib.EditableGrid_Setup(config);
});
/*config.grid.on('jsStateChanged', function(){
console.log('jsStateChanged');
});//*/
},
}
JsLib.OnPreLoad();
/////////////////////////
$.fn.extend({
getVal: function(nullOrEmptyValue) {
var elementID = $(this).attr('id');
if ($(this).getType().startsWith("complex.datetime"))
return $(this).val();
if ($(this).getType().startsWith("complex.lookup"))
//.is('.lookup'))
return $(this).val();
if ($(this).getType().startsWith("complex.msop"))
//.closest('.control').find('#UpdMSPicklistControl').length > 0)
return JsLib.MSOS.GetChoicesValue(elementID);
if ($(this).getType().startsWith("input.file"))
//.is('input[type="file"]'))
return $('#' + elementID).closest('.file-control-container').find('#' + $('#' + elementID).attr('id') + '_file_name').text();
//if ($(this).getType().startsWith("input.radio"))//.is('input[type="radio"]'))
// return $(this).is(':checked');
if ($(this).getType().startsWith("input.checkbox"))
//.is('input[type="checkbox"]'))
return $(this).is(':checked');
if ($(this).getType().startsWith("input.radiolist"))
//.is('span.boolean-radio'))
return $(this).find('input[id^=' + ($(this).attr('id') + '_') + ']:checked').val();
if ($(this).getType().startsWith("input.text.money")) {
var val = $(this).val();
if (JsLib.GetPortalLanguageIndex() == 0)
val = val.replace(/[^0-9\.]+/g, "");
else
val = val.replace(/[^0-9,]+/g, "").replace(',', '.');
if (val == '')
return nullOrEmptyValue != null ? nullOrEmptyValue : val;
var cleanVal = Number(val);
return cleanVal;
//commented as the mask cleanVal method removes the dash from negative numbers
//var cleanVal = $(this).cleanVal();
//if (cleanVal.length <= 2)
// return parseFloat(cleanVal);
//return parseFloat(cleanVal) / 100;
}
if ($(this).getType().startsWith("input")) //.is('input[type="text"],input[type="email"],textarea'))
{
var val = $(this).val();
if (val == '')
return nullOrEmptyValue != null ? nullOrEmptyValue : val;
return $(this).val();
}
return $(this).val();
},
setVal: function(value) {
if ($(this).getType().startsWith("input.checkbox")) //.is('input[type="checkbox"]'))
{
$(this).prop('checked', value != '' ? value : false);
return;
}
if ($(this).getType().startsWith("input.radiolist")) //.is('input[type="checkbox"]'))
{
$(this).find('input[type=radio]').removeAttr('checked');
$(this).find('input[type=radio][value="{0}"]'.format(value)).prop('checked', true);
return;
}
if ($(this).siblings('#eircodeDiv').length)
//is eircode
$(this).siblings('#eircodeDiv').find('input.autoaddress-text-box').val('');
//var controlID = $(this).attr('id');
$(this).val(value);
},
isLocked: function() {
return $(this).is('[disabled],.disabled');
},
isHidden: function() {
return $(this).is(":hidden");
},
setLabels: function(text) {
if ($(this).is('[title]'))
$(this).attr('title', text);
if ($(this).is('[label]'))
$(this).attr('label', text);
if ($(this).is('[aria-label]'))
$(this).attr('aria-label', text);
if ($(this).is('[aria-labelledby]'))
$(this).attr('aria-labelledby', text);
},
defaultTextAndLabels: function(settingName) {
var text = window.ResourceManager[settingName];
var br_text = window.SCP_BR_ResourceManager[settingName];
//if (window.SCP_BR_ResourceManager != null && Object.keys(window.SCP_BR_ResourceManager).includes(settingName));
// br_text = window.SCP_BR_ResourceManager[settingName];
var elementCollection = $(this);
elementCollection.each(function() {
var element = $(this);
if (br_text == null || text != null && (br_text != null && element.text().trim() == br_text.trim())) {
var old_text = element.text();
if (old_text != '')
element.text(text);
if (old_text != text)
element.setLabels(text);
}
});
},
replaceTextAndLabels: function(settingName) {
var text = window.ResourceManager[settingName];
var br_text = window.SCP_BR_ResourceManager[settingName];
var elementCollection = $(this);
elementCollection.each(function() {
var element = $(this);
if (element.html() != '' && text != null && (br_text == null || br_text != null && element.text().trim() == br_text.trim())) {
var old_text = element.text();
if (old_text != '')
element.html(element.html().replace(element.text(), text));
if (old_text != text)
element.setLabels(text);
}
});
},
getType: function() {
var controlID = $(this).attr('id');
if ($(this).is('.datetime') || ($(this).is('.input-text-box') && $(this).parent('.datetimepicker').length)) {
if ($(this).is('[data-type=datetime]'))
return "complex.datetime";
if ($(this).is('[data-type=date]'))
return "complex.datetime.dateonly";
if ($(this).is('.input-text-box') && $(this).parent('.datetimepicker'))
return "complex.datetime.label";
}
if ($(this).is('span.boolean-radio'))
return "input.radiolist";
if ($(this).is('span.picklist.horizontal'))
return "input.radiolist";
if ($(this).is('span.picklist.vertical'))
return "input.radiolist";
if ($(this).is('span.checkbox'))
return "input.checkbox";
if ($('#' + controlID + '_name').is('.lookup'))
return "complex.lookup";
//ToDo: check later if there is a better way for identifying the multiselection option sets
if ($("span#" + controlID + "_Container > span#PcfControlConfig_" + controlID).length == 1)
return "complex.msop";
if ($(this).is('input[type="text"].money'))
return "input.text.money";
if ($(this).is('input[type="text"],input[type="email"]'))
return "input.text";
if ($(this).is('textarea'))
return "input.textarea";
if ($(this).is('select'))
return "input.select";
if ($('#' + controlID + '_input_file').is('input[type="file"]'))
return "input.file";
if ($(this).is('input[type="radio"]'))
return "input.radio";
if ($(this).is('input[type="checkbox"]'))
return "input.checkbox";
if ($(this).is('.subgrid') && $(this).has('.entity-grid').length > 0)
return "complex.subgrid";
if ($(this).is('.subgrid') && $(this).has('.sharepoint-grid').length > 0)
return "complex.SPOgrid";
return "unknown";
},
isBlank: function() {
var elementID = $(this).attr('id');
var valueToReturn = valueToReturn = $(this).val();
if ($(this).getType().startsWith("complex.datetime")) {
if (valueToReturn == 0 || valueToReturn == 'Invalid date')
return true;
}
if ($(this).getType().startsWith("complex.msop")) {
return ($(this).getVal() == '' || $(this).getVal() == []);
}
if ($(this).getType().startsWith("input.file")) {
return ($('#{0}hidden_filename'.format(elementID)).getVal() == '');
}
if ($(this).getType().startsWith("input.radiolist")) {
return ($(this).getVal() == '' || $(this).getVal() == null);
}
if ($(this).getType().startsWith("complex.subgrid") || $(this).getType().startsWith("complex.SPOgrid")) {
return ($(this).find('.view-grid tbody tr:not(.editable_newRecordRow)').length == 0);
}
return valueToReturn == '';
},
isNotBlank: function() {
return !$(this).isBlank();
},
replaceText: function(newText, locationOfNewText='start') {
$(this).contents().filter(function() {
return (this.nodeType == 3);
}).remove();
if (locationOfNewText == 'end')
$(this).append(newText);
else
$(this).prepend(newText);
},
});
//////////////////////////////////////