rm-ng-star-rating
Version:
A highly optimized and fully customizable pure angular component for value range selection.
1 lines • 12.4 kB
Source Map (JSON)
{"version":3,"file":"rm-ng-star-rating.mjs","sources":["../../projects/rm-ng-star-rating/src/lib/rm-ng-star-rating.component.ts","../../projects/rm-ng-star-rating/src/lib/rm-ng-star-rating.component.html","../../projects/rm-ng-star-rating/src/public-api.ts","../../projects/rm-ng-star-rating/src/rm-ng-star-rating.ts"],"sourcesContent":["import {\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n HostBinding,\r\n Input,\r\n OnInit,\r\n Output,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'rm-ng-star-rating',\r\n imports: [CommonModule],\r\n templateUrl: './rm-ng-star-rating.component.html',\r\n styleUrls: ['./rm-ng-star-rating.component.css']\r\n})\r\nexport class RmNgStarRatingComponent implements OnInit {\r\n // @Output() ratingUpdated: EventEmitter<number> = new EventEmitter();\r\n // @Input() @HostBinding('style.--star-color') color: string = 'gold';\r\n // @Input() @HostBinding('style.--star-empty-color') emptyColor: string =\r\n // 'lightgray';\r\n // @Input() @HostBinding('style.--star-size') size: string = '40px';\r\n // @Input() rating: number = 0;\r\n // @Input() starCount: number = 5;\r\n // @Input() readOnly: boolean = false;\r\n // // it is for showing pointing ratiing\r\n // // @Input() decimalRatting: boolean = false;\r\n // // @ViewChild('tooltip', {static: false}) tooltip!: ElementRef;\r\n\r\n // hovered: number = 0;\r\n // hoveredRating: number = 0;\r\n // starsArray: any[] = [];\r\n\r\n // ngOnInit(): void {\r\n // this.starsArray = Array.from({ length: this.starCount });\r\n // }\r\n\r\n // onMouseEnter(index: number, event: MouseEvent): void {\r\n // if (!this.readOnly) {\r\n // this.hovered = index;\r\n // this.hoveredRating = index;\r\n // // it is for showing pointing ratiing\r\n // // this.hoveredRating = this.calculateRating(index, event);\r\n // // const tooltipElement = this.tooltip.nativeElement as HTMLElement;\r\n // // tooltipElement.style.display = 'block';\r\n // // this.positionTooltip(event);\r\n // }\r\n // }\r\n\r\n // onMouseLeave(): void {\r\n // if (!this.readOnly) {\r\n // this.hovered = 0;\r\n // this.hoveredRating = 0;\r\n // // const tooltipElement = this.tooltip.nativeElement as HTMLElement;\r\n // // tooltipElement.style.display = 'none';\r\n // }\r\n // }\r\n\r\n // onClick(index: number): void {\r\n // if (!this.readOnly) {\r\n // this.rating = index;\r\n // // it is for showing pointing ratiing\r\n // // this.rating = this.calculateRating(index);\r\n // this.ratingUpdated.emit(this.rating);\r\n // }\r\n // }\r\n\r\n // getStarClass(index: number): string {\r\n // return this.hovered >= index || this.rating >= index\r\n // ? 'star-filled'\r\n // : 'star-empty';\r\n // }\r\n\r\n // it is for showing pointing ratiing\r\n // getStarClass(index: number): string {\r\n // if (this.hovered >= index || this.rating >= index) {\r\n // const fullStars = Math.floor(this.rating);\r\n // const fractionalPart = this.rating - fullStars;\r\n // if (index === fullStars + 1 && fractionalPart > 0) {\r\n // return 'star-half-filled';\r\n // }\r\n // return 'star-filled';\r\n // }\r\n // return 'star-empty';\r\n // }\r\n\r\n // calculateRating(index: number, event?: MouseEvent): number {\r\n // if (event) {\r\n // const starWidth = (event.target as HTMLElement).offsetWidth;\r\n // const offsetX =\r\n // event.clientX -\r\n // (event.target as HTMLElement).getBoundingClientRect().left;\r\n // const fraction = Math.min(1, Math.max(0, offsetX / starWidth));\r\n // return index - 1 + fraction;\r\n // }\r\n // return index;\r\n // }\r\n\r\n // positionTooltip(event: MouseEvent): void {\r\n // const tooltipElement = this.tooltip.nativeElement as HTMLElement;\r\n // const xOffset = -10; // Distance from the star to the tooltip\r\n // const yOffset = -30; // Position above the star\r\n //\r\n // tooltipElement.style.left = `${event.clientX + xOffset}px`;\r\n // tooltipElement.style.top = `${event.clientY + yOffset}px`;\r\n // }\r\n\r\n @Output() ratingUpdated: EventEmitter<number> = new EventEmitter();\r\n @Input() @HostBinding('style.--star-color') color: string = 'gold';\r\n @Input() @HostBinding('style.--star-empty-color') emptyColor: string = 'lightgray';\r\n @Input() @HostBinding('style.--star-size') size: string = '40px';\r\n @Input() rating: number = 0;\r\n @Input() starCount: number = 5;\r\n @Input() readOnly: boolean = false;\r\n @Input() allowHalf: boolean = true; // NEW: enable half-star support\r\n\r\n hovered: number = 0;\r\n hoveredRating: number = 0;\r\n starsArray: any[] = [];\r\n\r\n ngOnInit(): void {\r\n this.starsArray = Array.from({ length: this.starCount });\r\n }\r\n\r\n onMouseEnter(index: number, event: MouseEvent): void {\r\n if (!this.readOnly) {\r\n if (this.allowHalf) {\r\n this.hoveredRating = this.calculateRating(index, event);\r\n } else {\r\n this.hoveredRating = index;\r\n }\r\n this.hovered = index;\r\n }\r\n }\r\n\r\n onMouseLeave(): void {\r\n if (!this.readOnly) {\r\n this.hovered = 0;\r\n this.hoveredRating = 0;\r\n }\r\n }\r\n\r\n onClick(index: number, event?: MouseEvent): void {\r\n if (!this.readOnly) {\r\n if (this.allowHalf && event) {\r\n this.rating = this.calculateRating(index, event);\r\n } else {\r\n this.rating = index;\r\n }\r\n this.ratingUpdated.emit(this.rating);\r\n }\r\n }\r\n\r\n getStarClass(index: number): string {\r\n const value = this.hoveredRating || this.rating;\r\n if (value >= index) {\r\n return 'star-filled';\r\n } else if (this.allowHalf && value + 0.5 >= index) {\r\n // If value is within half, show half-filled\r\n return 'star-half-filled';\r\n } else {\r\n return 'star-empty';\r\n }\r\n }\r\n\r\n calculateRating(index: number, event?: MouseEvent): number {\r\n if (event) {\r\n const starElement = event.target as HTMLElement;\r\n const { left, width } = starElement.getBoundingClientRect();\r\n const x = event.clientX - left;\r\n if (x < width / 2) {\r\n return index - 0.5;\r\n } else {\r\n return index;\r\n }\r\n }\r\n return index;\r\n }\r\n \r\n}\r\n","<!--<div class=\"star-rating\" [ngStyle]=\"{'font-size.px': size}\">-->\r\n<!-- <span *ngFor=\"let star of [].constructor(starCount); let i = index\"-->\r\n<!-- class=\"star\"-->\r\n<!-- [ngClass]=\"getStarClass(i + 1)\"-->\r\n<!-- (mouseenter)=\"onMouseEnter(i + 1)\"-->\r\n<!-- (mouseleave)=\"onMouseLeave()\"-->\r\n<!-- (click)=\"onClick(i + 1)\">-->\r\n<!-- ★-->\r\n<!-- </span>-->\r\n<!--</div>-->\r\n\r\n<!--<div class=\"star-rating-container\">-->\r\n<!-- <div class=\"star-rating\" [ngStyle]=\"{'font-size.px': size}\">-->\r\n<!-- <span *ngFor=\"let star of starsArray; let i = index\"-->\r\n<!-- class=\"star-wrapper\"-->\r\n<!-- (mouseenter)=\"onMouseEnter(i + 1, $event)\"-->\r\n<!-- (mouseleave)=\"onMouseLeave()\">-->\r\n<!-- <span class=\"star\"-->\r\n<!-- [ngClass]=\"getStarClass(i + 1)\"-->\r\n<!-- (click)=\"onClick(i + 1)\">-->\r\n<!-- ★-->\r\n<!-- </span>-->\r\n<!-- <!– Tooltip displayed above the star –>-->\r\n<!-- <div class=\"tooltip\" #tooltip>-->\r\n<!-- {{ hoveredRating }}-->\r\n<!-- </div>-->\r\n<!-- </span>-->\r\n<!-- </div>-->\r\n<!--</div>-->\r\n\r\n<div class=\"star-rating-container\">\r\n <!-- <div class=\"star-rating\" [ngStyle]=\"{ 'font-size.px': size }\">\r\n <span\r\n *ngFor=\"let star of starsArray; let i = index\"\r\n class=\"star-wrapper\"\r\n (mouseenter)=\"onMouseEnter(i + 1, $event)\"\r\n (mouseleave)=\"onMouseLeave()\"\r\n >\r\n <span\r\n class=\"star\"\r\n [ngClass]=\"getStarClass(i + 1)\"\r\n (click)=\"onClick(i + 1)\"\r\n >\r\n ★\r\n </span>\r\n </span>\r\n </div> -->\r\n <!-- Tooltip element -->\r\n <!-- <div class=\"tooltip\" #tooltip>-->\r\n <!-- {{ hoveredRating }}-->\r\n <!-- </div>-->\r\n\r\n\r\n <div class=\"star-rating\" [ngStyle]=\"{ 'font-size.px': size }\">\r\n <span\r\n *ngFor=\"let star of starsArray; let i = index\"\r\n class=\"star-wrapper\"\r\n (mouseenter)=\"onMouseEnter(i + 1, $event)\"\r\n (mousemove)=\"allowHalf ? onMouseEnter(i + 1, $event) : null\"\r\n (mouseleave)=\"onMouseLeave()\"\r\n >\r\n <span\r\n class=\"star\"\r\n [ngClass]=\"getStarClass(i + 1)\"\r\n (click)=\"onClick(i + 1, $event)\"\r\n >\r\n ★\r\n </span>\r\n </span>\r\n </div>\r\n \r\n</div>\r\n","/*\r\n * Public API Surface of rm-ng-star-rating\r\n */\r\n\r\nexport * from './lib/rm-ng-star-rating.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}