From 209793b511994075d6d13e742d3311ff93e64aba Mon Sep 17 00:00:00 2001 From: icsp Date: Fri, 16 May 2025 15:22:21 +0200 Subject: [PATCH 01/16] feature: Aggiunto il tipo di dato 'mappa'. --- database/schema.sql | 3 +- frontend/angular.json | 11 +- frontend/package-lock.json | 25 ++++ frontend/package.json | 2 + frontend/src/app/app.component.html | 1 - .../concrete-data-type/maps-data-type.ts | 39 +++++ .../services/data-type-registry.service.ts | 3 + .../input-components/base-input-component.ts | 2 +- .../maps-input/maps-input.component.html | 25 ++++ .../maps-input/maps-input.component.ts | 137 ++++++++++++++++++ 10 files changed, 243 insertions(+), 5 deletions(-) create mode 100644 frontend/src/app/model/data-types/concrete-data-type/maps-data-type.ts create mode 100644 frontend/src/app/table-components/input-components/maps-input/maps-input.component.html create mode 100644 frontend/src/app/table-components/input-components/maps-input/maps-input.component.ts diff --git a/database/schema.sql b/database/schema.sql index 416f8157..a96f3d04 100644 --- a/database/schema.sql +++ b/database/schema.sql @@ -35,7 +35,8 @@ CREATE TABLE data_type INSERT INTO data_type (name) VALUES ('Textual'), ('Numeric'), - ('Monetary'); + ('Monetary'), + ('Maps'); CREATE TABLE tbl_table ( diff --git a/frontend/angular.json b/frontend/angular.json index 5cb8dc60..230ea72c 100644 --- a/frontend/angular.json +++ b/frontend/angular.json @@ -31,15 +31,22 @@ { "glob": "**/*", "input": "public" + }, + { + "glob": "*.*", + "input": "node_modules/leaflet/dist/images", + "output": "media" } ], "styles": [ "node_modules/bootstrap/dist/css/bootstrap.min.css", "node_modules/bootstrap-icons/font/bootstrap-icons.min.css", - "src/styles.css" + "src/styles.css", + "node_modules/leaflet/dist/leaflet.css" ], "scripts": [ - "node_modules/bootstrap/dist/js/bootstrap.min.js" + "node_modules/bootstrap/dist/js/bootstrap.min.js", + "node_modules/leaflet/dist/leaflet.js" ] }, "configurations": { diff --git a/frontend/package-lock.json b/frontend/package-lock.json index afa1bb85..8284be59 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -20,6 +20,7 @@ "@angular/router": "^19.2.7", "bootstrap": "^5.3.3", "bootstrap-icons": "^1.11.3", + "leaflet": "^1.9.4", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.15.0" @@ -30,6 +31,7 @@ "@angular/compiler-cli": "^19.2.7", "@types/bootstrap": "^5.2.10", "@types/jasmine": "~5.1.0", + "@types/leaflet": "^1.9.17", "jasmine-core": "~5.2.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.2.0", @@ -5532,6 +5534,13 @@ "@types/send": "*" } }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", @@ -5563,6 +5572,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/leaflet": { + "version": "1.9.17", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.17.tgz", + "integrity": "sha512-IJ4K6t7I3Fh5qXbQ1uwL3CFVbCi6haW9+53oLWgdKlLP7EaS21byWFJxxqOx9y8I0AP0actXSJLVMbyvxhkUTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -9832,6 +9851,12 @@ "shell-quote": "^1.8.1" } }, + "node_modules/leaflet": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", + "license": "BSD-2-Clause" + }, "node_modules/less": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/less/-/less-4.2.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index db518228..17bcfb75 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -22,6 +22,7 @@ "@angular/router": "^19.2.7", "bootstrap": "^5.3.3", "bootstrap-icons": "^1.11.3", + "leaflet": "^1.9.4", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.15.0" @@ -32,6 +33,7 @@ "@angular/compiler-cli": "^19.2.7", "@types/bootstrap": "^5.2.10", "@types/jasmine": "~5.1.0", + "@types/leaflet": "^1.9.17", "jasmine-core": "~5.2.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.2.0", diff --git a/frontend/src/app/app.component.html b/frontend/src/app/app.component.html index b896f611..7afcb444 100644 --- a/frontend/src/app/app.component.html +++ b/frontend/src/app/app.component.html @@ -1,4 +1,3 @@ - diff --git a/frontend/src/app/model/data-types/concrete-data-type/maps-data-type.ts b/frontend/src/app/model/data-types/concrete-data-type/maps-data-type.ts new file mode 100644 index 00000000..f9bb3e97 --- /dev/null +++ b/frontend/src/app/model/data-types/concrete-data-type/maps-data-type.ts @@ -0,0 +1,39 @@ +import { Type } from '@angular/core'; +import { BaseInputComponent } from '../../../table-components/input-components/base-input-component'; +import { BaseCellComponent } from '../../../table-components/table/cells/base-cell-component'; +import {IDataType} from '../i-data-type'; +import {TextualCellComponent} from '../../../table-components/table/cells/textual-cell/textual-cell.component'; +import {DataTypeRegistryService} from '../../../services/data-type-registry.service'; +import {MapsInputComponent} from '../../../table-components/input-components/maps-input/maps-input.component'; + + +export class MapsDataType implements IDataType { + + getDataTypeId(): number { + return DataTypeRegistryService.MAPS_ID; + } + + getInputComponent(): Type { + return MapsInputComponent; + } + + + getNewDataType(): IDataType { + return new MapsDataType(); + } + + + getCellComponent(): Type { + return TextualCellComponent; + } + + + getIconName(): string { + return 'bi-geo-alt'; + } + + + getDataTypeName(): string { + return 'Maps'; + } +} diff --git a/frontend/src/app/services/data-type-registry.service.ts b/frontend/src/app/services/data-type-registry.service.ts index 19b1384a..52db3768 100644 --- a/frontend/src/app/services/data-type-registry.service.ts +++ b/frontend/src/app/services/data-type-registry.service.ts @@ -6,6 +6,7 @@ import {MonetaryDataType} from '../model/data-types/concrete-data-type/monetary- import {map, Observable} from 'rxjs'; import {HttpClient, HttpParams} from '@angular/common/http'; import {DataTypeDTO} from '../model/dto/table/data-type-dto'; +import {MapsDataType} from '../model/data-types/concrete-data-type/maps-data-type'; @Injectable({ providedIn: 'root' @@ -17,6 +18,7 @@ export class DataTypeRegistryService { public static readonly TEXTUAL_ID: number = 1; public static readonly NUMERIC_ID: number = 2; public static readonly MONETARY_ID: number = 3; + public static readonly MAPS_ID: number = 4; getDataType(term: string = ''): Observable { @@ -35,6 +37,7 @@ export class DataTypeRegistryService { case DataTypeRegistryService.TEXTUAL_ID: return new TextualDataType(); case DataTypeRegistryService.NUMERIC_ID: return new NumericDataType(); case DataTypeRegistryService.MONETARY_ID: return new MonetaryDataType(); + case DataTypeRegistryService.MAPS_ID: return new MapsDataType(); default: throw new Error(`${dataTypeId} does not match any data type`); } } diff --git a/frontend/src/app/table-components/input-components/base-input-component.ts b/frontend/src/app/table-components/input-components/base-input-component.ts index 2b4b060d..155fe61c 100644 --- a/frontend/src/app/table-components/input-components/base-input-component.ts +++ b/frontend/src/app/table-components/input-components/base-input-component.ts @@ -68,7 +68,7 @@ export abstract class BaseInputComponent implements PopUpContent { * @param value - The string value entered by the user * @param dataTypeId - Numeric identifier representing the chosen data type */ - protected confirmInputDataType(value: any, dataTypeId: number): void { + protected confirmInputDataType(value: string, dataTypeId: number): void { if (this.doAfterInputDataTypeConfirmation) this.doAfterInputDataTypeConfirmation(value, dataTypeId); diff --git a/frontend/src/app/table-components/input-components/maps-input/maps-input.component.html b/frontend/src/app/table-components/input-components/maps-input/maps-input.component.html new file mode 100644 index 00000000..81ebc726 --- /dev/null +++ b/frontend/src/app/table-components/input-components/maps-input/maps-input.component.html @@ -0,0 +1,25 @@ +
+
+ + {{ longitudeLatitudeSeparator }} + + +
+
+
diff --git a/frontend/src/app/table-components/input-components/maps-input/maps-input.component.ts b/frontend/src/app/table-components/input-components/maps-input/maps-input.component.ts new file mode 100644 index 00000000..c2970beb --- /dev/null +++ b/frontend/src/app/table-components/input-components/maps-input/maps-input.component.ts @@ -0,0 +1,137 @@ +import {AfterViewInit, Component, ElementRef, viewChild} from '@angular/core'; +import {BaseInputComponent} from '../base-input-component'; +import * as L from 'leaflet'; +import {DataTypeRegistryService} from '../../../services/data-type-registry.service'; + +@Component({ + selector: 'tbl-maps-input', + imports: [], + templateUrl: './maps-input.component.html', +}) +export class MapsInputComponent extends BaseInputComponent implements AfterViewInit { + private map!: L.Map; + private currentMarker?: L.Marker; + private latitudeInput = viewChild.required>('latitudeInput'); + private longitudeInput = viewChild.required>('longitudeInput'); + + protected longitudeLatitudeSeparator = ':'; + + + ngAfterViewInit(): void { + this.initMap(); + } + + private initMap(): void { + this.map = L.map('map'); + this.setMapView(); + + L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', { + maxZoom: 19, + attribution: '© OpenStreetMap' + }).addTo(this.map); + + this.map.on('click', this.onMapClick.bind(this)); + } + + private setLongitudeLatitudeOnInput(lat: number, lng: number): void + { + this.latitudeInput().nativeElement.value = lat.toString(); + this.longitudeInput().nativeElement.value = lng.toString(); + } + + private getCurrentLongitudeLatitude(): string { + return `${this.latitudeInput().nativeElement.value}${this.longitudeLatitudeSeparator}${this.longitudeInput().nativeElement.value}`; + } + + private setMapView(lat: number = 51.505, lng: number = -0.09): void { + this.setLongitudeLatitudeOnInput(lat, lng); + this.map.setView([lat, lng], 13); + } + + private locateUser(): void { + if (!navigator.geolocation) { + console.warn('Geolocation is not supported by the browser'); + this.setMapView(); + return; + } + + navigator.geolocation.getCurrentPosition( + pos => { + const lat = pos.coords.latitude; + const lng = pos.coords.longitude; + + this.setMapView(lat, lng); + + this.currentMarker = L.marker([lat, lng]) + .addTo(this.map) + .bindPopup('You\'re here!') + .openPopup(); + }, + err => { + console.error('Error in position detection:', err.message); + }, + { + enableHighAccuracy: true, + timeout: 5000, + maximumAge: 0 + } + ); + } + + private setMarker(lat: number, lng: number): void { + if (this.currentMarker) + this.map.removeLayer(this.currentMarker); + + this.currentMarker = L.marker([lat, lng]) + .addTo(this.map); + this.setLongitudeLatitudeOnInput(lat, lng); + } + + private onMapClick(e: L.LeafletMouseEvent): void { + this.setMarker(e.latlng.lat, e.latlng.lng); + } + + protected override onPopUpShowUp(): void { + if (!this.startingValue) + this.locateUser(); + else { + const latLng: string[] = (this.startingValue as string).split(this.longitudeLatitudeSeparator); + const lat = Number(latLng[0]) || 0; + const lng = Number(latLng[1]) || 0; + this.setMapView(lat, lng); + this.setMarker(lat, lng); + } + } + + private applyInput(): void { + const coordinateRegex: RegExp = /^(-?\d+(\.\d+)?):(-?\d+(\.\d+)?)$/; + const cord = this.getCurrentLongitudeLatitude(); + + if (cord == this.longitudeLatitudeSeparator) + this.confirmInputDataType('', DataTypeRegistryService.MAPS_ID); + else if (cord && coordinateRegex.test(cord)) + this.confirmInputDataType(cord, DataTypeRegistryService.MAPS_ID); + else + this.abortInput(); + } + + protected override onPopUpHiddenWithLeftClick(): void { + this.applyInput(); + } + + protected override onPopUpHiddenWithRightClick(): void { + this.abortInput(); + } + + onPositionConfirmed(): void { + this.applyInput(); + } + + onLatitudeLongitudeChange(lat: string, lng: string): void { + const _lat = Number(lat); + const _lng = Number(lng); + + if (_lat && _lng) + this.setMapView(_lat, _lng); + } +} From f8d47b64cdea53fce52277db3fe5257b9dd4146e Mon Sep 17 00:00:00 2001 From: Mario D'Andrea Date: Tue, 20 May 2025 14:58:18 +0200 Subject: [PATCH 02/16] fix(css): table card hover and click actions now have appropriate effects --- frontend/src/app/home/table-card/table-card.component.css | 3 --- frontend/src/app/home/table-card/table-card.component.html | 2 +- frontend/src/app/home/table-card/table-card.component.ts | 7 ++++++- 3 files changed, 7 insertions(+), 5 deletions(-) delete mode 100644 frontend/src/app/home/table-card/table-card.component.css diff --git a/frontend/src/app/home/table-card/table-card.component.css b/frontend/src/app/home/table-card/table-card.component.css deleted file mode 100644 index bb1809da..00000000 --- a/frontend/src/app/home/table-card/table-card.component.css +++ /dev/null @@ -1,3 +0,0 @@ -.card:hover { - border-color: var(--selected-text-color); -} diff --git a/frontend/src/app/home/table-card/table-card.component.html b/frontend/src/app/home/table-card/table-card.component.html index 6c1d25a5..210508a9 100644 --- a/frontend/src/app/home/table-card/table-card.component.html +++ b/frontend/src/app/home/table-card/table-card.component.html @@ -1,5 +1,5 @@
-
{{ title }}
diff --git a/frontend/src/app/home/table-card/table-card.component.ts b/frontend/src/app/home/table-card/table-card.component.ts index 5670cde8..e7016455 100644 --- a/frontend/src/app/home/table-card/table-card.component.ts +++ b/frontend/src/app/home/table-card/table-card.component.ts @@ -12,7 +12,7 @@ import {TableCard} from './table-card.interface'; import {Subscription} from 'rxjs'; import {DatePipe} from '@angular/common'; import {PrettyDatePipe} from '../pretty-date.pipe'; -import {Router, RouterOutlet} from '@angular/router'; +import {Router} from '@angular/router'; import {ToastService} from '../../toast/toast.service'; import {ConfirmDialogService} from '../../confirm-dialog/confirm-dialog.service'; @@ -20,6 +20,11 @@ import {ConfirmDialogService} from '../../confirm-dialog/confirm-dialog.service' selector: 'tbl-table-card', imports: [DatePipe, PrettyDatePipe], templateUrl: './table-card.component.html', + styles: ` + .card:active { + border-color: var(--bs-btn-active-border-color) + } + ` }) export class TableCardComponent implements OnDestroy { @Output('editTableCard') editTableCard: EventEmitter = new EventEmitter; From a8120afe351fb1c79f18211fe2d04dfff9e1596d Mon Sep 17 00:00:00 2001 From: Mario D'Andrea Date: Tue, 20 May 2025 15:24:04 +0200 Subject: [PATCH 03/16] rename all instances of maps to map --- database/schema.sql | 2 +- .../{maps-data-type.ts => map-data-type.ts} | 23 ++++++++----------- .../services/data-type-registry.service.ts | 9 +++----- .../map-input.component.html} | 0 .../map-input.component.ts} | 10 ++++---- 5 files changed, 18 insertions(+), 26 deletions(-) rename frontend/src/app/model/data-types/concrete-data-type/{maps-data-type.ts => map-data-type.ts} (50%) rename frontend/src/app/table-components/input-components/{maps-input/maps-input.component.html => map-input/map-input.component.html} (100%) rename frontend/src/app/table-components/input-components/{maps-input/maps-input.component.ts => map-input/map-input.component.ts} (94%) diff --git a/database/schema.sql b/database/schema.sql index a96f3d04..7b615f56 100644 --- a/database/schema.sql +++ b/database/schema.sql @@ -36,7 +36,7 @@ INSERT INTO data_type (name) VALUES ('Textual'), ('Numeric'), ('Monetary'), - ('Maps'); + ('Map'); CREATE TABLE tbl_table ( diff --git a/frontend/src/app/model/data-types/concrete-data-type/maps-data-type.ts b/frontend/src/app/model/data-types/concrete-data-type/map-data-type.ts similarity index 50% rename from frontend/src/app/model/data-types/concrete-data-type/maps-data-type.ts rename to frontend/src/app/model/data-types/concrete-data-type/map-data-type.ts index f9bb3e97..c823934f 100644 --- a/frontend/src/app/model/data-types/concrete-data-type/maps-data-type.ts +++ b/frontend/src/app/model/data-types/concrete-data-type/map-data-type.ts @@ -1,39 +1,34 @@ -import { Type } from '@angular/core'; -import { BaseInputComponent } from '../../../table-components/input-components/base-input-component'; -import { BaseCellComponent } from '../../../table-components/table/cells/base-cell-component'; +import {Type} from '@angular/core'; +import {BaseInputComponent} from '../../../table-components/input-components/base-input-component'; +import {BaseCellComponent} from '../../../table-components/table/cells/base-cell-component'; import {IDataType} from '../i-data-type'; import {TextualCellComponent} from '../../../table-components/table/cells/textual-cell/textual-cell.component'; import {DataTypeRegistryService} from '../../../services/data-type-registry.service'; -import {MapsInputComponent} from '../../../table-components/input-components/maps-input/maps-input.component'; +import {MapInputComponent} from '../../../table-components/input-components/map-input/map-input.component'; -export class MapsDataType implements IDataType { - +export class MapDataType implements IDataType { getDataTypeId(): number { - return DataTypeRegistryService.MAPS_ID; + return DataTypeRegistryService.MAP_ID; } getInputComponent(): Type { - return MapsInputComponent; + return MapInputComponent; } - getNewDataType(): IDataType { - return new MapsDataType(); + return new MapDataType(); } - getCellComponent(): Type { return TextualCellComponent; } - getIconName(): string { return 'bi-geo-alt'; } - getDataTypeName(): string { - return 'Maps'; + return 'Map'; } } diff --git a/frontend/src/app/services/data-type-registry.service.ts b/frontend/src/app/services/data-type-registry.service.ts index 52db3768..a262bfd2 100644 --- a/frontend/src/app/services/data-type-registry.service.ts +++ b/frontend/src/app/services/data-type-registry.service.ts @@ -6,20 +6,18 @@ import {MonetaryDataType} from '../model/data-types/concrete-data-type/monetary- import {map, Observable} from 'rxjs'; import {HttpClient, HttpParams} from '@angular/common/http'; import {DataTypeDTO} from '../model/dto/table/data-type-dto'; -import {MapsDataType} from '../model/data-types/concrete-data-type/maps-data-type'; +import {MapDataType} from '../model/data-types/concrete-data-type/map-data-type'; @Injectable({ providedIn: 'root' }) export class DataTypeRegistryService { - private httpClient: HttpClient = inject(HttpClient); public static readonly TEXTUAL_ID: number = 1; public static readonly NUMERIC_ID: number = 2; public static readonly MONETARY_ID: number = 3; - public static readonly MAPS_ID: number = 4; - + public static readonly MAP_ID: number = 4; getDataType(term: string = ''): Observable { const params: HttpParams = new HttpParams({ fromObject: {term} }); @@ -31,13 +29,12 @@ export class DataTypeRegistryService { ); } - convertIntoIDataType(dataTypeId: number): IDataType { switch (dataTypeId) { case DataTypeRegistryService.TEXTUAL_ID: return new TextualDataType(); case DataTypeRegistryService.NUMERIC_ID: return new NumericDataType(); case DataTypeRegistryService.MONETARY_ID: return new MonetaryDataType(); - case DataTypeRegistryService.MAPS_ID: return new MapsDataType(); + case DataTypeRegistryService.MAP_ID: return new MapDataType(); default: throw new Error(`${dataTypeId} does not match any data type`); } } diff --git a/frontend/src/app/table-components/input-components/maps-input/maps-input.component.html b/frontend/src/app/table-components/input-components/map-input/map-input.component.html similarity index 100% rename from frontend/src/app/table-components/input-components/maps-input/maps-input.component.html rename to frontend/src/app/table-components/input-components/map-input/map-input.component.html diff --git a/frontend/src/app/table-components/input-components/maps-input/maps-input.component.ts b/frontend/src/app/table-components/input-components/map-input/map-input.component.ts similarity index 94% rename from frontend/src/app/table-components/input-components/maps-input/maps-input.component.ts rename to frontend/src/app/table-components/input-components/map-input/map-input.component.ts index c2970beb..1aebe549 100644 --- a/frontend/src/app/table-components/input-components/maps-input/maps-input.component.ts +++ b/frontend/src/app/table-components/input-components/map-input/map-input.component.ts @@ -4,11 +4,11 @@ import * as L from 'leaflet'; import {DataTypeRegistryService} from '../../../services/data-type-registry.service'; @Component({ - selector: 'tbl-maps-input', + selector: 'tbl-map-input', imports: [], - templateUrl: './maps-input.component.html', + templateUrl: './map-input.component.html', }) -export class MapsInputComponent extends BaseInputComponent implements AfterViewInit { +export class MapInputComponent extends BaseInputComponent implements AfterViewInit { private map!: L.Map; private currentMarker?: L.Marker; private latitudeInput = viewChild.required>('latitudeInput'); @@ -108,9 +108,9 @@ export class MapsInputComponent extends BaseInputComponent implements AfterViewI const cord = this.getCurrentLongitudeLatitude(); if (cord == this.longitudeLatitudeSeparator) - this.confirmInputDataType('', DataTypeRegistryService.MAPS_ID); + this.confirmInputDataType('', DataTypeRegistryService.MAP_ID); else if (cord && coordinateRegex.test(cord)) - this.confirmInputDataType(cord, DataTypeRegistryService.MAPS_ID); + this.confirmInputDataType(cord, DataTypeRegistryService.MAP_ID); else this.abortInput(); } From 1a225d38cabb3b40ab48a1b2dcb8e7f51d3bc022 Mon Sep 17 00:00:00 2001 From: Giorgio Carlino Date: Sat, 24 May 2025 15:45:15 +0200 Subject: [PATCH 04/16] fix: invio corretto della data di modifica al backen La data di modifica ora viene trasmessa correttamente quando si modifica la tabella. In precedenza, il valore trasmesso era null. --- .../bytestrick/tabula/controller/TableController.java | 2 -- .../tabula/controller/dto/table/TableCreateDTO.java | 6 ++---- .../tabula/controller/dto/table/TableCreatedDTO.java | 3 +++ .../bytestrick/tabula/controller/dto/table/TablePutDTO.java | 4 +++- .../com/github/bytestrick/tabula/service/TableService.java | 4 ++-- frontend/src/app/home/home.service.ts | 2 -- frontend/src/app/home/table-card/table-card.interface.ts | 1 - 7 files changed, 10 insertions(+), 12 deletions(-) diff --git a/backend/src/main/java/com/github/bytestrick/tabula/controller/TableController.java b/backend/src/main/java/com/github/bytestrick/tabula/controller/TableController.java index 777779cf..a996df2a 100644 --- a/backend/src/main/java/com/github/bytestrick/tabula/controller/TableController.java +++ b/backend/src/main/java/com/github/bytestrick/tabula/controller/TableController.java @@ -25,7 +25,6 @@ public class TableController { @GetMapping("after/{tableId}") public ResponseEntity> getTablesAfter(@PathVariable UUID tableId, @RequestParam int quantity) { - return ResponseEntity.ok().body(tableService.getNextTables(tableId, quantity)); } @@ -45,7 +44,6 @@ public ResponseEntity createTable(@RequestBody TableCreateDTO t @PutMapping("/{tableId}") public ResponseEntity updateTableCard(@PathVariable UUID tableId, @Valid @RequestBody TablePutDTO tablePutDTO) { - return ResponseEntity.ok().body(new InformativeResponse(tableService.updateTable(tableId, tablePutDTO))); } diff --git a/backend/src/main/java/com/github/bytestrick/tabula/controller/dto/table/TableCreateDTO.java b/backend/src/main/java/com/github/bytestrick/tabula/controller/dto/table/TableCreateDTO.java index 6a2dd09e..46c86ff9 100644 --- a/backend/src/main/java/com/github/bytestrick/tabula/controller/dto/table/TableCreateDTO.java +++ b/backend/src/main/java/com/github/bytestrick/tabula/controller/dto/table/TableCreateDTO.java @@ -9,7 +9,5 @@ public record TableCreateDTO( @NotNull @Size(min = 1, max = 50) String title, @Size(max = 500) String description, - @NotNull @PastOrPresent LocalDateTime creationDate, - LocalDateTime lastEditDate -) { -} + @NotNull @PastOrPresent LocalDateTime creationDate +) {} diff --git a/backend/src/main/java/com/github/bytestrick/tabula/controller/dto/table/TableCreatedDTO.java b/backend/src/main/java/com/github/bytestrick/tabula/controller/dto/table/TableCreatedDTO.java index d13afbaf..03825904 100644 --- a/backend/src/main/java/com/github/bytestrick/tabula/controller/dto/table/TableCreatedDTO.java +++ b/backend/src/main/java/com/github/bytestrick/tabula/controller/dto/table/TableCreatedDTO.java @@ -1,5 +1,8 @@ package com.github.bytestrick.tabula.controller.dto.table; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.PastOrPresent; + import java.time.LocalDateTime; import java.util.UUID; diff --git a/backend/src/main/java/com/github/bytestrick/tabula/controller/dto/table/TablePutDTO.java b/backend/src/main/java/com/github/bytestrick/tabula/controller/dto/table/TablePutDTO.java index 14193cf1..60f816d4 100644 --- a/backend/src/main/java/com/github/bytestrick/tabula/controller/dto/table/TablePutDTO.java +++ b/backend/src/main/java/com/github/bytestrick/tabula/controller/dto/table/TablePutDTO.java @@ -1,5 +1,7 @@ package com.github.bytestrick.tabula.controller.dto.table; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.PastOrPresent; import jakarta.validation.constraints.Size; import java.time.LocalDateTime; @@ -8,6 +10,6 @@ public record TablePutDTO( @Size(min = 1, max = 50) String title, @Size(max = 500) String description, - LocalDateTime lastEditTime + @NotNull @PastOrPresent LocalDateTime lastEditDate ) { } diff --git a/backend/src/main/java/com/github/bytestrick/tabula/service/TableService.java b/backend/src/main/java/com/github/bytestrick/tabula/service/TableService.java index d3039a1a..5c691f07 100644 --- a/backend/src/main/java/com/github/bytestrick/tabula/service/TableService.java +++ b/backend/src/main/java/com/github/bytestrick/tabula/service/TableService.java @@ -90,7 +90,7 @@ public TableCreatedDTO createNewTable(TableCreateDTO tableCreateDTO) { .title(tableCreateDTO.title()) .description(tableCreateDTO.description()) .creationDate(tableCreateDTO.creationDate()) - .lastEditDate(tableCreateDTO.lastEditDate()) + .lastEditDate(tableCreateDTO.creationDate()) // la data di modifica combacia con quella di creazione .userId(getAuthUser().getId()) .build(); @@ -109,7 +109,7 @@ public String updateTable(UUID tableId, TablePutDTO tablePutDTO) { .id(tableId) .title(tablePutDTO.title()) .description(tablePutDTO.description()) - .lastEditDate(tablePutDTO.lastEditTime()) + .lastEditDate(tablePutDTO.lastEditDate()) .build(); tableDAO.update(table); diff --git a/frontend/src/app/home/home.service.ts b/frontend/src/app/home/home.service.ts index a2c4d482..ac4f2ee8 100644 --- a/frontend/src/app/home/home.service.ts +++ b/frontend/src/app/home/home.service.ts @@ -8,9 +8,7 @@ import {TableCard} from './table-card/table-card.interface'; providedIn: 'root' }) export class HomeService { - private readonly BASE_URL: string = '/tables'; - private http = inject(HttpClient); diff --git a/frontend/src/app/home/table-card/table-card.interface.ts b/frontend/src/app/home/table-card/table-card.interface.ts index eba8dbd9..8e91dc4b 100644 --- a/frontend/src/app/home/table-card/table-card.interface.ts +++ b/frontend/src/app/home/table-card/table-card.interface.ts @@ -4,5 +4,4 @@ export interface TableCard { description: string; creationDate?: Date; lastEditDate?: Date; - tableId?: string; } From 2c98b6f32898dfd0dce0fa1be5a589ed78d08d7b Mon Sep 17 00:00:00 2001 From: Giorgio Carlino Date: Sat, 24 May 2025 16:05:31 +0200 Subject: [PATCH 05/16] fix: in precedenza, il tema tornava a quello predefinito del browser al ricaricamento della pagina. Ora viene mantenuto correttamente in base alla scelta dell'utente. --- frontend/src/app/app.component.ts | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/frontend/src/app/app.component.ts b/frontend/src/app/app.component.ts index 467ec819..0fc7cb65 100644 --- a/frontend/src/app/app.component.ts +++ b/frontend/src/app/app.component.ts @@ -17,27 +17,11 @@ import {ConfirmDialogComponent} from './confirm-dialog/confirm-dialog.component' export class AppComponent implements OnInit { private popUpManager: PopUpManagerService = inject(PopUpManagerService); - _ = inject(ThemeService); - @ViewChild('popUpContainer', { read: ViewContainerRef, static: true }) popUpContainer!: ViewContainerRef; ngOnInit() { - AppComponent.updateColorScheme(); this.popUpManager.setPopUpContainer(this.popUpContainer); } - - - /** - * Sync the app color scheme with the OS color scheme - */ - private static updateColorScheme() { - const darkColorSchemeQuery = matchMedia('(prefers-color-scheme: dark)'); - const onChange = (isDark: boolean) => { - document.documentElement.setAttribute('data-bs-theme', isDark ? 'dark' : 'light'); - }; - darkColorSchemeQuery.addEventListener('change', e => onChange(e.matches)); - onChange(darkColorSchemeQuery.matches); // at first load - } } From 8d630c66dbe7c44afbe2b487a0440093c2bca6da Mon Sep 17 00:00:00 2001 From: Giorgio Carlino Date: Sat, 24 May 2025 16:50:58 +0200 Subject: [PATCH 06/16] =?UTF-8?q?feat:=20aggiunta=20la=20visualizzazione?= =?UTF-8?q?=20del=20titolo=20della=20tabella=20sulla=20navbar=20quando=20s?= =?UTF-8?q?i=20=C3=A8=20all'interno=20della=20pagina=20tabella=20e=20aggiu?= =?UTF-8?q?nto=20il=20ritorono=20alla=20home=20quando=20si=20clicca=20sul?= =?UTF-8?q?=20pulsante=20tabula=20della=20navbar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/home/table-card/table-card.component.ts | 2 ++ frontend/src/app/navbar/navbar.component.html | 3 ++- frontend/src/app/navbar/navbar.component.ts | 16 ++++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/home/table-card/table-card.component.ts b/frontend/src/app/home/table-card/table-card.component.ts index e7016455..a0c7c8a3 100644 --- a/frontend/src/app/home/table-card/table-card.component.ts +++ b/frontend/src/app/home/table-card/table-card.component.ts @@ -15,6 +15,7 @@ import {PrettyDatePipe} from '../pretty-date.pipe'; import {Router} from '@angular/router'; import {ToastService} from '../../toast/toast.service'; import {ConfirmDialogService} from '../../confirm-dialog/confirm-dialog.service'; +import {NavbarComponent} from '../../navbar/navbar.component'; @Component({ selector: 'tbl-table-card', @@ -147,5 +148,6 @@ export class TableCardComponent implements OnDestroy { onOpenCard(): void { this.router.navigate(['/tables', this.id]) .catch(err => console.error(err)); + NavbarComponent.setTableTitle(this.title); } } diff --git a/frontend/src/app/navbar/navbar.component.html b/frontend/src/app/navbar/navbar.component.html index a2754068..7cf4b95c 100644 --- a/frontend/src/app/navbar/navbar.component.html +++ b/frontend/src/app/navbar/navbar.component.html @@ -1,7 +1,8 @@