@WidgetComponent

nm-item-list

File

src/app/shared/widgets/itemlist/itemlist.component.ts

Implements

OnInit

Metadata

providers WidgetframeService
selector nm-item-list
styleUrls itemlist.component.scss
templateUrl ./itemlist.component.html

Index

Widget inputs
Widget outputs
Properties
Methods

Constructor

constructor(_widgetframeService: WidgetframeService, currentLocaleService: CurrentLocaleService)
Parameters :
Name Type Optional
_widgetframeService WidgetframeService no
currentLocaleService CurrentLocaleService no

Methods

Protected configureWidget
configureWidget(configuration: WidgetConfig)
Decorators : WidgetConfigure
Parameters :
Name Type Optional
configuration WidgetConfig no
Returns : void
ngOnDestroy
ngOnDestroy()
Returns : void
ngOnInit
ngOnInit()
Returns : void
onFilterHeaderFocus
onFilterHeaderFocus(event: )
Parameters :
Name Optional
event no
Returns : void
onHeaderFocus
onHeaderFocus(event: )
Parameters :
Name Optional
event no
Returns : void
onRowSelectChange
onRowSelectChange($event: )
Parameters :
Name Optional
$event no
Returns : void
populateTable
populateTable(data: , configuration: )
Parameters :
Name Optional
data no
configuration no
Returns : void
resetWidget
resetWidget()
Returns : any
sendIdentifier
sendIdentifier(identifier: )
Parameters :
Name Optional
identifier no
Returns : void

Properties

Public _id
_id:
Decorators : WidgetId
Public arr
arr:
Default value : Array
Public cols
cols: any[]
Type : any[]
Public configuration
configuration: WidgetConfig
Type : WidgetConfig
Decorators : WidgetConfiguration
Public cssClass
cssClass: string
Type : string
Public dataType
dataType: string
Type : string
Default value : "items"
Public dimsColsNo
dimsColsNo: number
Type : number
Public dimsGroupColIndex
dimsGroupColIndex: number
Type : number
Public dimsGroupSpanHeader
dimsGroupSpanHeader: any
Type : any
Public disableHeaderTooltip
disableHeaderTooltip: boolean
Type : boolean
Default value : true
Public genericItemList
genericItemList:
Public headerColumnGroup
headerColumnGroup: boolean
Type : boolean
Public inputLink
inputLink: string
Type : string
Public items
items: any
Type : any
Public preselectRow
preselectRow:
Default value : true
Public productNo
productNo:
Default value : new Subject<any>()
Decorators : WidgetInput
Public reload
reload:
Default value : new Subject<any>()
Decorators : WidgetInput
Private selectedItem
selectedItem: Subject<any>
Type : Subject<any>
Default value : new Subject<any>()
Decorators : WidgetOutput
Private selectedItems
selectedItems: Subject<any>
Type : Subject<any>
Default value : new Subject<any>()
Decorators : WidgetOutput
Public selectedRows
selectedRows: any[]
Type : any[]
Default value : []
Public selectedUiLocaleString
selectedUiLocaleString: string
Type : string
Default value : "de-DE"
Public title
title: string
Type : string
Default value : "nm-item-list"
Private unsubscribe
unsubscribe:
Default value : NgUnsubscribe.create()
Public uri
uri:
Default value : new Subject<any>()
Decorators : WidgetInput
import {
  empty as observableEmpty,
  combineLatest as observableCombineLatest,
  Subject,
  Observable,
  combineLatest,
} from "rxjs";
import { NgUnsubscribe } from "../../ng-unsubscribe";
import {
  catchError,
  debounceTime,
  distinctUntilChanged,
  map,
  mergeMap,
  takeUntil,
} from "rxjs/operators";
import { Component, OnInit } from "@angular/core";
import { WidgetframeService } from "../widgetframe/widgetframe.service";
import { WidgetConfig } from "../widget.configuration";
import {
  WidgetComponent,
  WidgetId,
  WidgetConfiguration,
  WidgetConfigure,
  WidgetInput,
  WidgetOutput,
} from "../widget.metadata";
import { CurrentLocaleService } from "../../components/i18n/currentLocale.service";
import * as uriTemplates_ from "uri-templates";

const uriTemplates = uriTemplates_;

@WidgetComponent("nm-item-list")
@Component({
  selector: "nm-item-list",
  templateUrl: "./itemlist.component.html",
  styleUrls: ["./itemlist.component.scss"],
  providers: [WidgetframeService],
})
export class ItemWidgetComponent implements OnInit {
  public cols: any[];
  public items: any;
  public dimsGroupSpanHeader: any;
  public headerColumnGroup: boolean;
  public dimsGroupColIndex: number;
  public dimsColsNo: number;
  public arr = Array;
  public selectedRows: any[] = [];

