view app/controller/Filter.js @ 1256:f961f94495c8

Remove erroneous error handling. This code seems to expect any LADA validation results coming along with an HTTP status not indicating success, which should not happen. Instead, Ext.JSON.decode() failed because of the non-JSON responseText resulting from other errors.
author Tom Gottfried <tom@intevation.de>
date Fri, 18 Nov 2016 19:46:15 +0100
parents c992e57a9328
children 09d121acda6c
line wrap: on
line source
/* Copyright (C) 2013 by Bundesamt fuer Strahlenschutz
 * Software engineering by Intevation GmbH
 *
 * This file is Free Software under the GNU GPL (v>=3)
 * and comes with ABSOLUTELY NO WARRANTY! Check out
 * the documentation coming with IMIS-Labordaten-Application for details.
 */

/**
 * Controller for the Filter
 * This controller handles all logic related to the filter
 */
Ext.define('Lada.controller.Filter', {
    extend: 'Ext.app.Controller',

    requires: [
        'Lada.view.widget.Messstelle',
        'Lada.view.widget.Status',
        'Lada.view.grid.MessprogrammeList',
        'Lada.view.grid.ProbeList',
        'Lada.view.grid.MessungList',
        'Lada.view.grid.Probenehmer',
        'Lada.view.grid.DatensatzErzeuger',
        'Lada.view.grid.MessprogrammKategorie',
        'Lada.store.MessungenList',
        'Lada.view.window.FilterManagement',
        'Lada.view.window.About',
        'Lada.view.widget.Umwelt'
    ],

    stores: [
        'ProbenList',    // List of found Proben
        'MessprogrammeList' //List of found Messprogramme
    ],

    displayFields: null,

    managementWindow: null,

    mode: 'proben',

    /**
     * Initialize this Controller
     * It has 4 Listeners
     */
    init: function() {
        this.control({
            // CSS like selector to select element in the viewport. See
            // ComponentQuery documentation for more details.
            'filterpanel combobox[name=filter]': {
                // Map Select event
                select: this.selectSql
            },
            'filterpanel button[action=search]': {
                // Map click event on Button.
                click: this.search
            },
            'filterpanel button[action=reset]': {
                // Map click event on Button.
                click: this.reset
            },
            'filterpanel button[action=details]': {
                click: this.showDetails
            },
            'filterpanel button[action=manage]': {
                click: this.showManagement
            },
            'filterpanel checkbox[name=favorites]': {
                change: this.triggerFilterUpdate
            },
            'filterpanel button[action=savedefault]': {
                click: this.saveFilterDefaults
            },
            'filterpanel button[action=resetdefault]': {
                click: this.resetFilterDefaults
            },
            'menuitem[action=about]': {
                // Map click event on Button.
                click: this.about
            }
        });
        this.callParent(arguments);
    },

    /**
     * Function called when the user selects a SQL query in the dropdownlist.
     * The function will hide/display additional element related to the
     * selected search query.
     * It also replaces the Store of the Filteresultgrid.
     * Two possibilities exist to do so: Proben/Messprogramme where dynamic columns exist, but the
     * content remains of the same type and Stammdaten, were columns are fixed but the type might
     * vary between orte, kategorien, ...
     */
    selectSql: function(element, record) {
        var filters = element.up('panel[name=main]').down('panel[name=filtervariables]');
        var filterValues = element.up('panel[name=main]').down('panel[name=filtervalues]');

        var desc = element.up('fieldset').down('displayfield[name=description]');
        if (!record[0]) {
            desc.setValue('');
            return;
        }
        // Set "Filter Auswahl" Description
        desc.setValue(record[0].data.description);

        this.displayFields = record[0].data.results;
        var filterFields = record[0].data.filters;
        var contentPanel = element.up('panel[name=main]').down('panel[name=contentpanel]');
        var queryType = record[0].get('type'); //The type of the query, might be proben, messprogramme,
            // or a stammdatendtype
        var details = element.up('panel[name=main]').down('filterdetails');
        details.setRecord(record[0]);

        this.reset(element);

        contentPanel.removeAll(); //clear the panel: make space for new grids

        // Setup Columns
        if (this.displayFields &&
            this.displayFields.length > 0 &&
            this.displayFields[0].index === 0) {
            this.displayFields.reverse();
        }

        if (queryType == 'probe' ||
            queryType == 'messung' ||
            queryType == 'messprogramm') {
            // Dynamic Grids
            // We need to set both grid and Store.
            var frgrid; // The Resultgrid
            var gridstore; // The Store which will be used in the resultgrid.

            switch (queryType) {
                case 'probe':
                    gridstore = Ext.create('Lada.store.ProbenList');
                    frgrid = Ext.create('Lada.view.grid.ProbeList', {
                        plugins: [{
                            ptype: 'gridrowexpander',
                            gridType: 'Lada.view.grid.Messung',
                            expandOnDblClick: false,
                            gridConfig: {
                                bottomBar: false
                            }
                        }]
                    });
                    break;
                case 'messung':
                    gridstore = Ext.create('Lada.store.MessungenList');
                    frgrid = Ext.create('Lada.view.grid.MessungList', {
                        plugins: [{
                            ptype: 'gridrowexpander',
                            gridType: 'Lada.view.grid.Messwert',
                            expandOnDblClick: false,
                            gridConfig: {
                                bottomBar: false
                            }
                        }]
                    });
                    break;
                case 'messprogramm':
                    gridstore = Ext.create('Lada.store.MessprogrammeList');
                    frgrid = Ext.create('Lada.view.grid.MessprogrammeList');
                    break;
            }

            if (gridstore) {
                frgrid.setStore(gridstore);
            }

            contentPanel.add(frgrid);
        }
        else {
            // Grids which are not build with dynamic columns
            // The store is configured in each grid, hence we only need to set the
            // grid
            var resultGrid;
            switch (queryType) {
                case 'messprogrammkategorie':
                    resultGrid = Ext.create('Lada.view.grid.MessprogrammKategorie');
                    break;
                case 'datensatzerzeuger':
                    resultGrid = Ext.create('Lada.view.grid.DatensatzErzeuger');
                    break;
                case 'ort':
                    resultGrid = Ext.create('Lada.view.panel.Ort');
                    break;
                case 'probenehmer':
                    resultGrid = Ext.create('Lada.view.grid.Probenehmer');
                    break;
            }
            if (resultGrid) {
                contentPanel.add(resultGrid);
            }
        }
        /* Setup Filters
         *
         * Allowed types are
         * * text
         * * number
         * * datetime
         * * bool
         * * listmst
         * * listumw
         * * listver
         * * listdbasis
         * * listnetz
         *
         * Iterate over all configured filters and add filters dynamically
         *
         *  1. Empty filters
         */
        filterValues.removeAll();
        var hide = true;
        /* 2. Iterate over all configured filters */
        var j;
        for (j = 0; j < filterFields.length; j++) {
            var type = filterFields[j].type;
            var name = filterFields[j].dataIndex;
            var label = filterFields[j].label;
            var multi = filterFields[j].multiselect;
            var filterId = filterFields[j].id;
            var field = null;
            var value = filterFields[j].value;
            if (type === 'text') {
                field = Ext.create('Ext.form.field.Text', {
                    name: name,
                    fieldLabel: label,
                    filterId: filterId,
                    value: value
                });
            }
            else if (type === 'number') {
                field = Ext.create('Ext.form.field.Number', {
                    name: name,
                    labelWidth: 135,
                    fieldLabel: label,
                    filterId: filterId,
                    value: value
                });
            }
            else if (type === 'datetime') {
                field = Ext.create('Lada.view.widget.Datetime', {
                    name: name,
                    labelWidth: 135,
                    fieldLabel: label,
                    filterId: filterId,
                    value: value
                });
            }
            else if (type === 'bool') {
                field = Ext.create('Lada.view.widget.Testdatensatz', {
                    name: name,
                    labelWidth: 135,
                    fieldLabel: label,
                    value: value,
                    filterId: filterId,
                    emptyText: ''
                });
            }
            else if (type === 'listmst') {
                field = Ext.create('Lada.view.widget.Messstelle', {
                    name: name,
                    labelWidth: 135,
                    fieldLabel: label,
                    multiSelect: multi,
                    forceSelection: false,
                    filterId: filterId,
                    value: value
                });
            }
            else if (type === 'listumw') {
                field = Ext.create('Lada.view.widget.Umwelt', {
                    name: name,
                    labelWidth: 135,
                    fieldLabel: label,
                    value: value,
                    filterId: filterId,
                    forceSelection: false,
                    multiSelect: multi,
                    displayTpl: Ext.create('Ext.XTemplate',
                     '<tpl for=".">{id} </tpl>')
                });
            }
            else if (type === 'listdbasis') {
                field = Ext.create('Lada.view.widget.Datenbasis', {
                    name: name,
                    labelWidth: 135,
                    fieldLabel: label,
                    forceSelection: false,
                    value: value,
                    filterId: filterId,
                    multiSelect: multi
                });
            }
            else if (type === 'listver') {
                field = Ext.create('Lada.view.widget.Verwaltungseinheit', {
                    name: name,
                    labelWidth: 135,
                    fieldLabel: label,
                    forceSelection: false,
                    value: value,
                    filterId: filterId,
                    multiSelect: multi
                });
            }
            else if (type === 'listnetz') {
                field = Ext.create('Lada.view.widget.Netzbetreiber', {
                    name: name,
                    labelWidth: 135,
                    fieldLabel: label,
                    forceSelection: false,
                    value: value,
                    filterId: filterId,
                    multiSelect: multi
                });
            }
            else if (type === 'liststatus') {
                field = Ext.create('Lada.view.widget.Status', {
                    name: name,
                    store: Ext.StoreManager.get('statuswerte'),
                    labelWidth: 135,
                    fieldLabel: label,
                    forceSelection: false,
                    value: value,
                    filterId: filterId,
                    editable: false,
                    multiSelect: multi
                });
            }
            if (field) {
                filterValues.add(field);
                filters.show();
                hide = false;
            }
        }
        if (hide) {
            filters.hide();
        }
    },

    /**
     * Function is called when the user clicks the search button. The function
     * will perform a search to the server on refreshes the result list.
     * To do so it replaces the store of the Resultgrids.
     */
    search: function(element) {
        var resultGrid = element.up('panel[name=main]').down('panel[name=contentpanel]').down('grid');
        var filters = element.up('panel[name=main]').down('panel[name=filtervalues]');
        var search = element.up('fieldset').down('combobox[name=filter]');

        if (!search.getValue()) {
            return;
        }
        //Type of the search Proben/Messprogramme/Stammdaten
        var type = search.store.getById(search.getValue()).get('type');

        // Get search parameters:
        var searchParams = {};
        searchParams['qid'] = search.getValue();
        for (var i = filters.items.length - 1; i >= 0; i--) {
            var filter = filters.items.items[i];
            var value = filter.getValue();
            if (value instanceof Array) {
                value = value.join(',');
            }
            searchParams[filter.getName()] = value;
        }

        //Store depends of the Type...
        // TODO the switchcasese should be unified withj those in SelectSql
        switch (type) {
            case 'probe':
                sname = 'Lada.store.ProbenList';
                break;
            case 'messung':
                sname = 'Lada.store.MessungenList';
                break;
            case 'messprogramm':
                sname = 'Lada.store.MessprogrammeList';
                break;
            case 'messprogrammkategorie':
                sname = 'Lada.store.MessprogrammKategorie';
                break;
            case 'datensatzerzeuger':
                sname = 'Lada.store.DatensatzErzeuger';
                break;
            case 'ort':
                sname = 'Lada.store.Orte';
                break;
            case 'probenehmer':
                sname = 'Lada.store.Probenehmer';
                break;
        }

        // Find the store or create a new one.
        var store = Ext.StoreManager.lookup(sname);
        if (!store) {
            store = Ext.create(sname);
        }
        if (store) {
            store.addListener('beforeload', this.loadingAnimationOn, resultGrid);
            store.addListener('load', this.loadingAnimationOff, resultGrid);
            if (type === 'ort') {
                var panel = resultGrid.up('ortpanel');
                store.addListener('load', panel.down('map').addLocations, panel.down('map'));
                panel.connectListeners();
            }

            resultGrid.setStore(store);
            //TODO: Check if this is still necessary, as a Grid exists
            // for each Type.

            if (resultGrid.isDynamic) {
               //only the dynamic resultgrid can and needs to do the following:
               resultGrid.setupColumns(this.displayFields);
            }

            resultGrid.getStore().proxy.extraParams = searchParams;
            resultGrid.getStore().load();
            resultGrid.show();
        }
    },

    /**
     * Enable the Loading Animation of the Grid.
     */
    loadingAnimationOn: function(store, operation) {
        // this = resultgrid because of the scope which was set in addListener
        this.setLoading(true);
    },

    /**
     * Disable the Loading Animation of the Grid.
     */
    loadingAnimationOff: function(store, operation) {
        // this = resultgrid because of the scope which was set in addListener
        this.setLoading(false);
    },

    /**
     * This function resets the filters
     */
    reset: function(element) {
        var filters = element.up('panel[name=main]').down('panel[name=filtervalues]');
        var search = element.up('fieldset').down('combobox[name=filter]');

        //Type of the search Proben/Messprogramme/Stammdaten
        var qId = search.getValue();
        var query = search.store.getById(qId);
        for (var i = filters.items.length - 1; i >= 0; i--) {
            var filter = filters.items.items[i];
            for (var j = 0; j < query.data.filters.length; j++) {
                if (filter.filterId === query.data.filters[j].id) {
                    filter.setValue(query.data.filters[j].value);
                }
            }
        }
    },
    /**
     * This Function is supposed to handle the About action
     * It has no function yet.
     */
    about: function() {
        var win = Ext.create('Lada.view.window.About');
        win.show();
    },

    showDetails: function(element) {
        var search = element.up('fieldset').down('combobox[name=filter]');
        var details = element.up('panel[name=main]').down('filterdetails');

        //Type of the search Proben/Messprogramme/Stammdaten
        var record = search.store.getById(search.getValue());
        details.setRecord(record);
        if (element.pressed) {
            details.show();
        }
        else {
            details.hide();
        }
    },

    showManagement: function() {
        if (!this.managementWindow) {
            this.managementWindow = Ext.create('Lada.view.window.FilterManagement');
        }
        this.managementWindow.show();
    },

    triggerFilterUpdate: function(checkbox) {
        var cbox = checkbox.up('fieldset').down('combobox[name=filter]');
        this.updateFilter(cbox);
    },

    updateFilter: function(combobox) {
        var store;
        var entries;
        var fav = combobox.up('fieldset').down('checkbox[name=favorites]');
        if (this.mode === 'proben') {
            store = Ext.StoreManager.get('probequeries');
        }
        else if (this.mode === 'messprogramme') {
            store = Ext.StoreManager.get('messprogrammqueries');
        }
        else if (this.mode === 'stammdaten') {
            store = Ext.StoreManager.get('stammdatenqueries');
        }
        else if (this.mode === 'messungen') {
            store = Ext.StoreManager.get('messungqueries');
        }
        else {
            return;
        }
        var allEntries = store.queryBy(function() {
            return true;
        });
        var favorites = store.queryBy(function(record) {
            if (record.get('favorite')) {
                return true;
            }
        });
        combobox.store.removeAll();
        if (fav.checked && favorites.getCount() > 0) {
            combobox.store.add(favorites.items);
        }
        else {
            combobox.store.add(allEntries.items);
            if (favorites.getCount() === 0) {
                fav.setValue(false);
                fav.disable();
            }
            else {
                fav.enable();
            }
        }
        combobox.select(combobox.store.getAt(0));
        combobox.fireEvent('select', combobox, [combobox.store.getAt(0)]);
    },

    saveFilterDefaults: function(button) {
        var filters = button.up('fieldset').down('panel[name=filtervalues]');

        var search = button.up('fieldset').down('combobox[name=filter]');

        //Type of the search Proben/Messprogramme/Stammdaten
        var qId = search.getValue();
        var query = search.store.getById(qId);
        var ndx = 0;
        for (var i = filters.items.items.length - 1; i >= 0; i--) {
            var filter = filters.items.items[i];
            var filterId = filter.filterId;
            var value = filter.getValue();
            if (value instanceof Array) {
                value = value.join(',');
            }
            Ext.Ajax.request({
                url: 'lada-server/rest/filter',
                method: 'PUT',
                jsonData: {
                    id: filterId,
                    value: value
                },
                success: function() {
                    ndx++;
                    for (var j = 0; j < query.data.filters.length; i++) {
                        if (query.data.filters[j].id === filterId) {
                            query.data.filters[j].value = value;
                            break;
                        }
                    }
                    if (ndx < filters.items.items.length - 1) {
                        return;
                    }
                    if (query.get('type') === 'probe') {
                        Ext.StoreManager.get('probequeries').load();
                    }
                    else if (query.get('type') === 'messprogramm') {
                        Ext.StoreManager.get('messprogrammqueries').load();
                    }
                    else if (query.get('type') === 'messung') {
                        Ext.StoreManager.get('messungqueries').load();
                    }
                    else {
                        Ext.StoreManager.get('stammdatenqueries').load();
                    }
                }
            });
        }
    },

    resetFilterDefaults: function(button) {
        var filters = button.up('fieldset').down('panel[name=filtervalues]');

        var search = button.up('fieldset').down('combobox[name=filter]');

        var qId = search.getValue();
        var query = search.store.getById(qId);
        for (var i = filters.items.length - 1; i >= 0; i--) {
            var filter = filters.items.items[i];
            var filterId = filter.filterId;
            var value = filter.getValue();
            if (value instanceof Array) {
                value = value.join(',');
            }
            Ext.Ajax.request({
                url: 'lada-server/rest/filter/' + filterId,
                method: 'DELETE',
                success: function(response) {
                    var json = Ext.decode(response.responseText);
                    if (!json.success) {
                        return;
                    }
                    filter.setValue(json.data.value);
                    for (var j = 0; j < query.data.filters.length; j++) {
                        if (query.data.filters[j].id === json.data.id) {
                            query.data.filters[j].value = json.data.value;
                            break;
                        }
                    }
                    if (query.get('type') === 'probe') {
                        Ext.StoreManager.get('probequeries').reload();
                    }
                    else if (query.get('type') === 'messprogramm') {
                        Ext.StoreManager.get('messprogrammqueries').reload();
                    }
                    else if (query.get('type') === 'messung') {
                        Ext.StoreManager.get('messungqueries').reload();
                    }
                    else {
                        Ext.StoreManager.get('stammdatenqueries').reload();
                    }
                }
            });
        }
    }
});

http://lada.wald.intevation.org