191 lines
6.3 KiB
JavaScript
191 lines
6.3 KiB
JavaScript
|
|
/*
|
||
|
|
* Copyright © 2016 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 angularStorage from 'angular-storage';
|
||
|
|
|
||
|
|
export default angular.module('thingsboard.itembuffer', [angularStorage])
|
||
|
|
.factory('itembuffer', ItemBuffer)
|
||
|
|
.factory('bufferStore', function(store) {
|
||
|
|
var newStore = store.getNamespacedStore('tbBufferStore', null, null, false);
|
||
|
|
return newStore;
|
||
|
|
})
|
||
|
|
.name;
|
||
|
|
|
||
|
|
/*@ngInject*/
|
||
|
|
function ItemBuffer(bufferStore) {
|
||
|
|
|
||
|
|
const WIDGET_ITEM = "widget_item";
|
||
|
|
|
||
|
|
var service = {
|
||
|
|
copyWidget: copyWidget,
|
||
|
|
hasWidget: hasWidget,
|
||
|
|
pasteWidget: pasteWidget,
|
||
|
|
addWidgetToDashboard: addWidgetToDashboard
|
||
|
|
}
|
||
|
|
|
||
|
|
return service;
|
||
|
|
|
||
|
|
/**
|
||
|
|
aliasesInfo {
|
||
|
|
datasourceAliases: {
|
||
|
|
datasourceIndex: {
|
||
|
|
aliasName: "...",
|
||
|
|
deviceId: "..."
|
||
|
|
}
|
||
|
|
}
|
||
|
|
targetDeviceAliases: {
|
||
|
|
targetDeviceAliasIndex: {
|
||
|
|
aliasName: "...",
|
||
|
|
deviceId: "..."
|
||
|
|
}
|
||
|
|
}
|
||
|
|
....
|
||
|
|
}
|
||
|
|
**/
|
||
|
|
|
||
|
|
function copyWidget(widget, aliasesInfo, originalColumns) {
|
||
|
|
var widgetItem = {
|
||
|
|
widget: widget,
|
||
|
|
aliasesInfo: aliasesInfo,
|
||
|
|
originalColumns: originalColumns
|
||
|
|
}
|
||
|
|
bufferStore.set(WIDGET_ITEM, angular.toJson(widgetItem));
|
||
|
|
}
|
||
|
|
|
||
|
|
function hasWidget() {
|
||
|
|
return bufferStore.get(WIDGET_ITEM);
|
||
|
|
}
|
||
|
|
|
||
|
|
function pasteWidget(targetDasgboard, position) {
|
||
|
|
var widgetItemJson = bufferStore.get(WIDGET_ITEM);
|
||
|
|
if (widgetItemJson) {
|
||
|
|
var widgetItem = angular.fromJson(widgetItemJson);
|
||
|
|
var widget = widgetItem.widget;
|
||
|
|
var aliasesInfo = widgetItem.aliasesInfo;
|
||
|
|
var originalColumns = widgetItem.originalColumns;
|
||
|
|
var targetRow = -1;
|
||
|
|
var targetColumn = -1;
|
||
|
|
if (position) {
|
||
|
|
targetRow = position.row;
|
||
|
|
targetColumn = position.column;
|
||
|
|
}
|
||
|
|
addWidgetToDashboard(targetDasgboard, widget, aliasesInfo, originalColumns, targetRow, targetColumn);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function addWidgetToDashboard(dashboard, widget, aliasesInfo, originalColumns, row, column) {
|
||
|
|
var theDashboard;
|
||
|
|
if (dashboard) {
|
||
|
|
theDashboard = dashboard;
|
||
|
|
} else {
|
||
|
|
theDashboard = {};
|
||
|
|
}
|
||
|
|
if (!theDashboard.configuration) {
|
||
|
|
theDashboard.configuration = {};
|
||
|
|
}
|
||
|
|
if (!theDashboard.configuration.deviceAliases) {
|
||
|
|
theDashboard.configuration.deviceAliases = {};
|
||
|
|
}
|
||
|
|
updateAliases(theDashboard, widget, aliasesInfo);
|
||
|
|
|
||
|
|
if (!theDashboard.configuration.widgets) {
|
||
|
|
theDashboard.configuration.widgets = [];
|
||
|
|
}
|
||
|
|
var targetColumns = 24;
|
||
|
|
if (theDashboard.configuration.gridSettings &&
|
||
|
|
theDashboard.configuration.gridSettings.columns) {
|
||
|
|
targetColumns = theDashboard.configuration.gridSettings.columns;
|
||
|
|
}
|
||
|
|
if (targetColumns != originalColumns) {
|
||
|
|
var ratio = targetColumns / originalColumns;
|
||
|
|
widget.sizeX *= ratio;
|
||
|
|
widget.sizeY *= ratio;
|
||
|
|
}
|
||
|
|
if (row > -1 && column > - 1) {
|
||
|
|
widget.row = row;
|
||
|
|
widget.col = column;
|
||
|
|
} else {
|
||
|
|
row = 0;
|
||
|
|
for (var w in theDashboard.configuration.widgets) {
|
||
|
|
var existingWidget = theDashboard.configuration.widgets[w];
|
||
|
|
var wRow = existingWidget.row ? existingWidget.row : 0;
|
||
|
|
var wSizeY = existingWidget.sizeY ? existingWidget.sizeY : 1;
|
||
|
|
var bottom = wRow + wSizeY;
|
||
|
|
row = Math.max(row, bottom);
|
||
|
|
}
|
||
|
|
widget.row = row;
|
||
|
|
widget.col = 0;
|
||
|
|
}
|
||
|
|
theDashboard.configuration.widgets.push(widget);
|
||
|
|
return theDashboard;
|
||
|
|
}
|
||
|
|
|
||
|
|
function updateAliases(dashboard, widget, aliasesInfo) {
|
||
|
|
var deviceAliases = dashboard.configuration.deviceAliases;
|
||
|
|
var aliasInfo;
|
||
|
|
var newAliasId;
|
||
|
|
for (var datasourceIndex in aliasesInfo.datasourceAliases) {
|
||
|
|
aliasInfo = aliasesInfo.datasourceAliases[datasourceIndex];
|
||
|
|
newAliasId = getDeviceAliasId(deviceAliases, aliasInfo);
|
||
|
|
widget.config.datasources[datasourceIndex].deviceAliasId = newAliasId;
|
||
|
|
}
|
||
|
|
for (var targetDeviceAliasIndex in aliasesInfo.targetDeviceAliases) {
|
||
|
|
aliasInfo = aliasesInfo.targetDeviceAliases[targetDeviceAliasIndex];
|
||
|
|
newAliasId = getDeviceAliasId(deviceAliases, aliasInfo);
|
||
|
|
widget.config.targetDeviceAliasIds[targetDeviceAliasIndex] = newAliasId;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function getDeviceAliasId(deviceAliases, aliasInfo) {
|
||
|
|
var newAliasId;
|
||
|
|
for (var aliasId in deviceAliases) {
|
||
|
|
if (deviceAliases[aliasId].deviceId === aliasInfo.deviceId) {
|
||
|
|
newAliasId = aliasId;
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (!newAliasId) {
|
||
|
|
var newAliasName = createDeviceAliasName(deviceAliases, aliasInfo.aliasName);
|
||
|
|
newAliasId = 0;
|
||
|
|
for (aliasId in deviceAliases) {
|
||
|
|
newAliasId = Math.max(newAliasId, aliasId);
|
||
|
|
}
|
||
|
|
newAliasId++;
|
||
|
|
deviceAliases[newAliasId] = {alias: newAliasName, deviceId: aliasInfo.deviceId};
|
||
|
|
}
|
||
|
|
return newAliasId;
|
||
|
|
}
|
||
|
|
|
||
|
|
function createDeviceAliasName(deviceAliases, alias) {
|
||
|
|
var c = 0;
|
||
|
|
var newAlias = angular.copy(alias);
|
||
|
|
var unique = false;
|
||
|
|
while (!unique) {
|
||
|
|
unique = true;
|
||
|
|
for (var devAliasId in deviceAliases) {
|
||
|
|
var devAlias = deviceAliases[devAliasId];
|
||
|
|
if (newAlias === devAlias.alias) {
|
||
|
|
c++;
|
||
|
|
newAlias = alias + c;
|
||
|
|
unique = false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return newAlias;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
}
|