@ux-aspects/ux-aspects
Version:
Open source user interface framework for building modern, responsive, mobile big data applications
69 lines • 11.3 kB
JavaScript
import { inject, Injectable } from '@angular/core';
import { Subject } from 'rxjs';
import { ICON_OPTIONS_TOKEN } from './icon-options.token';
import { uxIconset } from './iconsets/ux-iconset';
import * as i0 from "@angular/core";
export class IconService {
/** Inject a parent service if one exists */
constructor() {
this.options = inject(ICON_OPTIONS_TOKEN, { optional: true });
this._iconService = inject(IconService, { optional: true, skipSelf: true });
/** Emit whenever the iconset changes */
this.iconsChanged$ = new Subject();
/** Store a list of all icon */
this._icons = [...uxIconset];
// if the iconset was defined at the root or child module level apply this configuration
if (this.options && this.options.icons) {
this.setIcons(this.options.icons);
}
}
/** Define multiple icon definitions. This will override icon definitions if a name and size collision occurs */
setIcons(icons) {
icons.forEach(icon => this.setIcon(icon));
}
/** Provide an icon definition which will override if necessary */
setIcon({ name, icon, iconset, size }) {
// if there are multiple sizes specified add them all as individual records
if (Array.isArray(size)) {
return size.forEach(variant => this.setIcon({ name, icon, iconset, size: variant }));
}
// remove any existing definition with the same parameters
this._icons = this._icons.filter(definition => !(definition.name === name && definition.size === size));
// insert the new definition
this._icons = [...this._icons, { name, icon, iconset, size }];
// emit the icon change
this.iconsChanged$.next({ name, size });
}
/** Find an icon based on the given name and size if provided */
getIcon(name, size) {
// if no name was specified then do nothing (this can occur if the name input on the component is not initially defined)
if (!name) {
return;
}
// if there is a size specified then check for an exact match
if (size) {
// get an icon definition that matches both name and size
const sizedIcon = this._icons.find(definition => definition.name === name && definition.size === size);
// if there is a match then return otherwise fallthrough to the default
if (sizedIcon) {
return sizedIcon;
}
}
// find a general match with no size constraint
const icon = this._icons.find(definition => definition.name === name && definition.size === undefined);
// if no match is found and there is a parent service then we should check it
if (!icon && this._iconService) {
return this._iconService.getIcon(name, size);
}
else if (!icon) {
console.warn(`Icon '${name}' was not found.`);
}
return icon;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: IconService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: IconService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: IconService, decorators: [{
type: Injectable
}], ctorParameters: () => [] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvaWNvbi9pY29uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0FBR2xELE1BQU0sT0FBTyxXQUFXO0lBV3BCLDRDQUE0QztJQUM1QztRQVhTLFlBQU8sR0FBRyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVqRCxpQkFBWSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXhGLHdDQUF3QztRQUN4QyxrQkFBYSxHQUFHLElBQUksT0FBTyxFQUFtQixDQUFDO1FBRS9DLCtCQUErQjtRQUN2QixXQUFNLEdBQXdDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUlqRSx3RkFBd0Y7UUFDeEYsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLENBQUM7SUFDTCxDQUFDO0lBRUQsZ0hBQWdIO0lBQ2hILFFBQVEsQ0FBQyxLQUFvQztRQUN6QyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxrRUFBa0U7SUFDbEUsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFrQjtRQUVqRCwyRUFBMkU7UUFDM0UsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekYsQ0FBQztRQUVELDBEQUEwRDtRQUMxRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztRQUV4Ryw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFOUQsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELGdFQUFnRTtJQUNoRSxPQUFPLENBQUMsSUFBWSxFQUFFLElBQWE7UUFFL0Isd0hBQXdIO1FBQ3hILElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNSLE9BQU87UUFDWCxDQUFDO1FBRUQsNkRBQTZEO1FBQzdELElBQUksSUFBSSxFQUFFLENBQUM7WUFFUCx5REFBeUQ7WUFDekQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO1lBRXZHLHVFQUF1RTtZQUN2RSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNaLE9BQU8sU0FBUyxDQUFDO1lBQ3JCLENBQUM7UUFFTCxDQUFDO1FBRUQsK0NBQStDO1FBQy9DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQztRQUV2Ryw2RUFBNkU7UUFDN0UsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakQsQ0FBQzthQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLGtCQUFrQixDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7K0dBMUVRLFdBQVc7bUhBQVgsV0FBVzs7NEZBQVgsV0FBVztrQkFEdkIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuIFxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSUNPTl9PUFRJT05TX1RPS0VOIH0gZnJvbSAnLi9pY29uLW9wdGlvbnMudG9rZW4nO1xuaW1wb3J0IHsgSWNvbkRlZmluaXRpb24sIFNpbmdsZUljb25EZWZpbml0aW9uIH0gZnJvbSAnLi9pY29uc2V0cy9pY29uc2V0LmludGVyZmFjZSc7XG5pbXBvcnQgeyB1eEljb25zZXQgfSBmcm9tICcuL2ljb25zZXRzL3V4LWljb25zZXQnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSWNvblNlcnZpY2Uge1xuICAgIHJlYWRvbmx5IG9wdGlvbnMgPSBpbmplY3QoSUNPTl9PUFRJT05TX1RPS0VOLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaWNvblNlcnZpY2UgPSBpbmplY3QoSWNvblNlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUsIHNraXBTZWxmOiB0cnVlIH0pO1xuXG4gICAgLyoqIEVtaXQgd2hlbmV2ZXIgdGhlIGljb25zZXQgY2hhbmdlcyAqL1xuICAgIGljb25zQ2hhbmdlZCQgPSBuZXcgU3ViamVjdDxJY29uQ2hhbmdlRXZlbnQ+KCk7XG5cbiAgICAvKiogU3RvcmUgYSBsaXN0IG9mIGFsbCBpY29uICovXG4gICAgcHJpdmF0ZSBfaWNvbnM6IFJlYWRvbmx5QXJyYXk8U2luZ2xlSWNvbkRlZmluaXRpb24+ID0gWy4uLnV4SWNvbnNldF07XG5cbiAgICAvKiogSW5qZWN0IGEgcGFyZW50IHNlcnZpY2UgaWYgb25lIGV4aXN0cyAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBpZiB0aGUgaWNvbnNldCB3YXMgZGVmaW5lZCBhdCB0aGUgcm9vdCBvciBjaGlsZCBtb2R1bGUgbGV2ZWwgYXBwbHkgdGhpcyBjb25maWd1cmF0aW9uXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmljb25zKSB7XG4gICAgICAgICAgICB0aGlzLnNldEljb25zKHRoaXMub3B0aW9ucy5pY29ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRGVmaW5lIG11bHRpcGxlIGljb24gZGVmaW5pdGlvbnMuIFRoaXMgd2lsbCBvdmVycmlkZSBpY29uIGRlZmluaXRpb25zIGlmIGEgbmFtZSBhbmQgc2l6ZSBjb2xsaXNpb24gb2NjdXJzICovXG4gICAgc2V0SWNvbnMoaWNvbnM6IFJlYWRvbmx5QXJyYXk8SWNvbkRlZmluaXRpb24+KTogdm9pZCB7XG4gICAgICAgIGljb25zLmZvckVhY2goaWNvbiA9PiB0aGlzLnNldEljb24oaWNvbikpO1xuICAgIH1cblxuICAgIC8qKiBQcm92aWRlIGFuIGljb24gZGVmaW5pdGlvbiB3aGljaCB3aWxsIG92ZXJyaWRlIGlmIG5lY2Vzc2FyeSAqL1xuICAgIHNldEljb24oeyBuYW1lLCBpY29uLCBpY29uc2V0LCBzaXplIH06IEljb25EZWZpbml0aW9uKTogdm9pZCB7XG5cbiAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG11bHRpcGxlIHNpemVzIHNwZWNpZmllZCBhZGQgdGhlbSBhbGwgYXMgaW5kaXZpZHVhbCByZWNvcmRzXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNpemUpKSB7XG4gICAgICAgICAgICByZXR1cm4gc2l6ZS5mb3JFYWNoKHZhcmlhbnQgPT4gdGhpcy5zZXRJY29uKHsgbmFtZSwgaWNvbiwgaWNvbnNldCwgc2l6ZTogdmFyaWFudCB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZW1vdmUgYW55IGV4aXN0aW5nIGRlZmluaXRpb24gd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzXG4gICAgICAgIHRoaXMuX2ljb25zID0gdGhpcy5faWNvbnMuZmlsdGVyKGRlZmluaXRpb24gPT4gIShkZWZpbml0aW9uLm5hbWUgPT09IG5hbWUgJiYgZGVmaW5pdGlvbi5zaXplID09PSBzaXplKSk7XG5cbiAgICAgICAgLy8gaW5zZXJ0IHRoZSBuZXcgZGVmaW5pdGlvblxuICAgICAgICB0aGlzLl9pY29ucyA9IFsuLi50aGlzLl9pY29ucywgeyBuYW1lLCBpY29uLCBpY29uc2V0LCBzaXplIH1dO1xuXG4gICAgICAgIC8vIGVtaXQgdGhlIGljb24gY2hhbmdlXG4gICAgICAgIHRoaXMuaWNvbnNDaGFuZ2VkJC5uZXh0KHsgbmFtZSwgc2l6ZSB9KTtcbiAgICB9XG5cbiAgICAvKiogRmluZCBhbiBpY29uIGJhc2VkIG9uIHRoZSBnaXZlbiBuYW1lIGFuZCBzaXplIGlmIHByb3ZpZGVkICovXG4gICAgZ2V0SWNvbihuYW1lOiBzdHJpbmcsIHNpemU/OiBzdHJpbmcpOiBTaW5nbGVJY29uRGVmaW5pdGlvbiB7XG5cbiAgICAgICAgLy8gaWYgbm8gbmFtZSB3YXMgc3BlY2lmaWVkIHRoZW4gZG8gbm90aGluZyAodGhpcyBjYW4gb2NjdXIgaWYgdGhlIG5hbWUgaW5wdXQgb24gdGhlIGNvbXBvbmVudCBpcyBub3QgaW5pdGlhbGx5IGRlZmluZWQpXG4gICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBzaXplIHNwZWNpZmllZCB0aGVuIGNoZWNrIGZvciBhbiBleGFjdCBtYXRjaFxuICAgICAgICBpZiAoc2l6ZSkge1xuXG4gICAgICAgICAgICAvLyBnZXQgYW4gaWNvbiBkZWZpbml0aW9uIHRoYXQgbWF0Y2hlcyBib3RoIG5hbWUgYW5kIHNpemVcbiAgICAgICAgICAgIGNvbnN0IHNpemVkSWNvbiA9IHRoaXMuX2ljb25zLmZpbmQoZGVmaW5pdGlvbiA9PiBkZWZpbml0aW9uLm5hbWUgPT09IG5hbWUgJiYgZGVmaW5pdGlvbi5zaXplID09PSBzaXplKTtcblxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBtYXRjaCB0aGVuIHJldHVybiBvdGhlcndpc2UgZmFsbHRocm91Z2ggdG8gdGhlIGRlZmF1bHRcbiAgICAgICAgICAgIGlmIChzaXplZEljb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZWRJY29uO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaW5kIGEgZ2VuZXJhbCBtYXRjaCB3aXRoIG5vIHNpemUgY29uc3RyYWludFxuICAgICAgICBjb25zdCBpY29uID0gdGhpcy5faWNvbnMuZmluZChkZWZpbml0aW9uID0+IGRlZmluaXRpb24ubmFtZSA9PT0gbmFtZSAmJiBkZWZpbml0aW9uLnNpemUgPT09IHVuZGVmaW5lZCk7XG5cbiAgICAgICAgLy8gaWYgbm8gbWF0Y2ggaXMgZm91bmQgYW5kIHRoZXJlIGlzIGEgcGFyZW50IHNlcnZpY2UgdGhlbiB3ZSBzaG91bGQgY2hlY2sgaXRcbiAgICAgICAgaWYgKCFpY29uICYmIHRoaXMuX2ljb25TZXJ2aWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faWNvblNlcnZpY2UuZ2V0SWNvbihuYW1lLCBzaXplKTtcbiAgICAgICAgfSBlbHNlIGlmICghaWNvbikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBJY29uICcke25hbWV9JyB3YXMgbm90IGZvdW5kLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGljb247XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEljb25DaGFuZ2VFdmVudCB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHNpemU/OiBzdHJpbmc7XG59XG4iXX0=