diff --git a/apps/red-ui/src/app/modules/file-preview/components/editable-structured-component-value/editable-structured-component-value.component.html b/apps/red-ui/src/app/modules/file-preview/components/editable-structured-component-value/editable-structured-component-value.component.html index a6930bcd1..ca19f3835 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/editable-structured-component-value/editable-structured-component-value.component.html +++ b/apps/red-ui/src/app/modules/file-preview/components/editable-structured-component-value/editable-structured-component-value.component.html @@ -1,4 +1,4 @@ -
+
{{ entry.name }}
@@ -8,7 +8,7 @@
-
- - test - -
+
+ +
+ +
+ +
+ +
+
+
+ +
+ + +
+ + +
+
+
diff --git a/apps/red-ui/src/app/modules/file-preview/components/editable-structured-component-value/editable-structured-component-value.component.scss b/apps/red-ui/src/app/modules/file-preview/components/editable-structured-component-value/editable-structured-component-value.component.scss index 695a92125..901d6b438 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/editable-structured-component-value/editable-structured-component-value.component.scss +++ b/apps/red-ui/src/app/modules/file-preview/components/editable-structured-component-value/editable-structured-component-value.component.scss @@ -13,7 +13,6 @@ .value { width: 60%; display: flex; - align-items: center; .text { width: 80%; @@ -50,7 +49,7 @@ position: absolute; right: 0; top: 50%; - transform: translateY(-50%); + transform: translateY(-50%) scale(0.7); } mat-icon { @@ -61,10 +60,13 @@ &.selected { background-color: var(--iqser-grey-8); border-left: 4px solid var(--iqser-primary); - cursor: pointer; margin-left: 0; margin-right: 0; + &:not(.editing) { + cursor: pointer; + } + .component { margin-left: 22px; } @@ -89,10 +91,31 @@ .editing-value { display: flex; align-items: center; + margin: 10px 0 10px 22px; + + .iqser-input-group { + margin-top: 0; + + textarea { + resize: none; + } + } .draggable { cursor: grab; } } + + .editing-actions { + display: flex; + flex-direction: row; + align-items: center; + gap: 12px; + margin: 20px 10px 10px 22px; + + .right { + margin-left: auto; + } + } } } diff --git a/apps/red-ui/src/app/modules/file-preview/components/editable-structured-component-value/editable-structured-component-value.component.ts b/apps/red-ui/src/app/modules/file-preview/components/editable-structured-component-value/editable-structured-component-value.component.ts index 0131b4d68..24545fcb0 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/editable-structured-component-value/editable-structured-component-value.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/components/editable-structured-component-value/editable-structured-component-value.component.ts @@ -1,26 +1,78 @@ -import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core'; +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { ComponentLogEntry } from '@red/domain'; +import { FormBuilder, FormControl, UntypedFormGroup } from '@angular/forms'; +import { IconButtonTypes } from '@iqser/common-ui'; @Component({ - selector: 'redaction-editable-structured-component-value [entry] [selectedEntry] [canEdit]', + selector: 'redaction-editable-structured-component-value [entry] [canEdit]', templateUrl: './editable-structured-component-value.component.html', styleUrls: ['/editable-structured-component-value.component.scss'], }) -export class EditableStructuredComponentValueComponent implements OnChanges { +export class EditableStructuredComponentValueComponent implements OnInit { @Input() entry: ComponentLogEntry; - @Input() selectedEntry: ComponentLogEntry; @Input() canEdit: boolean; - @Output() readonly selectEntry = new EventEmitter(); + @Output() readonly deselectLast = new EventEmitter(); + + protected readonly iconButtonTypes = IconButtonTypes; + + form: UntypedFormGroup; + selected = false; editing = false; - ngOnChanges(changes: SimpleChanges) { - if (changes?.selectedEntry?.currentValue) { - this.editing = changes.selectedEntry.currentValue.name === this.entry.name; + constructor(private readonly _formBuilder: FormBuilder) {} + + ngOnInit() { + this.form = this.#getForm(); + } + + #getForm() { + const form = this._formBuilder.group({}); + this.entry.componentValues.forEach((value, index) => { + form.addControl(index.toString(), this._formBuilder.control(value.value ?? value.originalValue)); + }); + return form; + } + + select() { + if (!this.editing) { + if (this.selected) { + this.deselect(); + return; + } + this.deselectLast.emit(); + this.selected = true; } } - toggleEdit(entry?: ComponentLogEntry) { - this.editing = !this.editing; - this.selectEntry.emit(entry); + edit() { + this.deselectLast.emit(); + this.selected = true; + this.editing = true; + } + + deselect($event?: MouseEvent) { + $event?.stopImmediatePropagation(); + this.selected = false; + this.editing = false; + } + + removeValue(key: number) { + this.form.removeControl(key.toString()); + } + + save() {} + + undo(originalKey: string) {} + + add() { + const key = (Object.keys(this.form.controls).length + 1).toString(); + this.form.addControl(key, new FormControl('')); + this.entry.componentValues.push({ + value: '', + originalValue: '', + valueDescription: '', + componentRuleId: '', + entityReferences: [], + }); } } diff --git a/apps/red-ui/src/app/modules/file-preview/components/structured-component-management/structured-component-management.component.html b/apps/red-ui/src/app/modules/file-preview/components/structured-component-management/structured-component-management.component.html index 4e77b3e4d..bde5b1bf2 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/structured-component-management/structured-component-management.component.html +++ b/apps/red-ui/src/app/modules/file-preview/components/structured-component-management/structured-component-management.component.html @@ -12,12 +12,12 @@
-
+
diff --git a/apps/red-ui/src/app/modules/file-preview/components/structured-component-management/structured-component-management.component.ts b/apps/red-ui/src/app/modules/file-preview/components/structured-component-management/structured-component-management.component.ts index cf90cbbac..1191df27a 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/structured-component-management/structured-component-management.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/components/structured-component-management/structured-component-management.component.ts @@ -1,10 +1,16 @@ -import { Component, Input, signal } from '@angular/core'; +import { Component, Input, QueryList, signal, ViewChildren } from '@angular/core'; import { ComponentLogEntry, Dictionary, File, WorkflowFileStatuses } from '@red/domain'; import { IconButtonTypes, LoadingService } from '@iqser/common-ui'; import { ComponentLogService } from '@services/files/component-log.service'; import { FilesMapService } from '@services/files/files-map.service'; import { UserPreferenceService } from '@users/user-preference.service'; import { firstValueFrom } from 'rxjs'; +import { List } from '@common-ui/utils'; +import { EditableStructuredComponentValueComponent } from '../editable-structured-component-value/editable-structured-component-value.component'; + +interface DeselectEvent { + name: string; +} @Component({ selector: 'redaction-structured-component-management', @@ -15,10 +21,11 @@ export class StructuredComponentManagementComponent { @Input() file: File; @Input() dictionaries: Dictionary[]; + @ViewChildren('editableComponent') editableComponents: List; + readonly componentLogData = signal(undefined); readonly openScmDialogByDefault = signal(this.userPreferences.getOpenScmDialogByDefault()); readonly iconButtonTypes = IconButtonTypes; - selectedEntry: ComponentLogEntry; constructor( private readonly _componentLogService: ComponentLogService, @@ -27,8 +34,11 @@ export class StructuredComponentManagementComponent { readonly userPreferences: UserPreferenceService, ) {} - selectEntry(entry: ComponentLogEntry) { - this.selectedEntry = this.selectedEntry?.name !== entry.name ? entry : null; + deselectLast() { + const lastSelected = this.editableComponents.find(c => c.selected); + if (lastSelected) { + lastSelected.deselect(); + } } get canEdit() { diff --git a/apps/red-ui/src/assets/i18n/redact/de.json b/apps/red-ui/src/assets/i18n/redact/de.json index 1aa05e456..71b4cddbb 100644 --- a/apps/red-ui/src/assets/i18n/redact/de.json +++ b/apps/red-ui/src/assets/i18n/redact/de.json @@ -495,7 +495,12 @@ }, "component-management": { "actions": { - "edit": "" + "add": "", + "cancel": "", + "delete": "", + "edit": "", + "save": "", + "undo": "" }, "components": "", "table-header": { diff --git a/apps/red-ui/src/assets/i18n/redact/en.json b/apps/red-ui/src/assets/i18n/redact/en.json index 09ea9f10e..73321e5f0 100644 --- a/apps/red-ui/src/assets/i18n/redact/en.json +++ b/apps/red-ui/src/assets/i18n/redact/en.json @@ -495,7 +495,12 @@ }, "component-management": { "actions": { - "edit": "Edit" + "add": "Add", + "cancel": "Cancel", + "delete": "Remove value", + "edit": "Edit", + "save": "Save", + "undo": "Undo" }, "components": "Components", "table-header": { diff --git a/apps/red-ui/src/assets/i18n/scm/de.json b/apps/red-ui/src/assets/i18n/scm/de.json index 3a94f7c25..af906e040 100644 --- a/apps/red-ui/src/assets/i18n/scm/de.json +++ b/apps/red-ui/src/assets/i18n/scm/de.json @@ -495,7 +495,12 @@ }, "component-management": { "actions": { - "edit": "" + "add": "", + "cancel": "", + "delete": "", + "edit": "", + "save": "", + "undo": "" }, "components": "", "table-header": { diff --git a/apps/red-ui/src/assets/i18n/scm/en.json b/apps/red-ui/src/assets/i18n/scm/en.json index ae141c18d..439ae5836 100644 --- a/apps/red-ui/src/assets/i18n/scm/en.json +++ b/apps/red-ui/src/assets/i18n/scm/en.json @@ -495,7 +495,12 @@ }, "component-management": { "actions": { - "edit": "Edit" + "add": "Add", + "cancel": "Cancel", + "delete": "Remove value", + "edit": "Edit", + "save": "Save", + "undo": "Undo" }, "components": "Components", "table-header": {