openrat-cms

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit 0b09b86185cf6f9526c551188233fb11cad86b0a
parent 36c5786585247d46e97229e5a6892d936357c785
Author: dankert <openrat@jandankert.de>
Date:   Fri, 11 Feb 2022 01:28:51 +0100

Fixed some UI problems: The dialogs are now closed after submitting the data; Workbench is reloaded after login/logout.

Diffstat:
Mmodules/cms/ui/themes/default/script/openrat/api.js | 12------------
Mmodules/cms/ui/themes/default/script/openrat/api.min.js | 8--------
Mmodules/cms/ui/themes/default/script/openrat/dialog.js | 30+++++++++++++++++++-----------
Mmodules/cms/ui/themes/default/script/openrat/dialog.min.js | 12+++++++++---
Mmodules/cms/ui/themes/default/script/openrat/form.js | 190++++++++++++++++++++++++++++++++++++++++---------------------------------------
Mmodules/cms/ui/themes/default/script/openrat/form.min.js | 136++++++++++++++++++++++++++++++++++++++-----------------------------------------
Mmodules/cms/ui/themes/default/script/openrat/notice.js | 4----
Mmodules/cms/ui/themes/default/script/openrat/view.js | 4++--
Mmodules/cms/ui/themes/default/script/openrat/view.min.js | 4++--
Mmodules/cms/ui/themes/default/script/plugin/jquery-plugin-orLinkify.js | 6+++++-
Mmodules/cms/ui/themes/default/script/plugin/jquery-plugin-orLinkify.min.js | 5++++-
11 files changed, 204 insertions(+), 207 deletions(-)

