1/** 2 * Encapsulates methods for the application in order to 3 * avoid namespace pollution. 4 * 5 * @constructor 6 */ 7var VrApplication = function () { 8 9 this.initFileInput = function () { 10 //Bootstrap4 fileupload 11 bsCustomFileInput.init(); 12 }; 13 14 this.initSpinner = function () { 15 $(".vr-app input.spinner").inputSpinner(); 16 // Remove the class spinner when it exists 17 // Call toggle only with fields with the class spinner, so toggle can only remove the class 18 $(".vr-app input.spinner").toggleClass("spinner"); 19 }; 20 21 this.initHugeRte = function () { 22 hugerte.remove('.vr-app textarea.hugerte-enabled-opt-in:not([readonly])'); 23 hugerte.remove('.vr-app textarea.hugerte-enabled-opt-in-basic:not([readonly])'); 24 25 var fallbackAriaText = 'Textinput'; 26 27 var getTextareaLabel = function (editor) { 28 29 var textareaElement = editor && editor.targetElm ? editor.targetElm : null; 30 31 if (textareaElement && textareaElement.id) { 32 var labelElement = $('label[for="' + textareaElement.id + '"]'); 33 if (labelElement.length > 0) { 34 var labelText = $.trim(labelElement.first().text()); 35 if (labelText.length > 0) { 36 return labelText; 37 } 38 } 39 } 40 return fallbackAriaText; 41 }; 42 43 var applyHugeRteAccessibilityAttributes = function (editor) { 44 45 var iframeElement = document.getElementById(editor.id + '_ifr'); 46 var editorBody = editor && editor.getBody ? editor.getBody() : null; 47 48 var label = getTextareaLabel(editor); 49 var pressAlt0FoprHelp = editorBody.getAttribute('aria-label'); 50 51 label = pressAlt0FoprHelp ? label + '. ' + pressAlt0FoprHelp : label; 52 53 if (iframeElement) { 54 iframeElement.setAttribute('title', label); // for Firefox 55 } 56 57 if (editorBody) { 58 editorBody.setAttribute('aria-label', label); // for Chrome 59 editorBody.setAttribute('role', 'textbox'); 60 editorBody.setAttribute('aria-required', 'true'); 61 } 62 }; 63 64 var setupHugeRteEditor = function (editor) { 65 editor.on('change', function () { 66 hugerte.triggerSave(); 67 }); 68 editor.on('init', function () { 69 applyHugeRteAccessibilityAttributes(editor); 70 }); 71 }; 72 73 var hugeRteSettings = { 74 selector: '.vr-app textarea.hugerte-enabled-opt-in:not([readonly])', 75 content_style: 'body{font-size: 14px !important;line-height: 20px; font-family: "Helvetica Neue",Helvetica,Arial,sans-serif !important;}', 76 language: 'de', 77 language_url: '/o/vr-portlet/portlet/common/hugerte/i18n/de.js', 78 plugins: [ 79 'advlist','autoresize','autolink','lists','link','charmap','preview', 80 'searchreplace','wordcount','visualblocks','visualchars','fullscreen', 81 'directionality','image', 'help' 82 ], 83 menubar: 'insert format', 84 toolbar: 'undo redo | styles | bold italic underline strikethrough | alignleft aligncenter alignright al
84ignjustify | bullist numlist outdent indent | link | language | help', 85 content_langs: [ 86 { title: 'englisch', code: 'en' } 87 ], 88 statusbar: false, 89 autoresize_bottom_margin: 0, 90 entity_encoding: 'raw', 91 help_accessibility: true, 92 remove_script_host: false, 93 relative_urls: false, 94 setup: setupHugeRteEditor, 95 promotion: false, 96 iframe_attrs: { 97 role: 'textbox', 98 'aria-multiline': 'true', 99 }, 100 }; 101 var hugeRteSettingsBasic = { 102 selector: '.vr-app textarea.hugerte-enabled-opt-in-basic:not([readonly])', 103 content_style: 'body{font-size: 14px !important;line-height: 20px; font-family: "Helvetica Neue",Helvetica,Arial,sans-serif !important;}', 104 language: 'de', 105 language_url: '/o/vr-portlet/portlet/common/hugerte/i18n/de.js', 106 plugins: [ 107 'advlist','autoresize','autolink','lists','link','charmap','preview', 108 'searchreplace','wordcount','visualblocks','visualchars','fullscreen', 109 'directionality','image', 'help' 110 ], 111 menubar: '', 112 toolbar: 'undo redo | bold italic | bullist numlist | link | blockquote | superscript subscript code | help', 113 statusbar: false, 114 autoresize_bottom_margin: 0, 115 help_accessibility: true, 116 entity_encoding: 'raw', 117 remove_script_host: false, 118 relative_urls: false, 119 setup: setupHugeRteEditor, 120 promotion: false, 121 iframe_attrs: { 122 role: 'textbox', 123 'aria-multiline': 'true', 124 } 125 } 126 if ($('.vr-app textarea.hugerte-enabled-opt-in-basic:not([readonly])').length > 0) { 127 hugerte.init(hugeRteSettingsBasic); 128 } 129 if ($('.vr-app textarea.hugerte-enabled-opt-in:not([readonly])').length > 0 && $('#hugeRteConfigLink').length > 0) { 130 $.ajax({ 131 method: "GET", 132 dataType: "json", 133 url: $('#hugeRteConfigLink').val(), 134 success: function (data, textStatus, jqXHR) { 135 if (data.customNewlineEnabled === true) hugeRteSettings.newline_behavior = "invert"; 136 if (data.tableEnabled === true) { 137 hugeRteSettings.plugins = hugeRteSettings.plugins + " table"; 138 hugeRteSettings.toolbar = hugeRteSettings.toolbar + " table |"; 139 } 140 if (data.codeEnabled === true) { 141 hugeRteSettings.plugins = hugeRteSettings.plugins + " code"; 142 hugeRteSettings.toolbar = hugeRteSettings.toolbar + " code |"; 143 } 144 for (var prop in data.languages) { 145 if (Object.prototype.hasOwnProperty.call(data.languages, prop)) { 146 hugeRteSettings.content_langs.push({title: data.languages[prop], code: prop}); 147 } 148 } 149 hugerte.init(hugeRteSettings); 150 }, 151 error: function (jqXHR, textStatus, errorThrown) { 152 hugerte.init(hugeRteSettings); 153 } 154 }); 155 } 156 }; 157 158 this.initHugeRteDisabled = function () { 159 hugerte.remove('.vr-app textarea.hugerte-enabled-opt-in[readonly]'); 160 var hugeRteSettings = { 161 selector: '.vr-app textarea.hugerte-enabled-opt-in[readonly]', 162 content_style: 'body{font-size: 14px !important;line-height: 20px; font-family: "Helvetica Neue",Helvetica,Arial,sans-serif !important;}', 163 language: 'de', 164 language_url: '/o/vr-portlet/portlet/common/hugerte/i18n/de.js', 165 plugins: [], 166 menubar: '', 167 toolbar: '', 168 statusbar: false, 169 autoresize_bottom_margin: 0, 170 entity_encoding: 'raw', 171 remove_script_host: false, 172 relative_urls: false, 173 readonly: true, 174 promotion: false, 175 }; 176 177 hugerte.init(hugeRteSettings); 178 }; 179 180 this.validateHugeRteRequired = function () { 181 $('.vr-app textarea.hugerte-enabled-opt-in[required], .vr-app textarea.hugerte-enabled-opt-in-basic[required]').each(function() { 182 var form = $(this).closest('form'); 183 $('button[type="submit"]', form).on('click', function() { 184 form.addClass('was-validated'); 185 }); 186 }) 187 }; 188 189 this.initRequiredFieldsHint = function () { 190 var requiredFieldsHint = window.vrRequiredFieldsHint; 191 192 if (!requiredFieldsHint) { 193 return; 194 } 195 196 $('.portlet form').each(function (index) { 197 var form = $(this); 198 var formDescription = form.find('#form-description').first(); 199 200 if (form.find('.required .control-label').length === 0) { 201 return; 202 } 203 204 if (formDescription.length > 0) { 205 if (formDescription.find('.required-fields-hint').length > 0 || $.trim(formDescription.text()).indexOf(requiredFieldsHint) >= 0) { 206 return; 207 } 208 209 formDescription.append($('<span/>', { 210 'class': 'required-fields-hint d-block', 211 text: requiredFieldsHint 212 })); 213 214 return; 215 } 216 217 var formDescriptionId = 'form-description-' + (form.attr('id') || index); 218 var requiredFieldsHintElement = $('<p/>', { 219 id: formDescriptionId, 220 'class': 'form-text required-fields-hint mb-3', 221 text: requiredFieldsHint 222 }); 223 var firstFormElement = form.find('.sheet-fieldset, .fieldset, .form-row, .form-group').first(); 224 var ariaDescribedBy = $.trim(form.attr('aria-describedby') || ''); 225 226 form.attr('aria-describedby', $.trim((ariaDescribedBy.replace(/\bform-description\b/g, '') + ' ' + formDescriptionId).replace(/\s+/g, ' '))); 227 228 if (firstFormElement.length > 0) { 229 requiredFieldsHintElement.insertBefore(firstFormElement); 230 } else { 231 form.prepend(requiredFieldsHintElement); 232 } 233 }); 234 }; 235 236 this.preventDoubleSubmit = function () { 237 238 $(".double-submit-safe").on('submit', function(e) { 239 $(this).find(':button[type=submit]').on('click', function (e) { 240 e.preventDefault(); 241 }); 242 }); 243 }; 244 245 this.initLanguageSwitch = function () { 246 247 $("#language-select").change(function() { 248 window.location = $(this).find(":selected").val(); 249 }); 250 }; 251 252 this.initEnabledIfChecked = function () {
253 $('[data-enabled-if-checked]:not([data-enabled-if-checked=""])').each(function (index) { 254 var $dependentElement = $(this); 255 var $controllingElement = $($dependentElement.attr('data-enabled-if-checked')); 256 257 if ($controllingElement.length === 0) { 258 return; 259 } 260 261 var updateDependentElement = function () { 262 $dependentElement.prop('disabled', !$controllingElement.is(':checked')); 263 }; 264 265 // namespaced-change-event: Der Handler reagiert weiterhin 266 // auf jedes native 'change'-Event, kann aber gezielt wieder abgemeldet werden, ohne fremde 267 // 'change'-Handler zu treffen. Ein eigener Namespace je abhängigem Element sorgt dafür, dass 268 // mehrere abhängige Elemente an derselben steuernden Checkbox sich nicht gegenseitig abmelden. 269 var eventName = 'change.enabledIfChecked-' + ($dependentElement.attr('id') || index); 270 271 $controllingElement.off(eventName).on(eventName, updateDependentElement); 272 updateDependentElement(); 273 }); 274 }; 275}; 276 277$(window).on("load",function () { 278 279 /** 280 * Make application functions available under the global 281 * variable 'vrApp'. 282 * 283 * @type {VrApplication} 284 */ 285 var vrAppReady = new VrApplication(); 286 287 vrAppReady.initFileInput(); 288 vrAppReady.initSpinner(); 289 vrAppReady.initHugeRte(); 290 vrAppReady.initHugeRteDisabled(); 291 vrAppReady.validateHugeRteRequired(); 292 vrAppReady.initRequiredFieldsHint(); 293 vrAppReady.preventDoubleSubmit(); 294 vrAppReady.initLanguageSwitch(); 295 vrAppReady.initEnabledIfChecked(); 296}); 297 298Liferay.on('endNavigate', function (event) { 299 300 /** 301 * Make application functions available under the global 302 * variable 'vrApp'. 303 * 304 * @type {VrApplication} 305 */ 306 var vrAppEndNavigate = new VrApplication(); 307 308 vrAppEndNavigate.initFileInput(); 309 vrAppEndNavigate.initSpinner(); 310 vrAppEndNavigate.initHugeRte(); 311 vrAppEndNavigate.initHugeRteDisabled(); 312 vrAppEndNavigate.validateHugeRteRequired(); 313 vrAppEndNavigate.initRequiredFieldsHint(); 314 vrAppEndNavigate.preventDoubleSubmit(); 315 vrAppEndNavigate.initLanguageSwitch(); 316 vrAppEndNavigate.initEnabledIfChecked(); 317}); 318 319DataTable.defaults.column.orderSequence = ['asc', 'desc']; 320DataTable.ext.errMode = 'throw';
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.