263 lines
8.2 KiB
JavaScript
263 lines
8.2 KiB
JavaScript
/*
|
|
* Copyright © 2016-2017 The Thingsboard Authors
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
import './entity-state-controller.scss';
|
|
|
|
/*@ngInject*/
|
|
export default function EntityStateController($scope, $location, $state, $stateParams, $q, $translate, types, dashboardUtils, entityService) {
|
|
|
|
var vm = this;
|
|
|
|
vm.inited = false;
|
|
|
|
vm.openState = openState;
|
|
vm.updateState = updateState;
|
|
vm.navigatePrevState = navigatePrevState;
|
|
vm.getStateId = getStateId;
|
|
vm.getStateParams = getStateParams;
|
|
vm.getStateParamsByStateId = getStateParamsByStateId;
|
|
|
|
vm.getStateName = getStateName;
|
|
|
|
vm.selectedStateIndex = -1;
|
|
|
|
function openState(id, params, openRightLayout) {
|
|
if (vm.states && vm.states[id]) {
|
|
resolveEntity(params).then(
|
|
function success(entityName) {
|
|
params.entityName = entityName;
|
|
var newState = {
|
|
id: id,
|
|
params: params
|
|
}
|
|
//append new state
|
|
vm.stateObject.push(newState);
|
|
vm.selectedStateIndex = vm.stateObject.length-1;
|
|
gotoState(vm.stateObject[vm.stateObject.length-1].id, true, openRightLayout);
|
|
}
|
|
);
|
|
}
|
|
}
|
|
|
|
function updateState(id, params, openRightLayout) {
|
|
if (vm.states && vm.states[id]) {
|
|
resolveEntity(params).then(
|
|
function success(entityName) {
|
|
params.entityName = entityName;
|
|
var newState = {
|
|
id: id,
|
|
params: params
|
|
}
|
|
//replace with new state
|
|
vm.stateObject[vm.stateObject.length - 1] = newState;
|
|
gotoState(vm.stateObject[vm.stateObject.length - 1].id, true, openRightLayout);
|
|
}
|
|
);
|
|
}
|
|
}
|
|
|
|
function navigatePrevState(index) {
|
|
if (index < vm.stateObject.length-1) {
|
|
vm.stateObject.splice(index+1, vm.stateObject.length-index-1);
|
|
vm.selectedStateIndex = vm.stateObject.length-1;
|
|
gotoState(vm.stateObject[vm.stateObject.length-1].id, true);
|
|
}
|
|
}
|
|
|
|
function getStateId() {
|
|
return vm.stateObject[vm.stateObject.length-1].id;
|
|
}
|
|
|
|
function getStateParams() {
|
|
return vm.stateObject[vm.stateObject.length-1].params;
|
|
}
|
|
|
|
function getStateParamsByStateId(stateId) {
|
|
var stateObj = getStateObjById(stateId);
|
|
if (stateObj) {
|
|
return stateObj.params;
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function getStateObjById(id) {
|
|
for (var i=0; i < vm.stateObject.length; i++) {
|
|
if (vm.stateObject[i].id === id) {
|
|
return vm.stateObject[i];
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function getStateName(index) {
|
|
var result = '';
|
|
if (vm.stateObject[index]) {
|
|
var params = vm.stateObject[index].params;
|
|
if (params && params.entityName) {
|
|
result = params.entityName;
|
|
} else {
|
|
var id = vm.stateObject[index].id;
|
|
var translationId = types.translate.dashboardStatePrefix + id;
|
|
var translation = $translate.instant(translationId);
|
|
if (translation != translationId) {
|
|
result = translation;
|
|
} else {
|
|
result = vm.states[vm.stateObject[index].id].name;
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
function resolveEntity(params) {
|
|
var deferred = $q.defer();
|
|
if (params && params.entityId && params.entityId.id && params.entityId.entityType) {
|
|
entityService.getEntity(params.entityId.entityType, params.entityId.id, {ignoreLoading: true, ignoreErrors: true}).then(
|
|
function success(entity) {
|
|
var entityName = entity.name;
|
|
deferred.resolve(entityName);
|
|
},
|
|
function fail() {
|
|
deferred.reject();
|
|
}
|
|
);
|
|
} else {
|
|
deferred.reject();
|
|
}
|
|
return deferred.promise;
|
|
}
|
|
|
|
function parseState(stateJson) {
|
|
var result;
|
|
if (stateJson) {
|
|
try {
|
|
result = angular.fromJson(stateJson);
|
|
} catch (e) {
|
|
result = [ { id: null, params: {} } ];
|
|
}
|
|
}
|
|
if (!result) {
|
|
result = [];
|
|
}
|
|
if (!result.length) {
|
|
result[0] = { id: null, params: {} }
|
|
}
|
|
if (!result[0].id) {
|
|
result[0].id = dashboardUtils.getRootStateId(vm.states);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
$scope.$watch('vm.states', function() {
|
|
if (vm.states) {
|
|
if (!vm.inited) {
|
|
vm.inited = true;
|
|
init();
|
|
}
|
|
}
|
|
});
|
|
|
|
function init() {
|
|
var initialState = $stateParams.state;
|
|
vm.stateObject = parseState(initialState);
|
|
vm.selectedStateIndex = vm.stateObject.length-1;
|
|
gotoState(vm.stateObject[vm.stateObject.length-1].id, false);
|
|
|
|
$scope.$watchCollection(function() {
|
|
return $state.params;
|
|
}, function(){
|
|
var currentState = $state.params.state;
|
|
vm.stateObject = parseState(currentState);
|
|
});
|
|
|
|
$scope.$watch('vm.dashboardCtrl.dashboardCtx.state', function() {
|
|
if (vm.stateObject[vm.stateObject.length-1].id !== vm.dashboardCtrl.dashboardCtx.state) {
|
|
stopWatchStateObject();
|
|
vm.stateObject[vm.stateObject.length-1].id = vm.dashboardCtrl.dashboardCtx.state;
|
|
updateLocation();
|
|
watchStateObject();
|
|
}
|
|
});
|
|
|
|
watchStateObject();
|
|
|
|
if (vm.dashboardCtrl.isMobile) {
|
|
watchSelectedStateIndex();
|
|
}
|
|
|
|
$scope.$watch('vm.dashboardCtrl.isMobile', function(newVal, prevVal) {
|
|
if (!angular.equals(newVal, prevVal)) {
|
|
if (vm.dashboardCtrl.isMobile) {
|
|
watchSelectedStateIndex();
|
|
} else {
|
|
stopWatchSelectedStateIndex();
|
|
}
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
function stopWatchStateObject() {
|
|
if (vm.stateObjectWatcher) {
|
|
vm.stateObjectWatcher();
|
|
vm.stateObjectWatcher = null;
|
|
}
|
|
}
|
|
|
|
function watchStateObject() {
|
|
vm.stateObjectWatcher = $scope.$watch('vm.stateObject', function(newVal, prevVal) {
|
|
if (!angular.equals(newVal, prevVal) && newVal) {
|
|
vm.selectedStateIndex = vm.stateObject.length-1;
|
|
gotoState(vm.stateObject[vm.stateObject.length-1].id, true);
|
|
}
|
|
}, true);
|
|
}
|
|
|
|
function stopWatchSelectedStateIndex() {
|
|
if (vm.selectedStateIndexWatcher) {
|
|
vm.selectedStateIndexWatcher();
|
|
vm.selectedStateIndexWatcher = null;
|
|
}
|
|
}
|
|
|
|
function watchSelectedStateIndex() {
|
|
vm.selectedStateIndexWatcher = $scope.$watch('vm.selectedStateIndex', function(newVal, prevVal) {
|
|
if (!angular.equals(newVal, prevVal)) {
|
|
navigatePrevState(vm.selectedStateIndex);
|
|
}
|
|
});
|
|
}
|
|
|
|
function gotoState(stateId, update, openRightLayout) {
|
|
if (vm.dashboardCtrl.dashboardCtx.state != stateId) {
|
|
vm.dashboardCtrl.openDashboardState(stateId, openRightLayout);
|
|
if (update) {
|
|
updateLocation();
|
|
}
|
|
}
|
|
}
|
|
|
|
function updateLocation() {
|
|
if (vm.stateObject[vm.stateObject.length-1].id) {
|
|
$location.search({state : angular.toJson(vm.stateObject)});
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|