diff --git a/modules/cms/ui/themes/default/script/openrat/api.js b/modules/cms/ui/themes/default/script/openrat/api.js @@ -5,18 +5,6 @@ import Notice from "./notice.js"; */ export default class Api { - static modes = { - get : 1, - write : 2, - }; - - constructor() { - - this.notifyBrowser = false; - this.mode = Api.modes.get; - } - - /** * Sending data to the server. * diff --git a/modules/cms/ui/themes/default/script/openrat/api.min.js b/modules/cms/ui/themes/default/script/openrat/api.min.js @@ -1,13 +1,5 @@ import Notice from "./notice.min.js"; export default class Api { -static modes = { -get : 1, -write : 2, -}; -constructor() { -this.notifyBrowser = false; -this.mode = Api.modes.get; -} sendData = function( formData ) { console.debug( "API form data", formData ); let api = this; diff --git a/modules/cms/ui/themes/default/script/openrat/dialog.js b/modules/cms/ui/themes/default/script/openrat/dialog.js @@ -18,13 +18,6 @@ export default class Dialog { this.view; /** - * Dirty-marker (if unsaved changes exist). - * - * @type {boolean} - */ - this.isDirty = false; - - /** * the DOM element which contains the dialog. * @type {*|jQuery|HTMLElement} */ @@ -32,6 +25,25 @@ export default class Dialog { } /** + * Set Dirty-marker. + * @param dirty true, if unsaved changes exist + */ + set isDirty( dirty ) { + if ( dirty ) + this.element.addClass('view--is-dirty'); + else + this.element.removeClass('view--is-dirty'); + } + + /** + * Get Dirty-marker. + * @return true, if unsaved changes exist + */ + get isDirty() { + this.element.hasClass('view--is-dirty'); + } + + /** * Creating a new dialog. * * @param name @@ -70,15 +82,11 @@ export default class Dialog { // data has changed console.debug("Changes detected"); dialog.isDirty = true; - // Remove dirty-flag from view - dialog.element.addClass('view--is-dirty'); }); view.onSaveHandler.add( function() { // data was saved dialog.isDirty = false; - // Remove dirty-flag from view - dialog.element.removeClass('view--is-dirty'); }); this.view = view; diff --git a/modules/cms/ui/themes/default/script/openrat/dialog.min.js b/modules/cms/ui/themes/default/script/openrat/dialog.min.js @@ -6,9 +6,17 @@ import WorkbenchNavigator from "./navigator.min.js"; export default class Dialog { constructor() { this.view; -this.isDirty = false; this.element = $('.or-dialog-content .or-view'); } +set isDirty( dirty ) { +if ( dirty ) +this.element.addClass('view--is-dirty'); +else +this.element.removeClass('view--is-dirty'); +} +get isDirty() { +this.element.hasClass('view--is-dirty'); +} start( name,action,method,id,params ) { if (!action) @@ -27,11 +35,9 @@ dialog.back(); view.onChangeHandler.add( function() { console.debug("Changes detected"); dialog.isDirty = true; -dialog.element.addClass('view--is-dirty'); }); view.onSaveHandler.add( function() { dialog.isDirty = false; -dialog.element.removeClass('view--is-dirty'); }); this.view = view; Workbench.getInstance().startSpinner(); diff --git a/modules/cms/ui/themes/default/script/openrat/form.js b/modules/cms/ui/themes/default/script/openrat/form.js @@ -12,10 +12,9 @@ import Api from "./api.js"; export default class Form { static modes = { - showBrowserNotice : 1, - keepOpen : 2, - closeAfterSubmit : 4, - closeAfterSuccess : 8, + keepOpen : 2, + closeAfterSubmit : 4, + closeAfterSuccess : 8, }; constructor() { @@ -27,6 +26,7 @@ export default class Form { this.onChangeHandler = new Callback(); this.onSaveHandler = new Callback(); this.onCloseHandler = new Callback(); + this.forwardHandler = new Callback(); this.async = false; this.afterSuccess = ''; @@ -37,7 +37,7 @@ export default class Form { this.forwardToMethod = null; } - setLoadStatus( isLoading ) { + set isLoadStatus( isLoading ) { if ( isLoading ) Workbench.getInstance().startSpinner(); else @@ -47,12 +47,10 @@ export default class Form { initOnElement( element ) { this.element = element; - this.formMethod = $(this.element).attr('method').toUpperCase(); - this.afterSuccess = $(this.element).data('afterSuccess'); + this.formMethod = $(this.element).attr('method').toUpperCase(); + this.afterSuccess = $(this.element).data('afterSuccess'); this.forwardToMethod = $(this.element).data('forwardTo'); - this.async = $(this.element).data('async'); - - let form = this; + this.async = $(this.element).data('async'); // Autosave in Formularen. // Bei Veränderungen von Checkboxen wird das Formular sofort abgeschickt. @@ -60,46 +58,47 @@ export default class Form { this.autosave = true; - $(this.element).find('input[type="checkbox"]').click( function() { - form.submit(Form.modes.keepOpen); + $(this.element).find('input[type="checkbox"]').click( () => { + this.submit(Form.modes.keepOpen); }); - $(this.element).find('select').change( function() { - form.submit(Form.modes.keepOpen); + $(this.element).find('select').change( () => { + this.submit(Form.modes.keepOpen); }); } - $(element).find('.or-act-form-cancel').click( function() { - form.cancel(); - + $(element).find('.or-act-form-cancel').click( () => { + this.cancel(); }); - $(element).find('.or-act-form-reset').click( function() { - form.rollback(); - + $(element).find('.or-act-form-reset').click( () => { + this.rollback(); }); - $(element).find('.or-act-form-apply').click( function() { - form.submit(Form.modes.keepOpen); + $(element).find('.or-act-form-apply').click( () => { + this.submit(Form.modes.keepOpen); }); - $(element).find('.or-act-form-save').click( function() { - form.submit(); + $(element).find('.or-act-form-save').click( () => { + if ( this.async ) + this.submit( Form.modes.closeAfterSubmit ); + else + this.submit( Form.modes.closeAfterSuccess ); }); // Bei Änderungen in der View das Tab als 'dirty' markieren - $(element).find('.or-input').change( function() { - form.onChangeHandler.fire(); + $(element).find('.or-input').change( () => { + this.onChangeHandler.fire(); }); - // Submithandler for the whole form. - $(element).submit( function( event ) { + // Catches the form submit. + // This is called by hitting the enter key. + $(element).submit( ( event ) => { - // - if ($(this).data('target')=='view') - { - form.submit(); - event.preventDefault(); - } - // target=top will load the native way without javascript. + if ( this.async ) + this.submit( Form.modes.closeAfterSubmit ); + else + this.submit( Form.modes.closeAfterSuccess ); + + event.preventDefault(); }); } @@ -107,37 +106,42 @@ export default class Form { //$(this.element).html('').parent().removeClass('is-open'); Notice.removeAllNotices(); - this.onCloseHandler.fire(); + this.close(); } rollback() { - this.element.trigger('reset'); + this.element.nodes[0].reset(); } + + /** + * Forward to another action. + * + * @param action + * @param subaction + * @param id + * @param data + */ forwardTo(action, subaction, id, data) { - } + this.forwardHandler.fire( action, subaction, id, data ); + } - submit( mode ) { - if ( mode === undefined ) - if ( this.async ) - mode = Form.modes.closeAfterSubmit; - else - mode = Form.modes.closeAfterSuccess; + async submit( mode ) { Notice.removeAllNotices(); // Show progress - let status = new Notice(); - status.setStatus('info'); - status.inProgress(); - status.msg = Workbench.language.PROGRESS; - status.show(); + let progressStatus = new Notice(); + progressStatus.setStatus('info'); + progressStatus.inProgress(); + progressStatus.msg = Workbench.language.PROGRESS; + progressStatus.show(); // Alle vorhandenen Error-Marker entfernen. // Falls wieder ein Fehler auftritt, werden diese erneut gesetzt. - $(this.element).find('.or-input--error').removeClass('input--error'); + this.removeErrorMarkers(); let formData = new FormData( $(this.element).get(0) ); @@ -153,75 +157,75 @@ export default class Form { // Mehrseitiges Formular // Die eingegebenen Formulardaten werden zur nächsten Action geschickt. this.forwardTo( formData.get('action'), formData.get('subaction'),formData.get('id,'),formData ); - $(status).remove(); + progressStatus.close(); } else { if ( mode == Form.modes.closeAfterSubmit ) - this.onCloseHandler.fire(); + this.close(); // Async: Window is closed, but the action will be startet now. - formData.append('output','json'); - this.sendFormData( formData ); - status.close(); + await this.sendFormData( formData,mode ); + progressStatus.close(); } } - sendFormData = function( formData ) { - - this.setLoadStatus(true); + sendFormData = async function( formData,mode ) { - let form = this; + if ( !this.async ) + this.isLoadStatus = true; let api = new Api(); - api.notifyBrowser = form.async; + api.notifyBrowser = this.async; api.validationErrorForField = (name) => { $('.or-input[name='+name+']').addClass('input--error').parent().addClass('input--error').parents('.or-group').removeClass('closed').addClass('show').addClass('open'); } - let result = api.sendData( formData ); - let mode = 0; - result.then( - () => { - form.onSaveHandler.fire(); - if (this.afterSuccess == 'forward') - mode = Form.modes.keepOpen; + try { + await api.sendData( formData ); - // The data was successful saved. - // Now we can close the form. - if (mode == Form.modes.closeAfterSuccess) { - form.onCloseHandler.fire(); + this.onSaveHandler.fire(); + // The data was successful saved. - // clear the dirty flag. - $(form.element).closest('div.panel').find('div.header ul.views li.action.active').removeClass('dirty'); - } + if (mode == Form.modes.closeAfterSuccess) { + this.close(); + } - if (form.afterSuccess) { - if (form.afterSuccess == 'reloadAll') { - Workbench.getInstance().reloadAll(); - } else if (form.afterSuccess == 'forward') { - // Forwarding to next subaction. - if (form.forwardToMethod) - form.forwardTo(formData.get('action'), form.forwardToMethod, formData.get('id'), []); - } - } else { - if (async) - ; // do not reload - else - Workbench.getInstance().reloadViews(); + if (this.afterSuccess) { + if (this.afterSuccess == 'reloadAll') { + Workbench.getInstance().reloadAll(); + } else if (this.afterSuccess == 'forward') { + // Forwarding to next subaction. + if (this.forwardToMethod) + this.forwardTo(formData.get('action'), this.forwardToMethod, formData.get('id'), []); } - //form.onSuccess(); - Callback.dataChangedHandler.fire(); + } else { + if (this.async) + ; // do not reload + else + Workbench.getInstance().reloadViews(); } - ).catch( (reason) => { + //this.onSuccess(); + Callback.dataChangedHandler.fire(); + } finally { + this.isLoadStatus = false; + } + } + + + /** + * Closing the form. + */ + close = function() { + this.onCloseHandler.fire(); + } - }).finally( () => { - form.setLoadStatus(false); - }) + removeErrorMarkers = function() { + $(this.element).find('.or-input--error').removeClass('input--error'); } } diff --git a/modules/cms/ui/themes/default/script/openrat/form.min.js b/modules/cms/ui/themes/default/script/openrat/form.min.js @@ -5,15 +5,15 @@ import Callback from "./callback.min.js"; import Api from "./api.min.js"; export default class Form { static modes = { -showBrowserNotice : 1, -keepOpen : 2, -closeAfterSubmit : 4, -closeAfterSuccess : 8, +keepOpen : 2, +closeAfterSubmit : 4, +closeAfterSuccess : 8, }; constructor() { this.onChangeHandler = new Callback(); this.onSaveHandler = new Callback(); this.onCloseHandler = new Callback(); +this.forwardHandler = new Callback(); this.async = false; this.afterSuccess = ''; this.element = null; @@ -22,7 +22,7 @@ this.mode = Form.modes.keepOpen; this.formMethod = 'GET'; this.forwardToMethod = null; } -setLoadStatus( isLoading ) { +set isLoadStatus( isLoading ) { if ( isLoading ) Workbench.getInstance().startSpinner(); else @@ -30,65 +30,63 @@ Workbench.getInstance().stopSpinner(); } initOnElement( element ) { this.element = element; -this.formMethod = $(this.element).attr('method').toUpperCase(); -this.afterSuccess = $(this.element).data('afterSuccess'); +this.formMethod = $(this.element).attr('method').toUpperCase(); +this.afterSuccess = $(this.element).data('afterSuccess'); this.forwardToMethod = $(this.element).data('forwardTo'); -this.async = $(this.element).data('async'); -let form = this; +this.async = $(this.element).data('async'); if ( $(this.element).data('autosave') ) { this.autosave = true; -$(this.element).find('input[type="checkbox"]').click( function() { -form.submit(Form.modes.keepOpen); +$(this.element).find('input[type="checkbox"]').click( () => { +this.submit(Form.modes.keepOpen); }); -$(this.element).find('select').change( function() { -form.submit(Form.modes.keepOpen); +$(this.element).find('select').change( () => { +this.submit(Form.modes.keepOpen); }); } -$(element).find('.or-act-form-cancel').click( function() { -form.cancel(); +$(element).find('.or-act-form-cancel').click( () => { +this.cancel(); }); -$(element).find('.or-act-form-reset').click( function() { -form.rollback(); +$(element).find('.or-act-form-reset').click( () => { +this.rollback(); }); -$(element).find('.or-act-form-apply').click( function() { -form.submit(Form.modes.keepOpen); +$(element).find('.or-act-form-apply').click( () => { +this.submit(Form.modes.keepOpen); }); -$(element).find('.or-act-form-save').click( function() { -form.submit(); +$(element).find('.or-act-form-save').click( () => { +if ( this.async ) +this.submit( Form.modes.closeAfterSubmit ); +else +this.submit( Form.modes.closeAfterSuccess ); }); -$(element).find('.or-input').change( function() { -form.onChangeHandler.fire(); +$(element).find('.or-input').change( () => { +this.onChangeHandler.fire(); }); -$(element).submit( function( event ) { -if ($(this).data('target')=='view') -{ -form.submit(); +$(element).submit( ( event ) => { +if ( this.async ) +this.submit( Form.modes.closeAfterSubmit ); +else +this.submit( Form.modes.closeAfterSuccess ); event.preventDefault(); -} }); } cancel() { Notice.removeAllNotices(); -this.onCloseHandler.fire(); +this.close(); } rollback() { -this.element.trigger('reset'); +this.element.nodes[0].reset(); } forwardTo(action, subaction, id, data) { +this.forwardHandler.fire( action, subaction, id, data ); } -submit( mode ) { -if ( mode === undefined ) -if ( this.async ) -mode = Form.modes.closeAfterSubmit; -else -mode = Form.modes.closeAfterSuccess; +async submit( mode ) { 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 progressStatus = new Notice(); +progressStatus.setStatus('info'); +progressStatus.inProgress(); +progressStatus.msg = Workbench.language.PROGRESS; +progressStatus.show(); +this.removeErrorMarkers(); let formData = new FormData( $(this.element).get(0) ); if (!formData.has('id') ) formData.append('id',Workbench.state.id); @@ -97,54 +95,52 @@ formData.append('action',Workbench.state.action); if ( this.formMethod == 'GET' ) { this.forwardTo( formData.get('action'), formData.get('subaction'),formData.get('id,'),formData ); -$(status).remove(); +progressStatus.close(); } else { if ( mode == Form.modes.closeAfterSubmit ) -this.onCloseHandler.fire(); -formData.append('output','json'); -this.sendFormData( formData ); -status.close(); +this.close(); +await this.sendFormData( formData,mode ); +progressStatus.close(); } } -sendFormData = function( formData ) { -this.setLoadStatus(true); -let form = this; +sendFormData = async function( formData,mode ) { +if ( !this.async ) +this.isLoadStatus = true; let api = new Api(); -api.notifyBrowser = form.async; +api.notifyBrowser = this.async; api.validationErrorForField = (name) => { $('.or-input[name='+name+']').addClass('input--error').parent().addClass('input--error').parents('.or-group').removeClass('closed').addClass('show').addClass('open'); } -let result = api.sendData( formData ); -let mode = 0; -result.then( -() => { -form.onSaveHandler.fire(); -if (this.afterSuccess == 'forward') -mode = Form.modes.keepOpen; +try { +await api.sendData( formData ); +this.onSaveHandler.fire(); if (mode == Form.modes.closeAfterSuccess) { -form.onCloseHandler.fire(); -$(form.element).closest('div.panel').find('div.header ul.views li.action.active').removeClass('dirty'); +this.close(); } -if (form.afterSuccess) { -if (form.afterSuccess == 'reloadAll') { +if (this.afterSuccess) { +if (this.afterSuccess == 'reloadAll') { Workbench.getInstance().reloadAll(); -} else if (form.afterSuccess == 'forward') { -if (form.forwardToMethod) -form.forwardTo(formData.get('action'), form.forwardToMethod, formData.get('id'), []); +} else if (this.afterSuccess == 'forward') { +if (this.forwardToMethod) +this.forwardTo(formData.get('action'), this.forwardToMethod, formData.get('id'), []); } } else { -if (async) +if (this.async) ; else Workbench.getInstance().reloadViews(); } Callback.dataChangedHandler.fire(); +} finally { +this.isLoadStatus = false; +} } -).catch( (reason) => { -}).finally( () => { -form.setLoadStatus(false); -}) +close = function() { +this.onCloseHandler.fire(); +} +removeErrorMarkers = function() { +$(this.element).find('.or-input--error').removeClass('input--error'); } } \ No newline at end of file diff --git a/modules/cms/ui/themes/default/script/openrat/notice.js b/modules/cms/ui/themes/default/script/openrat/notice.js @@ -46,10 +46,6 @@ export default class Notice { // Close the notice. close() { - /* no effects in jquery slim - this.element.fadeOut('fast', () => { - this.element.remove(); - } );*/ this.element.remove(); } diff --git a/modules/cms/ui/themes/default/script/openrat/view.js b/modules/cms/ui/themes/default/script/openrat/view.js @@ -111,13 +111,13 @@ export default class View { form.onSaveHandler .add( () => { view.onSaveHandler .fire() } ); form.onCloseHandler .add( () => { view.close() } ); - form.forwardTo = function (action, subaction, id, data) { + form.forwardHandler.add( (action, subaction, id, data) => { view.action = action; view.method = subaction; view.id = id; view.params = data; view.loadView(); - } + } ); form.initOnElement(this); }); diff --git a/modules/cms/ui/themes/default/script/openrat/view.min.js b/modules/cms/ui/themes/default/script/openrat/view.min.js @@ -60,13 +60,13 @@ let form = new Form(); form.onChangeHandler.add( () => { view.onChangeHandler.fire() } ); form.onSaveHandler .add( () => { view.onSaveHandler .fire() } ); form.onCloseHandler .add( () => { view.close() } ); -form.forwardTo = function (action, subaction, id, data) { +form.forwardHandler.add( (action, subaction, id, data) => { view.action = action; view.method = subaction; view.id = id; view.params = data; view.loadView(); -} +} ); form.initOnElement(this); }); view.fireViewLoadedEvents( element ); diff --git a/modules/cms/ui/themes/default/script/plugin/jquery-plugin-orLinkify.js b/modules/cms/ui/themes/default/script/plugin/jquery-plugin-orLinkify.js @@ -54,7 +54,6 @@ export default function( options ) case 'post': let api = new Api(); - api.mode = Api.modes.write; let formData = new FormData(); let params = JSON.parse( $link.attr('data-data') ); @@ -72,6 +71,11 @@ export default function( options ) // Submit the form. api.sendData( formData ); + if ( $link.data('afterSuccess') === 'reload' ) + Workbench.getInstance().reloadViews(); + if ( $link.data('afterSuccess') === 'reloadAll' ) + Workbench.getInstance().reloadAll(); + break; case 'edit': diff --git a/modules/cms/ui/themes/default/script/plugin/jquery-plugin-orLinkify.min.js b/modules/cms/ui/themes/default/script/plugin/jquery-plugin-orLinkify.min.js @@ -32,7 +32,6 @@ switch( type ) { case 'post': let api = new Api(); -api.mode = Api.modes.write; let formData = new FormData(); let params = JSON.parse( $link.attr('data-data') ); params.output = 'json'; @@ -44,6 +43,10 @@ formData.set('id',Workbench.state.id); if (!formData.get('action') ) formData.set('action',Workbench.state.action); api.sendData( formData ); +if ( $link.data('afterSuccess') === 'reload' ) +Workbench.getInstance().reloadViews(); +if ( $link.data('afterSuccess') === 'reloadAll' ) +Workbench.getInstance().reloadAll(); break; case 'edit': case 'dialog':