Compare commits
35 Commits
75fa966af3
...
standalone
| Author | SHA1 | Date | |
|---|---|---|---|
| eb65b56b78 | |||
| b0415ed972 | |||
| 4b211e425d | |||
| 9459eee606 | |||
| a81c458775 | |||
| ee0eab22f8 | |||
| 9ccb7a14b5 | |||
| 05cc0e985a | |||
| 6dc5ba1a1e | |||
| a6ae8e533e | |||
| 8e0572d35b | |||
| 697d3664aa | |||
| 526e1d842e | |||
| 06c9b4998f | |||
| ac5dcdc58f | |||
| 296d42e721 | |||
| 9db020ceb0 | |||
| 36da503be9 | |||
| 42751f84d4 | |||
| 39d7c029ea | |||
| f072185074 | |||
| 122ba11a79 | |||
| f1d7799bf1 | |||
| 680f1bff03 | |||
| fa0315650a | |||
| 8f765dd478 | |||
| 1234560512 | |||
| 2711579afb | |||
| 3ac021e45f | |||
| c199eae4ff | |||
| 6073dd0779 | |||
| fee5eda780 | |||
| cc0db6d732 | |||
| f084396e95 | |||
| e4b6eea4b1 |
20
build.gradle
20
build.gradle
@@ -13,18 +13,18 @@ ext {
|
||||
javaVersion=21
|
||||
|
||||
version_log4j2= '2.20.0' // keep in sync with spring-boot-starter-log4j2
|
||||
version_spring = '3.3.2'
|
||||
version_junit = '5.10.3'
|
||||
version_junit_platform = '1.10.3'
|
||||
version_nodejs = '18.18.0' // keep in sync with npm
|
||||
version_npm = '9.8.1' // keep in sync with nodejs
|
||||
version_spring = '3.3.4'
|
||||
version_junit = '5.11.1'
|
||||
version_junit_platform = '1.11.1'
|
||||
version_nodejs = '20.17.0' // keep in sync with npm
|
||||
version_npm = '10.8.2' // keep in sync with nodejs
|
||||
|
||||
lib_antlr = "org.antlr:antlr4:4.13.1"
|
||||
lib_antlr = "org.antlr:antlr4:4.13.2"
|
||||
|
||||
lib_commons_collections4 = 'org.apache.commons:commons-collections4:4.4'
|
||||
lib_commons_csv= 'org.apache.commons:commons-csv:1.11.0'
|
||||
lib_commons_lang3 = 'org.apache.commons:commons-lang3:3.15.0'
|
||||
lib_jackson_databind = 'com.fasterxml.jackson.core:jackson-databind:2.17.2'
|
||||
lib_commons_csv= 'org.apache.commons:commons-csv:1.12.0'
|
||||
lib_commons_lang3 = 'org.apache.commons:commons-lang3:3.17.0'
|
||||
lib_jackson_databind = 'com.fasterxml.jackson.core:jackson-databind:2.18.0'
|
||||
|
||||
lib_log4j2_core = "org.apache.logging.log4j:log4j-core:${version_log4j2}"
|
||||
lib_log4j2_slf4j_impl = "org.apache.logging.log4j:log4j-slf4j-impl:${version_log4j2}"
|
||||
@@ -141,5 +141,5 @@ subprojects {
|
||||
}
|
||||
|
||||
wrapper {
|
||||
gradleVersion = '8.9'
|
||||
gradleVersion = '8.10.2'
|
||||
}
|
||||
|
||||
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,6 +1,6 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
@@ -18,12 +18,15 @@
|
||||
"prefix": "app",
|
||||
"architect": {
|
||||
"build": {
|
||||
"builder": "@angular-devkit/build-angular:browser",
|
||||
"builder": "@angular-devkit/build-angular:application",
|
||||
"options": {
|
||||
"outputPath": "build/generated/resources",
|
||||
"outputPath": {
|
||||
"base": "build/generated/resources"
|
||||
},
|
||||
"index": "src/index.html",
|
||||
"main": "src/main.ts",
|
||||
"polyfills": "src/polyfills.ts",
|
||||
"polyfills": [
|
||||
"src/polyfills.ts"
|
||||
],
|
||||
"tsConfig": "tsconfig.app.json",
|
||||
"inlineStyleLanguage": "scss",
|
||||
"assets": [
|
||||
@@ -35,7 +38,8 @@
|
||||
],
|
||||
"scripts": [
|
||||
"node_modules/marked/marked.min.js"
|
||||
]
|
||||
],
|
||||
"browser": "src/main.ts"
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
@@ -61,9 +65,7 @@
|
||||
"sourceMap": true
|
||||
},
|
||||
"development": {
|
||||
"buildOptimizer": false,
|
||||
"optimization": false,
|
||||
"vendorChunk": true,
|
||||
"extractLicenses": false,
|
||||
"sourceMap": true,
|
||||
"namedChunks": true
|
||||
@@ -78,10 +80,10 @@
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
"browserTarget": "pdb-js:build:production"
|
||||
"buildTarget": "pdb-js:build:production"
|
||||
},
|
||||
"development": {
|
||||
"browserTarget": "pdb-js:build:development"
|
||||
"buildTarget": "pdb-js:build:development"
|
||||
}
|
||||
},
|
||||
"defaultConfiguration": "development"
|
||||
@@ -89,7 +91,7 @@
|
||||
"extract-i18n": {
|
||||
"builder": "@angular-devkit/build-angular:extract-i18n",
|
||||
"options": {
|
||||
"browserTarget": "pdb-js:build"
|
||||
"buildTarget": "pdb-js:build"
|
||||
}
|
||||
},
|
||||
"test": {
|
||||
|
||||
19837
pdb-js/package-lock.json
generated
19837
pdb-js/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -14,28 +14,28 @@
|
||||
},
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@angular/animations": "^16.2.7",
|
||||
"@angular/cdk": "^16.2.6",
|
||||
"@angular/common": "^16.2.7",
|
||||
"@angular/compiler": "^16.2.7",
|
||||
"@angular/core": "^16.2.7",
|
||||
"@angular/forms": "^16.2.7",
|
||||
"@angular/material": "^16.2.6",
|
||||
"@angular/platform-browser": "^16.2.7",
|
||||
"@angular/platform-browser-dynamic": "^16.2.7",
|
||||
"@angular/router": "^16.2.7",
|
||||
"@angular/animations": "^18.2.6",
|
||||
"@angular/cdk": "^18.2.6",
|
||||
"@angular/common": "^18.2.6",
|
||||
"@angular/compiler": "^18.2.6",
|
||||
"@angular/core": "^18.2.6",
|
||||
"@angular/forms": "^18.2.6",
|
||||
"@angular/material": "^18.2.6",
|
||||
"@angular/platform-browser": "^18.2.6",
|
||||
"@angular/platform-browser-dynamic": "^18.2.6",
|
||||
"@angular/router": "^18.2.6",
|
||||
"luxon": "^3.4.3",
|
||||
"marked": "^4.2.12",
|
||||
"ngx-markdown": "^16.0.0",
|
||||
"marked": "^12",
|
||||
"ngx-markdown": "18.0.0",
|
||||
"rxjs": "~7.5.0",
|
||||
"rxjs-compat": "^6.6.7",
|
||||
"tslib": "^2.3.0",
|
||||
"zone.js": "~0.13.3"
|
||||
"zone.js": "^0.14.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@angular-devkit/build-angular": "^16.2.4",
|
||||
"@angular/cli": "^16.2.4",
|
||||
"@angular/compiler-cli": "^16.2.7",
|
||||
"@angular-devkit/build-angular": "^18.2.6",
|
||||
"@angular/cli": "^18.2.6",
|
||||
"@angular/compiler-cli": "^18.2.6",
|
||||
"@types/jasmine": "~4.3.0",
|
||||
"@types/luxon": "^3.3.2",
|
||||
"@types/marked": "^4.0.8",
|
||||
@@ -47,6 +47,6 @@
|
||||
"karma-jasmine": "~5.1.0",
|
||||
"karma-jasmine-html-reporter": "~2.1.0",
|
||||
"source-map-explorer": "^2.5.3",
|
||||
"typescript": "5.1"
|
||||
"typescript": "^5.4.5"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,17 @@
|
||||
import { NgModule } from "@angular/core";
|
||||
import { RouterModule, Routes } from "@angular/router";
|
||||
import { VisualizationPageComponent } from "./visualization-page/visualization-page.component";
|
||||
import { MainPageComponent } from "./main-page/main-page.component";
|
||||
import { UploadPageComponent } from "./upload-page/upload-page.component";
|
||||
import { HelpPageComponent } from "./help-page/help-page.component";
|
||||
import { DashboardPageComponent } from "./dashboard-page/dashboard-page.component";
|
||||
import { DashboardComponent } from "./dashboard-page/dashboard/dashboard.component";
|
||||
import { CustomizableGridComponent } from "./customizable-grid/customizable-grid.component";
|
||||
import { DatePickerTestComponent } from "./components/datepicker/date-picker-test.component";
|
||||
|
||||
const routes: Routes = [
|
||||
{ path: "", component: MainPageComponent },
|
||||
{ path: "", loadComponent: () => import("./main-page/main-page.component").then(m => m.MainPageComponent) },
|
||||
{ path: "vis", component: VisualizationPageComponent },
|
||||
{ path: "dashboard", component: DashboardPageComponent },
|
||||
{ path: "dashboard/:id", component: DashboardComponent },
|
||||
{ path: "testing/datepicker", component: DatePickerTestComponent },
|
||||
{ path: "upload", component: UploadPageComponent },
|
||||
{ path: "grid", component: CustomizableGridComponent },
|
||||
{ path: "help", component: HelpPageComponent },
|
||||
{ path: "upload", loadComponent: () => import("./upload-page/upload-page.component").then(m => m.UploadPageComponent) },
|
||||
{ path: "grid", loadComponent: () => import("./customizable-grid/customizable-grid.component").then(m => m.CustomizableGridComponent) },
|
||||
{ path: "help", loadComponent: () => import("./help-page/help-page.component").then(m => m.HelpPageComponent) },
|
||||
// { path: '**', component: PageNotFoundComponent }
|
||||
];
|
||||
|
||||
|
||||
@@ -1,18 +1,14 @@
|
||||
import { BrowserModule } from "@angular/platform-browser";
|
||||
import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
|
||||
import { enableProdMode, NgModule } from "@angular/core";
|
||||
import { HttpClientModule } from "@angular/common/http";
|
||||
import { provideHttpClient, withInterceptorsFromDi } from "@angular/common/http";
|
||||
import { FormsModule, ReactiveFormsModule } from "@angular/forms";
|
||||
|
||||
import { AppRoutingModule } from "./app-routing.module";
|
||||
import { AppComponent } from "./app.component";
|
||||
import { MainPageComponent } from "./main-page/main-page.component";
|
||||
import { HelpPageComponent } from "./help-page/help-page.component";
|
||||
import { UploadPageComponent } from "./upload-page/upload-page.component";
|
||||
import { VisualizationPageComponent } from "./visualization-page/visualization-page.component";
|
||||
|
||||
import { DatePickerComponent } from "./components/datepicker/date-picker.component";
|
||||
import { DatePickerTestComponent } from "./components/datepicker/date-picker-test.component";
|
||||
|
||||
import { MatAutocompleteModule } from "@angular/material/autocomplete";
|
||||
import { MatButtonModule } from "@angular/material/button";
|
||||
@@ -28,7 +24,6 @@ import { MatTooltipModule } from "@angular/material/tooltip";
|
||||
import { OverlayModule } from "@angular/cdk/overlay";
|
||||
import { YAxisDefinitionComponent } from "./y-axis-definition/y-axis-definition.component";
|
||||
import { QueryAutocompleteComponent } from "./query-autocomplete/query-autocomplete.component";
|
||||
import { LimitByComponent } from "./limit-by/limit-by.component";
|
||||
import { PlotDetailsComponent } from "./plot-details/plot-details.component";
|
||||
import { PlotViewComponent } from "./plot-view/plot-view.component";
|
||||
import {
|
||||
@@ -38,7 +33,6 @@ import {
|
||||
} from "./gallery-view/gallery-view.component";
|
||||
import { ImageToggleComponent } from "./image-toggle/image-toggle.component";
|
||||
import { DashboardPageComponent } from "./dashboard-page/dashboard-page.component";
|
||||
import { NewDashboardComponent } from "./dashboard-page/new-dashboard/new-dashboard.component";
|
||||
import {
|
||||
MAT_DIALOG_DEFAULT_OPTIONS,
|
||||
MatDialogModule,
|
||||
@@ -49,55 +43,48 @@ import { MatGridListModule } from "@angular/material/grid-list";
|
||||
import { MatCardModule } from "@angular/material/card";
|
||||
import { MatBadgeModule } from "@angular/material/badge";
|
||||
import { DashboardComponent } from "./dashboard-page/dashboard/dashboard.component";
|
||||
import { AddTextDialogComponent } from "./dashboard-page/dashboard/add-text-dialog/add-text-dialog.component";
|
||||
import { TextWidgetComponent } from "./dashboard-page/dashboard/text-widget/text-widget.component";
|
||||
import { AddPlotDialogComponent } from "./dashboard-page/dashboard/add-plot-dialog/add-plot-dialog.component";
|
||||
import { PlotWidgetComponent } from "./dashboard-page/dashboard/plot-widget/plot-widget.component";
|
||||
import { FullScreenPlotDialogComponent } from "./dashboard-page/dashboard/full-screen-plot-dialog/full-screen-plot-dialog.component";
|
||||
import { CustomizableGridComponent } from "./customizable-grid/customizable-grid.component";
|
||||
|
||||
import { DragDropModule } from "@angular/cdk/drag-drop";
|
||||
import { ConfirmationDialogComponent } from "./confirmation-dialog/confirmation-dialog.component";
|
||||
import { FocusDirective } from "./focus.directive";
|
||||
import { MarkdownModule } from "ngx-markdown";
|
||||
import { MainPageComponent } from "./main-page/main-page.component";
|
||||
import { LimitByComponent } from "./limit-by/limit-by.component";
|
||||
|
||||
@NgModule({
|
||||
declarations: [
|
||||
@NgModule({ declarations: [
|
||||
AppComponent,
|
||||
MainPageComponent,
|
||||
HelpPageComponent,
|
||||
UploadPageComponent,
|
||||
DatePickerComponent,
|
||||
DatePickerTestComponent,
|
||||
VisualizationPageComponent,
|
||||
YAxisDefinitionComponent,
|
||||
QueryAutocompleteComponent,
|
||||
LimitByComponent,
|
||||
PlotDetailsComponent,
|
||||
PlotViewComponent,
|
||||
GalleryViewComponent,
|
||||
GalleryItemView,
|
||||
GalleryFilterView,
|
||||
ImageToggleComponent,
|
||||
DashboardPageComponent,
|
||||
NewDashboardComponent,
|
||||
DashboardComponent,
|
||||
AddTextDialogComponent,
|
||||
TextWidgetComponent,
|
||||
AddPlotDialogComponent,
|
||||
PlotWidgetComponent,
|
||||
FullScreenPlotDialogComponent,
|
||||
CustomizableGridComponent,
|
||||
ConfirmationDialogComponent,
|
||||
FocusDirective,
|
||||
],
|
||||
bootstrap: [AppComponent],
|
||||
imports: [
|
||||
MarkdownModule.forRoot(),
|
||||
BrowserModule,
|
||||
AppRoutingModule,
|
||||
FormsModule,
|
||||
ReactiveFormsModule,
|
||||
DatePickerComponent,
|
||||
DragDropModule,
|
||||
ImageToggleComponent,
|
||||
LimitByComponent,
|
||||
MainPageComponent,
|
||||
MatAutocompleteModule,
|
||||
MatBadgeModule,
|
||||
MatButtonModule,
|
||||
@@ -116,15 +103,13 @@ import { MarkdownModule } from "ngx-markdown";
|
||||
MatTableModule,
|
||||
MatTooltipModule,
|
||||
BrowserAnimationsModule,
|
||||
HttpClientModule,
|
||||
OverlayModule,
|
||||
YAxisDefinitionComponent
|
||||
],
|
||||
providers: [{
|
||||
provide: MAT_DIALOG_DEFAULT_OPTIONS,
|
||||
useValue: { hasBackdrop: true },
|
||||
}],
|
||||
bootstrap: [AppComponent],
|
||||
})
|
||||
}, provideHttpClient(withInterceptorsFromDi())] })
|
||||
export class AppModule {}
|
||||
|
||||
enableProdMode();
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
<style></style>
|
||||
|
||||
<form>
|
||||
<app-date-picker
|
||||
[formControl]="datePicker"
|
||||
(dateValueSelected)="(dateChanged)"
|
||||
></app-date-picker>
|
||||
|
||||
Type: {{ datePicker.value?.type }}<br />
|
||||
value: {{ datePicker.value?.value }}<br />
|
||||
display: {{ datePicker.value?.display }}<br />
|
||||
</form>
|
||||
|
||||
<button (click)="readValue()">read value</button>
|
||||
<div>{{ output }}</div>
|
||||
@@ -1,29 +0,0 @@
|
||||
import { Component } from "@angular/core";
|
||||
import { FormControl, FormGroup, Validators } from "@angular/forms";
|
||||
import { DateValue } from "./date-picker.component";
|
||||
|
||||
@Component({
|
||||
selector: "app-date-picker-test",
|
||||
templateUrl: "./date-picker-test.component.html",
|
||||
})
|
||||
export class DatePickerTestComponent {
|
||||
datePicker = new FormControl<DateValue>(
|
||||
new DateValue(
|
||||
"ABSOLUTE",
|
||||
"2019-10-05 12:34:56 - 2019-10-11 23:59:59",
|
||||
"2019-10-05 12:34:56 - 2019-10-11 23:59:59",
|
||||
),
|
||||
);
|
||||
|
||||
output = "";
|
||||
|
||||
readValue() {
|
||||
this.output = this.datePicker.value?.type + " " +
|
||||
this.datePicker.value?.value;
|
||||
}
|
||||
|
||||
dateChanged(e: any) {
|
||||
console.log("dateChanged", e);
|
||||
this.output += "dateChanged: " + e;
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,4 @@
|
||||
<style>
|
||||
#date-box {
|
||||
width: 23.5em;
|
||||
}
|
||||
|
||||
.header-box {
|
||||
display: flex;
|
||||
justify-content: end;
|
||||
}
|
||||
|
||||
.date-picker-overlay {
|
||||
width: 500px;
|
||||
transition: box-shadow 200ms cubic-bezier(0, 0, 0.2, 1);
|
||||
@@ -31,18 +22,16 @@
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="header-box">
|
||||
<button
|
||||
<button
|
||||
mat-button
|
||||
matTooltip="Date Picker"
|
||||
(click)="isOpen = !isOpen"
|
||||
cdkOverlayOrigin
|
||||
#trigger="cdkOverlayOrigin"
|
||||
[attr.disabled]="isDisabled ? 'disabled' : null"
|
||||
>
|
||||
>
|
||||
{{ datePickerControl.value?.display }}
|
||||
</button>
|
||||
</div>
|
||||
</button>
|
||||
|
||||
<ng-template
|
||||
cdkConnectedOverlay
|
||||
@@ -193,8 +182,6 @@
|
||||
<input matInput [formControl]="dateRange" name="dates" />
|
||||
</mat-form-field>
|
||||
<button mat-button (click)="applyAbsoluteTime()">Apply</button>
|
||||
|
||||
<p>Value: {{ dateRange.value }}</p>
|
||||
</mat-tab>
|
||||
</mat-tab-group>
|
||||
</div>
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { OverlayModule } from "@angular/cdk/overlay";
|
||||
import {
|
||||
Component,
|
||||
EventEmitter,
|
||||
@@ -8,9 +9,18 @@ import {
|
||||
import {
|
||||
ControlValueAccessor,
|
||||
FormControl,
|
||||
FormsModule,
|
||||
NG_VALUE_ACCESSOR,
|
||||
ReactiveFormsModule,
|
||||
Validators,
|
||||
} from "@angular/forms";
|
||||
import { MatButtonModule } from "@angular/material/button";
|
||||
import { MAT_DIALOG_DEFAULT_OPTIONS } from "@angular/material/dialog";
|
||||
import { MatFormFieldModule } from "@angular/material/form-field";
|
||||
import { MatInputModule } from "@angular/material/input";
|
||||
import { MatTabsModule } from "@angular/material/tabs";
|
||||
import { BrowserModule } from "@angular/platform-browser";
|
||||
import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
|
||||
|
||||
export type DateType = "QUICK" | "RELATIVE" | "ABSOLUTE";
|
||||
|
||||
@@ -29,12 +39,27 @@ export class DatePickerChange {
|
||||
@Component({
|
||||
selector: "app-date-picker",
|
||||
templateUrl: "./date-picker.component.html",
|
||||
standalone: true,
|
||||
imports: [
|
||||
BrowserModule,
|
||||
MatButtonModule,
|
||||
MatFormFieldModule,
|
||||
MatInputModule,
|
||||
MatTabsModule,
|
||||
FormsModule,
|
||||
ReactiveFormsModule,
|
||||
OverlayModule
|
||||
],
|
||||
providers: [
|
||||
{
|
||||
provide: NG_VALUE_ACCESSOR,
|
||||
useExisting: forwardRef(() => DatePickerComponent),
|
||||
multi: true,
|
||||
},
|
||||
{
|
||||
provide: MAT_DIALOG_DEFAULT_OPTIONS,
|
||||
useValue: { hasBackdrop: true },
|
||||
}
|
||||
],
|
||||
})
|
||||
export class DatePickerComponent implements ControlValueAccessor {
|
||||
|
||||
@@ -1,12 +1,18 @@
|
||||
import { Component } from '@angular/core';
|
||||
import { CdkDragEnter, CdkDropList, moveItemInArray, DragRef} from '@angular/cdk/drag-drop';
|
||||
import { CdkDragEnter, CdkDropList, moveItemInArray, DragRef, DragDropModule} from '@angular/cdk/drag-drop';
|
||||
import { AfterViewInit } from '@angular/core';
|
||||
import { ViewChild } from '@angular/core';
|
||||
import { BrowserModule } from '@angular/platform-browser';
|
||||
|
||||
|
||||
@Component({
|
||||
selector: 'app-customizable-grid',
|
||||
templateUrl: './customizable-grid.component.html'
|
||||
templateUrl: './customizable-grid.component.html',
|
||||
standalone: true,
|
||||
imports: [
|
||||
BrowserModule,
|
||||
DragDropModule
|
||||
]
|
||||
})
|
||||
export class CustomizableGridComponent implements AfterViewInit {
|
||||
@ViewChild(CdkDropList) placeholder!: CdkDropList;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { AfterViewInit, Component, ElementRef, Inject, ViewChild } from '@angular/core';
|
||||
import { Component, Inject, ViewChild } from '@angular/core';
|
||||
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
||||
import { PlotConfig } from 'src/app/plot.service';
|
||||
import { VisualizationPageComponent } from 'src/app/visualization-page/visualization-page.component';
|
||||
|
||||
@@ -1,9 +1,28 @@
|
||||
import { Component, ElementRef, Inject, ViewChild } from '@angular/core';
|
||||
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
||||
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { BrowserModule } from '@angular/platform-browser';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { MarkdownModule } from 'ngx-markdown';
|
||||
|
||||
@Component({
|
||||
selector: 'app-add-text-dialog',
|
||||
templateUrl: './add-text-dialog.component.html'
|
||||
templateUrl: './add-text-dialog.component.html',
|
||||
standalone: true,
|
||||
imports: [
|
||||
BrowserModule,
|
||||
BrowserAnimationsModule,
|
||||
FormsModule,
|
||||
ReactiveFormsModule,
|
||||
MarkdownModule,
|
||||
MatButtonModule,
|
||||
MatDialogModule,
|
||||
MatFormFieldModule,
|
||||
MatInputModule,
|
||||
]
|
||||
})
|
||||
export class AddTextDialogComponent {
|
||||
text = "";
|
||||
|
||||
@@ -3,6 +3,16 @@
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.toolbar {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
.toolbar #filter-date-range{
|
||||
flex-grow: 1;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
.center {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
@@ -37,6 +47,9 @@
|
||||
flex-basis: 0;
|
||||
|
||||
}
|
||||
.editable {
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
.editable-hovered {
|
||||
visibility: hidden;
|
||||
@@ -73,12 +86,14 @@
|
||||
<button mat-button (click)="addText()">Add Text</button>
|
||||
<button mat-button (click)="addPlot()">Add Plot</button>
|
||||
<button class="save-button" mat-button (click)="save()" [disabled]="!isDirty()">Save</button>
|
||||
<div id="filter-date-range">
|
||||
Date range: <app-date-picker #datePicker (dateValueSelected)="updateDateRange($event)" ></app-date-picker>
|
||||
</div>
|
||||
</div>
|
||||
<div class="editable">
|
||||
<h1>{{dashboard.name}}<button mat-icon-button (click)="editNameAndDescription()" class="editable-hovered"><img src="/assets/img/edit-outline.svg"/></button></h1>
|
||||
<p>{{dashboard.description}}</p>
|
||||
</div>
|
||||
|
||||
<div cdkDropListGroup class="dashboard-area">
|
||||
<div
|
||||
cdkDropList
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { CdkDragDrop, moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';
|
||||
import { HttpErrorResponse } from '@angular/common/http';
|
||||
import { Component, ElementRef, OnInit } from '@angular/core';
|
||||
import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { ActivatedRoute } from '@angular/router';
|
||||
@@ -9,12 +9,13 @@ import { PlotConfig, PlotResponse, PlotService } from 'src/app/plot.service';
|
||||
import { NewDashboardComponent } from '../new-dashboard/new-dashboard.component';
|
||||
import { AddPlotDialogComponent } from './add-plot-dialog/add-plot-dialog.component';
|
||||
import { AddTextDialogComponent } from './add-text-dialog/add-text-dialog.component';
|
||||
import { DatePickerChange, DatePickerComponent } from 'src/app/components/datepicker/date-picker.component';
|
||||
|
||||
@Component({
|
||||
selector: 'app-dashboard',
|
||||
templateUrl: './dashboard.component.html'
|
||||
})
|
||||
export class DashboardComponent implements OnInit {
|
||||
export class DashboardComponent implements OnInit{
|
||||
|
||||
dashboard?: Dashboard = undefined;
|
||||
|
||||
@@ -24,6 +25,9 @@ export class DashboardComponent implements OnInit {
|
||||
|
||||
plotWidgetRenderData: PlotWidgetRenderData[] = [];
|
||||
|
||||
@ViewChild("datePicker")
|
||||
datePicker!: DatePickerComponent;
|
||||
|
||||
constructor(
|
||||
private route: ActivatedRoute,
|
||||
private service: DashboardService,
|
||||
@@ -58,6 +62,13 @@ export class DashboardComponent implements OnInit {
|
||||
});
|
||||
}
|
||||
|
||||
updateDateRange(e: DatePickerChange) {
|
||||
this.plotWidgetRenderData.forEach(r => {
|
||||
r.widget.config.dateRange = e.value;
|
||||
});
|
||||
this.loadImages(0, this.plotWidgetRenderData);
|
||||
}
|
||||
|
||||
isDirty() {
|
||||
return this.pristineDashboardJSON !== JSON.stringify(this.dashboard);
|
||||
}
|
||||
@@ -70,10 +81,13 @@ export class DashboardComponent implements OnInit {
|
||||
if (plot.isAborted) {
|
||||
this.loadImages(index +1 , plotWidgetQueue);
|
||||
}else{
|
||||
|
||||
plot.plotResponse = undefined; // remove old image and show loading icon
|
||||
|
||||
const request = PlotWidget.createPlotRequest(plot.widget, plot.submitterId);
|
||||
this.plotService.sendPlotRequest(request).subscribe({
|
||||
next: (response: PlotResponse)=> {
|
||||
plot.plotResponse= response;
|
||||
plot.plotResponse = response;
|
||||
},
|
||||
error: (error:any)=> {
|
||||
plot.error = error;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { AfterViewInit, Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
|
||||
import { Component, EventEmitter, Input, Output, ViewChild, input } from '@angular/core';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
import { ConfirmationDialogComponent } from 'src/app/confirmation-dialog/confirmation-dialog.component';
|
||||
import { PlotWidget, PlotWidgetRenderData } from 'src/app/dashboard.service';
|
||||
@@ -18,14 +18,13 @@ export class PlotWidgetComponent {
|
||||
public thumbnailUrl = "";
|
||||
|
||||
|
||||
@ViewChild("plotView") plotView!: PlotViewComponent;
|
||||
//@ViewChild("plotView") plotView!: PlotViewComponent;
|
||||
|
||||
@Output()
|
||||
deleted : EventEmitter<string> = new EventEmitter<string>();
|
||||
|
||||
constructor(private dialog: MatDialog, private service: PlotService){}
|
||||
|
||||
|
||||
hasRender(name: string): boolean{
|
||||
return this.data !== undefined && this.data.plotResponse !== undefined && this.data.plotResponse?.rendered[name] !== undefined;
|
||||
}
|
||||
|
||||
@@ -1,11 +1,26 @@
|
||||
import { Component, ElementRef, Inject, OnInit, ViewChild } from '@angular/core';
|
||||
import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';
|
||||
import {MAT_DIALOG_DATA, MatDialogModule, MatDialogRef} from '@angular/material/dialog';
|
||||
import { DashboardCreationData } from 'src/app/dashboard.service';
|
||||
import { AbstractControl, FormControl, FormGroup, ValidationErrors, ValidatorFn, Validators } from '@angular/forms';
|
||||
import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
|
||||
import { BrowserModule } from '@angular/platform-browser';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { OverlayModule } from '@angular/cdk/overlay';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
|
||||
@Component({
|
||||
selector: 'app-new-dashboard',
|
||||
templateUrl: './new-dashboard.component.html'
|
||||
templateUrl: './new-dashboard.component.html',
|
||||
standalone: true,
|
||||
imports: [
|
||||
BrowserModule,
|
||||
FormsModule,
|
||||
MatButtonModule,
|
||||
MatDialogModule,
|
||||
MatFormFieldModule,
|
||||
MatInputModule,
|
||||
ReactiveFormsModule
|
||||
]
|
||||
})
|
||||
export class NewDashboardComponent implements OnInit {
|
||||
|
||||
|
||||
@@ -3,7 +3,8 @@ import { Component, OnInit } from '@angular/core';
|
||||
@Component({
|
||||
selector: 'pdb-help-page',
|
||||
templateUrl: './help-page.component.html',
|
||||
styleUrls: ['./help-page.component.scss']
|
||||
styleUrls: ['./help-page.component.scss'],
|
||||
standalone: true
|
||||
})
|
||||
export class HelpPageComponent implements OnInit {
|
||||
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
|
||||
import { BrowserModule } from '@angular/platform-browser';
|
||||
|
||||
@Component({
|
||||
selector: 'pdb-image-toggle',
|
||||
templateUrl: './image-toggle.component.html',
|
||||
styleUrls: ['./image-toggle.component.scss']
|
||||
styleUrls: ['./image-toggle.component.scss'],
|
||||
standalone: true,
|
||||
imports: [
|
||||
BrowserModule
|
||||
]
|
||||
})
|
||||
export class ImageToggleComponent implements OnInit {
|
||||
|
||||
|
||||
@@ -1,10 +1,25 @@
|
||||
import { Component, Input} from '@angular/core';
|
||||
import {FormControl} from '@angular/forms';
|
||||
import { Component } from '@angular/core';
|
||||
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
||||
import { MatFormField, MatLabel } from '@angular/material/form-field';
|
||||
import { MatInput } from '@angular/material/input';
|
||||
import { MatOption, MatSelect } from '@angular/material/select';
|
||||
import { BrowserModule } from '@angular/platform-browser';
|
||||
|
||||
@Component({
|
||||
selector: 'pdb-limit-by',
|
||||
templateUrl: './limit-by.component.html',
|
||||
styleUrls: ['./limit-by.component.scss']
|
||||
styleUrls: ['./limit-by.component.scss'],
|
||||
standalone: true,
|
||||
imports: [
|
||||
BrowserModule,
|
||||
FormsModule,
|
||||
MatFormField,
|
||||
MatInput,
|
||||
MatLabel,
|
||||
MatSelect,
|
||||
MatOption,
|
||||
ReactiveFormsModule
|
||||
]
|
||||
})
|
||||
export class LimitByComponent {
|
||||
|
||||
|
||||
@@ -1,15 +1,14 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { Component } from '@angular/core';
|
||||
import { RouterLink } from '@angular/router';
|
||||
|
||||
@Component({
|
||||
selector: 'pdb-main-page',
|
||||
templateUrl: './main-page.component.html',
|
||||
styleUrls: ['./main-page.component.scss']
|
||||
standalone: true,
|
||||
imports: [
|
||||
RouterLink
|
||||
]
|
||||
})
|
||||
export class MainPageComponent implements OnInit {
|
||||
|
||||
constructor() { }
|
||||
|
||||
ngOnInit() {
|
||||
}
|
||||
export class MainPageComponent {
|
||||
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Component, OnInit, Input, Output, ViewChild, EventEmitter, ɵpublishDefaultGlobalUtils } from '@angular/core';
|
||||
import { Component, Input } from '@angular/core';
|
||||
import { DashTypeAndColor, PlotResponseStats, DataSeriesStats } from '../plot.service';
|
||||
import { UtilService } from '../utils.service';
|
||||
|
||||
|
||||
@@ -298,7 +298,6 @@ export class PlotViewComponent {
|
||||
*/
|
||||
shiftDateByAnchor(dateValue:DateValue, anchorInPercentOfDateRange:number, zoomFactor:number)
|
||||
{
|
||||
debugger;
|
||||
const dateRangeParsed = this.parseDateRange(dateValue);
|
||||
dateRangeParsed.subscribe({
|
||||
next: (dataRange: DateRange) => {
|
||||
@@ -330,7 +329,6 @@ export class PlotViewComponent {
|
||||
*/
|
||||
shiftDate(dateValue: DateValue, factorStartDate: number, factorEndDate: number)
|
||||
{
|
||||
debugger;
|
||||
this.parseDateRange(dateValue).subscribe(
|
||||
dateRangeParsed => {
|
||||
const dateRangeInSeconds = Math.floor(dateRangeParsed.duration.toMillis()/1000);
|
||||
|
||||
@@ -3,7 +3,8 @@ import { Component, OnInit } from '@angular/core';
|
||||
@Component({
|
||||
selector: 'pdb-upload-page',
|
||||
templateUrl: './upload-page.component.html',
|
||||
styleUrls: ['./upload-page.component.scss']
|
||||
styleUrls: ['./upload-page.component.scss'],
|
||||
standalone: true
|
||||
})
|
||||
export class UploadPageComponent implements OnInit {
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
grid:
|
||||
"query-box query-box date-box" auto
|
||||
"filters results results" 1fr
|
||||
/ 25.5em 3fr 23.5em;
|
||||
/ 25.5em 3fr auto;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,6 +43,8 @@
|
||||
|
||||
#date-box{
|
||||
grid-area: date-box;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,10 +1,27 @@
|
||||
import { Component, Input } from '@angular/core';
|
||||
import { YAxisDefinition } from '../plot.service';
|
||||
import { BrowserModule } from '@angular/platform-browser';
|
||||
import { MatFormField, MatLabel } from '@angular/material/form-field';
|
||||
import { MatOptgroup, MatOption, MatSelect } from '@angular/material/select';
|
||||
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
||||
import { MatInput } from '@angular/material/input';
|
||||
|
||||
@Component({
|
||||
selector: 'pdb-y-axis-definition',
|
||||
templateUrl: './y-axis-definition.component.html',
|
||||
styleUrls: ['./y-axis-definition.component.scss']
|
||||
styleUrls: ['./y-axis-definition.component.scss'],
|
||||
standalone: true,
|
||||
imports: [
|
||||
BrowserModule,
|
||||
FormsModule,
|
||||
MatFormField,
|
||||
MatInput,
|
||||
MatLabel,
|
||||
MatSelect,
|
||||
MatOption,
|
||||
MatOptgroup,
|
||||
ReactiveFormsModule
|
||||
]
|
||||
})
|
||||
export class YAxisDefinitionComponent {
|
||||
|
||||
|
||||
@@ -14,25 +14,21 @@
|
||||
// If you don't need the default component typographies but still want the hierarchy styles,
|
||||
// you can delete this line and instead use:
|
||||
// `@include mat.legacy-typography-hierarchy(mat.define-typography-config());`
|
||||
/* TODO(mdc-migration): Remove all-legacy-component-typographies once all legacy components are migrated*/
|
||||
@include mat.all-legacy-component-typographies();
|
||||
@include mat.all-component-typographies();
|
||||
/* TODO(mdc-migration): Remove legacy-core once all legacy components are migrated*/
|
||||
@include mat.legacy-core();
|
||||
@include mat.core();
|
||||
|
||||
// Define the palettes for your theme using the Material Design palettes available in palette.scss
|
||||
// (imported above). For each palette, you can optionally specify a default, lighter, and darker
|
||||
// hue. Available color palettes: https://material.io/design/color/
|
||||
$candy-app-primary: mat.define-palette(mat.$blue-palette);
|
||||
$candy-app-accent: mat.define-palette(mat.$blue-palette, A200, A100, A400);
|
||||
$candy-app-primary: mat.m2-define-palette(mat.$m2-blue-palette);
|
||||
$candy-app-accent: mat.m2-define-palette(mat.$m2-blue-palette, A200, A100, A400);
|
||||
|
||||
// The warn palette is optional (defaults to red).
|
||||
$candy-app-warn: mat.define-palette(mat.$red-palette);
|
||||
$candy-app-warn: mat.m2-define-palette(mat.$m2-red-palette);
|
||||
|
||||
// Create the theme object. A theme consists of configurations for individual
|
||||
// theming systems such as "color" or "typography".
|
||||
$candy-app-theme: mat.define-light-theme((
|
||||
$candy-app-theme: mat.m2-define-light-theme((
|
||||
color: (
|
||||
primary: $candy-app-primary,
|
||||
accent: $candy-app-accent,
|
||||
@@ -45,8 +41,6 @@ $candy-app-theme: mat.define-light-theme((
|
||||
// Include theme styles for core and each component used in your app.
|
||||
// Alternatively, you can import and @include the theme mixins for each component
|
||||
// that you are using.
|
||||
/* TODO(mdc-migration): Remove all-legacy-component-themes once all legacy components are migrated*/
|
||||
@include mat.all-legacy-component-themes($candy-app-theme);
|
||||
@include mat.all-component-themes($candy-app-theme);
|
||||
|
||||
|
||||
@@ -204,7 +198,7 @@ app-add-text-dialog .mat-mdc-form-field-subscript-wrapper {
|
||||
|
||||
.errorPanel {
|
||||
padding: 1ex;
|
||||
background-color: map-get(mat.$red-palette, 100);
|
||||
background-color: map-get(mat.$m2-red-palette, 100);
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"baseUrl": "./",
|
||||
"outDir": "./dist/out-tsc",
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"esModuleInterop": true,
|
||||
"strict": true,
|
||||
"noImplicitOverride": true,
|
||||
"noPropertyAccessFromIndexSignature": true,
|
||||
@@ -12,7 +13,6 @@
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"sourceMap": true,
|
||||
"declaration": false,
|
||||
"downlevelIteration": true,
|
||||
"experimentalDecorators": true,
|
||||
"moduleResolution": "node",
|
||||
"importHelpers": true,
|
||||
|
||||
@@ -26,7 +26,7 @@ public class WebConfiguration implements WebMvcConfigurer, HardcodedValues, Prop
|
||||
|
||||
addResourceHandlerForPlottedImages(registry);
|
||||
|
||||
// addResourceHandlerForAngular(registry);
|
||||
addResourceHandlerForAngular(registry);
|
||||
}
|
||||
|
||||
private void addResourceHandlerForPlottedImages(final ResourceHandlerRegistry registry) {
|
||||
@@ -57,7 +57,7 @@ public class WebConfiguration implements WebMvcConfigurer, HardcodedValues, Prop
|
||||
// to determine which sub-page to show.
|
||||
//
|
||||
// This makes Angular also responsible for all 404 pages.
|
||||
registry.addResourceHandler("/**").addResourceLocations("classpath:/resources/").resourceChain(true)
|
||||
registry.addResourceHandler("/**").addResourceLocations("classpath:/resources/browser/").resourceChain(true)
|
||||
.addResolver(new PathResourceResolver() {
|
||||
@Override
|
||||
protected Resource getResource(final String resourcePath, final Resource location)
|
||||
@@ -65,7 +65,7 @@ public class WebConfiguration implements WebMvcConfigurer, HardcodedValues, Prop
|
||||
final Resource requestedResource = location.createRelative(resourcePath);
|
||||
|
||||
return requestedResource.exists() && requestedResource.isReadable() ? requestedResource
|
||||
: new ClassPathResource("/resources/index.html");
|
||||
: new ClassPathResource("/resources/browser/index.html");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user