raimund@1076: /* Copyright (C) 2013 by Bundesamt fuer Strahlenschutz
raimund@1076:  * Software engineering by Intevation GmbH
raimund@1076:  *
raimund@1076:  * This file is Free Software under the GNU GPL (v>=3)
raimund@1076:  * and comes with ABSOLUTELY NO WARRANTY! Check out
raimund@1076:  * the documentation coming with IMIS-Labordaten-Application for details.
raimund@1076:  */
raimund@1076: 
raimund@1076: /**
raimund@1076:  * Controller for the MessungList result grid.
raimund@1076:  */
raimund@1076: Ext.define('Lada.controller.grid.MessungList', {
raimund@1076:     extend: 'Ext.app.Controller',
raimund@1076:     requires: [
tom@1157:         'Lada.view.window.SetStatus',
raimund@1076:         'Lada.view.window.ProbeEdit'
raimund@1076:     ],
raimund@1076: 
raimund@1076:     /**
raimund@1076:      * Initialize the Controller with listeners
raimund@1076:      */
raimund@1076:     init: function() {
raimund@1076:         this.control({
raimund@1076:             'messunglistgrid': {
raimund@1076:                 itemdblclick: this.editItem,
raimund@1076:                 select: this.activateButtons,
raimund@1076:                 deselect: this.deactivateButtons
raimund@1082:             },
raimund@1082:             'messunglistgrid toolbar button[action=setstatus]': {
raimund@1082:                 click: this.setStatus
raimund@1076:             }
raimund@1076:         });
raimund@1076:         this.callParent(arguments);
raimund@1076:     },
raimund@1076: 
raimund@1076:     /**
raimund@1082:      * Sets the Status on Bulk
raimund@1082:      **/
raimund@1082:     setStatus: function(button) {
raimund@1082:         //disable Button and setLoading...
raimund@1082: 
raimund@1082:         var grid = button.up('grid');
raimund@1082:         var selection = grid.getView().getSelectionModel().getSelection();
raimund@1082:         var i18n = Lada.getApplication().bundle;
raimund@1082: 
raimund@1082:         var win = Ext.create('Lada.view.window.SetStatus', {
raimund@1082:             title: i18n.getMsg('statusSetzen.win.title'),
raimund@1082:             grid: grid,
raimund@1082:             modal: true,
raimund@1082:             selection: selection
raimund@1082:         });
raimund@1082: 
raimund@1082:         win.show();
raimund@1082: 
raimund@1082:     },
raimund@1082: 
raimund@1082: 
raimund@1082:     /**
raimund@1076:      * This function is called after a Row in the
raimund@1076:      * {@link Lada.view.grid.ProbeList}
raimund@1076:      * was double-clicked.
raimund@1076:      * The function opens a {@link Lada.view.window.ProbeEdit}
raimund@1076:      * or a {@link Lada.view.window.Messprogramm}.
raimund@1076:      * To determine which window has to be opened, the function
raimund@1076:      * analyse the records modelname.
raimund@1076:      */
raimund@1076:     editItem: function(grid, record) {
raimund@1076:         var probeRecord = Ext.create('Lada.model.ProbeList');
raimund@1076:         probeRecord.setId(record.get('probeId'));
raimund@1076:         probeRecord.set('owner', record.get('owner'));
raimund@1076:         probeRecord.set('readonly', record.get('readonly'));
raimund@1076: 
raimund@1076:         var probeWin = Ext.create('Lada.view.window.ProbeEdit', {
raimund@1076:             record: probeRecord,
raimund@1076:             style: 'z-index: -1;' //Fixes an Issue where windows could not be created in IE8
raimund@1076:         });
raimund@1076: 
raimund@1076:         probeWin.setPosition(30);
raimund@1076:         probeWin.show();
raimund@1076:         probeWin.initData();
raimund@1076: 
raimund@1076:         Ext.ClassManager.get('Lada.model.Probe').load(record.get('probeId'), {
raimund@1076:             failure: function(record, action) {
raimund@1076:                 me.setLoading(false);
raimund@1076:                 // TODO
raimund@1076:                 console.log('An unhandled Failure occured. See following Response and Record');
raimund@1076:                 console.log(action);
raimund@1076:                 console.log(record);
raimund@1076:             },
raimund@1076:             success: function(precord, response) {
raimund@1076:                 var messungWin = Ext.create('Lada.view.window.MessungEdit', {
raimund@1120:                     parentWindow: probeWin,
raimund@1076:                     probe: precord,
raimund@1076:                     record: record,
raimund@1076:                     grid: grid
raimund@1076:                 });
raimund@1076:                 messungWin.show();
raimund@1076:                 messungWin.setPosition(window.innerWidth - 30 - messungWin.width);
raimund@1076:                 messungWin.initData();
raimund@1076:             }
raimund@1076:         });
raimund@1076:     },
raimund@1076: 
raimund@1076:     /**
raimund@1076:      * Send the selection to a Printservice
raimund@1076:      */
raimund@1076:     printSelection: function(button) {
raimund@1076: 
raimund@1076:         //disable Button and setLoading...
raimund@1076:         button.disable();
raimund@1076:         button.setLoading(true);
raimund@1076: 
raimund@1076:         var grid = button.up('grid');
raimund@1076:         var selection = grid.getView().getSelectionModel().getSelection();
raimund@1076:         var i18n = Lada.getApplication().bundle;
raimund@1076:         var me = this;
raimund@1076:         var columns = [];
raimund@1076:         var columnNames = [];
raimund@1076:         var visibleColumns = [];
raimund@1076:         var displayName = '';
raimund@1076:         var data = [];
raimund@1076: 
raimund@1076:         // Write the columns to an array
raimund@1076:         try {
raimund@1076:             for (key in selection[0].data) {
raimund@1076:                 // Do not write owner or readonly or id
raimund@1076:                 if (["owner", "readonly", "id", "probeId"].indexOf(key) == -1){
raimund@1076:                     columns.push(key);
raimund@1076:                 }
raimund@1076:             }
raimund@1076:         }
raimund@1076:         catch (e) {
raimund@1076:             console.log(e);
raimund@1076:         }
raimund@1076: 
raimund@1076:         //Retrieve visible columns' id's and names.
raimund@1076:         // and set displayName
raimund@1076:         try {
raimund@1076:             var grid = button.up('grid');
raimund@1076:             var cman = grid.columnManager;
raimund@1076:             var cols = cman.getColumns();
raimund@1076: 
raimund@1076:             displayName = grid.down('tbtext').text;
raimund@1076: 
raimund@1076:             for (key in cols) {
raimund@1076:                 if (cols[key].dataIndex) {
raimund@1076:                     visibleColumns[cols[key].dataIndex] = cols[key].text;
raimund@1076:                 }
raimund@1076:             }
raimund@1076:         }
raimund@1076:         catch (e) {
raimund@1076:             console.log(e);
raimund@1076:         }
raimund@1076: 
raimund@1076: 
raimund@1076:         // Retrieve Data from selection
raimund@1076:         try {
raimund@1076:             for (item in selection) {
raimund@1076:                 var row = selection[item].data;
raimund@1076:                 var out = [];
raimund@1076:                 //Lookup every column and write to data array.
raimund@1076:                 for (key in columns){
raimund@1076:                     var attr = columns[key];
raimund@1076:                     //Only write data to output when the column is not hidden.
raimund@1076:                     if (row[attr] != null &&
raimund@1076:                         visibleColumns[attr] != null) {
raimund@1076:                         out.push(row[attr].toString());
raimund@1076:                     }
raimund@1076:                     else if (visibleColumns[attr] != null) {
raimund@1076:                         out.push('');
raimund@1076:                     }
raimund@1076:                 }
raimund@1076:                 data.push(out);
raimund@1076:             }
raimund@1076:         }
raimund@1076:         catch (e){
raimund@1076:             console.log(e);
raimund@1076:         }
raimund@1076: 
raimund@1076:         //Retrieve the names of the columns.
raimund@1076:         try {
raimund@1076:             var grid = button.up('grid');
raimund@1076:             var cman = grid.columnManager;
raimund@1076:             var cols = cman.getColumns();
raimund@1076:             //Iterate columns and find column names for the key...
raimund@1076:             // This WILL run into bad behaviour when column-keys exist twice.
raimund@1076:             for (key in columns){
raimund@1076:                 for (k in cols){
raimund@1076:                     if (cols[k].dataIndex == columns[key]){
raimund@1076:                         columnNames.push(cols[k].text);
raimund@1076:                         break;
raimund@1076:                     }
raimund@1076:                 }
raimund@1076:             }
raimund@1076:         }
raimund@1076:         catch (e) {
raimund@1076:             console.log(e);
raimund@1076:         }
raimund@1076: 
raimund@1076:         var printData = {
raimund@1076:             'layout': 'A4 landscape',
raimund@1076:             'outputFormat': 'pdf',
raimund@1076:             'attributes': {
raimund@1076:                 'title': 'Auszug aus LADA',
raimund@1076:                 'displayName': displayName,
raimund@1076:                 'table': {
raimund@1076:                     'columns': columnNames,
raimund@1076:                     'data': data
raimund@1076:                 }
raimund@1076:             }
raimund@1076:         }
raimund@1076: 
raimund@1076:         Ext.Ajax.request({
raimund@1076:             url: 'lada-printer/buildreport.pdf',
raimund@1076:             //configure a proxy in apache conf!
raimund@1076:             jsonData: printData,
raimund@1076:             binary: true,
raimund@1076:             success: function(response) {
raimund@1076:                 var content = response.responseBytes;
raimund@1076:                 var filetype = response.getResponseHeader('Content-Type');
raimund@1076:                 var blob = new Blob([content],{type: filetype});
raimund@1076:                 saveAs(blob, 'lada-print.pdf');
raimund@1076:                 button.enable();
raimund@1076:                 button.setLoading(false);
raimund@1076:             },
raimund@1076:             failure: function(response) {
raimund@1076:                 console.log('failure');
raimund@1076:                 // Error handling
raimund@1076:                 // TODO
raimund@1076:                 //console.log(response.responseText)
raimund@1076:                 button.enable();
raimund@1076:                 button.setLoading(false);
raimund@1076:                 if (response.responseText) {
raimund@1076:                     try {
raimund@1076:                         var json = Ext.JSON.decode(response.responseText);
raimund@1076:                     }
raimund@1076:                     catch(e){
raimund@1076:                         console.log(e);
raimund@1076:                     }
raimund@1076:                 }
raimund@1076:                 if (json) {
raimund@1076:                     if(json.errors.totalCount > 0 || json.warnings.totalCount > 0){
raimund@1076:                         formPanel.setMessages(json.errors, json.warnings);
raimund@1076:                     }
raimund@1076:                     if(json.message){
raimund@1076:                         Ext.Msg.alert(Lada.getApplication().bundle.getMsg('err.msg.generic.title')
raimund@1076:                             +' #'+json.message,
raimund@1076:                             Lada.getApplication().bundle.getMsg(json.message));
raimund@1076:                     } else {
raimund@1076:                         Ext.Msg.alert(i18n.getMsg('err.msg.generic.title'),
raimund@1076:                             i18n.getMsg('err.msg.print.noContact'));
raimund@1076:                     }
raimund@1076:                 } else {
raimund@1076:                     Ext.Msg.alert(i18n.getMsg('err.msg.generic.title'),
raimund@1076:                     i18n.getMsg('err.msg.print.noContact'));
raimund@1076:                 }
raimund@1076:             }
raimund@1076:         });
raimund@1076:     },
raimund@1076: 
raimund@1076:     /**
raimund@1076:      * Toggles the buttons in the toolbar
raimund@1076:      **/
raimund@1076:     activateButtons: function(rowModel, record) {
raimund@1076:         var grid = rowModel.view.up('grid');
raimund@1076:         this.buttonToggle(true, grid);
raimund@1076:     },
raimund@1076: 
raimund@1076:     /**
raimund@1076:      * Toggles the buttons in the toolbar
raimund@1076:      **/
raimund@1076:     deactivateButtons: function(rowModel, record) {
raimund@1076:         var grid = rowModel.view.up('grid');
raimund@1076:         // Only disable buttons when nothing is selected
raimund@1076:         if (rowModel.selected.items == 0) {
raimund@1076:             this.buttonToggle(false, grid);
raimund@1076:         }
raimund@1076:     },
raimund@1076: 
raimund@1076:     /**
raimund@1076:      * Enables/Disables a set of buttons
raimund@1076:      **/
raimund@1076:     buttonToggle: function(enabled, grid) {
raimund@1076:         if (!enabled) {
raimund@1076:             grid.down('button[action=print]').disable();
raimund@1082:             grid.down('button[action=setstatus]').disable();
raimund@1076:         }
raimund@1076:         else {
raimund@1076:             grid.down('button[action=print]').enable();
raimund@1076:             // TODO: enable button only on messungen with owner == true and
raimund@1076:             // readonly == false
raimund@1082:             grid.down('button[action=setstatus]').enable();
raimund@1076:         }
raimund@1076:     },
raimund@1076: 
raimund@1076:     reload: function(btn) {
raimund@1076:         if (btn === 'yes') {
raimund@1076:             location.reload();
raimund@1076:         }
raimund@1076:     }
raimund@1076: });