From 8e24d0333e01773c01575b7e1f4d7dc479ff52b2 Mon Sep 17 00:00:00 2001 From: Marco Zeisler Date: Sat, 16 Jan 2021 19:23:36 +0100 Subject: [PATCH 01/13] fix update of images; improve map pane; --- .../file-uploader/file-uploader.component.ts | 6 +++-- .../component/images/images.component.html | 9 ++++--- .../app/component/images/images.component.ts | 11 +++----- .../src/app/component/map/map.component.html | 26 ++++++++++++++++--- .../src/app/component/map/map.component.ts | 24 +++++++++++++++-- 5 files changed, 57 insertions(+), 19 deletions(-) diff --git a/frontend/src/app/component/file-uploader/file-uploader.component.ts b/frontend/src/app/component/file-uploader/file-uploader.component.ts index 472fffc..3d8f231 100644 --- a/frontend/src/app/component/file-uploader/file-uploader.component.ts +++ b/frontend/src/app/component/file-uploader/file-uploader.component.ts @@ -40,12 +40,12 @@ export class FileUploaderComponent implements OnInit { if (this.filename) { this.id = this.filename; + metaDict['filename'] = this.filename; } else { this.id = this.currentFileName; + metaDict['filename'] = this.currentFileName; } - metaDict['filename'] = this.currentFileName; - if (this.mode === 'post') { if (this.longitude && this.latitude) { metaDict['longitude'] = Number.parseFloat(this.longitude); @@ -68,6 +68,8 @@ export class FileUploaderComponent implements OnInit { } } + // metaDict['name'] = this.currentFileName; + if (this.tag) { metaDict['tag'] = this.tag; } else if (this.meta && this.meta.tag) { diff --git a/frontend/src/app/component/images/images.component.html b/frontend/src/app/component/images/images.component.html index b112dd2..a19689b 100644 --- a/frontend/src/app/component/images/images.component.html +++ b/frontend/src/app/component/images/images.component.html @@ -8,8 +8,9 @@ +

{{image.name}}

@@ -43,7 +44,6 @@ - @@ -61,7 +61,7 @@ @@ -71,10 +71,13 @@
+

filename: {{imageMeta.filename}}

latitude: {{imageMeta.latitude}}

longitude: {{imageMeta.longitude}}

version: {{imageMeta.version}}

+

tag: {{imageMeta.tag}}

+

name: {{imageMeta.name}}

diff --git a/frontend/src/app/component/images/images.component.ts b/frontend/src/app/component/images/images.component.ts index 80cf592..7f4aa97 100644 --- a/frontend/src/app/component/images/images.component.ts +++ b/frontend/src/app/component/images/images.component.ts @@ -60,19 +60,14 @@ export class ImagesComponent implements OnInit, AfterViewInit { } filterOnlyNewestImageVersion() { - return this.images.filter(image => !image.previous); + return this.images.filter(image => !image.identifier.includes('_')); } getImageIndex(image: ImageMetadata) { return this.images.findIndex(img => image === img); } - getRelatedImageMeta(image: ImageMetadata, images: ImageMetadata[] = []) { - const found = this.images.find(im => im.previous === image.identifier); - if (found) { - return this.getRelatedImageMeta(found, images.concat(found)); - } else { - return images; - } + getRelatedImageMeta(image: ImageMetadata) { + return this.images.filter(im => im.identifier.includes(image.identifier) && im.identifier !== image.identifier); } } diff --git a/frontend/src/app/component/map/map.component.html b/frontend/src/app/component/map/map.component.html index acce0be..41589a7 100644 --- a/frontend/src/app/component/map/map.component.html +++ b/frontend/src/app/component/map/map.component.html @@ -5,15 +5,33 @@ [longitude]="longitude" [zoom]="2"> -

+

Latitude: {{ selectedImage.latitude }} Longitude: {{ selectedImage.longitude }} Name: {{selectedImage.name}} -

+ + + +
+ + + + +
+ +

filename: {{selectedImage.filename}}

+ + +

version: {{selectedImage.version}}

+

tag: {{selectedImage.tag}}

+ +
diff --git a/frontend/src/app/component/map/map.component.ts b/frontend/src/app/component/map/map.component.ts index 1444d62..23cbb5d 100644 --- a/frontend/src/app/component/map/map.component.ts +++ b/frontend/src/app/component/map/map.component.ts @@ -1,5 +1,6 @@ import {Component, Input, OnInit} from '@angular/core'; import {ImageMetadata} from '../../interfaces/interface'; +import {RestService} from '../../services/rest.service'; // @ts-ignore @Component({ @@ -16,7 +17,7 @@ export class MapComponent implements OnInit { latitude = 43.879078; longitude = -103.4615581; - constructor() { + constructor(private restService: RestService) { } @@ -25,6 +26,25 @@ export class MapComponent implements OnInit { } selectMarker(event) { - this.selectedImage = this.images.find(image => image.latitude === event.latitude && image.longitude === event.longitude); + console.log(event, this.images); + this.selectedImage = this.images.find(image => + image.latitude === event.latitude && image.longitude === event.longitude && !image.identifier.includes('_') + ); + return this.selectedImage; } + + getImagesForMap() { + return this.images.filter(im => !im.identifier.includes('_')); + } + + loadImage(image: ImageMetadata): void { + image.image_b64 = ''; + this.restService.getImage(image.identifier).toPromise().then(im => { + image.image_b64 = 'data:image/jpg;base64,' + im.image_data; + }).catch(err => { + console.error('loadImage', image, err); + }); + } + + } From 7207080b66dc520580bccac5f710f32a8889d399 Mon Sep 17 00:00:00 2001 From: Marco Zeisler Date: Sat, 16 Jan 2021 19:24:07 +0100 Subject: [PATCH 02/13] fix update of images; --- middleware/app_be/services/dropboxservice.py | 2 +- middleware/app_be/services/mongodbservice.py | 16 +++++++++------- middleware/app_be/views/rest_api.py | 9 ++++++--- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/middleware/app_be/services/dropboxservice.py b/middleware/app_be/services/dropboxservice.py index acbf651..7dd31c8 100644 --- a/middleware/app_be/services/dropboxservice.py +++ b/middleware/app_be/services/dropboxservice.py @@ -70,7 +70,7 @@ class DropboxService(StorageServiceInterface): return file_bytes @staticmethod - def move_file(identifier_from: str, identifier_to: str, file: bytes) -> bool: + def move_file(identifier_from: str, identifier_to: str, file: bytes = None) -> bool: """Move/Rename a file on the dropbox storage. :param identifier_from: Location of the file to be moved diff --git a/middleware/app_be/services/mongodbservice.py b/middleware/app_be/services/mongodbservice.py index 8263d1b..fc643e4 100644 --- a/middleware/app_be/services/mongodbservice.py +++ b/middleware/app_be/services/mongodbservice.py @@ -74,20 +74,22 @@ class MongoDBService: old = {"identifier": identifier} # Query for old version - metadata_orig = MongoDBService.getSingle(identifier) - metadata_new = metadata_orig - metadata_new['previous'] = identifier + '_' + str(metadata_orig['version']) - identifier_changed = identifier + '_' + str(metadata_orig['version']) # Set identifier to include version - metadata_new['version'] = str(int(metadata_new['version']) + 1) # Increment version by one + existing_meta_data_copy = MongoDBService.getSingle(identifier) + id_for_previous = identifier + '_' + str(meta['version']) + existing_meta_data_copy['previous'] = id_for_previous + identifier_changed = id_for_previous # Set identifier to include version - metadata_new.update(meta) + del meta['filename'] + existing_meta_data_copy.update(meta) + + existing_meta_data_copy['version'] = meta['version'] + 1 # Increment version by one print("MongoDBService: identifier_changed: ", identifier_changed) col.update_one(old, {"$set": {"identifier": identifier_changed, "filename": identifier_changed + '.jpg'}}) print("MongoDBService: Old object is ", col.find_one({"identifier": identifier_changed})) - MongoDBService.createSingle(metadata_new, identifier, decoded_image) + MongoDBService.createSingle(existing_meta_data_copy, identifier, decoded_image) print("MongoDBService: New object is ", col.find_one({"identifier": identifier})) return True diff --git a/middleware/app_be/views/rest_api.py b/middleware/app_be/views/rest_api.py index c18dff0..6f7bdae 100644 --- a/middleware/app_be/views/rest_api.py +++ b/middleware/app_be/views/rest_api.py @@ -210,7 +210,6 @@ class ImageEndpoint: def image_api_update(request, identifier): logger.debug('Image UPDATE single call: {}'.format(request)) - try: payload = json.loads(request.body) except json.decoder.JSONDecodeError: @@ -222,7 +221,7 @@ class ImageEndpoint: 'Error': str(e)}, status=500, safe=False) b64encoded_image = payload['image_data'] - identifier = payload['id'] + # identifier = identifier metadata = payload['metadata'] filename = payload['metadata']['filename'] @@ -233,14 +232,18 @@ class ImageEndpoint: 'id': identifier}, status=404, safe=False) metadata['version'] = mongodb_metadata['version'] + filename = mongodb_metadata['filename'] decoded_image = WrapperService.unwrap_file(b64encoded_image) MongoDBService.updateSingle(identifier, decoded_image, metadata) + # TODO TOBIAS get old image for MinIO + old_bytes = None + for service in ImageEndpoint.storageServiceList: orig_new_name = identifier + '_' + str(metadata['version']) + '.jpg' - if not service.move_file(identifier, orig_new_name, decoded_image): + if not service.move_file(identifier, orig_new_name, old_bytes): print("Could not move file from {} to {}".format(identifier, orig_new_name)) if not service.create_file(filename, decoded_image): print("Could not save updated image to " + service.name) From ab5d9184be3b18413be9f804277ae690c1e0e9a7 Mon Sep 17 00:00:00 2001 From: Martin Weick Date: Mon, 18 Jan 2021 15:21:41 +0100 Subject: [PATCH 03/13] #10 add part of test script --- iotclient/iot_client.py | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/iotclient/iot_client.py b/iotclient/iot_client.py index cb3788b..a94faad 100644 --- a/iotclient/iot_client.py +++ b/iotclient/iot_client.py @@ -4,7 +4,7 @@ import requests import json import time from datetime import datetime - +import sys, getopt def build_post_payload(identifier, metadata_payload, file_payload): return { @@ -216,14 +216,42 @@ def print_cursor(): print('Cursor on ' + str(index) + " out of " + str(len(metadata)) + " - " + metadata[index]['filename']) +testCommands=[] +testscriptData=[] + +def test_script(argv): + try: + opts, args=getopt.getopt(argv,"t") + except getopt.GetoptError: + print("Error by starting test script") + sys.exit(2) + for opt, arg in opts: + if opt == '-t': + testscriptData.append(True) + testCommands.append("deleteall") + #testCommands.append("fetchall") + testCommands.append("trigger") + testCommands.append("trigger") + testCommands.append("fetchall") + testCommands.append("exit") + testscriptData.append(len(testCommands)) + else: + testscriptData.append(False) + + + # main input loop command = "dummy" - - +test_script(sys.argv[1:]) +i=0 while (command.lower() not in ["exit", "quit", "end"]): try: - command = input("Please enter command: ") + if testscriptData[0] and i < testscriptData[1]: + command=testCommands[i] + i+=1 + else: + command = input("Please enter command: ") except: print() print("Error while reading keyboard input") From d500518d8fd585d1e7404bb3ab6731ad027ed437 Mon Sep 17 00:00:00 2001 From: Tobias Eidelpes Date: Mon, 18 Jan 2021 17:26:24 +0100 Subject: [PATCH 04/13] Fix bug where old image was not saved on AWS --- middleware/app_be/services/dropboxservice.py | 2 +- middleware/app_be/services/minioservice.py | 4 +++- middleware/app_be/views/rest_api.py | 5 +---- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/middleware/app_be/services/dropboxservice.py b/middleware/app_be/services/dropboxservice.py index 7dd31c8..3f61667 100644 --- a/middleware/app_be/services/dropboxservice.py +++ b/middleware/app_be/services/dropboxservice.py @@ -70,7 +70,7 @@ class DropboxService(StorageServiceInterface): return file_bytes @staticmethod - def move_file(identifier_from: str, identifier_to: str, file: bytes = None) -> bool: + def move_file(identifier_from: str, identifier_to: str) -> bool: """Move/Rename a file on the dropbox storage. :param identifier_from: Location of the file to be moved diff --git a/middleware/app_be/services/minioservice.py b/middleware/app_be/services/minioservice.py index b7afc20..3b593e7 100644 --- a/middleware/app_be/services/minioservice.py +++ b/middleware/app_be/services/minioservice.py @@ -66,7 +66,7 @@ class MinioService(StorageServiceInterface): return True @staticmethod - def move_file(identifier_from: str, identifier_to: str, file: bytes) -> bool: + def move_file(identifier_from: str, identifier_to: str) -> bool: """Move/Rename a file on the S3 storage. Consists of a PUT method (copying the object) and a delete method. @@ -79,6 +79,8 @@ class MinioService(StorageServiceInterface): filename_from = identifier_from + '.jpg' filename_to = identifier_to + file = MinioService.read_file(filename_from) + if not MinioService.delete_file(filename_from): print("MinioService: Updating (delete) file {} failed".format(filename_from)) return False diff --git a/middleware/app_be/views/rest_api.py b/middleware/app_be/views/rest_api.py index 6f7bdae..d9966d5 100644 --- a/middleware/app_be/views/rest_api.py +++ b/middleware/app_be/views/rest_api.py @@ -238,12 +238,9 @@ class ImageEndpoint: MongoDBService.updateSingle(identifier, decoded_image, metadata) - # TODO TOBIAS get old image for MinIO - old_bytes = None - for service in ImageEndpoint.storageServiceList: orig_new_name = identifier + '_' + str(metadata['version']) + '.jpg' - if not service.move_file(identifier, orig_new_name, old_bytes): + if not service.move_file(identifier, orig_new_name): print("Could not move file from {} to {}".format(identifier, orig_new_name)) if not service.create_file(filename, decoded_image): print("Could not save updated image to " + service.name) From 3f6cfe18a2e864bb9e4188e865f48990948555a4 Mon Sep 17 00:00:00 2001 From: Marco Zeisler Date: Mon, 18 Jan 2021 20:07:44 +0100 Subject: [PATCH 05/13] markers shall NOT be draggable --- frontend/src/app/component/map/map.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/component/map/map.component.html b/frontend/src/app/component/map/map.component.html index 41589a7..5825cf0 100644 --- a/frontend/src/app/component/map/map.component.html +++ b/frontend/src/app/component/map/map.component.html @@ -9,7 +9,7 @@ [latitude]="image.latitude" [longitude]="image.longitude" [opacity]="1" - [markerDraggable]="true" + [markerDraggable]="false" (markerClick)="loadImage(selectMarker($event))" > From 6878c96f76b877501a886fa3e8ce00ebd081a68f Mon Sep 17 00:00:00 2001 From: Martin Weick Date: Mon, 18 Jan 2021 20:34:13 +0100 Subject: [PATCH 06/13] #3 bug fix list error --- iotclient/iot_client.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/iotclient/iot_client.py b/iotclient/iot_client.py index a6a9035..2c00154 100644 --- a/iotclient/iot_client.py +++ b/iotclient/iot_client.py @@ -238,12 +238,15 @@ testscriptData=[] def test_script(argv): try: + testscriptData.append(False) + testscriptData.append(0) opts, args=getopt.getopt(argv,"t") except getopt.GetoptError: print("Error by starting test script") sys.exit(2) for opt, arg in opts: if opt == '-t': + testscriptData.clear() testscriptData.append(True) testCommands.append("deleteall") #testCommands.append("fetchall") @@ -254,7 +257,7 @@ def test_script(argv): testscriptData.append(len(testCommands)) else: testscriptData.append(False) - + testscriptData.append(0) # main input loop @@ -269,8 +272,8 @@ while (command.lower() not in ["exit", "quit", "end"]): i+=1 else: command = input("Please enter command: ") - except: - print() + except Exception as ex: + print(ex) print("Error while reading keyboard input") break command_split = command.split(" ") From d770f1e0922f24dda792f9ee2e1cedc10f9c858a Mon Sep 17 00:00:00 2001 From: Marco Zeisler Date: Mon, 18 Jan 2021 20:55:17 +0100 Subject: [PATCH 07/13] add api stub for https://hyde.infosys.tuwien.ac.at/aic20/g4t2/-/issues/16; --- middleware/app_be/urls.py | 1 + middleware/app_be/views/rest_api.py | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/middleware/app_be/urls.py b/middleware/app_be/urls.py index f4d73de..19e2d07 100644 --- a/middleware/app_be/urls.py +++ b/middleware/app_be/urls.py @@ -24,6 +24,7 @@ urlpatterns = [ path('admin/', admin.site.urls), url(r'^image/get/all$', ImageEndpoint.image_api_get_all), url(r'^image/get/(?P[\w-]+)$', ImageEndpoint.image_api_get_single), + url(r'^image/status/(?P[\w-]+)$', ImageEndpoint.image_api_get_status), url(r'^image/get/(?P[\w-]+)/version/(?P[\w-]+)$', ImageEndpoint.image_api_get_single_version), url(r'^image/delete/all$', ImageEndpoint.image_api_delete_all), url(r'^image/delete/(?P[\w-]+)$', ImageEndpoint.image_api_delete), diff --git a/middleware/app_be/views/rest_api.py b/middleware/app_be/views/rest_api.py index d9966d5..0304d99 100644 --- a/middleware/app_be/views/rest_api.py +++ b/middleware/app_be/views/rest_api.py @@ -48,6 +48,12 @@ class ImageEndpoint: logger.debug('Image GET single call: {}'.format(request)) return ImageEndpoint.get_image(identifier) + @staticmethod + @api_view(['GET']) + def image_api_get_status(request, identifier): + # TODO MARTIN + return JsonResponse({'valid': True, 'available': True}) + @staticmethod def get_image(identifier): From 059a5a7be580cc406d097a55c4cecdf6570af502 Mon Sep 17 00:00:00 2001 From: Martin Schett Date: Mon, 18 Jan 2021 21:06:47 +0100 Subject: [PATCH 08/13] Implemented status request --- middleware/app_be/views/rest_api.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/middleware/app_be/views/rest_api.py b/middleware/app_be/views/rest_api.py index 0304d99..791e08d 100644 --- a/middleware/app_be/views/rest_api.py +++ b/middleware/app_be/views/rest_api.py @@ -51,7 +51,26 @@ class ImageEndpoint: @staticmethod @api_view(['GET']) def image_api_get_status(request, identifier): - # TODO MARTIN + # get metadata from MongoDB + metadata = MongoDBService.getSingle(identifier) + if not metadata: + return JsonResponse({'valid': False, 'available': False}) + + # get stored SHA512 hash + stored_hash = metadata.get('sha512', '') + no_image = True + + for service in ImageEndpoint.storageServiceList: + service_image_bytes = service.read_file(metadata['filename']) + if service_image_bytes is not None: + no_image = False + actual_service_hash = create_sha512(service_image_bytes) + if stored_hash != actual_service_hash: + return JsonResponse({'valid': False, 'available': True}) + + if no_image: + JsonResponse({'valid': False, 'available': False}) + return JsonResponse({'valid': True, 'available': True}) @staticmethod From 93539dc6c52f44ef3e503cd8d741ea8a0eece38f Mon Sep 17 00:00:00 2001 From: Marco Zeisler Date: Mon, 18 Jan 2021 21:59:49 +0100 Subject: [PATCH 09/13] use metadata file; properly update available images after update; --- .../file-uploader/file-uploader.component.ts | 28 ++++++++++++++----- .../component/images/images.component.html | 23 +++++++++------ .../app/component/images/images.component.ts | 3 ++ frontend/tsconfig.json | 4 ++- 4 files changed, 41 insertions(+), 17 deletions(-) diff --git a/frontend/src/app/component/file-uploader/file-uploader.component.ts b/frontend/src/app/component/file-uploader/file-uploader.component.ts index 3d8f231..d726777 100644 --- a/frontend/src/app/component/file-uploader/file-uploader.component.ts +++ b/frontend/src/app/component/file-uploader/file-uploader.component.ts @@ -3,6 +3,8 @@ import {RestService} from '../../services/rest.service'; import {NGXLogger} from 'ngx-logger'; import {MatSnackBar} from '@angular/material/snack-bar'; import {ImageMetadata} from '../../interfaces/interface'; +// @ts-ignore +import metaFile from '../../../../../iotclient/metadata_full.json'; @Component({ selector: 'app-file-uploader', @@ -47,21 +49,21 @@ export class FileUploaderComponent implements OnInit { } if (this.mode === 'post') { - if (this.longitude && this.latitude) { - metaDict['longitude'] = Number.parseFloat(this.longitude); - metaDict['latitude'] = Number.parseFloat(this.latitude); - } else if (this.meta && this.meta.longitude && this.meta.latitude) { + if (this.meta && this.meta.longitude && this.meta.latitude) { metaDict['longitude'] = this.meta.longitude; metaDict['latitude'] = this.meta.latitude; + } else if (this.longitude && this.latitude) { + metaDict['longitude'] = Number.parseFloat(this.longitude); + metaDict['latitude'] = Number.parseFloat(this.latitude); } else { throw new Error('Long/Lat necessary if new file!'); } } - if (this.name) { - metaDict['name'] = this.name; - } else if (this.meta && this.meta.name) { + if (this.meta && this.meta.name) { metaDict['name'] = this.meta.name; + } else if (this.name) { + metaDict['name'] = this.name; } else { if (this.mode === 'post') { throw new Error('Name necessary if new file'); @@ -97,6 +99,7 @@ export class FileUploaderComponent implements OnInit { } ngOnInit(): void { + this.logger.debug('meta', metaFile); } onFileSelected(fileEvent: Event) { @@ -111,6 +114,12 @@ export class FileUploaderComponent implements OnInit { this.file = e.target.result; this.currentFileName = file.name; this.logger.debug('Selected file', this.currentFileName, this.file); + const metaData = this.loadMetaForFile(); + if (metaData) { + this.name = metaData.name; + this.longitude = metaData.longitude; + this.latitude = metaData.latitude; + } }; reader.readAsArrayBuffer(file); @@ -152,4 +161,9 @@ export class FileUploaderComponent implements OnInit { } } + private loadMetaForFile() { + const metaData = metaFile.find(m => m.filename === this.currentFileName); + this.logger.debug('Found corresponding meta', this.currentFileName, metaData); + return metaData; + } } diff --git a/frontend/src/app/component/images/images.component.html b/frontend/src/app/component/images/images.component.html index a19689b..6cc6739 100644 --- a/frontend/src/app/component/images/images.component.html +++ b/frontend/src/app/component/images/images.component.html @@ -7,9 +7,12 @@ + {{openImageExpansion}} {{i}}

Metadata:

+

version: {{image.version}}

filename: {{image.filename}}

latitude: {{image.latitude}}

longitude: {{image.longitude}}

-

version: {{image.version}}

@@ -61,23 +64,24 @@ + - + Previous version meta
+

version: {{imageMeta.version}}

+

name: {{imageMeta.name}}

+

tag: {{imageMeta.tag}}

filename: {{imageMeta.filename}}

latitude: {{imageMeta.latitude}}

longitude: {{imageMeta.longitude}}

-

version: {{imageMeta.version}}

-

tag: {{imageMeta.tag}}

-

name: {{imageMeta.name}}

@@ -90,8 +94,9 @@ [length]="filterOnlyNewestImageVersion().length" [pageSize]="pageSizeOptions[0]" [pageSizeOptions]="pageSizeOptions" - (page)="lastPageEvent = $event" + (page)="lastPageEvent = $event; openImageExpansion = ALL_CLOSED_DEFAULT" showFirstLastButtons + hidePageSize > diff --git a/frontend/src/app/component/images/images.component.ts b/frontend/src/app/component/images/images.component.ts index 7f4aa97..f738930 100644 --- a/frontend/src/app/component/images/images.component.ts +++ b/frontend/src/app/component/images/images.component.ts @@ -20,6 +20,9 @@ export class ImagesComponent implements OnInit, AfterViewInit { pageSizeOptions: number[] = [5, 10, 25, 100]; lastPageEvent: PageEvent; + openImageExpansion = [[true, true], [false, false], [false, false], [false, false], [false, false]]; + ALL_CLOSED_DEFAULT: [[false, false], [false, false], [false, false], [false, false], [false, false]]; + constructor( public restService: RestService, private logger: NGXLogger, diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 22734b3..e32011e 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -17,7 +17,9 @@ "es2017", "dom" ], - "allowJs": true + "allowJs": true, + "resolveJsonModule": true, + "esModuleInterop": true } } From df5e3d5ed2a1e0d9c4ffe38a2650bf1a91bef5c1 Mon Sep 17 00:00:00 2001 From: Marco Zeisler Date: Mon, 18 Jan 2021 22:53:32 +0100 Subject: [PATCH 10/13] keep always the same order of images; remember if an expansion panel was opened or not; --- .../file-uploader/file-uploader.component.ts | 11 +++- .../component/images/images.component.html | 62 ++++++++++++++----- .../app/component/images/images.component.ts | 34 +++++++--- .../component/landing/landing.component.ts | 14 ++++- 4 files changed, 92 insertions(+), 29 deletions(-) diff --git a/frontend/src/app/component/file-uploader/file-uploader.component.ts b/frontend/src/app/component/file-uploader/file-uploader.component.ts index d726777..1dbf8ba 100644 --- a/frontend/src/app/component/file-uploader/file-uploader.component.ts +++ b/frontend/src/app/component/file-uploader/file-uploader.component.ts @@ -117,8 +117,8 @@ export class FileUploaderComponent implements OnInit { const metaData = this.loadMetaForFile(); if (metaData) { this.name = metaData.name; - this.longitude = metaData.longitude; - this.latitude = metaData.latitude; + this.longitude = metaData.longitude + ''; + this.latitude = metaData.latitude + ''; } }; @@ -162,7 +162,12 @@ export class FileUploaderComponent implements OnInit { } private loadMetaForFile() { - const metaData = metaFile.find(m => m.filename === this.currentFileName); + const metaData = (metaFile as { + filename: string, + latitude: number; + longitude: number; + name: string; + }[]).find(m => m.filename === this.currentFileName); this.logger.debug('Found corresponding meta', this.currentFileName, metaData); return metaData; } diff --git a/frontend/src/app/component/images/images.component.html b/frontend/src/app/component/images/images.component.html index 6cc6739..01ea103 100644 --- a/frontend/src/app/component/images/images.component.html +++ b/frontend/src/app/component/images/images.component.html @@ -5,15 +5,13 @@ Date File valid - - {{openImageExpansion}} {{i}} - +

{{image.name}}

@@ -66,23 +64,55 @@ [meta]=image (reload)="reload.emit()" > - + - - + + - Previous version meta + Previous versions -
- -

version: {{imageMeta.version}}

-

name: {{imageMeta.name}}

-

tag: {{imageMeta.tag}}

-

filename: {{imageMeta.filename}}

-

latitude: {{imageMeta.latitude}}

-

longitude: {{imageMeta.longitude}}

-
+ + + + + + + + + + +

version: {{relImage.version ? relImage.version : 0}}

+
+ + + + +
+ + + + +
+
+ + +
+

filename: {{relImage.filename}}

+

latitude: {{relImage.latitude}}

+

longitude: {{relImage.longitude}}

+
+
+
+
+
diff --git a/frontend/src/app/component/images/images.component.ts b/frontend/src/app/component/images/images.component.ts index f738930..5688178 100644 --- a/frontend/src/app/component/images/images.component.ts +++ b/frontend/src/app/component/images/images.component.ts @@ -20,8 +20,8 @@ export class ImagesComponent implements OnInit, AfterViewInit { pageSizeOptions: number[] = [5, 10, 25, 100]; lastPageEvent: PageEvent; - openImageExpansion = [[true, true], [false, false], [false, false], [false, false], [false, false]]; - ALL_CLOSED_DEFAULT: [[false, false], [false, false], [false, false], [false, false], [false, false]]; + ALL_CLOSED_DEFAULT = [...Array(5)].map(() => this.getDefaultBoolDict(false)); + openImageExpansion = this.ALL_CLOSED_DEFAULT; constructor( public restService: RestService, @@ -30,6 +30,12 @@ export class ImagesComponent implements OnInit, AfterViewInit { ) { } + private getDefaultBoolDict(value: boolean) { + return new Proxy({}, { + get: (target, name) => name in target ? target[name] : value + }); + } + ngOnInit(): void { this.lastPageEvent = {pageIndex: 0, pageSize: this.pageSizeOptions[0], length: this.images.length}; } @@ -53,13 +59,23 @@ export class ImagesComponent implements OnInit, AfterViewInit { }).catch(err => this.logger.error(err)); } - loadImage(i: number, id: string): void { - this.restService.getImage(id).toPromise().then(image => { - this.images[i].image_b64 = 'data:image/jpg;base64,' + image.image_data; - this.logger.debug('image_b64', i, id, this.images[i].image_b64); - }).catch(err => { - this.logger.error('loadImage', i, id, err); - }); + loadImage(i: number, id: string, relImage?: ImageMetadata): void { + if (!relImage) { + this.restService.getImage(id).toPromise().then(image => { + this.images[i].image_b64 = 'data:image/jpg;base64,' + image.image_data; + this.logger.debug('image_b64', i, id, this.images[i].image_b64); + }).catch(err => { + this.logger.error('loadImage', i, id, err); + }); + } else { + this.restService.getImage(id).toPromise().then(image => { + relImage.image_b64 = 'data:image/jpg;base64,' + image.image_data; + this.logger.debug('image_b64', i, id, relImage.image_b64); + }).catch(err => { + this.logger.error('loadImage', i, id, err); + }); + } + } filterOnlyNewestImageVersion() { diff --git a/frontend/src/app/component/landing/landing.component.ts b/frontend/src/app/component/landing/landing.component.ts index 6f3ac44..f8a9b81 100644 --- a/frontend/src/app/component/landing/landing.component.ts +++ b/frontend/src/app/component/landing/landing.component.ts @@ -28,7 +28,19 @@ export class LandingComponent implements OnInit { } loadImages(): void { - this.restService.getAllImages().toPromise().then(images => this.images = images).catch(err => this.logger.error(err)); + this.restService.getAllImages().toPromise().then(images => + this.images = images.sort((im1, im2) => { + if (im1.name > im2.name) { + return 1; + } + + if (im1.name < im2.name) { + return -1; + } + + return 0; + }) + ).catch(err => this.logger.error(err)); } From 55ce77ae358e7ae3844781e5ce678a0c6f82f523 Mon Sep 17 00:00:00 2001 From: Marco Zeisler Date: Mon, 18 Jan 2021 23:28:52 +0100 Subject: [PATCH 11/13] implemented validity check; --- .../component/images/images.component.html | 16 +++++++----- .../app/component/images/images.component.ts | 25 +++++++++++++++++++ frontend/src/app/interfaces/interface.ts | 7 ++++++ frontend/src/app/services/rest.service.ts | 12 ++++++--- 4 files changed, 51 insertions(+), 9 deletions(-) diff --git a/frontend/src/app/component/images/images.component.html b/frontend/src/app/component/images/images.component.html index 01ea103..4e0ef2f 100644 --- a/frontend/src/app/component/images/images.component.html +++ b/frontend/src/app/component/images/images.component.html @@ -3,7 +3,7 @@
Name Date - File valid + File valid | available
{{image.name}}

{{image.datetime}}

-

- ✓ | X (TO BE DONE) +

+ {{image.valid ? '✓' : 'X' }} | {{image.available ? '✓' : 'X' }}

+ +

...

+