@junte/ui
Version:
Quality Angular UI components kit
144 lines • 15.4 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, map } from 'rxjs/operators';
import { JunteUIConfig } from '../../../config';
import { PropertyApi } from '../../../core/decorators/api';
import { InMemoryCacheService } from '../../../core/services/in-memory-cache.service';
import { IconTag } from '../enums';
const DEFAULT_ICONSET = 'default';
let AnimatedIconComponent = class AnimatedIconComponent {
constructor(http, renderer, cache, hostRef, config) {
this.http = http;
this.renderer = renderer;
this.cache = cache;
this.hostRef = hostRef;
this.config = config;
this.host = 'jnt-animated-icon-host';
this.iconset$ = new BehaviorSubject(DEFAULT_ICONSET);
this.icon$ = new BehaviorSubject(null);
}
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 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/animated/${this.iconset}/${this.icon}.svg?hash=${this.config.hash}`;
let icon = this.cache.get(path);
if (icon === undefined) {
this.http.get(path, { responseType: 'text' })
.pipe(map(resp => new DOMParser().parseFromString(resp, 'application/xml')))
.subscribe(file => {
icon = file.documentElement;
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(path, icon);
});
}
else {
this.svg = icon;
this.render();
}
}
};
AnimatedIconComponent.ctorParameters = () => [
{ type: HttpClient },
{ type: Renderer2 },
{ type: InMemoryCacheService },
{ type: ElementRef },
{ type: JunteUIConfig }
];
__decorate([
HostBinding('attr.host'),
__metadata("design:type", Object)
], AnimatedIconComponent.prototype, "host", void 0);
__decorate([
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], AnimatedIconComponent.prototype, "iconset", null);
__decorate([
HostBinding('attr.data-icon'),
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], AnimatedIconComponent.prototype, "icon", null);
__decorate([
PropertyApi({
description: 'Color for icon',
type: '[ui.color]'
}),
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], AnimatedIconComponent.prototype, "color", null);
__decorate([
HostBinding('attr.data-has-color'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [])
], AnimatedIconComponent.prototype, "hasColor", null);
__decorate([
Input(),
HostBinding('attr.data-tags'),
__metadata("design:type", Array)
], AnimatedIconComponent.prototype, "tags", void 0);
AnimatedIconComponent = __decorate([
Component({
selector: 'jnt-animated-icon',
template: "<svg child-of=\"jnt-animated-icon-host\" viewBox=\"0 0 32 32\" data-mock>\n <path child-of=\"jnt-animated-icon-host\" 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", [HttpClient,
Renderer2,
InMemoryCacheService,
ElementRef,
JunteUIConfig])
], AnimatedIconComponent);
export { AnimatedIconComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5pbWF0ZWQtaWNvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AanVudGUvdWkvIiwic291cmNlcyI6WyJsaWIvZWxlbWVudHMvaWNvbi9hbmltYXRlZC9hbmltYXRlZC1pY29uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RixPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDdEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVuQyxNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUM7QUFNbEMsSUFBYSxxQkFBcUIsR0FBbEMsTUFBYSxxQkFBcUI7SUFxRGhDLFlBQW9CLElBQWdCLEVBQ2hCLFFBQW1CLEVBQ25CLEtBQTJCLEVBQzNCLE9BQW1CLEVBQ25CLE1BQXFCO1FBSnJCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixVQUFLLEdBQUwsS0FBSyxDQUFzQjtRQUMzQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLFdBQU0sR0FBTixNQUFNLENBQWU7UUF2RE4sU0FBSSxHQUFHLHdCQUF3QixDQUFDO1FBSTNELGFBQVEsR0FB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QUEwQztBQVFuRTtJQURDLEtBQUssRUFBRTs7O29EQUdQO0FBUUQ7SUFGQyxXQUFXLENBQUMsZ0JBQWdCLENBQUM7SUFDN0IsS0FBSyxFQUFFOzs7aURBR1A7QUFXRDtJQUxDLFdBQVcsQ0FBQztRQUNYLFdBQVcsRUFBRSxnQkFBZ0I7UUFDN0IsSUFBSSxFQUFFLFlBQVk7S0FDbkIsQ0FBQztJQUNELEtBQUssRUFBRTs7O2tEQU1QO0FBT0Q7SUFEQyxXQUFXLENBQUMscUJBQXFCLENBQUM7OztxREFHbEM7QUFJRDtJQUZDLEtBQUssRUFBRTtJQUNQLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQzs7bURBQ2Y7QUFuREoscUJBQXFCO0lBSmpDLFNBQVMsQ0FBQztRQUNULFFBQVEsRUFBRSxtQkFBbUI7UUFDN0IsMFdBQWdEO0tBQ2pELENBQUM7cUNBc0QwQixVQUFVO1FBQ04sU0FBUztRQUNaLG9CQUFvQjtRQUNsQixVQUFVO1FBQ1gsYUFBYTtHQXpEOUIscUJBQXFCLENBNkdqQztTQTdHWSxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0QmluZGluZywgSW5wdXQsIE9uSW5pdCwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEp1bnRlVUlDb25maWcgfSBmcm9tICcuLi8uLi8uLi9jb25maWcnO1xuaW1wb3J0IHsgUHJvcGVydHlBcGkgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2RlY29yYXRvcnMvYXBpJztcbmltcG9ydCB7IEluTWVtb3J5Q2FjaGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9pbi1tZW1vcnktY2FjaGUuc2VydmljZSc7XG5pbXBvcnQgeyBJY29uVGFnIH0gZnJvbSAnLi4vZW51bXMnO1xuXG5jb25zdCBERUZBVUxUX0lDT05TRVQgPSAnZGVmYXVsdCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2pudC1hbmltYXRlZC1pY29uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FuaW1hdGVkLWljb24uZW5jYXBzdWxhdGVkLmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEFuaW1hdGVkSWNvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmhvc3QnKSByZWFkb25seSBob3N0ID0gJ2pudC1hbmltYXRlZC1pY29uLWhvc3QnO1xuXG4gIHByaXZhdGUgc3ZnOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfY29sb3I6IHN0cmluZztcbiAgcHJpdmF0ZSBpY29uc2V0JDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oREVGQVVMVF9JQ09OU0VUKTtcbiAgcHJpdmF0ZSBpY29uJDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4obnVsbCk7XG5cbiAgQElucHV0KClcbiAgc2V0IGljb25zZXQoaWNvbnNldDogc3RyaW5nKSB7XG4gICAgdGhpcy5pY29uc2V0JC5uZXh0KGljb25zZXQpO1xuICB9XG5cbiAgZ2V0IGljb25zZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaWNvbnNldCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci5kYXRhLWljb24nKVxuICBASW5wdXQoKVxuICBzZXQgaWNvbihpY29uOiBzdHJpbmcpIHtcbiAgICB0aGlzLmljb24kLm5leHQoaWNvbik7XG4gIH1cblxuICBnZXQgaWNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pY29uJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgQFByb3BlcnR5QXBpKHtcbiAgICBkZXNjcmlwdGlvbjogJ0NvbG9yIGZvciBpY29uJyxcbiAgICB0eXBlOiAnW3VpLmNvbG9yXSdcbiAgfSlcbiAgQElucHV0KClcbiAgc2V0IGNvbG9yKGNvbG9yOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jb2xvciA9IGNvbG9yO1xuICAgIGlmICghIXRoaXMuc3ZnKSB7XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjb2xvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sb3I7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS1oYXMtY29sb3InKVxuICBnZXQgaGFzQ29sb3IoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5jb2xvcjtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIEBIb3N0QmluZGluZygnYXR0ci5kYXRhLXRhZ3MnKVxuICB0YWdzOiBzdHJpbmdbXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjYWNoZTogSW5NZW1vcnlDYWNoZVNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgaG9zdFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjb25maWc6IEp1bnRlVUlDb25maWcpIHtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuaWNvbnNldCQsIHRoaXMuaWNvbiRdKVxuICAgICAgLnBpcGUoZmlsdGVyKChbaWNvbnNldCwgaWNvbl0pID0+ICEhaWNvbnNldCAmJiAhIWljb24pLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmxvYWQoKSk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgaWYgKCEhdGhpcy5jb2xvcikge1xuICAgICAgaWYgKHRoaXMudGFncy5pbmNsdWRlcyhJY29uVGFnLnN0cm9rZWQpKSB7XG4gICAgICAgIHRoaXMuc3ZnLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgdGhpcy5jb2xvcik7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy50YWdzLmluY2x1ZGVzKEljb25UYWcuZmlsbGVkKSkge1xuICAgICAgICB0aGlzLnN2Zy5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCB0aGlzLmNvbG9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZWwgPSB0aGlzLmhvc3RSZWYubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KGVsLCAnaW5uZXJIVE1MJywgdGhpcy5zdmcub3V0ZXJIVE1MKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZCgpIHtcbiAgICBjb25zdCBwYXRoID0gYCR7dGhpcy5jb25maWcuYXNzZXRzfS9pY29ucy9hbmltYXRlZC8ke3RoaXMuaWNvbnNldH0vJHt0aGlzLmljb259LnN2Zz9oYXNoPSR7dGhpcy5jb25maWcuaGFzaH1gO1xuXG4gICAgbGV0IGljb24gPSB0aGlzLmNhY2hlLmdldDxIVE1MRWxlbWVudD4ocGF0aCk7XG4gICAgaWYgKGljb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5odHRwLmdldChwYXRoLCB7cmVzcG9uc2VUeXBlOiAndGV4dCd9KVxuICAgICAgICAucGlwZShtYXAocmVzcCA9PiBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHJlc3AsICdhcHBsaWNhdGlvbi94bWwnKSkpXG4gICAgICAgIC5zdWJzY3JpYmUoZmlsZSA9PiB7XG4gICAgICAgICAgaWNvbiA9IGZpbGUuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgIGNvbnN0IGVuY2Fwc3VsYXRlID0gKGVsOiBFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2NoaWxkLW9mJywgdGhpcy5ob3N0KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWwuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgZW5jYXBzdWxhdGUoZWwuY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBlbmNhcHN1bGF0ZShpY29uKTtcbiAgICAgICAgICBpY29uLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnMTAwJScpO1xuICAgICAgICAgIGljb24uc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnMTAwJScpO1xuICAgICAgICAgIHRoaXMuc3ZnID0gaWNvbjtcbiAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuXG4gICAgICAgICAgdGhpcy5jYWNoZS5zZXQocGF0aCwgaWNvbik7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN2ZyA9IGljb247XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cbiAgfVxuXG59XG4iXX0=