2019-09-19 20:10:52 +03:00
|
|
|
<!--
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
-->
|
|
|
|
|
<div class="tb-dashboard-page mat-content" style="padding-top: 150px;"
|
|
|
|
|
fxFlex tb-fullscreen [fullscreen]="widgetEditMode || iframeMode || forceFullscreen || isFullscreen">
|
|
|
|
|
<section class="tb-dashboard-toolbar"
|
|
|
|
|
[ngClass]="{ 'tb-dashboard-toolbar-opened': toolbarOpened, 'tb-dashboard-toolbar-closed': !toolbarOpened }">
|
|
|
|
|
<tb-dashboard-toolbar [fxShow]="!widgetEditMode" [forceFullscreen]="forceFullscreen"
|
|
|
|
|
[toolbarOpened]="toolbarOpened" (triggerClick)="openToolbar()">
|
|
|
|
|
<div class="tb-dashboard-action-panels" fxLayout="column-reverse" fxLayout.gt-sm="row-reverse"
|
|
|
|
|
fxLayoutAlign="center stretch" fxLayoutAlign.gt-sm="space-between center">
|
|
|
|
|
<div class="tb-dashboard-action-panel" fxFlex.md="30" fxLayout="row-reverse"
|
|
|
|
|
fxLayoutAlign.gt-sm="start center" fxLayoutAlign="space-between center" fxLayoutGap="12px">
|
|
|
|
|
<button [fxShow]="showCloseToolbar()" mat-button mat-icon-button class="close-action"
|
|
|
|
|
matTooltip="{{ 'dashboard.close-toolbar' | translate }}"
|
|
|
|
|
matTooltipPosition="below"
|
|
|
|
|
(click)="closeToolbar()">
|
|
|
|
|
<mat-icon>arrow_forward</mat-icon>
|
|
|
|
|
</button>
|
|
|
|
|
<tb-user-menu *ngIf="isPublicUser() && forceFullscreen" fxHide.xs fxHide.sm displayUserInfo="true">
|
|
|
|
|
</tb-user-menu>
|
|
|
|
|
<button [fxShow]="showRightLayoutSwitch()" mat-button mat-icon-button
|
|
|
|
|
matTooltip="{{ (isRightLayoutOpened ? 'dashboard.hide-details' : 'dashboard.show-details') | translate }}"
|
|
|
|
|
matTooltipPosition="below"
|
|
|
|
|
(click)="toggleLayouts()">
|
|
|
|
|
<mat-icon>{{isRightLayoutOpened ? 'arrow_back' : 'menu'}}</mat-icon>
|
|
|
|
|
</button>
|
|
|
|
|
<button [fxShow]="!hideFullscreenButton()" mat-button mat-icon-button
|
|
|
|
|
matTooltip="{{(isFullscreen ? 'fullscreen.exit' : 'fullscreen.expand') | translate}}"
|
|
|
|
|
matTooltipPosition="below"
|
|
|
|
|
(click)="isFullscreen = !isFullscreen">
|
|
|
|
|
<mat-icon>{{ isFullscreen ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>
|
|
|
|
|
</button>
|
|
|
|
|
<button [fxShow]="isEdit || displayExport()" mat-button mat-icon-button
|
|
|
|
|
matTooltip="{{'dashboard.export' | translate}}"
|
|
|
|
|
matTooltipPosition="below"
|
|
|
|
|
(click)="exportDashboard($event)">
|
|
|
|
|
<mat-icon>file_download</mat-icon>
|
|
|
|
|
</button>
|
|
|
|
|
<tb-timewindow [fxShow]="isEdit || displayDashboardTimewindow()"
|
|
|
|
|
isToolbar="true"
|
|
|
|
|
direction="left"
|
|
|
|
|
tooltipPosition="below"
|
|
|
|
|
aggregation="true"
|
|
|
|
|
[(ngModel)]="dashboardCtx.dashboardTimewindow">
|
|
|
|
|
</tb-timewindow>
|
|
|
|
|
<tb-aliases-entity-select [fxShow]="!isEdit && displayEntitiesSelect()"
|
|
|
|
|
tooltipPosition="below"
|
|
|
|
|
[aliasController]="dashboardCtx.aliasController">
|
|
|
|
|
</tb-aliases-entity-select>
|
|
|
|
|
<button [fxShow]="isEdit" mat-button mat-icon-button
|
|
|
|
|
matTooltip="{{ 'entity.aliases' | translate }}"
|
|
|
|
|
matTooltipPosition="below"
|
|
|
|
|
(click)="openEntityAliases($event)">
|
|
|
|
|
<mat-icon>devices_other</mat-icon>
|
|
|
|
|
</button>
|
|
|
|
|
<button [fxShow]="isEdit" mat-button mat-icon-button
|
|
|
|
|
matTooltip="{{ 'dashboard.settings' | translate }}"
|
|
|
|
|
matTooltipPosition="below"
|
|
|
|
|
(click)="openDashboardSettings($event)">
|
|
|
|
|
<mat-icon>settings</mat-icon>
|
|
|
|
|
</button>
|
|
|
|
|
<tb-dashboard-select [fxShow]="!isEdit && !widgetEditMode && displayDashboardsSelect()"
|
|
|
|
|
[(ngModel)]="currentDashboardId"
|
|
|
|
|
(ngModelChange)="currentDashboardIdChanged(currentDashboardId)"
|
|
|
|
|
[customerId]="currentCustomerId"
|
|
|
|
|
[dashboardsScope]="currentDashboardScope">
|
|
|
|
|
</tb-dashboard-select>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="tb-dashboard-action-panel" fxFlex.md="70" fxLayout="row-reverse"
|
|
|
|
|
fxLayoutAlign.gt-sm="end center" fxLayoutAlign="space-between center" fxLayoutGap="12px">
|
|
|
|
|
<tb-user-menu *ngIf="!isPublicUser() && forceFullscreen" fxHide.gt-sm displayUserInfo="true">
|
|
|
|
|
</tb-user-menu>
|
2019-09-20 20:30:43 +03:00
|
|
|
<div [fxShow]="isEdit"
|
|
|
|
|
fxFlex.xs fxFlex.sm fxLayout="row"
|
|
|
|
|
fxLayoutAlign.gt-sm="start center"
|
|
|
|
|
fxLayoutAlign="space-between center" fxLayoutGap="12px">
|
|
|
|
|
<button mat-button mat-icon-button
|
|
|
|
|
matTooltip="{{'dashboard.manage-states' | translate}}"
|
|
|
|
|
matTooltipPosition="below"
|
|
|
|
|
(click)="manageDashboardStates($event)">
|
|
|
|
|
<mat-icon>layers</mat-icon>
|
|
|
|
|
</button>
|
|
|
|
|
<button mat-button mat-icon-button
|
|
|
|
|
matTooltip="{{'layout.manage' | translate}}"
|
|
|
|
|
matTooltipPosition="below"
|
|
|
|
|
(click)="manageDashboardLayouts($event)">
|
|
|
|
|
<mat-icon>view_compact</mat-icon>
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
<tb-states-component fxFlex.xs fxFlex.sm
|
|
|
|
|
[statesControllerId]="isEdit ? 'default' : dashboardConfiguration.settings.stateControllerId"
|
|
|
|
|
[dashboardCtrl]="this"
|
|
|
|
|
[dashboardId]="dashboard.id ? dashboard.id.id : ''"
|
|
|
|
|
[isMobile]="isMobile"
|
|
|
|
|
[state]="dashboardCtx.state"
|
|
|
|
|
[states]="dashboardConfiguration.states">
|
|
|
|
|
</tb-states-component>
|
2019-09-19 20:10:52 +03:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</tb-dashboard-toolbar>
|
|
|
|
|
</section>
|
|
|
|
|
<section class="tb-dashboard-container tb-absolute-fill"
|
|
|
|
|
[ngClass]="{ 'is-fullscreen': forceFullscreen,
|
|
|
|
|
'tb-dashboard-toolbar-opened': toolbarOpened,
|
|
|
|
|
'tb-dashboard-toolbar-closed': !toolbarOpened }">
|
|
|
|
|
<section *ngIf="!widgetEditMode" class="tb-dashboard-title" fxLayout="row" fxLayoutAlign="center center"
|
|
|
|
|
[ngStyle]="{'color': dashboard.configuration.settings.titleColor}">
|
|
|
|
|
<h3 [fxShow]="!isEdit && displayTitle()">{{ dashboard.title }}</h3>
|
|
|
|
|
<mat-form-field [fxShow]="isEdit" class="mat-block" style="height: 30px;">
|
|
|
|
|
<mat-label translate [ngStyle]="{'color': dashboard.configuration.settings.titleColor}">dashboard.title</mat-label>
|
|
|
|
|
<input matInput class="tb-dashboard-title"
|
|
|
|
|
[ngStyle]="{'color': dashboard.configuration.settings.titleColor}"
|
|
|
|
|
required name="title" [(ngModel)]="dashboard.title">
|
|
|
|
|
</mat-form-field>
|
|
|
|
|
</section>
|
|
|
|
|
<div class="tb-absolute-fill tb-dashboard-layouts" fxLayout="{{forceDashboardMobileMode ? 'column' : 'row'}}"
|
|
|
|
|
[ngClass]="{ 'tb-padded' : !widgetEditMode && (isEdit || displayTitle()), 'tb-shrinked' : isEditingWidget }">
|
|
|
|
|
<div [fxShow]="layouts.main.show"
|
|
|
|
|
id="tb-main-layout"
|
|
|
|
|
[ngStyle]="{width: mainLayoutWidth(),
|
|
|
|
|
height: mainLayoutHeight()}">
|
2019-09-20 20:30:43 +03:00
|
|
|
<tb-dashboard-layout
|
|
|
|
|
[layoutCtx]="layouts.main.layoutCtx"
|
|
|
|
|
[dashboardCtx]="dashboardCtx"
|
|
|
|
|
[isEdit]="isEdit"
|
|
|
|
|
[isMobile]="forceDashboardMobileMode"
|
|
|
|
|
[widgetEditMode]="widgetEditMode">
|
|
|
|
|
</tb-dashboard-layout>
|
2019-09-19 20:10:52 +03:00
|
|
|
</div>
|
|
|
|
|
<mat-sidenav-container *ngIf="layouts.right.show"
|
|
|
|
|
id="tb-right-layout">
|
|
|
|
|
<mat-sidenav
|
|
|
|
|
[ngStyle]="{minWidth: rightLayoutWidth(),
|
|
|
|
|
maxWidth: rightLayoutWidth(),
|
|
|
|
|
height: rightLayoutHeight(),
|
|
|
|
|
zIndex: 25}"
|
|
|
|
|
disableClose="true"
|
|
|
|
|
position="end"
|
|
|
|
|
[mode]="isMobile ? 'over' : 'side'"
|
|
|
|
|
[(opened)]="rightLayoutOpened">
|
2019-09-20 20:30:43 +03:00
|
|
|
<tb-dashboard-layout style="height: 100%;"
|
|
|
|
|
[layoutCtx]="layouts.right.layoutCtx"
|
|
|
|
|
[dashboardCtx]="dashboardCtx"
|
|
|
|
|
[isEdit]="isEdit"
|
|
|
|
|
[isMobile]="forceDashboardMobileMode"
|
|
|
|
|
[widgetEditMode]="widgetEditMode">
|
|
|
|
|
</tb-dashboard-layout>
|
2019-09-19 20:10:52 +03:00
|
|
|
</mat-sidenav>
|
|
|
|
|
</mat-sidenav-container>
|
|
|
|
|
</div>
|
|
|
|
|
<!--tb-details-sidenav TODO -->
|
|
|
|
|
<!--tb-details-sidenav TODO -->
|
|
|
|
|
<section fxLayout="row" class="layout-wrap tb-footer-buttons" fxLayoutAlign="start end">
|
2019-09-20 20:30:43 +03:00
|
|
|
<tb-footer-fab-buttons [fxShow]="!isAddingWidget && isEdit && !widgetEditMode"
|
|
|
|
|
relative
|
|
|
|
|
[footerFabButtons]="addWidgetFabButtons">
|
|
|
|
|
</tb-footer-fab-buttons>
|
2019-09-19 20:10:52 +03:00
|
|
|
<button *ngIf="(isTenantAdmin() || isSystemAdmin()) && !forceFullscreen"
|
|
|
|
|
mat-fab color="accent" class="tb-btn-footer"
|
|
|
|
|
[ngClass]="{'tb-hide': !isEdit || isAddingWidget}"
|
|
|
|
|
[disabled]="isLoading$ | async"
|
|
|
|
|
(click)="saveDashboard()"
|
|
|
|
|
matTooltip="{{ 'action.apply-changes' | translate }}"
|
|
|
|
|
matTooltipPosition="above">
|
|
|
|
|
<mat-icon>done</mat-icon>
|
|
|
|
|
</button>
|
|
|
|
|
<button *ngIf="(isTenantAdmin() || isSystemAdmin()) && !forceFullscreen"
|
|
|
|
|
mat-fab color="accent" class="tb-btn-footer"
|
|
|
|
|
[ngClass]="{'tb-hide': isAddingWidget || (isLoading$ | async)}"
|
|
|
|
|
[disabled]="isLoading$ | async"
|
|
|
|
|
(click)="toggleDashboardEditMode()"
|
|
|
|
|
matTooltip="{{ (isEdit ? 'action.decline-changes': 'action.enter-edit-mode') | translate }}"
|
|
|
|
|
matTooltipPosition="above">
|
|
|
|
|
<mat-icon>{{ isEdit ? 'close' : 'edit' }}</mat-icon>
|
|
|
|
|
</button>
|
|
|
|
|
</section>
|
|
|
|
|
</section>
|
|
|
|
|
<section class="tb-powered-by-footer" [ngStyle]="{'color': dashboard.configuration.settings.titleColor}">
|
|
|
|
|
<span>Powered by <a href="https://thingsboard.io" target="_blank">Thingsboard v.{{ thingsboardVersion }}</a></span>
|
|
|
|
|
</section>
|
|
|
|
|
</div>
|