Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.


Info

The CLI component is only working for versions before 9.10. It must be upgraded to Angular 15 as well and will come later.

Table of Contents
include^Example.*

...

  1. Use a CLI command to generate a state component with a custom name and sidebar link. The link appears in the navigation menu on the left. (sidebar-navigation = default)

    Code Block
    languagebash
    linenumberstrue
    eo g state custom


  2. Use a CLI command to install the maps package (takes some time).

    Code Block
    languagebash
    linenumberstrue
    npm install -P ng2-charts@1.6.0


  3. Import ChartsModule module to CustomStatesModule.

    Code Block
    languagejs
    titlecustom-states.module.ts
    linenumberstrue
    import {NgModule} from '@angular/core';
    import {CommonModule} from '@angular/common';
    import {Route, RouterModule} from '@angular/router';
    import {EoFrameworkModule} from '@eo-sdk/client';
    import {EoLinkPlugin} from '@eo-sdk/client';
    import {AuthGuard} from '@eo-sdk/client';
    import {CustomComponent} from './custom/custom.component';
    import {ChartsModule} from 'ng2-charts';
    
    export const routes: Route[] = [
      {path: CustomComponent.path, component: CustomComponent, canActivate: [AuthGuard]},
    ];
    
    export const links: EoLinkPlugin[] = [
      CustomComponent
    ];
    
    @NgModule({
      imports: [
        CommonModule,
        EoFrameworkModule,
        RouterModule.forChild(routes),
        ChartsModule
      ],
      declarations: [CustomComponent]
    })
    export class CustomStatesModule {
    }


  4. Update custom.component.ts to load current chart data.

    Code Block
    languagejs
    titlecustom.component.ts
    linenumberstrue
    import {Component, ViewChild} from '@angular/core';
    import {Chart} from 'chart.js';
    import {TranslateService, SearchService} from '@eo-sdk/core';
    import {BaseChartDirective} from 'ng2-charts';
    // In the following line ', UnsubscribeOnDestroy' has to be removed when updating to version 9.10 or younger:
    import {AppSearchService, UnsubscribeOnDestroy} from '@eo-sdk/client';
    import {takeUntil} from 'rxjs/operators';
    
    @Component({
      selector: 'eo-custom',
      templateUrl: './custom.component.html',
      styleUrls: ['./custom.component.scss']
    })
    })
    // in the following line 'extends UnsubscribeOnDestroy' has to be removed when updating to version 9.10 or younger:
    export class CustomComponent extends UnsubscribeOnDestroy {
    
      static id = 'eo.custom.state.custom';
      static path = 'custom/custom';
      static matchType = new RegExp('sidebar-navigation');
    
      groupCount: number;
      totalCount: number;
      chart;
      activeType = 0;
      types = [];
    
      @ViewChild(BaseChartDirective) chartEl: BaseChartDirective;
    
      constructor(private translate: TranslateService,
                  private searchService: SearchService,
                  private appSearchService: AppSearchService) {
        super();
        this.fetchData();
      }
    
      chartClicked(el?) {
        if (!el || (this.activeType === this.groupCount && el.active[0])) {
          this.activeType = el ? el.active[0]._index : this.groupCount;
          this.chart = this.dataToChart(this.types[this.activeType]);
          setTimeout(() => {
            this.chartEl.chart.config.data.labels = this.chart.labels;
            this.chartEl.chart.update();
          }, 0);
        }
      }
    
      dataToChart(groups: any[]): Chart {
        return {
          data: [{
            data: groups.map(g => g.count),
            label: ''
          }],
          labels: groups.map(g => g.label)
        };
      }
    
    
      private fetchData() {
        this.appSearchService.setTerm('');
        this.appSearchService
          .queryState$
          .pipe(
            takeUntil(this.componentDestroyed$)
          )
          .subscribe(res => {
              this.totalCount = res.count;
              this.groupCount = this.appSearchService.objectTypeGroups.length;
              this.types = [];
    
              const main = this.appSearchService.objectTypeGroups.map((g) => {
                const type = g.types.map(t => ({label: t.label, count: res.aggregations.type.get(t.qname) || 0}));
                this.types.push(type.sort((a, b) => b.count - a.count));
                return {
                  label: g.label === '0' ? this.translate.instant('eo.quicksearch.result.group.global') : g.label,
                  count: type.map(t => t.count).reduce((a, b) => a + b, 0)
                };
              });
    
              this.types.push(main.sort((a, b) => b.count - a.count));
              this.chartClicked();
            }
          );
      }
    }
    


  5. Update custom-state.component.html to include a chart component.

    Code Block
    languagexml
    titlecustom-state.component.html
    linenumberstrue
    <button class="summary" (click)="chartClicked()">
      <span class="label" *ngIf="activeType != groupCount">{{types[groupCount][activeType].label}}: &nbsp;</span>
      <span class="count" *ngIf="activeType != groupCount"> {{types[groupCount][activeType].count}} of &nbsp;</span>
      <span class="total">{{totalCount}}</span>
    </button>
    
    <div class="chart-container">
      <canvas baseChart *ngIf="chart" height="100%"
              [datasets]="chart.data"
              [labels]="chart.labels"
              [chartType]="'doughnut'"
              (chartClick)="chartClicked($event)"></canvas>
    </div>


  6. To finish this state, add some styling

    Code Block
    languagecss
    titlecustom-state.component.scss
    linenumberstrue
    :host {
      flex: 1;
      display: flex;
      flex-flow: column;
    
      .summary {
        align-items: baseline;
        position: absolute;
        right: 30px;
        top: 30px;
        flex: 1 1 auto;
        display: flex;
        background: papayawhip;
        border-radius: 4px;
        padding: 16px;
        border: 1px solid rgba(255, 255, 255, 0.2);
    
        .label {
          font-size: 1.5em;
        }
        .count {
          font-size: 2.5em;
        }
        .total {
          font-size: 3.5em;
        }
    
      }
      .chart-container {
        flex: 0 0 auto;
      }
    }


  7. Use a CLI command to generate labels/translations.

    Code Block
    languagebash
    linenumberstrue
    eo g label eo.custom.state.custom --en "Custom state" --de "Custom state"


