From 16fec28ee4a81f2c535493bf8ab91b6d22213247 Mon Sep 17 00:00:00 2001
From: jojohoch <joachim.hoch@iqb.hu-berlin.de>
Date: Sat, 25 Sep 2021 14:16:29 +0200
Subject: [PATCH] [player] Refactor layout component

Because the always visible page is now positioned at the first place of
the unit definition.
---
 .../components/layout/layout.component.html   | 36 +++++++++----------
 .../app/components/layout/layout.component.ts | 25 +++----------
 2 files changed, 22 insertions(+), 39 deletions(-)

diff --git a/projects/player/src/app/components/layout/layout.component.html b/projects/player/src/app/components/layout/layout.component.html
index 9d994f549..0401acd90 100644
--- a/projects/player/src/app/components/layout/layout.component.html
+++ b/projects/player/src/app/components/layout/layout.component.html
@@ -32,9 +32,9 @@
            [hideFirstChild]="hidePageLabels"
            [style.max-width]="alwaysVisiblePage.hasMaxWidth ? alwaysVisiblePage.maxWidth + 'px' : '100%'"
            [style.margin.px]="alwaysVisiblePage.margin">
-        <div class="mat-tab-label">{{'alwaysVisiblePage' | translate}} {{selectedIndex}}</div>
+        <div class="mat-tab-label">{{'alwaysVisiblePage' | translate}}</div>
         <app-page [parentArrayIndex]="alwaysVisibleUnitPageIndex"
-                  [index]="playerPageIndices[alwaysVisibleUnitPageIndex]"
+                  [index]="alwaysVisibleUnitPageIndex"
                   [parentForm]="parentForm"
                   [isLastPage]="false"
                   [pagesContainer]="alwaysVisiblePageContainer"
@@ -70,15 +70,14 @@
                  mat-align-tabs="start"
                  [(selectedIndex)]="selectedIndex"
                  (selectedIndexChange)="onSelectedIndexChange($event)">
-    <ng-container *ngFor="let page of pages; let i = index">
-      <mat-tab *ngIf="!page.alwaysVisible"
-               label="{{'pageIndication' | translate: {index: playerPageIndices[i] + 1} }}">
+    <ng-container *ngFor="let page of scrollPages; let i = index; let last = last">
+      <mat-tab [label]="'pageIndication' | translate: {index: i + 1}">
         <div [style.margin.px]="page.margin"
              [style.max-width]="page.hasMaxWidth ? page.maxWidth + 'px' : '100%'">
-          <app-page [parentArrayIndex]="i"
-                    [index]="playerPageIndices[i]"
+          <app-page [parentArrayIndex]="scrollPagesIndices[i]"
+                    [index]="scrollPagesIndices[i]"
                     [parentForm]="parentForm"
-                    [isLastPage]="i === lastScrollPageIndex"
+                    [isLastPage]="last"
                     [pagesContainer]="pagesContainer"
                     [page]="page">
           </app-page>
@@ -89,26 +88,25 @@
 </ng-template>
 
 <ng-template #scrollPagesScrolledView let-pagesContainer>
-  <ng-container *ngFor="let page of pages; let i = index">
-    <div *ngIf="!page.alwaysVisible"
-         [class.concat-scroll-snap-align]="scrollPageMode === 'concat-scroll-snap'"
-         appHideFirstChild
+  <ng-container *ngFor="let page of scrollPages; let i = index; let last = last">
+    <div appHideFirstChild
          [hideFirstChild]="hidePageLabels"
+         [class.concat-scroll-snap-align]="scrollPageMode === 'concat-scroll-snap'"
+         [style.max-width]="page.hasMaxWidth ? page.maxWidth + 'px' : '100%'"
+         [style.margin.px]="page.margin"
          appScrollIndex
          [pagesContainer]="pagesContainer"
          [selectIndex]="selectIndex"
-         [index]="playerPageIndices[i]"
-         [style.max-width]="page.hasMaxWidth ? page.maxWidth + 'px' : '100%'"
-         [style.margin.px]="page.margin">
+         [index]="i">
       <div class="mat-tab-label">
