UNPKG

@ux-aspects/ux-aspects

Version:

Open source user interface framework for building modern, responsive, mobile big data applications

108 lines 16.1 kB
import { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion'; import { ChangeDetectionStrategy, Component, ElementRef, Input, Renderer2, inject } from '@angular/core'; import { Subject } from 'rxjs'; import { filter, takeUntil } from 'rxjs/operators'; import { IconService } from './icon.service'; import * as i0 from "@angular/core"; export class IconComponent { constructor() { this._elementRef = inject(ElementRef); this._renderer = inject(Renderer2); this._iconService = inject(IconService); /** Store the boolean value of flip vertical */ this._flipVertical = false; /** Store the boolean value of flip horizontal */ this._flipHorizontal = false; /** Automatically unsubscribe from observables */ this._onDestroy = new Subject(); } /** The number of degrees to rotate the icon */ set rotate(rotation) { this._rotate = coerceNumberProperty(rotation); } get rotate() { return this._rotate; } /** Define if the icon should be horizontally flipped */ set flipHorizontal(flipHorizontal) { this._flipHorizontal = coerceBooleanProperty(flipHorizontal); } get flipHorizontal() { return this._flipHorizontal; } /** Define if the icon should be horizontally flipped */ set flipVertical(flipVertical) { this._flipVertical = coerceBooleanProperty(flipVertical); } get flipVertical() { return this._flipVertical; } /** When inputs change ensure we have the best icon definition */ ngOnChanges(changes) { // if the name or size changes then update the icon if (changes.name && changes.name.currentValue !== changes.name.previousValue || changes.size && changes.size.currentValue !== changes.size.previousValue) { this.updateIcon(); } } /** Watch for changes to the iconset */ ngAfterViewInit() { // watch for changes to the iconset to check if we need to update. this._iconService.iconsChanged$.pipe(filter(event => this._icon && event.name === this._icon.name), takeUntil(this._onDestroy)).subscribe(() => this.updateIcon()); } /** Cleanup on component destroy */ ngOnDestroy() { this._onDestroy.next(); this._onDestroy.complete(); } /** get the icon definition based on the name and size specified */ updateIcon() { // remove the current icon set and icon classes of the old icon. // note we are using the renderer and not HostBindings as a HostBinding // on the `class` property will override any user added classes which is // not desirable. if (this._icon) { this._renderer.removeClass(this._elementRef.nativeElement, this._icon.iconset); this._renderer.removeClass(this._elementRef.nativeElement, this._icon.icon); } // update the stored icon definition with the best match based on name and size this._icon = this._iconService.getIcon(this.name, this.size); // add the new icon classes, again using the renderer to avoid overriding user classes if (this._icon) { this._renderer.addClass(this._elementRef.nativeElement, this._icon.iconset); this._renderer.addClass(this._elementRef.nativeElement, this._icon.icon); } else if (this.name) { console.warn(`The icon ${this.name} could not be found. Ensure you are using the correct iconset.`); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: IconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: IconComponent, selector: "ux-icon", inputs: { name: "name", size: "size", rotate: "rotate", flipHorizontal: "flipHorizontal", flipVertical: "flipVertical" }, host: { properties: { "style.font-size": "size", "class.ux-flip-horizontal": "flipHorizontal", "class.ux-flip-vertical": "flipVertical", "class.ux-rotate-90": "rotate == 90", "class.ux-rotate-180": "rotate == 180", "class.ux-rotate-270": "rotate == 270" } }, usesOnChanges: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: IconComponent, decorators: [{ type: Component, args: [{ selector: 'ux-icon', template: '', changeDetection: ChangeDetectionStrategy.OnPush, host: { '[style.font-size]': 'size', '[class.ux-flip-horizontal]': 'flipHorizontal', '[class.ux-flip-vertical]': 'flipVertical', '[class.ux-rotate-90]': 'rotate == 90', '[class.ux-rotate-180]': 'rotate == 180', '[class.ux-rotate-270]': 'rotate == 270', } }] }], propDecorators: { name: [{ type: Input }], size: [{ type: Input }], rotate: [{ type: Input }], flipHorizontal: [{ type: Input }], flipVertical: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9pY29uL2ljb24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BGLE9BQU8sRUFBaUIsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQXdCLFNBQVMsRUFBaUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdKLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBZ0I3QyxNQUFNLE9BQU8sYUFBYTtJQWIxQjtRQWNxQixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVqQyxjQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTlCLGlCQUFZLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBeUNwRCwrQ0FBK0M7UUFDdkMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFFdkMsaURBQWlEO1FBQ3pDLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBRXpDLGlEQUFpRDtRQUNoQyxlQUFVLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztLQWtEckQ7SUExRkcsK0NBQStDO0lBQy9DLElBQWEsTUFBTSxDQUFDLFFBQStCO1FBQy9DLElBQUksQ0FBQyxPQUFPLEdBQUcsb0JBQW9CLENBQUMsUUFBUSxDQUFpQixDQUFDO0lBQ2xFLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUVELHdEQUF3RDtJ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TCxDQUFDOytHQXRHUSxhQUFhO21HQUFiLGFBQWEsaWNBWFosRUFBRTs7NEZBV0gsYUFBYTtrQkFiekIsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsU0FBUztvQkFDbkIsUUFBUSxFQUFFLEVBQUU7b0JBQ1osZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLElBQUksRUFBRTt3QkFDRixtQkFBbUIsRUFBRSxNQUFNO3dCQUMzQiw0QkFBNEIsRUFBRSxnQkFBZ0I7d0JBQzlDLDBCQUEwQixFQUFFLGNBQWM7d0JBQzFDLHNCQUFzQixFQUFFLGNBQWM7d0JBQ3RDLHVCQUF1QixFQUFFLGVBQWU7d0JBQ3hDLHVCQUF1QixFQUFFLGVBQWU7cUJBQzNDO2lCQUNKOzhCQVNZLElBQUk7c0JBQVosS0FBSztnQkFHRyxJQUFJO3NCQUFaLEtBQUs7Z0JBR08sTUFBTTtzQkFBbEIsS0FBSztnQkFTTyxjQUFjO3NCQUExQixLQUFLO2dCQVNPLFlBQVk7c0JBQXhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHksIGNvZXJjZU51bWJlclByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgUmVuZGVyZXIyLCBTaW1wbGVDaGFuZ2VzLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSWNvblNlcnZpY2UgfSBmcm9tICcuL2ljb24uc2VydmljZSc7XG5pbXBvcnQgeyBJY29uRGVmaW5pdGlvbiB9IGZyb20gJy4vaWNvbnNldHMvaWNvbnNldC5pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3V4LWljb24nLFxuICAgIHRlbXBsYXRlOiAnJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBob3N0OiB7XG4gICAgICAgICdbc3R5bGUuZm9udC1zaXplXSc6ICdzaXplJyxcbiAgICAgICAgJ1tjbGFzcy51eC1mbGlwLWhvcml6b250YWxdJzogJ2ZsaXBIb3Jpem9udGFsJyxcbiAgICAgICAgJ1tjbGFzcy51eC1mbGlwLXZlcnRpY2FsXSc6ICdmbGlwVmVydGljYWwnLFxuICAgICAgICAnW2NsYXNzLnV4LXJvdGF0ZS05MF0nOiAncm90YXRlID09IDkwJyxcbiAgICAgICAgJ1tjbGFzcy51eC1yb3RhdGUtMTgwXSc6ICdyb3RhdGUgPT0gMTgwJyxcbiAgICAgICAgJ1tjbGFzcy51eC1yb3RhdGUtMjcwXSc6ICdyb3RhdGUgPT0gMjcwJyxcbiAgICB9XG59KVxuZXhwb3J0IGNsYXNzIEljb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pY29uU2VydmljZSA9IGluamVjdChJY29uU2VydmljZSk7XG5cbiAgICAvKiogRGVmaW5lIHRoZSBpY29uIHRvIGRpc3BsYXkgKi9cbiAgICBASW5wdXQoKSBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKiogRGVmaW5lIGEgY3VzdG9tIHNpemUgZm9yIHRoZSBpY29uICovXG4gICAgQElucHV0KCkgc2l6ZTogc3RyaW5nO1xuXG4gICAgLyoqIFRoZSBudW1iZXIgb2YgZGVncmVlcyB0byByb3RhdGUgdGhlIGljb24gKi9cbiAgICBASW5wdXQoKSBzZXQgcm90YXRlKHJvdGF0aW9uOiBJY29uUm90YXRpb24gfCBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fcm90YXRlID0gY29lcmNlTnVtYmVyUHJvcGVydHkocm90YXRpb24pIGFzIEljb25Sb3RhdGlvbjtcbiAgICB9XG5cbiAgICBnZXQgcm90YXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm90YXRlO1xuICAgIH1cblxuICAgIC8qKiBEZWZpbmUgaWYgdGhlIGljb24gc2hvdWxkIGJlIGhvcml6b250YWxseSBmbGlwcGVkICovXG4gICAgQElucHV0KCkgc2V0IGZsaXBIb3Jpem9udGFsKGZsaXBIb3Jpem9udGFsOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2ZsaXBIb3Jpem9udGFsID0gY29lcmNlQm9vbGVhblByb3BlcnR5KGZsaXBIb3Jpem9udGFsKTtcbiAgICB9XG5cbiAgICBnZXQgZmxpcEhvcml6b250YWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mbGlwSG9yaXpvbnRhbDtcbiAgICB9XG5cbiAgICAvKiogRGVmaW5lIGlmIHRoZSBpY29uIHNob3VsZCBiZSBob3Jpem9udGFsbHkgZmxpcHBlZCAqL1xuICAgIEBJbnB1dCgpIHNldCBmbGlwVmVydGljYWwoZmxpcFZlcnRpY2FsOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2ZsaXBWZXJ0aWNhbCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eShmbGlwVmVydGljYWwpO1xuICAgIH1cblxuICAgIGdldCBmbGlwVmVydGljYWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mbGlwVmVydGljYWw7XG4gICAgfVxuXG4gICAgLyoqIFN0b3JlIHRoZSBtYXRjaGluZyBpY29uIGRlZmluaXRpb24gKi9cbiAgICBfaWNvbjogSWNvbkRlZmluaXRpb247XG5cbiAgICAvKiogU3RvcmUgdGhlIG51bWVyaWMgdmFsdWUgb2Ygcm90YXRpb24gKi9cbiAgICBwcml2YXRlIF9yb3RhdGU6IEljb25Sb3RhdGlvbjtcblxuICAgIC8qKiBTdG9yZSB0aGUgYm9vbGVhbiB2YWx1ZSBvZiBmbGlwIHZlcnRpY2FsICovXG4gICAgcHJpdmF0ZSBfZmxpcFZlcnRpY2FsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogU3RvcmUgdGhlIGJvb2xlYW4gdmFsdWUgb2YgZmxpcCBob3Jpem9udGFsICovXG4gICAgcHJpdmF0ZSBfZmxpcEhvcml6b250YWw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBBdXRvbWF0aWNhbGx5IHVuc3Vic2NyaWJlIGZyb20gb2JzZXJ2YWJsZXMgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vbkRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgLyoqIFdoZW4gaW5wdXRzIGNoYW5nZSBlbnN1cmUgd2UgaGF2ZSB0aGUgYmVzdCBpY29uIGRlZmluaXRpb24gKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG5cbiAgICAgICAgLy8gaWYgdGhlIG5hbWUgb3Igc2l6ZSBjaGFuZ2VzIHRoZW4gdXBkYXRlIHRoZSBpY29uXG4gICAgICAgIGlmIChjaGFuZ2VzLm5hbWUgJiYgY2hhbmdlcy5uYW1lLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlcy5uYW1lLnByZXZpb3VzVmFsdWUgfHxcbiAgICAgICAgICAgIGNoYW5nZXMuc2l6ZSAmJiBjaGFuZ2VzLnNpemUuY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzLnNpemUucHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVJY29uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogV2F0Y2ggZm9yIGNoYW5nZXMgdG8gdGhlIGljb25zZXQgKi9cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIC8vIHdhdGNoIGZvciBjaGFuZ2VzIHRvIHRoZSBpY29uc2V0IHRvIGNoZWNrIGlmIHdlIG5lZWQgdG8gdXBkYXRlLlxuICAgICAgICB0aGlzLl9pY29uU2VydmljZS5pY29uc0NoYW5nZWQkLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoZXZlbnQgPT4gdGhpcy5faWNvbiAmJiBldmVudC5uYW1lID09PSB0aGlzLl9pY29uLm5hbWUpLFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSlcbiAgICAgICAgKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVJY29uKCkpO1xuICAgIH1cblxuICAgIC8qKiBDbGVhbnVwIG9uIGNvbXBvbmVudCBkZXN0cm95ICovXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveS5uZXh0KCk7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveS5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKiBnZXQgdGhlIGljb24gZGVmaW5pdGlvbiBiYXNlZCBvbiB0aGUgbmFtZSBhbmQgc2l6ZSBzcGVjaWZpZWQgKi9cbiAgICB1cGRhdGVJY29uKCk6IHZvaWQge1xuXG4gICAgICAgIC8vIHJlbW92ZSB0aGUgY3VycmVudCBpY29uIHNldCBhbmQgaWNvbiBjbGFzc2VzIG9mIHRoZSBvbGQgaWNvbi5cbiAgICAgICAgLy8gbm90ZSB3ZSBhcmUgdXNpbmcgdGhlIHJlbmRlcmVyIGFuZCBub3QgSG9zdEJpbmRpbmdzIGFzIGEgSG9zdEJpbmRpbmdcbiAgICAgICAgLy8gb24gdGhlIGBjbGFzc2AgcHJvcGVydHkgd2lsbCBvdmVycmlkZSBhbnkgdXNlciBhZGRlZCBjbGFzc2VzIHdoaWNoIGlzXG4gICAgICAgIC8vIG5vdCBkZXNpcmFibGUuXG4gICAgICAgIGlmICh0aGlzLl9pY29uKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuX2ljb24uaWNvbnNldCk7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuX2ljb24uaWNvbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1cGRhdGUgdGhlIHN0b3JlZCBpY29uIGRlZmluaXRpb24gd2l0aCB0aGUgYmVzdCBtYXRjaCBiYXNlZCBvbiBuYW1lIGFuZCBzaXplXG4gICAgICAgIHRoaXMuX2ljb24gPSB0aGlzLl9pY29uU2VydmljZS5nZXRJY29uKHRoaXMubmFtZSwgdGhpcy5zaXplKTtcblxuICAgICAgICAvLyBhZGQgdGhlIG5ldyBpY29uIGNsYXNzZXMsIGFnYWluIHVzaW5nIHRoZSByZW5kZXJlciB0byBhdm9pZCBvdmVycmlkaW5nIHVzZXIgY2xhc3Nlc1xuICAgICAgICBpZiAodGhpcy5faWNvbikge1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLl9pY29uLmljb25zZXQpO1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLl9pY29uLmljb24pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubmFtZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBUaGUgaWNvbiAke3RoaXMubmFtZX0gY291bGQgbm90IGJlIGZvdW5kLiBFbnN1cmUgeW91IGFyZSB1c2luZyB0aGUgY29ycmVjdCBpY29uc2V0LmApO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBJY29uUm90YXRpb24gPSA5MCB8IDE4MCB8IDI3MDtcbiJdfQ==