ang-rating
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.3.18.
232 lines • 18.2 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 {?} */
var customValueProvider = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return AngRatingComponent; })),
multi: true
};
var AngRatingComponent = /** @class */ (function () {
function AngRatingComponent(_renderer, _elementRef) {
this._renderer = _renderer;
this._elementRef = _elementRef;
this._value = '';
this.propagateChange = (/**
* @return {?}
*/
function () { });
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 {?}
*/
AngRatingComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
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 {?}
*/
AngRatingComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value != undefined) {
this._value = value;
this.indxValue = this.items.indexOf(value);
/** @type {?} */
var indx = this.items.indexOf(value);
/** @type {?} */
var percentage = ((indx + 1) / this.items.length) * 100;
/** @type {?} */
var minRateColor = 100 / this.color.length;
/** @type {?} */
var rateArray = [];
for (var i = minRateColor; i < 101; i += minRateColor) {
rateArray.push(i);
}
for (var 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 {?}
*/
AngRatingComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.propagateChange = fn;
};
/**
* @param {?} fn
* @return {?}
*/
AngRatingComponent.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) { };
/**
* @return {?}
*/
AngRatingComponent.prototype.createRating = /**
* @return {?}
*/
function () {
if (this.min < this.max) {
for (var i = this.min; i <= this.max; i += this.step) {
this.items.push(i);
}
}
else {
for (var i = this.min; i >= this.max; i -= this.step) {
this.items.push(i);
}
}
};
/**
* @param {?} event
* @param {?} id
* @return {?}
*/
AngRatingComponent.prototype.update = /**
* @param {?} event
* @param {?} id
* @return {?}
*/
function (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 = function () { return [
{ 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 }]
};
return AngRatingComponent;
}());
export { AngRatingComponent };
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5nLXJhdGluZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmctcmF0aW5nLyIsInNvdXJjZXMiOlsibGliL2FuZy1yYXRpbmcuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsSCxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0lBQ25FLG1CQUFtQixHQUFHO0lBQzFCLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVU7OztJQUFDLGNBQU0sT0FBQSxrQkFBa0IsRUFBbEIsQ0FBa0IsRUFBQztJQUNqRCxLQUFLLEVBQUUsSUFBSTtDQUNaO0FBRUQ7SUE0QkUsNEJBQW9CLFNBQW9CLEVBQVUsV0FBdUI7UUFBckQsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBaEJ6RSxXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osb0JBQWU7OztRQUFRLGNBQVEsQ0FBQyxFQUFDO1FBRXhCLFFBQUcsR0FBRyxFQUFFLENBQUM7UUFDVCxRQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1IsU0FBSSxHQUFHLENBQUMsQ0FBQztRQUNULFNBQUksR0FBRyxNQUFNLENBQUE7UUFDYixTQUFJLEdBQUcsTUFBTSxDQUFDO1FBRWQsVUFBSyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEIsVUFBSyxHQUFHLEtBQUssQ0FBQztRQUNiLGVBQVUsR0FBRyxJQUFJLFlBQVksQ0FBUyxJQUFJLENBQUMsQ0FBQztRQUN0RCxVQUFLLEdBQWEsRUFBRSxDQUFDO0lBSXdELENBQUM7SUFUdkQsQ0FBQzs7OztJQVd4QixxQ0FBUTs7O0lBQVI7UUFDRSxJQUFJLENBQUMsSUFBSSxHQUFHLENB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LG1DQUEyQjs7SUFDM0IsbUNBQXVCOztJQUN2Qix3Q0FBc0Q7O0lBQ3RELG1DQUFxQjs7SUFDckIsdUNBQWlCOzs7OztJQUdMLHVDQUE0Qjs7Ozs7SUFBRSx5Q0FBK0I7Ozs7OztBQTJEM0UsdUNBVUM7OztJQVRDLGlDQUFjOztJQUNkLGtDQUFjOztJQUNkLGdDQUFhOztJQUNiLGdDQUFhOztJQUNiLGtDQUFlOztJQUNmLGtDQUFlOztJQUNmLGlDQUFjOztJQUNkLGtDQUFnQjs7SUFDaEIsa0NBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIGZvcndhcmRSZWYsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgUmVuZGVyZXIyLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5jb25zdCBjdXN0b21WYWx1ZVByb3ZpZGVyID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQW5nUmF0aW5nQ29tcG9uZW50KSxcbiAgbXVsdGk6IHRydWVcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FuZy1yYXRpbmcnLFxuICB0ZW1wbGF0ZVVybDogJy4vYW5nLXJhdGluZy5jb21wb25lbnQuaHRtbCcsXG4gIC8vIHN0eWxlczogW10sXG4gIHN0eWxlVXJsczogWycuL2FuZy1yYXRpbmcuY29tcG9uZW50LnNjc3MnXSxcblxuICBwcm92aWRlcnM6IFtjdXN0b21WYWx1ZVByb3ZpZGVyXVxufSlcbmV4cG9ydCBjbGFzcyBBbmdSYXRpbmdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuXG4gIGluZHhWYWx1ZTogbnVtYmVyO1xuICBfdmFsdWUgPSAnJztcbiAgcHJvcGFnYXRlQ2hhbmdlOiBhbnkgPSAoKSA9PiB7IH07XG4gIEBJbnB1dCgpIHJhdGluZ09iamVjdDogYW55O1xuICBASW5wdXQoKSBtYXggPSAyNTtcbiAgQElucHV0KCkgbWluID0gNTtcbiAgQElucHV0KCkgc3RlcCA9IDU7XG4gIEBJbnB1dCgpIGljb24gPSAnc3RhcidcbiAgQElucHV0KCkgdHlwZSA9ICdpY29uJzs7XG4gIEBJbnB1dCgpIHRpdGxlO1xuICBASW5wdXQoKSBjb2xvciA9IFsnZ3JlZW4nXTtcbiAgQElucHV0KCkgaW5wdXQgPSBmYWxzZTtcbiAgQE91dHB1dCgpIHJhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4odHJ1ZSk7XG4gIGl0ZW1zOiBudW1iZXJbXSA9IFtdO1xuICByYXRlQ29sb3I6IFN0cmluZ1xuXG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZikgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy50eXBlID0gIXRoaXMudHlwZSA/ICdpY29uJyA6IHRoaXMudHlwZTtcbiAgICB0aGlzLm1heCA9ICF0aGlzLm1heCA/IDI1IDogdGhpcy5tYXg7XG4gICAgdGhpcy5taW4gPSAhdGhpcy5taW4gPyA1IDogdGhpcy5taW47XG4gICAgdGhpcy5zdGVwID0gIXRoaXMuc3RlcCA/IDUgOiB0aGlzLnN0ZXA7XG4gICAgdGhpcy5pY29uID0gIXRoaXMuaWNvbiA/ICdzdGFyJyA6IHRoaXMuaWNvbjtcbiAgICB0aGlzLmNvbG9yID0gIXRoaXMuY29sb3IgfHwgIXRoaXMuY29sb3IubGVuZ3RoID8gWydncmVlbiddIDogdGhpcy5jb2xvcjtcbiAgICB0aGlzLmNyZWF0ZVJhdGluZygpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHZhbHVlICE9IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuaW5keFZhbHVlID0gdGhpcy5pdGVtcy5pbmRleE9mKHZhbHVlKTtcbiAgICAgIGxldCBpbmR4ID0gdGhpcy5pdGVtcy5pbmRleE9mKHZhbHVlKTtcbiAgICAgIGxldCBwZXJjZW50YWdlID0gKChpbmR4ICsgMSkgLyB0aGlzLml0ZW1zLmxlbmd0aCkgKiAxMDA7XG4gICAgICBsZXQgbWluUmF0ZUNvbG9yID0gMTAwIC8gdGhpcy5jb2xvci5sZW5ndGg7XG4gICAgICBsZXQgcmF0ZUFycmF5ID0gW107XG4gICAgICBmb3IgKGxldCBpID0gbWluUmF0ZUNvbG9yOyBpIDwgMTAxOyBpICs9IG1pblJhdGVDb2xvcikge1xuICAgICAgICByYXRlQXJyYXkucHVzaChpKTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2xvci5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocmF0ZUFycmF5WzBdID49IHBlcmNlbnRhZ2UpIHtcbiAgICAgICAgICB0aGlzLnJhdGVDb2xvciA9IHRoaXMuY29sb3JbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJhdGVBcnJheVtpXSA8IHBlcmNlbnRhZ2UgJiYgcGVyY2VudGFnZSA8PSByYXRlQXJyYXlbaSArIDFdKSB7XG4gICAgICAgICAgdGhpcy5yYXRlQ29sb3IgPSB0aGlzLmNvbG9yW2kgKyAxXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm4pIHtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHsgfVxuXG4gIGNyZWF0ZVJhdGluZygpIHtcbiAgICBpZiAodGhpcy5taW4gPCB0aGlzLm1heCkge1xuICAgICAgZm9yIChsZXQgaSA9IHRoaXMubWluOyBpIDw9IHRoaXMubWF4OyBpICs9IHRoaXMuc3RlcCkge1xuICAgICAgICB0aGlzLml0ZW1zLnB1c2goaSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZm9yIChsZXQgaSA9IHRoaXMubWluOyBpID49IHRoaXMubWF4OyBpIC09IHRoaXMuc3RlcCkge1xuICAgICAgICB0aGlzLml0ZW1zLnB1c2goaSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlKGV2ZW50LCBpZCkge1xuICAgIHRoaXMuX3ZhbHVlID0gaWQ7XG4gICAgdGhpcy5yYXRlQ2hhbmdlLmVtaXQoaWQpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmF0aW5nRmllbGRDb25maWcge1xuICB0eXBlPzogU3RyaW5nLFxuICB2YWx1ZTogTnVtYmVyLFxuICBtaW4/OiBOdW1iZXIsXG4gIG1heD86IE51bWJlcixcbiAgc3RlcHM/OiBOdW1iZXIsXG4gIHRpdGxlPzogU3RyaW5nLFxuICBpY29uPzogU3RyaW5nLFxuICBpbnB1dD86IEJvb2xlYW4sXG4gIGNvbG9yPzogU3RyaW5nW11cbn0iXX0=