nm-product-info
src/app/shared/widgets/apps/my-texter/product-info/product-info.component.ts
selector | nm-product-info |
styleUrls | product-info.component.scss |
templateUrl | ./product-info.component.html |
Widget inputs |
Widget outputs |
Properties |
|
Methods |
|
constructor(_widgetframeService: WidgetframeService)
|
||||||
Parameters :
|
Protected configureWidget | ||||||
configureWidget(configuration: WidgetConfig)
|
||||||
Decorators : WidgetConfigure
|
||||||
Parameters :
Returns :
void
|
ngOnDestroy |
ngOnDestroy()
|
Returns :
void
|
resetWidget |
resetWidget()
|
Returns :
any
|
Public _id |
_id:
|
Decorators : WidgetId
|
Public assetHref |
assetHref:
|
Default value : new ReplaySubject<any>(1)
|
Public cols |
cols:
|
Type : any[]
|
Public configuration |
configuration:
|
Type : WidgetConfig
|
Decorators : WidgetConfiguration
|
Public header |
header:
|
Type : any
|
Public manufacturerImage |
manufacturerImage:
|
Type : any
|
Default value : ""
|
Public product |
product:
|
Type : any
|
Public productNo |
productNo:
|
Type : string
|
Public productNoForProduct |
productNoForProduct:
|
Default value : new Subject<any>()
|
Decorators : WidgetInput
|
public |
public:
|
Default value : new Subject<any>()
|
Decorators : WidgetInput
|
Public reload |
reload:
|
Default value : new Subject<any>()
|
Decorators : WidgetInput
|
Public resetWidgets |
resetWidgets:
|
Default value : new Subject<any>()
|
Decorators : WidgetInput
|
Public title |
title:
|
Type : string
|
Private unsubscribe |
unsubscribe:
|
Default value : NgUnsubscribe.create()
|
Public uri |
uri:
|
Default value : new Subject<any>()
|
Decorators : WidgetInput
|
import {
combineLatest as observableCombineLatest,
Subject,
ReplaySubject,
Observable,
} from "rxjs";
import {
onErrorResumeNext,
filter,
map,
distinctUntilChanged,
mergeMap,
takeUntil,
} from "rxjs/operators";
import { Component } from "@angular/core";
import { WidgetframeService } from "../../../widgetframe/widgetframe.service";
import { WidgetConfig } from "../../../widget.configuration";
import {
WidgetComponent,
WidgetId,
WidgetConfiguration,
WidgetConfigure,
WidgetInput,
} from "../../../widget.metadata";
import * as uriTemplates_ from "uri-templates";
const uriTemplates = uriTemplates_;
import { NgUnsubscribe } from "../../../../ng-unsubscribe";
declare var $: any;
@WidgetComponent("nm-product-info")
@Component({
selector: "nm-product-info",
templateUrl: "./product-info.component.html",
styleUrls: ["./product-info.component.scss"],
})
export class ProductInfoWidgetComponent {
public cols: any[];
public header: any;
public product: any;
public manufacturerImage: any = "";
public assetHref = new ReplaySubject<any>(1);
public title: string;
public productNo: string;
private unsubscribe = NgUnsubscribe.create();
@WidgetId()
public _id;
@WidgetInput()
public resetWidgets = new Subject<any>();
@WidgetInput()
public productNoForProduct = new Subject<any>();
@WidgetInput()
public uri = new Subject<any>();
@WidgetInput()
public reload = new Subject<any>();
@WidgetConfiguration()
public configuration: WidgetConfig;
@WidgetInput()
public = new Subject<any>();
constructor(private _widgetframeService: WidgetframeService) {
this.header = null;
this.product = [];
}
@WidgetConfigure()
protected configureWidget(configuration: WidgetConfig) {
this.title = this.configuration.configuration["title"];
this.resetWidgets.subscribe((data) => {
this.header = null;
});
let headerHref = configuration._links["product-info-header"]["href"];
// let headerHref = "/api/core/products/{product}/content?type=overview&data-locale=de_DE&locale=de-DE&attributes:filter=identifier%3Ain%3A%22WebshopText%2CBasicText%2CBrand%2CSubBrand%2CSalesCategoryLower%2CSalesCategoryUpper%22"
let headerTemplate = uriTemplates(headerHref);
observableCombineLatest(
this.productNoForProduct.asObservable(),
this.reload.asObservable(),
(productNoForProduct, reloadEvent) => productNoForProduct
)
.pipe(
filter((productNoForProduct) => !!productNoForProduct),
map((number) => headerTemplate.fill({ product: number })),
mergeMap((href) =>
this._widgetframeService
.getData(href)
.pipe(onErrorResumeNext(this.resetWidget()))
),
takeUntil(this.unsubscribe),
map((data) => <any>data)
)
.subscribe(
(data) => {
this.header = {};
this.header = data;
if (
data["attributes"] &&
data["attributes"].hasOwnProperty("default")
) {
for (let attribute of data["attributes"]["default"]) {
if (attribute.identifier === "Brand") {
this.header["Brand"] = attribute.value;
}
if (attribute.identifier === "SubBrand") {
this.header["SubBrand"] = attribute.value;
}
if (attribute.identifier === "SalesCategoryLower") {
this.header["SalesCategoryLower"] = attribute.value;
}
if (attribute.identifier === "SalesCategoryUpper") {
this.header["SalesCategoryUpper"] = attribute.value;
}
if (attribute.identifier === "WebshopText") {
this.header["WebshopText"] = attribute.value;
}
}
}
// JQuery helper to position nm-categorypath at the bottom without knowing the height.
window.setTimeout(() =>
$(".nm-featurelist").css(
"padding-bottom",
$(".nm-categorypath").height()
)
);
},
(error) => {
console.log(error);
this.header = null;
}
);
let productHref = configuration._links["product"]["href"];
let productTemplate = uriTemplates(productHref);
observableCombineLatest(
this.productNoForProduct.asObservable().pipe(distinctUntilChanged()),
this.reload.asObservable(),
(productNoForProduct, reloadEvent) => productNoForProduct
)
.pipe(
filter((productNoForProduct) => !!productNoForProduct),
map((number) => productTemplate.fill({ product: number })),
mergeMap((href) => this._widgetframeService.getData(href)),
takeUntil(this.unsubscribe)
)
.subscribe(
(data) => (this.product = data),
(error) => {
console.log(error);
var err = JSON.parse(error.text());
}
);
this.productNoForProduct
.asObservable()
.pipe(takeUntil(this.unsubscribe))
.subscribe((number) => {
this.productNo = number;
let assetHref = configuration._links["assets"]["href"];
let assetTemplate = uriTemplates(assetHref);
this.assetHref.next(assetTemplate.fill({ product: number }));
});
}
resetWidget() {
this.header = null;
this.resetWidgets.next(new Date());
return null;
}
ngOnDestroy() {
this.unsubscribe.destroy();
}
}
<nm-widgetframe
[header]="configuration.configuration['header']"
widgetId="{{ _id }}"
>
<div slot="title" class="nm-widgetframe__title">
{{ title | translate }}
<nm-help-icon
*ngIf="configuration.configuration['infoText']"
style="position: absolute; display: inline; right: 50px; z-index: 666"
[info-text]="configuration.configuration['infoText'] | translate"
[info-title]="configuration.configuration['title'] | translate"
[info-placement]="'left'"
[wiki-link]="configuration.configuration['wikiLink']"
></nm-help-icon>
</div>
<div slot="content" class="nm-widgetframe__content" style="min-height: 62px">
<nm-gallery
[href]="assetHref"
[thumbnailsEnabled]="false"
[width]="'250px'"
*ngIf="header !== null"
>
</nm-gallery>
<div class="info" *ngIf="header !== null">
<h3>{{ header.description }}</h3>
<div>{{ productNo }}</div>
<div>{{ header.manufacturer }}</div>
<div>{{ header.Brand }} {{ header.SubBrand }}</div>
<div *ngIf="header.SalesCategoryLower !== null">
{{ header.SalesCategoryLower }} {{ header.SalesCategoryUpper }}
</div>
<span> </span>
<div class="nm-bottom">
<div class="nm-categorypath">{{ header.WebshopText }}</div>
</div>
</div>
</div>
</nm-widgetframe>