Commit 2bf11f0b authored by Pedro Eduardo Trujillo's avatar Pedro Eduardo Trujillo
Browse files

Introduce gráficas en detalle de actividad

Primera prueba de carga de series temporales relacionadas con una
actividad en su misma vista detalle, en base a la selección del usuario
de la estación de muestreo deseada (entre todas las que contenga la
actividad). Falta revisar y optimizar la funcionalidad.
parent e7c5178d
Loading
Loading
Loading
Loading
+47 −1
Original line number Diff line number Diff line
@@ -2,6 +2,8 @@ define([
	'app/designs/details/main/ActivityTrackingMap'
	, 'app/details/views/ActivityAreaMapBase'
	, 'app/details/views/ActivityCitationMapBase'
	, 'app/details/views/ActivityFixedTimeseriesChart'
	, 'app/details/views/ActivityFixedTimeseriesMap'
	, 'app/details/views/ActivityInfrastructureMapBase'
	, 'app/details/views/ActivityLayerMapBase'
	, 'dojo/_base/declare'
@@ -9,6 +11,8 @@ define([
	ActivityTrackingMap
	, ActivityAreaMapBase
	, ActivityCitationMapBase
	, ActivityFixedTimeseriesChart
	, ActivityFixedTimeseriesMap
	, ActivityInfrastructureMapBase
	, ActivityLayerMapBase
	, declare
@@ -37,9 +41,17 @@ define([
				widgetKey = this._prepareInfrastructureActivityWidgets();
			} else if (activityCategory === 'ar') {
				widgetKey = this._prepareAreaActivityWidgets();
			} else if (activityCategory === 'ft') {
				widgetKey = this._prepareFixedTimeseriesActivityWidgets();
			}

			widgetKey && this._activityCategoryCustomWidgets.push(widgetKey);
			if (widgetKey) {
				if (widgetKey instanceof Array) {
					this._activityCategoryCustomWidgets = this._activityCategoryCustomWidgets.concat(widgetKey);
				} else {
					this._activityCategoryCustomWidgets.push(widgetKey);
				}
			}
		},

		_prepareCitationActivityWidgets: function() {
@@ -137,6 +149,40 @@ define([
			return key;
		},

		_prepareFixedTimeseriesActivityWidgets: function() {

			var mapKey = 'activityFixedTimeseriesMap';

			var mapConfig = {
				width: 6,
				height: 6,
				type: ActivityFixedTimeseriesMap,
				props: {
					title: this.i18n.associatedSurveyStation,
					pathVariableId: this._activityData.id
				}
			};

			this._addWidget(mapKey, mapConfig);

			var chartKey = 'activityFixedTimeseriesChart';

			var chartConfig = {
				width: 6,
				height: 6,
				type: ActivityFixedTimeseriesChart,
				props: {
					title: this.i18n.charts,
					pathVariableId: this._activityData.id,
					timeseriesDataChannel: this._getWidgetInstance(mapKey).getChannel('TIMESERIES_DATA')
				}
			};

			this._addWidget(chartKey, chartConfig);

			return [mapKey, chartKey];
		},

		_removeActivityCategoryCustomWidgets: function() {

			while (this._activityCategoryCustomWidgets.length) {
+109 −0
Original line number Diff line number Diff line
define([
	'app/designs/base/_Main'
	, 'app/designs/chart/main/_ProcessDataDefinitionAndGetTimeSeries'
	, 'app/designs/chart/main/ChartsWithLegendAndToolbarsAndSlider'
	, 'app/designs/details/Controller'
	, 'app/designs/details/Layout'
	, 'app/details/views/_ActivityTimeSeriesDataManagement'
	, 'dojo/_base/declare'
	, 'dojo/_base/lang'
	, 'redmic/modules/chart/ChartsContainer/_InfoOnMouseOver'
	, 'redmic/modules/chart/ChartsContainer/_TemporalAxisWithGridDrawing'
	, 'redmic/modules/chart/ChartsContainer/_VerticalAxesWithGridDrawing'
	, 'redmic/modules/chart/ChartsContainer/_ZoomByDragging'
], function(
	_Main
	, _ProcessDataDefinitionAndGetTimeSeries
	, ChartsWithLegendAndToolbarsAndSlider
	, Controller
	, Layout
	, _ActivityTimeSeriesDataManagement
	, declare
	, lang
	, _InfoOnMouseOver
	, _TemporalAxisWithGridDrawing
	, _VerticalAxesWithGridDrawing
	, _ZoomByDragging
) {

	return declare([Layout, Controller, _Main, _ActivityTimeSeriesDataManagement], {
		//	summary:
		//		Vista detalle de gráficas asociadas a actividad.

		constructor: function(args) {

			this.config = {
				_titleRightButtonsList: [],
				_activeRadius: true,
				noScroll: true,
				propsWidget: {
					omitTitleBar: true,
					resizable: false
				},
				targetReplaceParameter: 'id'
			};

			lang.mixin(this, this.config, args);
		},

		_setMainConfigurations: function() {

			this._replacePathVariableIdInTarget();

			this.widgetConfigs = this._merge([{
				chart: {
					width: 6,
					height: 6,
					type: [ChartsWithLegendAndToolbarsAndSlider, _ProcessDataDefinitionAndGetTimeSeries],
					props: {
						title: this.i18n.chart,
						target: this.targetChange,
						filterConfig: {
							initQuery: {
								size: null
							}
						},
						chartsContainerExts: [
							_TemporalAxisWithGridDrawing,
							_VerticalAxesWithGridDrawing,
							_ZoomByDragging,
							_InfoOnMouseOver
						],
						aggregationToolSelection: {
							interval: [],
							metrics: ['avg']
						},
						aggregationToolConfig: {
							defaultIntervalOptions: []
						}
					}
				}
			}, this.widgetConfigs || {}]);
		},

		_replacePathVariableIdInTarget: function() {

			var replaceObj = {};
			replaceObj[this.targetReplaceParameter] = this.pathVariableId;

			this.targetChange = lang.replace(this.templateTargetChange, replaceObj);
		},

		_clearModules: function() {

			var widgetInstance = this._getWidgetInstance('chart');
			this._publish(widgetInstance.getChannel('CLEAR'));
			this._publish(widgetInstance.getChannel('REFRESH'));
		},

		_refreshModules: function() {

			this._replacePathVariableIdInTarget();

			this._publish(this._getWidgetInstance('chart').getChannel('UPDATE_TARGET'), {
				target: this.targetChange,
				refresh: true
			});
		}
	});
});
+49 −0
Original line number Diff line number Diff line
define([
	'app/details/views/ActivityChart'
	, 'app/redmicConfig'
	, 'dojo/_base/declare'
	, 'dojo/_base/lang'
	, 'dojo/aspect'
	, 'dojo/Deferred'
], function(
	ActivityChart
	, redmicConfig
	, declare
	, lang
	, aspect
	, Deferred
) {

	return declare(ActivityChart, {
		//	summary:
		//

		constructor: function(args) {

			this.config = {
				templateTargetChange: redmicConfig.services.timeSeriesTemporalData,
				activityCategory: ['ft']
			};

			lang.mixin(this, this.config, args);
		},

		postCreate: function() {

			this.inherited(arguments);

			this._subscribe(this.timeseriesDataChannel, lang.hitch(this, function(data) {

				this._dataList = [];
				this._indexDataList = {};

				this._dataList = this._parseData(data.properties);
				this._generateTimeSeriesData(this._dataList);

				this._publish(this._getWidgetInstance('chart').getChannel('SET_PROPS'), {
					chartsData: this.seriesData
				});
			}));
		}
	});
});
+95 −0
Original line number Diff line number Diff line
define([
	'app/designs/details/main/ActivityMap'
	, 'app/redmicConfig'
	, 'dojo/_base/declare'
	, 'dojo/_base/lang'
	, 'dojo/aspect'
	, 'dojo/query'
	, 'templates/SurveyStationTimeseriesPopup'
	, 'templates/SurveyStationList'
], function(
	ActivityMap
	, redmicConfig
	, declare
	, lang
	, aspect
	, query
	, TemplatePopup
	, TemplateList
) {

	return declare(ActivityMap, {
		//	summary:
		//

		constructor: function(args) {

			this.config = {
				actions: {
					TIMESERIES_DATA: 'timeseriesData'
				},
				templateTargetChange: redmicConfig.services.activityTimeSeriesStations,
				templatePopup: TemplatePopup,
				_activeRadius: false,
				activityCategory: ['ft'],
				targetReplaceParameter: 'activityid',
				_showChartsButtonClass: 'showCharts'
			};

			lang.mixin(this, this.config, args);

			aspect.before(this, '_afterSetConfigurations', lang.hitch(this, this._setBaseConfigurations));
		},

		_setBaseConfigurations: function() {

			this.widgetConfigs = this._merge([{
				geographic: {
					props: {
						browserConfig: {
							template: TemplateList
						}
					}
				}
			}, this.widgetConfigs || {}]);
		},

		_afterShow: function() {

			this.inherited(arguments);

			this._subscribe(this.getChildChannel('layerInstance', 'POPUP_LOADED'),
				lang.hitch(this, this._onStationPopupLoaded));
		},

		_onStationPopupLoaded: function(res) {

			if (!res) {
				return;
			}

			var popupNode = res._contentNode,
				popupData = res._source.feature;

			if (popupNode && popupData) {
				var showChartsNode = query('.' + this._showChartsButtonClass, popupNode)[0];
				if (!showChartsNode) {
					return;
				}

				showChartsNode.onclick = lang.hitch(this, function(data) {

					this._publish(this.getChannel('TIMESERIES_DATA'), data);
				}, popupData);
			}
		},

		_getPopupContent: function(data) {

			return this.templatePopup({
				i18n: this.i18n,
				feature: data.feature
			});
		}
	});
});
+104 −0
Original line number Diff line number Diff line
define([
	'app/viewers/views/_SeriesSelectionManagement'
	, 'app/viewers/views/_TimeSeriesDataManagement'
	, 'dojo/_base/declare'
	, 'dojo/_base/lang'
	, 'dojo/aspect'
], function(
	_SeriesSelectionManagement
	, _TimeSeriesDataManagement
	, declare
	, lang
	, aspect
) {

	return declare([_TimeSeriesDataManagement, _SeriesSelectionManagement], {
		//	summary:
		//		Extensión para la vista de detalle de actividad para el manejo de series temporales.

		constructor: function(args) {

			this.config = {
				_insertedInTimeSeriesData: {},
				pathSeparator: '.'
			};

			lang.mixin(this, this.config);

			aspect.after(this, '_setOwnCallbacksForEvents', lang.hitch(this,
				this._setTimeSeriesSelectionManagementOwnCallbacksForEvents));
		},

		_setTimeSeriesSelectionManagementOwnCallbacksForEvents: function() {

			this._onEvt('HIDE', lang.hitch(this, this._onTimeSeriesSelectionManagementHidden));
		},

		_generateTimeSeriesData: function(listData) {

			this._clear();

			for (var i = 0; i < listData.length; i++) {
				var item = listData[i],
					path = item.path;

				if (path.split(this.pathSeparator).length > 2) {
					this._insertItemInDataChart(path);
				}
			}
		},

		_insertItemInDataChart: function(path) {

			if (this._indexDataList[path] !== undefined && !this._insertedInTimeSeriesData[path]) {
				this._updateDataChart = true;
				this._insertedInTimeSeriesData[path] = true;

				var item = this._dataList[this._indexDataList[path]],
					stationId = this._insertStation(this._dataList[this._indexDataList[this._getParentPath(path)]]),
					parameterId = this._insertParameter(item),
					dataDefinitionIds = this._insertDataDefinitions(item);

				this._insertOrUpdateIndex(stationId, parameterId, dataDefinitionIds);
			}
		},

		_getParentPath: function(path) {

			var regex = /(.+)\.[0-9]+$/;

			return path.replace(regex, '$1');
		},

		_insertDataDefinitions: function(item) {

			var ids = {},
				dataDefinitions = item.dataDefinitions;

			for (var n = 0; n < dataDefinitions.length; n++) {
				if (!ids[dataDefinitions[n].z]) {
					ids[dataDefinitions[n].z] = [];
				}

				ids[dataDefinitions[n].z].push(dataDefinitions[n].id);

				if (!this.seriesData.data.definitions[dataDefinitions[n].id]) {
					var dataDef = lang.clone(dataDefinitions[n]);
					delete dataDef.id;
					delete dataDef.unit;

					this.seriesData.data.definitions[dataDefinitions[n].id] = dataDef;
				}
			}

			return ids;
		},

		_clear: function() {

			this._insertedInTimeSeriesData = {};

			this.inherited(arguments);
		}
	});
});
Loading