raimund@587: /* Copyright (C) 2013 by Bundesamt fuer Strahlenschutz raimund@587: * Software engineering by Intevation GmbH raimund@587: * raimund@587: * This file is Free Software under the GNU GPL (v>=3) raimund@587: * and comes with ABSOLUTELY NO WARRANTY! Check out raimund@587: * the documentation coming with IMIS-Labordaten-Application for details. raimund@587: */ raimund@587: dustin@742: /** dustin@742: * This is a controller for a grid of Orte dustin@742: */ dustin@1012: Ext.define('Lada.controller.grid.Ortszuordnung', { raimund@587: extend: 'Ext.app.Controller', raimund@587: raimund@602: requires: [ mkrambach@1279: 'Lada.view.window.Ortszuordnung', mkrambach@1288: 'Lada.view.window.Ortserstellung', raimund@1287: 'Lada.view.window.OrtFilter' raimund@602: ], raimund@602: raimund@1287: resultPanel: null, raimund@1287: searchField: null, raimund@1287: dustin@742: /** dustin@742: * Inhitialize the controller dustin@742: * It has 3 listeners dustin@742: */ raimund@587: init: function() { raimund@587: this.control({ dustin@1012: 'ortszuordnunggrid': { raimund@602: itemdblclick: this.open raimund@587: }, dustin@1012: 'ortszuordnunggrid button[action=add]': { raimund@587: click: this.add raimund@587: }, dustin@1012: 'ortszuordnunggrid button[action=delete]': { raimund@587: click: this.remove mkrambach@1279: }, mkrambach@1279: 'ortszuordnungwindow toolbar button[action=createort]':{ mkrambach@1279: click: this.createort mkrambach@1279: }, mkrambach@1279: 'ortszuordnungwindow toolbar button[action=frommap]':{ mkrambach@1279: click: this.frommap mkrambach@1279: }, mkrambach@1279: 'ortszuordnungwindow toolbar button[action=clone]':{ mkrambach@1279: click: this.cloneort raimund@1287: }, raimund@1287: 'ortszuordnungwindow toolbar textfield[name=search]': { raimund@1287: keyup: this.search raimund@1287: }, raimund@1287: 'ortfilterwindow grid[name=messpunkte]': { raimund@1305: itemclick: this.selectedMesspunkt raimund@1287: }, raimund@1287: 'ortfilterwindow grid[name=verwaltungseinheiten]': { raimund@1305: itemclick: this.selectedVerwaltungseinheit raimund@1287: }, raimund@1287: 'ortfilterwindow grid[name=staaten]': { raimund@1305: itemclick: this.selectedStaat raimund@587: } raimund@587: }); raimund@587: }, raimund@587: dustin@742: /** dustin@1013: * When open is called, a {@link Lada.view.window.Ortszuordnung} mkrambach@1289: * is created which allows to edit the Orte. record is an ortszuordnung mkrambach@1289: * or ortzuordnungMp dustin@742: */ raimund@602: open: function(grid, record) { mkrambach@1289: var parent = grid.up('window').record; mkrambach@1289: // parent is either probe or messprogramm. mkrambach@1289: var parentisMp = false; mkrambach@1289: if (parent.data.hauptprobenNr === undefined) { mkrambach@1289: parentisMp = true; mkrambach@1289: } dustin@1013: var win = Ext.create('Lada.view.window.Ortszuordnung', { raimund@690: parentWindow: grid.up('window'), mkrambach@1289: probe: parentisMp ? null: parent, mkrambach@1289: messprogramm: parentisMp ? parent: null, dustin@1028: record: record, raimund@644: grid: grid raimund@587: }); raimund@602: win.show(); raimund@602: win.initData(); raimund@587: }, raimund@587: dustin@742: /** dustin@742: * This function adds a new row to add an Ort dustin@742: */ raimund@643: add: function(button) { mkrambach@1289: var parent = button.up('window').record; mkrambach@1289: var parentisMp = false; mkrambach@1289: if (parent.data.hauptprobenNr === undefined) { mkrambach@1289: parentisMp = true; mkrambach@1289: } dustin@1013: var win = Ext.create('Lada.view.window.Ortszuordnung', { dustin@1013: parentWindow: button.up('window'), mkrambach@1289: probe: parentisMp ? null: parent, mkrambach@1289: messprogramm: parentisMp ? parent: null, dustin@1013: record: null, dustin@1012: grid: button.up('ortszuordnung') raimund@643: }); raimund@643: win.show(); raimund@643: win.initData(); raimund@587: }, raimund@587: dustin@742: /** dustin@742: * A Ort-row can be removed from the grid with the remove dustin@742: * function. It asks the user for confirmation dustin@742: * If the removal was confirmed, it reloads the parent window on success, dustin@742: * on failure, an error message is shown. dustin@742: */ raimund@587: remove: function(button) { raimund@587: var grid = button.up('grid'); raimund@587: var selection = grid.getView().getSelectionModel().getSelection()[0]; dustin@1012: var i18n = Lada.getApplication().bundle; dustin@1012: Ext.MessageBox.confirm(i18n.getMsg('delete'), i18n.getMsg('confirmation.question'), dustin@1012: function(btn) { dustin@1012: if (btn === 'yes') { raimund@587: selection.destroy({ raimund@587: success: function() { raimund@587: button.up('window').initData(); raimund@587: }, dustin@701: failure: function(request, response) { dustin@1012: var i18n = Lada.getApplication().bundle; dustin@701: var json = response.request.scope.reader.jsonData; dustin@701: if (json) { dustin@701: if (json.message){ dustin@1012: Ext.Msg.alert(i18n.getMsg('err.msg.delete.title') dustin@701: +' #'+json.message, dustin@1012: i18n.getMsg(json.message)); dustin@701: } else { dustin@1012: Ext.Msg.alert(i18n.getMsg('err.msg.delete.title'), dustin@1012: i18n.getMsg('err.msg.generic.body')); dustin@701: } dustin@701: } else { dustin@1012: Ext.Msg.alert(i18n.getMsg('err.msg.delete.title'), dustin@1012: i18n.getMsg('err.msg.response.body')); dustin@701: } raimund@587: } raimund@587: }); raimund@587: } raimund@587: }); dustin@826: grid.down('button[action=delete]').disable(); mkrambach@1279: }, mkrambach@1279: mkrambach@1279: /** mkrambach@1279: * Opens the form for a new Messpunkt mkrambach@1279: */ mkrambach@1288: createort: function(button) { mkrambach@1288: Ext.create('Lada.view.window.Ortserstellung',{ mkrambach@1333: record: Ext.create('Lada.model.Ort', {ortTyp: 1}), mkrambach@1288: parentWindow: button.up('ortszuordnungwindow') mkrambach@1288: }).show(); mkrambach@1279: }, mkrambach@1279: mkrambach@1279: /** mkrambach@1279: * mkrambach@1288: * Creates an event listener for a map click mkrambach@1279: */ mkrambach@1279: frommap: function(button) { mkrambach@1279: var map = button.up('ortszuordnungwindow').down('map'); mkrambach@1291: map.getEl().setStyle('cursor', 'crosshair'); mkrambach@1288: var me = this; mkrambach@1288: map.map.events.register('click', button, me.newOrtfromMapClick); mkrambach@1288: // TODO Deactivate event listener if button is destroyed mkrambach@1279: }, mkrambach@1279: mkrambach@1279: /** mkrambach@1279: * Opens the form for a new Messpunkt, with all values prefilled from the currently mkrambach@1279: * selected item mkrambach@1279: */ mkrambach@1279: cloneort: function(button) { mkrambach@1279: var grid = button.up('ortszuordnungwindow').down('ortstammdatengrid').getView(); mkrambach@1279: var selected = grid.getSelectionModel().getSelection()[0]; mkrambach@1309: var newRecord = Ext.create('Lada.model.Ort', selected.data); mkrambach@1314: newRecord.set('ortId', null); mkrambach@1314: newRecord.set('id', null); mkrambach@1309: Ext.create('Lada.view.window.Ortserstellung', { mkrambach@1309: record: newRecord, mkrambach@1288: parentWindow: button.up('ortszuordnungwindow') mkrambach@1288: }).show(); mkrambach@1288: }, mkrambach@1288: mkrambach@1288: /** mkrambach@1288: * Gets the clicked map's coordinates and opens a new Messpunkt window with coordinates prefilled mkrambach@1288: */ mkrambach@1288: newOrtfromMapClick: function(evt) { mkrambach@1288: var me = this; //this = button(action:frommap) mkrambach@1288: var map = this.up('ortszuordnungwindow').down('map').map; mkrambach@1291: this.up('ortszuordnungwindow').down('map').getEl().setStyle('cursor', 'auto'); mkrambach@1288: var lonlat = map.getLonLatFromViewPortPx(evt.xy).transform(new OpenLayers.Projection('EPSG:3857'), mkrambach@1288: new OpenLayers.Projection('EPSG:4326')); mkrambach@1288: var controller = Lada.app.getController('Lada.controller.grid.Ortszuordnung'); mkrambach@1288: map.events.unregister('click', this, controller.newOrtfromMapClick); mkrambach@1288: Ext.create('Lada.view.window.Ortserstellung', { mkrambach@1288: record: Ext.create('Lada.model.Ort',{ mkrambach@1288: koordXExtern: lonlat.lon, mkrambach@1288: koordYExtern: lonlat.lat, mkrambach@1333: kdaId : 4, mkrambach@1333: ortTyp: 1 mkrambach@1288: }), mkrambach@1288: parentWindow: this.up('ortszuordnungwindow') mkrambach@1284: }).show(); mkrambach@1284: }, mkrambach@1284: mkrambach@1284: /** raimund@1287: * Search triggered by textfield key event. mkrambach@1284: */ raimund@1287: search: function(field, evt, opts) { raimund@1304: if (evt.getKey() === 27) { raimund@1304: if (this.resultPanel.isVisible()) { raimund@1304: this.resultPanel.close(); raimund@1322: verwaltungseinheiten.clearFilter(true); raimund@1322: staaten.clearFilter(true); raimund@1304: return; raimund@1304: } raimund@1304: else { raimund@1304: field.up('window').close(); raimund@1304: return; raimund@1304: } raimund@1304: } raimund@1287: this.searchField = field; raimund@1287: if ((evt.getKey() == 13 || evt.getKey() == 8) && field.getValue() && field.getValue().length > 0) { raimund@1287: this.execSearch(field, field.getValue()); raimund@1287: } raimund@1287: if (field.getValue().length === 0) { raimund@1287: this.resultPanel.hide(); raimund@1322: verwaltungseinheiten.clearFilter(true); raimund@1322: staaten.clearFilter(true); raimund@1287: return; raimund@1287: } raimund@1287: if (field.getValue().length < 3) { raimund@1287: return; raimund@1287: } raimund@1287: this.execSearch(field, field.getValue()); raimund@1287: }, raimund@1287: raimund@1287: /* raimund@1287: * Execute search in stores (ort, verwaltungseinheit and staat) and raimund@1287: * display the resultset. raimund@1287: */ raimund@1287: execSearch: function(field, filter) { raimund@1287: // Filter stores raimund@1287: var messpunkte = Ext.data.StoreManager.get('orte'); raimund@1322: var cloneRecords = []; raimund@1322: messpunkte.each(function(r) { raimund@1322: cloneRecords.push(r.copy()); raimund@1322: }); raimund@1322: var filterMesspunkte = Ext.create('Lada.store.Orte',{ raimund@1322: autoLoad: false raimund@1322: }); raimund@1322: filterMesspunkte.add(cloneRecords); raimund@1287: var verwaltungseinheiten = Ext.data.StoreManager.get('verwaltungseinheiten'); raimund@1287: var staaten = Ext.data.StoreManager.get('staaten'); raimund@1287: verwaltungseinheiten.clearFilter(true); raimund@1287: staaten.clearFilter(true); raimund@1322: filterMesspunkte.filter({filterFn: function(item) { raimund@1287: if (item.get('ortId').indexOf(filter) > -1) { raimund@1287: return true; raimund@1287: } raimund@1287: if (item.get('kurztext').indexOf(filter) > -1) { raimund@1287: return true; raimund@1287: } raimund@1287: if (item.get('langtext').indexOf(filter) > -1) { raimund@1287: return true; raimund@1287: } raimund@1287: if (item.get('berichtstext') && raimund@1287: item.get('berichtstext').indexOf(filter) > -1) { raimund@1287: return true; raimund@1287: } mkrambach@1309: if (item.get('gemId') && mkrambach@1309: item.get('gemId').indexOf(filter) > -1) { raimund@1287: return true; raimund@1287: } raimund@1287: }}); raimund@1287: verwaltungseinheiten.filter('bezeichnung', filter); raimund@1287: staaten.filter('staat', filter); raimund@1287: raimund@1287: if (!this.resultPanel) { raimund@1287: this.resultPanel = Ext.create('Lada.view.window.OrtFilter', { raimund@1287: x: 500, raimund@1287: y: 500, mkrambach@1289: alwaysOnTop: true, mkrambach@1289: parentWindow: this raimund@1287: }); raimund@1287: } raimund@1287: this.resultPanel.show(); raimund@1322: this.resultPanel.updateGrids(filterMesspunkte, verwaltungseinheiten, staaten); raimund@1287: this.resultPanel.reposition(field.getX() + field.getLabelWidth(), field.getY()); raimund@1287: field.focus(); raimund@1287: }, raimund@1287: raimund@1287: selectedMesspunkt: function(grid, record) { raimund@1287: var win = grid.up('window'); raimund@1287: win.hide(); raimund@1287: this.searchField.reset(); raimund@1287: var grid = this.searchField.up('panel').down('ortstammdatengrid'); raimund@1287: grid.getSelectionModel().select(record); raimund@1287: grid.getView().focusRow(record); raimund@1287: }, raimund@1287: raimund@1287: selectedVerwaltungseinheit: function(grid, record) { raimund@1287: var win = grid.up('window'); mkrambach@1289: var panel = this.searchField.up('panel').up('window'); raimund@1287: win.hide(); raimund@1287: this.searchField.reset(); mkrambach@1288: Ext.create('Lada.view.window.Ortserstellung', { mkrambach@1289: record: Ext.create('Lada.model.Ort', { mkrambach@1309: gemId: record.get('id'), mkrambach@1309: ortId: record.get('id'), mkrambach@1309: kurztext: record.get('bezeichnung'), mkrambach@1309: langtext: record.get('bezeichnung'), mkrambach@1333: berichtstext: record.get('bezeichnung'), mkrambach@1333: ortTyp: 4 mkrambach@1289: }), mkrambach@1289: parentWindow: panel mkrambach@1288: }).show(); raimund@1287: }, raimund@1287: raimund@1287: selectedStaat: function(grid, record) { raimund@1287: var win = grid.up('window'); raimund@1287: win.hide(); mkrambach@1289: this.searchField.reset(); mkrambach@1288: Ext.create('Lada.view.window.Ortserstellung', { mkrambach@1289: record: Ext.create('Lada.model.Ort', { mkrambach@1309: staatId: record.get('id'), mkrambach@1309: ortId: 'Staat_' + record.get('staatIso'), mkrambach@1309: kurztext: record.get('staat'), mkrambach@1309: langtext: record.get('staat'), mkrambach@1333: berichtstext: record.get('staat'), mkrambach@1333: ortTyp: 5 mkrambach@1289: }), mkrambach@1289: parentWindow: win mkrambach@1288: }).show(); raimund@587: } raimund@587: });