openrat-cms

OpenRat Content Management System
git clone http://git.code.weiherhei.de/openrat-cms.git
Log | Files | Refs | README

commit a155d171824195d22d805790d559c4344825179f
parent bedb48379b8546c3f41bdb6fbc6705e2bfe917d7
Author: Jan Dankert <develop@jandankert.de>
Date:   Wed, 17 Feb 2021 00:37:45 +0100

Refactoring: Extract Notices into a separate js class

Diffstat:
Mmodules/cms/ui/themes/ThemeCompiler.class.php | 1+
Mmodules/cms/ui/themes/default/html/views/folder/advanced.php | 2+-
Mmodules/cms/ui/themes/default/html/views/link/value.php | 2+-
Mmodules/cms/ui/themes/default/html/views/pageelement/value.php | 2+-
Mmodules/cms/ui/themes/default/script/openrat.js | 411+++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------
Mmodules/cms/ui/themes/default/script/openrat.min.js | 21+++++++++++----------
Mmodules/cms/ui/themes/default/script/openrat/common.js | 7++++++-
Mmodules/cms/ui/themes/default/script/openrat/form.js | 66++++++++++++++++++++++++++++++++++++++++++++++--------------------
Amodules/cms/ui/themes/default/script/openrat/notice.js | 196+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mmodules/cms/ui/themes/default/script/openrat/view.js | 7++++++-
Mmodules/cms/ui/themes/default/script/openrat/workbench.js | 109+++----------------------------------------------------------------------------
Mmodules/cms/ui/themes/default/script/plugin/jquery-plugin-orTree.js | 5+++--
Mmodules/language/Language_CN.class.php | 1+
Mmodules/language/Language_DE.class.php | 1+
Mmodules/language/Language_EN.class.php | 1+
Mmodules/language/Language_ES.class.php | 1+
Mmodules/language/Language_FR.class.php | 1+
Mmodules/language/Language_IT.class.php | 1+
Mmodules/language/Language_RU.class.php | 1+
Mmodules/language/Messages.class.php | 1+
Mmodules/language/language.yml | 7+++++--
Mmodules/template_engine/components/html/component_selector/SelectorComponent.class.php | 2+-
Mmodules/template_engine/components/html/component_upload/upload.js | 19++++++++++++-------
23 files changed, 575 insertions(+), 290 deletions(-)