-        {{'pageIndication' | translate: {index: playerPageIndices[i] + 1} }}
+        {{'pageIndication' | translate: {index: i + 1} }}
       </div>
-      <app-page [parentArrayIndex]="i"
-                [index]="playerPageIndices[i]"
+      <app-page [parentArrayIndex]="scrollPagesIndices[i]"
+                [index]="scrollPagesIndices[i]"
                 [parentForm]="parentForm"
                 [pagesContainer]="pagesContainer"
                 [page]="page"
-                [isLastPage]="i === lastScrollPageIndex"
+                [isLastPage]="last"
                 (selectedIndexChange)="onSelectedIndexChange($event)">
       </app-page>
     </div>
diff --git a/projects/player/src/app/components/layout/layout.component.ts b/projects/player/src/app/components/layout/layout.component.ts
index 2f6a4a79a..41b6076a2 100644
--- a/projects/player/src/app/components/layout/layout.component.ts
+++ b/projects/player/src/app/components/layout/layout.component.ts
@@ -27,9 +27,7 @@ export class LayoutComponent implements OnInit, OnDestroy {
   private ngUnsubscribe = new Subject<void>();
 
   isKeyboardOpen!: boolean;
-
-  playerPageIndices!: number[];
-  lastScrollPageIndex!: number;
+  scrollPagesIndices!: number[];
   scrollPages!: UnitPage[];
   hasScrollPages!: boolean;
   alwaysVisiblePage!: UnitPage | undefined;
@@ -65,26 +63,13 @@ export class LayoutComponent implements OnInit, OnDestroy {
       .subscribe((isOpen: boolean): void => { this.isKeyboardOpen = isOpen; });
   }
 
-  private getLastScrollPageIndex(): number {
-    if (this.alwaysVisibleUnitPageIndex < 0 || this.alwaysVisibleUnitPageIndex < this.pages.length - 1) {
-      return this.pages.length - 1;
-    }
-    return this.pages.length - 2;
-  }
-
   private initPages(): void {
     this.alwaysVisibleUnitPageIndex = this.pages.findIndex((page: UnitPage): boolean => page.alwaysVisible);
     this.alwaysVisiblePage = this.pages[this.alwaysVisibleUnitPageIndex];
     this.scrollPages = this.pages.filter((page: UnitPage): boolean => !page.alwaysVisible);
-    this.hasScrollPages = this.scrollPages && this.scrollPages.length > 0;
-    this.lastScrollPageIndex = this.getLastScrollPageIndex();
-    this.playerPageIndices = this.pages.map(
-      (page: UnitPage, index: number): number => {
-        if (index === this.alwaysVisibleUnitPageIndex) {
-          return this.pages.length - 1;
-        }
-        return (this.alwaysVisibleUnitPageIndex < 0 || index < this.alwaysVisibleUnitPageIndex) ? index : index - 1;
-      }
+    this.hasScrollPages = this.scrollPages?.length > 0;
+    this.scrollPagesIndices = this.scrollPages.map(
+      (scrollPage: UnitPage): number => this.pages.indexOf(scrollPage)
     );
     this.validPagesDetermined.emit(this.scrollPages.map((page: UnitPage, index: number): Record<string, string> => (
       { [index.toString(10)]: `${this.translateService.instant('pageIndication', { index: index + 1 })}` })));
@@ -108,7 +93,7 @@ export class LayoutComponent implements OnInit, OnDestroy {
     this.aspectRatioColumn.scrollPages = this.getAspectRatio('column', -100);
 
     this.containerMaxWidth.alwaysVisiblePage = this.getContainerMaxWidth(
-      !(this.alwaysVisiblePage && this.alwaysVisiblePage.hasMaxWidth),
+      !(this.alwaysVisiblePage?.hasMaxWidth),
       this.maxWidth.alwaysVisiblePage
     );
     this.containerMaxWidth.scrollPages = this.getContainerMaxWidth(
-- 
GitLab