62 changed files with 3010 additions and 33 deletions
@ -0,0 +1,123 @@ |
|||||
|
/* |
||||
|
* Copyright © 2016-2019 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. |
||||
|
*/ |
||||
|
/*@ngInject*/ |
||||
|
export default function AddAssetsToEdgeController(assetService, $mdDialog, $q, edgeId, assets) { |
||||
|
|
||||
|
var vm = this; |
||||
|
|
||||
|
vm.assets = assets; |
||||
|
vm.searchText = ''; |
||||
|
|
||||
|
vm.assign = assign; |
||||
|
vm.cancel = cancel; |
||||
|
vm.hasData = hasData; |
||||
|
vm.noData = noData; |
||||
|
vm.searchAssetTextUpdated = searchAssetTextUpdated; |
||||
|
vm.toggleAssetSelection = toggleAssetSelection; |
||||
|
|
||||
|
vm.theAssets = { |
||||
|
getItemAtIndex: function (index) { |
||||
|
if (index > vm.assets.data.length) { |
||||
|
vm.theAssets.fetchMoreItems_(index); |
||||
|
return null; |
||||
|
} |
||||
|
var item = vm.assets.data[index]; |
||||
|
if (item) { |
||||
|
item.indexNumber = index + 1; |
||||
|
} |
||||
|
return item; |
||||
|
}, |
||||
|
|
||||
|
getLength: function () { |
||||
|
if (vm.assets.hasNext) { |
||||
|
return vm.assets.data.length + vm.assets.nextPageLink.limit; |
||||
|
} else { |
||||
|
return vm.assets.data.length; |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
fetchMoreItems_: function () { |
||||
|
if (vm.assets.hasNext && !vm.assets.pending) { |
||||
|
vm.assets.pending = true; |
||||
|
assetService.getTenantAssets(vm.assets.nextPageLink, false).then( |
||||
|
function success(assets) { |
||||
|
vm.assets.data = vm.assets.data.concat(assets.data); |
||||
|
vm.assets.nextPageLink = assets.nextPageLink; |
||||
|
vm.assets.hasNext = assets.hasNext; |
||||
|
if (vm.assets.hasNext) { |
||||
|
vm.assets.nextPageLink.limit = vm.assets.pageSize; |
||||
|
} |
||||
|
vm.assets.pending = false; |
||||
|
}, |
||||
|
function fail() { |
||||
|
vm.assets.hasNext = false; |
||||
|
vm.assets.pending = false; |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
function cancel () { |
||||
|
$mdDialog.cancel(); |
||||
|
} |
||||
|
|
||||
|
function assign() { |
||||
|
var tasks = []; |
||||
|
for (var assetId in vm.assets.selections) { |
||||
|
tasks.push(assetService.assignAssetToEdge(edgeId, assetId)); |
||||
|
} |
||||
|
$q.all(tasks).then(function () { |
||||
|
$mdDialog.hide(); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
function noData() { |
||||
|
return vm.assets.data.length == 0 && !vm.assets.hasNext; |
||||
|
} |
||||
|
|
||||
|
function hasData() { |
||||
|
return vm.assets.data.length > 0; |
||||
|
} |
||||
|
|
||||
|
function toggleAssetSelection($event, asset) { |
||||
|
$event.stopPropagation(); |
||||
|
var selected = angular.isDefined(asset.selected) && asset.selected; |
||||
|
asset.selected = !selected; |
||||
|
if (asset.selected) { |
||||
|
vm.assets.selections[asset.id.id] = true; |
||||
|
vm.assets.selectedCount++; |
||||
|
} else { |
||||
|
delete vm.assets.selections[asset.id.id]; |
||||
|
vm.assets.selectedCount--; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function searchAssetTextUpdated() { |
||||
|
vm.assets = { |
||||
|
pageSize: vm.assets.pageSize, |
||||
|
data: [], |
||||
|
nextPageLink: { |
||||
|
limit: vm.assets.pageSize, |
||||
|
textSearch: vm.searchText |
||||
|
}, |
||||
|
selections: {}, |
||||
|
selectedCount: 0, |
||||
|
hasNext: true, |
||||
|
pending: false |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,77 @@ |
|||||
|
<!-- |
||||
|
|
||||
|
Copyright © 2016-2019 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. |
||||
|
|
||||
|
--> |
||||
|
<md-dialog aria-label="{{ 'asset.assign-to-edge' | translate }}"> |
||||
|
<form name="theForm" ng-submit="vm.assign()"> |
||||
|
<md-toolbar> |
||||
|
<div class="md-toolbar-tools"> |
||||
|
<h2 translate>asset.assign-asset-to-edge</h2> |
||||
|
<span flex></span> |
||||
|
<md-button class="md-icon-button" ng-click="vm.cancel()"> |
||||
|
<ng-md-icon icon="close" aria-label="{{ 'dialog.close' | translate }}"></ng-md-icon> |
||||
|
</md-button> |
||||
|
</div> |
||||
|
</md-toolbar> |
||||
|
<md-progress-linear class="md-warn" md-mode="indeterminate" ng-disabled="!$root.loading" ng-show="$root.loading"></md-progress-linear> |
||||
|
<span style="min-height: 5px;" flex="" ng-show="!$root.loading"></span> |
||||
|
<md-dialog-content> |
||||
|
<div class="md-dialog-content"> |
||||
|
<fieldset> |
||||
|
<span translate>asset.assign-asset-to-edge-text</span> |
||||
|
<md-input-container class="md-block" style='margin-bottom: 0px;'> |
||||
|
<label> </label> |
||||
|
<md-icon aria-label="{{ 'action.search' | translate }}" class="material-icons"> |
||||
|
search |
||||
|
</md-icon> |
||||
|
<input id="asset-search" autofocus ng-model="vm.searchText" |
||||
|
ng-change="vm.searchAssetTextUpdated()" |
||||
|
placeholder="{{ 'common.enter-search' | translate }}"/> |
||||
|
</md-input-container> |
||||
|
<div style='min-height: 150px;'> |
||||
|
<span translate layout-align="center center" |
||||
|
style="text-transform: uppercase; display: flex; height: 150px;" |
||||
|
class="md-subhead" |
||||
|
ng-show="vm.noData()">asset.no-assets-text</span> |
||||
|
<md-virtual-repeat-container ng-show="vm.hasData()" |
||||
|
tb-scope-element="repeatContainer" md-top-index="vm.topIndex" flex |
||||
|
style='min-height: 150px; width: 100%;'> |
||||
|
<md-list> |
||||
|
<md-list-item md-virtual-repeat="asset in vm.theAssets" md-on-demand |
||||
|
class="repeated-item" flex> |
||||
|
<md-checkbox ng-click="vm.toggleAssetSelection($event, asset)" |
||||
|
aria-label="{{ 'item.selected' | translate }}" |
||||
|
ng-checked="asset.selected"></md-checkbox> |
||||
|
<span> {{ asset.name }} </span> |
||||
|
</md-list-item> |
||||
|
</md-list> |
||||
|
</md-virtual-repeat-container> |
||||
|
</div> |
||||
|
</fieldset> |
||||
|
</div> |
||||
|
</md-dialog-content> |
||||
|
<md-dialog-actions layout="row"> |
||||
|
<span flex></span> |
||||
|
<md-button ng-disabled="$root.loading || vm.assets.selectedCount == 0" type="submit" |
||||
|
class="md-raised md-primary"> |
||||
|
{{ 'action.assign' | translate }} |
||||
|
</md-button> |
||||
|
<md-button ng-disabled="$root.loading" ng-click="vm.cancel()" style="margin-right:20px;">{{ 'action.cancel' | |
||||
|
translate }} |
||||
|
</md-button> |
||||
|
</md-dialog-actions> |
||||
|
</form> |
||||
|
</md-dialog> |
||||
@ -0,0 +1,123 @@ |
|||||
|
/* |
||||
|
* Copyright © 2016-2019 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. |
||||
|
*/ |
||||
|
/*@ngInject*/ |
||||
|
export default function AssignAssetToEdgeController(edgeService, assetService, $mdDialog, $q, assetIds, edges) { |
||||
|
|
||||
|
var vm = this; |
||||
|
|
||||
|
vm.edges = edges; |
||||
|
vm.searchText = ''; |
||||
|
|
||||
|
vm.assign = assign; |
||||
|
vm.cancel = cancel; |
||||
|
vm.isEdgeSelected = isEdgeSelected; |
||||
|
vm.hasData = hasData; |
||||
|
vm.noData = noData; |
||||
|
vm.searchEdgeTextUpdated = searchEdgeTextUpdated; |
||||
|
vm.toggleEdgeSelection = toggleEdgeSelection; |
||||
|
|
||||
|
vm.theEdges = { |
||||
|
getItemAtIndex: function (index) { |
||||
|
if (index > vm.edges.data.length) { |
||||
|
vm.theEdges.fetchMoreItems_(index); |
||||
|
return null; |
||||
|
} |
||||
|
var item = vm.edges.data[index]; |
||||
|
if (item) { |
||||
|
item.indexNumber = index + 1; |
||||
|
} |
||||
|
return item; |
||||
|
}, |
||||
|
|
||||
|
getLength: function () { |
||||
|
if (vm.edges.hasNext) { |
||||
|
return vm.edges.data.length + vm.edges.nextPageLink.limit; |
||||
|
} else { |
||||
|
return vm.edges.data.length; |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
fetchMoreItems_: function () { |
||||
|
if (vm.edges.hasNext && !vm.edges.pending) { |
||||
|
vm.edges.pending = true; |
||||
|
edgeService.getEdges(vm.edges.nextPageLink).then( |
||||
|
function success(edges) { |
||||
|
vm.edges.data = vm.edges.data.concat(edges.data); |
||||
|
vm.edges.nextPageLink = edges.nextPageLink; |
||||
|
vm.edges.hasNext = edges.hasNext; |
||||
|
if (vm.edges.hasNext) { |
||||
|
vm.edges.nextPageLink.limit = vm.edges.pageSize; |
||||
|
} |
||||
|
vm.edges.pending = false; |
||||
|
}, |
||||
|
function fail() { |
||||
|
vm.edges.hasNext = false; |
||||
|
vm.edges.pending = false; |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
function cancel() { |
||||
|
$mdDialog.cancel(); |
||||
|
} |
||||
|
|
||||
|
function assign() { |
||||
|
var tasks = []; |
||||
|
for (var i=0;i<assetIds.length;i++) { |
||||
|
tasks.push(assetService.assignAssetToEdge(vm.edges.selection.id.id, assetIds[i])); |
||||
|
} |
||||
|
$q.all(tasks).then(function () { |
||||
|
$mdDialog.hide(); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
function noData() { |
||||
|
return vm.edges.data.length == 0 && !vm.edges.hasNext; |
||||
|
} |
||||
|
|
||||
|
function hasData() { |
||||
|
return vm.edges.data.length > 0; |
||||
|
} |
||||
|
|
||||
|
function toggleEdgeSelection($event, edge) { |
||||
|
$event.stopPropagation(); |
||||
|
if (vm.isEdgeSelected(edge)) { |
||||
|
vm.edges.selection = null; |
||||
|
} else { |
||||
|
vm.edges.selection = edge; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function isEdgeSelected(edge) { |
||||
|
return vm.edges.selection != null && edge && |
||||
|
edge.id.id === vm.edges.selection.id.id; |
||||
|
} |
||||
|
|
||||
|
function searchEdgeTextUpdated() { |
||||
|
vm.edges = { |
||||
|
pageSize: vm.edges.pageSize, |
||||
|
data: [], |
||||
|
nextPageLink: { |
||||
|
limit: vm.edges.pageSize, |
||||
|
textSearch: vm.searchText |
||||
|
}, |
||||
|
selection: null, |
||||
|
hasNext: true, |
||||
|
pending: false |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,76 @@ |
|||||
|
<!-- |
||||
|
|
||||
|
Copyright © 2016-2019 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. |
||||
|
|
||||
|
--> |
||||
|
<md-dialog aria-label="{{ 'asset.assign-asset-to-edge' | translate }}"> |
||||
|
<form name="theForm" ng-submit="vm.assign()"> |
||||
|
<md-toolbar> |
||||
|
<div class="md-toolbar-tools"> |
||||
|
<h2 translate>asset.assign-asset-to-edge</h2> |
||||
|
<span flex></span> |
||||
|
<md-button class="md-icon-button" ng-click="vm.cancel()"> |
||||
|
<ng-md-icon icon="close" aria-label="{{ 'dialog.close' | translate }}"></ng-md-icon> |
||||
|
</md-button> |
||||
|
</div> |
||||
|
</md-toolbar> |
||||
|
<md-progress-linear class="md-warn" md-mode="indeterminate" ng-disabled="!$root.loading" ng-show="$root.loading"></md-progress-linear> |
||||
|
<span style="min-height: 5px;" flex="" ng-show="!$root.loading"></span> |
||||
|
<md-dialog-content> |
||||
|
<div class="md-dialog-content"> |
||||
|
<fieldset> |
||||
|
<span translate>asset.assign-to-edge-text</span> |
||||
|
<md-input-container class="md-block" style='margin-bottom: 0px;'> |
||||
|
<label> </label> |
||||
|
<md-icon aria-label="{{ 'action.search' | translate }}" class="material-icons"> |
||||
|
search |
||||
|
</md-icon> |
||||
|
<input id="edge-search" autofocus ng-model="vm.searchText" |
||||
|
ng-change="vm.searchEdgeTextUpdated()" |
||||
|
placeholder="{{ 'common.enter-search' | translate }}"/> |
||||
|
</md-input-container> |
||||
|
<div style='min-height: 150px;'> |
||||
|
<span translate layout-align="center center" |
||||
|
style="text-transform: uppercase; display: flex; height: 150px;" |
||||
|
class="md-subhead" |
||||
|
ng-show="vm.noData()">edge.no-edges-text</span> |
||||
|
<md-virtual-repeat-container ng-show="vm.hasData()" |
||||
|
tb-scope-element="repeatContainer" md-top-index="vm.topIndex" flex |
||||
|
style='min-height: 150px; width: 100%;'> |
||||
|
<md-list> |
||||
|
<md-list-item md-virtual-repeat="edge in vm.theEdges" md-on-demand |
||||
|
class="repeated-item" flex> |
||||
|
<md-checkbox ng-click="vm.toggleEdgeSelection($event, edge)" |
||||
|
aria-label="{{ 'item.selected' | translate }}" |
||||
|
ng-checked="vm.isEdgeSelected(edge)"></md-checkbox> |
||||
|
<span> {{ edge.name }} </span> |
||||
|
</md-list-item> |
||||
|
</md-list> |
||||
|
</md-virtual-repeat-container> |
||||
|
</div> |
||||
|
</fieldset> |
||||
|
</div> |
||||
|
</md-dialog-content> |
||||
|
<md-dialog-actions layout="row"> |
||||
|
<span flex></span> |
||||
|
<md-button ng-disabled="$root.loading || vm.edges.selection==null" type="submit" class="md-raised md-primary"> |
||||
|
{{ 'action.assign' | translate }} |
||||
|
</md-button> |
||||
|
<md-button ng-disabled="$root.loading" ng-click="vm.cancel()" style="margin-right:20px;">{{ 'action.cancel' | |
||||
|
translate }} |
||||
|
</md-button> |
||||
|
</md-dialog-actions> |
||||
|
</form> |
||||
|
</md-dialog> |
||||
@ -0,0 +1,123 @@ |
|||||
|
/* |
||||
|
* Copyright © 2016-2019 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. |
||||
|
*/ |
||||
|
/*@ngInject*/ |
||||
|
export default function AddDevicesToEdgeController(deviceService, $mdDialog, $q, edgeId, devices) { |
||||
|
|
||||
|
var vm = this; |
||||
|
|
||||
|
vm.devices = devices; |
||||
|
vm.searchText = ''; |
||||
|
|
||||
|
vm.assign = assign; |
||||
|
vm.cancel = cancel; |
||||
|
vm.hasData = hasData; |
||||
|
vm.noData = noData; |
||||
|
vm.searchDeviceTextUpdated = searchDeviceTextUpdated; |
||||
|
vm.toggleDeviceSelection = toggleDeviceSelection; |
||||
|
|
||||
|
vm.theDevices = { |
||||
|
getItemAtIndex: function (index) { |
||||
|
if (index > vm.devices.data.length) { |
||||
|
vm.theDevices.fetchMoreItems_(index); |
||||
|
return null; |
||||
|
} |
||||
|
var item = vm.devices.data[index]; |
||||
|
if (item) { |
||||
|
item.indexNumber = index + 1; |
||||
|
} |
||||
|
return item; |
||||
|
}, |
||||
|
|
||||
|
getLength: function () { |
||||
|
if (vm.devices.hasNext) { |
||||
|
return vm.devices.data.length + vm.devices.nextPageLink.limit; |
||||
|
} else { |
||||
|
return vm.devices.data.length; |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
fetchMoreItems_: function () { |
||||
|
if (vm.devices.hasNext && !vm.devices.pending) { |
||||
|
vm.devices.pending = true; |
||||
|
deviceService.getTenantDevices(vm.devices.nextPageLink, false).then( |
||||
|
function success(devices) { |
||||
|
vm.devices.data = vm.devices.data.concat(devices.data); |
||||
|
vm.devices.nextPageLink = devices.nextPageLink; |
||||
|
vm.devices.hasNext = devices.hasNext; |
||||
|
if (vm.devices.hasNext) { |
||||
|
vm.devices.nextPageLink.limit = vm.devices.pageSize; |
||||
|
} |
||||
|
vm.devices.pending = false; |
||||
|
}, |
||||
|
function fail() { |
||||
|
vm.devices.hasNext = false; |
||||
|
vm.devices.pending = false; |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
function cancel () { |
||||
|
$mdDialog.cancel(); |
||||
|
} |
||||
|
|
||||
|
function assign() { |
||||
|
var tasks = []; |
||||
|
for (var deviceId in vm.devices.selections) { |
||||
|
tasks.push(deviceService.assignDeviceToEdge(edgeId, deviceId)); |
||||
|
} |
||||
|
$q.all(tasks).then(function () { |
||||
|
$mdDialog.hide(); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
function noData() { |
||||
|
return vm.devices.data.length == 0 && !vm.devices.hasNext; |
||||
|
} |
||||
|
|
||||
|
function hasData() { |
||||
|
return vm.devices.data.length > 0; |
||||
|
} |
||||
|
|
||||
|
function toggleDeviceSelection($event, device) { |
||||
|
$event.stopPropagation(); |
||||
|
var selected = angular.isDefined(device.selected) && device.selected; |
||||
|
device.selected = !selected; |
||||
|
if (device.selected) { |
||||
|
vm.devices.selections[device.id.id] = true; |
||||
|
vm.devices.selectedCount++; |
||||
|
} else { |
||||
|
delete vm.devices.selections[device.id.id]; |
||||
|
vm.devices.selectedCount--; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function searchDeviceTextUpdated() { |
||||
|
vm.devices = { |
||||
|
pageSize: vm.devices.pageSize, |
||||
|
data: [], |
||||
|
nextPageLink: { |
||||
|
limit: vm.devices.pageSize, |
||||
|
textSearch: vm.searchText |
||||
|
}, |
||||
|
selections: {}, |
||||
|
selectedCount: 0, |
||||
|
hasNext: true, |
||||
|
pending: false |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,77 @@ |
|||||
|
<!-- |
||||
|
|
||||
|
Copyright © 2016-2019 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. |
||||
|
|
||||
|
--> |
||||
|
<md-dialog aria-label="{{ 'device.assign-to-edge' | translate }}"> |
||||
|
<form name="theForm" ng-submit="vm.assign()"> |
||||
|
<md-toolbar> |
||||
|
<div class="md-toolbar-tools"> |
||||
|
<h2 translate>device.assign-device-to-edge</h2> |
||||
|
<span flex></span> |
||||
|
<md-button class="md-icon-button" ng-click="vm.cancel()"> |
||||
|
<ng-md-icon icon="close" aria-label="{{ 'dialog.close' | translate }}"></ng-md-icon> |
||||
|
</md-button> |
||||
|
</div> |
||||
|
</md-toolbar> |
||||
|
<md-progress-linear class="md-warn" md-mode="indeterminate" ng-disabled="!$root.loading" ng-show="$root.loading"></md-progress-linear> |
||||
|
<span style="min-height: 5px;" flex="" ng-show="!$root.loading"></span> |
||||
|
<md-dialog-content> |
||||
|
<div class="md-dialog-content"> |
||||
|
<fieldset> |
||||
|
<span translate>device.assign-device-to-edge-text</span> |
||||
|
<md-input-container class="md-block" style='margin-bottom: 0px;'> |
||||
|
<label> </label> |
||||
|
<md-icon aria-label="{{ 'action.search' | translate }}" class="material-icons"> |
||||
|
search |
||||
|
</md-icon> |
||||
|
<input id="device-search" autofocus ng-model="vm.searchText" |
||||
|
ng-change="vm.searchDeviceTextUpdated()" |
||||
|
placeholder="{{ 'common.enter-search' | translate }}"/> |
||||
|
</md-input-container> |
||||
|
<div style='min-height: 150px;'> |
||||
|
<span translate layout-align="center center" |
||||
|
style="text-transform: uppercase; display: flex; height: 150px;" |
||||
|
class="md-subhead" |
||||
|
ng-show="vm.noData()">device.no-devices-text</span> |
||||
|
<md-virtual-repeat-container ng-show="vm.hasData()" |
||||
|
tb-scope-element="repeatContainer" md-top-index="vm.topIndex" flex |
||||
|
style='min-height: 150px; width: 100%;'> |
||||
|
<md-list> |
||||
|
<md-list-item md-virtual-repeat="device in vm.theDevices" md-on-demand |
||||
|
class="repeated-item" flex> |
||||
|
<md-checkbox ng-click="vm.toggleDeviceSelection($event, device)" |
||||
|
aria-label="{{ 'item.selected' | translate }}" |
||||
|
ng-checked="device.selected"></md-checkbox> |
||||
|
<span> {{ device.name }} </span> |
||||
|
</md-list-item> |
||||
|
</md-list> |
||||
|
</md-virtual-repeat-container> |
||||
|
</div> |
||||
|
</fieldset> |
||||
|
</div> |
||||
|
</md-dialog-content> |
||||
|
<md-dialog-actions layout="row"> |
||||
|
<span flex></span> |
||||
|
<md-button ng-disabled="$root.loading || vm.devices.selectedCount == 0" type="submit" |
||||
|
class="md-raised md-primary"> |
||||
|
{{ 'action.assign' | translate }} |
||||
|
</md-button> |
||||
|
<md-button ng-disabled="$root.loading" ng-click="vm.cancel()" style="margin-right:20px;">{{ 'action.cancel' | |
||||
|
translate }} |
||||
|
</md-button> |
||||
|
</md-dialog-actions> |
||||
|
</form> |
||||
|
</md-dialog> |
||||
@ -0,0 +1,123 @@ |
|||||
|
/* |
||||
|
* Copyright © 2016-2019 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. |
||||
|
*/ |
||||
|
/*@ngInject*/ |
||||
|
export default function AssignDeviceToEdgeController(edgeService, deviceService, $mdDialog, $q, deviceIds, edges) { |
||||
|
|
||||
|
var vm = this; |
||||
|
|
||||
|
vm.edges = edges; |
||||
|
vm.searchText = ''; |
||||
|
|
||||
|
vm.assign = assign; |
||||
|
vm.cancel = cancel; |
||||
|
vm.isEdgeSelected = isEdgeSelected; |
||||
|
vm.hasData = hasData; |
||||
|
vm.noData = noData; |
||||
|
vm.searchEdgeTextUpdated = searchEdgeTextUpdated; |
||||
|
vm.toggleEdgeSelection = toggleEdgeSelection; |
||||
|
|
||||
|
vm.theEdges = { |
||||
|
getItemAtIndex: function (index) { |
||||
|
if (index > vm.edges.data.length) { |
||||
|
vm.theEdges.fetchMoreItems_(index); |
||||
|
return null; |
||||
|
} |
||||
|
var item = vm.edges.data[index]; |
||||
|
if (item) { |
||||
|
item.indexNumber = index + 1; |
||||
|
} |
||||
|
return item; |
||||
|
}, |
||||
|
|
||||
|
getLength: function () { |
||||
|
if (vm.edges.hasNext) { |
||||
|
return vm.edges.data.length + vm.edges.nextPageLink.limit; |
||||
|
} else { |
||||
|
return vm.edges.data.length; |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
fetchMoreItems_: function () { |
||||
|
if (vm.edges.hasNext && !vm.edges.pending) { |
||||
|
vm.edges.pending = true; |
||||
|
edgeService.getEdges(vm.edges.nextPageLink).then( |
||||
|
function success(edges) { |
||||
|
vm.edges.data = vm.edges.data.concat(edges.data); |
||||
|
vm.edges.nextPageLink = edges.nextPageLink; |
||||
|
vm.edges.hasNext = edges.hasNext; |
||||
|
if (vm.edges.hasNext) { |
||||
|
vm.edges.nextPageLink.limit = vm.edges.pageSize; |
||||
|
} |
||||
|
vm.edges.pending = false; |
||||
|
}, |
||||
|
function fail() { |
||||
|
vm.edges.hasNext = false; |
||||
|
vm.edges.pending = false; |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
function cancel() { |
||||
|
$mdDialog.cancel(); |
||||
|
} |
||||
|
|
||||
|
function assign() { |
||||
|
var tasks = []; |
||||
|
for (var i=0;i<deviceIds.length;i++) { |
||||
|
tasks.push(deviceService.assignDeviceToEdge(vm.edges.selection.id.id, deviceIds[i])); |
||||
|
} |
||||
|
$q.all(tasks).then(function () { |
||||
|
$mdDialog.hide(); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
function noData() { |
||||
|
return vm.edges.data.length == 0 && !vm.edges.hasNext; |
||||
|
} |
||||
|
|
||||
|
function hasData() { |
||||
|
return vm.edges.data.length > 0; |
||||
|
} |
||||
|
|
||||
|
function toggleEdgeSelection($event, edge) { |
||||
|
$event.stopPropagation(); |
||||
|
if (vm.isEdgeSelected(edge)) { |
||||
|
vm.edges.selection = null; |
||||
|
} else { |
||||
|
vm.edges.selection = edge; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function isEdgeSelected(edge) { |
||||
|
return vm.edges.selection != null && edge && |
||||
|
edge.id.id === vm.edges.selection.id.id; |
||||
|
} |
||||
|
|
||||
|
function searchEdgeTextUpdated() { |
||||
|
vm.edges = { |
||||
|
pageSize: vm.edges.pageSize, |
||||
|
data: [], |
||||
|
nextPageLink: { |
||||
|
limit: vm.edges.pageSize, |
||||
|
textSearch: vm.searchText |
||||
|
}, |
||||
|
selection: null, |
||||
|
hasNext: true, |
||||
|
pending: false |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,76 @@ |
|||||
|
<!-- |
||||
|
|
||||
|
Copyright © 2016-2019 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. |
||||
|
|
||||
|
--> |
||||
|
<md-dialog aria-label="{{ 'device.assign-device-to-edge' | translate }}"> |
||||
|
<form name="theForm" ng-submit="vm.assign()"> |
||||
|
<md-toolbar> |
||||
|
<div class="md-toolbar-tools"> |
||||
|
<h2 translate>device.assign-device-to-edge</h2> |
||||
|
<span flex></span> |
||||
|
<md-button class="md-icon-button" ng-click="vm.cancel()"> |
||||
|
<ng-md-icon icon="close" aria-label="{{ 'dialog.close' | translate }}"></ng-md-icon> |
||||
|
</md-button> |
||||
|
</div> |
||||
|
</md-toolbar> |
||||
|
<md-progress-linear class="md-warn" md-mode="indeterminate" ng-disabled="!$root.loading" ng-show="$root.loading"></md-progress-linear> |
||||
|
<span style="min-height: 5px;" flex="" ng-show="!$root.loading"></span> |
||||
|
<md-dialog-content> |
||||
|
<div class="md-dialog-content"> |
||||
|
<fieldset> |
||||
|
<span translate>device.assign-to-edge-text</span> |
||||
|
<md-input-container class="md-block" style='margin-bottom: 0px;'> |
||||
|
<label> </label> |
||||
|
<md-icon aria-label="{{ 'action.search' | translate }}" class="material-icons"> |
||||
|
search |
||||
|
</md-icon> |
||||
|
<input id="edge-search" autofocus ng-model="vm.searchText" |
||||
|
ng-change="vm.searchEdgeTextUpdated()" |
||||
|
placeholder="{{ 'common.enter-search' | translate }}"/> |
||||
|
</md-input-container> |
||||
|
<div style='min-height: 150px;'> |
||||
|
<span translate layout-align="center center" |
||||
|
style="text-transform: uppercase; display: flex; height: 150px;" |
||||
|
class="md-subhead" |
||||
|
ng-show="vm.noData()">edge.no-edges-text</span> |
||||
|
<md-virtual-repeat-container ng-show="vm.hasData()" |
||||
|
tb-scope-element="repeatContainer" md-top-index="vm.topIndex" flex |
||||
|
style='min-height: 150px; width: 100%;'> |
||||
|
<md-list> |
||||
|
<md-list-item md-virtual-repeat="edge in vm.theEdges" md-on-demand |
||||
|
class="repeated-item" flex> |
||||
|
<md-checkbox ng-click="vm.toggleEdgeSelection($event, edge)" |
||||
|
aria-label="{{ 'item.selected' | translate }}" |
||||
|
ng-checked="vm.isEdgeSelected(edge)"></md-checkbox> |
||||
|
<span> {{ edge.name }} </span> |
||||
|
</md-list-item> |
||||
|
</md-list> |
||||
|
</md-virtual-repeat-container> |
||||
|
</div> |
||||
|
</fieldset> |
||||
|
</div> |
||||
|
</md-dialog-content> |
||||
|
<md-dialog-actions layout="row"> |
||||
|
<span flex></span> |
||||
|
<md-button ng-disabled="$root.loading || vm.edges.selection==null" type="submit" class="md-raised md-primary"> |
||||
|
{{ 'action.assign' | translate }} |
||||
|
</md-button> |
||||
|
<md-button ng-disabled="$root.loading" ng-click="vm.cancel()" style="margin-right:20px;">{{ 'action.cancel' | |
||||
|
translate }} |
||||
|
</md-button> |
||||
|
</md-dialog-actions> |
||||
|
</form> |
||||
|
</md-dialog> |
||||
@ -0,0 +1,123 @@ |
|||||
|
/* |
||||
|
* Copyright © 2016-2019 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. |
||||
|
*/ |
||||
|
/*@ngInject*/ |
||||
|
export default function AddEntityViewsToEdgeController(entityViewService, $mdDialog, $q, edgeId, entityViews) { |
||||
|
|
||||
|
var vm = this; |
||||
|
|
||||
|
vm.entityViews = entityViews; |
||||
|
vm.searchText = ''; |
||||
|
|
||||
|
vm.assign = assign; |
||||
|
vm.cancel = cancel; |
||||
|
vm.hasData = hasData; |
||||
|
vm.noData = noData; |
||||
|
vm.searchEntityViewTextUpdated = searchEntityViewTextUpdated; |
||||
|
vm.toggleEntityViewSelection = toggleEntityViewSelection; |
||||
|
|
||||
|
vm.theEntityViews = { |
||||
|
getItemAtIndex: function (index) { |
||||
|
if (index > vm.entityViews.data.length) { |
||||
|
vm.theEntityViews.fetchMoreItems_(index); |
||||
|
return null; |
||||
|
} |
||||
|
var item = vm.entityViews.data[index]; |
||||
|
if (item) { |
||||
|
item.indexNumber = index + 1; |
||||
|
} |
||||
|
return item; |
||||
|
}, |
||||
|
|
||||
|
getLength: function () { |
||||
|
if (vm.entityViews.hasNext) { |
||||
|
return vm.entityViews.data.length + vm.entityViews.nextPageLink.limit; |
||||
|
} else { |
||||
|
return vm.entityViews.data.length; |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
fetchMoreItems_: function () { |
||||
|
if (vm.entityViews.hasNext && !vm.entityViews.pending) { |
||||
|
vm.entityViews.pending = true; |
||||
|
entityViewService.getTenantEntityViews(vm.entityViews.nextPageLink, false).then( |
||||
|
function success(entityViews) { |
||||
|
vm.entityViews.data = vm.entityViews.data.concat(entityViews.data); |
||||
|
vm.entityViews.nextPageLink = entityViews.nextPageLink; |
||||
|
vm.entityViews.hasNext = entityViews.hasNext; |
||||
|
if (vm.entityViews.hasNext) { |
||||
|
vm.entityViews.nextPageLink.limit = vm.entityViews.pageSize; |
||||
|
} |
||||
|
vm.entityViews.pending = false; |
||||
|
}, |
||||
|
function fail() { |
||||
|
vm.entityViews.hasNext = false; |
||||
|
vm.entityViews.pending = false; |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
function cancel () { |
||||
|
$mdDialog.cancel(); |
||||
|
} |
||||
|
|
||||
|
function assign() { |
||||
|
var tasks = []; |
||||
|
for (var entityViewId in vm.entityViews.selections) { |
||||
|
tasks.push(entityViewService.assignEntityViewToEdge(edgeId, entityViewId)); |
||||
|
} |
||||
|
$q.all(tasks).then(function () { |
||||
|
$mdDialog.hide(); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
function noData() { |
||||
|
return vm.entityViews.data.length == 0 && !vm.entityViews.hasNext; |
||||
|
} |
||||
|
|
||||
|
function hasData() { |
||||
|
return vm.entityViews.data.length > 0; |
||||
|
} |
||||
|
|
||||
|
function toggleEntityViewSelection($event, entityView) { |
||||
|
$event.stopPropagation(); |
||||
|
var selected = angular.isDefined(entityView.selected) && entityView.selected; |
||||
|
entityView.selected = !selected; |
||||
|
if (entityView.selected) { |
||||
|
vm.entityViews.selections[entityView.id.id] = true; |
||||
|
vm.entityViews.selectedCount++; |
||||
|
} else { |
||||
|
delete vm.entityViews.selections[entityView.id.id]; |
||||
|
vm.entityViews.selectedCount--; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function searchEntityViewTextUpdated() { |
||||
|
vm.entityViews = { |
||||
|
pageSize: vm.entityViews.pageSize, |
||||
|
data: [], |
||||
|
nextPageLink: { |
||||
|
limit: vm.entityViews.pageSize, |
||||
|
textSearch: vm.searchText |
||||
|
}, |
||||
|
selections: {}, |
||||
|
selectedCount: 0, |
||||
|
hasNext: true, |
||||
|
pending: false |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,77 @@ |
|||||
|
<!-- |
||||
|
|
||||
|
Copyright © 2016-2019 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. |
||||
|
|
||||
|
--> |
||||
|
<md-dialog aria-label="{{ 'entity-view.assign-to-edge' | translate }}"> |
||||
|
<form name="theForm" ng-submit="vm.assign()"> |
||||
|
<md-toolbar> |
||||
|
<div class="md-toolbar-tools"> |
||||
|
<h2 translate>entity-view.assign-entity-view-to-edge</h2> |
||||
|
<span flex></span> |
||||
|
<md-button class="md-icon-button" ng-click="vm.cancel()"> |
||||
|
<ng-md-icon icon="close" aria-label="{{ 'dialog.close' | translate }}"></ng-md-icon> |
||||
|
</md-button> |
||||
|
</div> |
||||
|
</md-toolbar> |
||||
|
<md-progress-linear class="md-warn" md-mode="indeterminate" ng-disabled="!$root.loading" ng-show="$root.loading"></md-progress-linear> |
||||
|
<span style="min-height: 5px;" flex="" ng-show="!$root.loading"></span> |
||||
|
<md-dialog-content> |
||||
|
<div class="md-dialog-content"> |
||||
|
<fieldset> |
||||
|
<span translate>entity-view.assign-entity-view-to-edge-text</span> |
||||
|
<md-input-container class="md-block" style='margin-bottom: 0px;'> |
||||
|
<label> </label> |
||||
|
<md-icon aria-label="{{ 'action.search' | translate }}" class="material-icons"> |
||||
|
search |
||||
|
</md-icon> |
||||
|
<input id="entity-view-search" autofocus ng-model="vm.searchText" |
||||
|
ng-change="vm.searchEntityViewTextUpdated()" |
||||
|
placeholder="{{ 'common.enter-search' | translate }}"/> |
||||
|
</md-input-container> |
||||
|
<div style='min-height: 150px;'> |
||||
|
<span translate layout-align="center center" |
||||
|
style="text-transform: uppercase; display: flex; height: 150px;" |
||||
|
class="md-subhead" |
||||
|
ng-show="vm.noData()">entity-view.no-entity-views-text</span> |
||||
|
<md-virtual-repeat-container ng-show="vm.hasData()" |
||||
|
tb-scope-element="repeatContainer" md-top-index="vm.topIndex" flex |
||||
|
style='min-height: 150px; width: 100%;'> |
||||
|
<md-list> |
||||
|
<md-list-item md-virtual-repeat="entityView in vm.theEntityViews" md-on-demand |
||||
|
class="repeated-item" flex> |
||||
|
<md-checkbox ng-click="vm.toggleEntityViewSelection($event, entityView)" |
||||
|
aria-label="{{ 'item.selected' | translate }}" |
||||
|
ng-checked="entityView.selected"></md-checkbox> |
||||
|
<span> {{ entityView.name }} </span> |
||||
|
</md-list-item> |
||||
|
</md-list> |
||||
|
</md-virtual-repeat-container> |
||||
|
</div> |
||||
|
</fieldset> |
||||
|
</div> |
||||
|
</md-dialog-content> |
||||
|
<md-dialog-actions layout="row"> |
||||
|
<span flex></span> |
||||
|
<md-button ng-disabled="$root.loading || vm.entityViews.selectedCount == 0" type="submit" |
||||
|
class="md-raised md-primary"> |
||||
|
{{ 'action.assign' | translate }} |
||||
|
</md-button> |
||||
|
<md-button ng-disabled="$root.loading" ng-click="vm.cancel()" style="margin-right:20px;">{{ 'action.cancel' | |
||||
|
translate }} |
||||
|
</md-button> |
||||
|
</md-dialog-actions> |
||||
|
</form> |
||||
|
</md-dialog> |
||||
@ -0,0 +1,123 @@ |
|||||
|
/* |
||||
|
* Copyright © 2016-2019 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. |
||||
|
*/ |
||||
|
/*@ngInject*/ |
||||
|
export default function AssignEntityViewToEdgeController(edgeService, entityViewService, $mdDialog, $q, entityViewIds, edges) { |
||||
|
|
||||
|
var vm = this; |
||||
|
|
||||
|
vm.edges = edges; |
||||
|
vm.searchText = ''; |
||||
|
|
||||
|
vm.assign = assign; |
||||
|
vm.cancel = cancel; |
||||
|
vm.isEdgeSelected = isEdgeSelected; |
||||
|
vm.hasData = hasData; |
||||
|
vm.noData = noData; |
||||
|
vm.searchEdgeTextUpdated = searchEdgeTextUpdated; |
||||
|
vm.toggleEdgeSelection = toggleEdgeSelection; |
||||
|
|
||||
|
vm.theEdges = { |
||||
|
getItemAtIndex: function (index) { |
||||
|
if (index > vm.edges.data.length) { |
||||
|
vm.theEdges.fetchMoreItems_(index); |
||||
|
return null; |
||||
|
} |
||||
|
var item = vm.edges.data[index]; |
||||
|
if (item) { |
||||
|
item.indexNumber = index + 1; |
||||
|
} |
||||
|
return item; |
||||
|
}, |
||||
|
|
||||
|
getLength: function () { |
||||
|
if (vm.edges.hasNext) { |
||||
|
return vm.edges.data.length + vm.edges.nextPageLink.limit; |
||||
|
} else { |
||||
|
return vm.edges.data.length; |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
fetchMoreItems_: function () { |
||||
|
if (vm.edges.hasNext && !vm.edges.pending) { |
||||
|
vm.edges.pending = true; |
||||
|
edgeService.getEdges(vm.edges.nextPageLink).then( |
||||
|
function success(edges) { |
||||
|
vm.edges.data = vm.edges.data.concat(edges.data); |
||||
|
vm.edges.nextPageLink = edges.nextPageLink; |
||||
|
vm.edges.hasNext = edges.hasNext; |
||||
|
if (vm.edges.hasNext) { |
||||
|
vm.edges.nextPageLink.limit = vm.edges.pageSize; |
||||
|
} |
||||
|
vm.edges.pending = false; |
||||
|
}, |
||||
|
function fail() { |
||||
|
vm.edges.hasNext = false; |
||||
|
vm.edges.pending = false; |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
function cancel() { |
||||
|
$mdDialog.cancel(); |
||||
|
} |
||||
|
|
||||
|
function assign() { |
||||
|
var tasks = []; |
||||
|
for (var i=0; i < entityViewIds.length;i++) { |
||||
|
tasks.push(entityViewService.assignEntityViewToEdge(vm.edges.selection.id.id, entityViewIds[i])); |
||||
|
} |
||||
|
$q.all(tasks).then(function () { |
||||
|
$mdDialog.hide(); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
function noData() { |
||||
|
return vm.edges.data.length == 0 && !vm.edges.hasNext; |
||||
|
} |
||||
|
|
||||
|
function hasData() { |
||||
|
return vm.edges.data.length > 0; |
||||
|
} |
||||
|
|
||||
|
function toggleEdgeSelection($event, edge) { |
||||
|
$event.stopPropagation(); |
||||
|
if (vm.isEdgeSelected(edge)) { |
||||
|
vm.edges.selection = null; |
||||
|
} else { |
||||
|
vm.edges.selection = edge; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function isEdgeSelected(edge) { |
||||
|
return vm.edges.selection != null && edge && |
||||
|
edge.id.id === vm.edges.selection.id.id; |
||||
|
} |
||||
|
|
||||
|
function searchEdgeTextUpdated() { |
||||
|
vm.edges = { |
||||
|
pageSize: vm.edges.pageSize, |
||||
|
data: [], |
||||
|
nextPageLink: { |
||||
|
limit: vm.edges.pageSize, |
||||
|
textSearch: vm.searchText |
||||
|
}, |
||||
|
selection: null, |
||||
|
hasNext: true, |
||||
|
pending: false |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,76 @@ |
|||||
|
<!-- |
||||
|
|
||||
|
Copyright © 2016-2019 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. |
||||
|
|
||||
|
--> |
||||
|
<md-dialog aria-label="{{ 'entity-view.assign-entity-view-to-edge' | translate }}"> |
||||
|
<form name="theForm" ng-submit="vm.assign()"> |
||||
|
<md-toolbar> |
||||
|
<div class="md-toolbar-tools"> |
||||
|
<h2 translate>entity-view.assign-entity-view-to-edge</h2> |
||||
|
<span flex></span> |
||||
|
<md-button class="md-icon-button" ng-click="vm.cancel()"> |
||||
|
<ng-md-icon icon="close" aria-label="{{ 'dialog.close' | translate }}"></ng-md-icon> |
||||
|
</md-button> |
||||
|
</div> |
||||
|
</md-toolbar> |
||||
|
<md-progress-linear class="md-warn" md-mode="indeterminate" ng-disabled="!$root.loading" ng-show="$root.loading"></md-progress-linear> |
||||
|
<span style="min-height: 5px;" flex="" ng-show="!$root.loading"></span> |
||||
|
<md-dialog-content> |
||||
|
<div class="md-dialog-content"> |
||||
|
<fieldset> |
||||
|
<span translate>entity-view.assign-to-edge-text</span> |
||||
|
<md-input-container class="md-block" style='margin-bottom: 0px;'> |
||||
|
<label> </label> |
||||
|
<md-icon aria-label="{{ 'action.search' | translate }}" class="material-icons"> |
||||
|
search |
||||
|
</md-icon> |
||||
|
<input id="edge-search" autofocus ng-model="vm.searchText" |
||||
|
ng-change="vm.searchEdgeTextUpdated()" |
||||
|
placeholder="{{ 'common.enter-search' | translate }}"/> |
||||
|
</md-input-container> |
||||
|
<div style='min-height: 150px;'> |
||||
|
<span translate layout-align="center center" |
||||
|
style="text-transform: uppercase; display: flex; height: 150px;" |
||||
|
class="md-subhead" |
||||
|
ng-show="vm.noData()">edge.no-edges-text</span> |
||||
|
<md-virtual-repeat-container ng-show="vm.hasData()" |
||||
|
tb-scope-element="repeatContainer" md-top-index="vm.topIndex" flex |
||||
|
style='min-height: 150px; width: 100%;'> |
||||
|
<md-list> |
||||
|
<md-list-item md-virtual-repeat="edge in vm.theEdges" md-on-demand |
||||
|
class="repeated-item" flex> |
||||
|
<md-checkbox ng-click="vm.toggleEdgeSelection($event, edge)" |
||||
|
aria-label="{{ 'item.selected' | translate }}" |
||||
|
ng-checked="vm.isEdgeSelected(edge)"></md-checkbox> |
||||
|
<span> {{ edge.name }} </span> |
||||
|
</md-list-item> |
||||
|
</md-list> |
||||
|
</md-virtual-repeat-container> |
||||
|
</div> |
||||
|
</fieldset> |
||||
|
</div> |
||||
|
</md-dialog-content> |
||||
|
<md-dialog-actions layout="row"> |
||||
|
<span flex></span> |
||||
|
<md-button ng-disabled="$root.loading || vm.edges.selection==null" type="submit" class="md-raised md-primary"> |
||||
|
{{ 'action.assign' | translate }} |
||||
|
</md-button> |
||||
|
<md-button ng-disabled="$root.loading" ng-click="vm.cancel()" style="margin-right:20px;">{{ 'action.cancel' | |
||||
|
translate }} |
||||
|
</md-button> |
||||
|
</md-dialog-actions> |
||||
|
</form> |
||||
|
</md-dialog> |
||||
Loading…
Reference in new issue