ng-materialgrammi
Version:
An Angular framework which follows
136 lines • 17.3 kB
JavaScript
import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
import { FormControl } from '@angular/forms';
import * as i0 from "@angular/core";
import * as i1 from "../input/input.component";
import * as i2 from "@angular/common";
;
export class SelectComponent {
constructor(eRef) {
this.eRef = eRef;
this.value = new EventEmitter();
this.searchOpt = new FormControl('');
this.theme = "dark";
this.selectTitle = "Select";
this.selectType = "control";
this.enableSearch = false;
this.options = [{
name: "Option 01",
val: "option_1"
}, {
name: "Option 02",
val: "option_2"
}, {
name: "Option 03",
val: "option_3"
}, {
name: "Option 04",
val: "option_4"
}, {
name: "Option 05",
val: "option_5"
}];
this.selectedOption = {
name: "",
val: ""
};
this.highlighted = "";
this.optionsActive = false;
this.titleDisplay = this.selectTitle;
this.selectInput = new FormControl("");
}
ngOnInit() {
}
clickout(event) {
if (!this.eRef.nativeElement.contains(event.target)) {
this.searchOpt.setValue("");
this.optionsActive = false;
}
}
handleKeyboardEvent(event) {
this.searchOpt.setValue("");
this.optionsActive = false;
}
toggleOptions() {
this.optionsActive = !this.optionsActive;
}
optionsClasses() {
let classes = ``;
classes += this.optionsActive ? "active" : "";
return classes;
}
selectOption(opt) {
this.value.emit(opt.val);
this.selectedOption = opt;
this.titleDisplay = this.selectedOption ? this.selectedOption.name : this.selectTitle;
this.selectInput.setValue(opt.val);
this.toggleOptions();
}
isHighlighted(name) {
if (this.highlighted == name) {
return "highlighted";
}
else {
return "";
}
}
searchFromOptions(val) {
let enterPressed = false;
if (val && val.code == "Enter" || val.key == "Enter") {
enterPressed = true;
}
val = val.target.value;
var opt = false;
for (let i = 0; i < this.options.length; i++) {
if (val.length > 0 && this.options[i].name.indexOf(val) > 1) {
this.highlighted = this.options[i].name;
opt = this.options[i];
}
else if (val.length > 0 && this.options[i].val.indexOf(val) > 1) {
this.highlighted = this.options[i].name;
opt = this.options[i];
}
}
if (val.length < 1) {
this.highlighted = "";
}
if (enterPressed && this.highlighted.length > 0) {
this.searchOpt.setValue("");
this.selectOption(opt);
}
}
inputTheme() {
if (["primary", "success", "danger", "dark", "info"].includes(this.theme)) {
return "lite";
}
else {
return "dark";
}
}
}
SelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: SelectComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
SelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: SelectComponent, selector: "mg-select", inputs: { searchOpt: "searchOpt", theme: "theme", selectTitle: "selectTitle", selectType: "selectType", enableSearch: "enableSearch", options: "options" }, outputs: { value: "value" }, host: { listeners: { "document:click": "clickout($event)", "document:keydown.escape": "handleKeyboardEvent($event)" } }, ngImport: i0, template: "<div class=\"select-wrapper {{theme}} select-{{selectType}}\">\n <div class=\"select-title\" (click)=\"toggleOptions()\"><span [innerHtml]=\"titleDisplay\"></span> <span class=\"right\"><i class=\"fas fa-chevron-down\"></i></span></div>\n <div class=\"select-options\" [ngClass]=\"optionsClasses()\">\n <ng-container *ngIf=\"enableSearch\">\n <mg-input placeholder=\"search\" [theme]=\"inputTheme()\" (keyup)=\"searchFromOptions($event)\" [filled]=\"true\"></mg-input>\n </ng-container>\n <hr>\n <div class=\"select-option\" [ngClass]=\"isHighlighted(opt.name)\" *ngFor=\"let opt of options\" [innerHtml]=\"opt.name\" (click)=\"selectOption(opt)\"></div>\n </div>\n</div>\n", styles: [""], components: [{ type: i1.InputComponent, selector: "mg-input", inputs: ["theme", "form", "placeholder", "control", "type", "dark", "class", "value", "rounded", "filled", "info"], outputs: ["data", "isFocused", "keyup"] }], directives: [{ type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: SelectComponent, decorators: [{
type: Component,
args: [{ selector: 'mg-select', template: "<div class=\"select-wrapper {{theme}} select-{{selectType}}\">\n <div class=\"select-title\" (click)=\"toggleOptions()\"><span [innerHtml]=\"titleDisplay\"></span> <span class=\"right\"><i class=\"fas fa-chevron-down\"></i></span></div>\n <div class=\"select-options\" [ngClass]=\"optionsClasses()\">\n <ng-container *ngIf=\"enableSearch\">\n <mg-input placeholder=\"search\" [theme]=\"inputTheme()\" (keyup)=\"searchFromOptions($event)\" [filled]=\"true\"></mg-input>\n </ng-container>\n <hr>\n <div class=\"select-option\" [ngClass]=\"isHighlighted(opt.name)\" *ngFor=\"let opt of options\" [innerHtml]=\"opt.name\" (click)=\"selectOption(opt)\"></div>\n </div>\n</div>\n", styles: [""] }]
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { value: [{
type: Output
}], searchOpt: [{
type: Input
}], theme: [{
type: Input
}], selectTitle: [{
type: Input
}], selectType: [{
type: Input
}], enableSearch: [{
type: Input
}], options: [{
type: Input
}], clickout: [{
type: HostListener,
args: ['document:click', ['$event']]
}], handleKeyboardEvent: [{
type: HostListener,
args: ['document:keydown.escape', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsZ3JhbW1pL3NyYy9saWIvY29tcG9uZW50cy9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsZ3JhbW1pL3NyYy9saWIvY29tcG9uZW50cy9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQU01QyxDQUFDO0FBT0YsTUFBTSxPQUFPLGVBQWU7SUFzQzFCLFlBQW9CLElBQWdCO1FBQWhCLFNBQUksR0FBSixJQUFJLENBQVk7UUFyQzFCLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzVCLGNBQVMsR0FBZ0IsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0MsVUFBSyxHQUFtQixNQUFNLENBQUM7UUFDL0IsZ0JBQVcsR0FBRyxRQUFRLENBQUM7UUFDdkIsZUFBVSxHQUFHLFNBQVMsQ0FBQztRQUN2QixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixZQUFPLEdBQWEsQ0FBQztnQkFDNUIsSUFBSSxFQUFFLFdBQVc7Z0JBQ2pCLEdBQUcsRUFBRSxVQUFVO2FBQ2hCLEVBQUU7Z0JBQ0QsSUFBSSxFQUFFLFdBQVc7Z0JBQ2pCLEdBQUcsRUFBRSxVQUFVO2FBQ2hCLEVBQUU7Z0JBQ0QsSUFBSSxFQUFFLFdBQVc7Z0JBQ2pCLEdBQUcsRUFBRSxVQUFVO2FBQ2hCLEVBQUU7Z0JBQ0QsSUFBSSxFQUFFLFdBQVc7Z0JBQ2pCLEdBQUcsRUFBRSxVQUFVO2FBQ2hC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LEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBcUNOLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFRMUMsbUJBQW1CO3NCQURsQixZQUFZO3VCQUFDLHlCQUF5QixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRoZW1lIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbiB7XG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsOiBhbnlcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21nLXNlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zZWxlY3QuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIFNlbGVjdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBPdXRwdXQoKSB2YWx1ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQElucHV0KCkgc2VhcmNoT3B0OiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG4gIEBJbnB1dCgpIHRoZW1lOiBUaGVtZSB8IHN0cmluZyA9IFwiZGFya1wiO1xuICBASW5wdXQoKSBzZWxlY3RUaXRsZSA9IFwiU2VsZWN0XCI7XG4gIEBJbnB1dCgpIHNlbGVjdFR5cGUgPSBcImNvbnRyb2xcIjtcbiAgQElucHV0KCkgZW5hYmxlU2VhcmNoID0gZmFsc2U7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IE9wdGlvbltdID0gW3tcbiAgICBuYW1lOiBcIk9wdGlvbiAwMVwiLFxuICAgIHZhbDogXCJvcHRpb25fMVwiXG4gIH0sIHtcbiAgICBuYW1lOiBcIk9wdGlvbiAwMlwiLFxuICAgIHZhbDogXCJvcHRpb25fMlwiXG4gIH0sIHtcbiAgICBuYW1lOiBcIk9wdGlvbiAwM1wiLFxuICAgIHZhbDogXCJvcHRpb25fM1wiXG4gIH0sIHtcbiAgICBuYW1lOiBcIk9wdGlvbiAwNFwiLFxuICAgIHZhbDogXCJvcHRpb25fNFwiXG4gIH0sIHtcbiAgICBuYW1lOiBcIk9wdGlvbiAwNVwiLFxuICAgIHZhbDogXCJvcHRpb25fNVwiXG4gIH1dO1xuXG4gIHNlbGVjdGVkT3B0aW9uID0ge1xuICAgIG5hbWU6IFwiXCIsXG4gICAgdmFsOiBcIlwiXG4gIH07XG5cbiAgaGlnaGxpZ2h0ZWQgPSBcIlwiO1xuXG4gIG9wdGlvbnNBY3RpdmUgPSBmYWxzZTtcblxuICB0aXRsZURpc3BsYXkgPSB0aGlzLnNlbGVjdFRpdGxlO1xuXG4gIHNlbGVjdElucHV0ID0gbmV3IEZvcm1Db250cm9sKFwiXCIpO1xuXG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlUmVmOiBFbGVtZW50UmVmKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgY2xpY2tvdXQoZXZlbnQ6YW55KSB7XG4gICAgaWYoIXRoaXMuZVJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHRoaXMuc2VhcmNoT3B0LnNldFZhbHVlKFwiXCIpO1xuICAgICAgdGhpcy5vcHRpb25zQWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlS2V5Ym9hcmRFdmVudChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIHRoaXMuc2VhcmNoT3B0LnNldFZhbHVlKFwiXCIpO1xuICAgIHRoaXMub3B0aW9uc0FjdGl2ZSA9IGZhbHNlO1xuICB9XG5cbiAgdG9nZ2xlT3B0aW9ucygpIHtcbiAgICB0aGlzLm9wdGlvbnNBY3RpdmUgPSAhdGhpcy5vcHRpb25zQWN0aXZlO1xuICB9XG5cbiAgb3B0aW9uc0NsYXNzZXMoKSB7XG4gICAgbGV0IGNsYXNzZXMgPSBgYDtcbiAgICBjbGFzc2VzICs9IHRoaXMub3B0aW9uc0FjdGl2ZSA/IFwiYWN0aXZlXCIgOiBcIlwiO1xuICAgIHJldHVybiBjbGFzc2VzO1xuICB9XG5cbiAgc2VsZWN0T3B0aW9uKG9wdDogYW55KSB7XG4gICAgdGhpcy52YWx1ZS5lbWl0KG9wdC52YWwpO1xuICAgIHRoaXMuc2VsZWN0ZWRPcHRpb24gPSBvcHQ7XG4gICAgdGhpcy50aXRsZURpc3BsYXkgPSB0aGlzLnNlbGVjdGVkT3B0aW9uID8gdGhpcy5zZWxlY3RlZE9wdGlvbi5uYW1lIDogdGhpcy5zZWxlY3RUaXRsZTtcbiAgICB0aGlzLnNlbGVjdElucHV0LnNldFZhbHVlKG9wdC52YWwpO1xuICAgIHRoaXMudG9nZ2xlT3B0aW9ucygpO1xuICB9XG5cbiAgaXNIaWdobGlnaHRlZChuYW1lOnN0cmluZyl7XG4gICAgaWYodGhpcy5oaWdobGlnaHRlZCA9PSBuYW1lKXtcbiAgICAgIHJldHVybiBcImhpZ2hsaWdodGVkXCI7XG4gICAgfWVsc2V7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gIH1cblxuICBzZWFyY2hGcm9tT3B0aW9ucyh2YWw6YW55KXtcbiAgICBsZXQgZW50ZXJQcmVzc2VkID0gZmFsc2U7XG4gICAgaWYodmFsICYmIHZhbC5jb2RlID09IFwiRW50ZXJcIiB8fCB2YWwua2V5ID09IFwiRW50ZXJcIil7XG4gICAgICBlbnRlclByZXNzZWQgPSB0cnVlO1xuICAgIH1cbiAgICB2YWwgPSB2YWwudGFyZ2V0LnZhbHVlO1xuICAgIHZhciBvcHQ6YW55ID0gZmFsc2U7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYodmFsLmxlbmd0aCA+IDAgJiYgdGhpcy5vcHRpb25zW2ldLm5hbWUuaW5kZXhPZih2YWwpID4gMSl7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWQgPSB0aGlzLm9wdGlvbnNbaV0ubmFtZTtcbiAgICAgICAgb3B0ID0gdGhpcy5vcHRpb25zW2ldO1xuICAgICAgfWVsc2UgaWYodmFsLmxlbmd0aCA+IDAgJiYgdGhpcy5vcHRpb25zW2ldLnZhbC5pbmRleE9mKHZhbCkgPiAxKXtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRlZCA9IHRoaXMub3B0aW9uc1tpXS5uYW1lO1xuICAgICAgICBvcHQgPSB0aGlzLm9wdGlvbnNbaV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmKHZhbC5sZW5ndGggPCAxKXtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0ZWQgPSBcIlwiO1xuICAgIH1cbiAgICBpZihlbnRlclByZXNzZWQgJiYgdGhpcy5oaWdobGlnaHRlZC5sZW5ndGggPiAwKXtcbiAgICAgIHRoaXMuc2VhcmNoT3B0LnNldFZhbHVlKFwiXCIpO1xuICAgICAgdGhpcy5zZWxlY3RPcHRpb24ob3B0KTtcbiAgICB9XG4gIH1cblxuICBpbnB1dFRoZW1lKCl7XG4gICAgaWYoW1wicHJpbWFyeVwiLCBcInN1Y2Nlc3NcIiwgXCJkYW5nZXJcIiwgXCJkYXJrXCIsIFwiaW5mb1wiXS5pbmNsdWRlcyh0aGlzLnRoZW1lKSl7XG4gICAgICByZXR1cm4gXCJsaXRlXCI7XG4gICAgfWVsc2V7XG4gICAgICByZXR1cm4gXCJkYXJrXCI7XG4gICAgfVxuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlciB7e3RoZW1lfX0gc2VsZWN0LXt7c2VsZWN0VHlwZX19XCI+XG4gIDxkaXYgY2xhc3M9XCJzZWxlY3QtdGl0bGVcIiAoY2xpY2spPVwidG9nZ2xlT3B0aW9ucygpXCI+PHNwYW4gW2lubmVySHRtbF09XCJ0aXRsZURpc3BsYXlcIj48L3NwYW4+IDxzcGFuIGNsYXNzPVwicmlnaHRcIj48aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWRvd25cIj48L2k+PC9zcGFuPjwvZGl2PlxuICA8ZGl2IGNsYXNzPVwic2VsZWN0LW9wdGlvbnNcIiBbbmdDbGFzc109XCJvcHRpb25zQ2xhc3NlcygpXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVuYWJsZVNlYXJjaFwiPlxuICAgICAgPG1nLWlucHV0IHBsYWNlaG9sZGVyPVwic2VhcmNoXCIgW3RoZW1lXT1cImlucHV0VGhlbWUoKVwiIChrZXl1cCk9XCJzZWFyY2hGcm9tT3B0aW9ucygkZXZlbnQpXCIgW2ZpbGxlZF09XCJ0cnVlXCI+PC9tZy1pbnB1dD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8aHI+XG4gICAgPGRpdiBjbGFzcz1cInNlbGVjdC1vcHRpb25cIiBbbmdDbGFzc109XCJpc0hpZ2hsaWdodGVkKG9wdC5uYW1lKVwiICpuZ0Zvcj1cImxldCBvcHQgb2Ygb3B0aW9uc1wiIFtpbm5lckh0bWxdPVwib3B0Lm5hbWVcIiAoY2xpY2spPVwic2VsZWN0T3B0aW9uKG9wdClcIj48L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==