openrat-cms

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

commit 014ef9b82a26d877fd097e103373bc6931d49181
parent 7c7b4071d0a5154d7da72b827ed4b16d72f45ef7
Author: Jan Dankert <develop@jandankert.de>
Date:   Wed, 17 Mar 2021 00:57:14 +0100

Replaced all Jquery ajax methods by the native fetch api.

Diffstat:
Mmodules/cms/ui/themes/default/script/openrat.js | 302+++++++++++++++++++++++++++++++++++++------------------------------------------
Mmodules/cms/ui/themes/default/script/openrat.min.js | 13++++++-------
Mmodules/cms/ui/themes/default/script/openrat/form.js | 170+++++++++++++++++++++++++++++++++++--------------------------------------------
Mmodules/cms/ui/themes/default/script/openrat/view.js | 20++++++++++----------
Mmodules/cms/ui/themes/default/script/plugin/jquery-plugin-orSearch.js | 83+++++++++++++++++++++++++++++++++++++++++++------------------------------------
Mmodules/template_engine/components/html/component_upload/upload.js | 37+++++++++++++++----------------------
6 files changed, 292 insertions(+), 333 deletions(-)

diff --git a/modules/cms/ui/themes/default/script/openrat.js b/modules/cms/ui/themes/default/script/openrat.js @@ -157,51 +157,58 @@ jQuery.fn.orSearch = function( options ) $('.or-search').addClass('search--is-active'); dropdownEl.addClass('search-result--is-active'); - $.ajax( { 'type':'GET',url:'./api/?action='+settings.action+'&subaction='+settings.method+'&output=json&search='+searchArgument, data:null, success:function(data, textStatus, jqXHR) - { - $(dropdownEl).empty(); // Leeren. + let url = './api/?action='+settings.action+'&subaction='+settings.method+'&output=json&search='+searchArgument; + let load = fetch( url, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + } } ); + load.then( response => { + if ( ! response.ok ) + throw "Search request getting an error"; + return response.json(); + } + ).then( data => { + $(dropdownEl).empty(); // Leeren. - for( id in data.output.result ) - { - let result = data.output.result[id]; - - // Suchergebnis-Zeile in das Ergebnis schreiben. - - let div = $('<div class="'+settings.resultEntryClass+' '+settings.resultEntryClass+'--active" title="'+result.desc+'"></div>'); - div.data('object',{ - 'name':result.name, - 'action':result.type, - 'id':result.id - } ); - let link = $('<a class="or-link"/>').attr('href',WorkbenchNavigator.createShortUrl(result.type, result.id)); - link.click( function(e) { - e.preventDefault(); - }); - $(link).append('<i class="or-image-icon or-image-icon--action-'+result.type+'" />'); - $(link).append('<span class="or-dropdown-text">'+result.name+'</span>'); - - $(div).append(link); - $(dropdownEl).append(div); - } + for (id in data.output.result) { + let result = data.output.result[id]; - if ( data.output.result && settings.openDropdown ) { - // Open the menu - //$(dropdownEl).closest('.or-menu').addClass('menu--is-open'); - $(dropdownEl).addClass('dropdown--is-open'); - }else { - $(dropdownEl).removeClass('dropdown--is-open'); - } + // Suchergebnis-Zeile in das Ergebnis schreiben. - // Register clickhandler for search results. - $(dropdownEl).find('.or-search-result-entry').click( function(e) { - settings.select( $(this).data('object') ); - settings.afterSelect(); - searchInput.val(''); - } ); + let div = $('<div class="' + settings.resultEntryClass + ' ' + settings.resultEntryClass + '--active" title="' + result.desc + '"></div>'); + div.data('object', { + 'name': result.name, + 'action': result.type, + 'id': result.id + }); + let link = $('<a class="or-link"/>').attr('href', WorkbenchNavigator.createShortUrl(result.type, result.id)); + link.click(function (e) { + e.preventDefault(); + }); + $(link).append('<i class="or-image-icon or-image-icon--action-' + result.type + '" />'); + $(link).append('<span class="or-dropdown-text">' + result.name + '</span>'); - } } ); + $(div).append(link); + $(dropdownEl).append(div); + } + + if (data.output.result && settings.openDropdown) { + // Open the menu + //$(dropdownEl).closest('.or-menu').addClass('menu--is-open'); + $(dropdownEl).addClass('dropdown--is-open'); + } else { + $(dropdownEl).removeClass('dropdown--is-open'); + } - + // Register clickhandler for search results. + $(dropdownEl).find('.or-search-result-entry').click(function (e) { + settings.select($(this).data('object')); + settings.afterSelect(); + searchInput.val(''); + }); + + } ); } else { @@ -2112,12 +2119,16 @@ class View { let element = this.element; let view = this; - let loadViewHtmlPromise = $.ajax( url ); + let loadViewHtmlPromise = fetch( url,{} ); $(this.element).addClass('loader'); console.debug( view); - loadViewHtmlPromise.done( function(data,status){ + loadViewHtmlPromise.then( response => { + if ( ! response.ok ) + throw "failed to load the view"; + return response.text(); + } ).then( data => { if ( ! data ) data = ''; @@ -2144,26 +2155,22 @@ class View { }); view.fireViewLoadedEvents( element ); - } ); - - loadViewHtmlPromise.fail( function(jqxhr,status,cause) { + } ).catch( cause => { $(element).html(""); - console.error( {view:view, url:url, status:status, cause: cause} ); + console.error( {view:view, url:url, cause: cause} ); let notice = new Notice(); notice.setStatus('error'); notice.msg = Workbench.language.ERROR; + notice.log = cause; notice.show(); }); - loadViewHtmlPromise.always( function() { + loadViewHtmlPromise.finally( () => { $(element).removeClass("loader"); }); - // Load the data for this view. - let apiUrl = View.createUrl( this.action,this.method,this.id,this.params,true); - return loadViewHtmlPromise; } @@ -2378,82 +2385,79 @@ class Form { let form = this; console.debug( form ); - $.ajax( { 'type':'POST',url:url, data:Form.formDataToObject(formData), success:function(responseData, textStatus, jqXHR) - { - form.setLoadStatus(false); - status.close(); + let load = fetch( url, { 'method':'POST', body:formData } ); - form.doResponse(responseData,textStatus,form.element, function() { + load.then( response => { + if ( ! response.ok ) + throw "Failed to post"; - form.onSaveHandler.fire(); + return response.json(); + }).then( data => { + form.setLoadStatus(false); + status.close(); - let afterSuccess = $(form.element).data('afterSuccess'); - let forwardTo = $(form.element).data('forwardTo' ); - let async = $(form.element).data('async' ); + form.doResponse(data, "", form.element, () => { - if ( afterSuccess == 'forward' ) - mode = Form.modes.keepOpen; + form.onSaveHandler.fire(); - // The data was successful saved. - // Now we can close the form. - if ( mode == Form.modes.closeAfterSuccess ) - { - form.onCloseHandler.fire(); + let afterSuccess = $(form.element).data('afterSuccess'); + let forwardTo = $(form.element).data('forwardTo'); + let async = $(form.element).data('async'); - // clear the dirty flag. - $(form.element).closest('div.panel').find('div.header ul.views li.action.active').removeClass('dirty'); - } + if (afterSuccess == 'forward') + mode = Form.modes.keepOpen; + + // The data was successful saved. + // Now we can close the form. + if (mode == Form.modes.closeAfterSuccess) { + form.onCloseHandler.fire(); - if ( afterSuccess ) - { - if ( afterSuccess == 'reloadAll' ) - { - Workbench.reloadAll(); - } - else if ( afterSuccess == 'forward' ) - { - // Forwarding to next subaction. - if ( forwardTo ) - form.forwardTo( formData.get('action'), forwardTo, formData.get('id'),[] ); - } - } else { - if ( async ) - ; // do not reload - else - Openrat.workbench.reloadViews(); + // clear the dirty flag. + $(form.element).closest('div.panel').find('div.header ul.views li.action.active').removeClass('dirty'); + } + + if (afterSuccess) { + if (afterSuccess == 'reloadAll') { + Workbench.reloadAll(); + } else if (afterSuccess == 'forward') { + // Forwarding to next subaction. + if (forwardTo) + form.forwardTo(formData.get('action'), forwardTo, formData.get('id'), []); } + } else { + if (async) + ; // do not reload + else + Openrat.workbench.reloadViews(); + } - }); - }, - error:function(jqXHR, textStatus, errorThrown) { - - console.warn( { - message:'could not post form', - jqXHR:jqXHR, - form:form, - status: textStatus, - error: errorThrown - } ); + }) + } ).catch( cause => { - form.setLoadStatus(false); - status.close(); + console.warn( { + message:'could not post form', + cause: cause, + form:form, + } ); - let msg = ''; - try { - msg = $.parseJSON( jqXHR.responseText ).message; - } - catch( e ) { - msg = jqXHR.statusText; - } + form.setLoadStatus(false); + status.close(); - let notice = new Notice(); - notice.setStatus('error'); - notice.msg = msg; - notice.log = JSON.stringify( $.parseJSON(jqXHR.responseText),null,2); - notice.show(); + let msg = ''; + try { + msg = $.parseJSON( cause ).message; + } + catch( e ) { + msg = cause; } + let notice = new Notice(); + notice.setStatus('error'); + notice.msg = msg; + notice.log = cause; //JSON.stringify( $.parseJSON(jqXHR.responseText),null,2); + notice.show(); } ); + $(form.element).fadeIn(); } @@ -2470,21 +2474,9 @@ class Form { */ doResponse = function(data,status,element, onSuccess = $.noop ) { - if ( status != 'success' ) - { - console.error('Server error: ' + status); - - let notice = new Notice(); - notice.setStatus( 'error' ); - notice.msg = Workbench.language.ERROR; - notice.show(); - - return; - } - let form = this; // Hinweismeldungen in Statuszeile anzeigen - $.each(data['notices'], function(idx,value) { + for( let value of data['notices'] ) { // Bei asynchronen Requests wird zusätzlich eine Browser-Notice erzeugt, da der // Benutzer bei länger laufenden Aktionen vielleicht das Tab oder Fenster @@ -2500,23 +2492,18 @@ class Form { if ( notifyBrowser ) notice.notifyBrowser() + }; + if ( data.success ) { // Kein Fehler? + onSuccess(); + Workbench.dataChangedHandler.fire(); + } + else + ; // Server liefert Fehler zurück. - if ( value.status == 'ok' ) // Kein Fehler? - { - onSuccess(); - Workbench.dataChangedHandler.fire(); - } - else - // Server liefert Fehler zurück. - { - } - }); - - // Validation error should mark the input field. - $.each(data['errors'], function(idx,value) { - $('.or-input[name='+value+']').addClass('input--error').parent().addClass('input--error').parents('.or-group').removeClass('closed').addClass('show').addClass('open'); - }); + // Validation error should mark the input field. + for( name of data['errors'] ) + $('.or-input[name='+name+']').addClass('input--error').parent().addClass('input--error').parents('.or-group').removeClass('closed').addClass('show').addClass('open'); // Jetzt das erhaltene Dokument auswerten. } @@ -3979,39 +3966,32 @@ Workbench.handleFileUpload = function(form,files) form_data.append('id' ,$(form).find('input[name=id]' ).val() ); let notice = new 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) - { + let url ='./api/'; + let load = fetch( url, { + method: 'POST' + } ); + + load.then( response => { + return response.json(); + }).then( data => { + notice.close(); let oform = new Form(); - oform.doResponse(data,textStatus,form); - }, - error:function(jqXHR, textStatus, errorThrown) { - $(form).closest('div.content').removeClass('loader'); + oform.doResponse(data,"",form); + } ).catch( error => { + notice.close(); - let msg; - console.error(jqXHR); - try - { - let error = jQuery.parseJSON( jqXHR.responseText ); - msg = error.error + '/' + error.description + ': ' + error.reason; - } - catch( e ) - { - msg = jqXHR.responseText; - } - + console.error(error); let notice = new Notice(); notice.setStatus('error'); - notice.msg = 'Upload error: ' + msg; + notice.msg = 'Upload error: ' + error; notice.show(); } - - } ); + ); } } diff --git a/modules/cms/ui/themes/default/script/openrat.min.js b/modules/cms/ui/themes/default/script/openrat.min.js @@ -114,8 +114,8 @@ else{c=10000;n=null;h=r.floating||this._isFloating(this.currentItem);p=h?"left": else{return{top:0,left:0}}},_cacheMargins:function(){this.margins={left:(parseInt(this.currentItem.css("marginLeft"),10)||0),top:(parseInt(this.currentItem.css("marginTop"),10)||0)}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,s,o,i=this.options;if(i.containment==="parent"){i.containment=this.helper[0].parentNode};if(i.containment==="document"||i.containment==="window"){this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,i.containment==="document"?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,(i.containment==="document"?(this.document.height()||document.body.parentNode.scrollHeight):this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]};if(!(/^(document|window|parent)$/).test(i.containment)){e=t(i.containment)[0];s=t(i.containment).offset();o=(t(e).css("overflow")!=="hidden");this.containment=[s.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,s.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,s.left+(o?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,s.top+(o?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(e,i){if(!i){i=this.position};var s=e==="absolute"?1:-1,o=this.cssPosition==="absolute"&&!(this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,n=(/(html|body)/i).test(o[0].tagName);return{top:(i.top+this.offset.relative.top*s+this.offset.parent.top*s-((this.cssPosition==="fixed"?-this.scrollParent.scrollTop():(n?0:o.scrollTop()))*s)),left:(i.left+this.offset.relative.left*s+this.offset.parent.left*s-((this.cssPosition==="fixed"?-this.scrollParent.scrollLeft():n?0:o.scrollLeft())*s))}},_generatePosition:function(e){var s,o,i=this.options,n=e.pageX,r=e.pageY,a=this.cssPosition==="absolute"&&!(this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,h=(/(html|body)/i).test(a[0].tagName);if(this.cssPosition==="relative"&&!(this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0])){this.offset.relative=this._getRelativeOffset()};if(this.originalPosition){if(this.containment){if(e.pageX-this.offset.click.left<this.containment[0]){n=this.containment[0]+this.offset.click.left};if(e.pageY-this.offset.click.top<this.containment[1]){r=this.containment[1]+this.offset.click.top};if(e.pageX-this.offset.click.left>this.containment[2]){n=this.containment[2]+this.offset.click.left};if(e.pageY-this.offset.click.top>this.containment[3]){r=this.containment[3]+this.offset.click.top}};if(i.grid){s=this.originalPageY+Math.round((r-this.originalPageY)/i.grid[1])*i.grid[1];r=this.containment?((s-this.offset.click.top>=this.containment[1]&&s-this.offset.click.top<=this.containment[3])?s:((s-this.offset.click.top>=this.containment[1])?s-i.grid[1]:s+i.grid[1])):s;o=this.originalPageX+Math.round((n-this.originalPageX)/i.grid[0])*i.grid[0];n=this.containment?((o-this.offset.click.left>=this.containment[0]&&o-this.offset.click.left<=this.containment[2])?o:((o-this.offset.click.left>=this.containment[0])?o-i.grid[0]:o+i.grid[0])):o}};return{top:(r-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+((this.cssPosition==="fixed"?-this.scrollParent.scrollTop():(h?0:a.scrollTop())))),left:(n-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+((this.cssPosition==="fixed"?-this.scrollParent.scrollLeft():h?0:a.scrollLeft())))}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],(this.direction==="down"?e.item[0]:e.item[0].nextSibling));this.counter=this.counter?++this.counter:1;var o=this.counter;this._delay(function(){if(o===this.counter){this.refreshPositions(!s)}})},_clear:function(t,e){this.reverting=!1;var i,s=[];if(!this._noFinalSort&&this.currentItem.parent().length){this.placeholder.before(this.currentItem)};this._noFinalSort=null;if(this.helper[0]===this.currentItem[0]){for(i in this._storedCSS){if(this._storedCSS[i]==="auto"||this._storedCSS[i]==="static"){this._storedCSS[i]=""}};this.currentItem.css(this._storedCSS);this._removeClass(this.currentItem,"ui-sortable-helper")} else{this.currentItem.show()};if(this.fromOutside&&!e){s.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))})};if((this.fromOutside||this.domPosition.prev!==this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!==this.currentItem.parent()[0])&&!e){s.push(function(t){this._trigger("update",t,this._uiHash())})};if(this!==this.currentContainer){if(!e){s.push(function(t){this._trigger("remove",t,this._uiHash())});s.push((function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}).call(this,this.currentContainer));s.push((function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}).call(this,this.currentContainer))}};function o(t,e,i){return function(s){i._trigger(t,s,e._uiHash(e))}};for(i=this.containers.length-1;i>=0;i--){if(!e){s.push(o("deactivate",this,this.containers[i]))};if(this.containers[i].containerCache.over){s.push(o("out",this,this.containers[i]));this.containers[i].containerCache.over=0}};if(this.storedCursor){this.document.find("body").css("cursor",this.storedCursor);this.storedStylesheet.remove()};if(this._storedOpacity){this.helper.css("opacity",this._storedOpacity)};if(this._storedZIndex){this.helper.css("zIndex",this._storedZIndex==="auto"?"":this._storedZIndex)};this.dragging=!1;if(!e){this._trigger("beforeStop",t,this._uiHash())};this.placeholder[0].parentNode.removeChild(this.placeholder[0]);if(!this.cancelHelperRemoval){if(this.helper[0]!==this.currentItem[0]){this.helper.remove()};this.helper=null};if(!e){for(i=0;i<s.length;i++){s[i].call(this,t)};this._trigger("stop",t,this._uiHash())};this.fromOutside=!1;return!this.cancelHelperRemoval},_trigger:function(){if(t.Widget.prototype._trigger.apply(this,arguments)===!1){this.cancel()}},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}})})); ;jQuery.fn.toggleAttr=function(t,e,f){return this.each(function(){let self=$(this);if(self.attr(t)==e)self.attr(t,f);else self.attr(t,e)})}; -;jQuery.fn.orSearch=function(t){var e=$.extend({'dropdown':$(),'select':function(e){},'afterSelect':function(){},'onSearchActive':function(){},'onSearchInactive':function(){},'openDropdown':!0,'action':'search','method':'quicksearch','resultEntryClass':'or-dropdown-entry',},t);return $(this).on('input change',function(){let searchInput=$(this);let searchArgument=searchInput.val();let dropdownEl=$(e.dropdown);if(searchArgument.length){e.onSearchActive();$('.or-search').addClass('search--is-active');dropdownEl.addClass('search-result--is-active');$.ajax({'type':'GET',url:'./api/?action='+e.action+'&subaction='+e.method+'&output=json&search='+searchArgument,data:null,success:function(t,n,r){$(dropdownEl).empty();for(id in t.output.result){let result=t.output.result[id];let div=$('<div class="'+e.resultEntryClass+' '+e.resultEntryClass+'--active" title="'+result.desc+'"></div>');div.data('object',{'name':result.name,'action':result.type,'id':result.id});let link=$('<a class="or-link"/>').attr('href',WorkbenchNavigator.createShortUrl(result.type,result.id));link.click(function(e){e.preventDefault()});$(link).append('<i class="or-image-icon or-image-icon--action-'+result.type+'" />');$(link).append('<span class="or-dropdown-text">'+result.name+'</span>');$(div).append(link);$(dropdownEl).append(div)};if(t.output.result&&e.openDropdown){$(dropdownEl).addClass('dropdown--is-open')} -else{$(dropdownEl).removeClass('dropdown--is-open')};$(dropdownEl).find('.or-search-result-entry').click(function(t){e.select($(this).data('object'));e.afterSelect();searchInput.val('')})}})} +;jQuery.fn.orSearch=function(t){var e=$.extend({'dropdown':$(),'select':function(e){},'afterSelect':function(){},'onSearchActive':function(){},'onSearchInactive':function(){},'openDropdown':!0,'action':'search','method':'quicksearch','resultEntryClass':'or-dropdown-entry',},t);return $(this).on('input change',function(){let searchInput=$(this);let searchArgument=searchInput.val();let dropdownEl=$(e.dropdown);if(searchArgument.length){e.onSearchActive();$('.or-search').addClass('search--is-active');dropdownEl.addClass('search-result--is-active');let url='./api/?action='+e.action+'&subaction='+e.method+'&output=json&search='+searchArgument;let load=fetch(url,{method:'GET',headers:{'Content-Type':'application/json',}});load.then(response=>{if(!response.ok)throw'Search request getting an error';return response.json()}).then(data=>{$(dropdownEl).empty();for(id in data.output.result){let result=data.output.result[id];let div=$('<div class="'+e.resultEntryClass+' '+e.resultEntryClass+'--active" title="'+result.desc+'"></div>');div.data('object',{'name':result.name,'action':result.type,'id':result.id});let link=$('<a class="or-link"/>').attr('href',WorkbenchNavigator.createShortUrl(result.type,result.id));link.click(function(e){e.preventDefault()});$(link).append('<i class="or-image-icon or-image-icon--action-'+result.type+'" />');$(link).append('<span class="or-dropdown-text">'+result.name+'</span>');$(div).append(link);$(dropdownEl).append(div)};if(data.output.result&&e.openDropdown){$(dropdownEl).addClass('dropdown--is-open')} +else{$(dropdownEl).removeClass('dropdown--is-open')};$(dropdownEl).find('.or-search-result-entry').click(function(t){e.select($(this).data('object'));e.afterSelect();searchInput.val('')})})} else{e.onSearchInactive();$(dropdownEl).empty();dropdownEl.removeClass('search-result--is-active')}})}; ;jQuery.fn.orLinkify=function(t){var a=$.extend({'openAction':function(t,a,e){Openrat.workbench.openNewAction(t,a,e)}},t);$(this).addClass('linkified');if($(this).is('a'))$(this).click(function(t){t.preventDefault()});else $(this).find('a').click(function(t){t.preventDefault()});return $(this).click(function(t){$el=$(this);if($el.is('a'))$link=$el;else $link=$el.find('a').first();let type=$link.attr('data-type');if($link.parent().hasClass('dropdown-entry--inactive'))return;switch(type){case'post':$form=$('<form />').attr('method','POST').addClass('invisible');$form.data('afterSuccess',$link.data('afterSuccess'));let params=jQuery.parseJSON($link.attr('data-data'));params.output='json';$.each(params,function(t,a){let $input=$('<input />').attr('type','hidden').attr('name',t).attr('value',a);$form.append($input)});let form=new Form();form.initOnElement($form);form.submit();break;case'edit':case'dialog':let dialog=new Dialog();let name=$link.attr('data-name');if(!name)name=$link.text();let extraValue=$link.attr('data-extra').replace(/'/g,'"');let extraData=JSON.parse(extraValue);dialog.start(name,$link.attr('data-action'),$link.attr('data-method'),$link.attr('data-id'),extraData);break;case'external':window.open($link.attr('data-url'),' _blank');break;case'window':window.location.href=View.createUrl($link.attr('data-action'),$link.attr('data-method'),$link.attr('data-id'));break;case'popup':Workbench.popupWindow=window.open($link.attr('data-url'),'Popup','location=no,menubar=no,scrollbars=yes,toolbar=no,resizable=yes');break;case'help':help($link,$link.attr('data-url'),$link.attr('data-suffix'));break;case'fullscreen':fullscreen($link);break;case'open':a.openAction($link.text().trim(),$link.attr('data-action'),$link.attr('data-id'));break;default:throw'UI error: Unknown link type: '+type+' in link '+$link.html()}})}; ;jQuery.fn.orButton=function(t){let settings=$.extend({'selectorForClose':'.or-view'},t);let button=this;$(settings.selectorForClose).click(function(){});return $(this).addClass('button--is-watched').click(function(){$(this).toggleClass('button--is-active')})}; @@ -1176,14 +1176,13 @@ jQuery.trumbowyg={langs:{en:{viewHTML:"View HTML",undo:"Undo",redo:"Redo",format else if(Notification.permission==='granted'){let notification=new Notification(text)} else if(Notification.permission!=='denied'){Notification.requestPermission(function(t){if(t==='granted'){let notification=new Notification(text)}})}};static;htmlEntities(str){return String(str).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;')};static;removeNoticesWithStatus(status){$('.or-notice-container').find('.or-notice--'+status).remove()};static;removeAllNotices(status){$('.or-notice-container').find('.or-notice').remove()}}; ;class;Dialog{constructor(){this.view;this.isDirty=!1;this.element=$('.or-dialog-content .or-view')};start(name,action,method,id,params){if(!action)action=Workbench.state.action;if(!id)id=Workbench.state.id;let dialog=this;let view=new View(action,method,id,params);Notice.removeAllNotices();$('.or-dialog-content .or-view').html('');$('.or-dialog-content .or-act-dialog-name').html(name);this.show();view.onCloseHandler.add(function(){dialog.close()});view.onChangeHandler.add(function(){console.debug('Changes detected');dialog.isDirty=!0;dialog.element.addClass('view--is-dirty')});view.onSaveHandler.add(function(){dialog.isDirty=!1;dialog.element.removeClass('view--is-dirty')});this.view=view;return this.view.start(this.element)};show(){$('.or-dialog').removeClass('dialog--is-closed').addClass('dialog--is-open');if(this.isDirty){this.element.addClass('view--is-dirty')};let dialog=this;this.escapeKeyClosingHandler=function(e){if(e.keyCode==27){dialog.close();$(document).off('keyup')}};$(document).keyup(this.escapeKeyClosingHandler);$('.or-dialog-filler,.or-act-dialog-close').off('click').click(function(e){e.preventDefault();dialog.close()})};hide(){$('.or-dialog').removeClass('dialog--is-open').addClass('dialog--is-closed')};close(){let dialog=this;if(this.isDirty){let exit=window.confirm(Workbench.language.UNSAVED_CHANGES_CONFIRM);if(!exit)return;let notice=new Notice();notice.msg=Workbench.language.REOPEN_CLOSED_DIALOG;notice.setStatus('warning');notice.timeout=120;notice.onClick.add(function(){dialog.show();notice.close()});notice.show()};$('.or-dialog-content .or-view.or-view--is-dirty').removeClass('view--is-dirty');this.hide();$(document).unbind('keyup',this.escapeKeyClosingHandler)}}; -;class;View{constructor(action,method,id,params){this.action=action;this.method=method;this.id=id;this.params=params;this.onCloseHandler=new Callback();this.onChangeHandler=new Callback();this.onSaveHandler=new Callback()};before(){};start(element){this.before();this.element=element;return this.loadView()};afterLoad(){};close(){this.onCloseHandler.fire()};fireViewLoadedEvents(element){Workbench.afterViewLoadedHandler.fire(element)};loadView(){let url=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,i){if(!e)e='';$(element).html(e);$(element).find('form').each(function(){let form=new Form();form.onChangeHandler.add(()=>{view.onChangeHandler.fire()});form.onSaveHandler.add(()=>{view.onSaveHandler.fire()});form.onCloseHandler.add(()=>{view.close()});form.forwardTo=function(e,i,t,a){view.action=e;view.method=i;view.id=t;view.params=a;view.loadView()};form.initOnElement(this)});view.fireViewLoadedEvents(element)});loadViewHtmlPromise.fail(function(i,e,t){$(element).html('');console.error({view:view,url:url,status:e,cause:t});let notice=new Notice();notice.setStatus('error');notice.msg=Workbench.language.ERROR;notice.show()});loadViewHtmlPromise.always(function(){$(element).removeClass('loader')});let apiUrl=View.createUrl(this.action,this.method,this.id,this.params,!0);return loadViewHtmlPromise};static;createUrl(action,subaction,id,extraid={},api=!1){let url='./';if(api)url+='api/';url+='?';if(action)url+='&action='+action;if(subaction)url+='&subaction='+subaction;if(id)url+='&id='+id;if(extraid instanceof FormData){for(let pair of extraid.entries()){url+='&'+pair[0]+'='+pair[1]}} +;class;View{constructor(action,method,id,params){this.action=action;this.method=method;this.id=id;this.params=params;this.onCloseHandler=new Callback();this.onChangeHandler=new Callback();this.onSaveHandler=new Callback()};before(){};start(element){this.before();this.element=element;return this.loadView()};afterLoad(){};close(){this.onCloseHandler.fire()};fireViewLoadedEvents(element){Workbench.afterViewLoadedHandler.fire(element)};loadView(){let url=View.createUrl(this.action,this.method,this.id,this.params,!1);let element=this.element;let view=this;let loadViewHtmlPromise=fetch(url,{});$(this.element).addClass('loader');console.debug(view);loadViewHtmlPromise.then(response=>{if(!response.ok)throw'failed to load the view';return response.text()}).then(data=>{if(!data)data='';$(element).html(data);$(element).find('form').each(function(){let form=new Form();form.onChangeHandler.add(()=>{view.onChangeHandler.fire()});form.onSaveHandler.add(()=>{view.onSaveHandler.fire()});form.onCloseHandler.add(()=>{view.close()});form.forwardTo=function(e,t,i,a){view.action=e;view.method=t;view.id=i;view.params=a;view.loadView()};form.initOnElement(this)});view.fireViewLoadedEvents(element)}).catch(cause=>{$(element).html('');console.error({view:view,url:url,cause:cause});let notice=new Notice();notice.setStatus('error');notice.msg=Workbench.language.ERROR;notice.log=cause;notice.show()});loadViewHtmlPromise.finally(()=>{$(element).removeClass('loader')});return loadViewHtmlPromise};static;createUrl(action,subaction,id,extraid={},api=!1){let url='./';if(api)url+='api/';url+='?';if(action)url+='&action='+action;if(subaction)url+='&subaction='+subaction;if(id)url+='&id='+id;if(extraid instanceof FormData){for(let pair of extraid.entries()){url+='&'+pair[0]+'='+pair[1]}} else if(extraid instanceof Object){Object.keys(extraid).forEach((key)=>{url+='&'+key+'='+extraid[key]})} else throw'Illegal argument';return url}}; ;class;Form{static;modes={showBrowserNotice:1,keepOpen:2,closeAfterSubmit:4,closeAfterSuccess:8,};constructor(){this.onChangeHandler=new Callback();this.onSaveHandler=new Callback();this.onCloseHandler=new Callback()};setLoadStatus(isLoading){$(this.element).closest('div.content').toggleClass('loader',isLoading)};initOnElement(element){this.element=element;let form=this;if($(this.element).data('autosave')){$(this.element).find('input[type="checkbox"]').click(function(){form.submit(Form.modes.keepOpen)});$(this.element).find('select').change(function(){form.submit(Form.modes.keepOpen)})};$(element).find('.or-act-form-cancel').click(function(){form.cancel()});$(element).find('.or-act-form-reset').click(function(){form.rollback()});$(element).find('.or-act-form-apply').click(function(){form.submit(Form.modes.keepOpen)});$(element).find('.or-act-form-save').click(function(){form.submit()});$(element).find('.or-input').change(function(){form.onChangeHandler.fire()});$(element).submit(function(e){if($(this).data('target')=='view'){form.submit();e.preventDefault()}})};cancel(){Notice.removeAllNotices();this.onCloseHandler.fire()};rollback(){this.element.trigger('reset')};forwardTo(action,subaction,id,data){};submit(mode){if(mode===undefined)if($(this.element).data('async'))mode=Form.modes.closeAfterSubmit;else mode=Form.modes.closeAfterSuccess;Notice.removeAllNotices();let status=new Notice();status.setStatus('info');status.inProgress();status.msg=Workbench.language.PROGRESS;status.show();$(this.element).find('.or-input--error').removeClass('input--error');let formData=new FormData($(this.element).get(0));if(!formData.has('id'))formData.append('id',Workbench.state.id);if(!formData.has('action'))formData.append('action',Workbench.state.action);let formMethod=$(this.element).attr('method').toUpperCase();if(formMethod=='GET'){this.forwardTo(formData.get('action'),formData.get('subaction'),formData.get('id,'),formData);$(status).remove()} -else{let url='./api/';this.setLoadStatus(!0);url+='';formData.append('output','json');if(mode==Form.modes.closeAfterSubmit)this.onCloseHandler.fire();let form=this;console.debug(form);$.ajax({'type':'POST',url:url,data:Form.formDataToObject(formData),success:function(e,t,o){form.setLoadStatus(!1);status.close();form.doResponse(e,t,form.element,function(){form.onSaveHandler.fire();let afterSuccess=$(form.element).data('afterSuccess');let forwardTo=$(form.element).data('forwardTo');let async=$(form.element).data('async');if(afterSuccess=='forward')mode=Form.modes.keepOpen;if(mode==Form.modes.closeAfterSuccess){form.onCloseHandler.fire();$(form.element).closest('div.panel').find('div.header ul.views li.action.active').removeClass('dirty')};if(afterSuccess){if(afterSuccess=='reloadAll'){Workbench.reloadAll()} +else{let url='./api/';this.setLoadStatus(!0);url+='';formData.append('output','json');if(mode==Form.modes.closeAfterSubmit)this.onCloseHandler.fire();let form=this;console.debug(form);let load=fetch(url,{'method':'POST',body:formData});load.then(response=>{if(!response.ok)throw'Failed to post';return response.json()}).then(data=>{form.setLoadStatus(!1);status.close();form.doResponse(data,'',form.element,()=>{form.onSaveHandler.fire();let afterSuccess=$(form.element).data('afterSuccess');let forwardTo=$(form.element).data('forwardTo');let async=$(form.element).data('async');if(afterSuccess=='forward')mode=Form.modes.keepOpen;if(mode==Form.modes.closeAfterSuccess){form.onCloseHandler.fire();$(form.element).closest('div.panel').find('div.header ul.views li.action.active').removeClass('dirty')};if(afterSuccess){if(afterSuccess=='reloadAll'){Workbench.reloadAll()} else if(afterSuccess=='forward'){if(forwardTo)form.forwardTo(formData.get('action'),forwardTo,formData.get('id'),[])}} -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=$.parseJSON(e.responseText).message}catch(s){msg=e.statusText};let notice=new Notice();notice.setStatus('error');notice.msg=msg;notice.log=JSON.stringify($.parseJSON(e.responseText),null,2);notice.show()}});$(form.element).fadeIn()}};doResponse=function(e,t,o,onSuccess=$.noop){if(t!='success'){console.error('Server error: '+t);let notice=new Notice();notice.setStatus('error');notice.msg=Workbench.language.ERROR;notice.show();return};let form=this;$.each(e['notices'],function(t,e){let notifyBrowser=$(o).data('async');let notice=new 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();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')})};static;formDataToObject(formData){let data={};for(let pair of formData.entries())data[pair[0]]=pair[1];return data}}; +else{if(async);else Openrat.workbench.reloadViews()}})}).catch(cause=>{console.warn({message:'could not post form',cause:cause,form:form,});form.setLoadStatus(!1);status.close();let msg='';try{msg=$.parseJSON(cause).message}catch(e$){msg=cause};let notice=new Notice();notice.setStatus('error');notice.msg=msg;notice.log=cause;notice.show()});$(form.element).fadeIn()}};doResponse=function(e,o,t,onSuccess=$.noop){let form=this;for(let value of e['notices']){let notifyBrowser=$(t).data('async');let notice=new 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(e.success){onSuccess();Workbench.dataChangedHandler.fire()};for(name of e['errors'])$('.or-input[name='+name+']').addClass('input--error').parent().addClass('input--error').parents('.or-group').removeClass('closed').addClass('show').addClass('open')};static;formDataToObject(formData){let data={};for(let pair of formData.entries())data[pair[0]]=pair[1];return data}}; ;class;Workbench{'use strict';static;state={action:'',id:0,extra:{}};constructor(){this.popupWindow=null;Workbench.dataChangedHandler.add(function(){if(Workbench.popupWindow)Workbench.popupWindow.location.reload()})};initialize(){this.initializePingTimer();this.initializeDirtyWarning();this.initializeState();this.openModalDialog();Workbench.registerOpenClose($('.or-collapsible'));console.info('Application started')};initializeDirtyWarning(){window.addEventListener('beforeunload',function(e){if($('.or-view--is-dirty').length>0){e.preventDefault();return'Unsaved content will be lost.'} else{return undefined}})};openModalDialog(){if($('#dialog').data('action')){let dialog=new Dialog();dialog.start('',$('#dialog').data('action'),$('#dialog').data('action'),0,{})}};initializeState(){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,'');Workbench.state=state;Openrat.navigator.toActualHistory(state)};initializePingTimer(){let ping=()=>{let pingPromise=$.getJSON(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($('.or-view--is-dirty').length>0){window.alert('The server session is lost, please save your data.')} else{}})};let timeoutMinutes=5;window.setInterval(ping,timeoutMinutes*60*1000)};loadNewActionState(state){Workbench.state=state;this.loadNewAction(state.action,state.id,state.data);Workbench.afterNewActionHandler.fire()};static;afterNewActionHandler=new Callback();static;afterAllViewsLoaded=new Callback();loadNewAction=function(e,t,i){this.reloadViews()};reloadViews(){$('.or-workbench-section--is-closed .or-act-view-loader').empty();let promise=this.loadViews($('.or-workbench .or-act-view-loader'));promise.done(function(){Workbench.afterAllViewsLoaded.fire()});return promise};reloadAll(){let promise=this.loadViews($('.or-act-view-loader,.or-act-view-static').empty());console.debug('reloading all views');promise.done(function(){Workbench.afterAllViewsLoaded.fire()});this.loadUserStyle();this.loadLanguage();this.loadUISettings();return promise};loadUserStyle(){let url=View.createUrl('profile','userinfo',0,{},!0);$.getJSON(url,response=>{let style=response.output['style'];this.setUserStyle(style);let color=response.output['theme-color'];this.setThemeColor(color)})};static;settings={};static;language={};loadLanguage(){let url=View.createUrl('profile','language',0,{},!0);$.getJSON(url,function(e){Workbench.language=e.output.language})};loadUISettings(){let url=View.createUrl('profile','uisettings',0,{},!0);$.getJSON(url,function(e){Workbench.settings=e.output.settings.settings})};loadViews($views){let wb=this;let promises=[];$views.each(function(e){let $targetDOMElement=$(this);promises.push(wb.loadNewActionIntoElement($targetDOMElement))});return $.when.apply($,promises)};loadNewActionIntoElement($viewElement){let action;if($viewElement.is('.or-act-view-static'))action=$viewElement.attr('data-action');else action=Workbench.state.action;let id=Workbench.state.id;let params=Workbench.state.extra;let method=$viewElement.data('method');let view=new View(action,method,id,params);return view.start($viewElement)};setUserStyle(styleName){var html=$('html'),classList=html.attr('class').split(/\s+/);$.each(classList,function(e,t){if(t.startsWith('or-theme-')){html.removeClass(t.substring(3))}});html.addClass('theme-'+styleName.toLowerCase())};setThemeColor(color){document.getElementById('theme-color').setAttribute('content',color)};static;dataChangedHandler=new Callback();static;afterViewLoadedHandler=new Callback();static;setApplicationTitle(newTitle){let title=document.querySelector('head > title');let defaultTitle=title.dataset.default;title.textContent=(newTitle?newTitle+' - ':'')+defaultTitle};static;registerOpenClose=function(e){$(e).children('.or-collapsible-act-switch').click(function(){$(this).closest('.or-collapsible').toggleClass('collapsible--is-open').toggleClass('collapsible--is-closed')})};openNewAction(name,action,id){$('.or-workbench-navigation').removeClass('workbench-navigation--is-open');Workbench.setApplicationTitle(name);Openrat.navigator.navigateToNew({'action':action,'id':id})};registerDraggable(viewEl){$(viewEl).find('.or-draggable').draggable({helper:'clone',opacity:0.7,zIndex:3,distance:10,cursor:'move',revert:'false'})};registerDroppable(viewEl){$(viewEl).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)}})}}; @@ -1198,4 +1197,4 @@ else{$selector.addClass("selector--is-tree-active");var e=this;let id=$(this).da ;Workbench.afterViewLoadedHandler.add(function(a){$(a).find('.or-act-clickable').orLinkify()}); ;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')})}); ;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(.or-table-header)').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()}}); -;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;Workbench.handleFileUpload(t,o)});$(e).find('input[type=file]').change(function(){var e=$(this).prop('files');Workbench.handleFileUpload(t,e)})});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 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 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 Notice();notice.setStatus('error');notice.msg='Upload error: '+msg;notice.show()}})}}; +;Workbench.afterViewLoadedHandler.add(function(e){var n=$(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;Workbench.handleFileUpload(n,o)});$(e).find('input[type=file]').change(function(){var e=$(this).prop('files');Workbench.handleFileUpload(n,e)})});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 Notice();notice.inProgress();notice.show();let url='./api/';let load=fetch(url,{method:'POST'});load.then(response=>{return response.json()}).then(data=>{notice.close();let oform=new Form();oform.doResponse(data,'',e)}).catch(error=>{notice.close();console.error(error);let notice=new Notice();notice.setStatus('error');notice.msg='Upload error: '+error;notice.show()})}}; diff --git a/modules/cms/ui/themes/default/script/openrat/form.js b/modules/cms/ui/themes/default/script/openrat/form.js @@ -157,82 +157,79 @@ class Form { let form = this; console.debug( form ); - $.ajax( { 'type':'POST',url:url, data:Form.formDataToObject(formData), success:function(responseData, textStatus, jqXHR) - { - form.setLoadStatus(false); - status.close(); + let load = fetch( url, { 'method':'POST', body:formData } ); - form.doResponse(responseData,textStatus,form.element, function() { + load.then( response => { + if ( ! response.ok ) + throw "Failed to post"; - form.onSaveHandler.fire(); + return response.json(); + }).then( data => { + form.setLoadStatus(false); + status.close(); - let afterSuccess = $(form.element).data('afterSuccess'); - let forwardTo = $(form.element).data('forwardTo' ); - let async = $(form.element).data('async' ); + form.doResponse(data, "", form.element, () => { - if ( afterSuccess == 'forward' ) - mode = Form.modes.keepOpen; + form.onSaveHandler.fire(); - // The data was successful saved. - // Now we can close the form. - if ( mode == Form.modes.closeAfterSuccess ) - { - form.onCloseHandler.fire(); + let afterSuccess = $(form.element).data('afterSuccess'); + let forwardTo = $(form.element).data('forwardTo'); + let async = $(form.element).data('async'); - // clear the dirty flag. - $(form.element).closest('div.panel').find('div.header ul.views li.action.active').removeClass('dirty'); - } + if (afterSuccess == 'forward') + mode = Form.modes.keepOpen; - if ( afterSuccess ) - { - if ( afterSuccess == 'reloadAll' ) - { - Workbench.reloadAll(); - } - else if ( afterSuccess == 'forward' ) - { - // Forwarding to next subaction. - if ( forwardTo ) - form.forwardTo( formData.get('action'), forwardTo, formData.get('id'),[] ); - } - } else { - if ( async ) - ; // do not reload - else - Openrat.workbench.reloadViews(); - } + // The data was successful saved. + // Now we can close the form. + if (mode == Form.modes.closeAfterSuccess) { + form.onCloseHandler.fire(); + + // clear the dirty flag. + $(form.element).closest('div.panel').find('div.header ul.views li.action.active').removeClass('dirty'); + } - }); - }, - error:function(jqXHR, textStatus, errorThrown) { - - console.warn( { - message:'could not post form', - jqXHR:jqXHR, - form:form, - status: textStatus, - error: errorThrown - } ); - - form.setLoadStatus(false); - status.close(); - - let msg = ''; - try { - msg = $.parseJSON( jqXHR.responseText ).message; - } - catch( e ) { - msg = jqXHR.statusText; - } - - let notice = new Notice(); - notice.setStatus('error'); - notice.msg = msg; - notice.log = JSON.stringify( $.parseJSON(jqXHR.responseText),null,2); - notice.show(); + if (afterSuccess) { + if (afterSuccess == 'reloadAll') { + Workbench.reloadAll(); + } else if (afterSuccess == 'forward') { + // Forwarding to next subaction. + if (forwardTo) + form.forwardTo(formData.get('action'), forwardTo, formData.get('id'), []); + } + } else { + if (async) + ; // do not reload + else + Openrat.workbench.reloadViews(); + } + + }) + } ).catch( cause => { + + console.warn( { + message:'could not post form', + cause: cause, + form:form, + } ); + + form.setLoadStatus(false); + status.close(); + + let msg = ''; + try { + msg = $.parseJSON( cause ).message; + } + catch( e ) { + msg = cause; } + let notice = new Notice(); + notice.setStatus('error'); + notice.msg = msg; + notice.log = cause; //JSON.stringify( $.parseJSON(jqXHR.responseText),null,2); + notice.show(); } ); + $(form.element).fadeIn(); } @@ -249,21 +246,9 @@ class Form { */ doResponse = function(data,status,element, onSuccess = $.noop ) { - if ( status != 'success' ) - { - console.error('Server error: ' + status); - - let notice = new Notice(); - notice.setStatus( 'error' ); - notice.msg = Workbench.language.ERROR; - notice.show(); - - return; - } - let form = this; // Hinweismeldungen in Statuszeile anzeigen - $.each(data['notices'], function(idx,value) { + for( let value of data['notices'] ) { // Bei asynchronen Requests wird zusätzlich eine Browser-Notice erzeugt, da der // Benutzer bei länger laufenden Aktionen vielleicht das Tab oder Fenster @@ -279,23 +264,18 @@ class Form { if ( notifyBrowser ) notice.notifyBrowser() - - - if ( value.status == 'ok' ) // Kein Fehler? - { - onSuccess(); - Workbench.dataChangedHandler.fire(); - } - else - // Server liefert Fehler zurück. - { - } - }); - - // Validation error should mark the input field. - $.each(data['errors'], function(idx,value) { - $('.or-input[name='+value+']').addClass('input--error').parent().addClass('input--error').parents('.or-group').removeClass('closed').addClass('show').addClass('open'); - }); + }; + + if ( data.success ) { // Kein Fehler? + onSuccess(); + Workbench.dataChangedHandler.fire(); + } + else + ; // Server liefert Fehler zurück. + + // Validation error should mark the input field. + for( name of data['errors'] ) + $('.or-input[name='+name+']').addClass('input--error').parent().addClass('input--error').parents('.or-group').removeClass('closed').addClass('show').addClass('open'); // Jetzt das erhaltene Dokument auswerten. } diff --git a/modules/cms/ui/themes/default/script/openrat/view.js b/modules/cms/ui/themes/default/script/openrat/view.js @@ -63,12 +63,16 @@ class View { let element = this.element; let view = this; - let loadViewHtmlPromise = $.ajax( url ); + let loadViewHtmlPromise = fetch( url,{} ); $(this.element).addClass('loader'); console.debug( view); - loadViewHtmlPromise.done( function(data,status){ + loadViewHtmlPromise.then( response => { + if ( ! response.ok ) + throw "failed to load the view"; + return response.text(); + } ).then( data => { if ( ! data ) data = ''; @@ -95,26 +99,22 @@ class View { }); view.fireViewLoadedEvents( element ); - } ); - - loadViewHtmlPromise.fail( function(jqxhr,status,cause) { + } ).catch( cause => { $(element).html(""); - console.error( {view:view, url:url, status:status, cause: cause} ); + console.error( {view:view, url:url, cause: cause} ); let notice = new Notice(); notice.setStatus('error'); notice.msg = Workbench.language.ERROR; + notice.log = cause; notice.show(); }); - loadViewHtmlPromise.always( function() { + loadViewHtmlPromise.finally( () => { $(element).removeClass("loader"); }); - // Load the data for this view. - let apiUrl = View.createUrl( this.action,this.method,this.id,this.params,true); - return loadViewHtmlPromise; } diff --git a/modules/cms/ui/themes/default/script/plugin/jquery-plugin-orSearch.js b/modules/cms/ui/themes/default/script/plugin/jquery-plugin-orSearch.js @@ -29,51 +29,58 @@ jQuery.fn.orSearch = function( options ) $('.or-search').addClass('search--is-active'); dropdownEl.addClass('search-result--is-active'); - $.ajax( { 'type':'GET',url:'./api/?action='+settings.action+'&subaction='+settings.method+'&output=json&search='+searchArgument, data:null, success:function(data, textStatus, jqXHR) - { - $(dropdownEl).empty(); // Leeren. + let url = './api/?action='+settings.action+'&subaction='+settings.method+'&output=json&search='+searchArgument; + let load = fetch( url, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + } } ); + load.then( response => { + if ( ! response.ok ) + throw "Search request getting an error"; + return response.json(); + } + ).then( data => { + $(dropdownEl).empty(); // Leeren. - for( id in data.output.result ) - { - let result = data.output.result[id]; - - // Suchergebnis-Zeile in das Ergebnis schreiben. + for (id in data.output.result) { + let result = data.output.result[id]; - let div = $('<div class="'+settings.resultEntryClass+' '+settings.resultEntryClass+'--active" title="'+result.desc+'"></div>'); - div.data('object',{ - 'name':result.name, - 'action':result.type, - 'id':result.id - } ); - let link = $('<a class="or-link"/>').attr('href',WorkbenchNavigator.createShortUrl(result.type, result.id)); - link.click( function(e) { - e.preventDefault(); - }); - $(link).append('<i class="or-image-icon or-image-icon--action-'+result.type+'" />'); - $(link).append('<span class="or-dropdown-text">'+result.name+'</span>'); + // Suchergebnis-Zeile in das Ergebnis schreiben. - $(div).append(link); - $(dropdownEl).append(div); - } + let div = $('<div class="' + settings.resultEntryClass + ' ' + settings.resultEntryClass + '--active" title="' + result.desc + '"></div>'); + div.data('object', { + 'name': result.name, + 'action': result.type, + 'id': result.id + }); + let link = $('<a class="or-link"/>').attr('href', WorkbenchNavigator.createShortUrl(result.type, result.id)); + link.click(function (e) { + e.preventDefault(); + }); + $(link).append('<i class="or-image-icon or-image-icon--action-' + result.type + '" />'); + $(link).append('<span class="or-dropdown-text">' + result.name + '</span>'); - if ( data.output.result && settings.openDropdown ) { - // Open the menu - //$(dropdownEl).closest('.or-menu').addClass('menu--is-open'); - $(dropdownEl).addClass('dropdown--is-open'); - }else { - $(dropdownEl).removeClass('dropdown--is-open'); - } + $(div).append(link); + $(dropdownEl).append(div); + } - // Register clickhandler for search results. - $(dropdownEl).find('.or-search-result-entry').click( function(e) { - settings.select( $(this).data('object') ); - settings.afterSelect(); - searchInput.val(''); - } ); + if (data.output.result && settings.openDropdown) { + // Open the menu + //$(dropdownEl).closest('.or-menu').addClass('menu--is-open'); + $(dropdownEl).addClass('dropdown--is-open'); + } else { + $(dropdownEl).removeClass('dropdown--is-open'); + } - } } ); + // Register clickhandler for search results. + $(dropdownEl).find('.or-search-result-entry').click(function (e) { + settings.select($(this).data('object')); + settings.afterSelect(); + searchInput.val(''); + }); - + } ); } else { diff --git a/modules/template_engine/components/html/component_upload/upload.js b/modules/template_engine/components/html/component_upload/upload.js @@ -56,38 +56,31 @@ Workbench.handleFileUpload = function(form,files) form_data.append('id' ,$(form).find('input[name=id]' ).val() ); let notice = new 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) - { + let url ='./api/'; + let load = fetch( url, { + method: 'POST' + } ); + + load.then( response => { + return response.json(); + }).then( data => { + notice.close(); let oform = new Form(); - oform.doResponse(data,textStatus,form); - }, - error:function(jqXHR, textStatus, errorThrown) { - $(form).closest('div.content').removeClass('loader'); + oform.doResponse(data,"",form); + } ).catch( error => { + notice.close(); - let msg; - console.error(jqXHR); - try - { - let error = jQuery.parseJSON( jqXHR.responseText ); - msg = error.error + '/' + error.description + ': ' + error.reason; - } - catch( e ) - { - msg = jqXHR.responseText; - } - + console.error(error); let notice = new Notice(); notice.setStatus('error'); - notice.msg = 'Upload error: ' + msg; + notice.msg = 'Upload error: ' + error; notice.show(); } - - } ); + ); } }