  public selectedUiLocaleString = "de-DE";

  public inputLink: string;
  public genericItemList: false;
  public cssClass: string;
  public title: string = "nm-item-list";
  public dataType: string = "items";
  public preselectRow = true;
  public disableHeaderTooltip: boolean = true;

  private unsubscribe = NgUnsubscribe.create();

  // The productNo to search for
  @WidgetInput()
  public productNo = new Subject<any>();

  // Reloads the items every time this emits. Needs to emit at least on to trigger a search
  @WidgetInput()
  public uri = new Subject<any>();

  @WidgetInput()
  public reload = new Subject<any>();

  @WidgetConfiguration()
  public configuration: WidgetConfig;

  @WidgetId()
  public _id;

  @WidgetOutput("selectedItems")
  private selectedItems: Subject<any> = new Subject<any>();

  @WidgetOutput("selectedItem")
  private selectedItem: Subject<any> = new Subject<any>();

  constructor(
    private _widgetframeService: WidgetframeService,
    private currentLocaleService: CurrentLocaleService
  ) {}

  onRowSelectChange($event) {
    this.selectedItems.next(this.selectedRows);
  }

  @WidgetConfigure()
  protected configureWidget(configuration: WidgetConfig) {
    let template;
    this.dataType = configuration.configuration["dataType"] || this.dataType;

    if (configuration._links) {
      let href = configuration._links[this.dataType]["href"];

      template = uriTemplates(href);
    }
    this.cssClass = configuration.configuration["cssClass"] || "";
    this.title = configuration.configuration["title"] || this.title;

    this.preselectRow =
      configuration.configuration["preselectRow"] != undefined
        ? configuration.configuration["preselectRow"]
        : true;

    if (configuration.configuration["genericItemList"]) {
      this.genericItemList = configuration.configuration["genericItemList"];
    }

    combineLatest([
      this.productNo.asObservable().pipe(distinctUntilChanged()),
      this.reload.asObservable(),
    ])
      .pipe(
        map(([productNo, reloadEvent]) => {
          return { productNo: productNo, reloadEvent: reloadEvent };
        }),
        debounceTime(50),
        map((data) => {
          return template.fill({
            product: data.productNo,
            locale: data.reloadEvent,
            "data-locale": data.reloadEvent,
          });
        }),
        mergeMap((href) =>
          this._widgetframeService
            .getData(href)
            .pipe(catchError(() => observableEmpty()))
        )
      )
      .subscribe(
        (data) => {
          this.populateTable(data, configuration);
        },
        (error) => {
          console.log(error);
          // var err = JSON.parse(error.text());
        }
      );

    observableCombineLatest(
      this.uri.asObservable().pipe(distinctUntilChanged()),
      this.reload.asObservable(),
      (productNo, reloadEvent) => productNo
    )
      .pipe(
        mergeMap((href) =>
          this._widgetframeService
            .getData(href)
            .pipe(catchError(() => observableEmpty()))
        )
      )
      .subscribe(
        (data) => {
          this.populateTable(data, configuration);
        },
        (error) => {
          console.log(error);
          // var err = JSON.parse(error.text());
        }
      );

    this.currentLocaleService
      .getCurrentLocale()
      .pipe(takeUntil(this.unsubscribe))
      .subscribe((locale) => {
        this.selectedUiLocaleString = locale;
      });
  }

