15 changed files with 603 additions and 28 deletions
@ -1,15 +1,46 @@ |
|||
/** |
|||
* 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. |
|||
*/ |
|||
package org.thingsboard.server.common.data; |
|||
|
|||
import lombok.AllArgsConstructor; |
|||
import lombok.Data; |
|||
import lombok.NoArgsConstructor; |
|||
import lombok.Getter; |
|||
import lombok.Setter; |
|||
import org.thingsboard.server.common.data.id.EdgeId; |
|||
|
|||
@Data |
|||
@NoArgsConstructor |
|||
@AllArgsConstructor |
|||
public class ShortEdgeInfo { |
|||
|
|||
@Getter @Setter |
|||
private EdgeId edgeId; |
|||
|
|||
@Getter @Setter |
|||
private String title; |
|||
|
|||
@Override |
|||
public boolean equals(Object o) { |
|||
if (this == o) return true; |
|||
if (o == null || getClass() != o.getClass()) return false; |
|||
|
|||
ShortEdgeInfo that = (ShortEdgeInfo) o; |
|||
|
|||
return edgeId.equals(that.edgeId); |
|||
} |
|||
|
|||
@Override |
|||
public int hashCode() { |
|||
return edgeId.hashCode(); |
|||
} |
|||
} |
|||
|
|||
@ -0,0 +1,122 @@ |
|||
/* |
|||
* 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 AddDashboardsToEdgeController(dashboardService, $mdDialog, $q, edgeId, dashboards) { |
|||
|
|||
var vm = this; |
|||
|
|||
vm.dashboards = dashboards; |
|||
vm.searchText = ''; |
|||
|
|||
vm.assign = assign; |
|||
vm.cancel = cancel; |
|||
vm.hasData = hasData; |
|||
vm.noData = noData; |
|||
vm.searchDashboardTextUpdated = searchDashboardTextUpdated; |
|||
vm.toggleDashboardSelection = toggleDashboardSelection; |
|||
|
|||
vm.theDashboards = { |
|||
getItemAtIndex: function (index) { |
|||
if (index > vm.dashboards.data.length) { |
|||
vm.theDashboards.fetchMoreItems_(index); |
|||
return null; |
|||
} |
|||
var item = vm.dashboards.data[index]; |
|||
if (item) { |
|||
item.indexNumber = index + 1; |
|||
} |
|||
return item; |
|||
}, |
|||
|
|||
getLength: function () { |
|||
if (vm.dashboards.hasNext) { |
|||
return vm.dashboards.data.length + vm.dashboards.nextPageLink.limit; |
|||
} else { |
|||
return vm.dashboards.data.length; |
|||
} |
|||
}, |
|||
|
|||
fetchMoreItems_: function () { |
|||
if (vm.dashboards.hasNext && !vm.dashboards.pending) { |
|||
vm.dashboards.pending = true; |
|||
dashboardService.getTenantDashboards(vm.dashboards.nextPageLink).then( |
|||
function success(dashboards) { |
|||
vm.dashboards.data = vm.dashboards.data.concat(dashboards.data); |
|||
vm.dashboards.nextPageLink = dashboards.nextPageLink; |
|||
vm.dashboards.hasNext = dashboards.hasNext; |
|||
if (vm.dashboards.hasNext) { |
|||
vm.dashboards.nextPageLink.limit = vm.dashboards.pageSize; |
|||
} |
|||
vm.dashboards.pending = false; |
|||
}, |
|||
function fail() { |
|||
vm.dashboards.hasNext = false; |
|||
vm.dashboards.pending = false; |
|||
}); |
|||
} |
|||
} |
|||
} |
|||
|
|||
function cancel () { |
|||
$mdDialog.cancel(); |
|||
} |
|||
|
|||
function assign () { |
|||
var tasks = []; |
|||
for (var dashboardId in vm.dashboards.selections) { |
|||
tasks.push(dashboardService.assignDashboardToEdge(edgeId, dashboardId)); |
|||
} |
|||
$q.all(tasks).then(function () { |
|||
$mdDialog.hide(); |
|||
}); |
|||
} |
|||
|
|||
function noData () { |
|||
return vm.dashboards.data.length == 0 && !vm.dashboards.hasNext; |
|||
} |
|||
|
|||
function hasData () { |
|||
return vm.dashboards.data.length > 0; |
|||
} |
|||
|
|||
function toggleDashboardSelection ($event, dashboard) { |
|||
$event.stopPropagation(); |
|||
var selected = angular.isDefined(dashboard.selected) && dashboard.selected; |
|||
dashboard.selected = !selected; |
|||
if (dashboard.selected) { |
|||
vm.dashboards.selections[dashboard.id.id] = true; |
|||
vm.dashboards.selectedCount++; |
|||
} else { |
|||
delete vm.dashboards.selections[dashboard.id.id]; |
|||
vm.dashboards.selectedCount--; |
|||
} |
|||
} |
|||
|
|||
function searchDashboardTextUpdated () { |
|||
vm.dashboards = { |
|||
pageSize: vm.dashboards.pageSize, |
|||
data: [], |
|||
nextPageLink: { |
|||
limit: vm.dashboards.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="{{ 'dashboard.assign-dashboard-to-edge' | translate }}"> |
|||
<form name="theForm" ng-submit="vm.assign()"> |
|||
<md-toolbar> |
|||
<div class="md-toolbar-tools"> |
|||
<h2 translate>dashboard.assign-dashboard-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>dashboard.assign-dashboard-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="dashboard-search" autofocus ng-model="vm.searchText" |
|||
ng-change="vm.searchDashboardTextUpdated()" |
|||
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()">dashboard.no-dashboards-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="dashboard in vm.theDashboards" md-on-demand |
|||
class="repeated-item" flex> |
|||
<md-checkbox ng-click="vm.toggleDashboardSelection($event, dashboard)" |
|||
aria-label="{{ 'item.selected' | translate }}" |
|||
ng-checked="dashboard.selected"></md-checkbox> |
|||
<span> {{ dashboard.title }} </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.dashboards.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> |
|||
Loading…
Reference in new issue