@junte/ui
Version:
Quality Angular UI components kit
170 lines • 18.2 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { HttpClient } from '@angular/common/http';
import { Component, ElementRef, HostBinding, Input, OnInit, Renderer2 } from '@angular/core';
import { BehaviorSubject, combineLatest } from 'rxjs';
import { distinctUntilChanged, filter } from 'rxjs/operators';
import { JunteUIConfig } from '../../../config';
import { PropertyApi } from '../../../core/decorators/api';
import { Stroke } from '../../../core/enums/stroke';
import { InMemoryCacheService } from '../../../core/services/in-memory-cache.service';
import { IconTag } from '../enums';
const DEFAULT_ICONSET = 'default';
let SvgIconComponent = class SvgIconComponent {
constructor(config, http, cache, hostRef, renderer) {
this.config = config;
this.http = http;
this.cache = cache;
this.hostRef = hostRef;
this.renderer = renderer;
this.host = 'jnt-svg-icon-host';
this.icon$ = new BehaviorSubject(null);
this.iconset$ = new BehaviorSubject(DEFAULT_ICONSET);
this._stroke = Stroke.normal;
}
set iconset(iconset) {
this.iconset$.next(iconset);
}
get iconset() {
return this.iconset$.getValue();
}
set icon(icon) {
this.icon$.next(icon);
}
get icon() {
return this.icon$.getValue();
}
set stroke(stroke) {
this._stroke = stroke || Stroke.normal;
}
get stroke() {
return this._stroke;
}
set color(color) {
this._color = color;
if (!!this.svg) {
this.render();
}
}
get color() {
return this._color;
}
get hasColor() {
return !!this.color;
}
ngOnInit() {
combineLatest([this.iconset$, this.icon$])
.pipe(filter(([iconset, icon]) => !!iconset && !!icon), distinctUntilChanged())
.subscribe(() => this.load());
}
render() {
if (!!this.color) {
if (this.tags.includes(IconTag.stroked)) {
this.svg.setAttribute('stroke', this.color);
}
if (this.tags.includes(IconTag.filled)) {
this.svg.setAttribute('fill', this.color);
}
}
const el = this.hostRef.nativeElement;
this.renderer.setProperty(el, 'innerHTML', this.svg.outerHTML);
}
load() {
const path = `${this.config.assets}/icons/svg/${this.iconset}.xml?hash=${this.config.hash}`;
const key = `${path}|${this.icon}`;
let icon = this.cache.get(key);
if (icon === undefined) {
let iconset$ = this.cache.get(path);
if (iconset$ === undefined) {
iconset$ = new BehaviorSubject(null);
this.cache.set(path, iconset$);
this.http.get(path, { responseType: 'text' }).subscribe(response => iconset$.next(new DOMParser().parseFromString(response, 'application/xml')));
}
iconset$.pipe(filter(iconset => !!iconset))
.subscribe(iconset => {
icon = iconset.querySelector(`[id=${this.icon}]`);
if (!icon) {
throw new Error(`icon [${this.icon}] not found`);
}
const encapsulate = (el) => {
el.setAttribute('child-of', this.host);
for (let i = 0; i < el.children.length; i++) {
encapsulate(el.children[i]);
}
};
encapsulate(icon);
icon.setAttribute('width', '100%');
icon.setAttribute('height', '100%');
this.svg = icon;
this.render();
this.cache.set(key, icon);
});
}
else {
this.svg = icon;
this.render();
}
}
};
SvgIconComponent.ctorParameters = () => [
{ type: JunteUIConfig },
{ type: HttpClient },
{ type: InMemoryCacheService },
{ type: ElementRef },
{ type: Renderer2 }
];
__decorate([
HostBinding('attr.host'),
__metadata("design:type", Object)
], SvgIconComponent.prototype, "host", void 0);
__decorate([
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], SvgIconComponent.prototype, "iconset", null);
__decorate([
HostBinding('attr.data-icon'),
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], SvgIconComponent.prototype, "icon", null);
__decorate([
HostBinding('attr.data-stroke'),
__metadata("design:type", String)
], SvgIconComponent.prototype, "_stroke", void 0);
__decorate([
Input(),
HostBinding('attr.data-tags'),
__metadata("design:type", Array)
], SvgIconComponent.prototype, "tags", void 0);
__decorate([
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], SvgIconComponent.prototype, "stroke", null);
__decorate([
PropertyApi({
description: 'Color for icon',
type: '[ui.color]'
}),
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], SvgIconComponent.prototype, "color", null);
__decorate([
HostBinding('attr.data-has-color'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [])
], SvgIconComponent.prototype, "hasColor", null);
SvgIconComponent = __decorate([
Component({
selector: 'jnt-svg-icon',
template: "<svg child-of=\"jnt-svg-icon-host\" child-of=\"jnt-svg-icon-host\" width=\"100%\" height=\"100%\" viewBox=\"0 0 32 32\">\n <path child-of=\"jnt-svg-icon-host\" child-of=\"jnt-svg-icon-host\"\n d=\"M25.313 4c1.438 0 2.688 1.25 2.688 2.688v18.625c0 1.438-1.25 2.688-2.688 2.688h-18.625c-1.438 0-2.688-1.25-2.688-2.688v-18.625c0-1.438 1.25-2.688 2.688-2.688h18.625zM25.313 6.688h-18.625v18.625h18.625v-18.625z\"></path>\n</svg>"
}),
__metadata("design:paramtypes", [JunteUIConfig,
HttpClient,
InMemoryCacheService,
ElementRef,
Renderer2])
], SvgIconComponent);
export { SvgIconComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ZnLWljb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGp1bnRlL3VpLyIsInNvdXJjZXMiOlsibGliL2VsZW1lbnRzL2ljb24vc3ZnL3N2Zy1pY29uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RixPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDdEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVuQyxNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUM7QUFNbEMsSUFBYSxnQkFBZ0IsR0FBN0IsTUFBYSxnQkFBZ0I7SUFpRTNCLFlBQW9CLE1BQXFCLEVBQ3JCLElBQWdCLEVBQ2hCLEtBQTJCLEVBQzNCLE9BQW1CLEVBQ25CLFFBQW1CO1FBSm5CLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixVQUFLLEdBQUwsS0FBSyxDQUFzQjtRQUMzQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLGFBQVEsR0FBUixRQUFRLENBQVc7UUFuRUosU0FBSSxHQUFHLG1CQUFtQixD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V0FBVyxDQUFDO1FBQ1gsV0FBVyxFQUFFLGdCQUFnQjtRQUM3QixJQUFJLEVBQUUsWUFBWTtLQUNuQixDQUFDO0lBQ0QsS0FBSyxFQUFFOzs7NkNBTVA7QUFPRDtJQURDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQzs7O2dEQUdsQztBQS9EVSxnQkFBZ0I7SUFKNUIsU0FBUyxDQUFDO1FBQ1QsUUFBUSxFQUFFLGNBQWM7UUFDeEIsNGJBQTJDO0tBQzVDLENBQUM7cUNBa0U0QixhQUFhO1FBQ2YsVUFBVTtRQUNULG9CQUFvQjtRQUNsQixVQUFVO1FBQ1QsU0FBUztHQXJFNUIsZ0JBQWdCLENBc0k1QjtTQXRJWSxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0QmluZGluZywgSW5wdXQsIE9uSW5pdCwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBKdW50ZVVJQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vY29uZmlnJztcbmltcG9ydCB7IFByb3BlcnR5QXBpIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9kZWNvcmF0b3JzL2FwaSc7XG5pbXBvcnQgeyBTdHJva2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VudW1zL3N0cm9rZSc7XG5pbXBvcnQgeyBJbk1lbW9yeUNhY2hlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvaW4tbWVtb3J5LWNhY2hlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWNvblRhZyB9IGZyb20gJy4uL2VudW1zJztcblxuY29uc3QgREVGQVVMVF9JQ09OU0VUID0gJ2RlZmF1bHQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdqbnQtc3ZnLWljb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vc3ZnLWljb24uZW5jYXBzdWxhdGVkLmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFN2Z0ljb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5ob3N0JykgcmVhZG9ubHkgaG9zdCA9ICdqbnQtc3ZnLWljb24taG9zdCc7XG5cbiAgcHJpdmF0ZSBzdmc6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9jb2xvcjogc3RyaW5nO1xuICBwcml2YXRlIGljb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KG51bGwpO1xuICBwcml2YXRlIGljb25zZXQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KERFRkFVTFRfSUNPTlNFVCk7XG5cbiAgQElucHV0KClcbiAgc2V0IGljb25zZXQoaWNvbnNldDogc3RyaW5nKSB7XG4gICAgdGhpcy5pY29uc2V0JC5uZXh0KGljb25zZXQpO1xuICB9XG5cbiAgZ2V0IGljb25zZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaWNvbnNldCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci5kYXRhLWljb24nKVxuICBASW5wdXQoKVxuICBzZXQgaWNvbihpY29uOiBzdHJpbmcpIHtcbiAgICB0aGlzLmljb24kLm5leHQoaWNvbik7XG4gIH1cblxuICBnZXQgaWNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pY29uJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmRhdGEtc3Ryb2tlJylcbiAgX3N0cm9rZTogU3Ryb2tlID0gU3Ryb2tlLm5vcm1hbDtcblxuICBASW5wdXQoKVxuICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS10YWdzJylcbiAgdGFnczogc3RyaW5nW107XG5cbiAgQElucHV0KClcbiAgc2V0IHN0cm9rZShzdHJva2U6IFN0cm9rZSkge1xuICAgIHRoaXMuX3N0cm9rZSA9IHN0cm9rZSB8fCBTdHJva2Uubm9ybWFsO1xuICB9XG5cbiAgZ2V0IHN0cm9rZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3Ryb2tlO1xuICB9XG5cbiAgQFByb3BlcnR5QXBpKHtcbiAgICBkZXNjcmlwdGlvbjogJ0NvbG9yIGZvciBpY29uJyxcbiAgICB0eXBlOiAnW3VpLmNvbG9yXSdcbiAgfSlcbiAgQElucHV0KClcbiAgc2V0IGNvbG9yKGNvbG9yOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jb2xvciA9IGNvbG9yO1xuICAgIGlmICghIXRoaXMuc3ZnKSB7XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjb2xvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sb3I7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS1oYXMtY29sb3InKVxuICBnZXQgaGFzQ29sb3IoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5jb2xvcjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uZmlnOiBKdW50ZVVJQ29uZmlnLFxuICAgICAgICAgICAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgICAgICAgICAgIHByaXZhdGUgY2FjaGU6IEluTWVtb3J5Q2FjaGVTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIGhvc3RSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5pY29uc2V0JCwgdGhpcy5pY29uJF0pXG4gICAgICAucGlwZShmaWx0ZXIoKFtpY29uc2V0LCBpY29uXSkgPT4gISFpY29uc2V0ICYmICEhaWNvbiksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMubG9hZCgpKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBpZiAoISF0aGlzLmNvbG9yKSB7XG4gICAgICBpZiAodGhpcy50YWdzLmluY2x1ZGVzKEljb25UYWcuc3Ryb2tlZCkpIHtcbiAgICAgICAgdGhpcy5zdmcuc2V0QXR0cmlidXRlKCdzdHJva2UnLCB0aGlzLmNvbG9yKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnRhZ3MuaW5jbHVkZXMoSWNvblRhZy5maWxsZWQpKSB7XG4gICAgICAgIHRoaXMuc3ZnLnNldEF0dHJpYnV0ZSgnZmlsbCcsIHRoaXMuY29sb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBlbCA9IHRoaXMuaG9zdFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoZWwsICdpbm5lckhUTUwnLCB0aGlzLnN2Zy5vdXRlckhUTUwpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkKCkge1xuICAgIGNvbnN0IHBhdGggPSBgJHt0aGlzLmNvbmZpZy5hc3NldHN9L2ljb25zL3N2Zy8ke3RoaXMuaWNvbnNldH0ueG1sP2hhc2g9JHt0aGlzLmNvbmZpZy5oYXNofWA7XG4gICAgY29uc3Qga2V5ID0gYCR7cGF0aH18JHt0aGlzLmljb259YDtcblxuICAgIGxldCBpY29uID0gdGhpcy5jYWNoZS5nZXQ8SFRNTEVsZW1lbnQ+KGtleSk7XG4gICAgaWYgKGljb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgbGV0IGljb25zZXQkID0gdGhpcy5jYWNoZS5nZXQ8QmVoYXZpb3JTdWJqZWN0PERvY3VtZW50Pj4ocGF0aCk7XG4gICAgICBpZiAoaWNvbnNldCQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpY29uc2V0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RG9jdW1lbnQ+KG51bGwpO1xuICAgICAgICB0aGlzLmNhY2hlLnNldChwYXRoLCBpY29uc2V0JCk7XG5cbiAgICAgICAgdGhpcy5odHRwLmdldChwYXRoLCB7cmVzcG9uc2VUeXBlOiAndGV4dCd9KS5zdWJzY3JpYmUocmVzcG9uc2UgPT5cbiAgICAgICAgICBpY29uc2V0JC5uZXh0KG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcocmVzcG9uc2UsICdhcHBsaWNhdGlvbi94bWwnKSkpO1xuICAgICAgfVxuICAgICAgaWNvbnNldCQucGlwZShmaWx0ZXIoaWNvbnNldCA9PiAhIWljb25zZXQpKVxuICAgICAgICAuc3Vic2NyaWJlKGljb25zZXQgPT4ge1xuICAgICAgICAgIGljb24gPSBpY29uc2V0LnF1ZXJ5U2VsZWN0b3IoYFtpZD0ke3RoaXMuaWNvbn1dYCk7XG4gICAgICAgICAgaWYgKCFpY29uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGljb24gWyR7dGhpcy5pY29ufV0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZW5jYXBzdWxhdGUgPSAoZWw6IEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnY2hpbGQtb2YnLCB0aGlzLmhvc3QpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBlbmNhcHN1bGF0ZShlbC5jaGlsZHJlbltpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGVuY2Fwc3VsYXRlKGljb24pO1xuICAgICAgICAgIGljb24uc2V0QXR0cmlidXRlKCd3aWR0aCcsICcxMDAlJyk7XG4gICAgICAgICAgaWNvbi5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcxMDAlJyk7XG4gICAgICAgICAgdGhpcy5zdmcgPSBpY29uO1xuICAgICAgICAgIHRoaXMucmVuZGVyKCk7XG5cbiAgICAgICAgICB0aGlzLmNhY2hlLnNldChrZXksIGljb24pO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdmcgPSBpY29uO1xuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG4gIH1cblxufVxuIl19