  populateTable(data, configuration) {
    if (data["_embedded"][this.dataType].length > 0) {
      let dimsCols: any[] = new Array();
      this.cols = configuration.configuration["columns"];
      for (let col of this.cols) {
        if (!col.sortable && !col.filter) {
          if (col.style) {
            col.style += " noFilter";
          } else {
            col.style = "noFilter";
          }
        } else if (col.sortable && !col.filter) {
          if (col.style) {
            col.style += " sortOnly";
          } else {
            col.style = "sortOnly";
          }
        }
      }

      this.dimsGroupColIndex = this.cols.findIndex(
        (col) => col.group === "dimensions"
      );
      if (this.dimsGroupColIndex > -1) {
        let dimsGroupCol = this.cols[this.dimsGroupColIndex];
        this.dimsGroupSpanHeader = dimsGroupCol["header-span"];
        this.headerColumnGroup = true;
        if (this.dimsGroupColIndex === 1) {
          this.dimsGroupSpanHeader = "dimension";
        }
        for (var attribute in data["_embedded"][this.dataType][0].attributes[
          "dimensions"
        ]) {
          let dim = {
            field: "",
            header: "",
            sortable: false,
            filter: false,
          };
          let attr =
            data["_embedded"][this.dataType][0].attributes.dimensions[
              attribute
            ];
          dim["field"] = attr.identifier;
          dim["header"] = attr[dimsGroupCol["header-field"]];
          dim["sortable"] = dimsGroupCol.sortable;
          dim["filter"] = dimsGroupCol.filter;
          dimsCols.push(dim);
        }
        Array.prototype.splice.apply(
          this.cols,
          [this.dimsGroupColIndex, 1].concat(dimsCols)
        );
      } else {
        this.headerColumnGroup = false;
      }
      this.dimsColsNo = dimsCols.length;

      let tempitems = data["_embedded"][this.dataType];

      if (!this.genericItemList) {
        for (var item in tempitems) {
          for (var attribute in tempitems[item].attributes["default"]) {
            let attr = tempitems[item].attributes.default[attribute];
            tempitems[item][attr.identifier] = attr.value;
          }
          for (var attribute in tempitems[item].attributes["dimensions"]) {
            let attr = tempitems[item].attributes.dimensions[attribute];
            tempitems[item][attr.identifier] = attr.value;
          }
        }
      }
      this.items = tempitems;
      this.selectedRows = [];
      if (this.preselectRow) {
        this.selectedRows.push(this.items[0]);
      }
      this.selectedItems.next(this.selectedRows);
    }
  }

  sendIdentifier(identifier) {
    this.selectedItem.next(identifier);
  }

  resetWidget() {
    this.items = null;
    // this.selectedItems.next(null);
    return null;
  }

  onFilterHeaderFocus(event) {
    if (
      event.querySelector("label").offsetWidth <
      event.querySelector("label").scrollWidth
    ) {
      this.disableHeaderTooltip = false;
    } else {
      this.disableHeaderTooltip = true;
    }
  }

  onHeaderFocus(event) {
    if (event.offsetWidth < event.scrollWidth) {
      this.disableHeaderTooltip = false;
    } else {
      this.disableHeaderTooltip = true;
    }
  }

  ngOnInit() {
    this.reload.next();
  }

  ngOnDestroy() {
    this.unsubscribe.destroy();
  }
}
<nm-widgetframe
  [header]="configuration.configuration['header']"
  widgetId="{{ _id }}"
  [infoTitle]="title"
  [infoText]="configuration.configuration['infoText']"
  [infoPlacement]="'bottom'"
  [wikiLink]="configuration.configuration['wikiLink']"
