18 changed files with 728 additions and 167 deletions
@ -0,0 +1,40 @@ |
|||||
|
/* |
||||
|
* 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. |
||||
|
*/ |
||||
|
export default angular.module('thingsboard.filters.keyboardShortcut', []) |
||||
|
.filter('keyboardShortcut', KeyboardShortcut) |
||||
|
.name; |
||||
|
|
||||
|
/*@ngInject*/ |
||||
|
function KeyboardShortcut($window) { |
||||
|
return function(str) { |
||||
|
if (!str) return; |
||||
|
var keys = str.split('-'); |
||||
|
var isOSX = /Mac OS X/.test($window.navigator.userAgent); |
||||
|
|
||||
|
var seperator = (!isOSX || keys.length > 2) ? '+' : ''; |
||||
|
|
||||
|
var abbreviations = { |
||||
|
M: isOSX ? '⌘' : 'Ctrl', |
||||
|
A: isOSX ? 'Option' : 'Alt', |
||||
|
S: 'Shift' |
||||
|
}; |
||||
|
|
||||
|
return keys.map(function(key, index) { |
||||
|
var last = index == keys.length - 1; |
||||
|
return last ? key : abbreviations[key]; |
||||
|
}).join(seperator); |
||||
|
}; |
||||
|
} |
||||
@ -0,0 +1,51 @@ |
|||||
|
/* |
||||
|
* 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. |
||||
|
*/ |
||||
|
|
||||
|
export default angular.module('thingsboard.directives.mousepointMenu', []) |
||||
|
.directive('tbMousepointMenu', MousepointMenu) |
||||
|
.name; |
||||
|
|
||||
|
/*@ngInject*/ |
||||
|
function MousepointMenu() { |
||||
|
|
||||
|
var linker = function ($scope, $element, $attrs, RightClickContextMenu) { |
||||
|
|
||||
|
$scope.$mdOpenMousepointMenu = function($event){ |
||||
|
RightClickContextMenu.offsets = function(){ |
||||
|
var offset = $element.offset(); |
||||
|
var x = $event.pageX - offset.left; |
||||
|
var y = $event.pageY - offset.top; |
||||
|
|
||||
|
var offsets = { |
||||
|
left: x, |
||||
|
top: y |
||||
|
} |
||||
|
return offsets; |
||||
|
} |
||||
|
RightClickContextMenu.open($event); |
||||
|
}; |
||||
|
|
||||
|
$scope.$mdCloseMousepointMenu = function() { |
||||
|
RightClickContextMenu.close(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return { |
||||
|
restrict: "A", |
||||
|
link: linker, |
||||
|
require: 'mdMenu' |
||||
|
}; |
||||
|
} |
||||
@ -0,0 +1,191 @@ |
|||||
|
/* |
||||
|
* 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; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
||||
Loading…
Reference in new issue