make the legend movable

The legend ("key" in Gnuplot speak) is no longer part of the image.
Instead it is a floating&movable overlay.

In the gallery we still use the legend/key in the image.
This commit is contained in:
2023-09-30 17:12:49 +02:00
parent f8a199fd6a
commit 43e13b53b1
12 changed files with 138 additions and 62 deletions

View File

@@ -1,3 +1,14 @@
<!---->
<div cdkDrag
[ngClass]="{'hidden': !imageUrl || showStats}"
class="plot-view--legend"
[cdkDragFreeDragPosition]="legendInitialPosition">
<div cdkDragHandle></div>
<ol>
<li *ngFor="let stat of dataSeries()"><div class="{{ pointTypeClass(stat.dashTypeAndColor) }}" title="{{ stat.name }}"></div>{{ stat.name }}</li>
</ol>
</div>
<div
*ngIf="imageUrl">
<div

View File

@@ -20,4 +20,50 @@ img {
background-color: white;
box-shadow: 5px 5px 10px 0px #e0e0e0;
overflow: auto;
}
.plot-view--legend {
padding-bottom: 0.5em;
border: solid 1px #ccc;
display: flex;
flex-direction: column;
background: #fff;
border-radius: 4px;
position: fixed;
z-index: 1;
transition: box-shadow 200ms cubic-bezier(0, 0, 0.2, 1);
box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2),
0 2px 2px 0 rgba(0, 0, 0, 0.14),
0 1px 5px 0 rgba(0, 0, 0, 0.12);
background-color: white;
}
.plot-view--legend:active {
box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2),
0 8px 10px 1px rgba(0, 0, 0, 0.14),
0 3px 14px 2px rgba(0, 0, 0, 0.12);
}
.plot-view--legend div[cdkDragHandle] {
visibility: hidden;
height: 1.2rem;
}
.plot-view--legend:hover div[cdkDragHandle] {
cursor: move;
visibility: visible;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAIAAAAmkwkpAAAAF0lEQVQI12P4//8/AwMDhGSEUFCAUwYAJl4R8Z1D4wIAAAAASUVORK5CYII=);
}
.plot-view--legend ol {
padding-inline-start: 0.7em;
}
.plot-view--legend ol li {
list-style-type: none;
display: flex;
flex-direction: row;
align-items: center
}
.plot-view--legend ol li .plot-details-plotType{
margin-right: 0.3em;
}

View File

@@ -1,15 +1,16 @@
import { Component, OnInit, Output, EventEmitter } from '@angular/core';
import { DataType, AxesTypes, PlotResponseStats, PlotConfig, PlotService, PlotResponse, PlotRequest, RenderOptions } from '../plot.service';
import { Component, Output, EventEmitter } from '@angular/core';
import { DataType, AxesTypes, PlotResponseStats, PlotConfig, PlotService, PlotResponse, PlotRequest, RenderOptions, DataSeriesStats, DashTypeAndColor } from '../plot.service';
import { MatSnackBar } from '@angular/material/snack-bar';
import * as moment from 'moment';
import { WidgetDimensions } from '../dashboard.service';
import { Overlay } from "@angular/cdk/overlay";
@Component({
selector: 'pdb-plot-view',
templateUrl: './plot-view.component.html',
styleUrls: ['./plot-view.component.scss']
})
export class PlotViewComponent implements OnInit {
export class PlotViewComponent {
readonly DATE_PATTERN = "YYYY-MM-DD HH:mm:ss"; // for moment-JS
@@ -18,6 +19,7 @@ export class PlotViewComponent implements OnInit {
readonly gnuplotTMargin = 57; // The top margin configured for gnuplot
readonly gnuplotBMargin = 76; // The bottom margin configured for gnuplot
isOpen = false;
imageUrl! : string;
stats: PlotResponseStats | null = null;
@@ -47,10 +49,9 @@ export class PlotViewComponent implements OnInit {
config? : PlotConfig;
constructor(private service : PlotService, private snackBar: MatSnackBar) { }
legendInitialPosition = {x:115,y:60};
ngOnInit() {
}
constructor(private service : PlotService, private snackBar: MatSnackBar, private overlay: Overlay) { }
showError(message:string) {
@@ -283,7 +284,7 @@ export class PlotViewComponent implements OnInit {
'main': new RenderOptions(actualDimension.height, actualDimension.width, false, true)
});
return request;
}
}
/**
* Zoom in/out by zoomFaktor, so that the anchorInPercentOfDateRange keeps the same position.
@@ -335,6 +336,18 @@ export class PlotViewComponent implements OnInit {
duration: moment.duration(endDate.diff(startDate))
};
}
dataSeries(): Array<DataSeriesStats> {
return this.stats ? this.stats.dataSeriesStats : [];
}
pointTypeClass(typeAndColor: DashTypeAndColor): string {
return "plot-details-plotType"
+" plot-details-plotType_"+typeAndColor.pointType
+" plot-details-plotType_"+typeAndColor.color.toLocaleLowerCase();
}
}
export class SelectionRange {