ang-rating
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.3.18.
211 lines • 17.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/ang-rating.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, forwardRef, Input, Output, EventEmitter, Renderer2, ElementRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
/** @type {?} */
const customValueProvider = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
() => AngRatingComponent)),
multi: true
};
export class AngRatingComponent {
/**
* @param {?} _renderer
* @param {?} _elementRef
*/
constructor(_renderer, _elementRef) {
this._renderer = _renderer;
this._elementRef = _elementRef;
this._value = '';
this.propagateChange = (/**
* @return {?}
*/
() => { });
this.max = 25;
this.min = 5;
this.step = 5;
this.icon = 'star';
this.type = 'icon';
this.color = ['green'];
this.input = false;
this.rateChange = new EventEmitter(true);
this.items = [];
}
;
/**
* @return {?}
*/
ngOnInit() {
this.type = !this.type ? 'icon' : this.type;
this.max = !this.max ? 25 : this.max;
this.min = !this.min ? 5 : this.min;
this.step = !this.step ? 5 : this.step;
this.icon = !this.icon ? 'star' : this.icon;
this.color = !this.color || !this.color.length ? ['green'] : this.color;
this.createRating();
}
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
if (value != undefined) {
this._value = value;
this.indxValue = this.items.indexOf(value);
/** @type {?} */
let indx = this.items.indexOf(value);
/** @type {?} */
let percentage = ((indx + 1) / this.items.length) * 100;
/** @type {?} */
let minRateColor = 100 / this.color.length;
/** @type {?} */
let rateArray = [];
for (let i = minRateColor; i < 101; i += minRateColor) {
rateArray.push(i);
}
for (let i = 0; i < this.color.length; i++) {
if (rateArray[0] >= percentage) {
this.rateColor = this.color[0];
}
if (rateArray[i] < percentage && percentage <= rateArray[i + 1]) {
this.rateColor = this.color[i + 1];
}
}
}
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.propagateChange = fn;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) { }
/**
* @return {?}
*/
createRating() {
if (this.min < this.max) {
for (let i = this.min; i <= this.max; i += this.step) {
this.items.push(i);
}
}
else {
for (let i = this.min; i >= this.max; i -= this.step) {
this.items.push(i);
}
}
}
/**
* @param {?} event
* @param {?} id
* @return {?}
*/
update(event, id) {
this._value = id;
this.rateChange.emit(id);
}
}
AngRatingComponent.decorators = [
{ type: Component, args: [{
selector: 'ang-rating',
template: "<mat-card>\r\n <mat-card-content>\r\n <mat-card-title>{{type }}</mat-card-title>\r\n <div *ngIf=\"type == 'dropdown'\" class=\"dropdown-block\">\r\n <mat-select placeholder=\"Select rating\" [(ngModel)]=\"_value\" (ngModelChange)=\"update($event,_value)\" [ngClass]=\"{'disabled': !input}\">\r\n <mat-option *ngFor=\"let item of items\" [value]=\"item\">\r\n {{item}} {{title}}\r\n </mat-option>\r\n </mat-select>\r\n </div>\r\n <div *ngIf=\"type == 'number'\" class=\"number-block\">\r\n <ul class=\"rating-list\">\r\n <li *ngFor=\"let item of items; let i = index\" (click)=\"update($event,item)\" [ngClass]=\"{'disabled': !input}\">\r\n <span class=\"rating-icon\" [style.background-color]=\"indxValue >= i ? rateColor : ''\">\r\n <!-- <div class=\"rating-number\">{{item | positivenumber}}</div> -->\r\n <div class=\"rating-number\">{{item}}</div>\r\n </span>\r\n </li>\r\n </ul>\r\n </div>\r\n <div *ngIf=\"type != 'number' && type != 'dropdown'\" class=\"icon-block\">\r\n <ul class=\"rating-list\">\r\n <li *ngFor=\"let item of items; let i = index\" (click)=\"update($event,item)\" [ngClass]=\"{'disabled': !input}\">\r\n <span class=\"rating-icon\" [style.color]=\"indxValue >= i ? rateColor : ''\">\r\n <i class=\"material-icons\">{{type}}</i>\r\n </span>\r\n </li>\r\n </ul>\r\n </div>\r\n </mat-card-content>\r\n </mat-card>",
providers: [customValueProvider],
styles: [".number-block ul.rating-list li{list-style-type:none;display:inline-block}.number-block ul.rating-list li .rating-icon{width:33px;display:inline-block;border:1px solid #ccc;border-radius:50%;height:33px;margin-right:10px;cursor:pointer;background-color:#ccc;color:#fff}.number-block ul.rating-list li .rating-icon .rating-number{margin:4px auto 0;display:table}.icon-block ul.rating-list li{list-style-type:none;display:inline-block}.icon-block ul.rating-list li .rating-icon{height:33px;margin-right:10px;color:gray;cursor:pointer}.icon-block ul.rating-list li .rating-icon .rating-number{margin:4px auto 0;display:table}.disabled{pointer-events:none;opacity:.6}"]
}] }
];
/** @nocollapse */
AngRatingComponent.ctorParameters = () => [
{ type: Renderer2 },
{ type: ElementRef }
];
AngRatingComponent.propDecorators = {
ratingObject: [{ type: Input }],
max: [{ type: Input }],
min: [{ type: Input }],
step: [{ type: Input }],
icon: [{ type: Input }],
type: [{ type: Input }],
title: [{ type: Input }],
color: [{ type: Input }],
input: [{ type: Input }],
rateChange: [{ type: Output }]
};
if (false) {
/** @type {?} */
AngRatingComponent.prototype.indxValue;
/** @type {?} */
AngRatingComponent.prototype._value;
/** @type {?} */
AngRatingComponent.prototype.propagateChange;
/** @type {?} */
AngRatingComponent.prototype.ratingObject;
/** @type {?} */
AngRatingComponent.prototype.max;
/** @type {?} */
AngRatingComponent.prototype.min;
/** @type {?} */
AngRatingComponent.prototype.step;
/** @type {?} */
AngRatingComponent.prototype.icon;
/** @type {?} */
AngRatingComponent.prototype.type;
/** @type {?} */
AngRatingComponent.prototype.title;
/** @type {?} */
AngRatingComponent.prototype.color;
/** @type {?} */
AngRatingComponent.prototype.input;
/** @type {?} */
AngRatingComponent.prototype.rateChange;
/** @type {?} */
AngRatingComponent.prototype.items;
/** @type {?} */
AngRatingComponent.prototype.rateColor;
/**
* @type {?}
* @private
*/
AngRatingComponent.prototype._renderer;
/**
* @type {?}
* @private
*/
AngRatingComponent.prototype._elementRef;
/* Skipping unhandled member: ;*/
}
/**
* @record
*/
export function RatingFieldConfig() { }
if (false) {
/** @type {?|undefined} */
RatingFieldConfig.prototype.type;
/** @type {?} */
RatingFieldConfig.prototype.value;
/** @type {?|undefined} */
RatingFieldConfig.prototype.min;
/** @type {?|undefined} */
RatingFieldConfig.prototype.max;
/** @type {?|undefined} */
RatingFieldConfig.prototype.steps;
/** @type {?|undefined} */
RatingFieldConfig.prototype.title;
/** @type {?|undefined} */
RatingFieldConfig.prototype.icon;
/** @type {?|undefined} */
RatingFieldConfig.prototype.input;
/** @type {?|undefined} */
RatingFieldConfig.prototype.color;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5nLXJhdGluZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmctcmF0aW5nLyIsInNvdXJjZXMiOlsibGliL2FuZy1yYXRpbmcuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsSCxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O01BQ25FLG1CQUFtQixHQUFHO0lBQzFCLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVU7OztJQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixFQUFDO0lBQ2pELEtBQUssRUFBRSxJQUFJO0NBQ1o7QUFVRCxNQUFNLE9BQU8sa0JBQWtCOzs7OztJQW9CN0IsWUFBb0IsU0FBb0IsRUFBVSxXQUF1QjtRQUFyRCxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFoQnpFLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFDWixvQkFBZTs7O1FBQVEsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFDO1FBRXhCLFFBQUcsR0FBRyxFQUFFLENBQUM7UUFDVCxRQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1IsU0FBSSxHQUFHLENBQUMsQ0FBQztRQUNULFNBQUksR0FBRyxNQUFNLENBQUE7UUFDYixTQUFJLEdBQUcsTUFBTSxDQUFDO1FBRWQsVUFBSyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEIsVUFBSyxHQUFHLEtBQUssQ0FBQztRQUNiLGVBQVUsR0FBRyxJQUFJLFlBQVksQ0FBUyxJQUFJLENBQUMsQ0FBQztRQUN0RCxVQUFLLEdBQWEsRUFBRSxDQUFDO0lBSXdELENBQUM7SUFUdkQsQ0FBQzs7OztJQVd4QixRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUM1QyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDcEMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN2QyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzVDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDeEUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7Ozs7O0lBRUQsVUFBVSxDQUFDLEtBQVU7UUFDbkIsSUFBSSxLQUFLLElBQUksU0FBUyxFQUFFO1lBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7O2dCQUN2QyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFD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NEI7Ozs7O0lBQUUseUNBQStCOzs7Ozs7QUEyRDNFLHVDQVVDOzs7SUFUQyxpQ0FBYzs7SUFDZCxrQ0FBYzs7SUFDZCxnQ0FBYTs7SUFDYixnQ0FBYTs7SUFDYixrQ0FBZTs7SUFDZixrQ0FBZTs7SUFDZixpQ0FBYzs7SUFDZCxrQ0FBZ0I7O0lBQ2hCLGtDQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBmb3J3YXJkUmVmLCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFJlbmRlcmVyMiwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuY29uc3QgY3VzdG9tVmFsdWVQcm92aWRlciA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFuZ1JhdGluZ0NvbXBvbmVudCksXG4gIG11bHRpOiB0cnVlXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhbmctcmF0aW5nJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FuZy1yYXRpbmcuY29tcG9uZW50Lmh0bWwnLFxuICAvLyBzdHlsZXM6IFtdLFxuICBzdHlsZVVybHM6IFsnLi9hbmctcmF0aW5nLmNvbXBvbmVudC5zY3NzJ10sXG5cbiAgcHJvdmlkZXJzOiBbY3VzdG9tVmFsdWVQcm92aWRlcl1cbn0pXG5leHBvcnQgY2xhc3MgQW5nUmF0aW5nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cblxuICBpbmR4VmFsdWU6IG51bWJlcjtcbiAgX3ZhbHVlID0gJyc7XG4gIHByb3BhZ2F0ZUNoYW5nZTogYW55ID0gKCkgPT4geyB9O1xuICBASW5wdXQoKSByYXRpbmdPYmplY3Q6IGFueTtcbiAgQElucHV0KCkgbWF4ID0gMjU7XG4gIEBJbnB1dCgpIG1pbiA9IDU7XG4gIEBJbnB1dCgpIHN0ZXAgPSA1O1xuICBASW5wdXQoKSBpY29uID0gJ3N0YXInXG4gIEBJbnB1dCgpIHR5cGUgPSAnaWNvbic7O1xuICBASW5wdXQoKSB0aXRsZTtcbiAgQElucHV0KCkgY29sb3IgPSBbJ2dyZWVuJ107XG4gIEBJbnB1dCgpIGlucHV0ID0gZmFsc2U7XG4gIEBPdXRwdXQoKSByYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KHRydWUpO1xuICBpdGVtczogbnVtYmVyW10gPSBbXTtcbiAgcmF0ZUNvbG9yOiBTdHJpbmdcblxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIsIHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMudHlwZSA9ICF0aGlzLnR5cGUgPyAnaWNvbicgOiB0aGlzLnR5cGU7XG4gICAgdGhpcy5tYXggPSAhdGhpcy5tYXggPyAyNSA6IHRoaXMubWF4O1xuICAgIHRoaXMubWluID0gIXRoaXMubWluID8gNSA6IHRoaXMubWluO1xuICAgIHRoaXMuc3RlcCA9ICF0aGlzLnN0ZXAgPyA1IDogdGhpcy5zdGVwO1xuICAgIHRoaXMuaWNvbiA9ICF0aGlzLmljb24gPyAnc3RhcicgOiB0aGlzLmljb247XG4gICAgdGhpcy5jb2xvciA9ICF0aGlzLmNvbG9yIHx8ICF0aGlzLmNvbG9yLmxlbmd0aCA/IFsnZ3JlZW4nXSA6IHRoaXMuY29sb3I7XG4gICAgdGhpcy5jcmVhdGVSYXRpbmcoKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIGlmICh2YWx1ZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLmluZHhWYWx1ZSA9IHRoaXMuaXRlbXMuaW5kZXhPZih2YWx1ZSk7XG4gICAgICBsZXQgaW5keCA9IHRoaXMuaXRlbXMuaW5kZXhPZih2YWx1ZSk7XG4gICAgICBsZXQgcGVyY2VudGFnZSA9ICgoaW5keCArIDEpIC8gdGhpcy5pdGVtcy5sZW5ndGgpICogMTAwO1xuICAgICAgbGV0IG1pblJhdGVDb2xvciA9IDEwMCAvIHRoaXMuY29sb3IubGVuZ3RoO1xuICAgICAgbGV0IHJhdGVBcnJheSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IG1pblJhdGVDb2xvcjsgaSA8IDEwMTsgaSArPSBtaW5SYXRlQ29sb3IpIHtcbiAgICAgICAgcmF0ZUFycmF5LnB1c2goaSk7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sb3IubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHJhdGVBcnJheVswXSA+PSBwZXJjZW50YWdlKSB7XG4gICAgICAgICAgdGhpcy5yYXRlQ29sb3IgPSB0aGlzLmNvbG9yWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyYXRlQXJyYXlbaV0gPCBwZXJjZW50YWdlICYmIHBlcmNlbnRhZ2UgPD0gcmF0ZUFycmF5W2kgKyAxXSkge1xuICAgICAgICAgIHRoaXMucmF0ZUNvbG9yID0gdGhpcy5jb2xvcltpICsgMV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuKSB7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7IH1cblxuICBjcmVhdGVSYXRpbmcoKSB7XG4gICAgaWYgKHRoaXMubWluIDwgdGhpcy5tYXgpIHtcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLm1pbjsgaSA8PSB0aGlzLm1heDsgaSArPSB0aGlzLnN0ZXApIHtcbiAgICAgICAgdGhpcy5pdGVtcy5wdXNoKGkpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLm1pbjsgaSA+PSB0aGlzLm1heDsgaSAtPSB0aGlzLnN0ZXApIHtcbiAgICAgICAgdGhpcy5pdGVtcy5wdXNoKGkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZShldmVudCwgaWQpIHtcbiAgICB0aGlzLl92YWx1ZSA9IGlkO1xuICAgIHRoaXMucmF0ZUNoYW5nZS5lbWl0KGlkKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhdGluZ0ZpZWxkQ29uZmlnIHtcbiAgdHlwZT86IFN0cmluZyxcbiAgdmFsdWU6IE51bWJlcixcbiAgbWluPzogTnVtYmVyLFxuICBtYXg/OiBOdW1iZXIsXG4gIHN0ZXBzPzogTnVtYmVyLFxuICB0aXRsZT86IFN0cmluZyxcbiAgaWNvbj86IFN0cmluZyxcbiAgaW5wdXQ/OiBCb29sZWFuLFxuICBjb2xvcj86IFN0cmluZ1tdXG59Il19