From 3cb52a89e93472da463ce57aa87789c25ac31ef8 Mon Sep 17 00:00:00 2001
From: rhenck <richard.henck@iqb.hu-berlin.de>
Date: Wed, 23 Mar 2022 13:57:37 +0100
Subject: [PATCH] [editor] Fix element selection to also select underlying
 section

---
 .../unit-view/page-view/canvas/canvas.component.html   |  1 +
 .../canvas/overlays/canvas-element-overlay.ts          |  3 ++-
 .../canvas/overlays/static-canvas-overlay.component.ts | 10 +++++++++-
 .../page-view/canvas/section-static.component.ts       |  6 ++++--
 4 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/projects/editor/src/app/components/unit-view/page-view/canvas/canvas.component.html b/projects/editor/src/app/components/unit-view/page-view/canvas/canvas.component.html
index 3f7e70675..ce8bfa5d5 100644
--- a/projects/editor/src/app/components/unit-view/page-view/canvas/canvas.component.html
+++ b/projects/editor/src/app/components/unit-view/page-view/canvas/canvas.component.html
@@ -24,6 +24,7 @@
                                class="section drop-list" id="section-{{i}}"
                                [section]="section"
                                [isSelected]="selectionService.selectedPageSectionIndex === i"
+                               (elementSelected)="selectionService.selectedPageSectionIndex = i"
                                cdkDropList cdkDropListSortingDisabled
                                [cdkDropListData]="{ sectionIndex: i }"
                                (cdkDropListDropped)="elementDropped($event)"
diff --git a/projects/editor/src/app/components/unit-view/page-view/canvas/overlays/canvas-element-overlay.ts b/projects/editor/src/app/components/unit-view/page-view/canvas/overlays/canvas-element-overlay.ts
index 93c25b529..d36fd41a1 100644
--- a/projects/editor/src/app/components/unit-view/page-view/canvas/overlays/canvas-element-overlay.ts
+++ b/projects/editor/src/app/components/unit-view/page-view/canvas/overlays/canvas-element-overlay.ts
@@ -1,7 +1,7 @@
 import {
   Directive, Input,
   ComponentFactoryResolver, ComponentRef,
-  ViewChild, ViewContainerRef, OnInit, OnDestroy, ChangeDetectorRef
+  ViewChild, ViewContainerRef, OnInit, OnDestroy, ChangeDetectorRef, Output, EventEmitter
 } from '@angular/core';
 import { Subject } from 'rxjs';
 import { takeUntil } from 'rxjs/operators';
@@ -19,6 +19,7 @@ import { UIElement } from '../../../../../../../../common/interfaces/elements';
 export abstract class CanvasElementOverlay implements OnInit, OnDestroy {
   @Input() element!: UIElement;
   @Input() viewMode: boolean = false;
+  @Output() elementSelected = new EventEmitter<unknown>();
   @ViewChild('elementContainer', { read: ViewContainerRef, static: true }) private elementContainer!: ViewContainerRef;
   isSelected = false;
   protected childComponent!: ComponentRef<ElementComponent | CompoundElementComponent>;
diff --git a/projects/editor/src/app/components/unit-view/page-view/canvas/overlays/static-canvas-overlay.component.ts b/projects/editor/src/app/components/unit-view/page-view/canvas/overlays/static-canvas-overlay.component.ts
index a59f3fe1b..5c48bfbfa 100644
--- a/projects/editor/src/app/components/unit-view/page-view/canvas/overlays/static-canvas-overlay.component.ts
+++ b/projects/editor/src/app/components/unit-view/page-view/canvas/overlays/static-canvas-overlay.component.ts
@@ -11,7 +11,7 @@ import { UIElement } from '../../../../../../../../common/interfaces/elements';
     <!-- TabIndex is needed to make the div selectable and catch keyboard events (delete). -->
     <div class="draggable-element"
          [class.temporaryHighlight]="temporaryHighlight"
-         (click)="!isSelected && selectElement($event.shiftKey); $event.stopPropagation()"
+         (click)="elementClicked($event)"
          (dblclick)="openEditDialog()"
          (keyup.delete)="deleteSelectedElements()" tabindex="-1"
          cdkDrag [cdkDragData]="{dragType: 'move', element: element}"
@@ -86,4 +86,12 @@ export class StaticCanvasOverlayComponent extends CanvasElementOverlay {
       })
       .unsubscribe();
   }
+
+  elementClicked(event: any): void {
+    if (!this.isSelected) {
+      this.selectElement(event.shiftKey);
+    }
+    event.stopPropagation();
+    this.elementSelected.emit();
+  }
 }
diff --git a/projects/editor/src/app/components/unit-view/page-view/canvas/section-static.component.ts b/projects/editor/src/app/components/unit-view/page-view/canvas/section-static.component.ts
index 7b5544b0d..7e589a7d1 100644
--- a/projects/editor/src/app/components/unit-view/page-view/canvas/section-static.component.ts
+++ b/projects/editor/src/app/components/unit-view/page-view/canvas/section-static.component.ts
@@ -1,5 +1,5 @@
 import {
-  Component, ElementRef, Input, QueryList, ViewChild, ViewChildren
+  Component, ElementRef, EventEmitter, Input, Output, QueryList, ViewChild, ViewChildren
 } from '@angular/core';
 import { UnitService } from '../../../../services/unit.service';
 import { CanvasElementOverlay } from './overlays/canvas-element-overlay';
@@ -17,7 +17,8 @@ import { UIElementType } from '../../../../../../../common/interfaces/elements';
          (dragover)="$event.preventDefault()" (drop)="newElementDropped($event)">
       <aspect-static-canvas-overlay #elementComponent
                                     *ngFor="let element of section.elements"
-                                    [element]="$any(element)">
+                                    [element]="$any(element)"
+                                    (elementSelected)="elementSelected.emit($event)">
       </aspect-static-canvas-overlay>
     </div>
   `,
@@ -28,6 +29,7 @@ import { UIElementType } from '../../../../../../../common/interfaces/elements';
 export class SectionStaticComponent {
   @Input() section!: Section;
   @Input() isSelected!: boolean;
+  @Output() elementSelected = new EventEmitter<unknown>();
   @ViewChild('sectionElement') sectionElement!: ElementRef;
   @ViewChildren('elementComponent') childElementComponents!: QueryList<CanvasElementOverlay>;
 
-- 
GitLab