Commit 574171f0df8caf76d37b15146896ef8bf1408387
1 parent
210a3164
Exists in
master
and in
111 other branches
Display granules thumbnails and other UI improvments.
Showing
3 changed files
with
103 additions
and
58 deletions
Show diff stats
js/app/controllers/EpnTapModule.js
... | ... | @@ -7,26 +7,6 @@ |
7 | 7 | * @author Nathanael Jourdane |
8 | 8 | */ |
9 | 9 | |
10 | -// for(let service of Ext.getCmp('servicesPanel').getStore().getRange()) { | |
11 | -// var filter = Array(service.data.schema, service.data.accessurl, targetName, productType, startTime, stopTime); | |
12 | -// AmdaAction.epnTapMgr('getServiceNbResults', filter, function(epnTapServices) { | |
13 | -// service.set('nb_responses', epnTapServices===null ? "-" : epnTapServices); | |
14 | -// console.log(epnTapServices); | |
15 | -// }); | |
16 | -// } | |
17 | - | |
18 | -// var grid = Ext.getCmp('servicesPanel'); | |
19 | -// var selection = grid.getSelectionModel(); | |
20 | -// access_url = []; | |
21 | -// table_name = []; | |
22 | -// for(i=0 ; i<grid.store.getCount() ; i++) { | |
23 | -// if(selection.isSelected(i)) { | |
24 | -// table_name.push(grid.store.getAt(i).data.table_name); | |
25 | -// access_url.push(grid.store.getAt(i).data.access_url); | |
26 | -// } | |
27 | -// | |
28 | -// } | |
29 | - | |
30 | 10 | // Load text with Ajax synchronously: takes path to file and optional MIME type |
31 | 11 | function loadTextFileAjaxSync(filePath, mimeType) { |
32 | 12 | var xmlhttp=new XMLHttpRequest(); |
... | ... | @@ -61,11 +41,11 @@ Ext.define('amdaDesktop.EpnTapModule', { |
61 | 41 | /** The name of the documentation file related to the module. */ |
62 | 42 | helpFile : 'epnTapHelp', |
63 | 43 | |
64 | - width : 600, | |
44 | + width : 800, | |
65 | 45 | height: 550, |
66 | 46 | |
67 | 47 | dpt_dic: { "im": "Image", "ma": "Map", "sp": "Spectrum", "ds": "Dynamic spectrum", "sc": "Spectral cube", "pr": "Profile", |
68 | - "vo": "Volume", "mo": "Movie", "cu": "Cube", "ts": "Time series", "ca": "Catalogue", "ci": "Catalogue item" }, | |
48 | + "vo": "Volume", "mo": "Movie", "cu": "Cube", "ts": "Time series", "ca": "Catalogue", "ci": "Catalogue item" }, | |
69 | 49 | |
70 | 50 | prettify: function(name) { |
71 | 51 | return name.charAt(0).toUpperCase() + name.replace(/_/g, ' ').substr(1).toLowerCase(); |
... | ... | @@ -81,32 +61,32 @@ Ext.define('amdaDesktop.EpnTapModule', { |
81 | 61 | |
82 | 62 | var filter_dic = new Array(); |
83 | 63 | if(this.dpt_cb.value == 'all') { |
84 | - for (var dpt in this.services) { | |
85 | - for (var tc in this.services[dpt]) { | |
86 | - for (tn in this.services[dpt][tc]) { | |
87 | - for (serv in this.services[dpt][tc][tn]) { | |
88 | - filter_dic[serv] = this.services[dpt][tc][tn][serv][0] + (serv in filter_dic ? filter_dic[serv] : 0); | |
64 | + for (var dpt in this.metadata) { | |
65 | + for (var tc in this.metadata[dpt]) { | |
66 | + for (tn in this.metadata[dpt][tc]) { | |
67 | + for (serv in this.metadata[dpt][tc][tn]) { | |
68 | + filter_dic[serv] = this.metadata[dpt][tc][tn][serv][0] + (serv in filter_dic ? filter_dic[serv] : 0); | |
89 | 69 | } |
90 | 70 | } |
91 | 71 | } |
92 | 72 | } |
93 | 73 | } else if (this.tc_cb.value == 'all') { |
94 | - for (var tc in this.services[this.dpt_cb.value]) { | |
95 | - for (tn in this.services[this.dpt_cb.value][tc]) { | |
96 | - for (serv in this.services[this.dpt_cb.value][tc][tn]) { | |
97 | - filter_dic[serv] = this.services[this.dpt_cb.value][tc][tn][serv][0] + (serv in filter_dic ? filter_dic[serv] : 0); | |
74 | + for (var tc in this.metadata[this.dpt_cb.value]) { | |
75 | + for (tn in this.metadata[this.dpt_cb.value][tc]) { | |
76 | + for (serv in this.metadata[this.dpt_cb.value][tc][tn]) { | |
77 | + filter_dic[serv] = this.metadata[this.dpt_cb.value][tc][tn][serv][0] + (serv in filter_dic ? filter_dic[serv] : 0); | |
98 | 78 | } |
99 | 79 | } |
100 | 80 | } |
101 | 81 | } else if (this.tn_cb.value == 'all') { |
102 | - for (tn in this.services[this.dpt_cb.value][this.tc_cb.value]) { | |
103 | - for (serv in this.services[this.dpt_cb.value][this.tc_cb.value][tn]) { | |
104 | - filter_dic[serv] = this.services[this.dpt_cb.value][this.tc_cb.value][tn][serv][0] + (serv in filter_dic ? filter_dic[serv] : 0); | |
82 | + for (tn in this.metadata[this.dpt_cb.value][this.tc_cb.value]) { | |
83 | + for (serv in this.metadata[this.dpt_cb.value][this.tc_cb.value][tn]) { | |
84 | + filter_dic[serv] = this.metadata[this.dpt_cb.value][this.tc_cb.value][tn][serv][0] + (serv in filter_dic ? filter_dic[serv] : 0); | |
105 | 85 | } |
106 | 86 | } |
107 | 87 | } else { |
108 | - for (serv in this.services[this.dpt_cb.value][this.tc_cb.value][this.tn_cb.value]) { | |
109 | - filter_dic[serv] = this.services[this.dpt_cb.value][this.tc_cb.value][this.tn_cb.value][serv][0] + (serv in filter_dic ? filter_dic[serv] : 0); | |
88 | + for (serv in this.metadata[this.dpt_cb.value][this.tc_cb.value][this.tn_cb.value]) { | |
89 | + filter_dic[serv] = this.metadata[this.dpt_cb.value][this.tc_cb.value][this.tn_cb.value][serv][0] + (serv in filter_dic ? filter_dic[serv] : 0); | |
110 | 90 | } |
111 | 91 | } |
112 | 92 | |
... | ... | @@ -122,7 +102,9 @@ Ext.define('amdaDesktop.EpnTapModule', { |
122 | 102 | }, |
123 | 103 | |
124 | 104 | onWindowLoaded: function(services) { |
125 | - this.services = JSON.parse(loadTextFileAjaxSync('../../generic_data/EpnTapData/services.json', "application/json")); | |
105 | + this.metadata = JSON.parse(loadTextFileAjaxSync('../../generic_data/EpnTapData/metadata.json', "application/json")); | |
106 | + this.services = JSON.parse(loadTextFileAjaxSync('../../generic_data/EpnTapData/EpnTapServices.json', "application/json")); | |
107 | + console.log(Object.keys(this.metadata).length + " dataproduct_type rรฉpertoriรฉs."); | |
126 | 108 | |
127 | 109 | this.dpt_cb = Ext.getCmp('productTypeCB'); |
128 | 110 | this.tc_cb = Ext.getCmp('targetClassCB'); |
... | ... | @@ -137,8 +119,10 @@ Ext.define('amdaDesktop.EpnTapModule', { |
137 | 119 | this.tn_cb.disable(); |
138 | 120 | |
139 | 121 | this.dpt_cb.getStore().add({'id': 'all', 'name': 'All data product types'}); |
122 | + this.tc_cb.getStore().add({'id': 'all', 'name': 'All target names'}); | |
123 | + this.tn_cb.getStore().add({'id': 'all', 'name': 'All target classes'}); | |
140 | 124 | |
141 | - for (var dpt_id in this.services) { | |
125 | + for (var dpt_id in this.metadata) { | |
142 | 126 | if (dpt_id in this.dpt_dic) { |
143 | 127 | this.dpt_cb.getStore().add({'id': dpt_id, 'name': this.prettify(this.dpt_dic[dpt_id])}); |
144 | 128 | } else { |
... | ... | @@ -146,6 +130,8 @@ Ext.define('amdaDesktop.EpnTapModule', { |
146 | 130 | } |
147 | 131 | } |
148 | 132 | this.dpt_cb.select('all'); |
133 | + this.tc_cb.select('all'); | |
134 | + this.tn_cb.select('all'); | |
149 | 135 | this.update_services(); |
150 | 136 | }, |
151 | 137 | |
... | ... | @@ -157,7 +143,7 @@ Ext.define('amdaDesktop.EpnTapModule', { |
157 | 143 | if (this.dpt_cb.value == 'all') { |
158 | 144 | this.tc_cb.disable(); |
159 | 145 | } else { |
160 | - var target_classes = this.services[this.dpt_cb.value]; | |
146 | + var target_classes = this.metadata[this.dpt_cb.value]; | |
161 | 147 | |
162 | 148 | if (Object.keys(target_classes).length == 1) { |
163 | 149 | this.tc_cb.getStore().add({'id': Object.keys(target_classes)[0], 'name': this.prettify(Object.keys(target_classes)[0])}); |
... | ... | @@ -173,6 +159,8 @@ Ext.define('amdaDesktop.EpnTapModule', { |
173 | 159 | this.tc_cb.enable(); |
174 | 160 | } |
175 | 161 | } |
162 | + this.tn_cb.getStore().add({'id': 'all', 'name': 'All target names'}); | |
163 | + this.tn_cb.select('all'); | |
176 | 164 | this.update_services(); |
177 | 165 | }, |
178 | 166 | |
... | ... | @@ -180,9 +168,11 @@ Ext.define('amdaDesktop.EpnTapModule', { |
180 | 168 | this.tn_cb.getStore().removeAll(); |
181 | 169 | |
182 | 170 | if (this.tc_cb.value == 'all') { |
171 | + this.tn_cb.getStore().add({'id': 'all', 'name': 'All target names'}); | |
172 | + this.tn_cb.select('all'); | |
183 | 173 | this.tn_cb.disable(); |
184 | 174 | } else { |
185 | - var target_names = this.services[this.dpt_cb.value][this.tc_cb.value]; | |
175 | + var target_names = this.metadata[this.dpt_cb.value][this.tc_cb.value]; | |
186 | 176 | |
187 | 177 | if (Object.keys(target_names).length == 1) { |
188 | 178 | this.tn_cb.getStore().add({'id': Object.keys(target_names)[0], 'name': this.prettify(Object.keys(target_names)[0])}); |
... | ... | @@ -205,20 +195,39 @@ Ext.define('amdaDesktop.EpnTapModule', { |
205 | 195 | }, |
206 | 196 | |
207 | 197 | onSearchBtnClicked: function() { |
208 | - console.log("onSearchBtnClicked"); | |
198 | + // console.log("onSearchBtnClicked"); | |
209 | 199 | }, |
210 | 200 | |
211 | - onServiceSelected: function(service) { | |
212 | - var filter = Array(service['schema'], service['accessurl'], Ext.getCmp('targetNameCB').value, | |
213 | - this.dpt_cb.value, Ext.getCmp('startTimeDF').rawValue, Ext.getCmp('stopTimeDF').rawValue); | |
201 | + fillGranules: function(granules) { | |
202 | + console.log(granules); | |
214 | 203 | |
215 | - AmdaAction.epnTapMgr('getGranules', filter, function(granules) { | |
216 | - console.log(granules); | |
217 | - }); | |
204 | + Ext.getCmp('granulesPanel').getStore().removeAll(); | |
205 | + Ext.getCmp('granulesPanel').getStore().add(granules); | |
206 | + }, | |
207 | + | |
208 | + onServiceSelected: function(service) { | |
209 | + var select = Array(); | |
210 | + for (var i_s = 0 ; i_s < this.services.length ; i_s++) { | |
211 | + if (this.services[i_s]['schema'] === service['id']) { | |
212 | + var columns = this.services[i_s]['columns'].split(','); | |
213 | + for (var i_c=0 ; i_c<this.gp_grid.columns.length ; i_c++) { | |
214 | + if (columns.indexOf(this.gp_grid.columns[i_c].dataIndex) != -1) | |
215 | + select.push(this.gp_grid.columns[i_c].dataIndex) | |
216 | + } | |
217 | + var filter = Array( | |
218 | + this.dpt_cb.value !== 'all' ? this.dpt_cb.value : null, | |
219 | + this.tn_cb.value !== 'all' ? this.dpt_cb.value : null, | |
220 | + Ext.getCmp('startTimeDF').rawValue !== '' ? this.dpt_cb.value : null, | |
221 | + Ext.getCmp('stopTimeDF').rawValue !== '' ? this.dpt_cb.value : null); | |
222 | + break; | |
223 | + } | |
224 | + } | |
225 | + console.log("Getting granules of " + service['id'] + "..."); | |
226 | + AmdaAction.epnTapGetGranules(service['id'], this.services[i_s]['accessurl'], filter, select, this.fillGranules); | |
218 | 227 | }, |
219 | 228 | |
220 | 229 | onGranuleSelected: function(granule) { |
221 | - console.log('selected granule: ' + granule.target_name); | |
230 | + // console.log('selected granule: ' + granule.target_name); | |
222 | 231 | }, |
223 | 232 | |
224 | 233 | /** @class Module initialisation. */ | ... | ... |
js/app/views/EpnTapUI.js
... | ... | @@ -30,7 +30,7 @@ Ext.create('Ext.data.Store', { |
30 | 30 | |
31 | 31 | Ext.create('Ext.data.Store', { |
32 | 32 | storeId:'granules_store', |
33 | - fields:['type', 'target_name', 'time_min', 'time_max'] | |
33 | + fields:['dataproduct_type', 'target_name', 'time_min', 'time_max', 'access_format', 'granule_uid', 'access_estsize', 'access_url', 'thumbnail_url'] | |
34 | 34 | }); |
35 | 35 | |
36 | 36 | var serviceFilterPanel = { |
... | ... | @@ -144,24 +144,47 @@ var servicesPanel = { |
144 | 144 | } |
145 | 145 | } |
146 | 146 | |
147 | -var granulesPanel = { | |
147 | +var txt_render = function(val) { return '<p style="white-space: normal;">' + val + '</p>'; }; | |
148 | +var link_render = function(val) { return '<a href="' + val + '">get</a>'; }; | |
149 | +var img_render = function(val) { return '<img src="' + val + '">' }; | |
150 | + | |
151 | +var granulesPanel = Ext.create('Ext.grid.Panel', { | |
148 | 152 | id: 'granulesPanel', |
149 | - xtype : 'grid', | |
150 | 153 | title: 'Granules', |
151 | - store: Ext.data.StoreManager.lookup('granulesStore'), | |
154 | + store: Ext.data.StoreManager.lookup('granules_store'), | |
152 | 155 | flex: 3, |
156 | + cls: 'epntap_granules', | |
153 | 157 | columns: [ |
154 | - { text: 'Type', dataIndex: 'type', flex: 1 }, | |
155 | - { text: 'Target', dataIndex: 'target_name', flex: 1 }, | |
156 | - { text: 'Time min', dataIndex: 'time_min', flex: 2 }, | |
157 | - { text: 'Time max', dataIndex: 'time_max', flex: 2 } | |
158 | + { text: 'Type', dataIndex: 'dataproduct_type', flex: 1, renderer: txt_render }, | |
159 | + { text: 'Target', dataIndex: 'target_name', flex: 2, renderer: txt_render }, | |
160 | + { text: 'Time min', dataIndex: 'time_min', flex: 2, renderer: txt_render }, | |
161 | + { text: 'Time max', dataIndex: 'time_max', flex: 2, renderer: txt_render }, | |
162 | + { text: 'Format', dataIndex: 'access_format', flex: 2, renderer: txt_render }, | |
163 | + { text: 'uid', dataIndex: 'granule_uid', flex: 2, renderer: txt_render }, | |
164 | + { text: 'Size', dataIndex: 'access_estsize', flex: 2, renderer: txt_render }, | |
165 | + { text: 'URL', dataIndex: 'access_url', flex: 1, renderer: link_render }, | |
166 | + { text: 'Thumbnail', dataIndex: 'thumbnail_url', flex: 2, renderer: img_render} | |
158 | 167 | ], |
159 | 168 | listeners: { |
160 | 169 | 'cellclick': function(grid, td, cellIndex, record, tr, rowIndex, e, eOpts) { |
161 | 170 | myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.epntap.id).onGranuleSelected(record.data); |
162 | 171 | } |
172 | + }, | |
173 | + renderTo: Ext.getBody() | |
174 | +}); | |
175 | + | |
176 | +var tooltip = Ext.create('Ext.tip.ToolTip', { | |
177 | + target: granulesPanel.getView().el, | |
178 | + delegate: granulesPanel.getView().itemSelector, | |
179 | + trackMouse: true, | |
180 | + renderTo: Ext.getBody(), | |
181 | + listeners: { | |
182 | + beforeshow: function updateTipBody(tip) { | |
183 | + var thumb = granulesPanel.getView().getRecord(tooltip.triggerElement).get('thumbnail_url'); | |
184 | + tooltip.update('<img src="' + thumb + '">'); | |
185 | + } | |
163 | 186 | } |
164 | -} | |
187 | +}); | |
165 | 188 | |
166 | 189 | var mainPanel = { |
167 | 190 | id: 'mainPanel', |
... | ... | @@ -202,7 +225,7 @@ Ext.define('amdaUI.EpnTapUI', { |
202 | 225 | |
203 | 226 | init : function(config) { |
204 | 227 | var myConf = { |
205 | - width: 600, | |
228 | + width: 800, | |
206 | 229 | height: 550, |
207 | 230 | layout: 'border', |
208 | 231 | items: [ | ... | ... |
js/resources/css/amda.css
... | ... | @@ -487,3 +487,16 @@ p + p { |
487 | 487 | filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100) !important; |
488 | 488 | opacity: 1.0 !important; |
489 | 489 | } |
490 | + | |
491 | +.epntap_granules img { | |
492 | + max-width: 40px; | |
493 | + max-height: 40px; | |
494 | +} | |
495 | + | |
496 | +#granule_tooltip { | |
497 | + /*position:absolute;*/ | |
498 | + margin:5px; | |
499 | + width:200px; | |
500 | + height:50px; | |
501 | + border:1px solid black; | |
502 | +} | ... | ... |