UNPKG

@junte/ui

Version:

Quality Angular UI components kit

170 lines 18.2 kB
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