ng-rating-bar
Version:
Star rating component for angular
179 lines • 17.2 kB
JavaScript
import { Component, Input, Output, EventEmitter } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class NgRatingBarComponent {
constructor() {
this.ratingCount = 7;
this.colorActive = '#edb867';
this.colorDefault = '#d2d2d2';
this.disabled = false;
this.resetAble = false;
this.styles = {
fontSize: '28px',
backgroundColor: '',
margin: '5px',
padding: '0'
};
this.value = 5;
this.valueChange = new EventEmitter();
this.hoverChange = new EventEmitter();
this.symbol = '★';
this.numbers = [];
this.hoverIndex = -1;
this.selectedValue = 0;
this.halfValue = 0;
this.halfIndex = -1;
this.isHovered = false;
}
;
ngOnInit() {
this.ratingCount = this.ratingCount || 5;
this.colorActive = this.colorActive || '#edb867';
this.colorDefault = this.colorDefault || '#d2d2d2';
if (!this.styles) {
this.styles = {
fontSize: '28px',
backgroundColor: '',
margin: '5px',
padding: '0'
};
}
}
ngOnChanges(changes) {
if (changes['value'] || this.control) {
this.initNumbers();
this.calculateHalfValue();
}
}
initNumbers() {
this.numbers = Array(this.ratingCount)
.fill(0)
.map((x, i) => i);
if (this.control) {
this.selectedValue = this.control.value || 0;
}
else {
this.selectedValue = this.value;
}
this.hoverIndex = this.selectedValue - 1;
}
enter(i) {
if (this.disabled) {
return;
}
this.isHovered = true;
this.hoverIndex = i;
this.hoverChange.emit(1 + i);
}
leave(i) {
if (this.disabled) {
return;
}
this.isHovered = false;
this.hoverIndex = this.selectedValue - 1;
}
setSelected(i) {
if (this.disabled) {
return;
}
// set/unset selected value on same value click
if (this.resetAble && this.selectedValue === i + 1) {
this.selectedValue = 0;
}
else {
this.selectedValue = i + 1;
}
if (this.control) {
this.control.setValue(this.selectedValue || null);
this.control.markAsTouched();
}
else {
this.valueChange.emit(this.selectedValue);
}
this.isHovered = false;
this.calculateHalfValue();
}
calculateHalfValue() {
this.halfValue = Math.round(100 * (this.selectedValue - Math.floor(this.selectedValue)));
this.halfIndex = Math.ceil(this.selectedValue) - 1;
}
}
NgRatingBarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: NgRatingBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
NgRatingBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.1", type: NgRatingBarComponent, selector: "ng-rating-bar", inputs: { ratingCount: "ratingCount", colorActive: "colorActive", colorDefault: "colorDefault", disabled: "disabled", resetAble: "resetAble", control: "control", styles: "styles", value: "value", symbol: "symbol" }, outputs: { valueChange: "valueChange", hoverChange: "hoverChange" }, usesOnChanges: true, ngImport: i0, template: `
<ng-container *ngFor="let item of numbers; let i = index">
<span
class="star"
(mouseenter)="enter(i)"
(mouseleave)="leave(i)"
(click)="setSelected(i)"
[ngStyle]="{'color': (i <= hoverIndex) ? colorActive : colorDefault}"
[style.fontSize]="styles.fontSize"
[style.backgroundColor]="styles.backgroundColor"
[style.marginRight]="styles.margin"
[style.padding]="styles.padding"
>
<span [innerHTML]="symbol"></span>
<span
class="star half"
*ngIf="!isHovered && i == halfIndex"
[style.width.%]="halfValue"
[style.color]="colorActive"
[innerHTML]="symbol"
[style.padding]="styles.padding"
>
</span>
</span>
</ng-container>
`, isInline: true, styles: [".star{position:relative}.star:not(.half){min-height:20px;min-width:20px;cursor:pointer;display:inline-block}.star.active{color:inherit}.star.half{height:inherit;font-size:inherit;cursor:pointer;position:absolute;left:0;top:0;display:inline-block;overflow:hidden}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: NgRatingBarComponent, decorators: [{
type: Component,
args: [{ selector: 'ng-rating-bar', template: `
<ng-container *ngFor="let item of numbers; let i = index">
<span
class="star"
(mouseenter)="enter(i)"
(mouseleave)="leave(i)"
(click)="setSelected(i)"
[ngStyle]="{'color': (i <= hoverIndex) ? colorActive : colorDefault}"
[style.fontSize]="styles.fontSize"
[style.backgroundColor]="styles.backgroundColor"
[style.marginRight]="styles.margin"
[style.padding]="styles.padding"
>
<span [innerHTML]="symbol"></span>
<span
class="star half"
*ngIf="!isHovered && i == halfIndex"
[style.width.%]="halfValue"
[style.color]="colorActive"
[innerHTML]="symbol"
[style.padding]="styles.padding"
>
</span>
</span>
</ng-container>
`, styles: [".star{position:relative}.star:not(.half){min-height:20px;min-width:20px;cursor:pointer;display:inline-block}.star.active{color:inherit}.star.half{height:inherit;font-size:inherit;cursor:pointer;position:absolute;left:0;top:0;display:inline-block;overflow:hidden}\n"] }]
}], ctorParameters: function () { return []; }, propDecorators: { ratingCount: [{
type: Input
}], colorActive: [{
type: Input
}], colorDefault: [{
type: Input
}], disabled: [{
type: Input
}], resetAble: [{
type: Input
}], control: [{
type: Input
}], styles: [{
type: Input
}], value: [{
type: Input
}], valueChange: [{
type: Output
}], hoverChange: [{
type: Output
}], symbol: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctcmF0aW5nLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1yYXRpbmctYmFyL3NyYy9saWIvbmctcmF0aW5nLWJhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFHYixNQUFNLGVBQWUsQ0FBQzs7O0FBb0V2QixNQUFNLE9BQU8sb0JBQW9CO0lBMkIvQjtRQTFCUyxnQkFBVyxHQUFXLENBQUMsQ0FBQztRQUN4QixnQkFBVyxHQUFXLFNBQVMsQ0FBQztRQUNoQyxpQkFBWSxHQUFXLFNBQVMsQ0FBQztRQUNqQyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFJbEIsV0FBTSxHQUFXO1lBQ3hCLFFBQVEsRUFBRSxNQUFNO1lBQ2hCLGVBQWUsRUFBRSxFQUFFO1lBQ25CLE1BQU0sRUFBRSxLQUFLO1lBQ2IsT0FBTyxFQUFFLEdBQUc7U0FDYixDQUFDO1FBRU8sVUFBSyxHQUFXLENBQUMsQ0FBQztRQUNqQixnQkFBVyxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBQy9ELGdCQUFXLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFDaEUsV0FBTSxHQUFHLFNBQVMsQ0FBQztRQUU1QixZQUFPLEdBQWtCLEVBQUUsQ0FBQztRQUM1QixlQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDaEIsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEIsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUNkLGNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNmLGNBQVMsR0FBRyxLQUFLLENBQUM7SUFDSCxDQUFDO0lBYmQsQ0FBQztJQWVILFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO1FBQ3pD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QUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUUsQ0FBQztRQUMxRixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyRCxDQUFDOztpSEE1R1Usb0JBQW9CO3FHQUFwQixvQkFBb0IsdVdBeERyQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCVDsyRkErQlUsb0JBQW9CO2tCQTFEaEMsU0FBUzsrQkFDRSxlQUFlLFlBQ2Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5QlQ7MEVBZ0NRLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQU9HLEtBQUs7c0JBQWIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0UsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmludGVyZmFjZSBTdHlsZXMge1xuICBmb250U2l6ZT86IHN0cmluZztcbiAgYmFja2dyb3VuZENvbG9yPzogc3RyaW5nO1xuICBtYXJnaW4/OiBzdHJpbmc7XG4gIHBhZGRpbmc/OiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25nLXJhdGluZy1iYXInLFxuICB0ZW1wbGF0ZTogYFxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIG51bWJlcnM7IGxldCBpID0gaW5kZXhcIj5cbiAgICA8c3BhblxuICAgICAgY2xhc3M9XCJzdGFyXCJcbiAgICAgIChtb3VzZWVudGVyKT1cImVudGVyKGkpXCJcbiAgICAgIChtb3VzZWxlYXZlKT1cImxlYXZlKGkpXCJcbiAgICAgIChjbGljayk9XCJzZXRTZWxlY3RlZChpKVwiXG4gICAgICBbbmdTdHlsZV09XCJ7J2NvbG9yJzogKGkgPD0gaG92ZXJJbmRleCkgPyBjb2xvckFjdGl2ZSA6IGNvbG9yRGVmYXVsdH1cIlxuICAgICAgW3N0eWxlLmZvbnRTaXplXT1cInN0eWxlcy5mb250U2l6ZVwiXG4gICAgICBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cInN0eWxlcy5iYWNrZ3JvdW5kQ29sb3JcIlxuICAgICAgW3N0eWxlLm1hcmdpblJpZ2h0XT1cInN0eWxlcy5tYXJnaW5cIlxuICAgICAgW3N0eWxlLnBhZGRpbmddPVwic3R5bGVzLnBhZGRpbmdcIlxuICAgID5cbiAgICA8c3BhbiBbaW5uZXJIVE1MXT1cInN5bWJvbFwiPjwvc3Bhbj5cbiAgICA8c3BhblxuICAgICAgY2xhc3M9XCJzdGFyIGhhbGZcIlxuICAgICAgKm5nSWY9XCIhaXNIb3ZlcmVkICYmIGkgPT0gaGFsZkluZGV4XCJcbiAgICAgIFtzdHlsZS53aWR0aC4lXT1cImhhbGZWYWx1ZVwiXG4gICAgICBbc3R5bGUuY29sb3JdPVwiY29sb3JBY3RpdmVcIlxuICAgICAgW2lubmVySFRNTF09XCJzeW1ib2xcIlxuICAgICAgW3N0eWxlLnBhZGRpbmddPVwic3R5bGVzLnBhZGRpbmdcIlxuICAgID5cbiAgPC9zcGFuPlxuPC9zcGFuPlxuPC9uZy1jb250YWluZXI+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgIC5zdGFyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIH1cbiAgLnN0YXI6bm90KC5oYWxmKSB7XG4gICAgbWluLWhlaWdodDogMjBweDtcbiAgICBtaW4td2lkdGg6IDIwcHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgfVxuXG4gIC5zdGFyLmFjdGl2ZSB7XG4gICAgY29sb3I6IGluaGVyaXQ7XG4gIH1cblxuICAuc3Rhci5oYWxmIHtcbiAgICAgIGhlaWdodDogaW5oZXJpdDtcbiAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGxlZnQ6IDA7XG4gICAgICB0b3A6IDA7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuXG4gIH1cblxuICBgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ1JhdGluZ0JhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgcmF0aW5nQ291bnQ6IG51bWJlciA9IDc7XG4gIEBJbnB1dCgpIGNvbG9yQWN0aXZlOiBzdHJpbmcgPSAnI2VkYjg2Nyc7XG4gIEBJbnB1dCgpIGNvbG9yRGVmYXVsdDogc3RyaW5nID0gJyNkMmQyZDInO1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSByZXNldEFibGUgPSBmYWxzZTtcblxuICBASW5wdXQoKSBjb250cm9sPzogRm9ybUNvbnRyb2w8bnVtYmVyIHwgbnVsbD47XG5cbiAgQElucHV0KCkgc3R5bGVzOiBTdHlsZXMgPSB7XG4gICAgZm9udFNpemU6ICcyOHB4JyxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICcnLFxuICAgIG1hcmdpbjogJzVweCcsXG4gICAgcGFkZGluZzogJzAnXG4gIH07O1xuXG4gIEBJbnB1dCgpIHZhbHVlOiBudW1iZXIgPSA1O1xuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBob3ZlckNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQElucHV0KCkgc3ltYm9sID0gJyYjOTczMzsnO1xuXG4gIG51bWJlcnM6IEFycmF5PG51bWJlcj4gPSBbXTtcbiAgaG92ZXJJbmRleCA9IC0xO1xuICBzZWxlY3RlZFZhbHVlID0gMDtcbiAgaGFsZlZhbHVlID0gMDtcbiAgaGFsZkluZGV4ID0gLTE7XG4gIGlzSG92ZXJlZCA9IGZhbHNlO1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5yYXRpbmdDb3VudCA9IHRoaXMucmF0aW5nQ291bnQgfHwgNTtcbiAgICB0aGlzLmNvbG9yQWN0aXZlID0gdGhpcy5jb2xvckFjdGl2ZSB8fCAnI2VkYjg2Nyc7XG4gICAgdGhpcy5jb2xvckRlZmF1bHQgPSB0aGlzLmNvbG9yRGVmYXVsdCB8fCAnI2QyZDJkMic7XG5cblxuICAgIGlmICghdGhpcy5zdHlsZXMpIHtcbiAgICAgIHRoaXMuc3R5bGVzID0ge1xuICAgICAgICBmb250U2l6ZTogJzI4cHgnLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcnLFxuICAgICAgICBtYXJnaW46ICc1cHgnLFxuICAgICAgICBwYWRkaW5nOiAnMCdcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWyd2YWx1ZSddIHx8IHRoaXMuY29udHJvbCkge1xuICAgICAgdGhpcy5pbml0TnVtYmVycygpO1xuICAgICAgdGhpcy5jYWxjdWxhdGVIYWxmVmFsdWUoKTtcbiAgICB9XG4gIH1cblxuICBpbml0TnVtYmVycygpIHtcbiAgICB0aGlzLm51bWJlcnMgPSBBcnJheSh0aGlzLnJhdGluZ0NvdW50KVxuICAgICAgLmZpbGwoMClcbiAgICAgIC5tYXAoKHgsIGkpID0+IGkpO1xuICAgIGlmICh0aGlzLmNvbnRyb2wpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZSA9IHRoaXMuY29udHJvbC52YWx1ZSB8fCAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIH1cblxuICAgIHRoaXMuaG92ZXJJbmRleCA9IHRoaXMuc2VsZWN0ZWRWYWx1ZSAtIDE7XG4gIH1cblxuICBlbnRlcihpOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzSG92ZXJlZCA9IHRydWU7XG4gICAgdGhpcy5ob3ZlckluZGV4ID0gaTtcbiAgICB0aGlzLmhvdmVyQ2hhbmdlLmVtaXQoMSArIGkpO1xuXG5cbiAgfVxuICBsZWF2ZShpOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzSG92ZXJlZCA9IGZhbHNlO1xuICAgIHRoaXMuaG92ZXJJbmRleCA9IHRoaXMuc2VsZWN0ZWRWYWx1ZSAtIDE7XG4gIH1cblxuICBzZXRTZWxlY3RlZChpOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHNldC91bnNldCAgc2VsZWN0ZWQgdmFsdWUgb24gc2FtZSB2YWx1ZSBjbGlja1xuICAgIGlmICh0aGlzLnJlc2V0QWJsZSAmJiB0aGlzLnNlbGVjdGVkVmFsdWUgPT09IGkgKyAxKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWUgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWUgPSBpICsgMTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb250cm9sKSB7XG4gICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodGhpcy5zZWxlY3RlZFZhbHVlIHx8IG51bGwpO1xuICAgICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRWYWx1ZSk7XG4gICAgfVxuICAgIHRoaXMuaXNIb3ZlcmVkID0gZmFsc2U7XG4gICAgdGhpcy5jYWxjdWxhdGVIYWxmVmFsdWUoKTtcbiAgfVxuXG4gIGNhbGN1bGF0ZUhhbGZWYWx1ZSgpIHtcbiAgICB0aGlzLmhhbGZWYWx1ZSA9IE1hdGgucm91bmQoMTAwICogKHRoaXMuc2VsZWN0ZWRWYWx1ZSAtIE1hdGguZmxvb3IodGhpcy5zZWxlY3RlZFZhbHVlKSkgKTtcbiAgICB0aGlzLmhhbGZJbmRleCA9IE1hdGguY2VpbCh0aGlzLnNlbGVjdGVkVmFsdWUpIC0gMTtcbiAgfVxuXG59XG4iXX0=