UNPKG

@obliczeniowo/elementary

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