projects/rebirth-ng/src/lib/rating/rating.component.ts
changeDetection | ChangeDetectionStrategy.OnPush |
exportAs | rating |
providers |
{
: , : (() => ), : true
}
|
selector | re-rating |
styleUrls | rating.component.scss |
templateUrl | ./rating.component.html |
Properties |
|
Methods |
Inputs |
constructor(rebirthNGConfig: RebirthNGConfig, changeDetectorRef: ChangeDetectorRef)
|
|||||||||
Parameters :
|
cssClass
|
Type: |
disabled
|
Default value: |
icons
|
Type: |
max
|
Type: |
enter | ||||||
enter(value: number)
|
||||||
Parameters :
Returns :
void
|
Private fillRatingRange | ||||||
fillRatingRange(range: number)
|
||||||
Parameters :
Returns :
any
|
rate | ||||||
rate(value: number)
|
||||||
Parameters :
Returns :
void
|
registerOnChange | ||||||
registerOnChange(fn: any)
|
||||||
Parameters :
Returns :
void
|
registerOnTouched | ||||||
registerOnTouched(fn: any)
|
||||||
Parameters :
Returns :
void
|
reset |
reset()
|
Returns :
void
|
setDisabledState | ||||||
setDisabledState(isDisabled: boolean)
|
||||||
Parameters :
Returns :
void
|
setRatingValue | ||||||
setRatingValue(value: number)
|
||||||
Parameters :
Returns :
void
|
writeValue | ||||||
writeValue(obj: any)
|
||||||
Parameters :
Returns :
void
|
Private onChange |
onChange:
|
Default value : (_: any) => null
|
Private onTouched |
onTouched:
|
Default value : () => null
|
ratingRanges |
ratingRanges:
|
Type : number[]
|
statValue |
statValue:
|
Type : number
|
Default value : 0
|
value |
value:
|
Type : number
|
Default value : 0
|
valueChange |
valueChange:
|
Default value : new EventEmitter<number>()
|
max | ||||||
setmax(value: number)
|
||||||
Parameters :
Returns :
void
|
import {
Component, Input, EventEmitter, ChangeDetectionStrategy, forwardRef,
ChangeDetectorRef
} from '@angular/core';
import { RebirthNGConfig } from '../rebirth-ng.config';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
@Component({
selector: 're-rating',
templateUrl: './rating.component.html',
styleUrls: ['./rating.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
exportAs: 'rating',
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => RatingComponent),
multi: true
}]
})
export class RatingComponent implements ControlValueAccessor {
ratingRanges: number[];
value = 0;
@Input() disabled = false;
@Input() cssClass: string;
@Input() icons: { stateOn, stateOff };
valueChange = new EventEmitter<number>();
statValue = 0;
private onChange = (_: any) => null;
private onTouched = () => null;
constructor(private rebirthNGConfig: RebirthNGConfig, private changeDetectorRef: ChangeDetectorRef) {
this.icons = rebirthNGConfig.rating.icons;
this.ratingRanges = this.fillRatingRange(rebirthNGConfig.rating.max);
}
@Input()
set max(value: number) {
this.ratingRanges = this.fillRatingRange(value);
}
setRatingValue(value: number) {
this.statValue = this.value = value;
}
writeValue(obj: any): void {
this.setRatingValue(obj);
this.changeDetectorRef.markForCheck();
}
registerOnChange(fn: any): void {
this.onChange = fn;
}
registerOnTouched(fn: any): void {
this.onTouched = fn;
}
setDisabledState(isDisabled: boolean): void {
this.disabled = isDisabled;
}
rate(value: number) {
if (!this.disabled && this.value !== value) {
this.onTouched();
this.setRatingValue(value);
this.valueChange.emit(this.value);
this.onChange(this.value);
}
}
enter(value: number) {
if (!this.disabled) {
this.onTouched();
this.statValue = value;
}
}
reset() {
this.statValue = this.value;
}
private fillRatingRange(range: number) {
return Array<number>(range).fill(0).map((_, i) => i + 1);
}
}
<span aria-labelledby="default-rating" class="rating {{cssClass}}">
<span class="slider" (mouseleave)="reset()" tabindex="0" role="slider"
[attr.aria-valuemin]="0" [attr.aria-valuemax]="ratingRanges.length" [attr.aria-valuenow]="statValue"
[attr.aria-valuetext]="statValue">
<ng-container *ngFor="let item of ratingRanges">
<span class="sr-only">({{statValue >= item? "*": ""}} )</span>
<i (mouseenter)="enter(item)" (click)="rate(item)"
class="{{ statValue < item ? icons.stateOff: icons.stateOn}}"
[attr.title]="item">
</i>
</ng-container>
</span>
</span>