nm-item-list
src/app/shared/widgets/itemlist/itemlist.component.ts
providers |
WidgetframeService
|
selector | nm-item-list |
styleUrls | itemlist.component.scss |
templateUrl | ./itemlist.component.html |
Widget inputs |
Widget outputs |
Properties |
|
Methods |
constructor(_widgetframeService: WidgetframeService, currentLocaleService: CurrentLocaleService)
|
|||||||||
Parameters :
|
Protected configureWidget | ||||||
configureWidget(configuration: WidgetConfig)
|
||||||
Decorators : WidgetConfigure
|
||||||
Parameters :
Returns :
void
|
ngOnDestroy |
ngOnDestroy()
|
Returns :
void
|
ngOnInit |
ngOnInit()
|
Returns :
void
|
onFilterHeaderFocus | ||||
onFilterHeaderFocus(event: )
|
||||
Parameters :
Returns :
void
|
onHeaderFocus | ||||
onHeaderFocus(event: )
|
||||
Parameters :
Returns :
void
|
onRowSelectChange | ||||
onRowSelectChange($event: )
|
||||
Parameters :
Returns :
void
|
populateTable | ||||||
populateTable(data: , configuration: )
|
||||||
Parameters :
Returns :
void
|
resetWidget |
resetWidget()
|
Returns :
any
|
sendIdentifier | ||||
sendIdentifier(identifier: )
|
||||
Parameters :
Returns :
void
|
Public _id |
_id:
|
Decorators : WidgetId
|
Public arr |
arr:
|
Default value : Array
|
Public cols |
cols:
|
Type : any[]
|
Public configuration |
configuration:
|
Type : WidgetConfig
|
Decorators : WidgetConfiguration
|
Public cssClass |
cssClass:
|
Type : string
|
Public dataType |
dataType:
|
Type : string
|
Default value : "items"
|
Public dimsColsNo |
dimsColsNo:
|
Type : number
|
Public dimsGroupColIndex |
dimsGroupColIndex:
|
Type : number
|
Public dimsGroupSpanHeader |
dimsGroupSpanHeader:
|
Type : any
|
Public disableHeaderTooltip |
disableHeaderTooltip:
|
Type : boolean
|
Default value : true
|
Public genericItemList |
genericItemList:
|
Public headerColumnGroup |
headerColumnGroup:
|
Type : boolean
|
Public inputLink |
inputLink:
|
Type : string
|
Public items |
items:
|
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:
|
Type : Subject<any>
|
Default value : new Subject<any>()
|
Decorators : WidgetOutput
|
Private selectedItems |
selectedItems:
|
Type : Subject<any>
|
Default value : new Subject<any>()
|
Decorators : WidgetOutput
|
Public selectedRows |
selectedRows:
|
Type : any[]
|
Default value : []
|
Public selectedUiLocaleString |
selectedUiLocaleString:
|
Type : string
|
Default value : "de-DE"
|
Public title |
title:
|
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>