add extensions-widget
This commit is contained in:
parent
32ece471e9
commit
2583cbed40
@ -21,6 +21,7 @@ import thingsboardLedLight from '../components/led-light.directive';
|
||||
import thingsboardTimeseriesTableWidget from '../widget/lib/timeseries-table-widget';
|
||||
import thingsboardAlarmsTableWidget from '../widget/lib/alarms-table-widget';
|
||||
import thingsboardEntitiesTableWidget from '../widget/lib/entities-table-widget';
|
||||
import thingsboardExtensionsTableWidget from '../widget/lib/extensions-table-widget';
|
||||
|
||||
import thingsboardRpcWidgets from '../widget/lib/rpc';
|
||||
|
||||
@ -42,7 +43,7 @@ import thingsboardTypes from '../common/types.constant';
|
||||
import thingsboardUtils from '../common/utils.service';
|
||||
|
||||
export default angular.module('thingsboard.api.widget', ['oc.lazyLoad', thingsboardLedLight, thingsboardTimeseriesTableWidget,
|
||||
thingsboardAlarmsTableWidget, thingsboardEntitiesTableWidget, thingsboardRpcWidgets, thingsboardTypes, thingsboardUtils])
|
||||
thingsboardAlarmsTableWidget, thingsboardEntitiesTableWidget, thingsboardExtensionsTableWidget, thingsboardRpcWidgets, thingsboardTypes, thingsboardUtils])
|
||||
.factory('widgetService', WidgetService)
|
||||
.name;
|
||||
|
||||
|
||||
@ -34,7 +34,9 @@ export default function ExtensionTableDirective() {
|
||||
scope: true,
|
||||
bindToController: {
|
||||
entityId: '=',
|
||||
entityType: '@'
|
||||
entityType: '@',
|
||||
inWidget: '@?',
|
||||
ctx: '=?'
|
||||
},
|
||||
controller: ExtensionTableController,
|
||||
controllerAs: 'vm',
|
||||
@ -70,7 +72,6 @@ function ExtensionTableController($scope, $filter, $document, $translate, types,
|
||||
vm.reloadExtensions = reloadExtensions;
|
||||
vm.updateExtensions = updateExtensions;
|
||||
|
||||
|
||||
$scope.$watch("vm.entityId", function(newVal) {
|
||||
if (newVal) {
|
||||
if ($scope.subscriber) {
|
||||
@ -92,13 +93,50 @@ function ExtensionTableController($scope, $filter, $document, $translate, types,
|
||||
}
|
||||
});
|
||||
|
||||
$scope.$watch('vm.selectedExtensions.length', function (newLength) {
|
||||
var selectionMode = newLength ? true : false;
|
||||
if (vm.ctx) {
|
||||
if (selectionMode) {
|
||||
vm.ctx.hideTitlePanel = true;
|
||||
$scope.$emit("selectedExtensions", true);
|
||||
} else if (vm.query.search == null) {
|
||||
vm.ctx.hideTitlePanel = false;
|
||||
$scope.$emit("selectedExtensions", false);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$scope.$on("showSearch", function($event, source) {
|
||||
if(source.entityId == vm.entityId) {
|
||||
enterFilterMode();
|
||||
$scope.$emit("filterMode", true);
|
||||
}
|
||||
});
|
||||
$scope.$on("refreshExtensions", function($event, source) {
|
||||
if(source.entityId == vm.entityId) {
|
||||
reloadExtensions();
|
||||
}
|
||||
});
|
||||
$scope.$on("addExtension", function($event, source) {
|
||||
if(source.entityId == vm.entityId) {
|
||||
addExtension();
|
||||
}
|
||||
});
|
||||
|
||||
function enterFilterMode() {
|
||||
vm.query.search = '';
|
||||
if(vm.inWidget) {
|
||||
vm.ctx.hideTitlePanel = true;
|
||||
}
|
||||
}
|
||||
|
||||
function exitFilterMode() {
|
||||
vm.query.search = null;
|
||||
updateExtensions();
|
||||
if(vm.inWidget) {
|
||||
vm.ctx.hideTitlePanel = false;
|
||||
$scope.$emit("filterMode", false);
|
||||
}
|
||||
}
|
||||
|
||||
function onReorder() {
|
||||
@ -256,8 +294,7 @@ function ExtensionTableController($scope, $filter, $document, $translate, types,
|
||||
vm.extensions = result.slice(startIndex, startIndex + vm.query.limit);
|
||||
|
||||
vm.extensionsJSON = angular.toJson(vm.extensions);
|
||||
checkForSync()
|
||||
|
||||
checkForSync();
|
||||
}
|
||||
|
||||
function subscribeForClientAttributes() {
|
||||
@ -320,7 +357,6 @@ function ExtensionTableController($scope, $filter, $document, $translate, types,
|
||||
d = d.getFullYear() +'/'+ addZero(d.getMonth()+1) +'/'+ addZero(d.getDate()) + ' ' + addZero(d.getHours()) + ':' + addZero(d.getMinutes()) +':'+ addZero(d.getSeconds());
|
||||
return d;
|
||||
|
||||
|
||||
function addZero(num) {
|
||||
if ((angular.isNumber(num) && num < 10) || (angular.isString(num) && num.length === 1)) {
|
||||
num = '0' + num;
|
||||
|
||||
@ -20,6 +20,18 @@
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
.extension-table {
|
||||
.sync-widget {
|
||||
max-height: 90px;
|
||||
overflow: hidden;
|
||||
}
|
||||
.toolbar-widget {
|
||||
min-height: 39px;
|
||||
max-height: 39px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.extension__syncStatus--black {
|
||||
color: #000000!important;
|
||||
}
|
||||
|
||||
@ -17,8 +17,8 @@
|
||||
-->
|
||||
|
||||
<md-content flex class="md-padding tb-absolute-fill tb-data-table extension-table" layout="column">
|
||||
<div layout="column" class="md-whiteframe-z1">
|
||||
<md-toolbar class="md-table-toolbar md-default" ng-show="!vm.selectedExtensions.length
|
||||
<div layout="column" class="md-whiteframe-z1" ng-class="{'tb-absolute-fill' : vm.inWidget}">
|
||||
<md-toolbar ng-if="!vm.inWidget" class="md-table-toolbar md-default" ng-show="!vm.selectedExtensions.length
|
||||
&& vm.query.search === null">
|
||||
<div class="md-toolbar-tools">
|
||||
<span translate>{{ 'extension.extensions' }}</span>
|
||||
@ -44,7 +44,7 @@
|
||||
</div>
|
||||
</md-toolbar>
|
||||
<md-toolbar class="md-table-toolbar md-default" ng-show="!vm.selectedExtensions.length
|
||||
&& vm.query.search != null"">
|
||||
&& vm.query.search != null" ng-class="{'toolbar-widget' : vm.inWidget}">
|
||||
<div class="md-toolbar-tools">
|
||||
<md-button class="md-icon-button" aria-label="{{ 'action.search' | translate }}">
|
||||
<md-icon aria-label="{{ 'action.search' | translate }}" class="material-icons">search</md-icon>
|
||||
@ -58,13 +58,13 @@
|
||||
</md-input-container>
|
||||
<md-button class="md-icon-button" aria-label="{{ 'action.back' | translate }}" ng-click="vm.exitFilterMode()">
|
||||
<md-icon aria-label="{{ 'action.close' | translate }}" class="material-icons">close</md-icon>
|
||||
<md-tooltip md-direction="top">
|
||||
<md-tooltip md-direction="{{vm.ctx.dashboard.isWidgetExpanded ? 'bottom' : 'top'}}">
|
||||
{{ 'action.close' | translate }}
|
||||
</md-tooltip>
|
||||
</md-button>
|
||||
</div>
|
||||
</md-toolbar>
|
||||
<md-toolbar class="md-table-toolbar alternate" ng-show="vm.selectedExtensions.length">
|
||||
<md-toolbar class="md-table-toolbar alternate" ng-show="vm.selectedExtensions.length" ng-class="{'toolbar-widget' : vm.inWidget}">
|
||||
<div class="md-toolbar-tools">
|
||||
<span translate
|
||||
translate-values="{count: vm.selectedExtensions.length}"
|
||||
@ -72,14 +72,14 @@
|
||||
<span flex></span>
|
||||
<md-button class="md-icon-button" ng-click="vm.deleteExtensions($event)">
|
||||
<md-icon>delete</md-icon>
|
||||
<md-tooltip md-direction="top">
|
||||
<md-tooltip md-direction="{{vm.ctx.dashboard.isWidgetExpanded ? 'bottom' : 'top'}}">
|
||||
{{ 'action.delete' | translate }}
|
||||
</md-tooltip>
|
||||
</md-button>
|
||||
</div>
|
||||
</md-toolbar>
|
||||
|
||||
<div class="md-padding" flex layout="row">
|
||||
<div class="md-padding" flex layout="row" ng-class="{'sync-widget' : vm.inWidget}">
|
||||
<md-input-container flex="50" class="md-block">
|
||||
<label translate>extension.sync.status</label>
|
||||
<input ng-model="vm.syncStatus"
|
||||
@ -97,7 +97,7 @@
|
||||
</md-input-container>
|
||||
</div>
|
||||
|
||||
<md-table-container>
|
||||
<md-table-container flex>
|
||||
<table md-table md-row-select multiple="" ng-model="vm.selectedExtensions" md-progress="vm.extensionsDeferred.promise">
|
||||
<thead md-head md-order="vm.query.order" md-on-reorder="vm.onReorder">
|
||||
<tr md-row>
|
||||
@ -117,7 +117,7 @@
|
||||
{{ 'extension.edit' | translate }}
|
||||
</md-tooltip>
|
||||
</md-button>
|
||||
<md-button class="md-icon-button" aria-label="{{ 'action.delete' | translate }}" ng-click="vm.deleteExtension($event, extension)"> <!-- add click-function -->
|
||||
<md-button class="md-icon-button" aria-label="{{ 'action.delete' | translate }}" ng-click="vm.deleteExtension($event, extension)">
|
||||
<md-icon aria-label="{{ 'action.delete' | translate }}" class="material-icons">delete</md-icon>
|
||||
<md-tooltip md-direction="top">
|
||||
{{ 'extension.delete' | translate }}
|
||||
@ -127,11 +127,12 @@
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<md-divider ng-if="vm.inWidget"></md-divider>
|
||||
</md-table-container>
|
||||
<md-table-pagination md-limit="vm.query.limit" md-limit-options="[5, 10, 15]"
|
||||
md-page="vm.query.page" md-total="{{vm.extensionsCount}}"
|
||||
md-on-paginate="vm.onPaginate" md-page-select>
|
||||
</md-table-pagination>
|
||||
</div>
|
||||
<div></div> <!-- div for testing values -->
|
||||
|
||||
</md-content>
|
||||
117
ui/src/app/widget/lib/extensions-table-widget.js
Normal file
117
ui/src/app/widget/lib/extensions-table-widget.js
Normal file
@ -0,0 +1,117 @@
|
||||
/*
|
||||
* 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 './extensions-table-widget.scss';
|
||||
|
||||
/* eslint-disable import/no-unresolved, import/default */
|
||||
|
||||
import extensionsTableWidgetTemplate from './extensions-table-widget.tpl.html';
|
||||
|
||||
/* eslint-enable import/no-unresolved, import/default */
|
||||
|
||||
export default angular.module('thingsboard.widgets.extensionsTableWidget', [])
|
||||
.directive('tbExtensionsTableWidget', ExtensionsTableWidget)
|
||||
.name;
|
||||
|
||||
/*@ngInject*/
|
||||
function ExtensionsTableWidget() {
|
||||
return {
|
||||
restrict: "E",
|
||||
scope: true,
|
||||
bindToController: {
|
||||
ctx: '='
|
||||
},
|
||||
controller: ExtensionsTableWidgetController,
|
||||
controllerAs: 'vm',
|
||||
templateUrl: extensionsTableWidgetTemplate
|
||||
};
|
||||
}
|
||||
|
||||
/*@ngInject*/
|
||||
function ExtensionsTableWidgetController($scope, $translate, utils) {
|
||||
var vm = this;
|
||||
|
||||
vm.datasources = null;
|
||||
vm.tabsHidden = false;
|
||||
|
||||
$scope.$watch('vm.ctx', function() {
|
||||
if (vm.ctx && vm.ctx.defaultSubscription) {
|
||||
vm.settings = vm.ctx.settings;
|
||||
vm.subscription = vm.ctx.defaultSubscription;
|
||||
vm.datasources = vm.subscription.datasources;
|
||||
initializeConfig();
|
||||
updateDatasources();
|
||||
}
|
||||
});
|
||||
|
||||
function initializeConfig() {
|
||||
|
||||
if (vm.settings.extensionsTitle && vm.settings.extensionsTitle.length) {
|
||||
vm.extensionsTitle = utils.customTranslation(vm.settings.extensionsTitle, vm.settings.extensionsTitle);
|
||||
} else {
|
||||
vm.extensionsTitle = $translate.instant('extension.extensions');
|
||||
}
|
||||
vm.ctx.widgetTitle = vm.extensionsTitle;
|
||||
|
||||
vm.ctx.widgetActions = [vm.addAction, vm.searchAction, vm.refreshAction];
|
||||
}
|
||||
|
||||
function updateDatasources() {
|
||||
|
||||
var datasource = vm.datasources[0];
|
||||
vm.selectedSource = vm.datasources[0];
|
||||
vm.ctx.widgetTitle = utils.createLabelFromDatasource(datasource, vm.extensionsTitle);
|
||||
}
|
||||
|
||||
vm.changeSelectedSource = function(source) {
|
||||
vm.selectedSource = source;
|
||||
}
|
||||
|
||||
vm.searchAction = {
|
||||
name: "action.search",
|
||||
show: true,
|
||||
onAction: function() {
|
||||
$scope.$broadcast("showSearch", vm.selectedSource);
|
||||
},
|
||||
icon: "search"
|
||||
};
|
||||
|
||||
vm.refreshAction = {
|
||||
name: "action.refresh",
|
||||
show: true,
|
||||
onAction: function() {
|
||||
$scope.$broadcast("refreshExtensions", vm.selectedSource);
|
||||
},
|
||||
icon: "refresh"
|
||||
}
|
||||
|
||||
vm.addAction = {
|
||||
name: "action.add",
|
||||
show: true,
|
||||
onAction: function() {
|
||||
$scope.$broadcast("addExtension", vm.selectedSource);
|
||||
},
|
||||
icon: "add"
|
||||
}
|
||||
|
||||
$scope.$on("filterMode", function($event, mode) {
|
||||
vm.tabsHidden = mode;
|
||||
});
|
||||
|
||||
$scope.$on("selectedExtensions", function($event, mode) {
|
||||
vm.tabsHidden = mode;
|
||||
});
|
||||
}
|
||||
29
ui/src/app/widget/lib/extensions-table-widget.scss
Normal file
29
ui/src/app/widget/lib/extensions-table-widget.scss
Normal file
@ -0,0 +1,29 @@
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
|
||||
tb-extension-table {
|
||||
md-content {
|
||||
background-color: #fff;
|
||||
}
|
||||
}
|
||||
md-tabs.hide-tabs-menu {
|
||||
md-tabs-wrapper {
|
||||
display: none;
|
||||
}
|
||||
md-tabs-content-wrapper {
|
||||
top: 0 !important;
|
||||
}
|
||||
}
|
||||
27
ui/src/app/widget/lib/extensions-table-widget.tpl.html
Normal file
27
ui/src/app/widget/lib/extensions-table-widget.tpl.html
Normal file
@ -0,0 +1,27 @@
|
||||
<!--
|
||||
|
||||
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.
|
||||
|
||||
-->
|
||||
<md-tabs id="tabs" md-border-bottom flex class="tb-absolute-fill" ng-class="{'hide-tabs-menu': vm.datasources.length == 1 || vm.tabsHidden}">
|
||||
<md-tab ng-repeat="source in vm.datasources" label="{{ source.name }}" md-on-select="vm.changeSelectedSource(source)">
|
||||
<tb-extension-table flex
|
||||
entity-id="source.entityId"
|
||||
entity-type="{{source.entityType}}"
|
||||
in-widget="true"
|
||||
ctx="vm.ctx">
|
||||
</tb-extension-table>
|
||||
</md-tab>
|
||||
</md-tabs>
|
||||
Loading…
x
Reference in New Issue
Block a user