...

  1. Use a CLI command to generate a simple preview state component. The link appears in the navigation menu on the left. (sidebar-navigation = default)

    Code Block
    languagebash
    titleTerminal
    eo g state simple-preview


  2. Update the simple-preview component implementation. Please update queryParams based on your scheme!

    Code Block
    languagexml
    titlesimple-preview.component.html
    <eo-media *ngIf="item"
              [dmsObject]="item"
              [useVersion]="item.id === item.content?.id"
              #viewer>
    </eo-media>
    


    Code Block
    languagecss
    titlesimple-preview.component.scss
    /* fullscreen setup */
    :host {
      position: fixed !important;
      top: 0;
      right: 0;
      bottom: 0;
      left: 0;
      z-index: 10 !important;
    }


    Code Block
    languagejs
    titlesimple-preview.component.ts
    import {Component, OnInit} from '@angular/core';
    import {DmsObject, DmsParams, DmsService} from '@eo-sdk/core';
    import {ActivatedRoute} from '@angular/router';
    // The following line has to be removed when updating to version 9.10 or younger:
    import {UnsubscribeOnDestroy} from '@eo-sdk/client';
    import {takeUntil, filter} from 'rxjs/operators';
    
    @Component({
      selector: 'eo-simple-preview',
      templateUrl: './simple-preview.component.html',
      styleUrls: ['./simple-preview.component.scss']
    })]
    })
    // In the following line 'extends UnsubscribeOnDestroy' has to be removed when updating to version 9.10 or younger:
    export class SimplePreviewComponent extends UnsubscribeOnDestroy implements OnInit {
    
      static id = 'eo.custom.state.simple-preview';
      static path = 'custom/simple-preview';
      static matchType = new RegExp('sidebar-navigation');
    
      /* set specific existing ID of DMS object to provide correct link */
      static queryParams = {id: '0000'};
    
      item: DmsObject;
    
      constructor(private dmsService: DmsService, private route: ActivatedRoute) {
        super();
      }
    
      loadDmsObject(params: DmsParams) {
        this.dmsService
          .getDmsObjectByParams(params)
          .subscribe(val => this.item = val)
      }
    
      ngOnInit() {
        this.route
          .queryParams
          .pipe(takeUntil(this.componentDestroyed$), filter(params => params.id))
          .subscribe(params => this.loadDmsObject(params as DmsParams));
      }
    
    }
    


  3. Use a CLI command to generate a simple list state component. The link appears in the navigation menu on the left. (sidebar-navigation = default)

    Code Block
    languagebash
    titleTerminal
    eo g state simple-list


  4. Update the simple-list component implementation (a double-click redirects to the simple preview state). Please update queryParams based on your scheme!

    Code Block
    languagexml
    titlesimple-list.component.html
    <eo-result-list [query]="query" [hasIcon]="true" (onDoubleClick)="onDoubleClick($event)"></eo-result-list>
    


    Code Block
    languagecss
    titlesimple-list.component.scss
    /* fullscreen setup */
    :host {
      position: fixed !important;
      top: 0;
      right: 0;
      bottom: 0;
      left: 0;
      z-index: 10 !important;
    }


    Code Block
    languagejs
    titlesimple-list.component.ts
    import {Component, OnInit} from '@angular/core';
    import {SearchService, SearchQuery, SearchResult} from '@eo-sdk/core';
    import {ActivatedRoute, Router, NavigationExtras} from '@angular/router';
    import {takeUntil, filter} from 'rxjs/operators';
    // The following line has to be removed when updating to version 9.10 or younger:
    import {UnsubscribeOnDestroy} from '@eo-sdk/client';
    import {SimplePreviewComponent} from '../simple-preview/simple-preview.component';
    
    @Component({
      selector: 'eo-simple-list',
      templateUrl: './simple-list.component.html',
      styleUrls: ['./simple-list.component.scss']
    })
    // In the following line 'extends UnsubscribeOnDestroy' has to be removed when updating to version 9.10 or younger:
    export class SimpleListComponent extends UnsubscribeOnDestroy implements OnInit {
    
      static id = 'eo.custom.state.simple-list';
      static path = 'custom/simple-list';
      static matchType = new RegExp('sidebar-navigation');
    
      /* set specific existing query to provide correct link */
      /* multiple ways how to set query based on input format */
      // static queryParams = {query : '%7B%22types%22%3A%5B%22eoxemail%22%5D%7D'};
      // static queryParams = {query : decodeURIComponent('%257B%2522types%2522%253A%255B%2522eoxemail%2522%255D%257D')};
      static queryParams = {query: encodeURIComponent(JSON.stringify({'types': ['eoxemail']}))};
    
      query: SearchQuery;
      searchResult: SearchResult = new SearchResult();
    
      constructor(private route: ActivatedRoute,
                  private router: Router,
                  private searchService: SearchService) {
        super();
      }
    
    
      getParams() {
        this.route
          .queryParams
          .pipe(takeUntil(this.componentDestroyed$), filter(params => params.query))
          .subscribe((params: any) => {
            this.query = JSON.parse(decodeURIComponent(params.query));
            const defaultQuery = this.searchService.buildQuery(this.query);
    
            this.searchService
              .getChunkedResult(defaultQuery, 0, 10000)
              .subscribe(result => {
                this.searchResult = result;
              });
          });
      }
    
      onDoubleClick(event) {
        const {id, version, typeName} = event.data;
        const queryParams: NavigationExtras = {queryParams: {id, version, 'type': typeName}};
        const url = this.router.createUrlTree([SimplePreviewComponent.path], queryParams).toString();
        window.open(url);
    
      }
    
      ngOnInit() {
        this.getParams();
      }
    
    }
    


  5. We need to generate a guard to deactivate the original behavior of the result list component

    Code Block
    languagebash
    titleTerminal
    ng generate guard eo-custom-client/custom-states/simple-list/can-deactivate-list --spec false


  6. Update can-deactivate-list.guard.ts

    Code Block
    languagejs
    titlecan-deactivate-list.guard.ts
    linenumberstrue
    import {Injectable} from '@angular/core';
    import {CanDeactivate} from '@angular/router';
    import {SimpleListComponent} from './simple-list.component';
    
    @Injectable({
      providedIn: 'root'
    })
    export class CanDeactivateListGuard implements CanDeactivate<SimpleListComponent> {
      canDeactivate() {
        return false;
      }
    }
    
    


  7. Add CanDeactivateListGuard guard to the custom-states module.

    Code Block
    languagejs
    titlecustom-states.module.ts
    linenumberstrue
    import {NgModule} from '@angular/core';
    import {CommonModule} from '@angular/common';
    import {Route, RouterModule} from '@angular/router';
    import {EoFrameworkModule} from '@eo-sdk/client';
    import {EoLinkPlugin} from '@eo-sdk/client';
    import {AuthGuard} from '@eo-sdk/client';
    import {SimpleListComponent} from './simple-list/simple-list.component';
    import {CanDeactivateListGuard} from './simple-list/can-deactivate-list.guard';
    import {SimplePreviewComponent} from './simple-preview/simple-preview.component';
    
    export const routes: Route[] = [
      {path: SimplePreviewComponent.path, component: SimplePreviewComponent, canActivate: [AuthGuard]},
      {path: SimpleListComponent.path, component: SimpleListComponent, canActivate: [AuthGuard], canDeactivate: [CanDeactivateListGuard]},
    ];
    
    export const links: EoLinkPlugin[] = [
      SimplePreviewComponent,
      SimpleListComponent,
    ];
    
    @NgModule({
      imports: [
        CommonModule,
        EoFrameworkModule,
        RouterModule.forChild(routes)
      ],
      declarations: [SimpleListComponent, SimplePreviewComponent]
    })
    export class CustomStatesModule {
    }
    
    


  8. Use a CLI command to generate labels/translations.

    Code Block
    languagebash
    linenumberstrue
    eo g label eo.custom.state.simple-list --en "Simple List" --de "Einfache Liste"


    Code Block
    languagebash
    linenumberstrue
    eo g label eo.custom.state.simple-preview --en "Simple Preview" --de "Einfache Vorschau"


...