diff --git a/modules/cms/ui/themes/ThemeCompiler.class.php b/modules/cms/ui/themes/ThemeCompiler.class.php @@ -262,6 +262,7 @@ class ThemeCompiler // OpenRat internal JS - als letztes, damit die vorigen bereits geladen sind. $js[] = __DIR__.'/default/script/openrat/init'; + $js[] = __DIR__.'/default/script/openrat/notice'; $js[] = __DIR__.'/default/script/openrat/view'; $js[] = __DIR__.'/default/script/openrat/form'; $js[] = __DIR__.'/default/script/openrat/workbench'; diff --git a/modules/cms/ui/themes/default/html/views/folder/advanced.php b/modules/cms/ui/themes/default/html/views/folder/advanced.php @@ -82,7 +82,7 @@ <div class="<?php echo O::escapeHtml('or-fieldset-value') ?>"><?php echo O::escapeHtml('') ?> <div class="<?php echo O::escapeHtml('or-selector or-droppable-selector') ?>"><?php echo O::escapeHtml('') ?> <input type="<?php echo O::escapeHtml('hidden') ?>" name="<?php echo O::escapeHtml('targetobjectid') ?>" value="<?php echo O::escapeHtml(''.@$targetobjectid.'') ?>" class="<?php echo O::escapeHtml('or-selector-link-value') ?>" /><?php echo O::escapeHtml('') ?> - <input type="<?php echo O::escapeHtml('text') ?>" name="<?php echo O::escapeHtml('targetobjectid_text') ?>" placeholder="<?php echo O::escapeHtml(''.@$rootfoldername.'') ?>" value="<?php echo O::escapeHtml(''.@$rootfoldername.'') ?>" class="<?php echo O::escapeHtml('or-selector-link-name or-act-selector-search') ?>" /><?php echo O::escapeHtml('') ?> + <input type="<?php echo O::escapeHtml('text') ?>" name="<?php echo O::escapeHtml('targetobjectid_text') ?>" placeholder="<?php echo O::escapeHtml(''.@$rootfoldername.'') ?>" value="<?php echo O::escapeHtml(''.@$rootfoldername.'') ?>" class="<?php echo O::escapeHtml('or-input or-selector-link-name or-act-selector-search') ?>" /><?php echo O::escapeHtml('') ?> <i class="<?php echo O::escapeHtml('or-image-icon or-image-icon--menu-tree or-act-selector-tree-button') ?>"><?php echo O::escapeHtml('') ?></i> <div class="<?php echo O::escapeHtml('or-dropdown or-act-selector-search-results') ?>"><?php echo O::escapeHtml('') ?></div> <div type="<?php echo O::escapeHtml('hidden') ?>" data-types="<?php echo O::escapeHtml('folder') ?>" data-init-id="<?php echo O::escapeHtml(''.@$rootfolderid.'') ?>" data-init-folderid="<?php echo O::escapeHtml(''.@$rootfolderid.'') ?>" class="<?php echo O::escapeHtml('or-navtree or-selector-tree or-act-load-selector-tree') ?>"><?php echo O::escapeHtml('') ?></div> diff --git a/modules/cms/ui/themes/default/html/views/link/value.php b/modules/cms/ui/themes/default/html/views/link/value.php @@ -14,7 +14,7 @@ <div class="<?php echo O::escapeHtml('or-fieldset-value') ?>"><?php echo O::escapeHtml('') ?> <div class="<?php echo O::escapeHtml('or-selector or-droppable-selector') ?>"><?php echo O::escapeHtml('') ?> <input type="<?php echo O::escapeHtml('hidden') ?>" name="<?php echo O::escapeHtml('targetobjectid') ?>" value="<?php echo O::escapeHtml(''.@$targetobjectid.'') ?>" class="<?php echo O::escapeHtml('or-selector-link-value') ?>" /><?php echo O::escapeHtml('') ?> - <input type="<?php echo O::escapeHtml('text') ?>" name="<?php echo O::escapeHtml('targetobjectid_text') ?>" placeholder="<?php echo O::escapeHtml(''.@$targetobjectname.'') ?>" value="<?php echo O::escapeHtml(''.@$targetobjectname.'') ?>" class="<?php echo O::escapeHtml('or-selector-link-name or-act-selector-search') ?>" /><?php echo O::escapeHtml('') ?> + <input type="<?php echo O::escapeHtml('text') ?>" name="<?php echo O::escapeHtml('targetobjectid_text') ?>" placeholder="<?php echo O::escapeHtml(''.@$targetobjectname.'') ?>" value="<?php echo O::escapeHtml(''.@$targetobjectname.'') ?>" class="<?php echo O::escapeHtml('or-input or-selector-link-name or-act-selector-search') ?>" /><?php echo O::escapeHtml('') ?> <i class="<?php echo O::escapeHtml('or-image-icon or-image-icon--menu-tree or-act-selector-tree-button') ?>"><?php echo O::escapeHtml('') ?></i> <div class="<?php echo O::escapeHtml('or-dropdown or-act-selector-search-results') ?>"><?php echo O::escapeHtml('') ?></div> <div type="<?php echo O::escapeHtml('hidden') ?>" data-types="<?php echo O::escapeHtml('page,file') ?>" data-init-id="<?php echo O::escapeHtml(''.@$targetobjectid.'') ?>" data-init-folderid="<?php echo O::escapeHtml('parentid') ?>" class="<?php echo O::escapeHtml('or-navtree or-selector-tree or-act-load-selector-tree') ?>"><?php echo O::escapeHtml('') ?></div> diff --git a/modules/cms/ui/themes/default/html/views/pageelement/value.php b/modules/cms/ui/themes/default/html/views/pageelement/value.php @@ -128,7 +128,7 @@ <div class="<?php echo O::escapeHtml('or-fieldset-value') ?>"><?php echo O::escapeHtml('') ?> <div class="<?php echo O::escapeHtml('or-selector or-droppable-selector') ?>"><?php echo O::escapeHtml('') ?> <input type="<?php echo O::escapeHtml('hidden') ?>" name="<?php echo O::escapeHtml('linkobjectid') ?>" value="<?php echo O::escapeHtml(''.@$linkobjectid.'') ?>" class="<?php echo O::escapeHtml('or-selector-link-value') ?>" /><?php echo O::escapeHtml('') ?> - <input type="<?php echo O::escapeHtml('text') ?>" name="<?php echo O::escapeHtml('linkobjectid_text') ?>" placeholder="<?php echo O::escapeHtml(''.@$linkname.'') ?>" value="<?php echo O::escapeHtml(''.@$linkname.'') ?>" class="<?php echo O::escapeHtml('or-selector-link-name or-act-selector-search') ?>" /><?php echo O::escapeHtml('') ?> + <input type="<?php echo O::escapeHtml('text') ?>" name="<?php echo O::escapeHtml('linkobjectid_text') ?>" placeholder="<?php echo O::escapeHtml(''.@$linkname.'') ?>" value="<?php echo O::escapeHtml(''.@$linkname.'') ?>" class="<?php echo O::escapeHtml('or-input or-selector-link-name or-act-selector-search') ?>" /><?php echo O::escapeHtml('') ?> <i class="<?php echo O::escapeHtml('or-image-icon or-image-icon--menu-tree or-act-selector-tree-button') ?>"><?php echo O::escapeHtml('') ?></i> <div class="<?php echo O::escapeHtml('or-dropdown or-act-selector-search-results') ?>"><?php echo O::escapeHtml('') ?></div> <div type="<?php echo O::escapeHtml('hidden') ?>" data-types="<?php echo O::escapeHtml(''.@$types.'') ?>" data-init-id="<?php echo O::escapeHtml(''.@$linkobjectid.'') ?>" data-init-folderid="<?php echo O::escapeHtml(''.@$rootfolderid.'') ?>" class="<?php echo O::escapeHtml('or-navtree or-selector-tree or-act-load-selector-tree') ?>"><?php echo O::escapeHtml('') ?></div> diff --git a/modules/cms/ui/themes/default/script/openrat.js b/modules/cms/ui/themes/default/script/openrat.js @@ -405,8 +405,9 @@ jQuery.fn.orTree = function (options) }).fail(function ( jqXHR, textStatus, errorThrown ) { // Ups... aber was können wir hier schon tun, außer hässliche Meldungen anzeigen. - console.error( {url:loadBranchUrl,jqXHR:jqXHR,status:textStatus,error:errorThrown}); - Openrat.Workbench.notify('', 0, '', 'ERROR', 'Failed to load subtree', [], false); + console.error( {message:'Failed to load subtree',url:loadBranchUrl,jqXHR:jqXHR,status:textStatus,error:errorThrown}); + let notice = new Openrat.Notice(); + notice.setStatus( 'error' ); }).always(function () { // Die Loader-Animation entfernen. @@ -1644,6 +1645,204 @@ jQuery.fn.hasClass = function (styleClass) { return originalHasClass.call(this,'or-'+styleClass); } +/* Include script: notice.js */ + +/** + * Notice. + */ +Openrat.Notice = function() { + + 'use strict'; + + this.typ = ''; + this.id = 0; + this.name = ''; + this.status = 'inactive'; + this.msg = ''; + this.log = ''; + + let element = $('<div class="or-notice or-notice--is-inactive"></div>'); + + + const type = Object.freeze({ + warning: 0, + validation: 1, + info: 2, + success: 3, + error: 3, + loading: 3, + inactive: 4 + }); + + + this.before = function () { + }; + + + // Close the notice. + this.close = function() { + element.fadeOut('fast', function () { + element.remove(); + } ); + } + + + this.setStatus = function( status ) { + + element.removeClass('notice--' + this.status ); + this.status = status; + element.addClass('notice--' + this.status ); + } + + + this.inProgress = function() { + element.addClass('loader'); + } + + this.stopProgress = function() { + element.removeClass('loader'); + } + + this.show = function() { + + console.debug('user notice: '+this.msg); + let notice = this; + element.removeClass('notice--is-inactive'); + + element.appendTo('.or-notices'); // Notice anhängen. + + let toolbar = $('<div class="or-notice-toolbar"></div>'); + toolbar.appendTo(element); + toolbar.append('<i class="or-image-icon or-image-icon--menu-close or-act-notice-close"></i>'); + + if (this.log) + toolbar.append('<i class="or-act-notice-full or-image-icon or-image-icon--menu-fullscreen"></i>'); + + if (this.name) + element.append('<div class="or-notice-name"><a class="or-act-clickable" href="' + Openrat.Navigator.createShortUrl(this.typ, this.id) + '" data-type="open" data-action="' + this.typ + '" data-id="' + this.id + '"><i class="or-notice-action-full or-image-icon or-image-icon--action-' + this.typ + '"></i> ' + this.name + '</a></div>'); + + element.append('<div class="or-notice-text">' + htmlEntities(this.msg) + '</div>'); + + if (this.log) + element.append('<div class="or-notice-log"><pre>' + htmlEntities(this.log) + '</pre></div>'); + + element.orLinkify(); // Enable links + + + // Toogle Fullscreen for notice + element.find('.or-act-notice-full').click(function () { + element.toggleClass('notice--is-full'); + }); + + // Close the notice on click + element.find('.or-act-notice-close').click(function () { + notice.close(); + }); + + // Fadeout the notice after a while. + let timeout = 1; + if (this.status == 'ok') timeout = 3; + if (this.status == 'info') timeout = 30; + if (this.status == 'warning') timeout = 40; + if (this.status == 'error') timeout = 50; + + if (timeout > 0) + setTimeout(function () { + element.fadeOut('slow', function () { + element.remove(); + }); + }, timeout * 1000); + } + + this.setContext = function(type,id,name) { + this.typ = type; + this.id = id; + this.name = name; + } + + + /** + * Show a notice bubble in the UI. + * @param type + * @param id + * @param name + * @param status + * @param msg + * @param log + * @param notifyTheBrowser + */ + this.start = function (type, id, name, status, msg, log = null, notifyTheBrowser = false) { + // Notice-Bar mit dieser Meldung erweitern. + + this.setContext(type,id,name); + this.msg = msg; + this.log = log; + + if (notifyTheBrowser) + this.notifyBrowser(msg); // Notify browser if wanted. + + this.setStatus(status); + + } + + + + /** + * Show a notification in the browser. + * Source: https://developer.mozilla.org/en-US/docs/Web/API/notification + * @param text text of message + */ + this.notifyBrowser = function(text) + { + // Let's check if the browser supports notifications + if (!("Notification" in window)) { + return; + } + + // Let's check if the user is okay to get some notification + else if (Notification.permission === "granted") { + // If it's okay let's create a notification + let notification = new Notification(text); + } + + // Otherwise, we need to ask the user for permission + else if (Notification.permission !== 'denied') { + Notification.requestPermission(function (permission) { + // If the user is okay, let's create a notification + if (permission === "granted") { + let notification = new Notification(text); + } + }); + } + + // At last, if the user already denied any notification, and you + // want to be respectful there is no need to bother them any more. + } + + + + /** + * Escape HTML entities. + * + * @param str + * @returns {string} + */ + let htmlEntities = function( str ) { + return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;'); + } + +} + + +Openrat.Notice.removeNoticesWithStatus = function( status) { + $('.or-notices').find('.or-notice--'+status).remove(); +} + +Openrat.Notice.removeAllNotices = function( status) { + + $('.or-notices').find('.or-notice').remove(); +} + /* Include script: view.js */ /** * View. @@ -1669,6 +1868,7 @@ Openrat.View = function( action,method,id,params ) { * @returns {Promise} */ this.start = function( element ) { + this.before(); this.element = element; return this.loadView(); @@ -1679,6 +1879,7 @@ Openrat.View = function( action,method,id,params ) { } this.close = function() { + } @@ -1738,7 +1939,10 @@ Openrat.View = function( action,method,id,params ) { console.error( {view:view, url:url, status:status, cause: cause} ); - Openrat.Workbench.notify('', 0, '', 'error', 'Server Error'); + let notice = new Openrat.Notice(); + notice.setStatus('error'); + notice.msg = Openrat.Workbench.language.ERROR; + notice.show(); }); // Load the data for this view. @@ -1873,6 +2077,8 @@ Openrat.Form = function() { this.cancel = function() { //$(this.element).html('').parent().removeClass('is-open'); + Openrat.Notice.removeAllNotices(); + this.close(); } @@ -1889,17 +2095,20 @@ Openrat.Form = function() { this.submit = function( mode ) { - if ( mode === undefined ) + if ( mode === undefined ) if ( $(this.element).data('async') ) mode = modes.closeAfterSubmit; else mode = modes.closeAfterSuccess; + Openrat.Notice.removeAllNotices(); // Show progress - let status = $('<div class="or-notice or-notice--info"><div class="or-text or-loader"></div></div>'); - $('.or-notices').prepend(status); // Notice anhängen. - $(status).show(); + let status = new Openrat.Notice(); + status.setStatus('info'); + status.inProgress(); + status.msg = Openrat.Workbench.language.PROGRESS; + status.show(); // Alle vorhandenen Error-Marker entfernen. // Falls wieder ein Fehler auftritt, werden diese erneut gesetzt. @@ -1947,7 +2156,7 @@ Openrat.Form = function() { $.ajax( { 'type':'POST',url:url, data:data, success:function(responseData, textStatus, jqXHR) { form.setLoadStatus(false); - $(status).remove(); + status.close(); form.doResponse(responseData,textStatus,form.element, function() { @@ -1994,24 +2203,30 @@ Openrat.Form = function() { }, error:function(jqXHR, textStatus, errorThrown) { - console.warn( { form:form, status: textStatus, error: errorThrown } ); + console.warn( { + message:'could not post form', + jqXHR:jqXHR, + form:form, + status: textStatus, + error: errorThrown + } ); form.setLoadStatus(false); - $(status).remove(); + status.close(); - try - { - let error = jQuery.parseJSON( jqXHR.responseText ); - Openrat.Workbench.notify('', 0, '', 'error', error.error, [error.description]); + let msg = ''; + try { + msg = jQuery.parseJSON( jqXHR.responseText ).error; } - catch( e ) - { - let msg = jqXHR.responseText; - Openrat.Workbench.notify('', 0, '', 'error', 'Server Error', [msg]); + catch( e ) { + msg = jqXHR.responseText; } - - } + let notice = new Openrat.Notice(); + notice.setStatus('error'); + notice.msg = msg; + notice.show(); + } } ); $(form.element).fadeIn(); @@ -2032,8 +2247,14 @@ Openrat.Form = function() { { if ( status != 'success' ) { - alert('Server error: ' + status); - return; + console.error('Server error: ' + status); + + let notice = new Openrat.Notice(); + notice.setStatus( 'error' ); + notice.msg = Openrat.Workbench.language.ERROR; + notice.show(); + + return; } let form = this; @@ -2045,7 +2266,16 @@ Openrat.Form = function() { // gewechselt hat. let notifyBrowser = $(element).data('async'); - Openrat.Workbench.notify(value.type, value.id, value.name, value.status, value.text, value.log, notifyBrowser); // Notice anhängen. + let notice = new Openrat.Notice(); + notice.setContext( value.type, value.id, value.name ); + notice.log = value.log; + notice.setStatus( value.status ); + notice.msg = value.text; + notice.show(); + + if ( notifyBrowser ) + notice.notifyBrowser() + if ( value.status == 'ok' ) // Kein Fehler? { @@ -2375,103 +2605,6 @@ Openrat.Workbench = new function() - - /** - * Show a notification in the browser. - * Source: https://developer.mozilla.org/en-US/docs/Web/API/notification - * @param text text of message - */ - let notifyBrowser = function(text) - { - // Let's check if the browser supports notifications - if (!("Notification" in window)) { - return; - } - - // Let's check if the user is okay to get some notification - else if (Notification.permission === "granted") { - // If it's okay let's create a notification - let notification = new Notification(text); - } - - // Otherwise, we need to ask the user for permission - else if (Notification.permission !== 'denied') { - Notification.requestPermission(function (permission) { - // If the user is okay, let's create a notification - if (permission === "granted") { - let notification = new Notification(text); - } - }); - } - - // At last, if the user already denied any notification, and you - // want to be respectful there is no need to bother them any more. - } - - - - /** - * Show a notice bubble in the UI. - * @param type - * @param id - * @param name - * @param status - * @param msg - * @param log - * @param notifyTheBrowser - */ - this.notify = function (type, id, name, status, msg, log = null, notifyTheBrowser = false) - { - // Notice-Bar mit dieser Meldung erweitern. - - if ( notifyTheBrowser ) - notifyBrowser( msg ); // Notify browser if wanted. - - let notice = $('<div class="or-notice or-notice--'+status+'"></div>'); - - let toolbar = $('<div class="or-notice-toolbar"></div>'); - if ( log ) - $(toolbar).append('<i class="or-act-notice-full or-image-icon or-image-icon--menu-fullscreen"></i>'); - $(toolbar).append('<i class="or-image-icon or-image-icon--menu-close or-act-notice-close"></i>'); - $(notice).append(toolbar); - - if (name) - $(notice).append('<div class="or-notice-name"><a class="or-act-clickable" href="'+Openrat.Navigator.createShortUrl(type,id)+'" data-type="open" data-action="'+type+'" data-id="'+id+'"><i class="or-notice-action-full or-image-icon or-image-icon--action-'+type+'"></i> '+name+'</a></div>'); - - $(notice).append( '<div class="or-notice-text">'+htmlEntities(msg)+'</div>'); - - if (log) - $(notice).append('<div class="or-notice-log"><pre>'+htmlEntities(log)+'</pre></div>'); - - $('#noticebar').prepend(notice); // Notice anhängen. - $(notice).orLinkify(); // Enable links - - - // Toogle Fullscreen for notice - $(notice).find('.or-act-notice-full').click( function() { - $(notice).toggleClass('notice--is-full'); - }); - - // Close the notice on click - $(notice).find('.or-act-notice-close').click( function() { - $(notice).fadeOut('fast',function() { $(notice).remove(); } ); - }); - - // Fadeout the notice after a while. - let timeout = 1; - if ( status == 'ok' ) timeout = 3; - if ( status == 'info' ) timeout = 10; - if ( status == 'warning') timeout = 15; - if ( status == 'error' ) timeout = 20; - - if (timeout > 0) - setTimeout( function() { - $(notice).fadeOut('slow', function() { $(this).remove(); } ); - },timeout*1000 ); - } - - - this.dataChangedHandler = $.Callbacks(); this.dataChangedHandler.add( function() { @@ -2495,15 +2628,6 @@ Openrat.Workbench = new function() } - /** - * Escape HTML entities. - * - * @param str - * @returns {string} - */ - var htmlEntities = function( str ) { - return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;'); - } /** @@ -2559,6 +2683,9 @@ Openrat.Workbench = new function() let view = new Openrat.View( action,method,id,params ); view.before = function() { + + Openrat.Notice.removeAllNotices(); + $('.or-dialog-content .or-view').html('<div class="header"><img class="or-icon" title="" src="./themes/default/images/icon/'+method+'.png" />'+name+'</div>'); $('.or-dialog-content .or-view').data('id',id); $('.or-dialog').removeClass('dialog--is-closed').addClass('dialog--is-open'); @@ -2775,7 +2902,12 @@ $( function() { // Initial Notices $('.or-act-initial-notice').each( function() { - Openrat.Workbench.notify('', 0, '', 'info', $(this).text()); + + let notice = new Openrat.Notice(); + notice.setStatus('info'); + notice.msg = $(this).text(); + notice.show(); + $(this).remove(); }); @@ -3631,21 +3763,23 @@ Openrat.Workbench.handleFileUpload = function(form,files) form_data.append('token' ,$(form).find('input[name=token]').val() ); form_data.append('id' ,$(form).find('input[name=id]' ).val() ); - var status = $('<div class="notice info"><div class="text loader"></div></div>'); - $('#noticebar').prepend(status); // Notice anhängen. - $(status).show(); + let notice = new Openrat.Notice(); + notice.setContext('folder',0,'' ); + notice.inProgress(); + notice.show(); $.ajax( { 'type':'POST',url:'./api/', cache:false,contentType: false, processData: false, data:form_data, success:function(data, textStatus, jqXHR) { - $(status).remove(); + notice.close(); let oform = new Openrat.Form(); oform.doResponse(data,textStatus,form); }, error:function(jqXHR, textStatus, errorThrown) { $(form).closest('div.content').removeClass('loader'); - $(status).remove(); + notice.close(); let msg; + console.error(jqXHR); try { let error = jQuery.parseJSON( jqXHR.responseText ); @@ -3655,8 +3789,11 @@ Openrat.Workbench.handleFileUpload = function(form,files) { msg = jqXHR.responseText; } - - Openrat.Workbench.notify('Upload error', 0, msg); + + let notice = new Openrat.Notice(); + notice.setStatus('error'); + notice.msg = 'Upload error: ' + msg; + notice.show(); } } ); diff --git a/modules/cms/ui/themes/default/script/openrat.min.js b/modules/cms/ui/themes/default/script/openrat.min.js @@ -121,7 +121,7 @@ else{e.onSearchInactive();$(dropdownEl).empty();dropdownEl.removeClass('search-r ;jQuery.fn.orTree=function(e){var n=$.extend({'openAction':function(e,n,o){}},e);let registerTreeBranchEvents=function(e){Openrat.Workbench.registerDraggable(e)};$(this).each(function(o,e){$(e).children('.or-navtree-node-control').click(function(){let $node=$(this).parent('.or-navtree-node');if($node.is('.or-navtree-node--is-open')){$node.children('ul').slideUp('fast').remove();$node.removeClass('navtree-node--is-open').addClass('navtree-node--is-closed').find('.or-navtree-tree-icon').removeClass('image-icon--node-open').addClass('image-icon--node-closed')} else{$(e).closest('div.view').addClass('loader');let $link=$node.find('a');let id=$link.data('id');let extraId=$link.data('extra');let loadBranchUrl='./?action=tree&subaction=branch&id='+id+'';if(typeof extraId==='string'){jQuery.each(jQuery.parseJSON(extraId.replace(/'/g,'"')),function(e,n){loadBranchUrl=loadBranchUrl+'&'+e+'='+n})} else if(typeof extraId==='object'){jQuery.each(extraId,function(e,n){loadBranchUrl=loadBranchUrl+'&'+e+'='+n})} -else{};console.debug({url:loadBranchUrl});$.get(loadBranchUrl).done(function(o){let $ul=$('<ul class="or-navtree-list" />');$(e).append($ul);$ul.append(o);$ul.find('li').orTree(n);registerTreeBranchEvents($ul);$ul.find('.or-act-clickable').orLinkify({'openAction':n.openAction});$ul.slideDown('fast')}).fail(function(e,n,o){console.error({url:loadBranchUrl,jqXHR:e,status:n,error:o});Openrat.Workbench.notify('',0,'','ERROR','Failed to load subtree',[],!1)}).always(function(){$(e).closest('div.or-view').removeClass('loader')});$node.addClass('navtree-node--is-open').removeClass('navtree-node--is-closed').find('.or-navtree-tree-icon').addClass('image-icon--node-open').removeClass('image-icon--node-closed')}})})}; +else{};console.debug({url:loadBranchUrl});$.get(loadBranchUrl).done(function(o){let $ul=$('<ul class="or-navtree-list" />');$(e).append($ul);$ul.append(o);$ul.find('li').orTree(n);registerTreeBranchEvents($ul);$ul.find('.or-act-clickable').orLinkify({'openAction':n.openAction});$ul.slideDown('fast')}).fail(function(e,n,o){console.error({message:'Failed to load subtree',url:loadBranchUrl,jqXHR:e,status:n,error:o});let notice=new Openrat.Notice();notice.setStatus('error')}).always(function(){$(e).closest('div.or-view').removeClass('loader')});$node.addClass('navtree-node--is-open').removeClass('navtree-node--is-closed').find('.or-navtree-tree-icon').addClass('image-icon--node-open').removeClass('image-icon--node-closed')}})})}; ;jQuery.fn.orAutoheight=function(){var t=function(t){var n=$(t).val().split('\n').length;$(t).attr('rows',n+3)};$(this).each(function(n){t(this)});return $(this).keypress(function(){t(this)})}; /*! jquery-qrcode v0.14.0 - https://larsjung.de/jquery-qrcode/ */ !function(r){"use strict";function t(t,e,n,o){function a(r,t){return r-=o,t-=o,0>r||r>=c||0>t||t>=c?!1:f.isDark(r,t)}function i(r,t,e,n){var o=u.isDark,a=1/l;u.isDark=function(i,u){var f=u*a,c=i*a,l=f+a,g=c+a;return o(i,u)&&(r>l||f>e||t>g||c>n)}}var u={},f=r(n,e);f.addData(t),f.make(),o=o||0;var c=f.getModuleCount(),l=f.getModuleCount()+2*o;return u.text=t,u.level=e,u.version=n,u.moduleCount=l,u.isDark=a,u.addBlank=i,u}function e(r,e,n,o,a){n=Math.max(1,n||1),o=Math.min(40,o||40);for(var i=n;o>=i;i+=1)try{return t(r,e,i,a)}catch(u){}}function n(r,t,e){var n=e.size,o="bold "+e.mSize*n+"px "+e.fontname,a=w("<canvas/>")[0].getContext("2d");a.font=o;var i=a.measureText(e.label).width,u=e.mSize,f=i/n,c=(1-f)*e.mPosX,l=(1-u)*e.mPosY,g=c+f,s=l+u,v=.01;1===e.mode?r.addBlank(0,l-v,n,s+v):r.addBlank(c-v,l-v,g+v,s+v),t.fillStyle=e.fontcolor,t.font=o,t.fillText(e.label,c*n,l*n+.75*e.mSize*n)}function o(r,t,e){var n=e.size,o=e.image.naturalWidth||1,a=e.image.naturalHeight||1,i=e.mSize,u=i*o/a,f=(1-u)*e.mPosX,c=(1-i)*e.mPosY,l=f+u,g=c+i,s=.01;3===e.mode?r.addBlank(0,c-s,n,g+s):r.addBlank(f-s,c-s,l+s,g+s),t.drawImage(e.image,f*n,c*n,u*n,i*n)}function a(r,t,e){w(e.background).is("img")?t.drawImage(e.background,0,0,e.size,e.size):e.background&&(t.fillStyle=e.background,t.fillRect(e.left,e.top,e.size,e.size));var a=e.mode;1===a||2===a?n(r,t,e):(3===a||4===a)&&o(r,t,e)}function i(r,t,e,n,o,a,i,u){r.isDark(i,u)&&t.rect(n,o,a,a)}function u(r,t,e,n,o,a,i,u,f,c){i?r.moveTo(t+a,e):r.moveTo(t,e),u?(r.lineTo(n-a,e),r.arcTo(n,e,n,o,a)):r.lineTo(n,e),f?(r.lineTo(n,o-a),r.arcTo(n,o,t,o,a)):r.lineTo(n,o),c?(r.lineTo(t+a,o),r.arcTo(t,o,t,e,a)):r.lineTo(t,o),i?(r.lineTo(t,e+a),r.arcTo(t,e,n,e,a)):r.lineTo(t,e)}function f(r,t,e,n,o,a,i,u,f,c){i&&(r.moveTo(t+a,e),r.lineTo(t,e),r.lineTo(t,e+a),r.arcTo(t,e,t+a,e,a)),u&&(r.moveTo(n-a,e),r.lineTo(n,e),r.lineTo(n,e+a),r.arcTo(n,e,n-a,e,a)),f&&(r.moveTo(n-a,o),r.lineTo(n,o),r.lineTo(n,o-a),r.arcTo(n,o,n-a,o,a)),c&&(r.moveTo(t+a,o),r.lineTo(t,o),r.lineTo(t,o-a),r.arcTo(t,o,t+a,o,a))}function c(r,t,e,n,o,a,i,c){var l=r.isDark,g=n+a,s=o+a,v=e.radius*a,h=i-1,d=i+1,w=c-1,m=c+1,y=l(i,c),T=l(h,w),p=l(h,c),B=l(h,m),A=l(i,m),E=l(d,m),k=l(d,c),M=l(d,w),C=l(i,w);y?u(t,n,o,g,s,v,!p&&!C,!p&&!A,!k&&!A,!k&&!C):f(t,n,o,g,s,v,p&&C&&T,p&&A&&B,k&&A&&E,k&&C&&M)}function l(r,t,e){var n,o,a=r.moduleCount,u=e.size/a,f=i;for(e.radius>0&&e.radius<=.5&&(f=c),t.beginPath(),n=0;a>n;n+=1)for(o=0;a>o;o+=1){var l=e.left+o*u,g=e.top+n*u,s=u;f(r,t,e,l,g,s,n,o)}if(w(e.fill).is("img")){t.strokeStyle="rgba(0,0,0,0.5)",t.lineWidth=2,t.stroke();var v=t.globalCompositeOperation;t.globalCompositeOperation="destination-out",t.fill(),t.globalCompositeOperation=v,t.clip(),t.drawImage(e.fill,0,0,e.size,e.size),t.restore()}else t.fillStyle=e.fill,t.fill()}function g(r,t){var n=e(t.text,t.ecLevel,t.minVersion,t.maxVersion,t.quiet);if(!n)return null;var o=w(r).data("qrcode",n),i=o[0].getContext("2d");return a(n,i,t),l(n,i,t),o}function s(r){var t=w("<canvas/>").attr("width",r.size).attr("height",r.size);return g(t,r)}function v(r){return w("<img/>").attr("src",s(r)[0].toDataURL("image/png"))}function h(r){var t=e(r.text,r.ecLevel,r.minVersion,r.maxVersion,r.quiet);if(!t)return null;var n,o,a=r.size,i=r.background,u=Math.floor,f=t.moduleCount,c=u(a/f),l=u(.5*(a-c*f)),g={position:"relative",left:0,top:0,padding:0,margin:0,width:a,height:a},s={position:"absolute",padding:0,margin:0,width:c,height:c,"background-color":r.fill},v=w("<div/>").data("qrcode",t).css(g);for(i&&v.css("background-color",i),n=0;f>n;n+=1)for(o=0;f>o;o+=1)t.isDark(n,o)&&w("<div/>").css(s).css({left:l+o*c,top:l+n*c}).appendTo(v);return v}function d(r){return m&&"canvas"===r.render?s(r):m&&"image"===r.render?v(r):h(r)}var w=window.jQuery,m=function(){var r=document.createElement("canvas");return!(!r.getContext||!r.getContext("2d"))}(),y={render:"canvas",minVersion:1,maxVersion:40,ecLevel:"L",left:0,top:0,size:200,fill:"#000",background:null,text:"no text",radius:0,quiet:0,mode:0,mSize:.1,mPosX:.5,mPosY:.5,label:"no label",fontname:"sans",fontcolor:"#000",image:null};w.fn.qrcode=function(r){var t=w.extend({},y,r);return this.each(function(r,e){"canvas"===e.nodeName.toLowerCase()?g(e,t):w(e).append(d(t))})}}(function(){var r=function(){function r(t,e){if("undefined"==typeof t.length)throw new Error(t.length+"/"+e);var n=function(){for(var r=0;r<t.length&&0==t[r];)r+=1;for(var n=new Array(t.length-r+e),o=0;o<t.length-r;o+=1)n[o]=t[o+r];return n}(),o={};return o.getAt=function(r){return n[r]},o.getLength=function(){return n.length},o.multiply=function(t){for(var e=new Array(o.getLength()+t.getLength()-1),n=0;n<o.getLength();n+=1)for(var a=0;a<t.getLength();a+=1)e[n+a]^=i.gexp(i.glog(o.getAt(n))+i.glog(t.getAt(a)));return r(e,0)},o.mod=function(t){if(o.getLength()-t.getLength()<0)return o;for(var e=i.glog(o.getAt(0))-i.glog(t.getAt(0)),n=new Array(o.getLength()),a=0;a<o.getLength();a+=1)n[a]=o.getAt(a);for(var a=0;a<t.getLength();a+=1)n[a]^=i.gexp(i.glog(t.getAt(a))+e);return r(n,0).mod(t)},o}var t=function(t,e){var o=236,i=17,l=t,g=n[e],s=null,v=0,d=null,w=new Array,m={},y=function(r,t){v=4*l+17,s=function(r){for(var t=new Array(r),e=0;r>e;e+=1){t[e]=new Array(r);for(var n=0;r>n;n+=1)t[e][n]=null}return t}(v),T(0,0),T(v-7,0),T(0,v-7),A(),B(),k(r,t),l>=7&&E(r),null==d&&(d=D(l,g,w)),M(d,t)},T=function(r,t){for(var e=-1;7>=e;e+=1)if(!(-1>=r+e||r+e>=v))for(var n=-1;7>=n;n+=1)-1>=t+n||t+n>=v||(e>=0&&6>=e&&(0==n||6==n)||n>=0&&6>=n&&(0==e||6==e)||e>=2&&4>=e&&n>=2&&4>=n?s[r+e][t+n]=!0:s[r+e][t+n]=!1)},p=function(){for(var r=0,t=0,e=0;8>e;e+=1){y(!0,e);var n=a.getLostPoint(m);(0==e||r>n)&&(r=n,t=e)}return t},B=function(){for(var r=8;v-8>r;r+=1)null==s[r][6]&&(s[r][6]=r%2==0);for(var t=8;v-8>t;t+=1)null==s[6][t]&&(s[6][t]=t%2==0)},A=function(){for(var r=a.getPatternPosition(l),t=0;t<r.length;t+=1)for(var e=0;e<r.length;e+=1){var n=r[t],o=r[e];if(null==s[n][o])for(var i=-2;2>=i;i+=1)for(var u=-2;2>=u;u+=1)-2==i||2==i||-2==u||2==u||0==i&&0==u?s[n+i][o+u]=!0:s[n+i][o+u]=!1}},E=function(r){for(var t=a.getBCHTypeNumber(l),e=0;18>e;e+=1){var n=!r&&1==(t>>e&1);s[Math.floor(e/3)][e%3+v-8-3]=n}for(var e=0;18>e;e+=1){var n=!r&&1==(t>>e&1);s[e%3+v-8-3][Math.floor(e/3)]=n}},k=function(r,t){for(var e=g<<3|t,n=a.getBCHTypeInfo(e),o=0;15>o;o+=1){var i=!r&&1==(n>>o&1);6>o?s[o][8]=i:8>o?s[o+1][8]=i:s[v-15+o][8]=i}for(var o=0;15>o;o+=1){var i=!r&&1==(n>>o&1);8>o?s[8][v-o-1]=i:9>o?s[8][15-o-1+1]=i:s[8][15-o-1]=i}s[v-8][8]=!r},M=function(r,t){for(var e=-1,n=v-1,o=7,i=0,u=a.getMaskFunction(t),f=v-1;f>0;f-=2)for(6==f&&(f-=1);;){for(var c=0;2>c;c+=1)if(null==s[n][f-c]){var l=!1;i<r.length&&(l=1==(r[i]>>>o&1));var g=u(n,f-c);g&&(l=!l),s[n][f-c]=l,o-=1,-1==o&&(i+=1,o=7)}if(n+=e,0>n||n>=v){n-=e,e=-e;break}}},C=function(t,e){for(var n=0,o=0,i=0,u=new Array(e.length),f=new Array(e.length),c=0;c<e.length;c+=1){var l=e[c].dataCount,g=e[c].totalCount-l;o=Math.max(o,l),i=Math.max(i,g),u[c]=new Array(l);for(var s=0;s<u[c].length;s+=1)u[c][s]=255&t.getBuffer()[s+n];n+=l;var v=a.getErrorCorrectPolynomial(g),h=r(u[c],v.getLength()-1),d=h.mod(v);f[c]=new Array(v.getLength()-1);for(var s=0;s<f[c].length;s+=1){var w=s+d.getLength()-f[c].length;f[c][s]=w>=0?d.getAt(w):0}}for(var m=0,s=0;s<e.length;s+=1)m+=e[s].totalCount;for(var y=new Array(m),T=0,s=0;o>s;s+=1)for(var c=0;c<e.length;c+=1)s<u[c].length&&(y[T]=u[c][s],T+=1);for(var s=0;i>s;s+=1)for(var c=0;c<e.length;c+=1)s<f[c].length&&(y[T]=f[c][s],T+=1);return y},D=function(r,t,e){for(var n=u.getRSBlocks(r,t),c=f(),l=0;l<e.length;l+=1){var g=e[l];c.put(g.getMode(),4),c.put(g.getLength(),a.getLengthInBits(g.getMode(),r)),g.write(c)}for(var s=0,l=0;l<n.length;l+=1)s+=n[l].dataCount;if(c.getLengthInBits()>8*s)throw new Error("code length overflow. ("+c.getLengthInBits()+">"+8*s+")");for(c.getLengthInBits()+4<=8*s&&c.put(0,4);c.getLengthInBits()%8!=0;)c.putBit(!1);for(;;){if(c.getLengthInBits()>=8*s)break;if(c.put(o,8),c.getLengthInBits()>=8*s)break;c.put(i,8)}return C(c,n)};return m.addData=function(r){var t=c(r);w.push(t),d=null},m.isDark=function(r,t){if(0>r||r>=v||0>t||t>=v)throw new Error(r+","+t);return s[r][t]},m.getModuleCount=function(){return v},m.make=function(){y(!1,p())},m.createTableTag=function(r,t){r=r||2,t="undefined"==typeof t?4*r:t;var e="";e+='<table style="',e+=" border-width: 0px; border-style: none;",e+=" border-collapse: collapse;",e+=" padding: 0px; margin: "+t+"px;",e+='">',e+="<tbody>";for(var n=0;n<m.getModuleCount();n+=1){e+="<tr>";for(var o=0;o<m.getModuleCount();o+=1)e+='<td style="',e+=" border-width: 0px; border-style: none;",e+=" border-collapse: collapse;",e+=" padding: 0px; margin: 0px;",e+=" width: "+r+"px;",e+=" height: "+r+"px;",e+=" background-color: ",e+=m.isDark(n,o)?"#000000":"#ffffff",e+=";",e+='"/>';e+="</tr>"}return e+="</tbody>",e+="</table>"},m.createImgTag=function(r,t){r=r||2,t="undefined"==typeof t?4*r:t;var e=m.getModuleCount()*r+2*t,n=t,o=e-t;return h(e,e,function(t,e){if(t>=n&&o>t&&e>=n&&o>e){var a=Math.floor((t-n)/r),i=Math.floor((e-n)/r);return m.isDark(i,a)?0:1}return 1})},m};t.stringToBytes=function(r){for(var t=new Array,e=0;e<r.length;e+=1){var n=r.charCodeAt(e);t.push(255&n)}return t},t.createStringToBytes=function(r,t){var e=function(){for(var e=s(r),n=function(){var r=e.read();if(-1==r)throw new Error;return r},o=0,a={};;){var i=e.read();if(-1==i)break;var u=n(),f=n(),c=n(),l=String.fromCharCode(i<<8|u),g=f<<8|c;a[l]=g,o+=1}if(o!=t)throw new Error(o+" != "+t);return a}(),n="?".charCodeAt(0);return function(r){for(var t=new Array,o=0;o<r.length;o+=1){var a=r.charCodeAt(o);if(128>a)t.push(a);else{var i=e[r.charAt(o)];"number"==typeof i?(255&i)==i?t.push(i):(t.push(i>>>8),t.push(255&i)):t.push(n)}}return t}};var e={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},n={L:1,M:0,Q:3,H:2},o={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},a=function(){var t=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],n=1335,a=7973,u=21522,f={},c=function(r){for(var t=0;0!=r;)t+=1,r>>>=1;return t};return f.getBCHTypeInfo=function(r){for(var t=r<<10;c(t)-c(n)>=0;)t^=n<<c(t)-c(n);return(r<<10|t)^u},f.getBCHTypeNumber=function(r){for(var t=r<<12;c(t)-c(a)>=0;)t^=a<<c(t)-c(a);return r<<12|t},f.getPatternPosition=function(r){return t[r-1]},f.getMaskFunction=function(r){switch(r){case o.PATTERN000:return function(r,t){return(r+t)%2==0};case o.PATTERN001:return function(r,t){return r%2==0};case o.PATTERN010:return function(r,t){return t%3==0};case o.PATTERN011:return function(r,t){return(r+t)%3==0};case o.PATTERN100:return function(r,t){return(Math.floor(r/2)+Math.floor(t/3))%2==0};case o.PATTERN101:return function(r,t){return r*t%2+r*t%3==0};case o.PATTERN110:return function(r,t){return(r*t%2+r*t%3)%2==0};case o.PATTERN111:return function(r,t){return(r*t%3+(r+t)%2)%2==0};default:throw new Error("bad maskPattern:"+r)}},f.getErrorCorrectPolynomial=function(t){for(var e=r([1],0),n=0;t>n;n+=1)e=e.multiply(r([1,i.gexp(n)],0));return e},f.getLengthInBits=function(r,t){if(t>=1&&10>t)switch(r){case e.MODE_NUMBER:return 10;case e.MODE_ALPHA_NUM:return 9;case e.MODE_8BIT_BYTE:return 8;case e.MODE_KANJI:return 8;default:throw new Error("mode:"+r)}else if(27>t)switch(r){case e.MODE_NUMBER:return 12;case e.MODE_ALPHA_NUM:return 11;case e.MODE_8BIT_BYTE:return 16;case e.MODE_KANJI:return 10;default:throw new Error("mode:"+r)}else{if(!(41>t))throw new Error("type:"+t);switch(r){case e.MODE_NUMBER:return 14;case e.MODE_ALPHA_NUM:return 13;case e.MODE_8BIT_BYTE:return 16;case e.MODE_KANJI:return 12;default:throw new Error("mode:"+r)}}},f.getLostPoint=function(r){for(var t=r.getModuleCount(),e=0,n=0;t>n;n+=1)for(var o=0;t>o;o+=1){for(var a=0,i=r.isDark(n,o),u=-1;1>=u;u+=1)if(!(0>n+u||n+u>=t))for(var f=-1;1>=f;f+=1)0>o+f||o+f>=t||(0!=u||0!=f)&&i==r.isDark(n+u,o+f)&&(a+=1);a>5&&(e+=3+a-5)}for(var n=0;t-1>n;n+=1)for(var o=0;t-1>o;o+=1){var c=0;r.isDark(n,o)&&(c+=1),r.isDark(n+1,o)&&(c+=1),r.isDark(n,o+1)&&(c+=1),r.isDark(n+1,o+1)&&(c+=1),(0==c||4==c)&&(e+=3)}for(var n=0;t>n;n+=1)for(var o=0;t-6>o;o+=1)r.isDark(n,o)&&!r.isDark(n,o+1)&&r.isDark(n,o+2)&&r.isDark(n,o+3)&&r.isDark(n,o+4)&&!r.isDark(n,o+5)&&r.isDark(n,o+6)&&(e+=40);for(var o=0;t>o;o+=1)for(var n=0;t-6>n;n+=1)r.isDark(n,o)&&!r.isDark(n+1,o)&&r.isDark(n+2,o)&&r.isDark(n+3,o)&&r.isDark(n+4,o)&&!r.isDark(n+5,o)&&r.isDark(n+6,o)&&(e+=40);for(var l=0,o=0;t>o;o+=1)for(var n=0;t>n;n+=1)r.isDark(n,o)&&(l+=1);var g=Math.abs(100*l/t/t-50)/5;return e+=10*g},f}(),i=function(){for(var r=new Array(256),t=new Array(256),e=0;8>e;e+=1)r[e]=1<<e;for(var e=8;256>e;e+=1)r[e]=r[e-4]^r[e-5]^r[e-6]^r[e-8];for(var e=0;255>e;e+=1)t[r[e]]=e;var n={};return n.glog=function(r){if(1>r)throw new Error("glog("+r+")");return t[r]},n.gexp=function(t){for(;0>t;)t+=255;for(;t>=256;)t-=255;return r[t]},n}(),u=function(){var r=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],t=function(r,t){var e={};return e.totalCount=r,e.dataCount=t,e},e={},o=function(t,e){switch(e){case n.L:return r[4*(t-1)+0];case n.M:return r[4*(t-1)+1];case n.Q:return r[4*(t-1)+2];case n.H:return r[4*(t-1)+3];default:return}};return e.getRSBlocks=function(r,e){var n=o(r,e);if("undefined"==typeof n)throw new Error("bad rs block @ typeNumber:"+r+"/errorCorrectLevel:"+e);for(var a=n.length/3,i=new Array,u=0;a>u;u+=1)for(var f=n[3*u+0],c=n[3*u+1],l=n[3*u+2],g=0;f>g;g+=1)i.push(t(c,l));return i},e}(),f=function(){var r=new Array,t=0,e={};return e.getBuffer=function(){return r},e.getAt=function(t){var e=Math.floor(t/8);return 1==(r[e]>>>7-t%8&1)},e.put=function(r,t){for(var n=0;t>n;n+=1)e.putBit(1==(r>>>t-n-1&1))},e.getLengthInBits=function(){return t},e.putBit=function(e){var n=Math.floor(t/8);r.length<=n&&r.push(0),e&&(r[n]|=128>>>t%8),t+=1},e},c=function(r){var n=e.MODE_8BIT_BYTE,o=t.stringToBytes(r),a={};return a.getMode=function(){return n},a.getLength=function(r){return o.length},a.write=function(r){for(var t=0;t<o.length;t+=1)r.put(o[t],8)},a},l=function(){var r=new Array,t={};return t.writeByte=function(t){r.push(255&t)},t.writeShort=function(r){t.writeByte(r),t.writeByte(r>>>8)},t.writeBytes=function(r,e,n){e=e||0,n=n||r.length;for(var o=0;n>o;o+=1)t.writeByte(r[o+e])},t.writeString=function(r){for(var e=0;e<r.length;e+=1)t.writeByte(r.charCodeAt(e))},t.toByteArray=function(){return r},t.toString=function(){var t="";t+="[";for(var e=0;e<r.length;e+=1)e>0&&(t+=","),t+=r[e];return t+="]"},t},g=function(){var r=0,t=0,e=0,n="",o={},a=function(r){n+=String.fromCharCode(i(63&r))},i=function(r){if(0>r);else{if(26>r)return 65+r;if(52>r)return 97+(r-26);if(62>r)return 48+(r-52);if(62==r)return 43;if(63==r)return 47}throw new Error("n:"+r)};return o.writeByte=function(n){for(r=r<<8|255&n,t+=8,e+=1;t>=6;)a(r>>>t-6),t-=6},o.flush=function(){if(t>0&&(a(r<<6-t),r=0,t=0),e%3!=0)for(var o=3-e%3,i=0;o>i;i+=1)n+="="},o.toString=function(){return n},o},s=function(r){var t=r,e=0,n=0,o=0,a={};a.read=function(){for(;8>o;){if(e>=t.length){if(0==o)return-1;throw new Error("unexpected end of file./"+o)}var r=t.charAt(e);if(e+=1,"="==r)return o=0,-1;r.match(/^\s$/)||(n=n<<6|i(r.charCodeAt(0)),o+=6)}var a=n>>>o-8&255;return o-=8,a};var i=function(r){if(r>=65&&90>=r)return r-65;if(r>=97&&122>=r)return r-97+26;if(r>=48&&57>=r)return r-48+52;if(43==r)return 62;if(47==r)return 63;throw new Error("c:"+r)};return a},v=function(r,t){var e=r,n=t,o=new Array(r*t),a={};a.setPixel=function(r,t,n){o[t*e+r]=n},a.write=function(r){r.writeString("GIF87a"),r.writeShort(e),r.writeShort(n),r.writeByte(128),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(255),r.writeByte(255),r.writeByte(255),r.writeString(","),r.writeShort(0),r.writeShort(0),r.writeShort(e),r.writeShort(n),r.writeByte(0);var t=2,o=u(t);r.writeByte(t);for(var a=0;o.length-a>255;)r.writeByte(255),r.writeBytes(o,a,255),a+=255;r.writeByte(o.length-a),r.writeBytes(o,a,o.length-a),r.writeByte(0),r.writeString(";")};var i=function(r){var t=r,e=0,n=0,o={};return o.write=function(r,o){if(r>>>o!=0)throw new Error("length over");for(;e+o>=8;)t.writeByte(255&(r<<e|n)),o-=8-e,r>>>=8-e,n=0,e=0;n=r<<e|n,e+=o},o.flush=function(){e>0&&t.writeByte(n)},o},u=function(r){for(var t=1<<r,e=(1<<r)+1,n=r+1,a=f(),u=0;t>u;u+=1)a.add(String.fromCharCode(u));a.add(String.fromCharCode(t)),a.add(String.fromCharCode(e));var c=l(),g=i(c);g.write(t,n);var s=0,v=String.fromCharCode(o[s]);for(s+=1;s<o.length;){var h=String.fromCharCode(o[s]);s+=1,a.contains(v+h)?v+=h:(g.write(a.indexOf(v),n),a.size()<4095&&(a.size()==1<<n&&(n+=1),a.add(v+h)),v=h)}return g.write(a.indexOf(v),n),g.write(e,n),g.flush(),c.toByteArray()},f=function(){var r={},t=0,e={};return e.add=function(n){if(e.contains(n))throw new Error("dup key:"+n);r[n]=t,t+=1},e.size=function(){return t},e.indexOf=function(t){return r[t]},e.contains=function(t){return"undefined"!=typeof r[t]},e};return a},h=function(r,t,e,n){for(var o=v(r,t),a=0;t>a;a+=1)for(var i=0;r>i;i+=1)o.setPixel(i,a,e(i,a));var u=l();o.write(u);for(var f=g(),c=u.toByteArray(),s=0;s<c.length;s+=1)f.writeByte(c[s]);f.flush();var h="";return h+="<img",h+=' src="',h+="data:image/gif;base64,",h+=f,h+='"',h+=' width="',h+=r,h+='"',h+=' height="',h+=t,h+='"',n&&(h+=' alt="',h+=n,h+='"'),h+="/>"};return t}();return function(r){"function"==typeof define&&define.amd?define([],r):"object"==typeof exports&&(module.exports=r())}(function(){return r}),!function(r){r.stringToBytes=function(r){function t(r){for(var t=[],e=0;e<r.length;e++){var n=r.charCodeAt(e);128>n?t.push(n):2048>n?t.push(192|n>>6,128|63&n):55296>n||n>=57344?t.push(224|n>>12,128|n>>6&63,128|63&n):(e++,n=65536+((1023&n)<<10|1023&r.charCodeAt(e)),t.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n))}return t}return t(r)}}(r),r}()); @@ -1171,21 +1171,22 @@ header:o[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:o[2].replace(/^ *|\ /** Trumbowyg v2.10.0 - A lightweight WYSIWYG editor - alex-d.github.io/Trumbowyg - License MIT - Author : Alexandre Demode (Alex-D) / alex-d.fr */ jQuery.trumbowyg={langs:{en:{viewHTML:"View HTML",undo:"Undo",redo:"Redo",formatting:"Formatting",p:"Paragraph",blockquote:"Quote",code:"Code",header:"Header",bold:"Bold",italic:"Italic",strikethrough:"Stroke",underline:"Underline",strong:"Strong",em:"Emphasis",del:"Deleted",superscript:"Superscript",subscript:"Subscript",unorderedList:"Unordered list",orderedList:"Ordered list",insertImage:"Insert Image",link:"Link",createLink:"Insert link",unlink:"Remove link",justifyLeft:"Align Left",justifyCenter:"Align Center",justifyRight:"Align Right",justifyFull:"Align Justify",horizontalRule:"Insert horizontal rule",removeformat:"Remove format",fullscreen:"Fullscreen",close:"Close",submit:"Confirm",reset:"Cancel",required:"Required",description:"Description",title:"Title",text:"Text",target:"Target",width:"Width"}},plugins:{},svgPath:null,hideButtonTexts:null},Object.defineProperty(jQuery.trumbowyg,"defaultOptions",{value:{lang:"en",fixedBtnPane:!1,fixedFullWidth:!1,autogrow:!1,autogrowOnEnter:!1,imageWidthModalEdit:!1,prefix:"trumbowyg-",semantic:!0,resetCss:!1,removeformatPasted:!1,tagsToRemove:[],btns:[["viewHTML"],["undo","redo"],["formatting"],["strong","em","del"],["superscript","subscript"],["link"],["insertImage"],["justifyLeft","justifyCenter","justifyRight","justifyFull"],["unorderedList","orderedList"],["horizontalRule"],["removeformat"],["fullscreen"]],btnsDef:{},inlineElementsSelector:"a,abbr,acronym,b,caption,cite,code,col,dfn,dir,dt,dd,em,font,hr,i,kbd,li,q,span,strikeout,strong,sub,sup,u",pasteHandlers:[],plugins:{},urlProtocol:!1,minimalLinks:!1},writable:!1,enumerable:!0,configurable:!1}),function(e,t,n,a){"use strict";var o="tbwconfirm",r="tbwcancel";a.fn.trumbowyg=function(e,t){var n="trumbowyg";if(e===Object(e)||!e)return this.each(function(){a(this).data(n)||a(this).data(n,new i(this,e))});if(1===this.length)try{var o=a(this).data(n);switch(e){case"execCmd":return o.execCmd(t.cmd,t.param,t.forceCss);case"openModal":return o.openModal(t.title,t.content);case"closeModal":return o.closeModal();case"openModalInsert":return o.openModalInsert(t.title,t.fields,t.callback);case"saveRange":return o.saveRange();case"getRange":return o.range;case"getRangeText":return o.getRangeText();case"restoreRange":return o.restoreRange();case"enable":return o.setDisabled(!1);case"disable":return o.setDisabled(!0);case"toggle":return o.toggle();case"destroy":return o.destroy();case"empty":return o.empty();case"html":return o.html(t)}}catch(r){}return!1};var i=function(o,r){var i=this,s="trumbowyg-icons",l=a.trumbowyg;i.doc=o.ownerDocument||n,i.$ta=a(o),i.$c=a(o),r=r||{},null!=r.lang||null!=l.langs[r.lang]?i.lang=a.extend(!0,{},l.langs.en,l.langs[r.lang]):i.lang=l.langs.en,i.hideButtonTexts=null!=l.hideButtonTexts?l.hideButtonTexts:r.hideButtonTexts;var d=null!=l.svgPath?l.svgPath:r.svgPath;if(i.hasSvg=d!==!1,i.svgPath=i.doc.querySelector("base")?t.location.href.split("#")[0]:"",0===a("#"+s,i.doc).length&&d!==!1){if(null==d){for(var c=n.getElementsByTagName("script"),u=0;u<c.length;u+=1){var g=c[u].src,f=g.match("trumbowyg(.min)?.js");null!=f&&(d=g.substring(0,g.indexOf(f[0]))+"ui/icons.svg")}null==d&&console.warn("You must define svgPath: https://goo.gl/CfTY9U")}var h=i.doc.createElement("div");h.id=s,i.doc.body.insertBefore(h,i.doc.body.childNodes[0]),a.ajax({async:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",dataType:"xml",crossDomain:!0,url:d,data:null,beforeSend:null,complete:null,success:function(e){h.innerHTML=(new XMLSerializer).serializeToString(e.documentElement)}})}var p=i.lang.header,m=function(){return(t.chrome||t.Intl&&Intl.v8BreakIterator)&&"CSS"in t};i.btnsDef={viewHTML:{fn:"toggle"},undo:{isSupported:m,key:"Z"},redo:{isSupported:m,key:"Y"},p:{fn:"formatBlock"},blockquote:{fn:"formatBlock"},h1:{fn:"formatBlock",title:p+" 1"},h2:{fn:"formatBlock",title:p+" 2"},h3:{fn:"formatBlock",title:p+" 3"},h4:{fn:"formatBlock",title:p+" 4"},subscript:{tag:"sub"},superscript:{tag:"sup"},bold:{key:"B",tag:"b"},italic:{key:"I",tag:"i"},underline:{tag:"u"},strikethrough:{tag:"strike"},strong:{fn:"bold",key:"B"},em:{fn:"italic",key:"I"},del:{fn:"strikethrough"},createLink:{key:"K",tag:"a"},unlink:{},insertImage:{},justifyLeft:{tag:"left",forceCss:!0},justifyCenter:{tag:"center",forceCss:!0},justifyRight:{tag:"right",forceCss:!0},justifyFull:{tag:"justify",forceCss:!0},unorderedList:{fn:"insertUnorderedList",tag:"ul"},orderedList:{fn:"insertOrderedList",tag:"ol"},horizontalRule:{fn:"insertHorizontalRule"},removeformat:{},fullscreen:{"class":"trumbowyg-not-disable"},close:{fn:"destroy","class":"trumbowyg-not-disable"},formatting:{dropdown:["p","blockquote","h1","h2","h3","h4"],ico:"p"},link:{dropdown:["createLink","unlink"]}},i.o=a.extend(!0,{},l.defaultOptions,r),i.o.hasOwnProperty("imgDblClickHandler")||(i.o.imgDblClickHandler=i.getDefaultImgDblClickHandler()),i.urlPrefix=i.setupUrlPrefix(),i.disabled=i.o.disabled||"TEXTAREA"===o.nodeName&&o.disabled,r.btns?i.o.btns=r.btns:i.o.semantic||(i.o.btns[3]=["bold","italic","underline","strikethrough"]),a.each(i.o.btnsDef,function(e,t){i.addBtnDef(e,t)}),i.eventNamespace="trumbowyg-event",i.keys=[],i.tagToButton={},i.tagHandlers=[],i.pasteHandlers=[].concat(i.o.pasteHandlers),i.isIE=e.userAgent.indexOf("MSIE")!==-1||e.appVersion.indexOf("Trident/")!==-1,i.init()};i.prototype={DEFAULT_SEMANTIC_MAP:{b:"strong",i:"em",s:"del",strike:"del",div:"p"},init:function(){var e=this;e.height=e.$ta.height(),e.initPlugins();try{e.doc.execCommand("enableObjectResizing",!1,!1),e.doc.execCommand("defaultParagraphSeparator",!1,"p")}catch(t){}e.buildEditor(),e.buildBtnPane(),e.fixedBtnPaneEvents(),e.buildOverlay(),setTimeout(function(){e.disabled&&e.setDisabled(!0),e.$c.trigger("tbwinit")})},addBtnDef:function(e,t){this.btnsDef[e]=t},setupUrlPrefix:function(){var e=this.o.urlProtocol;if(e)return"string"!=typeof e?"https://":/:\/\/$/.test(e)?e:e+"://"},buildEditor:function(){var e=this,n=e.o.prefix,o="";e.$box=a("<div/>",{"class":n+"box "+n+"editor-visible "+n+e.o.lang+" trumbowyg"}),e.isTextarea=e.$ta.is("textarea"),e.isTextarea?(o=e.$ta.val(),e.$ed=a("<div/>"),e.$box.insertAfter(e.$ta).append(e.$ed,e.$ta)):(e.$ed=e.$ta,o=e.$ed.html(),e.$ta=a("<textarea/>",{name:e.$ta.attr("id"),height:e.height}).val(o),e.$box.insertAfter(e.$ed).append(e.$ta,e.$ed),e.syncCode()),e.$ta.addClass(n+"textarea").attr("tabindex",-1),e.$ed.addClass(n+"editor").attr({contenteditable:!0,dir:e.lang._dir||"ltr"}).html(o),e.o.tabindex&&e.$ed.attr("tabindex",e.o.tabindex),e.$c.is("[placeholder]")&&e.$ed.attr("placeholder",e.$c.attr("placeholder")),e.$c.is("[spellcheck]")&&e.$ed.attr("spellcheck",e.$c.attr("spellcheck")),e.o.resetCss&&e.$ed.addClass(n+"reset-css"),e.o.autogrow||e.$ta.add(e.$ed).css({height:e.height}),e.semanticCode(),e.o.autogrowOnEnter&&e.$ed.addClass(n+"autogrow-on-enter");var r,i=!1,s=!1,l="keyup";e.$ed.on("dblclick","img",e.o.imgDblClickHandler).on("keydown",function(t){if((t.ctrlKey||t.metaKey)&&!t.altKey){i=!0;var n=e.keys[String.fromCharCode(t.which).toUpperCase()];try{return e.execCmd(n.fn,n.param),!1}catch(a){}}}).on("compositionstart compositionupdate",function(){s=!0}).on(l+" compositionend",function(t){if("compositionend"===t.type)s=!1;else if(s)return;var n=t.which;if(!(n>=37&&n<=40)){if(!t.ctrlKey&&!t.metaKey||89!==n&&90!==n)if(i||17===n)"undefined"==typeof t.which&&e.semanticCode(!1,!1,!0);else{var a=!e.isIE||"compositionend"===t.type;e.semanticCode(!1,a&&13===n),e.$c.trigger("tbwchange")}else e.$c.trigger("tbwchange");setTimeout(function(){i=!1},50)}}).on("mouseup keydown keyup",function(t){(!t.ctrlKey&&!t.metaKey||t.altKey)&&setTimeout(function(){i=!1},50),clearTimeout(r),r=setTimeout(function(){e.updateButtonPaneStatus()},50)}).on("focus blur",function(t){if(e.$c.trigger("tbw"+t.type),"blur"===t.type&&a("."+n+"active-button",e.$btnPane).removeClass(n+"active-button "+n+"active"),e.o.autogrowOnEnter){if(e.autogrowOnEnterDontClose)return;"focus"===t.type?(e.autogrowOnEnterWasFocused=!0,e.autogrowEditorOnEnter()):e.o.autogrow||(e.$ed.css({height:e.$ed.css("min-height")}),e.$c.trigger("tbwresize"))}}).on("cut",function(){setTimeout(function(){e.semanticCode(!1,!0),e.$c.trigger("tbwchange")},0)}).on("paste",function(n){if(e.o.removeformatPasted){n.preventDefault(),t.getSelection&&t.getSelection().deleteFromDocument&&t.getSelection().deleteFromDocument();try{var o=t.clipboardData.getData("Text");try{e.doc.selection.createRange().pasteHTML(o)}catch(r){e.doc.getSelection().getRangeAt(0).insertNode(e.doc.createTextNode(o))}e.$c.trigger("tbwchange",n)}catch(i){e.execCmd("insertText",(n.originalEvent||n).clipboardData.getData("text/plain"))}}a.each(e.pasteHandlers,function(e,t){t(n)}),setTimeout(function(){e.semanticCode(!1,!0),e.$c.trigger("tbwpaste",n)},0)}),e.$ta.on("keyup",function(){e.$c.trigger("tbwchange")}).on("paste",function(){setTimeout(function(){e.$c.trigger("tbwchange")},0)}),e.$box.on("keydown",function(t){if(27===t.which&&1===a("."+n+"modal-box",e.$box).length)return e.closeModal(),!1})},autogrowEditorOnEnter:function(){var e=this;e.$ed.removeClass("autogrow-on-enter");var t=e.$ed[0].clientHeight;e.$ed.height("auto");var n=e.$ed[0].scrollHeight;e.$ed.addClass("autogrow-on-enter"),t!==n&&(e.$ed.height(t),setTimeout(function(){e.$ed.css({height:n}),e.$c.trigger("tbwresize")},0))},buildBtnPane:function(){var e=this,t=e.o.prefix,n=e.$btnPane=a("<div/>",{"class":t+"button-pane"});a.each(e.o.btns,function(o,r){a.isArray(r)||(r=[r]);var i=a("<div/>",{"class":t+"button-group "+(r.indexOf("fullscreen")>=0?t+"right":"")});a.each(r,function(t,n){try{e.isSupportedBtn(n)&&i.append(e.buildBtn(n))}catch(a){}}),i.html().trim().length>0&&n.append(i)}),e.$box.prepend(n)},buildBtn:function(e){var t=this,n=t.o.prefix,o=t.btnsDef[e],r=o.dropdown,i=null==o.hasIcon||o.hasIcon,s=t.lang[e]||e,l=a("<button/>",{type:"button","class":n+e+"-button "+(o["class"]||"")+(i?"":" "+n+"textual-button"),html:t.hasSvg&&i?'<svg><use xlink:href="'+t.svgPath+"#"+n+(o.ico||e).replace(/([A-Z]+)/g,"-$1").toLowerCase()+'"/></svg>':t.hideButtonTexts?"":o.text||o.title||t.lang[e]||e,title:(o.title||o.text||s)+(o.key?" (Ctrl + "+o.key+")":""),tabindex:-1,mousedown:function(){return r&&!a("."+e+"-"+n+"dropdown",t.$box).is(":hidden")||a("body",t.doc).trigger("mousedown"),!((t.$btnPane.hasClass(n+"disable")||t.$box.hasClass(n+"disabled"))&&!a(this).hasClass(n+"active")&&!a(this).hasClass(n+"not-disable"))&&(t.execCmd(!!r&&"dropdown"||o.fn||e,o.param||e,o.forceCss),!1)}});if(r){l.addClass(n+"open-dropdown");var d=n+"dropdown",c={"class":d+"-"+e+" "+d+" "+n+"fixed-top"};c["data-"+d]=e;var u=a("<div/>",c);a.each(r,function(e,n){t.btnsDef[n]&&t.isSupportedBtn(n)&&u.append(t.buildSubBtn(n))}),t.$box.append(u.hide())}else o.key&&(t.keys[o.key]={fn:o.fn||e,param:o.param||e});return r||(t.tagToButton[(o.tag||e).toLowerCase()]=e),l},buildSubBtn:function(e){var t=this,n=t.o.prefix,o=t.btnsDef[e],r=null==o.hasIcon||o.hasIcon;return o.key&&(t.keys[o.key]={fn:o.fn||e,param:o.param||e}),t.tagToButton[(o.tag||e).toLowerCase()]=e,a("<button/>",{type:"button","class":n+e+"-dropdown-button"+(o.ico?" "+n+o.ico+"-button":""),html:t.hasSvg&&r?'<svg><use xlink:href="'+t.svgPath+"#"+n+(o.ico||e).replace(/([A-Z]+)/g,"-$1").toLowerCase()+'"/></svg>'+(o.text||o.title||t.lang[e]||e):o.text||o.title||t.lang[e]||e,title:o.key?" (Ctrl + "+o.key+")":null,style:o.style||null,mousedown:function(){return a("body",t.doc).trigger("mousedown"),t.execCmd(o.fn||e,o.param||e,o.forceCss),!1}})},isSupportedBtn:function(e){try{return this.btnsDef[e].isSupported()}catch(t){}return!0},buildOverlay:function(){var e=this;return e.$overlay=a("<div/>",{"class":e.o.prefix+"overlay"}).appendTo(e.$box),e.$overlay},showOverlay:function(){var e=this;a(t).trigger("scroll"),e.$overlay.fadeIn(200),e.$box.addClass(e.o.prefix+"box-blur")},hideOverlay:function(){var e=this;e.$overlay.fadeOut(50),e.$box.removeClass(e.o.prefix+"box-blur")},fixedBtnPaneEvents:function(){var e=this,n=e.o.fixedFullWidth,o=e.$box;e.o.fixedBtnPane&&(e.isFixed=!1,a(t).on("scroll."+e.eventNamespace+" resize."+e.eventNamespace,function(){if(o){e.syncCode();var r=a(t).scrollTop(),i=o.offset().top+1,s=e.$btnPane,l=s.outerHeight()-2;r-i>0&&r-i-e.height<0?(e.isFixed||(e.isFixed=!0,s.css({position:"fixed",top:0,left:n?"0":"auto",zIndex:7}),a([e.$ta,e.$ed]).css({marginTop:s.height()})),s.css({width:n?"100%":o.width()-1+"px"}),a("."+e.o.prefix+"fixed-top",o).css({position:n?"fixed":"absolute",top:n?l:l+(r-i)+"px",zIndex:15})):e.isFixed&&(e.isFixed=!1,s.removeAttr("style"),a([e.$ta,e.$ed]).css({marginTop:0}),a("."+e.o.prefix+"fixed-top",o).css({position:"absolute",top:l}))}}))},setDisabled:function(e){var t=this,n=t.o.prefix;t.disabled=e,e?t.$ta.attr("disabled",!0):t.$ta.removeAttr("disabled"),t.$box.toggleClass(n+"disabled",e),t.$ed.attr("contenteditable",!e)},destroy:function(){var e=this,n=e.o.prefix;e.isTextarea?e.$box.after(e.$ta.css({height:""}).val(e.html()).removeClass(n+"textarea").show()):e.$box.after(e.$ed.css({height:""}).removeClass(n+"editor").removeAttr("contenteditable").removeAttr("dir").html(e.html()).show()),e.$ed.off("dblclick","img"),e.destroyPlugins(),e.$box.remove(),e.$c.removeData("trumbowyg"),a("body").removeClass(n+"body-fullscreen"),e.$c.trigger("tbwclose"),a(t).off("scroll."+e.eventNamespace+" resize."+e.eventNamespace)},empty:function(){this.$ta.val(""),this.syncCode(!0)},toggle:function(){var e=this,t=e.o.prefix;e.o.autogrowOnEnter&&(e.autogrowOnEnterDontClose=!e.$box.hasClass(t+"editor-hidden")),e.semanticCode(!1,!0),setTimeout(function(){e.doc.activeElement.blur(),e.$box.toggleClass(t+"editor-hidden "+t+"editor-visible"),e.$btnPane.toggleClass(t+"disable"),a("."+t+"viewHTML-button",e.$btnPane).toggleClass(t+"active"),e.$box.hasClass(t+"editor-visible")?e.$ta.attr("tabindex",-1):e.$ta.removeAttr("tabindex"),e.o.autogrowOnEnter&&!e.autogrowOnEnterDontClose&&e.autogrowEditorOnEnter()},0)},dropdown:function(e){var n=this,o=n.doc,r=n.o.prefix,i=a("[data-"+r+"dropdown="+e+"]",n.$box),s=a("."+r+e+"-button",n.$btnPane),l=i.is(":hidden");if(a("body",o).trigger("mousedown"),l){var d=s.offset().left;s.addClass(r+"active"),i.css({position:"absolute",top:s.offset().top-n.$btnPane.offset().top+s.outerHeight(),left:n.o.fixedFullWidth&&n.isFixed?d+"px":d-n.$btnPane.offset().left+"px"}).show(),a(t).trigger("scroll"),a("body",o).on("mousedown."+n.eventNamespace,function(e){i.is(e.target)||(a("."+r+"dropdown",n.$box).hide(),a("."+r+"active",n.$btnPane).removeClass(r+"active"),a("body",o).off("mousedown."+n.eventNamespace))})}},html:function(e){var t=this;return null!=e?(t.$ta.val(e),t.syncCode(!0),t.$c.trigger("tbwchange"),t):t.$ta.val()},syncTextarea:function(){var e=this;e.$ta.val(e.$ed.text().trim().length>0||e.$ed.find("hr,img,embed,iframe,input").length>0?e.$ed.html():"")},syncCode:function(e){var t=this;if(!e&&t.$ed.is(":visible"))t.syncTextarea();else{var n=a("<div>").html(t.$ta.val()),o=a("<div>").append(n);a(t.o.tagsToRemove.join(","),o).remove(),t.$ed.html(o.contents().html())}if(t.o.autogrow&&(t.height=t.$ed.height(),t.height!==t.$ta.css("height")&&(t.$ta.css({height:t.height}),t.$c.trigger("tbwresize"))),t.o.autogrowOnEnter){t.$ed.height("auto");var r=t.autogrowOnEnterWasFocused?t.$ed[0].scrollHeight:t.$ed.css("min-height");r!==t.$ta.css("height")&&(t.$ed.css({height:r}),t.$c.trigger("tbwresize"))}},semanticCode:function(e,t,n){var o=this;if(o.saveRange(),o.syncCode(e),o.o.semantic){if(o.semanticTag("b"),o.semanticTag("i"),o.semanticTag("s"),o.semanticTag("strike"),t){var r=o.o.inlineElementsSelector,i=":not("+r+")";o.$ed.contents().filter(function(){return 3===this.nodeType&&this.nodeValue.trim().length>0}).wrap("<span data-tbw/>");var s=function(e){if(0!==e.length){var t=e.nextUntil(i).addBack().wrapAll("<p/>").parent(),n=t.nextAll(r).first();t.next("br").remove(),s(n)}};s(o.$ed.children(r).first()),o.semanticTag("div",!0),o.$ed.find("p").filter(function(){return(!o.range||this!==o.range.startContainer)&&(0===a(this).text().trim().length&&0===a(this).children().not("br,span").length)}).contents().unwrap(),a("[data-tbw]",o.$ed).contents().unwrap(),o.$ed.find("p:empty").remove()}n||o.restoreRange(),o.syncTextarea()}},semanticTag:function(e,t){var n;if(null!=this.o.semantic&&"object"==typeof this.o.semantic&&this.o.semantic.hasOwnProperty(e))n=this.o.semantic[e];else{if(this.o.semantic!==!0||!this.DEFAULT_SEMANTIC_MAP.hasOwnProperty(e))return;n=this.DEFAULT_SEMANTIC_MAP[e]}a(e,this.$ed).each(function(){var e=a(this);e.wrap("<"+n+"/>"),t&&a.each(e.prop("attributes"),function(){e.parent().attr(this.name,this.value)}),e.contents().unwrap()})},createLink:function(){for(var e,t,n,o=this,r=o.doc.getSelection(),i=r.focusNode,s=(new XMLSerializer).serializeToString(r.getRangeAt(0).cloneContents());["A","DIV"].indexOf(i.nodeName)<0;)i=i.parentNode;if(i&&"A"===i.nodeName){var l=a(i);s=l.text(),e=l.attr("href"),o.o.minimalLinks||(t=l.attr("title"),n=l.attr("target"));var d=o.doc.createRange();d.selectNode(i),r.removeAllRanges(),r.addRange(d)}o.saveRange();var c={url:{label:"URL",required:!0,value:e},text:{label:o.lang.text,value:s}};o.o.minimalLinks||Object.assign(c,{title:{label:o.lang.title,value:t},target:{label:o.lang.target,value:n}}),o.openModalInsert(o.lang.createLink,c,function(e){var t=o.prependUrlPrefix(e.url);if(!t.length)return!1;var n=a(['<a href="',e.url,'">',e.text||e.url,"</a>"].join(""));return o.o.minimalLinks||(e.title.length>0&&n.attr("title",e.title),e.target.length>0&&n.attr("target",e.target)),o.range.deleteContents(),o.range.insertNode(n[0]),o.syncCode(),o.$c.trigger("tbwchange"),!0})},prependUrlPrefix:function(e){var t=this;if(!t.urlPrefix)return e;const n=/^([a-z][-+.a-z0-9]*:|\/|#)/i;if(n.test(e))return e;const a=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;return a.test(e)?"mailto:"+e:t.urlPrefix+e},unlink:function(){var e=this,t=e.doc.getSelection(),n=t.focusNode;if(t.isCollapsed){for(;["A","DIV"].indexOf(n.nodeName)<0;)n=n.parentNode;if(n&&"A"===n.nodeName){var a=e.doc.createRange();a.selectNode(n),t.removeAllRanges(),t.addRange(a)}}e.execCmd("unlink",void 0,void 0,!0)},insertImage:function(){var e=this;e.saveRange();var t={url:{label:"URL",required:!0},alt:{label:e.lang.description,value:e.getRangeText()}};e.o.imageWidthModalEdit&&(t.width={}),e.openModalInsert(e.lang.insertImage,t,function(t){e.execCmd("insertImage",t.url);var n=a('img[src="'+t.url+'"]:not([alt])',e.$box);return n.attr("alt",t.alt),e.o.imageWidthModalEdit&&n.attr({width:t.width}),e.syncCode(),e.$c.trigger("tbwchange"),!0})},fullscreen:function(){var e,n=this,o=n.o.prefix,r=o+"fullscreen";n.$box.toggleClass(r),e=n.$box.hasClass(r),a("body").toggleClass(o+"body-fullscreen",e),a(t).trigger("scroll"),n.$c.trigger("tbw"+(e?"open":"close")+"fullscreen")},execCmd:function(e,t,n,a){var o=this;a=!!a||"","dropdown"!==e&&o.$ed.focus();try{o.doc.execCommand("styleWithCSS",!1,n||!1)}catch(r){}try{o[e+a](t)}catch(r){try{e(t)}catch(i){"insertHorizontalRule"===e?t=void 0:"formatBlock"===e&&o.isIE&&(t="<"+t+">"),o.doc.execCommand(e,!1,t),o.syncCode(),o.semanticCode(!1,!0)}"dropdown"!==e&&(o.updateButtonPaneStatus(),o.$c.trigger("tbwchange"))}},openModal:function(e,n){var i=this,s=i.o.prefix;if(a("."+s+"modal-box",i.$box).length>0)return!1;i.o.autogrowOnEnter&&(i.autogrowOnEnterDontClose=!0),i.saveRange(),i.showOverlay(),i.$btnPane.addClass(s+"disable");var l=a("<div/>",{"class":s+"modal "+s+"fixed-top"}).css({top:i.$btnPane.height()}).appendTo(i.$box);i.$overlay.one("click",function(){return l.trigger(r),!1});var d=a("<form/>",{action:"",html:n}).on("submit",function(){return l.trigger(o),!1}).on("reset",function(){return l.trigger(r),!1}).on("submit reset",function(){i.o.autogrowOnEnter&&(i.autogrowOnEnterDontClose=!1)}),c=a("<div/>",{"class":s+"modal-box",html:d}).css({top:"-"+i.$btnPane.outerHeight()+"px",opacity:0}).appendTo(l).animate({top:0,opacity:1},100);return a("<span/>",{text:e,"class":s+"modal-title"}).prependTo(c),l.height(c.outerHeight()+10),a("input:first",c).focus(),i.buildModalBtn("submit",c),i.buildModalBtn("reset",c),a(t).trigger("scroll"),l},buildModalBtn:function(e,t){var n=this,o=n.o.prefix;return a("<button/>",{"class":o+"modal-button "+o+"modal-"+e,type:e,text:n.lang[e]||e}).appendTo(a("form",t))},closeModal:function(){var e=this,t=e.o.prefix;e.$btnPane.removeClass(t+"disable"),e.$overlay.off();var n=a("."+t+"modal-box",e.$box);n.animate({top:"-"+n.height()},100,function(){n.parent().remove(),e.hideOverlay()}),e.restoreRange()},openModalInsert:function(e,t,n){var i=this,s=i.o.prefix,l=i.lang,d="";return a.each(t,function(e,t){var n=t.label||e,a=t.name||e,o=t.attributes||{},r=Object.keys(o).map(function(e){return e+'="'+o[e]+'"'}).join(" ");d+='<label><input type="'+(t.type||"text")+'" name="'+a+'"'+("checkbox"===t.type&&t.value?' checked="checked"':' value="'+(t.value||"").replace(/"/g,"&quot;"))+'"'+r+'><span class="'+s+'input-infos"><span>'+(l[n]?l[n]:n)+"</span></span></label>"}),i.openModal(e,d).on(o,function(){var e=a("form",a(this)),r=!0,s={};a.each(t,function(t,n){var o=n.name||t,l=a('input[name="'+o+'"]',e),d=l.attr("type");switch(d.toLowerCase()){case"checkbox":s[o]=l.is(":checked");break;case"radio":s[o]=l.filter(":checked").val();break;default:s[o]=a.trim(l.val())}n.required&&""===s[o]?(r=!1,i.addErrorOnModalField(l,i.lang.required)):n.pattern&&!n.pattern.test(s[o])&&(r=!1,i.addErrorOnModalField(l,n.patternError))}),r&&(i.restoreRange(),n(s,t)&&(i.syncCode(),i.$c.trigger("tbwchange"),i.closeModal(),a(this).off(o)))}).one(r,function(){a(this).off(o),i.closeModal()})},addErrorOnModalField:function(e,t){var n=this.o.prefix,o=e.parent();e.on("change keyup",function(){o.removeClass(n+"input-error")}),o.addClass(n+"input-error").find("input+span").append(a("<span/>",{"class":n+"msg-error",text:t}))},getDefaultImgDblClickHandler:function(){var e=this;return function(){var t=a(this),n=t.attr("src"),o="(Base64)";0===n.indexOf("data:image")&&(n=o);var r={url:{label:"URL",value:n,required:!0},alt:{label:e.lang.description,value:t.attr("alt")}};return e.o.imageWidthModalEdit&&(r.width={value:t.attr("width")?t.attr("width"):""}),e.openModalInsert(e.lang.insertImage,r,function(n){return n.src!==o&&t.attr({src:n.url}),t.attr({alt:n.alt}),e.o.imageWidthModalEdit&&(parseInt(n.width)>0?t.attr({width:n.width}):t.removeAttr("width")),!0}),!1}},saveRange:function(){var e=this,t=e.doc.getSelection();if(e.range=null,t.rangeCount){var n,a=e.range=t.getRangeAt(0),o=e.doc.createRange();o.selectNodeContents(e.$ed[0]),o.setEnd(a.startContainer,a.startOffset),n=(o+"").length,e.metaRange={start:n,end:n+(a+"").length}}},restoreRange:function(){var e,t=this,n=t.metaRange,a=t.range,o=t.doc.getSelection();if(a){if(n&&n.start!==n.end){var r,i=0,s=[t.$ed[0]],l=!1,d=!1;for(e=t.doc.createRange();!d&&(r=s.pop());)if(3===r.nodeType){var c=i+r.length;!l&&n.start>=i&&n.start<=c&&(e.setStart(r,n.start-i),l=!0),l&&n.end>=i&&n.end<=c&&(e.setEnd(r,n.end-i),d=!0),i=c}else for(var u=r.childNodes,g=u.length;g>0;)g-=1,s.push(u[g])}o.removeAllRanges(),o.addRange(e||a)}},getRangeText:function(){return this.range+""},updateButtonPaneStatus:function(){var e=this,t=e.o.prefix,n=e.getTagsRecursive(e.doc.getSelection().focusNode),o=t+"active-button "+t+"active";a("."+t+"active-button",e.$btnPane).removeClass(o),a.each(n,function(n,r){var i=e.tagToButton[r.toLowerCase()],s=a("."+t+i+"-button",e.$btnPane);if(s.length>0)s.addClass(o);else try{s=a("."+t+"dropdown ."+t+i+"-dropdown-button",e.$box);var l=s.parent().data("dropdown");a("."+t+l+"-button",e.$box).addClass(o)}catch(d){}})},getTagsRecursive:function(e,t){var n=this;if(t=t||(e&&e.tagName?[e.tagName]:[]),!e||!e.parentNode)return t;e=e.parentNode;var o=e.tagName;return"DIV"===o?t:("P"===o&&""!==e.style.textAlign&&t.push(e.style.textAlign),a.each(n.tagHandlers,function(a,o){t=t.concat(o(e,n))}),t.push(o),n.getTagsRecursive(e,t).filter(function(e){return null!=e}))},initPlugins:function(){var e=this;e.loadedPlugins=[],a.each(a.trumbowyg.plugins,function(t,n){n.shouldInit&&!n.shouldInit(e)||(n.init(e),n.tagHandler&&e.tagHandlers.push(n.tagHandler),e.loadedPlugins.push(n))})},destroyPlugins:function(){a.each(this.loadedPlugins,function(e,t){t.destroy&&t.destroy()})}}}(navigator,window,document,jQuery); ;window.Openrat={};let originalAddClass=jQuery.fn.addClass;jQuery.fn.addClass=function(s){return originalAddClass.call(this,'or-'+s)};let originalRemoveClass=jQuery.fn.removeClass;jQuery.fn.removeClass=function(s){return originalRemoveClass.call(this,'or-'+s)};let originalHasClass=jQuery.fn.hasClass;jQuery.fn.hasClass=function(s){return originalHasClass.call(this,'or-'+s)}; -;Openrat.View=function(e,t,i,r){this.action=e;this.method=t;this.id=i;this.params=r;this.before=function(){};this.start=function(e){this.before();this.element=e;return this.loadView()};this.afterLoad=function(){};this.close=function(){};function o(e){Openrat.Workbench.afterViewLoadedHandler.fire(e)};this.loadView=function(){let url=Openrat.View.createUrl(this.action,this.method,this.id,this.params,!1);let element=this.element;let view=this;let loadViewHtmlPromise=$.ajax(url);$(this.element).addClass('loader');console.debug(view);loadViewHtmlPromise.done(function(e,t){if(!e)e='';$(element).html(e).removeClass('loader');$(element).find('form').each(function(){let form=new Openrat.Form();form.close=function(){view.close()};form.forwardTo=function(e,t,i,r){view.action=e;view.method=t;view.id=i;view.params=r;view.loadView()};form.initOnElement(this)});o(element)});loadViewHtmlPromise.fail(function(e,t,i){$(element).html('');console.error({view:view,url:url,status:t,cause:i});Openrat.Workbench.notify('',0,'','error','Server Error')});let apiUrl=Openrat.View.createUrl(this.action,this.method,this.id,this.params,!0);return loadViewHtmlPromise};Openrat.View.createUrl=function(e,subaction,i,extraid={},api=!1){let url='./';if(api)url+='api/';url+='?';if(e)url+='&action='+e;if(subaction)url+='&subaction='+subaction;if(i)url+='&id='+i;if(typeof extraid==='string'){extraid=extraid.replace(/'/g,'"');let extraObject=jQuery.parseJSON(extraid);jQuery.each(extraObject,function(e,t){url=url+'&'+e+'='+t})} +;Openrat.Notice=function(){'use strict';this.typ='';this.id=0;this.name='';this.status='inactive';this.msg='';this.log='';let element=$('<div class="or-notice or-notice--is-inactive"></div>');const type=Object.freeze({warning:0,validation:1,info:2,success:3,error:3,loading:3,inactive:4});this.before=function(){};this.close=function(){element.fadeOut('fast',function(){element.remove()})};this.setStatus=function(t){element.removeClass('notice--'+this.status);this.status=t;element.addClass('notice--'+this.status)};this.inProgress=function(){element.addClass('loader')};this.stopProgress=function(){element.removeClass('loader')};this.show=function(){console.debug('user notice: '+this.msg);let notice=this;element.removeClass('notice--is-inactive');element.appendTo('.or-notices');let toolbar=$('<div class="or-notice-toolbar"></div>');toolbar.appendTo(element);toolbar.append('<i class="or-image-icon or-image-icon--menu-close or-act-notice-close"></i>');if(this.log)toolbar.append('<i class="or-act-notice-full or-image-icon or-image-icon--menu-fullscreen"></i>');if(this.name)element.append('<div class="or-notice-name"><a class="or-act-clickable" href="'+Openrat.Navigator.createShortUrl(this.typ,this.id)+'" data-type="open" data-action="'+this.typ+'" data-id="'+this.id+'"><i class="or-notice-action-full or-image-icon or-image-icon--action-'+this.typ+'"></i> '+this.name+'</a></div>');element.append('<div class="or-notice-text">'+htmlEntities(this.msg)+'</div>');if(this.log)element.append('<div class="or-notice-log"><pre>'+htmlEntities(this.log)+'</pre></div>');element.orLinkify();element.find('.or-act-notice-full').click(function(){element.toggleClass('notice--is-full')});element.find('.or-act-notice-close').click(function(){notice.close()});let timeout=1;if(this.status=='ok')timeout=3;if(this.status=='info')timeout=30;if(this.status=='warning')timeout=40;if(this.status=='error')timeout=50;if(timeout>0)setTimeout(function(){element.fadeOut('slow',function(){element.remove()})},timeout*1000)};this.setContext=function(t,e,i){this.typ=t;this.id=e;this.name=i};this.start=function(t,e,i,n,o,log=null,notifyTheBrowser=!1){this.setContext(t,e,i);this.msg=o;this.log=log;if(notifyTheBrowser)this.notifyBrowser(o);this.setStatus(n)};this.notifyBrowser=function(t){if(!('Notification' in window)){return} +else if(Notification.permission==='granted'){let notification=new Notification(t)} +else if(Notification.permission!=='denied'){Notification.requestPermission(function(e){if(e==='granted'){let notification=new Notification(t)}})}};let htmlEntities=function(t){return String(t).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;')}};Openrat.Notice.removeNoticesWithStatus=function(t){$('.or-notices').find('.or-notice--'+t).remove()};Openrat.Notice.removeAllNotices=function(t){$('.or-notices').find('.or-notice').remove()}; +;Openrat.View=function(e,t,i,r){this.action=e;this.method=t;this.id=i;this.params=r;this.before=function(){};this.start=function(e){this.before();this.element=e;return this.loadView()};this.afterLoad=function(){};this.close=function(){};function n(e){Openrat.Workbench.afterViewLoadedHandler.fire(e)};this.loadView=function(){let url=Openrat.View.createUrl(this.action,this.method,this.id,this.params,!1);let element=this.element;let view=this;let loadViewHtmlPromise=$.ajax(url);$(this.element).addClass('loader');console.debug(view);loadViewHtmlPromise.done(function(e,t){if(!e)e='';$(element).html(e).removeClass('loader');$(element).find('form').each(function(){let form=new Openrat.Form();form.close=function(){view.close()};form.forwardTo=function(e,t,i,r){view.action=e;view.method=t;view.id=i;view.params=r;view.loadView()};form.initOnElement(this)});n(element)});loadViewHtmlPromise.fail(function(e,t,i){$(element).html('');console.error({view:view,url:url,status:t,cause:i});let notice=new Openrat.Notice();notice.setStatus('error');notice.msg=Openrat.Workbench.language.ERROR;notice.show()});let apiUrl=Openrat.View.createUrl(this.action,this.method,this.id,this.params,!0);return loadViewHtmlPromise};Openrat.View.createUrl=function(e,subaction,i,extraid={},api=!1){let url='./';if(api)url+='api/';url+='?';if(e)url+='&action='+e;if(subaction)url+='&subaction='+subaction;if(i)url+='&id='+i;if(typeof extraid==='string'){extraid=extraid.replace(/'/g,'"');let extraObject=jQuery.parseJSON(extraid);jQuery.each(extraObject,function(e,t){url=url+'&'+e+'='+t})} else if(typeof extraid==='object'){jQuery.each(extraid,function(e,t){url=url+'&'+e+'='+t})} else{};return url}}; -;Openrat.Form=function(){const modes={showBrowserNotice:1,keepOpen:2,closeAfterSubmit:4,closeAfterSuccess:8,};this.setLoadStatus=function(e){$(this.element).closest('div.content').toggleClass('loader',e)};this.initOnElement=function(e){this.element=e;let form=this;if($(this.element).data('autosave')){$(this.element).find('input[type="checkbox"]').click(function(){form.submit(modes.keepOpen)});$(this.element).find('select').change(function(){form.submit(modes.keepOpen)})};$(e).find('.or-act-form-cancel').click(function(){form.cancel()});$(e).find('.or-act-form-reset').click(function(){form.rollback()});$(e).find('.or-act-form-apply').click(function(){form.submit(modes.keepOpen)});$(e).find('.or-act-form-save').click(function(){form.submit()});$(e).submit(function(e){if($(this).data('target')=='view'){form.submit();e.preventDefault()}})};this.cancel=function(){this.close()};this.rollback=function(){this.element.trigger('reset')};this.close=function(){};this.forwardTo=function(e,t,o,r){};this.submit=function(e){if(e===undefined)if($(this.element).data('async'))e=modes.closeAfterSubmit;else e=modes.closeAfterSuccess;let status=$('<div class="or-notice or-notice--info"><div class="or-text or-loader"></div></div>');$('.or-notices').prepend(status);$(status).show();$(this.element).find('.or-input--error').removeClass('input--error');let params=$(this.element).serializeArray();let data={};$(params).each(function(e,t){data[t.name]=t.value});if(!data.id)data.id=Openrat.Workbench.state.id;if(!data.action)data.action=Openrat.Workbench.state.action;let formMethod=$(this.element).attr('method').toUpperCase();if(formMethod=='GET'){this.forwardTo(data.action,data.subaction,data.id,data);$(status).remove()} -else{let url='./api/';this.setLoadStatus(!0);url+='';data.output='json';if(e==modes.closeAfterSubmit)this.close();let form=this;console.debug(form);$.ajax({'type':'POST',url:url,data:data,success:function(t,o,r){form.setLoadStatus(!1);$(status).remove();form.doResponse(t,o,form.element,function(){$(form.element).closest('.or-view.or-view--is-dirty').removeClass('view--is-dirty');let afterSuccess=$(form.element).data('afterSuccess');let forwardTo=$(form.element).data('forwardTo');let async=$(form.element).data('async');if(afterSuccess=='forward')e=modes.keepOpen;if(e==modes.closeAfterSuccess){form.close();$(form.element).closest('div.panel').find('div.header ul.views li.action.active').removeClass('dirty')};if(afterSuccess){if(afterSuccess=='reloadAll'){Openrat.Workbench.reloadAll()} +;Openrat.Form=function(){const modes={showBrowserNotice:1,keepOpen:2,closeAfterSubmit:4,closeAfterSuccess:8,};this.setLoadStatus=function(e){$(this.element).closest('div.content').toggleClass('loader',e)};this.initOnElement=function(e){this.element=e;let form=this;if($(this.element).data('autosave')){$(this.element).find('input[type="checkbox"]').click(function(){form.submit(modes.keepOpen)});$(this.element).find('select').change(function(){form.submit(modes.keepOpen)})};$(e).find('.or-act-form-cancel').click(function(){form.cancel()});$(e).find('.or-act-form-reset').click(function(){form.rollback()});$(e).find('.or-act-form-apply').click(function(){form.submit(modes.keepOpen)});$(e).find('.or-act-form-save').click(function(){form.submit()});$(e).submit(function(e){if($(this).data('target')=='view'){form.submit();e.preventDefault()}})};this.cancel=function(){Openrat.Notice.removeAllNotices();this.close()};this.rollback=function(){this.element.trigger('reset')};this.close=function(){};this.forwardTo=function(e,t,o,s){};this.submit=function(e){if(e===undefined)if($(this.element).data('async'))e=modes.closeAfterSubmit;else e=modes.closeAfterSuccess;Openrat.Notice.removeAllNotices();let status=new Openrat.Notice();status.setStatus('info');status.inProgress();status.msg=Openrat.Workbench.language.PROGRESS;status.show();$(this.element).find('.or-input--error').removeClass('input--error');let params=$(this.element).serializeArray();let data={};$(params).each(function(e,t){data[t.name]=t.value});if(!data.id)data.id=Openrat.Workbench.state.id;if(!data.action)data.action=Openrat.Workbench.state.action;let formMethod=$(this.element).attr('method').toUpperCase();if(formMethod=='GET'){this.forwardTo(data.action,data.subaction,data.id,data);$(status).remove()} +else{let url='./api/';this.setLoadStatus(!0);url+='';data.output='json';if(e==modes.closeAfterSubmit)this.close();let form=this;console.debug(form);$.ajax({'type':'POST',url:url,data:data,success:function(t,o,s){form.setLoadStatus(!1);status.close();form.doResponse(t,o,form.element,function(){$(form.element).closest('.or-view.or-view--is-dirty').removeClass('view--is-dirty');let afterSuccess=$(form.element).data('afterSuccess');let forwardTo=$(form.element).data('forwardTo');let async=$(form.element).data('async');if(afterSuccess=='forward')e=modes.keepOpen;if(e==modes.closeAfterSuccess){form.close();$(form.element).closest('div.panel').find('div.header ul.views li.action.active').removeClass('dirty')};if(afterSuccess){if(afterSuccess=='reloadAll'){Openrat.Workbench.reloadAll()} else if(afterSuccess=='forward'){if(forwardTo)form.forwardTo(data.action,forwardTo,data.id,[])}} -else{if(async);else Openrat.Workbench.reloadViews()}})},error:function(e,t,o){console.warn({form:form,status:t,error:o});form.setLoadStatus(!1);$(status).remove();try{let error=jQuery.parseJSON(e.responseText);Openrat.Workbench.notify('',0,'','error',error.error,[error.description])}catch(r){let msg=e.responseText;Openrat.Workbench.notify('',0,'','error','Server Error',[msg])}}});$(form.element).fadeIn()}};this.doResponse=function(e,t,o,onSuccess=$.noop){if(t!='success'){alert('Server error: '+t);return};let form=this;$.each(e['notices'],function(t,e){let notifyBrowser=$(o).data('async');Openrat.Workbench.notify(e.type,e.id,e.name,e.status,e.text,e.log,notifyBrowser);if(e.status=='ok'){onSuccess();Openrat.Workbench.dataChangedHandler.fire()} +else{if(async);else Openrat.Workbench.reloadViews()}})},error:function(e,t,o){console.warn({message:'could not post form',jqXHR:e,form:form,status:t,error:o});form.setLoadStatus(!1);status.close();let msg='';try{msg=jQuery.parseJSON(e.responseText).error}catch(s){msg=e.responseText};let notice=new Openrat.Notice();notice.setStatus('error');notice.msg=msg;notice.show()}});$(form.element).fadeIn()}};this.doResponse=function(e,t,o,onSuccess=$.noop){if(t!='success'){console.error('Server error: '+t);let notice=new Openrat.Notice();notice.setStatus('error');notice.msg=Openrat.Workbench.language.ERROR;notice.show();return};let form=this;$.each(e['notices'],function(t,e){let notifyBrowser=$(o).data('async');let notice=new Openrat.Notice();notice.setContext(e.type,e.id,e.name);notice.log=e.log;notice.setStatus(e.status);notice.msg=e.text;notice.show();if(notifyBrowser)notice.notifyBrowser();if(e.status=='ok'){onSuccess();Openrat.Workbench.dataChangedHandler.fire()} else{}});$.each(e['errors'],function(e,t){$('.or-input[name='+t+']').addClass('input--error').parent().addClass('input--error').parents('.or-group').removeClass('closed').addClass('show').addClass('open')})}}; ;Openrat.Workbench=new function(){'use strict';this.state={action:'',id:0,extra:{}};this.popupWindow=null;this.initialize=function(){this.initializePingTimer();this.initializeDirtyWarning();this.initializeState();this.openModalDialog();Openrat.Workbench.registerOpenClose($('.or-collapsible'));console.info('Application started')};this.initializeDirtyWarning=function(){window.addEventListener('beforeunload',function(e){if($('.or-view--is-dirty').length>0){e.preventDefault();return'Unsaved content will be lost.'} else{return undefined}})};this.openModalDialog=function(){if($('#dialog').data('action')){this.startDialog('',$('#dialog').data('action'),$('#dialog').data('action'),0,{})}};this.initializeState=function(){let parts=window.location.hash.split('/');let state={action:'index',id:0};if(parts.length>=2)state.action=parts[1].toLowerCase();if(parts.length>=3)state.id=parts[2].replace(/[^0-9_]/gim,'');Openrat.Workbench.state=state;Openrat.Navigator.toActualHistory(state)};this.initializePingTimer=function(){let ping=function(){let pingPromise=$.getJSON(Openrat.View.createUrl('profile','ping',0,{},!0));console.debug('ping');pingPromise.fail(function(e,t,i){console.warn({message:'The server ping has failed.',jqXHR:e,status:t,error:i});if($('.view.dirty').length>0){window.alert('The server session is lost, please save your data.')} -else{}})};let timeoutMinutes=5;window.setInterval(ping,timeoutMinutes*60*1000)};this.loadNewActionState=function(e){Openrat.Workbench.state=e;Openrat.Workbench.loadNewAction(e.action,e.id,e.data);this.afterNewActionHandler.fire()};this.afterNewActionHandler=$.Callbacks();this.afterAllViewsLoaded=$.Callbacks();this.loadNewAction=function(e,t,i){this.reloadViews()};this.reloadViews=function(){$('.or-workbench-section--is-closed .or-act-view-loader').empty();let promise=Openrat.Workbench.loadViews($('.or-workbench .or-act-view-loader'));promise.done(function(){Openrat.Workbench.afterAllViewsLoaded.fire()});return promise};this.reloadAll=function(){let promise=Openrat.Workbench.loadViews($('.or-act-view-loader,.or-act-view-static').empty());console.debug('reloading all views');promise.done(function(){Openrat.Workbench.afterAllViewsLoaded.fire()});this.loadUserStyle();this.loadLanguage();this.loadUISettings();return promise};this.loadUserStyle=function(){let url=Openrat.View.createUrl('profile','userinfo',0,{},!0);$.getJSON(url,function(e){let style=e.output['style'];Openrat.Workbench.setUserStyle(style);let color=e.output['theme-color'];Openrat.Workbench.setThemeColor(color)})};this.settings={};this.language={};this.loadLanguage=function(){let url=Openrat.View.createUrl('profile','language',0,{},!0);$.getJSON(url,function(e){Openrat.Workbench.language=e.output.language})};this.loadUISettings=function(){let url=Openrat.View.createUrl('profile','uisettings',0,{},!0);$.getJSON(url,function(e){Openrat.Workbench.settings=e.output.settings.settings})};this.loadViews=function(e){let promises=[];e.each(function(e){let $targetDOMElement=$(this);promises.push(Openrat.Workbench.loadNewActionIntoElement($targetDOMElement))});return $.when.apply($,promises)};this.loadNewActionIntoElement=function(e){let action;if(e.is('.or-act-view-static'))action=e.attr('data-action');else action=Openrat.Workbench.state.action;let id=Openrat.Workbench.state.id;let params=Openrat.Workbench.state.extra;let method=e.data('method');let view=new Openrat.View(action,method,id,params);return view.start(e)};this.setUserStyle=function(e){var t=$('html'),i=t.attr('class').split(/\s+/);$.each(i,function(e,i){if(i.startsWith('or-theme-')){t.removeClass(i.substring(3))}});t.addClass('theme-'+e.toLowerCase())};this.setThemeColor=function(e){$('#theme-color').attr('content',e)};let notifyBrowser=function(e){if(!('Notification' in window)){return} -else if(Notification.permission==='granted'){let notification=new Notification(e)} -else if(Notification.permission!=='denied'){Notification.requestPermission(function(t){if(t==='granted'){let notification=new Notification(e)}})}};this.notify=function(t,i,o,n,a,log=null,notifyTheBrowser=!1){if(notifyTheBrowser)notifyBrowser(a);let notice=$('<div class="or-notice or-notice--'+n+'"></div>');let toolbar=$('<div class="or-notice-toolbar"></div>');if(log)$(toolbar).append('<i class="or-act-notice-full or-image-icon or-image-icon--menu-fullscreen"></i>');$(toolbar).append('<i class="or-image-icon or-image-icon--menu-close or-act-notice-close"></i>');$(notice).append(toolbar);if(o)$(notice).append('<div class="or-notice-name"><a class="or-act-clickable" href="'+Openrat.Navigator.createShortUrl(t,i)+'" data-type="open" data-action="'+t+'" data-id="'+i+'"><i class="or-notice-action-full or-image-icon or-image-icon--action-'+t+'"></i> '+o+'</a></div>');$(notice).append('<div class="or-notice-text">'+e(a)+'</div>');if(log)$(notice).append('<div class="or-notice-log"><pre>'+e(log)+'</pre></div>');$('#noticebar').prepend(notice);$(notice).orLinkify();$(notice).find('.or-act-notice-full').click(function(){$(notice).toggleClass('notice--is-full')});$(notice).find('.or-act-notice-close').click(function(){$(notice).fadeOut('fast',function(){$(notice).remove()})});let timeout=1;if(n=='ok')timeout=3;if(n=='info')timeout=10;if(n=='warning')timeout=15;if(n=='error')timeout=20;if(timeout>0)setTimeout(function(){$(notice).fadeOut('slow',function(){$(this).remove()})},timeout*1000)};this.dataChangedHandler=$.Callbacks();this.dataChangedHandler.add(function(){if(Openrat.Workbench.popupWindow)Openrat.Workbench.popupWindow.location.reload()});this.afterViewLoadedHandler=$.Callbacks();this.setApplicationTitle=function(e){if(e)$('head > title').text(e+' - '+$('head > title').data('default'));else $('head > title').text($('head > title').data('default'))};var e=function(e){return String(e).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;')};this.registerOpenClose=function(e){$(e).children('.or-collapsible-act-switch').click(function(){$(this).closest('.or-collapsible').toggleClass('collapsible--is-open').toggleClass('collapsible--is-closed')})};this.openNewAction=function(e,t,i){$('.or-workbench-navigation').removeClass('workbench-navigation--is-open');Openrat.Workbench.setApplicationTitle(e);Openrat.Navigator.navigateToNew({'action':t,'id':i})};this.startDialog=function(e,t,i,o,n){if(!t)t=Openrat.Workbench.state.action;if(!o)o=Openrat.Workbench.state.id;let view=new Openrat.View(t,i,o,n);view.before=function(){$('.or-dialog-content .or-view').html('<div class="header"><img class="or-icon" title="" src="./themes/default/images/icon/'+i+'.png" />'+e+'</div>');$('.or-dialog-content .or-view').data('id',o);$('.or-dialog').removeClass('dialog--is-closed').addClass('dialog--is-open');$('.or-dialog-content .or-act-dialog-name').html(e);let view=this;this.escapeKeyClosingHandler=function(e){if(e.keyCode==27){view.close();$(document).off('keyup')}};$(document).keyup(this.escapeKeyClosingHandler);$('.or-dialog-filler,.or-act-dialog-close').click(function(e){e.preventDefault();view.close()})};view.close=function(){let isDirty=$('.or-view--is-dirty').length;if(isDirty){let exit=window.confirm(Openrat.Workbench.language.UNSAVED_CHANGES_CONFIRM);if(!exit)return};if($('.or-dialog').hasClass('or-dialog--modal'))return;$('.or-dialog-content .or-view.or-view--is-dirty').removeClass('view--is-dirty');$('.or-dialog-content .or-view').html('');$('.or-dialog').removeClass('dialog--is-open').addClass('dialog--is-closed');$(document).unbind('keyup',this.escapeKeyClosingHandler)};return view.start($('.or-dialog-content .or-view'))};this.registerDraggable=function(e){$(e).find('.or-draggable').draggable({helper:'clone',opacity:0.7,zIndex:3,distance:10,cursor:'move',revert:'false'})};this.registerDroppable=function(e){$(e).find('.or-droppable-selector').droppable({accept:'.or-draggable',hoverClass:'droppable--hover',activeClass:'droppable--active',drop:function(e,t){let dropped=t.draggable;console.info('dropped:');console.info(dropped);let id=$(dropped).find('.or-link').data('id');let name=$(dropped).find('.or-navtree-text').text();if(!name)name=id;$(this).find('.or-selector-link-value').val(id);$(this).find('.or-selector-link-name').val(name).attr('placeholder',name)}})}}; +else{}})};let timeoutMinutes=5;window.setInterval(ping,timeoutMinutes*60*1000)};this.loadNewActionState=function(e){Openrat.Workbench.state=e;Openrat.Workbench.loadNewAction(e.action,e.id,e.data);this.afterNewActionHandler.fire()};this.afterNewActionHandler=$.Callbacks();this.afterAllViewsLoaded=$.Callbacks();this.loadNewAction=function(e,t,i){this.reloadViews()};this.reloadViews=function(){$('.or-workbench-section--is-closed .or-act-view-loader').empty();let promise=Openrat.Workbench.loadViews($('.or-workbench .or-act-view-loader'));promise.done(function(){Openrat.Workbench.afterAllViewsLoaded.fire()});return promise};this.reloadAll=function(){let promise=Openrat.Workbench.loadViews($('.or-act-view-loader,.or-act-view-static').empty());console.debug('reloading all views');promise.done(function(){Openrat.Workbench.afterAllViewsLoaded.fire()});this.loadUserStyle();this.loadLanguage();this.loadUISettings();return promise};this.loadUserStyle=function(){let url=Openrat.View.createUrl('profile','userinfo',0,{},!0);$.getJSON(url,function(e){let style=e.output['style'];Openrat.Workbench.setUserStyle(style);let color=e.output['theme-color'];Openrat.Workbench.setThemeColor(color)})};this.settings={};this.language={};this.loadLanguage=function(){let url=Openrat.View.createUrl('profile','language',0,{},!0);$.getJSON(url,function(e){Openrat.Workbench.language=e.output.language})};this.loadUISettings=function(){let url=Openrat.View.createUrl('profile','uisettings',0,{},!0);$.getJSON(url,function(e){Openrat.Workbench.settings=e.output.settings.settings})};this.loadViews=function(e){let promises=[];e.each(function(e){let $targetDOMElement=$(this);promises.push(Openrat.Workbench.loadNewActionIntoElement($targetDOMElement))});return $.when.apply($,promises)};this.loadNewActionIntoElement=function(e){let action;if(e.is('.or-act-view-static'))action=e.attr('data-action');else action=Openrat.Workbench.state.action;let id=Openrat.Workbench.state.id;let params=Openrat.Workbench.state.extra;let method=e.data('method');let view=new Openrat.View(action,method,id,params);return view.start(e)};this.setUserStyle=function(e){var t=$('html'),i=t.attr('class').split(/\s+/);$.each(i,function(e,i){if(i.startsWith('or-theme-')){t.removeClass(i.substring(3))}});t.addClass('theme-'+e.toLowerCase())};this.setThemeColor=function(e){$('#theme-color').attr('content',e)};this.dataChangedHandler=$.Callbacks();this.dataChangedHandler.add(function(){if(Openrat.Workbench.popupWindow)Openrat.Workbench.popupWindow.location.reload()});this.afterViewLoadedHandler=$.Callbacks();this.setApplicationTitle=function(e){if(e)$('head > title').text(e+' - '+$('head > title').data('default'));else $('head > title').text($('head > title').data('default'))};this.registerOpenClose=function(e){$(e).children('.or-collapsible-act-switch').click(function(){$(this).closest('.or-collapsible').toggleClass('collapsible--is-open').toggleClass('collapsible--is-closed')})};this.openNewAction=function(e,t,i){$('.or-workbench-navigation').removeClass('workbench-navigation--is-open');Openrat.Workbench.setApplicationTitle(e);Openrat.Navigator.navigateToNew({'action':t,'id':i})};this.startDialog=function(e,t,i,o,a){if(!t)t=Openrat.Workbench.state.action;if(!o)o=Openrat.Workbench.state.id;let view=new Openrat.View(t,i,o,a);view.before=function(){Openrat.Notice.removeAllNotices();$('.or-dialog-content .or-view').html('<div class="header"><img class="or-icon" title="" src="./themes/default/images/icon/'+i+'.png" />'+e+'</div>');$('.or-dialog-content .or-view').data('id',o);$('.or-dialog').removeClass('dialog--is-closed').addClass('dialog--is-open');$('.or-dialog-content .or-act-dialog-name').html(e);let view=this;this.escapeKeyClosingHandler=function(e){if(e.keyCode==27){view.close();$(document).off('keyup')}};$(document).keyup(this.escapeKeyClosingHandler);$('.or-dialog-filler,.or-act-dialog-close').click(function(e){e.preventDefault();view.close()})};view.close=function(){let isDirty=$('.or-view--is-dirty').length;if(isDirty){let exit=window.confirm(Openrat.Workbench.language.UNSAVED_CHANGES_CONFIRM);if(!exit)return};if($('.or-dialog').hasClass('or-dialog--modal'))return;$('.or-dialog-content .or-view.or-view--is-dirty').removeClass('view--is-dirty');$('.or-dialog-content .or-view').html('');$('.or-dialog').removeClass('dialog--is-open').addClass('dialog--is-closed');$(document).unbind('keyup',this.escapeKeyClosingHandler)};return view.start($('.or-dialog-content .or-view'))};this.registerDraggable=function(e){$(e).find('.or-draggable').draggable({helper:'clone',opacity:0.7,zIndex:3,distance:10,cursor:'move',revert:'false'})};this.registerDroppable=function(e){$(e).find('.or-droppable-selector').droppable({accept:'.or-draggable',hoverClass:'droppable--hover',activeClass:'droppable--active',drop:function(e,t){let dropped=t.draggable;console.info('dropped:');console.info(dropped);let id=$(dropped).find('.or-link').data('id');let name=$(dropped).find('.or-navtree-text').text();if(!name)name=id;$(this).find('.or-selector-link-value').val(id);$(this).find('.or-selector-link-name').val(name).attr('placeholder',name)}})}}; ;Openrat.Navigator=new function(){'use strict';this.navigateTo=function(t){Openrat.Workbench.loadNewActionState(t)};this.navigateToNew=function(t){this.navigateTo(t);window.history.pushState(t,t.name,this.createShortUrl(t.action,t.id))};this.toActualHistory=function(t){window.history.replaceState(t,t.name,this.createShortUrl(t.action,t.id))};this.createShortUrl=function(t,i){return'./#/'+t+(i?'/'+i:'')}}; -;$(function(){$('html').removeClass('nojs');$('.or--initial-hidden').removeClass('-initial-hidden');function t(){};t();window.onpopstate=function(e){Openrat.Navigator.navigateTo(e.state)};Openrat.Workbench.initialize();Openrat.Workbench.reloadAll();let registerWorkbenchGlobalEvents=function(){$('.keystroke').each(function(){let keystrokeElement=$(this);let keystroke=keystrokeElement.text();if(keystroke.length==0)return;let keyaction=function(){keystrokeElement.click()};$(document).bind('keydown',keystroke,keyaction)})};$('.or-act-initial-notice').each(function(){Openrat.Workbench.notify('',0,'','info',$(this).text());$(this).remove()});registerWorkbenchGlobalEvents();let closeMenu=function(){$('body').click(function(){$('.or-menu').removeClass('menu--is-open')})};closeMenu();let closeMobileNavigation=function(){$('.or-act-navigation-close').click(function(){$('.or-workbench-navigation').removeClass('workbench-navigation--is-open');$('.or-workbench').removeClass('workbench--navigation-is-open')})};closeMobileNavigation();let closeDesktopNavigation=function(){$('.or-workbench-title .or-act-nav-small').click(function(){$('.or-workbench').addClass('workbench--navigation-is-small');$('.or-workbench-navigation').addClass('workbench-navigation--is-small')})};closeDesktopNavigation();let registerGlobalSearch=function(){$('.or-search-input .or-input').orSearch({onSearchActive:function(){$('.or-search').addClass('search--is-active')},onSearchInactive:function(){$('.or-search').removeClass('search--is-active')},dropdown:'.or-act-search-result',resultEntryClass:'or-search-result-entry',select:function(e){Openrat.Workbench.openNewAction(e.name,e.action,e.id)},afterSelect:function(){}});$('.or-search .or-act-search-delete').click(function(){$('.or-search .or-title-input').val('').change()})};registerGlobalSearch();Openrat.Workbench.afterNewActionHandler.add(function(){$('.or-sidebar').find('.or-sidebar-button').orLinkify()});Openrat.Workbench.afterNewActionHandler.add(function(){let url=Openrat.View.createUrl('tree','path',Openrat.Workbench.state.id,{'type':Openrat.Workbench.state.action});let loadPromise=$.get(url);loadPromise.done(function(e){$('.or-breadcrumb').empty().append(e).find('.or-act-clickable').orLinkify();$('nav .or-navtree-node').removeClass('or-navtree-node--selected');$('.or-breadcrumb a').each(function(){let action=$(this).data('action');let id=$(this).data('id');let $navControl=$('nav .or-navtree-node[data-type='+action+'][data-id='+id+'].or-navtree-node--is-closed .or-navtree-node-control');$navControl.click()})}).fail(function(t,n,o){console.warn({message:'Failed to load path',url:url,error:e,status:n,o})}).always(function(){})});Openrat.Workbench.afterNewActionHandler.fire()});let filterMenus=function(){let action=Openrat.Workbench.state.action;let id=Openrat.Workbench.state.id;$('.or-workbench-title .or-dropdown-entry.or-act-clickable').addClass('dropdown-entry--active');$('.or-workbench-title .or-dropdown-entry.or-act-clickable.or-filtered').removeClass('dropdown-entry--active').addClass('dropdown-entry--inactive');$('.or-workbench-title .or-dropdown-entry.or-act-clickable.or-filtered .or-link').attr('data-id',id);let url=Openrat.View.createUrl('profile','available',id,{'queryaction':action},!0);let promise=$.getJSON(url);promise.done(function(e){jQuery.each(e.output.views,function(e,t){$('.or-workbench-title .or-dropdown-entry.or-act-clickable.or-filtered > .or-link[data-method=\''+t+'\']').parent().addClass('dropdown-entry--active').removeClass('dropdown-entry--inactive')})})};Openrat.Workbench.afterAllViewsLoaded.add(function(){filterMenus()});Openrat.Workbench.afterViewLoadedHandler.add(function(e){if(Openrat.Workbench.popupWindow)$(e).find('a[data-type=\'popup\']').each(function(){Openrat.Workbench.popupWindow.location.href=$(this).attr('data-url')})});Openrat.Workbench.afterViewLoadedHandler.add(function(e){$(e).find('.or-input--password').dblclick(function(){$(this).toggleAttr('type','text','password')});$(e).find('.or-act-make-visible').click(function(){$(this).toggleClass('btn--is-active');$(this).parent().children('input').toggleAttr('type','text','password')})});Openrat.Workbench.afterViewLoadedHandler.add(function(e){e.find('.or-act-load-nav-tree').each(function(){let type=$(this).data('type')||'root';let loadBranchUrl='./?action=tree&subaction=branch&id=0&type='+type;let $targetElement=$(this);$.get(loadBranchUrl).done(function(e){let $ul=$('<ul class="or-navtree-list" />');$ul.appendTo($targetElement.empty()).append(e);$ul.find('li').orTree({'openAction':function(e,t,n){Openrat.Workbench.openNewAction(e,t,n)}});$ul.find('.or-act-clickable').orLinkify();$ul.find('.or-navtree-node-control').first().click()})})});Openrat.Workbench.afterViewLoadedHandler.add(function(e){var t=$(e).closest('section');t.toggleClass('is-empty',$(e).is(':empty'));if(!$(e).is(':empty'))t.slideDown('fast');else t.slideUp('fast');$(e).find('.or-act-nav-open-close').click(function(){$('.or-workbench').toggleClass('workbench--navigation-is-open');$('.or-workbench-navigation').toggleClass('workbench-navigation--is-open')});$(e).find('.or-act-nav-small').click(function(){$('.or-workbench').addClass('workbench--navigation-is-small');$('.or-workbench-navigation').addClass('workbench-navigation--is-small')});$(e).find('.or-act-nav-wide').click(function(){$('.or-workbench').removeClass('workbench--navigation-is-small');$('.or-workbench-navigation').removeClass('workbench-navigation--is-small')});$(e).find('.or-act-selector-tree-button').click(function(){let $selector=$(this).parent('.or-selector');let $targetElement=$selector.find('.or-act-load-selector-tree');if($selector.hasClass('selector--is-tree-active')){$selector.removeClass('selector--is-tree-active');$targetElement.empty()} +;$(function(){$('html').removeClass('nojs');$('.or--initial-hidden').removeClass('-initial-hidden');function t(){};t();window.onpopstate=function(e){Openrat.Navigator.navigateTo(e.state)};Openrat.Workbench.initialize();Openrat.Workbench.reloadAll();let registerWorkbenchGlobalEvents=function(){$('.keystroke').each(function(){let keystrokeElement=$(this);let keystroke=keystrokeElement.text();if(keystroke.length==0)return;let keyaction=function(){keystrokeElement.click()};$(document).bind('keydown',keystroke,keyaction)})};$('.or-act-initial-notice').each(function(){let notice=new Openrat.Notice();notice.setStatus('info');notice.msg=$(this).text();notice.show();$(this).remove()});registerWorkbenchGlobalEvents();let closeMenu=function(){$('body').click(function(){$('.or-menu').removeClass('menu--is-open')})};closeMenu();let closeMobileNavigation=function(){$('.or-act-navigation-close').click(function(){$('.or-workbench-navigation').removeClass('workbench-navigation--is-open');$('.or-workbench').removeClass('workbench--navigation-is-open')})};closeMobileNavigation();let closeDesktopNavigation=function(){$('.or-workbench-title .or-act-nav-small').click(function(){$('.or-workbench').addClass('workbench--navigation-is-small');$('.or-workbench-navigation').addClass('workbench-navigation--is-small')})};closeDesktopNavigation();let registerGlobalSearch=function(){$('.or-search-input .or-input').orSearch({onSearchActive:function(){$('.or-search').addClass('search--is-active')},onSearchInactive:function(){$('.or-search').removeClass('search--is-active')},dropdown:'.or-act-search-result',resultEntryClass:'or-search-result-entry',select:function(e){Openrat.Workbench.openNewAction(e.name,e.action,e.id)},afterSelect:function(){}});$('.or-search .or-act-search-delete').click(function(){$('.or-search .or-title-input').val('').change()})};registerGlobalSearch();Openrat.Workbench.afterNewActionHandler.add(function(){$('.or-sidebar').find('.or-sidebar-button').orLinkify()});Openrat.Workbench.afterNewActionHandler.add(function(){let url=Openrat.View.createUrl('tree','path',Openrat.Workbench.state.id,{'type':Openrat.Workbench.state.action});let loadPromise=$.get(url);loadPromise.done(function(e){$('.or-breadcrumb').empty().append(e).find('.or-act-clickable').orLinkify();$('nav .or-navtree-node').removeClass('or-navtree-node--selected');$('.or-breadcrumb a').each(function(){let action=$(this).data('action');let id=$(this).data('id');let $navControl=$('nav .or-navtree-node[data-type='+action+'][data-id='+id+'].or-navtree-node--is-closed .or-navtree-node-control');$navControl.click()})}).fail(function(t,n,o){console.warn({message:'Failed to load path',url:url,error:e,status:n,o})}).always(function(){})});Openrat.Workbench.afterNewActionHandler.fire()});let filterMenus=function(){let action=Openrat.Workbench.state.action;let id=Openrat.Workbench.state.id;$('.or-workbench-title .or-dropdown-entry.or-act-clickable').addClass('dropdown-entry--active');$('.or-workbench-title .or-dropdown-entry.or-act-clickable.or-filtered').removeClass('dropdown-entry--active').addClass('dropdown-entry--inactive');$('.or-workbench-title .or-dropdown-entry.or-act-clickable.or-filtered .or-link').attr('data-id',id);let url=Openrat.View.createUrl('profile','available',id,{'queryaction':action},!0);let promise=$.getJSON(url);promise.done(function(e){jQuery.each(e.output.views,function(e,t){$('.or-workbench-title .or-dropdown-entry.or-act-clickable.or-filtered > .or-link[data-method=\''+t+'\']').parent().addClass('dropdown-entry--active').removeClass('dropdown-entry--inactive')})})};Openrat.Workbench.afterAllViewsLoaded.add(function(){filterMenus()});Openrat.Workbench.afterViewLoadedHandler.add(function(e){if(Openrat.Workbench.popupWindow)$(e).find('a[data-type=\'popup\']').each(function(){Openrat.Workbench.popupWindow.location.href=$(this).attr('data-url')})});Openrat.Workbench.afterViewLoadedHandler.add(function(e){$(e).find('.or-input--password').dblclick(function(){$(this).toggleAttr('type','text','password')});$(e).find('.or-act-make-visible').click(function(){$(this).toggleClass('btn--is-active');$(this).parent().children('input').toggleAttr('type','text','password')})});Openrat.Workbench.afterViewLoadedHandler.add(function(e){e.find('.or-act-load-nav-tree').each(function(){let type=$(this).data('type')||'root';let loadBranchUrl='./?action=tree&subaction=branch&id=0&type='+type;let $targetElement=$(this);$.get(loadBranchUrl).done(function(e){let $ul=$('<ul class="or-navtree-list" />');$ul.appendTo($targetElement.empty()).append(e);$ul.find('li').orTree({'openAction':function(e,t,n){Openrat.Workbench.openNewAction(e,t,n)}});$ul.find('.or-act-clickable').orLinkify();$ul.find('.or-navtree-node-control').first().click()})})});Openrat.Workbench.afterViewLoadedHandler.add(function(e){var t=$(e).closest('section');t.toggleClass('is-empty',$(e).is(':empty'));if(!$(e).is(':empty'))t.slideDown('fast');else t.slideUp('fast');$(e).find('.or-act-nav-open-close').click(function(){$('.or-workbench').toggleClass('workbench--navigation-is-open');$('.or-workbench-navigation').toggleClass('workbench-navigation--is-open')});$(e).find('.or-act-nav-small').click(function(){$('.or-workbench').addClass('workbench--navigation-is-small');$('.or-workbench-navigation').addClass('workbench-navigation--is-small')});$(e).find('.or-act-nav-wide').click(function(){$('.or-workbench').removeClass('workbench--navigation-is-small');$('.or-workbench-navigation').removeClass('workbench-navigation--is-small')});$(e).find('.or-act-selector-tree-button').click(function(){let $selector=$(this).parent('.or-selector');let $targetElement=$selector.find('.or-act-load-selector-tree');if($selector.hasClass('selector--is-tree-active')){$selector.removeClass('selector--is-tree-active');$targetElement.empty()} else{$selector.addClass('selector--is-tree-active');var e=this;let id=$(this).data('init-folder-id');let type=id?'folder':'projects';let loadBranchUrl='./?action=tree&subaction=branch&id='+id+'&type='+type;$.get(loadBranchUrl).done(function(e){let $ul=$('<ul class="or-navtree-list" />');$ul.appendTo($targetElement).append(e);$ul.find('li').orTree({'openAction':function(e,t,n){$selector.find('.or-selector-link-value').val(n);$selector.find('.or-selector-link-name').val('').attr('placeholder',e);$selector.removeClass('selector--is-tree-active');$targetElement.empty()}});$ul.find('.or-act-clickable').orLinkify();$ul.find('.or-navtree-node-control').first().click()})}});n(e);$(e).find('.or-input').change(function(){$(this).closest('.or-view').addClass('view--is-dirty')});$(e).find('.or-theme-chooser').change(function(){Openrat.Workbench.setUserStyle(this.value)});function o(e){$(e).find('.or-menu-category').click(function(e){e.stopPropagation();$(this).parents('.or-menu').toggleClass('menu--is-open')});$(e).find('.or-menu-category').mouseover(function(){$(this).parents('.or-menu').find('.or-menu-category').removeClass('menu-category--is-open');$(this).addClass('menu-category--is-open')})};function r(e){$(e).find('.or-act-selector-search').orSearch({onSearchActive:function(){$(this).parent('or-selector').addClass('selector-search--is-active')},onSearchInactive:function(){$(this).parent('or-selector').removeClass('selector-search--is-active')},dropdown:'.or-act-selector-search-results',resultEntryClass:'or-search-result-entry',select:function(t){$(e).find('.or-selector-link-value').val(t.id);$(e).find('.or-selector-link-name').val(t.name).attr('placeholder',t.name)},afterSelect:function(){$('.or-dropdown.or-act-selector-search-results').empty()}})};function a(e){};o(e);r(e);a(e);function n(e){Openrat.Workbench.registerDraggable(e);Openrat.Workbench.registerDroppable(e)};n(e)}); ;Openrat.Workbench.afterViewLoadedHandler.add(function(e){}); ;Openrat.Workbench.afterViewLoadedHandler.add(function(e){$(e).find('textarea').orAutoheight();$(e).find('textarea.or-editor.or-code-editor').each(function(){let mode=$(this).data('mode');let mimetype=$(this).data('mimetype');if(mimetype.length>0)mode=mimetype;let textareaEl=this;let editor=CodeMirror.fromTextArea(textareaEl,{lineNumbers:!0,viewportMargin:Infinity,mode:mode});editor.on('change',function(){let newValue=editor.getValue();$(textareaEl).val(newValue)});$(editor.getWrapperElement()).droppable({accept:'.or-draggable',hoverClass:'or-droppable--hover',activeClass:'or-droppable--active',drop:function(e,t){let dropped=t.draggable;let pos=editor.getCursor();editor.setSelection(pos,pos);let insertText=dropped.data('id');let toInsert=''+insertText;editor.replaceSelection(toInsert)}})});$(e).find('textarea.or-editor.or-markdown-editor').each(function(){let textarea=this;let toolbar=[{name:'bold',action:SimpleMDE.toggleBold,className:'image-icon image-icon--editor-bold',title:'Bold',},{name:'italic',action:SimpleMDE.toggleItalic,className:'image-icon image-icon--editor-italic',title:'Italic',},{name:'heading',action:SimpleMDE.toggleHeadingBigger,className:'image-icon image-icon--editor-headline',title:'Headline',},'|',{name:'quote',action:SimpleMDE.toggleBlockquote,className:'image-icon image-icon--editor-quote',title:'Quote',},{name:'code',action:SimpleMDE.toggleCodeBlock,className:'image-icon image-icon--editor-code',title:'Code',},'|',{name:'generic list',action:SimpleMDE.toggleUnorderedList,className:'image-icon image-icon--editor-unnumberedlist',title:'Unnumbered list',},{name:'numbered list',action:SimpleMDE.toggleOrderedList,className:'image-icon image-icon--editor-numberedlist',title:'Numbered list',},'|',{name:'table',action:SimpleMDE.drawTable,className:'image-icon image-icon--editor-table',title:'Table',},{name:'horizontalrule',action:SimpleMDE.drawHorizontalRule,className:'image-icon image-icon--editor-horizontalrule',title:'Horizontal rule',},'|',{name:'undo',action:SimpleMDE.undo,className:'image-icon image-icon--editor-undo',title:'Undo',},{name:'redo',action:SimpleMDE.redo,className:'image-icon image-icon--editor-redo',title:'Redo',},'|',{name:'link',action:SimpleMDE.drawLink,className:'image-icon image-icon--editor-link',title:'Link',},{name:'image',action:SimpleMDE.drawImage,className:'image-icon image-icon--editor-image',title:'Image',},'|',{name:'guide',action:'https://simplemde.com/markdown-guide',className:'image-icon image-icon--editor-help',title:'Howto markdown',},];let mde=new SimpleMDE({element:$(this)[0],toolbar:toolbar,autoDownloadFontAwesome:!1});let codemirror=mde.codemirror;$(codemirror.getWrapperElement()).droppable({accept:'.or-draggable',hoverClass:'or-droppable--hover',activeClass:'or-droppable--active',drop:function(e,t){let dropped=t.draggable;let insertText='';let id=dropped.data('id');let url='__OID__'+id+'__';if(dropped.data('type')=='image')insertText='![]('+url+')';else insertText='['+id+']('+url+')';let pos=codemirror.getCursor();codemirror.setSelection(pos,pos);codemirror.replaceSelection(insertText)}});codemirror.on('change',function(){let newValue=codemirror.getValue();$(textarea).val(newValue)})});$(e).find('textarea.or-editor.or-html-editor').each(function(){let textarea=this;$.trumbowyg.svgPath='./modules/editor/trumbowyg/ui/icons.svg';$(textarea).trumbowyg();$(textarea).closest('form').find('.trumbowyg-editor').droppable({accept:'.or-draggable',hoverClass:'or-droppable--hover',activeClass:'or-droppable--active',drop:function(e,t){let dropped=t.draggable;let id=dropped.data('id');let url='./?_='+dropped.data('type')+'-'+id+'&subaction=show&embed=1&__OID__'+id+'__='+id;let insertText='';if(dropped.data('type')=='image')insertText='<img src="'+url+'" alt="" />';else insertText='<a href="'+url+'" />'+id+'</a>';$(textarea).trumbowyg('execCmd',{cmd:'insertHTML',param:insertText,forceCss:!1,})}})})}); @@ -1194,4 +1195,4 @@ else{$selector.addClass('selector--is-tree-active');var e=this;let id=$(this).da ;Openrat.Workbench.afterViewLoadedHandler.add(function(a){$(a).find('.or-act-clickable').orLinkify()}); ;Openrat.Workbench.afterViewLoadedHandler.add(function(e){let createQRCode=function(t,e){let wrapper=$('<div class="or-info-popup or-qrcode-value"></div>');$(wrapper).qrcode({render:'div',text:e,fill:'currentColor'});wrapper.attr('title','');if(e)wrapper.append('<small class="or-qrcode-text">'+e+'</small>');return wrapper};$(e).find('.or-qrcode').click(function(){let $element=$(this);if(!$element.children().length){let qrcodeValue=$(e).attr('data-qrcode');let qrcodeText=$(e).attr('data-qrcode-text');if($element.children().length>0)return;$element.append(createQRCode(qrcodeValue,qrcodeText))};$element.toggleClass('info--open');$element.toggleClass('btn--is-active')})}); ;Openrat.Workbench.afterViewLoadedHandler.add(function(t){let calculateOrderList=function(){let order=[];$(t).find('.or-table--sortable').find('tbody > tr.or-data').each(function(){let objectid=$(this).data('id');order.push(objectid)});$(t).find('input[name=order]').val(order.join(','))};calculateOrderList();$(t).find('.or-table--sortable > tbody').sortable({update:calculateOrderList});$(t).find('tr.headline > td > input.checkbox').click(function(){$(this).closest('table').find('tr.or-data > td > input.or-checkbox').attr('checked',Boolean($(this).attr('checked')))});$(t).find('.or-table-filter > input').keyup(function(){let filterExpression=$(this).val().toLowerCase();let table=$(this).parents('.or-table-wrapper').find('table');table.addClass('loader');setTimeout(()=>{table.find('tr:not(.headline)').filter(function(){$(this).toggle($(this).text().toLowerCase().indexOf(filterExpression)>-1)});table.removeClass('loader')},50)});$(t).find('table > tbody > tr.headline > td, table > tbody > tr > th').click(function(){let column=$(this);let table=column.parents('table');table.addClass('loader');let isAscending=!column.hasClass('sort-asc');table.find('tr.headline > td, tr > th').removeClass('sort-asc').removeClass('sort-desc');if(isAscending)column.addClass('sort-asc');else column.addClass('sort-desc');setTimeout(function(){let rows=table.find('tr:gt(0)').toArray().sort(a(column.index()));if(!isAscending){rows=rows.reverse()};for(var t=0;t<rows.length;t++){table.append(rows[t])};table.removeClass('loader')},50)});function a(t){return function(a,r){let valA=e(a,t),valB=e(r,t);return $.isNumeric(valA)&&$.isNumeric(valB)?valA-valB:valA.toString().localeCompare(valB)}};function e(t,e){return $(t).children('td').eq(e).text()}}); -;Openrat.Workbench.afterViewLoadedHandler.add(function(e){var o=$(e).find('form'),r=$(e).find('div.or-dropzone-upload > div.input');r.on('dragenter',function(e){e.stopPropagation();e.preventDefault();$(this).css('border','1px dotted gray')});r.on('dragover',function(e){e.stopPropagation();e.preventDefault()});r.on('drop',function(e){$(this).css('border','1px dotted red');e.preventDefault();var r=e.originalEvent.dataTransfer.files;Openrat.Workbench.handleFileUpload(o,r)});$(e).find('input[type=file]').change(function(){var e=$(this).prop('files');Openrat.Workbench.handleFileUpload(o,e)})});Openrat.Workbench.handleFileUpload=function(e,o){for(let i=0,f;f=o[i];i++){let form_data=new FormData();form_data.append('file',f);form_data.append('action','folder');form_data.append('subaction',$(e).data('method'));form_data.append('output','json');form_data.append('token',$(e).find('input[name=token]').val());form_data.append('id',$(e).find('input[name=id]').val());var r=$('<div class="notice info"><div class="text loader"></div></div>');$('#noticebar').prepend(r);$(r).show();$.ajax({'type':'POST',url:'./api/',cache:!1,contentType:!1,processData:!1,data:form_data,success:function(o,a,n){$(r).remove();let oform=new Openrat.Form();oform.doResponse(o,a,e)},error:function(o,a,n){$(e).closest('div.content').removeClass('loader');$(r).remove();let msg;try{let error=jQuery.parseJSON(o.responseText);msg=error.error+'/'+error.description+': '+error.reason}catch(t){msg=o.responseText};Openrat.Workbench.notify('Upload error',0,msg)}})}}; +;Openrat.Workbench.afterViewLoadedHandler.add(function(e){var t=$(e).find('form'),o=$(e).find('div.or-dropzone-upload > div.input');o.on('dragenter',function(e){e.stopPropagation();e.preventDefault();$(this).css('border','1px dotted gray')});o.on('dragover',function(e){e.stopPropagation();e.preventDefault()});o.on('drop',function(e){$(this).css('border','1px dotted red');e.preventDefault();var o=e.originalEvent.dataTransfer.files;Openrat.Workbench.handleFileUpload(t,o)});$(e).find('input[type=file]').change(function(){var e=$(this).prop('files');Openrat.Workbench.handleFileUpload(t,e)})});Openrat.Workbench.handleFileUpload=function(e,o){for(let i=0,f;f=o[i];i++){let form_data=new FormData();form_data.append('file',f);form_data.append('action','folder');form_data.append('subaction',$(e).data('method'));form_data.append('output','json');form_data.append('token',$(e).find('input[name=token]').val());form_data.append('id',$(e).find('input[name=id]').val());let notice=new Openrat.Notice();notice.setContext('folder',0,'');notice.inProgress();notice.show();$.ajax({'type':'POST',url:'./api/',cache:!1,contentType:!1,processData:!1,data:form_data,success:function(o,t,r){notice.close();let oform=new Openrat.Form();oform.doResponse(o,t,e)},error:function(o,t,r){$(e).closest('div.content').removeClass('loader');notice.close();let msg;console.error(o);try{let error=jQuery.parseJSON(o.responseText);msg=error.error+'/'+error.description+': '+error.reason}catch(n){msg=o.responseText};let notice=new Openrat.Notice();notice.setStatus('error');notice.msg='Upload error: '+msg;notice.show()}})}}; diff --git a/modules/cms/ui/themes/default/script/openrat/common.js b/modules/cms/ui/themes/default/script/openrat/common.js @@ -47,7 +47,12 @@ $( function() { // Initial Notices $('.or-act-initial-notice').each( function() { - Openrat.Workbench.notify('', 0, '', 'info', $(this).text()); + + let notice = new Openrat.Notice(); + notice.setStatus('info'); + notice.msg = $(this).text(); + notice.show(); + $(this).remove(); }); diff --git a/modules/cms/ui/themes/default/script/openrat/form.js b/modules/cms/ui/themes/default/script/openrat/form.js @@ -72,6 +72,8 @@ Openrat.Form = function() { this.cancel = function() { //$(this.element).html('').parent().removeClass('is-open'); + Openrat.Notice.removeAllNotices(); + this.close(); } @@ -88,17 +90,20 @@ Openrat.Form = function() { this.submit = function( mode ) { - if ( mode === undefined ) + if ( mode === undefined ) if ( $(this.element).data('async') ) mode = modes.closeAfterSubmit; else mode = modes.closeAfterSuccess; + Openrat.Notice.removeAllNotices(); // Show progress - let status = $('<div class="or-notice or-notice--info"><div class="or-text or-loader"></div></div>'); - $('.or-notices').prepend(status); // Notice anhängen. - $(status).show(); + let status = new Openrat.Notice(); + status.setStatus('info'); + status.inProgress(); + status.msg = Openrat.Workbench.language.PROGRESS; + status.show(); // Alle vorhandenen Error-Marker entfernen. // Falls wieder ein Fehler auftritt, werden diese erneut gesetzt. @@ -146,7 +151,7 @@ Openrat.Form = function() { $.ajax( { 'type':'POST',url:url, data:data, success:function(responseData, textStatus, jqXHR) { form.setLoadStatus(false); - $(status).remove(); + status.close(); form.doResponse(responseData,textStatus,form.element, function() { @@ -193,24 +198,30 @@ Openrat.Form = function() { }, error:function(jqXHR, textStatus, errorThrown) { - console.warn( { form:form, status: textStatus, error: errorThrown } ); + console.warn( { + message:'could not post form', + jqXHR:jqXHR, + form:form, + status: textStatus, + error: errorThrown + } ); form.setLoadStatus(false); - $(status).remove(); + status.close(); - try - { - let error = jQuery.parseJSON( jqXHR.responseText ); - Openrat.Workbench.notify('', 0, '', 'error', error.error, [error.description]); + let msg = ''; + try { + msg = jQuery.parseJSON( jqXHR.responseText ).error; } - catch( e ) - { - let msg = jqXHR.responseText; - Openrat.Workbench.notify('', 0, '', 'error', 'Server Error', [msg]); + catch( e ) { + msg = jqXHR.responseText; } - - } + let notice = new Openrat.Notice(); + notice.setStatus('error'); + notice.msg = msg; + notice.show(); + } } ); $(form.element).fadeIn(); @@ -231,8 +242,14 @@ Openrat.Form = function() { { if ( status != 'success' ) { - alert('Server error: ' + status); - return; + console.error('Server error: ' + status); + + let notice = new Openrat.Notice(); + notice.setStatus( 'error' ); + notice.msg = Openrat.Workbench.language.ERROR; + notice.show(); + + return; } let form = this; @@ -244,7 +261,16 @@ Openrat.Form = function() { // gewechselt hat. let notifyBrowser = $(element).data('async'); - Openrat.Workbench.notify(value.type, value.id, value.name, value.status, value.text, value.log, notifyBrowser); // Notice anhängen. + let notice = new Openrat.Notice(); + notice.setContext( value.type, value.id, value.name ); + notice.log = value.log; + notice.setStatus( value.status ); + notice.msg = value.text; + notice.show(); + + if ( notifyBrowser ) + notice.notifyBrowser() + if ( value.status == 'ok' ) // Kein Fehler? { diff --git a/modules/cms/ui/themes/default/script/openrat/notice.js b/modules/cms/ui/themes/default/script/openrat/notice.js @@ -0,0 +1,196 @@ + +/** + * Notice. + */ +Openrat.Notice = function() { + + 'use strict'; + + this.typ = ''; + this.id = 0; + this.name = ''; + this.status = 'inactive'; + this.msg = ''; + this.log = ''; + + let element = $('<div class="or-notice or-notice--is-inactive"></div>'); + + + const type = Object.freeze({ + warning: 0, + validation: 1, + info: 2, + success: 3, + error: 3, + loading: 3, + inactive: 4 + }); + + + this.before = function () { + }; + + + // Close the notice. + this.close = function() { + element.fadeOut('fast', function () { + element.remove(); + } ); + } + + + this.setStatus = function( status ) { + + element.removeClass('notice--' + this.status ); + this.status = status; + element.addClass('notice--' + this.status ); + } + + + this.inProgress = function() { + element.addClass('loader'); + } + + this.stopProgress = function() { + element.removeClass('loader'); + } + + this.show = function() { + + console.debug('user notice: '+this.msg); + let notice = this; + element.removeClass('notice--is-inactive'); + + element.appendTo('.or-notices'); // Notice anhängen. + + let toolbar = $('<div class="or-notice-toolbar"></div>'); + toolbar.appendTo(element); + toolbar.append('<i class="or-image-icon or-image-icon--menu-close or-act-notice-close"></i>'); + + if (this.log) + toolbar.append('<i class="or-act-notice-full or-image-icon or-image-icon--menu-fullscreen"></i>'); + + if (this.name) + element.append('<div class="or-notice-name"><a class="or-act-clickable" href="' + Openrat.Navigator.createShortUrl(this.typ, this.id) + '" data-type="open" data-action="' + this.typ + '" data-id="' + this.id + '"><i class="or-notice-action-full or-image-icon or-image-icon--action-' + this.typ + '"></i> ' + this.name + '</a></div>'); + + element.append('<div class="or-notice-text">' + htmlEntities(this.msg) + '</div>'); + + if (this.log) + element.append('<div class="or-notice-log"><pre>' + htmlEntities(this.log) + '</pre></div>'); + + element.orLinkify(); // Enable links + + + // Toogle Fullscreen for notice + element.find('.or-act-notice-full').click(function () { + element.toggleClass('notice--is-full'); + }); + + // Close the notice on click + element.find('.or-act-notice-close').click(function () { + notice.close(); + }); + + // Fadeout the notice after a while. + let timeout = 1; + if (this.status == 'ok') timeout = 3; + if (this.status == 'info') timeout = 30; + if (this.status == 'warning') timeout = 40; + if (this.status == 'error') timeout = 50; + + if (timeout > 0) + setTimeout(function () { + element.fadeOut('slow', function () { + element.remove(); + }); + }, timeout * 1000); + } + + this.setContext = function(type,id,name) { + this.typ = type; + this.id = id; + this.name = name; + } + + + /** + * Show a notice bubble in the UI. + * @param type + * @param id + * @param name + * @param status + * @param msg + * @param log + * @param notifyTheBrowser + */ + this.start = function (type, id, name, status, msg, log = null, notifyTheBrowser = false) { + // Notice-Bar mit dieser Meldung erweitern. + + this.setContext(type,id,name); + this.msg = msg; + this.log = log; + + if (notifyTheBrowser) + this.notifyBrowser(msg); // Notify browser if wanted. + + this.setStatus(status); + + } + + + + /** + * Show a notification in the browser. + * Source: https://developer.mozilla.org/en-US/docs/Web/API/notification + * @param text text of message + */ + this.notifyBrowser = function(text) + { + // Let's check if the browser supports notifications + if (!("Notification" in window)) { + return; + } + + // Let's check if the user is okay to get some notification + else if (Notification.permission === "granted") { + // If it's okay let's create a notification + let notification = new Notification(text); + } + + // Otherwise, we need to ask the user for permission + else if (Notification.permission !== 'denied') { + Notification.requestPermission(function (permission) { + // If the user is okay, let's create a notification + if (permission === "granted") { + let notification = new Notification(text); + } + }); + } + + // At last, if the user already denied any notification, and you + // want to be respectful there is no need to bother them any more. + } + + + + /** + * Escape HTML entities. + * + * @param str + * @returns {string} + */ + let htmlEntities = function( str ) { + return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;'); + } + +} + + +Openrat.Notice.removeNoticesWithStatus = function( status) { + $('.or-notices').find('.or-notice--'+status).remove(); +} + +Openrat.Notice.removeAllNotices = function( status) { + + $('.or-notices').find('.or-notice').remove(); +} diff --git a/modules/cms/ui/themes/default/script/openrat/view.js b/modules/cms/ui/themes/default/script/openrat/view.js @@ -22,6 +22,7 @@ Openrat.View = function( action,method,id,params ) { * @returns {Promise} */ this.start = function( element ) { + this.before(); this.element = element; return this.loadView(); @@ -32,6 +33,7 @@ Openrat.View = function( action,method,id,params ) { } this.close = function() { + } @@ -91,7 +93,10 @@ Openrat.View = function( action,method,id,params ) { console.error( {view:view, url:url, status:status, cause: cause} ); - Openrat.Workbench.notify('', 0, '', 'error', 'Server Error'); + let notice = new Openrat.Notice(); + notice.setStatus('error'); + notice.msg = Openrat.Workbench.language.ERROR; + notice.show(); }); // Load the data for this view. diff --git a/modules/cms/ui/themes/default/script/openrat/workbench.js b/modules/cms/ui/themes/default/script/openrat/workbench.js @@ -300,103 +300,6 @@ Openrat.Workbench = new function() - - /** - * Show a notification in the browser. - * Source: https://developer.mozilla.org/en-US/docs/Web/API/notification - * @param text text of message - */ - let notifyBrowser = function(text) - { - // Let's check if the browser supports notifications - if (!("Notification" in window)) { - return; - } - - // Let's check if the user is okay to get some notification - else if (Notification.permission === "granted") { - // If it's okay let's create a notification - let notification = new Notification(text); - } - - // Otherwise, we need to ask the user for permission - else if (Notification.permission !== 'denied') { - Notification.requestPermission(function (permission) { - // If the user is okay, let's create a notification - if (permission === "granted") { - let notification = new Notification(text); - } - }); - } - - // At last, if the user already denied any notification, and you - // want to be respectful there is no need to bother them any more. - } - - - - /** - * Show a notice bubble in the UI. - * @param type - * @param id - * @param name - * @param status - * @param msg - * @param log - * @param notifyTheBrowser - */ - this.notify = function (type, id, name, status, msg, log = null, notifyTheBrowser = false) - { - // Notice-Bar mit dieser Meldung erweitern. - - if ( notifyTheBrowser ) - notifyBrowser( msg ); // Notify browser if wanted. - - let notice = $('<div class="or-notice or-notice--'+status+'"></div>'); - - let toolbar = $('<div class="or-notice-toolbar"></div>'); - if ( log ) - $(toolbar).append('<i class="or-act-notice-full or-image-icon or-image-icon--menu-fullscreen"></i>'); - $(toolbar).append('<i class="or-image-icon or-image-icon--menu-close or-act-notice-close"></i>'); - $(notice).append(toolbar); - - if (name) - $(notice).append('<div class="or-notice-name"><a class="or-act-clickable" href="'+Openrat.Navigator.createShortUrl(type,id)+'" data-type="open" data-action="'+type+'" data-id="'+id+'"><i class="or-notice-action-full or-image-icon or-image-icon--action-'+type+'"></i> '+name+'</a></div>'); - - $(notice).append( '<div class="or-notice-text">'+htmlEntities(msg)+'</div>'); - - if (log) - $(notice).append('<div class="or-notice-log"><pre>'+htmlEntities(log)+'</pre></div>'); - - $('#noticebar').prepend(notice); // Notice anhängen. - $(notice).orLinkify(); // Enable links - - - // Toogle Fullscreen for notice - $(notice).find('.or-act-notice-full').click( function() { - $(notice).toggleClass('notice--is-full'); - }); - - // Close the notice on click - $(notice).find('.or-act-notice-close').click( function() { - $(notice).fadeOut('fast',function() { $(notice).remove(); } ); - }); - - // Fadeout the notice after a while. - let timeout = 1; - if ( status == 'ok' ) timeout = 3; - if ( status == 'info' ) timeout = 10; - if ( status == 'warning') timeout = 15; - if ( status == 'error' ) timeout = 20; - - if (timeout > 0) - setTimeout( function() { - $(notice).fadeOut('slow', function() { $(this).remove(); } ); - },timeout*1000 ); - } - - - this.dataChangedHandler = $.Callbacks(); this.dataChangedHandler.add( function() { @@ -420,15 +323,6 @@ Openrat.Workbench = new function() } - /** - * Escape HTML entities. - * - * @param str - * @returns {string} - */ - var htmlEntities = function( str ) { - return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;'); - } /** @@ -484,6 +378,9 @@ Openrat.Workbench = new function() let view = new Openrat.View( action,method,id,params ); view.before = function() { + + Openrat.Notice.removeAllNotices(); + $('.or-dialog-content .or-view').html('<div class="header"><img class="or-icon" title="" src="./themes/default/images/icon/'+method+'.png" />'+name+'</div>'); $('.or-dialog-content .or-view').data('id',id); $('.or-dialog').removeClass('dialog--is-closed').addClass('dialog--is-open'); diff --git a/modules/cms/ui/themes/default/script/plugin/jquery-plugin-orTree.js b/modules/cms/ui/themes/default/script/plugin/jquery-plugin-orTree.js @@ -82,8 +82,9 @@ jQuery.fn.orTree = function (options) }).fail(function ( jqXHR, textStatus, errorThrown ) { // Ups... aber was können wir hier schon tun, außer hässliche Meldungen anzeigen. - console.error( {url:loadBranchUrl,jqXHR:jqXHR,status:textStatus,error:errorThrown}); - Openrat.Workbench.notify('', 0, '', 'ERROR', 'Failed to load subtree', [], false); + console.error( {message:'Failed to load subtree',url:loadBranchUrl,jqXHR:jqXHR,status:textStatus,error:errorThrown}); + let notice = new Openrat.Notice(); + notice.setStatus( 'error' ); }).always(function () { // Die Loader-Animation entfernen. diff --git a/modules/language/Language_CN.class.php b/modules/language/Language_CN.class.php @@ -1352,5 +1352,6 @@ Thank you.', 'FOLDER_NOT_WRITABLE'=>'Directory not writable', 'GROUP_PARENT'=>'Parent group', 'UNSAVED_CHANGES_CONFIRM'=>'There are unsaved changes. Do you really want to exit?', +'PROGRESS'=>'Work in progress', ];} } \ No newline at end of file diff --git a/modules/language/Language_DE.class.php b/modules/language/Language_DE.class.php @@ -1357,5 +1357,6 @@ Vielen Dank.', 'FOLDER_NOT_WRITABLE'=>'Keine Schreibrechte im Verzeichnis', 'GROUP_PARENT'=>'Übergeordnete Gruppe', 'UNSAVED_CHANGES_CONFIRM'=>'Sie haben ungespeicherte Änderungen. Möchten Sie diese Ansicht tatsächlich verlassen?', +'PROGRESS'=>'Vorgang wird ausgeführt', ];} } \ No newline at end of file diff --git a/modules/language/Language_EN.class.php b/modules/language/Language_EN.class.php @@ -1352,5 +1352,6 @@ Thank you.', 'FOLDER_NOT_WRITABLE'=>'Directory not writable', 'GROUP_PARENT'=>'Parent group', 'UNSAVED_CHANGES_CONFIRM'=>'There are unsaved changes. Do you really want to exit?', +'PROGRESS'=>'Work in progress', ];} } \ No newline at end of file diff --git a/modules/language/Language_ES.class.php b/modules/language/Language_ES.class.php @@ -1377,5 +1377,6 @@ MENU_INDEX_ADMINISTRATION_DESC =', 'FOLDER_NOT_WRITABLE'=>'Directory not writable', 'GROUP_PARENT'=>'Parent group', 'UNSAVED_CHANGES_CONFIRM'=>'There are unsaved changes. Do you really want to exit?', +'PROGRESS'=>'Work in progress', ];} } \ No newline at end of file diff --git a/modules/language/Language_FR.class.php b/modules/language/Language_FR.class.php @@ -1353,5 +1353,6 @@ Merci.', 'FOLDER_NOT_WRITABLE'=>'Directory not writable', 'GROUP_PARENT'=>'Parent group', 'UNSAVED_CHANGES_CONFIRM'=>'There are unsaved changes. Do you really want to exit?', +'PROGRESS'=>'Work in progress', ];} } \ No newline at end of file diff --git a/modules/language/Language_IT.class.php b/modules/language/Language_IT.class.php @@ -1353,5 +1353,6 @@ Gracias.', 'FOLDER_NOT_WRITABLE'=>'Directory not writable', 'GROUP_PARENT'=>'Parent group', 'UNSAVED_CHANGES_CONFIRM'=>'There are unsaved changes. Do you really want to exit?', +'PROGRESS'=>'Work in progress', ];} } \ No newline at end of file diff --git a/modules/language/Language_RU.class.php b/modules/language/Language_RU.class.php @@ -1353,5 +1353,6 @@ if you do not know where this mail comes from, please ignore it.', 'FOLDER_NOT_WRITABLE'=>'Directory not writable', 'GROUP_PARENT'=>'Parent group', 'UNSAVED_CHANGES_CONFIRM'=>'There are unsaved changes. Do you really want to exit?', +'PROGRESS'=>'Work in progress', ];} } \ No newline at end of file diff --git a/modules/language/Messages.class.php b/modules/language/Messages.class.php @@ -1306,4 +1306,5 @@ class Messages { const FOLDER_NOT_WRITABLE = 'FOLDER_NOT_WRITABLE'; const GROUP_PARENT = 'GROUP_PARENT'; const UNSAVED_CHANGES_CONFIRM = 'UNSAVED_CHANGES_CONFIRM'; + const PROGRESS = 'PROGRESS'; } \ No newline at end of file diff --git a/modules/language/language.yml b/modules/language/language.yml @@ -6494,4 +6494,7 @@ GROUP_PARENT: en: Parent group UNSAVED_CHANGES_CONFIRM: en: There are unsaved changes. Do you really want to exit? - de: Sie haben ungespeicherte Änderungen. Möchten Sie diese Ansicht tatsächlich verlassen?- \ No newline at end of file + de: Sie haben ungespeicherte Änderungen. Möchten Sie diese Ansicht tatsächlich verlassen? +PROGRESS: + en: Work in progress + de: Vorgang wird ausgeführt+ \ No newline at end of file diff --git a/modules/template_engine/components/html/component_selector/SelectorComponent.class.php b/modules/template_engine/components/html/component_selector/SelectorComponent.class.php @@ -30,7 +30,7 @@ class SelectorComponent extends Component return (new HtmlElement('div'))->addStyleClass(['selector','droppable-selector'])->addChild( (new HtmlElement('input'))->addAttribute('type','hidden')->addStyleClass('selector-link-value')->addAttribute('name',$this->param)->addAttribute('value',Value::createExpression(ValueExpression::TYPE_DATA_VAR,$this->param)) )->addChild( - (new HtmlElement('input'))->addAttribute('type','text')->addStyleClass(['selector-link-name','act-selector-search'])->addAttribute('name',$this->param.'_text')->addAttribute('placeholder',$this->name)->addAttribute('value',$this->name) + (new HtmlElement('input'))->addAttribute('type','text')->addStyleClass(['input','selector-link-name','act-selector-search'])->addAttribute('name',$this->param.'_text')->addAttribute('placeholder',$this->name)->addAttribute('value',$this->name) )->addChild( (new HtmlElement('i'))->addStyleClass( ['image-icon','image-icon--menu-tree','act-selector-tree-button' ]) )->addChild( diff --git a/modules/template_engine/components/html/component_upload/upload.js b/modules/template_engine/components/html/component_upload/upload.js @@ -55,21 +55,23 @@ Openrat.Workbench.handleFileUpload = function(form,files) form_data.append('token' ,$(form).find('input[name=token]').val() ); form_data.append('id' ,$(form).find('input[name=id]' ).val() ); - var status = $('<div class="notice info"><div class="text loader"></div></div>'); - $('#noticebar').prepend(status); // Notice anhängen. - $(status).show(); + let notice = new Openrat.Notice(); + notice.setContext('folder',0,'' ); + notice.inProgress(); + notice.show(); $.ajax( { 'type':'POST',url:'./api/', cache:false,contentType: false, processData: false, data:form_data, success:function(data, textStatus, jqXHR) { - $(status).remove(); + notice.close(); let oform = new Openrat.Form(); oform.doResponse(data,textStatus,form); }, error:function(jqXHR, textStatus, errorThrown) { $(form).closest('div.content').removeClass('loader'); - $(status).remove(); + notice.close(); let msg; + console.error(jqXHR); try { let error = jQuery.parseJSON( jqXHR.responseText ); @@ -79,8 +81,11 @@ Openrat.Workbench.handleFileUpload = function(form,files) { msg = jqXHR.responseText; } - - Openrat.Workbench.notify('Upload error', 0, msg); + + let notice = new Openrat.Notice(); + notice.setStatus('error'); + notice.msg = 'Upload error: ' + msg; + notice.show(); } } );