From abae03eec34f213804710317307cb521f19e6f9b Mon Sep 17 00:00:00 2001 From: Loris Sauter Date: Wed, 29 May 2024 08:25:52 +0200 Subject: [PATCH 1/3] Fixed wrong version number --- backend/src/main/kotlin/dev/dres/DRES.kt | 2 +- doc/oas-client.json | 4 ++-- doc/oas.json | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/src/main/kotlin/dev/dres/DRES.kt b/backend/src/main/kotlin/dev/dres/DRES.kt index e488bfb8..6cbfa0f5 100644 --- a/backend/src/main/kotlin/dev/dres/DRES.kt +++ b/backend/src/main/kotlin/dev/dres/DRES.kt @@ -42,7 +42,7 @@ import kotlin.system.exitProcess */ object DRES { /** Version of DRES. */ - const val VERSION = "2.0.4" + const val VERSION = "2.0.3" /** Application root; should be relative to JAR file or classes path. */ val APPLICATION_ROOT: Path = diff --git a/doc/oas-client.json b/doc/oas-client.json index f62c5622..80dfdbe2 100644 --- a/doc/oas-client.json +++ b/doc/oas-client.json @@ -2,8 +2,8 @@ "openapi" : "3.0.3", "info" : { "title" : "DRES Client API", - "version" : "2.0.4", - "description" : "Client API for DRES (Distributed Retrieval Evaluation Server), Version 2.0.4" + "version" : "2.0.3", + "description" : "Client API for DRES (Distributed Retrieval Evaluation Server), Version 2.0.3" }, "paths" : { "/api/v2/client/evaluation/currentTask/{evaluationId}" : { diff --git a/doc/oas.json b/doc/oas.json index f35b8b4a..c7394462 100644 --- a/doc/oas.json +++ b/doc/oas.json @@ -2,8 +2,8 @@ "openapi" : "3.0.3", "info" : { "title" : "DRES API", - "version" : "2.0.4", - "description" : "API for DRES (Distributed Retrieval Evaluation Server), Version 2.0.4", + "version" : "2.0.3", + "description" : "API for DRES (Distributed Retrieval Evaluation Server), Version 2.0.3", "contact" : { "name" : "The DRES Dev Team", "url" : "https://dres.dev" From f4fc5e68cbe979d3932f755684f2606f8508d7b4 Mon Sep 17 00:00:00 2001 From: Loris Sauter Date: Wed, 29 May 2024 10:37:31 +0200 Subject: [PATCH 2/3] Updated javalin patch version --- gradle.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index 4052de18..c8aa7b81 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,9 +12,9 @@ version_clikt=4.1.0 version_fastutil=8.5.12 version_fuel=2.3.1 version_jaffree=2022.06.03 -version_javalin=6.1.3 -version_javalinopenapi=6.1.3 -version_javalinssl=6.1.3 +version_javalin=6.1.6 +version_javalinopenapi=6.1.6 +version_javalinssl=6.1.6 version_jline3=3.22.0 version_junit=5.9.1 version_kotlin=1.8.22 From 474fecf9792528564592db7e5d96eb6b7dcc7e78 Mon Sep 17 00:00:00 2001 From: Loris Sauter Date: Sat, 1 Jun 2024 20:19:12 +0200 Subject: [PATCH 3/3] Re-added batch-add for targets --- .../competition-form.builder.ts | 16 +++-- .../batch-add-target-dialog.component.html | 21 ++++++ .../batch-add-target-dialog.component.scss | 0 .../batch-add-target-dialog.component.ts | 52 +++++++++++++++ .../task-template-editor.component.html | 3 - .../task-template-editor.component.ts | 66 +++++++++++-------- .../template-builder-components.module.ts | 4 +- 7 files changed, 122 insertions(+), 40 deletions(-) create mode 100644 frontend/src/app/template/template-builder/components/batch-add-target-dialog/batch-add-target-dialog.component.html create mode 100644 frontend/src/app/template/template-builder/components/batch-add-target-dialog/batch-add-target-dialog.component.scss create mode 100644 frontend/src/app/template/template-builder/components/batch-add-target-dialog/batch-add-target-dialog.component.ts diff --git a/frontend/src/app/competition/competition-builder/competition-builder-task-dialog/competition-form.builder.ts b/frontend/src/app/competition/competition-builder/competition-builder-task-dialog/competition-form.builder.ts index 795ace5a..9a1c49ba 100644 --- a/frontend/src/app/competition/competition-builder/competition-builder-task-dialog/competition-form.builder.ts +++ b/frontend/src/app/competition/competition-builder/competition-builder-task-dialog/competition-form.builder.ts @@ -124,18 +124,19 @@ export class CompetitionFormBuilder { /** * Adds a new {@link FormGroup} for the given {@link TaskType.ComponentsEnum}. * - * @param type The {@link TaskType.TargetTypeEnum} to add a {@link FormGroup} for. + * @param type The {@link ApiTargetOption} to add a {@link FormGroup} for. + * @param initialise The {@link ApiTarget} to add */ - public addTargetForm(type: ApiTargetOption) { + public addTargetForm(type: ApiTargetOption, initialise?: ApiTarget) { const array = this.form.get('target') as UntypedFormArray; const newIndex = array.length; switch (type) { case "SINGLE_MEDIA_ITEM": - const f = this.singleMediaItemTargetForm(newIndex); + const f = this.singleMediaItemTargetForm(newIndex, initialise); array.push(f) return f; case "SINGLE_MEDIA_SEGMENT": - const targetForm = this.singleMediaSegmentTargetForm(newIndex); + const targetForm = this.singleMediaSegmentTargetForm(newIndex, initialise); array.push(targetForm); return targetForm; case "JUDGEMENT": @@ -143,7 +144,7 @@ export class CompetitionFormBuilder { console.warn("Judgement and Vote shouldn't have access to add targets. This is a programmer's error.") break; case 'TEXT': - const form = this.singleTextTargetForm(); + const form = this.singleTextTargetForm(initialise); array.push(form); return form; default: @@ -372,8 +373,9 @@ export class CompetitionFormBuilder { ) ); + /* Load media item from API. */ - if (initialize?.target && this.data?.collectionId) { + if (initialize?.target && this.form.get('mediaCollection')) { this.collectionService .getApiV2MediaItemByMediaItemId(initialize?.target) .pipe(first()) @@ -407,7 +409,7 @@ export class CompetitionFormBuilder { ); /* Load media item from API. */ - if (initialize?.target && this.data.collectionId) { + if (initialize?.target && this.form.get('mediaCollection')) { this.collectionService .getApiV2MediaItemByMediaItemId(initialize.target) .pipe(first()) diff --git a/frontend/src/app/template/template-builder/components/batch-add-target-dialog/batch-add-target-dialog.component.html b/frontend/src/app/template/template-builder/components/batch-add-target-dialog/batch-add-target-dialog.component.html new file mode 100644 index 00000000..e23f0c5e --- /dev/null +++ b/frontend/src/app/template/template-builder/components/batch-add-target-dialog/batch-add-target-dialog.component.html @@ -0,0 +1,21 @@ +

Batch Add Targets

+
+

+ Batch-add targets by file or by your input, each on its own line. + Please not that the target name must be exactly matching the media item's name. +

+
+ File + + +
+ + Targets + + +
+
+ + +
diff --git a/frontend/src/app/template/template-builder/components/batch-add-target-dialog/batch-add-target-dialog.component.scss b/frontend/src/app/template/template-builder/components/batch-add-target-dialog/batch-add-target-dialog.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/frontend/src/app/template/template-builder/components/batch-add-target-dialog/batch-add-target-dialog.component.ts b/frontend/src/app/template/template-builder/components/batch-add-target-dialog/batch-add-target-dialog.component.ts new file mode 100644 index 00000000..766eb107 --- /dev/null +++ b/frontend/src/app/template/template-builder/components/batch-add-target-dialog/batch-add-target-dialog.component.ts @@ -0,0 +1,52 @@ +import { Component, ElementRef, Inject, ViewChild } from "@angular/core"; +import { MAT_DIALOG_DATA, MatDialogRef } from "@angular/material/dialog"; +import { ApiMediaItem, CollectionService } from "../../../../../../openapi"; + +export interface BatchAddTargetDialogData{ + collectionId: string; +} + +@Component({ + selector: 'app-batch-add-target-dialog', + templateUrl: './batch-add-target-dialog.component.html', + styleUrls: ['./batch-add-target-dialog.component.scss'] +}) +export class BatchAddTargetDialogComponent { + + @ViewChild('targetArea') textArea: ElementRef + + private targets: string[] = []; + + private failedNames: string[] = []; + + constructor( + private dialogRef: MatDialogRef, + private mediaService: CollectionService, + @Inject(MAT_DIALOG_DATA) private data: BatchAddTargetDialogData + ){ + + } + + processUpload(event){ + const file = event.target.files[0]; + const reader = new FileReader(); + reader.readAsText(file); + reader.onload = () =>{ + const text = (reader.result as string) + this.textArea.nativeElement.value = text; + } + } + + processInput(event){ + + } + + close(){ + this.dialogRef.close(null) + } + + save(){ + this.dialogRef.close(this.textArea.nativeElement.value?.split('\n')) + } + +} diff --git a/frontend/src/app/template/template-builder/components/task-template-editor/task-template-editor.component.html b/frontend/src/app/template/template-builder/components/task-template-editor/task-template-editor.component.html index c8199b74..13fd8c69 100644 --- a/frontend/src/app/template/template-builder/components/task-template-editor/task-template-editor.component.html +++ b/frontend/src/app/template/template-builder/components/task-template-editor/task-template-editor.component.html @@ -87,8 +87,6 @@

--> -

; - const dialogRef = this.dialog.open(AdvancedBuilderDialogComponent, config); + width: '400px' + } as MatDialogConfig; + const dialogRef = this.dialog.open(BatchAddTargetDialogComponent, config); dialogRef .afterClosed() .pipe(filter((r) => r != null)) .subscribe((r: Array) => { - this.formBuilder.removeTargetForm(0); - const mediaCollectionId = this.formBuilder.form.get('mediaCollection').value; - this.collectionService.postApiV2CollectionByCollectionIdResolve(mediaCollectionId, r).subscribe((items) => { - items.forEach((item) => { - const form = this.formBuilder.addTargetForm("SINGLE_MEDIA_ITEM"); - console.log(`Adding new mediaItem as target ${mediaCollectionId}/${item.name}`); - form.get('mediaItem').setValue(item); - }); - }); - /*r.forEach((name, idx) => { - const form = this.builder.addTargetForm(ConfiguredOptionTargetOption.OptionEnum.MULTIPLE_MEDIA_ITEMS); - console.log(`${mediaCollectionId} ? ${name}`); - const nameNoExt = name.substring(0, name.lastIndexOf('.')); - this.collectionService.getApiV1CollectionWithCollectionidWithStartswith(mediaCollectionId, nameNoExt) - .subscribe(item => { - console.log(`Added ${item[0]}`); - form.get('mediaItem').setValue(item[0]); - } - ); - });*/ + let targets : ApiTarget[] + switch(this.taskType.targetOption){ + case "SINGLE_MEDIA_ITEM": + case "SINGLE_MEDIA_SEGMENT": + const obs = r.map(it =>{ + return this.collectionService.getApiV2CollectionByCollectionIdByStartsWith(this.form.get('mediaCollection').value, it.trim()) + }); + forkJoin(obs).subscribe(itemsList => { + itemsList.forEach(it => { + if(it.length > 0){ + const type = this.taskType.targetOption === "SINGLE_MEDIA_ITEM" ? ApiTargetType.MEDIA_ITEM : ApiTargetType.MEDIA_ITEM_TEMPORAL_RANGE; + this.formBuilder.addTargetForm(this.taskType.targetOption, {type: type, target: it[0].mediaItemId} as ApiTarget) + } + }) + }) + break; + case "JUDGEMENT": + case "VOTE": + console.warn("Cannot batch-add targets for target option JUDGEMENT or VOTE.") + break; + case "TEXT": + const targets = r.map(it => { + return {target: it, type: ApiTargetType.TEXT} as ApiTarget + }); + targets.forEach(target => { + this.formBuilder.addTargetForm(this.taskType.targetOption, target) + }) + break; + } }); } diff --git a/frontend/src/app/template/template-builder/components/template-builder-components.module.ts b/frontend/src/app/template/template-builder/components/template-builder-components.module.ts index 7876c686..7145ab40 100644 --- a/frontend/src/app/template/template-builder/components/template-builder-components.module.ts +++ b/frontend/src/app/template/template-builder/components/template-builder-components.module.ts @@ -51,6 +51,7 @@ import { MatCardModule } from "@angular/material/card"; import { ViewersListComponent } from './viewers-list/viewers-list.component'; import { UserListFilterPipe } from './team-builder-dialog/user-list-filter.pipe'; import { UserListInOtherFilterPipe } from './team-builder-dialog/user-list-in-other-filter.pipe'; +import { BatchAddTargetDialogComponent } from './batch-add-target-dialog/batch-add-target-dialog.component'; @NgModule({ @@ -73,7 +74,8 @@ import { UserListInOtherFilterPipe } from './team-builder-dialog/user-list-in-ot TeamBuilderDialogComponent, ViewersListComponent, UserListFilterPipe, - UserListInOtherFilterPipe + UserListInOtherFilterPipe, + BatchAddTargetDialogComponent ], imports: [ CommonModule,