EpnTapModule.js 5.21 KB
/**
 * Project  : AMDA-NG
 * Name	 : EpnTapModule.js
 * @class   amdaDesktop.EpnTapModule
 * @extends amdaDesktop.AmdaModule
 * @brief   EpnTap Module controller definition
 * @author  Nathanael Jourdane
 */

Ext.define('amdaDesktop.EpnTapModule', {

	extend: 'amdaDesktop.AmdaModule',
	requires: ['amdaUI.EpnTapUI'],
	contentId : 'EpnTapUI',

	/** The alias name of the module view. */
	// uiType: 'panelEpnTap',
	uiType : 'panelEpnTap',

	/** The text displayed on the *help button* tooltip. */
	helpTitle: 'Help on EPN-TAP Module',

	/** The name of the documentation file related to the module. */
	helpFile : 'epnTapHelp',

	/**
	Module initialisation. Called the first time that the user open the epnTap module.
	*/
	init: function() {
		this.launcher = {
			text: this.title,
			iconCls: this.icon,
			handler: this.createWindow,
			scope: this
		};
	},

	/**
	Called each time the epntap module is loaded.
	- `target`: an array of 3 values: [target_name, dataproduct_type]; or null.
	*/
	loadTarget: function(filter) {
		this.aquireElements();
		this.addListeners();

		this.servicesStore.each(function(record) {
			record.set('nb_results', -1);
		}, this);
		this.granulesStore.removeAll();

		if(filter) {
			this.targetNameCB.setRawValue(filter['targetName']);
			this.productTypeCB.select(filter['productType']);
			this.getServices();
		}
	},

	aquireElements: function() {
		// UI elements
		this.servicesGrid = Ext.getCmp('epnTapServicesGrid');
		this.granulesGrid = Ext.getCmp('epnTapGranulesGrid');
		this.productTypeCB = Ext.getCmp('epnTapProductTypeCB');
		this.targetNameCB = Ext.getCmp('epnTapTargetNameCB');
		this.timeSelector = Ext.getCmp('epnTapTimeSelector');
		this.getBtn = Ext.getCmp('epnTapGetBtn');

		// stores elements
		this.servicesStore = Ext.data.StoreManager.lookup('servicesStore');
		this.granulesStore = Ext.data.StoreManager.lookup('granulesStore');
		this.productTypesStore = Ext.data.StoreManager.lookup('productTypesStore');
		this.targetNamesStore = Ext.data.StoreManager.lookup('targetNamesStore');
	},

	addListeners: function() {
		this.targetNameCB.on('change', function() {
			this.updateGetBtnStatus();
		}, this);

		this.productTypeCB.on('change', function() {
			this.updateGetBtnStatus();
		}, this);

		this.servicesGrid.on('cellclick', function(grid, td, cellIndex, record) {
			this.onServiceSelected(record);
		}, this);

		this.getBtn.on('click', function() {
			this.getServices();
		}, this);
	},

	/**********************
	*** Utils functions ***
	**********************/

	updateGetBtnStatus: function() {
		var shouldEnabled = this.targetNameCB.rawValue.length > 0 && this.productTypeCB.rawValue.length > 0;
		if(shouldEnabled) {
			this.getBtn.enable();
		} else {
			this.getBtn.disable();
		}
	},

	/*************
	*** Events ***
	*************/

	/**
	Trigerred when the 'Get results' button is clicked.
	*/
	getServices: function() {
		this.granulesStore.removeAll();
		var targetName = this.targetNameCB.rawValue;
		var productTypes = this.productTypeCB.value.join(';');
		var timeMin = Ext.Date.format(this.timeSelector.getStartTime(), 'd/m/Y H:i:s'); // start time
		var timeMax = Ext.Date.format(this.timeSelector.getStopTime(), 'd/m/Y H:i:s'); // stop time

		loadMask.show();
		this.servicesStore.each(function(record) {
			// TODO: use store.load() method instead and add 'success' and 'enable' columns in the store
			Ext.Ajax.request({
				url: 'php/epntap.php',
				method: 'GET',
				headers: {'Content-Type': 'application/json'},
				params: {
					'action': 'getNbResults',
					'serviceId': record.data['id'],
					'url': record.data['access_url'],
					'tableName': record.data['table_name'],
					'targetNames': targetName,
					'productTypes': productTypes,
					'timeMin': timeMin,
					'timeMax': timeMax
				},
				// timeout: 3000,
				success: function(response, options) {
					var record = this.servicesStore.getById(options.params['serviceId']);
					var responseObj = Ext.decode(response.responseText);
					this.updateService(record, responseObj['success'] ? responseObj['data'] : -2, responseObj['msg']);
				},
				failure: function(response, options) {
					var record = this.servicesStore.getById(options.params['serviceId']);
					this.updateService(record, -1, response.statusText);
				},
				scope: this
			});
		}, this);
	},

	/**
	Update the nb_result field of the services store (see `EpnTapUI.servicesStore`), according to the field values in `serviceFilterPanel`.
	*/
	updateService: function(record, nbRes, info) {
		record.set('nb_results', nbRes);
		record.set('info', info);
		this.servicesStore.sort();
		loadMask.hide();
	},

	/**
	Trigerred when a row is clicked in `servicesGrid` table (see `EpnTapUI.createServicesGrid()`). Among other things,
	send a new query and fill `granulesGrid`.
	*/
	onServiceSelected: function(record) {
		this.granulesStore.selectedService = record.data.id;
		Ext.Ajax.suspendEvent('requestexception');
		Ext.Ajax.abortAll();

		if(record.get('nb_results') > 0) {
			this.granulesStore.removeAll();
			this.granulesStore.load({
				callback: function (records, operation, success) {
					Ext.Ajax.resumeEvents('requestexception');
					// console.log(Ext.decode(operation.response.responseText));
				},
				start: 0,
				limit: this.granulesStore.pageSize,
				scope: this
			});
		}
	}
});