nm-color-search
src/app/shared/widgets/apps/my-shop-md/color-search/color-search.component.ts
selector | nm-color-search |
styleUrls | color-search.component.scss |
templateUrl | ./color-search.component.html |
Widget inputs |
Widget outputs |
Properties |
|
Methods |
|
constructor(_widgetframeService: WidgetframeService, formBuilder: FormBuilder, _listService: ListService, localStorageService: LocalStorageService)
|
|||||||||||||||
Parameters :
|
Protected configureWidget | ||||||
configureWidget(configuration: WidgetConfig)
|
||||||
Decorators : WidgetConfigure
|
||||||
Parameters :
Returns :
void
|
doFreetextSearch | ||||
doFreetextSearch(value: )
|
||||
Parameters :
Returns :
void
|
doListSearch | ||||
doListSearch(value: )
|
||||
Parameters :
Returns :
void
|
doSearch | ||||
doSearch(value: )
|
||||
Parameters :
Returns :
void
|
keyDownFunction | ||||
keyDownFunction(event: )
|
||||
Parameters :
Returns :
void
|
Public ngOnInit |
ngOnInit()
|
Returns :
void
|
onChange |
onChange()
|
Returns :
void
|
resetFromLocalStorage | ||||||
resetFromLocalStorage(storageKeyEntry: LocalStorageEntry)
|
||||||
Parameters :
Returns :
void
|
Private switchToFreetextSearch |
switchToFreetextSearch()
|
Returns :
void
|
Private switchToListSearch |
switchToListSearch()
|
Returns :
void
|
toggleMode | ||||
toggleMode($event: )
|
||||
Parameters :
Returns :
void
|
Private updateTextField | ||||||
updateTextField(value: string)
|
||||||
Parameters :
Returns :
void
|
Public _id |
_id:
|
Type : string
|
Decorators : WidgetId
|
Private attributes |
attributes:
|
Type : any
|
Private clearCategorySearch |
clearCategorySearch:
|
Type : Subject<any>
|
Default value : new Subject<any>()
|
Decorators : WidgetOutput
|
Private clearChannel |
clearChannel:
|
Type : Subject<any>
|
Default value : new Subject<any>()
|
Decorators : WidgetInput
|
Public cols |
cols:
|
Type : any[]
|
Public configuration |
configuration:
|
Type : WidgetConfig
|
Decorators : WidgetConfiguration
|
Public enableListsearch |
enableListsearch:
|
Type : boolean
|
Public enableListSearchOnly |
enableListSearchOnly:
|
Type : boolean
|
Public enableTemplating |
enableTemplating:
|
Type : boolean
|
Default value : true
|
Public infotext |
infotext:
|
Type : string
|
Private inputChannel |
inputChannel:
|
Type : Subject<any>
|
Default value : new BehaviorSubject<any>(null)
|
Decorators : WidgetInput
|
Public inputLink |
inputLink:
|
Type : string
|
Public inputLinklistSearch |
inputLinklistSearch:
|
Type : string
|
Public listsearch |
listsearch:
|
Type : boolean
|
Default value : false
|
Public localstorageIsListSearchEntry |
localstorageIsListSearchEntry:
|
Type : LocalStorageEntry
|
Private localstorageListsearchEntry |
localstorageListsearchEntry:
|
Type : LocalStorageEntry
|
Private localstorageSearchEntry |
localstorageSearchEntry:
|
Type : LocalStorageEntry
|
Public placeholderkey |
placeholderkey:
|
Private resetChannel |
resetChannel:
|
Type : Subject<any>
|
Default value : new Subject<any>()
|
Decorators : WidgetInput
|
Private returnPressed |
returnPressed:
|
Type : Subject<any>
|
Default value : new Subject<any>()
|
Decorators : WidgetOutput
|
Public searchform |
searchform:
|
Type : FormGroup
|
Private storageValue |
storageValue:
|
Type : Subject<any>
|
Default value : new ReplaySubject<any>(1)
|
string |
string:
|
Private sub |
sub:
|
Public title |
title:
|
Type : string
|
Private triggerSearch |
triggerSearch:
|
Type : Subject<any>
|
Default value : new Subject<any>()
|
Decorators : WidgetOutput
|
Private uri |
uri:
|
Type : Subject<any>
|
Default value : new ReplaySubject<any>(1)
|
Decorators : WidgetOutput
|
Public wikiLink |
wikiLink:
|
Type : string
|
import {
combineLatest as observableCombineLatest,
Subject,
Observable,
ReplaySubject,
BehaviorSubject,
} from "rxjs";
import { distinctUntilChanged, filter } from "rxjs/operators";
import { Component } from "@angular/core";
import { WidgetframeService } from "../../../widgetframe/widgetframe.service";
import { WidgetConfig } from "../../../widget.configuration";
import {
WidgetComponent,
WidgetConfiguration,
WidgetConfigure,
WidgetId,
WidgetInput,
WidgetOutput,
} from "../../../widget.metadata";
import { FormBuilder, FormGroup } from "@angular/forms";
import { ListService } from "../../../list/index";
import * as uriTemplates_ from "uri-templates";
import {
LocalStorageEntry,
LocalStorageService,
} from "../../../../components/local-storage/local-storage.service";
import {
DeletionMode,
Scope,
} from "../../../../components/local-storage/local-storage-constants";
const uriTemplates = uriTemplates_;
@WidgetComponent("nm-color-search")
@Component({
selector: "nm-color-search",
templateUrl: "./color-search.component.html",
styleUrls: ["./color-search.component.scss"],
})
export class ColorSearchWidgetComponent {
public cols: any[];
private attributes: any;
public inputLink: string;
public wikiLink: string;
public infotext: string;
public title: string;
public inputLinklistSearch: string;
public enableListsearch: boolean;
public enableListSearchOnly: boolean;
public enableTemplating: boolean = true;
public placeholderkey;
string;
public localstorageIsListSearchEntry: LocalStorageEntry;
private localstorageSearchEntry: LocalStorageEntry;
private localstorageListsearchEntry: LocalStorageEntry;
@WidgetConfiguration()
public configuration: WidgetConfig;
@WidgetOutput("uri")
private uri: Subject<any> = new ReplaySubject<any>(1);
@WidgetInput("reset")
private resetChannel: Subject<any> = new Subject<any>();
@WidgetInput("set")
private inputChannel: Subject<any> = new BehaviorSubject<any>(null);
@WidgetInput("cleartextsearch")
private clearChannel: Subject<any> = new Subject<any>();
@WidgetOutput("clearcategorysearch")
private clearCategorySearch: Subject<any> = new Subject<any>();
@WidgetOutput("triggerSearch")
private triggerSearch: Subject<any> = new Subject<any>();
@WidgetOutput("returnPressed")
private returnPressed: Subject<any> = new Subject<any>();
private storageValue: Subject<any> = new ReplaySubject<any>(1);
@WidgetId()
public _id: string;
private sub;
public searchform: FormGroup;
public listsearch: boolean = false;
constructor(
private _widgetframeService: WidgetframeService,
private formBuilder: FormBuilder,
private _listService: ListService,
private localStorageService: LocalStorageService
) {
this.searchform = this.formBuilder.group({
searchInput: "",
});
}
keyDownFunction(event) {
if (event.keyCode == 13 && !this.listsearch) {
this.triggerSearch.next(new Date());
this.returnPressed.next(new Date());
}
}
onChange() {
if (!(this.listsearch || this.enableListSearchOnly)) {
this.doFreetextSearch(this.searchform.value.searchInput);
}
if (this.listsearch) {
this.doListSearch(this.searchform.value.searchInput);
}
}
doListSearch(value) {
this.clearCategorySearch.next(Date.now);
if (value) {
this.localstorageListsearchEntry.value = value;
}
if (this.enableTemplating) {
let uriParams = { q: value };
let link = uriTemplates(this.inputLink).fill(uriParams);
this.uri.next(link);
} else {
this.uri.next(value);
}
}
doFreetextSearch(value) {
this.clearCategorySearch.next(Date.now);
this.localstorageSearchEntry.value = value;
if (this.enableTemplating) {
let uriParams = { q: value };
let link = uriTemplates(this.inputLink).fill(uriParams);
this.uri.next(link);
} else {
this.uri.next(value);
}
}
toggleMode($event) {
if ($event.checked) {
this.switchToListSearch();
} else {
this.switchToFreetextSearch();
}
}
private switchToFreetextSearch() {
this.listsearch = false;
this.localstorageIsListSearchEntry.value = "false";
this.infotext = this.configuration.configuration["infoText"];
this.title = this.configuration.configuration["title"];
this.resetFromLocalStorage(this.localstorageSearchEntry);
}
private switchToListSearch() {
this.listsearch = true;
this.localstorageIsListSearchEntry.value = "true";
this.infotext = this.configuration.configuration["infoText-listsearch"];
this.title = this.configuration.configuration["title-listsearch"];
this.resetFromLocalStorage(this.localstorageListsearchEntry);
}
resetFromLocalStorage(storageKeyEntry: LocalStorageEntry) {
let value = storageKeyEntry.value;
this.storageValue.next(value);
this.updateTextField(value);
}
private updateTextField(value: string) {
this.searchform.setValue({
searchInput: value || "",
});
window.setTimeout(() => {
this.searchform.patchValue({
searchInput: value || "",
});
}, 1);
}
doSearch(value) {
this.updateTextField(value);
if (this.listsearch || this.enableListSearchOnly) {
this.doListSearch(value);
} else {
this.doFreetextSearch(value);
}
}
@WidgetConfigure()
protected configureWidget(configuration: WidgetConfig) {
this.enableListsearch = this.configuration.configuration[
"enableListsearch"
];
this.enableListSearchOnly = this.configuration.configuration[
"enableListSearchOnly"
];
if (this.configuration.configuration["enableTemplating"] != undefined) {
this.enableTemplating = this.configuration.configuration[
"enableTemplating"
];
}
this.wikiLink = this.configuration.configuration["wikiLink"];
this.inputLink = this.configuration.configuration["links"]["search"];
this.inputLinklistSearch = this.configuration.configuration["links"][
"listSearch"
];
this.localstorageSearchEntry = this.localStorageService.getLocalStorageEntry(
this.configuration.configuration["scope"] +
this.configuration.configuration["localstorage-search"],
Scope.GLOBAL,
DeletionMode.LOGIN
);
this.localstorageListsearchEntry = this.localStorageService.getLocalStorageEntry(
this.configuration.configuration["scope"] +
this.configuration.configuration["localstorage-listsearch"],
Scope.GLOBAL,
DeletionMode.LOGIN
);
this.localstorageIsListSearchEntry = this.localStorageService.getLocalStorageEntry(
this.configuration.configuration["scope"] + "nm-product-listsearch",
Scope.GLOBAL,
DeletionMode.LOGIN
);
this.placeholderkey = this.configuration.configuration["placeholderkey"]
? this.configuration.configuration["placeholderkey"]
: "elasticsearch.search.paceholder";
if (
this.localstorageIsListSearchEntry.exists() &&
(this.enableListsearch || this.enableListSearchOnly)
) {
this.listsearch =
this.localstorageIsListSearchEntry.value === "true" ? true : false;
}
if (this.listsearch || this.enableListSearchOnly) {
this.switchToListSearch();
} else {
this.switchToFreetextSearch();
}
this.resetChannel.asObservable().subscribe((reset) => {
this.localstorageSearchEntry.clear();
this.localstorageListsearchEntry.clear();
this.doSearch("");
});
this.clearChannel.asObservable().subscribe((reset) => {
this.localstorageSearchEntry.clear();
this.localstorageListsearchEntry.clear();
this.updateTextField("");
});
}
public ngOnInit() {
observableCombineLatest(
this.storageValue,
this.inputChannel,
(storage, input) => {
if (input) {
return input;
}
return storage;
}
)
.pipe(
filter((value) => value),
distinctUntilChanged()
)
.subscribe((value) => this.doSearch(value));
}
}
<nm-widgetframe
[header]="configuration.configuration['header']"
[ngClass]="{ 'nm-widgetframe__content-color-search': listsearch }"
[configuration]="configuration"
[width]="configuration.configuration['width']"
widgetId="{{ _id }}"
[infoTitle]="title"
[infoText]="configuration.configuration['infoText']"
[infoPlacement]="'bottom'"
[wikiLink]="wikiLink"
>
<div slot="title" class="nm-widgetframe__title" style="width: 100%">
<span style="float: left"> {{ title | translate }} </span>
<div style="" *ngIf="enableListsearch">
<mat-slide-toggle
popover="{{ 'infotext.switchsearchmode' | translate }}"
placement="top"
container="body"
triggers="mouseenter:mouseleave"
[(ngModel)]="listsearch"
(change)="toggleMode($event)"
></mat-slide-toggle>
</div>
</div>
<div slot="content" class="nm-widgetframe__content">
<form
class="login-form"
[formGroup]="searchform"
(keydown)="keyDownFunction($event)"
>
<mat-form-field *ngIf="!enableListSearchOnly && !listsearch">
<input
matInput
(input)="onChange()"
id="in"
class="nm-searchinput"
placeholder="{{ placeholderkey | translate }}"
assetType="search"
formControlName="searchInput"
/>
<span matPrefix>
<mat-icon class="mat-24">search</mat-icon>
</span>
</mat-form-field>
<div *ngIf="listsearch || enableListSearchOnly" style="margin-top: 20px">
<textarea
(input)="onChange()"
style="
width: 100%;
min-height: 30px;
height: 60px;
padding-bottom: 10px;
"
formControlName="searchInput"
>
</textarea>
<label class="nm-small-lable nm-textarea-label">{{
"searchlist.placeholder" | translate
}}</label>
</div>
</form>
</div>
</nm-widgetframe>