UNPKG

@obliczeniowo/elementary

Version:
1 lines 16.3 kB
{"version":3,"file":"obliczeniowo-elementary-icons.mjs","sources":["../../../../projects/components/icons/services/icon-resource.service.ts","../../../../projects/components/icons/components/icon/icon.component.ts","../../../../projects/components/icons/components/icon/icon.component.html","../../../../projects/components/icons/icons.module.ts","../../../../projects/components/icons/obliczeniowo-elementary-icons.ts"],"sourcesContent":["\nimport { HttpClient } from '@angular/common/http';\nimport { Inject, Injectable, SecurityContext, OnDestroy, DOCUMENT } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { Observable, from, of } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\n\nexport interface Icon {\n svgString?: string;\n url: SafeHtml;\n name: string;\n}\n\n/**\n * Registering icons service for icon.component\n *\n * Registering own:\n * @example\n *\n * constructor(private iconResource: IconResourceService) {\n * iconResource.registerIcon(\n * this.sanitizer.bypassSecurityTrustHtml('/assets/icons/your-icon.svg'),\n * 'icon-name'\n * );\n * }\n *\n * @\n * Use in html with icon component:\n *\n * @example\n *\n * <obl-icon [width]=\"20\" name=\"icon-name\"></obl-icon>\n *\n * @ To correctly work in library component you need to copy assets folder adding script to npm:\n *\n * @example\n *\n * \"copy-assets\": \"node ./node_modules/@obliczeniowo/elementary/assets/scripts/copy.js ./src/assets/\",\n *\n * @ and run in console:\n *\n * @example\n * npm run copy-assets\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class IconResourceService implements OnDestroy {\n protected icons = new Map<string, Icon>();\n protected urls = new Map<string, Partial<Partial<Icon>>>();\n protected loading = new Map<string, Promise<string | undefined>>();\n\n protected base = '/';\n\n constructor(\n private readonly http: HttpClient,\n private readonly sanitizer: DomSanitizer,\n @Inject(DOCUMENT) private readonly document: Document\n ) {\n const base = document.head.querySelector('base');\n this.base = base?.href || '/';\n\n if (!this.icons.size) {\n const icons = [\n 'search',\n 'expand',\n 'add',\n 'add-box',\n 'subtract-box',\n 'subtract',\n 'cancel',\n 'ok',\n 'down-more',\n 'up-more',\n 'up',\n 'down',\n 'left-more',\n 'right-more',\n 'left',\n 'right',\n 'csv-file',\n 'json-file',\n 'xlsx-file',\n 'logout',\n 'edit',\n 'pause',\n 'play',\n 'move',\n 'mute',\n 'voice',\n 'loop',\n 'stop',\n 'pointing',\n 'asc',\n 'filter',\n 'save',\n 'gear',\n 'checked',\n 'unchecked',\n 'checklist-mixed',\n 'list',\n 'file',\n 'sync-up',\n 'sync-down',\n 'link'\n ];\n\n icons.forEach((icon) =>\n this.registerIcon(\n this.sanitizer.bypassSecurityTrustHtml(\n `/assets/obl-icons/${icon}.svg`\n ),\n icon\n )\n );\n }\n }\n\n /**\n * Registering own:\n * @param url SafeHTML object with path to icon in your asset folder\n * @param name your icon name\n *\n * @example\n *\n * constructor(private iconResource: IconResourceService) {\n * iconResource.registerIcon(\n * this.sanitizer.bypassSecurityTrustHtml('/assets/icons/your-icon.svg'),\n * 'icon-name'\n * );\n * }\n *\n * @\n * Use in html with icon component:\n *\n * @example\n *\n * <obl-icon [width]=\"20\" name=\"icon-name\"></obl-icon>\n */\n registerIcon(url: SafeHtml, name: string): void {\n (url as any).changingThisBreaksApplicationSecurity =\n this.base +\n (url as any).changingThisBreaksApplicationSecurity.replace(/^\\//, '');\n const icon: Icon = {\n url,\n name,\n };\n\n this.icons.set(name, icon);\n }\n\n /**\n * Download once icon from server and keep it in buffer\n * @param name name of icon\n * @returns observable with SVGSVGElement or undefined\n */\n getIcon(name: string): Observable<SVGSVGElement | undefined> {\n const icon = this.icons.get(name);\n\n if (!icon) {\n throw new Error(\n `Can't find icon \"${name}\" in registered resources. Pleas register it.`\n );\n }\n\n if (icon.svgString) {\n return of(this.createSvgFromString(icon.svgString));\n }\n\n const loading = this.loading.get(name);\n if (loading) {\n return from(loading).pipe(\n map((svg) => (svg ? this.createSvgFromString(svg) : undefined))\n );\n }\n\n const url = this.sanitizer.sanitize(SecurityContext.HTML, icon.url);\n\n if (url) {\n let resolve: (res: any) => any;\n let reject: (rej: any) => any;\n\n const exec = (res: any, rej: any) => {\n resolve = res;\n reject = rej;\n };\n\n const promise = new Promise<string | undefined>(exec);\n\n this.loading.set(name, promise);\n\n return this._fromUrl(\n url,\n (svg: string) => {\n icon.svgString = svg;\n this.icons.set(name, icon);\n\n resolve(svg);\n this.loading.delete(name);\n },\n () => {\n reject(name);\n this.loading.delete(url);\n return this.err(name, url);\n }\n );\n }\n\n throw new Error('Icon url was not set');\n }\n\n /**\n * Register url to SVG file\n * @param url url string\n * @returns SVGSVGElement/undefined or throwing error\n */\n fromUrl(url: string): Observable<SVGSVGElement | undefined> {\n let icon = this.urls.get(url) || {};\n\n if (!icon) {\n icon = {\n url: this.sanitizer.bypassSecurityTrustHtml(url),\n };\n }\n\n if (icon.svgString) {\n return of(this.createSvgFromString(icon.svgString));\n }\n\n return this._fromUrl(\n url,\n (svg: string) => {\n icon.svgString = svg;\n this.urls.set(url, icon);\n },\n () => this.err(undefined, url)\n );\n }\n\n protected _fromUrl(\n url: string,\n cb?: (svg: string) => void,\n cbError?: () => Error\n ): Observable<SVGSVGElement | undefined> {\n return this.http.get(url, { responseType: 'text' }).pipe(\n map((svg) => {\n if (cb) {\n cb(svg);\n }\n return this.createSvgFromString(svg);\n }),\n catchError((_) => {\n // eslint-disable-next-line @typescript-eslint/prefer-optional-chain\n throw (cbError && cbError()) || this.err(undefined, url);\n })\n );\n }\n\n ngOnDestroy(): void {\n this.icons.clear();\n }\n\n protected err(name?: string, url?: string): Error {\n return new Error(`Can't download icon \"${name}\" with url \"${url}\". Please make sure that asset folder in node_modules\n of library @obliczeniowo/elementary was copied by adding script:\n \n \"copy-assets\": \"node ./node_modules/@obliczeniowo/elementary/assets/scripts/copy.js ./src/assets/\",\n \n and run it with npm or registered by you icon have proper path to file in your assets folder`);\n }\n\n protected createSvgFromString(svgString: string): SVGSVGElement | undefined {\n const div = this.document.createElement('DIV');\n div.innerHTML = svgString;\n // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style\n return div.querySelector('svg') as SVGSVGElement;\n }\n}\n","import { IconResourceService } from './../../services/icon-resource.service';\nimport { Component, ElementRef, HostBinding, input, effect } from '@angular/core';\n\n/**\n * Icon component that let you display registered icon with IconResourceService\n *\n * @example\n *\n * <obl-icon name=\"search\" [size]=\"20\"></obl-icon>\n */\n@Component({\n selector: 'obl-icon',\n templateUrl: './icon.component.html',\n styleUrls: ['./icon.component.scss'],\n standalone: false\n})\nexport class IconComponent {\n /**\n * registered icon name\n */\n name = input.required<string>();\n\n /**\n * Width in px or css like things\n */\n width = input<string | number>('var(--obl-icon-width, 20px)');\n\n @HostBinding('style.width') get widthStyle() {\n return typeof this.width() === 'string' && this.width() || this.width() + 'px';\n }\n\n constructor(\n protected iconResource: IconResourceService,\n protected elementRef: ElementRef<HTMLElement>\n ) {\n effect(() => {\n this.iconResource.getIcon(this.name()).subscribe(\n (svg) => {\n if (svg) {\n while (this.elementRef.nativeElement.firstChild) {\n this.elementRef.nativeElement.removeChild(this.elementRef.nativeElement.firstChild);\n }\n svg.style.fill = 'var(--obl-default-icon-color)';\n this.elementRef.nativeElement.appendChild(svg);\n }\n }\n );\n })\n }\n}\n","\n","import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IconComponent } from './components/icon/icon.component';\n\n@NgModule({ declarations: [\n IconComponent\n ],\n exports: [\n IconComponent\n ], imports: [CommonModule], providers: [provideHttpClient(withInterceptorsFromDi())] })\nexport class IconsModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.IconResourceService"],"mappings":"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"}