/******************************************************************************************** * 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 = '
' + '' + headerText + '' + '' + '
'; 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 = $(''.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 ''; } 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 = ''; var tabContainer = '
'; var content = tabContainer; //if (form.tabSetup.showNavigationTabs != false) content += navigationDiv; return '
' + content + '
'; } function TabCommandPrev(cssClass, iconClass, text) { return '
' + text + '
'; } function TabCommandNext(cssClass, iconClass, text, isLastTab) { if (isLastTab) return '
'; else return '
' + text /*+ ' '*/ + '
'; } 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 = '' + legend + ''; return '
' + legend + '
'; } 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 = $(''.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 = ''; $.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 = '
Loading...
'; var spinnerOnPopup = '
Loading...
'; //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 '{0}'; }, 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 ''.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); }, }); //////////////////////////////////////