Commit cc01f399 authored by Pedro Eduardo Trujillo's avatar Pedro Eduardo Trujillo
Browse files

Retoca config externa y aplica grants a layouts

Migra al nuevo esquema del fichero de configuración externa, ahora más
potente.

Permite definir varios layout por vista detalle de actividad y controlar
si los usuarios deben contar con permisos de acceso antes de cargar los
widgets, con el fin de proteger los datos de la actividad y evitar
errores de permisos de cara al usuario.

Implementa comprobación básica de permisos de acceso del usuario a la
actividad, por ahora sólo en base a su rol.

Actualiza el valor de rol gestor.

Refactoriza ligeramente la gestión de widgets de vista detalle de
actividad, con retoques de funcionamiento y un nuevo tipo de layout para
observaciones desde estación fija.
parent 3e0eb9ef
Loading
Loading
Loading
Loading
+22 −2
Original line number Diff line number Diff line
@@ -34,7 +34,8 @@ define([
					ADDED: 'added',
					ACCEPT_COOKIES: 'acceptCookies',
					REQUEST_FAILED: 'requestFailed',
					USER_HAS_EDITION_CAPABILITIES: 'userHasEditionCapabilities'
					USER_HAS_EDITION_CAPABILITIES: 'userHasEditionCapabilities',
					GOT_USER_GRANTS_FOR_ACTIVITY: 'gotUserGrantsForActivity'
				},
				actions: {
					GET_CREDENTIALS: 'getCredentials',
@@ -48,7 +49,9 @@ define([
					COOKIES_STATE: 'cookiesState',
					REQUEST_FAILED: 'requestFailed',
					HAS_USER_EDITION_CAPABILITIES: 'hasUserEditionCapabilities',
					USER_HAS_EDITION_CAPABILITIES: 'userHasEditionCapabilities'
					USER_HAS_EDITION_CAPABILITIES: 'userHasEditionCapabilities',
					GET_USER_GRANTS_FOR_ACTIVITY: 'getUserGrantsForActivity',
					GOT_USER_GRANTS_FOR_ACTIVITY: 'gotUserGrantsForActivity'
				},

				target: redmicConfig.services.profile,
@@ -98,6 +101,9 @@ define([
			},{
				channel : this.getChannel('HAS_USER_EDITION_CAPABILITIES'),
				callback: '_subHasUserEditionCapabilities'
			},{
				channel : this.getChannel('GET_USER_GRANTS_FOR_ACTIVITY'),
				callback: '_subGetUserGrantsForActivity'
			});
		},

@@ -124,6 +130,9 @@ define([
			},{
				event: 'USER_HAS_EDITION_CAPABILITIES',
				channel: this.getChannel('USER_HAS_EDITION_CAPABILITIES')
			},{
				event: 'GOT_USER_GRANTS_FOR_ACTIVITY',
				channel: this.getChannel('GOT_USER_GRANTS_FOR_ACTIVITY')
			});
		},

@@ -169,6 +178,17 @@ define([
			});
		},

		_subGetUserGrantsForActivity: function(req) {
			// TODO consultar contra el servidor utilizando id de actividad y usuario

			var activityId = req.activityId,
				accessGranted = Credentials.userIsEditor();

			this._emitEvt('GOT_USER_GRANTS_FOR_ACTIVITY', {
				accessGranted: accessGranted
			});
		},

		_onAccessTokenChanged: function(evt) {

			var value = evt.value;
+21 −8
Original line number Diff line number Diff line
define([
	'src/redmicConfig'
	'dojo/_base/declare'
	, 'dojo/_base/lang'
	, 'app/designs/details/main/ActivityTrackingMap'
	, 'app/details/views/ActivityAreaMapBase'
	, 'app/details/views/ActivityCitationMapBase'
	, 'app/details/views/ActivityFixedTimeseriesChart'
	, 'src/detail/activity/widget/ActivityFixedObservationSeriesMap'
	, 'app/details/views/ActivityFixedTimeseriesMap'
	, 'app/details/views/ActivityInfrastructureMapBase'
	, 'app/details/views/ActivityLayerMapBase'
	, 'dojo/_base/declare'
	, 'dojo/_base/lang'
	, 'src/util/Credentials'
	, 'src/component/base/_Filter'
	, 'src/component/browser/_ButtonsInRow'
@@ -25,16 +25,16 @@ define([
	, 'templates/OrganisationSet'
	, 'templates/PlatformSet'
], function(
	redmicConfig
	declare
	, lang
	, ActivityTrackingMap
	, ActivityAreaMapBase
	, ActivityCitationMapBase
	, ActivityFixedTimeseriesChart
	, ActivityFixedObservationSeriesMap
	, ActivityFixedTimeseriesMap
	, ActivityInfrastructureMapBase
	, ActivityLayerMapBase
	, declare
	, lang
	, Credentials
	, _Filter
	, _ButtonsInRow
@@ -309,6 +309,19 @@ define([
			};
		},

		_getActivityFixedObservationSeriesMapConfig: function(config) {

			return {
				width: 6,
				height: 6,
				type: ActivityFixedObservationSeriesMap,
				props: {
					title: 'associatedObservationStation',
					pathVariableId: this._activityData.id
				}
			};
		},

		_getActivityFixedTimeseriesMapConfig: function(config) {

			return {
@@ -322,7 +335,7 @@ define([
			};
		},

		_getActivityFixedTimeseriesChartConfig: function(mapKey) {
		_getActivityFixedTimeseriesChartConfig: function(mapKey, config) {

			return {
				width: 6,
@@ -336,7 +349,7 @@ define([
			};
		},

		_getActivityEmbeddedContentsConfig: function(node, i) {
		_getActivityEmbeddedContentsConfig: function(node, i, config) {

			return {
				width: 6,
+112 −28
Original line number Diff line number Diff line
define([
	'dojo/_base/declare'
	, 'dojo/_base/lang'
	, 'dojo/Deferred'
	, 'src/detail/_WidgetDefinition'
], function(
	declare
	, lang
	, Deferred
	, _WidgetDefinition
) {

@@ -11,14 +15,80 @@ define([
		//		Aplicación de componentes adicionales para la vista detalle de Activity, en función del tipo de layout
		//		establecido según su identificador. Si no está establecido, se decide según su categoría.

		constructor: function(args) {

			this.config = {
				mainActions: {
					GET_USER_GRANTS_FOR_ACTIVITY: 'getUserGrantsForActivity',
					GOT_USER_GRANTS_FOR_ACTIVITY: 'gotUserGrantsForActivity'
				}
			};

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

		_onDetailLayoutsPropSet: function(evt) {

			var currentElementId = this.pathVariableId,
				detailLayout = evt.value[currentElementId];
				activityDetailLayouts = evt.value && evt.value[currentElementId];

			if (!activityDetailLayouts || !activityDetailLayouts.length) {
				return;
			}

			this._processActivityDetailLayouts(currentElementId, activityDetailLayouts);
		},

		_processActivityDetailLayouts: function(activityId, layouts) {

			layouts.forEach(lang.hitch(this, function(layout) {

			if (detailLayout) {
				this._prepareDetailLayoutWidgets(detailLayout);
				var layoutType = layout.type,
					layoutConfig = layout.config || {},
					layoutCheckGrants = layout.checkGrants || false;

				if (!layoutType) {
					return;
				}

				var grantedCallback = lang.hitch(this, this._prepareDetailLayoutWidgets, layoutType, layoutConfig);

				if (layoutCheckGrants) {
					var notGrantedCallback = lang.hitch(this, this._onLayoutNotGranted),
						dfd = new Deferred();

					dfd.then(grantedCallback, notGrantedCallback);

					this._checkUserGrantsForActivityData(activityId, dfd);
				} else {
					grantedCallback();
				}
			}));
		},

		_checkUserGrantsForActivityData: function(activityId, dfd) {

			var channelToSubscribe = this._buildChannel(this.credentialsChannel, 'GOT_USER_GRANTS_FOR_ACTIVITY');

			this._once(channelToSubscribe, lang.hitch(this, function(grantsDfd, res) {

				if (res.accessGranted) {
					grantsDfd.resolve();
				} else {
					grantsDfd.reject();
				}
			}, dfd));

			var channelToPublish = this._buildChannel(this.credentialsChannel, 'GET_USER_GRANTS_FOR_ACTIVITY');
			this._publish(channelToPublish, {
				activityId: activityId
			});
		},

		_onLayoutNotGranted: function(res) {

			// TODO mostrar al usuario un aviso de que existen datos en la actividad, pero no tiene permiso.
			// Ofrecerle identificarse.
		},

		_prepareCustomWidgets: function() {
@@ -33,35 +103,39 @@ define([
			}
		},

		_prepareDetailLayoutWidgets: function(detailLayout) {
		_prepareDetailLayoutWidgets: function(detailLayout, layoutConfig) {

			if (!this._detailLayoutWidgets) {
				this._detailLayoutWidgets = [];
			}

			var widgetKey;
			var prepareWidgetsMethod;

			if (detailLayout === 'citationMap') {
				widgetKey = this._prepareCitationActivityWidgets();
				prepareWidgetsMethod = '_prepareCitationActivityWidgets';
			} else if (detailLayout === 'ogcLayerMap') {
				widgetKey = this._prepareMapLayerActivityWidgets();
				prepareWidgetsMethod = '_prepareMapLayerActivityWidgets';
			} else if (detailLayout === 'trackingMap') {
				widgetKey = this._prepareTrackingActivityWidgets();
				prepareWidgetsMethod = '_prepareTrackingActivityWidgets';
			} else if (detailLayout === 'infrastructureMap') {
				widgetKey = this._prepareInfrastructureActivityWidgets();
				prepareWidgetsMethod = '_prepareInfrastructureActivityWidgets';
			} else if (detailLayout === 'areaMap') {
				widgetKey = this._prepareAreaActivityWidgets();
				prepareWidgetsMethod = '_prepareAreaActivityWidgets';
			} else if (detailLayout === 'featureMap') {
				prepareWidgetsMethod = '_prepareFixedObservationSeriesActivityWidgets';
			} else if (detailLayout === 'featureTimeseriesMapChart') {
				widgetKey = this._prepareFixedTimeseriesActivityWidgets();
				prepareWidgetsMethod = '_prepareFixedTimeseriesActivityWidgets';
			} else if (detailLayout === 'embeddedContent') {
				widgetKey = this._prepareEmbeddedContentsActivityWidgets();
				prepareWidgetsMethod = '_prepareEmbeddedContentsActivityWidgets';
			}

			if (!widgetKey) {
			if (!prepareWidgetsMethod) {
				console.warn('Tried to get widgets for "%s" detail layout, but none found!', detailLayout);
				return;
			}

			var widgetKey = this[prepareWidgetsMethod](layoutConfig);

			if (widgetKey instanceof Array) {
				this._detailLayoutWidgets = this._detailLayoutWidgets.concat(widgetKey);
			} else {
@@ -104,72 +178,82 @@ define([
			}
		},

		_prepareCitationActivityWidgets: function() {
		_prepareCitationActivityWidgets: function(layoutConfig) {

			var key = 'activityCitation',
				config = this._getActivityCitationConfig();
				config = this._getActivityCitationConfig(layoutConfig);

			this._addWidget(key, config);

			return key;
		},

		_prepareMapLayerActivityWidgets: function() {
		_prepareMapLayerActivityWidgets: function(layoutConfig) {

			var key = 'activityMapLayer',
				config = this._getActivityMapLayerConfig();
				config = this._getActivityMapLayerConfig(layoutConfig);

			this._addWidget(key, config);

			return key;
		},

		_prepareTrackingActivityWidgets: function() {
		_prepareTrackingActivityWidgets: function(layoutConfig) {

			var key = 'activityTracking',
				config = this._getActivityTrackingConfig();
				config = this._getActivityTrackingConfig(layoutConfig);

			this._addWidget(key, config);

			return key;
		},

		_prepareInfrastructureActivityWidgets: function() {
		_prepareInfrastructureActivityWidgets: function(layoutConfig) {

			var key = 'activityInfrastructure',
				config = this._getActivityInfrastructureConfig();
				config = this._getActivityInfrastructureConfig(layoutConfig);

			this._addWidget(key, config);

			return key;
		},

		_prepareAreaActivityWidgets: function() {
		_prepareAreaActivityWidgets: function(layoutConfig) {

			var key = 'activityArea',
				config = this._getActivityAreaConfig();
				config = this._getActivityAreaConfig(layoutConfig);

			this._addWidget(key, config);

			return key;
		},

		_prepareFixedObservationSeriesActivityWidgets: function(layoutConfig) {

			var key = 'activityFixedObservationSeriesMap',
				config = this._getActivityFixedObservationSeriesMapConfig(layoutConfig);

			this._addWidget(key, config);

			return key;
		},

		_prepareFixedTimeseriesActivityWidgets: function() {
		_prepareFixedTimeseriesActivityWidgets: function(layoutConfig) {

			var mapKey = 'activityFixedTimeseriesMap',
				mapConfig = this._getActivityFixedTimeseriesMapConfig();
				mapConfig = this._getActivityFixedTimeseriesMapConfig(layoutConfig);

			this._addWidget(mapKey, mapConfig);

			var chartKey = 'activityFixedTimeseriesChart',
				chartConfig = this._getActivityFixedTimeseriesChartConfig(mapKey);
				chartConfig = this._getActivityFixedTimeseriesChartConfig(mapKey, layoutConfig);

			this._addWidget(chartKey, chartConfig);

			return [mapKey, chartKey];
		},

		_prepareEmbeddedContentsActivityWidgets: function() {
		_prepareEmbeddedContentsActivityWidgets: function(layoutConfig) {

			var embeddedContents = this._activityData.embeddedContents,
				keys = [];
@@ -182,7 +266,7 @@ define([
				embeddedContentParentNode.innerHTML = embeddedContentValue;

				var key = 'embeddedContent' + i,
					config = this._getActivityEmbeddedContentsConfig(embeddedContentParentNode.firstChild, i);
					config = this._getActivityEmbeddedContentsConfig(embeddedContentParentNode.firstChild, i, layoutConfig);

				keys.push(key);

+111 −0
Original line number Diff line number Diff line
define([
	"app/designs/details/main/ActivityMap"
	, 'src/redmicConfig'
	, "dojo/_base/declare"
	, "dojo/_base/lang"
	, "dojo/aspect"
	, "templates/InfrastructurePopup"
	, "templates/InfrastructureList"
], function(
	ActivityMap
	, redmicConfig
	, declare
	, lang
	, aspect
	, TemplatePopup
	, TemplateList
){
	return declare(ActivityMap, {
		//	summary:
		//

		constructor: function (args) {

			this.config = {
				target: redmicConfig.services.activity,
				templateTargetChange: redmicConfig.services.activityObservationSeriesStations,
				templatePopup: TemplatePopup,
				_activeRadius: false,
			};

			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,
							rowConfig: {
								buttonsConfig: {
									listButton: [{
										icon: 'fa-bar-chart',
										btnId: 'showObservations',
										returnItem: true,
										title: this.i18n.observations
									}]
								}
							}
						}
					}
				}
			}, this.widgetConfigs || {}], {
				arrayMergingStrategy: 'concatenate'
			});
		},

		_afterShow: function() {

			this.inherited(arguments);

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

			this._subscribe(this._getWidgetInstance('geographic').getChildChannel('browser', 'BUTTON_EVENT'),
				lang.hitch(this, this._onBrowserButtonEvent));
		},

		_onStationPopupLoaded: function(res) {

			if (!res) {
				return;
			}

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

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

				showChartsNode.onclick = lang.hitch(this, this._loadObservationSeriesData, popupData);
			}
		},

		_getPopupContent: function(data) {

			return this.templatePopup({
				i18n: this.i18n,
				feature: data.feature
			});
		},

		_onBrowserButtonEvent: function(evt) {

			if (evt.btnId === 'showObservations') {
				this._loadObservationSeriesData(evt.item);
			}
		},

		_loadObservationSeriesData: function(item) {

			console.log('cargo los datos de observaciones', item);
		}
	});
});
+3 −1
Original line number Diff line number Diff line
@@ -71,7 +71,9 @@ define([
						}
					}
				}
			}, this.widgetConfigs || {}]);
			}, this.widgetConfigs || {}], {
				arrayMergingStrategy: 'concatenate'
			});

			this.layerConfig = this._merge([{
				idProperty: 'uuid',
Loading