{"version":3,"file":"afrorating.mjs","sources":["../../../projects/afrorating/src/lib/afrorating.component.ts","../../../projects/afrorating/src/lib/afrorating.component.html","../../../projects/afrorating/src/public-api.ts","../../../projects/afrorating/src/afrorating.ts"],"sourcesContent":["import { Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output, SimpleChanges, inject } from '@angular/core';\n\n@Component({\n  selector: 'afrorating',\n  standalone: true,\n  imports: [],\n  templateUrl: './afrorating.component.html',\n  styleUrl: './afrorating.component.css'\n})\nexport class AfroRatingComponent implements OnInit, OnDestroy {\n  @Input() total = 5;\n  @Input() rate = 0;\n  @Input() color = \"green\";\n  @Input() readonly = false;\n  @Input() showTooltip = true;\n  @Input() scaleDown = 0.0;\n  @Output() rateChange = new EventEmitter<number>();\n  @Output() hoverChange = new EventEmitter<MouseEvent>();\n\n  icons: any[] = [];\n\n  observer: ResizeObserver | undefined;\n  host: ElementRef;\n  observerSet = false;\n\n  constructor() {\n    this.host = inject(ElementRef);\n    this.host.nativeElement.style.flexGrow = 1;\n  }\n\n  ngOnInit() {\n    this.observer = new ResizeObserver(() => {\n      this.generateIcons(true);\n    });\n    this.observer?.observe(this.host.nativeElement.getElementsByClassName('afrorating')[0])\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['rate']) {\n      this.rate = changes['rate'].currentValue;\n      this.updateIcons(this.rate);\n    }\n    if (changes['total']) {\n      this.generateRating(changes['total'].currentValue);\n      this.updateIcons(this.rate);\n    }\n  }\n\n  handleHover(event: MouseEvent, value: number) {\n    if (!this.readonly && this.rate !== value) {\n      this.updateIcons(value);\n    }\n    this.hoverChange.emit(event);\n  }\n\n  handleHoverOut(event: MouseEvent) {\n    this.updateIcons(this.rate);\n    this.hoverChange.emit(event);\n  }\n\n  handleClick(value: number) {\n    if (!this.readonly && this.rate !== value) {\n      this.rate = value;\n      this.rateChange.emit(this.rate);\n      this.updateIcons(this.rate);\n    }\n  }\n\n  generateRating(total_val: number) {\n    this.icons = [];\n    for (let i = 0; i < total_val; i++) {\n      this.icons[i] = { value: i + 1 }\n    }\n    this.generateIcons();\n  }\n\n  updateIcons(rate: number) {\n\n    let paths: any = this.host.nativeElement.getElementsByClassName(\"afrorating-path\");\n\n    for (const path of paths) {\n      path.setAttribute(\"stroke\", this.color);\n\n      if (rate >= path.dataset.value) {\n        path.setAttribute(\"fill\", this.color);\n      } else {\n        path.setAttribute(\"fill\", \"none\");\n      }\n    }\n\n  }\n\n  generateIcons(replaceChildren = false) {\n\n    const iconSize = Math.floor(this.host.nativeElement.getBoundingClientRect().width / this.total);\n    const viewBox = `0 0 ${iconSize} ${iconSize}`;\n    const scale = iconSize / (100 + this.scaleDown);\n\n    const svgs: any = this.host.nativeElement.getElementsByClassName(\"afrorating-icon\");\n\n    for (const svg of svgs) {\n\n      svg.setAttribute(\"style\", iconSize);\n      svg.setAttribute(\"height\", iconSize);\n      svg.setAttribute(\"viewBox\", viewBox);\n\n      svg.style.cursor = \"pointer\";\n      if (this.readonly) {\n        svg.style.cursor = \"default\";\n      }\n\n      // If path already exists, remove it\n      if (replaceChildren) {\n        svg.replaceChildren();\n      }\n\n      // Add path to SVG\n      const path = this.generatePath(svg, scale)\n      svg.appendChild(path);\n\n      // Transform uses path DOM size, so this must be set after adding to DOM\n      if (this.scaleDown > 0) {\n        const transformValue = (iconSize - path.getBoundingClientRect().width) / 2;\n        path.setAttribute(\"transform\", `translate(${transformValue}, ${transformValue})`);\n      }\n\n    }\n\n    this.updateIcons(this.rate);\n  }\n\n  generatePath(parent: any, scale: number) {\n    const points = [\n      `M ${50 * scale} ${0 * scale}`,\n      `L ${35 * scale} ${40 * scale}`,\n      `L ${0 * scale} ${40 * scale}`,\n      `L ${30 * scale} ${63 * scale}`,\n      `L ${17 * scale} ${100 * scale}`,\n      `L ${50 * scale} ${77 * scale}`,\n      `L ${83 * scale} ${100 * scale}`,\n      `L ${70 * scale} ${63 * scale}`,\n      `L ${100 * scale} ${40 * scale}`,\n      `L ${65 * scale} ${40 * scale}`,\n      `L ${50 * scale} ${0 * scale}`,\n    ].join(\" \");\n\n    let path = document.createElementNS('http://www.w3.org/2000/svg', \"path\");\n    path.classList.add(\"afrorating-path\");\n    path.setAttribute(\"d\", points);\n    path.setAttribute(\"color\", this.color);\n    path.setAttribute(\"stroke\", this.color);\n    path.setAttribute(\"stroke-width\", \"1px\");\n    path.setAttribute(\"data-value\", parent.dataset.value);\n    path.setAttribute(\"fill\", \"none\");\n\n    if (this.rate >= parent.dataset.value) {\n      path.setAttribute(\"fill\", this.color);\n    }\n\n    if (this.showTooltip) {\n      const title = document.createElementNS(\"http://www.w3.org/2000/svg\", \"title\");\n      title.innerHTML = `${parent.dataset.value}`;\n      path.appendChild(title);\n    }\n\n    return path;\n  }\n\n  ngOnDestroy() {\n    this.observer?.observe(this.host.nativeElement.getElementsByClassName('afrorating')[0])\n  }\n\n}\n","<div class=\"afrorating\">\n    @for(icon of icons; track icon.value; let index = $index){\n        <svg class=\"afrorating-icon\" xmlns=\"http://www.w3.org/2000/svg\" [attr.data-value]=\"icon.value\" (click)=\"handleClick(icon.value)\" (mouseenter)=\"handleHover($event, icon.value)\" (mouseleave)=\"handleHoverOut($event)\"></svg>\n    }\n</div>","/*\n * Public API Surface of afrorating\n */\n\nexport * from './lib/afrorating.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}