>
  <div slot="title" class="nm-widgetframe__title">{{ title | translate }}</div>

  <div
    slot="content"
    class="nm-widgetframe__content"
    class="nm-itemlist {{ cssClass }}"
  >
    <p-dataTable
      [value]="items"
      emptyMessage=""
      *ngIf="items !== null"
      [paginator]="items?.length > 10"
      [rows]="10"
      [scrollable]="false"
      [pageLinks]="3"
      selectionMode="multiple"
      [(selection)]="selectedRows"
      (onRowSelect)="onRowSelectChange($event)"
      #dt
    >
      <p-headerColumnGroup *ngIf="headerColumnGroup">
        <!-- dimsGroupSpanHeader  removed
                <p-row>
                    <p-column *ngFor='let i of arr(dimsGroupColIndex).fill(1)' header=""></p-column>
                    <p-column [header]="dimsGroupSpanHeader | translate" [colspan]="dimsColsNo"></p-column>
                    <p-column *ngFor='let i of arr(cols?.length - dimsGroupColIndex - 1).fill(1)' header=""></p-column>
                </p-row>

                -->
        <p-row>
          <p-column
            *ngFor="let col of cols"
            [sortable]="col.sortable"
            [filter]="col.sortable"
            [field]="col.field"
            filterMatchMode="contains"
            [header]="col.header | translate"
          >
            <ng-template pTemplate="filter" let-col *ngIf="col.filter">
              <mat-form-field>
                <input
                  matInput
                  placeholder="{{ col.header }}"
                  type="text"
                  pInputText
                  class="ui-column-filter"
                  *ngIf="col.filter == true"
                  (click)="dt.onFilterInputClick($event)"
                  (input)="
                    dt.onFilterKeyup(
                      $event.target.value,
                      col.field,
                      col.filterMatchMode
                    )
                  "
                />
              </mat-form-field>
            </ng-template>

            <ng-template pTemplate="filter" let-col *ngIf="!col.filter">
              <span class="nm-column-title">{{ col.header }}</span>
            </ng-template>
          </p-column>
        </p-row>
      </p-headerColumnGroup>

      <p-column
        *ngFor="let col of cols"
        [sortable]="col.sortable"
        [filter]="col.sortable"
        [field]="col.field"
        filterMatchMode="contains"
        [header]="col.header | translate"
        [styleClass]="col.style"
      >
        <ng-template pTemplate="header" let-col *ngIf="!col.filter">
          <ng-container>
            <label
              class="header-label"
              pTooltip="{{ col.header | translate }}"
              [tooltipDisabled]="disableHeaderTooltip"
              (mouseenter)="onHeaderFocus($event.target)"
            >
              {{ col.header | translate }}
            </label>
          </ng-container>
        </ng-template>

        <ng-template pTemplate="filter" let-col *ngIf="col.filter">
          <mat-form-field
            pTooltip="{{ col.header | translate }}"
            [tooltipDisabled]="disableHeaderTooltip"
            (mouseenter)="onFilterHeaderFocus($event.target)"
          >
            <input
              matInput
              placeholder="{{ col.header }}"
              type="text"
              pInputText
              class="ui-column-filter"
              *ngIf="col.filter == true"
              (click)="dt.onFilterInputClick($event)"
              (input)="
                dt.onFilterKeyup(
                  $event.target.value,
                  col.field,
                  col.filterMatchMode
                )
              "
            />
          </mat-form-field>
        </ng-template>

        <ng-template
          let-col
          let-results="rowData"
          let-i="rowIndex"
          pTemplate
          type="body"
        >
          <div style="width: 100%">
            <div [ngSwitch]="col.field">
              <span *ngSwitchCase="'main-asset'">
                <nm-image
                  [container]="results"
                  asset="main-asset"
                  size="thumbnail"
                  width="auto"
                  height="auto"
                  max-width="48px"
                  max-height="48px"
                ></nm-image>
              </span>
              <span *ngSwitchCase="'image'">
                <nm-image
                  [container]="results"
                  asset="image"
                  size="thumbnail"
                  width="auto"
                  height="auto"
                  max-width="48px"
                  max-height="48px"
                  [no-preview]="true"
                ></nm-image>
              </span>
              <span class="linkable-element" *ngSwitchCase="'marketplaceUrl'">
                <a (click)="sendIdentifier(results[col.field])">
                  <nm-ellipsis [content]="results['name']"></nm-ellipsis>
                </a>
              </span>
              <span *ngSwitchCase="'index'">
                {{ i + 1 }}
              </span>

              <span *ngSwitchCase="'errorCode'">
                <a (click)="sendIdentifier([results.code])">
                  <nm-ellipsis
                    [content]="results.description + ' (' + results.code + ')'"
                  ></nm-ellipsis>
                </a>
              </span>

              <span class="icon-move-left" *ngSwitchCase="'info'">
                <ng-template #popMoreInfo>
                  <nm-ellipsis [content]="results['info']"></nm-ellipsis>
                </ng-template>
                <div
                  [popover]="popMoreInfo"
                  popoverTitle="{{ 'table.head.info' | translate }}"
                  placement="right"
                  container="body"
                  triggers="mouseenter:mouseleave"
                  class="nm-actions"
                >
                  <mat-icon color="primary">info</mat-icon>
                </div>
              </span>

              <span *ngSwitchCase="'taxRate'">
                <div *ngIf="results[col.field]">
                  <nm-ellipsis
                    [content]="
                      (results[col.field]
                        | number: '1.0-5':selectedUiLocaleString) + '%'
                    "
                  ></nm-ellipsis>
                </div>
              </span>

              <span *ngSwitchCase="'name'">
                <a
                  *ngIf="dataType == 'marketplaces'"
                  (click)="sendIdentifier(results['link'])"
                >
                  <nm-ellipsis [content]="results[col.field]"></nm-ellipsis>
                </a>
              </span>

              <nm-ellipsis
                *ngSwitchDefault
                [content]="results[col.field]"
              ></nm-ellipsis>
            </div>
          </div>
        </ng-template>
      </p-column>

      <footer>
        <div class="ui-helper-clearfix" style="width: 100%"></div>
      </footer>
    </p-dataTable>
  </div>
</nm-widgetframe>
Legend
Html element
Component
Html element with directive

results matching ""

    No results matching ""