raimund@548: /* Copyright (C) 2013 by Bundesamt fuer Strahlenschutz
raimund@548:  * Software engineering by Intevation GmbH
raimund@548:  *
raimund@548:  * This file is Free Software under the GNU GPL (v>=3)
raimund@548:  * and comes with ABSOLUTELY NO WARRANTY! Check out
raimund@548:  * the documentation coming with IMIS-Labordaten-Application for details.
raimund@548:  */
raimund@548: 
raimund@548: /**
raimund@548:  * Controller for the Filter
raimund@548:  * This controller handles all logic related to the filter
raimund@548:  */
raimund@548: Ext.define('Lada.controller.Filter', {
raimund@548:     extend: 'Ext.app.Controller',
raimund@548: 
raimund@548:     requires: [
raimund@548:         'Lada.view.widget.Messstelle',
raimund@548:         'Lada.view.widget.Umwelt'
raimund@548:     ],
raimund@548: 
raimund@548:     stores: [
raimund@548:         'ProbenList',    // List of found Proben
raimund@548:         'Queries'
raimund@548:     ],
raimund@548: 
raimund@548:     init: function() {
raimund@548:         this.control({
raimund@548:             // CSS like selector to select element in the viewport. See
raimund@548:             // ComponentQuery documentation for more details.
raimund@548:             'combobox[name=filter]': {
raimund@548:                 // Map Doubleclick on rows of the probenlist.
raimund@548:                 select: this.selectSql
raimund@548:             },
raimund@548:             'button[action=search]': {
raimund@548:                 // Map click event on Button.
raimund@548:                 click: this.search
raimund@548:             },
raimund@548:             'button[action=reset]': {
raimund@548:                 // Map click event on Button.
raimund@548:                 click: this.reset
raimund@548:             },
raimund@548:             'menuitem[action=about]': {
raimund@548:                 // Map click event on Button.
raimund@548:                 click: this.about
raimund@548:             }
raimund@548:         });
raimund@548:         this.callParent(arguments);
raimund@548:     },
raimund@548: 
raimund@548:     /**
raimund@548:      * Function called when the user selects a SQL query in the dropdownlist.
raimund@548:      * The function will hide/display additional element related to the
raimund@548:      * selected search query
raimund@548:      */
raimund@548:     selectSql: function(element, record) {
raimund@548:         var resultGrid = element.up('panel[name=main]').down('filterresultgrid');
raimund@548:         var filters = element.up('panel[name=main]').down('fieldset[name=filtervariables]');
raimund@548:         var columns = element.up('fieldset').down('displayfield[name=columns]');
raimund@548:         var desc = element.up('fieldset').down('displayfield[name=description]');
raimund@548:         var displayFields = record[0].data.results;
raimund@548:         var filterFields = record[0].data.filters;
raimund@548: 
raimund@548:         this.reset();
raimund@548: 
raimund@548:         var columnString = [];
raimund@548:         for (var i = 0; i < displayFields.length; i++) {
raimund@548:             columnString.push(displayFields[i].header);
raimund@548:         }
raimund@548:         columns.setValue(columnString.join(', '));
raimund@548:         desc.setValue(record[0].data.description);
raimund@548: 
raimund@548:         // Setup Columns of the probenlist
raimund@548:         displayFields.reverse();
raimund@548:         resultGrid.setupColumns(displayFields);
raimund@548: 
raimund@548:         // Setup Filters of the probenlist
raimund@548:         //
raimund@548:         // Allowed types are
raimund@548:         // * text
raimund@548:         // * number
raimund@548:         // * datetime
raimund@548:         // * bool
raimund@548:         // * listmst
raimund@548:         // * listumw
raimund@548:         // * listver
raimund@548:         // * listdbasis
raimund@548:         // * listnetz
raimund@548:         //
raimund@548:         // Iterate over all configured filters and add filters dynamically
raimund@548:         //
raimund@548:         // 1. Empty filters
raimund@548:         filters.removeAll();
raimund@548:         var hide = true;
raimund@548:         // 2. Iterate over all configured filters
raimund@548:         var j;
raimund@548:         for (j = 0; j < filterFields.length; j++) {
raimund@548:             var type = filterFields[j].type;
raimund@548:             var name = filterFields[j].dataIndex;
raimund@548:             var label = filterFields[j].label;
raimund@548:             var multi = filterFields[j].multiSelect;
raimund@548:             var field = null;
raimund@548:             if (type === 'text') {
raimund@548:                 field = Ext.create('Ext.form.field.Text', {
raimund@548:                     name: name,
raimund@548:                     fieldLabel: label
raimund@548:                 });
raimund@548:             }
raimund@548:             else if (type === 'number') {
raimund@548:                 field = Ext.create('Ext.form.field.Number', {
raimund@548:                     name: name,
raimund@548:                     labelWidth: 135,
raimund@548:                     fieldLabel: label
raimund@548:                 });
raimund@548:             }
raimund@548:             else if (type === 'datetime') {
raimund@548:                 field = Ext.create('Lada.view.widgets.Datetime', {
raimund@548:                     name: name,
raimund@548:                     labelWidth: 135,
raimund@548:                     fieldLabel: label
raimund@548:                 });
raimund@548:             }
raimund@548:             else if (type === 'bool') {
raimund@548:                 field = Ext.create('Lada.view.widgets.Testdatensatz', {
raimund@548:                     name: name,
raimund@548:                     labelWidth: 135,
raimund@548:                     fieldLabel: label,
raimund@548:                     emptyText: ''
raimund@548:                 });
raimund@548:             }
raimund@548:             else if (type === 'listmst') {
raimund@548:                 field = Ext.create('Lada.view.widgets.Messstelle', {
raimund@548:                     name: name,
raimund@548:                     labelWidth: 135,
raimund@548:                     fieldLabel: label,
raimund@548:                     multiSelect: multi
raimund@548:                 });
raimund@548:             }
raimund@548:             else if (type === 'listumw') {
raimund@548:                 field = Ext.create('Lada.view.widgets.Umwelt', {
raimund@548:                     name: name,
raimund@548:                     labelWidth: 135,
raimund@548:                     fieldLabel: label,
raimund@548:                     multiSelect: multi
raimund@548:                 });
raimund@548:             }
raimund@548:             else if (type === 'listdbasis') {
raimund@548:                 field = Ext.create('Lada.view.widgets.Datenbasis', {
raimund@548:                     name: name,
raimund@548:                     labelWidth: 135,
raimund@548:                     fieldLabel: label,
raimund@548:                     multiSelect: multi
raimund@548:                 });
raimund@548:             }
raimund@548:             else if (type === 'listver') {
raimund@548:                 field = Ext.create('Lada.view.widgets.Verwaltungseinheit', {
raimund@548:                     name: name,
raimund@548:                     labelWidth: 135,
raimund@548:                     fieldLabel: label,
raimund@548:                     multiSelect: multi
raimund@548:                 });
raimund@548:             }
raimund@548:             else if (type === 'listnetz') {
raimund@548:                 field = Ext.create('Lada.view.widgets.Netzbetreiber', {
raimund@548:                     name: name,
raimund@548:                     labelWidth: 135,
raimund@548:                     fieldLabel: label,
raimund@548:                     multiSelect: multi
raimund@548:                 });
raimund@548:             }
raimund@548:             if (field) {
raimund@548:                 filters.add(field);
raimund@548:                 filters.show();
raimund@548:                 hide = false;
raimund@548:             }
raimund@548:         }
raimund@548:         if (hide) {
raimund@548:             filters.hide();
raimund@548:         }
raimund@548:     },
raimund@548: 
raimund@548:     /**
raimund@548:      * Function is called when the user clicks the search button. The function
raimund@548:      * will perform a search to the server on refreshes the result list.
raimund@548:      */
raimund@548:     search: function(element) {
raimund@548:         var resultGrid = element.up('panel[name=main]').down('filterresultgrid');
raimund@548:         var filters = element.up('panel[name=main]').down('fieldset[name=filtervariables]');
raimund@548:         var search = element.up('fieldset').down('combobox[name=filter]');
raimund@548: 
raimund@548:         // Get search parameters:
raimund@548:         var searchParams = {};
raimund@548:         searchParams['qid'] = search.getValue();
raimund@548:         for (var i = filters.items.length - 1; i >= 0; i--) {
raimund@548:             var filter = filters.items.items[i];
raimund@548:             var value = filter.getValue();
raimund@548:             if (value instanceof Array) {
raimund@548:                 value = value.join(',');
raimund@548:             }
raimund@548:             searchParams[filter.getName()] = value;
raimund@548:         }
raimund@548:         resultGrid.getStore().load({
raimund@548:             params: searchParams
raimund@548:         });
raimund@548:         resultGrid.show();
raimund@548:     },
raimund@548: 
raimund@548:     reset: function() {
raimund@548:         // var buttons = Ext.getCmp('SearchBtnPanel');
raimund@548:         // var result = Ext.getCmp('result');
raimund@548:         // for (var i = 0; i < queries.length; ++i) {
raimund@548:         //     var toHide = Ext.getCmp(queries[i]);
raimund@548:         //     toHide.hide();
raimund@548:         // }
raimund@548:         // result.hide();
raimund@548:         // buttons.hide();
raimund@548:     },
raimund@548: 
raimund@548:     about: function() {
raimund@548:         var info = this.getInfoStore();
raimund@548:         Ext.widget('about', {
raimund@548:             info: info
raimund@548:         });
raimund@548:     }
raimund@548: });