kwikui
Version:
KwikID's UI Component Library in Angular
136 lines • 17.9 kB
JavaScript
import { Component, EventEmitter, Input, Output, forwardRef } from "@angular/core";
import { FormControl, FormGroup, NG_VALUE_ACCESSOR } from "@angular/forms";
import { isNotEmptyValue } from "kwikid-toolkit";
import { throwErrorMessage } from "../../../../helpers/kwikui.common.helpers";
import { DEFAULT_VALUES, VALIDATE_KEY_VALUES } from "./calendar.constants";
import { isValidKeyValue } from "./calendar.validation";
import * as i0 from "@angular/core";
import * as i1 from "@taiga-ui/core";
import * as i2 from "@angular/forms";
export class KwikUICalendarComponent {
constructor() {
this.disabled = DEFAULT_VALUES.disabled;
this.disableItems = DEFAULT_VALUES.disableItems;
this.formControl = new FormControl({});
this.formControlName = DEFAULT_VALUES.formControlName;
this.id = DEFAULT_VALUES.id;
this.isShowAdjacentValues = DEFAULT_VALUES.isShowAdjacentValues;
this.min = DEFAULT_VALUES.min;
this.max = DEFAULT_VALUES.max;
this.value = DEFAULT_VALUES.value;
this.onDayClick = new EventEmitter();
this.onMonthChange = new EventEmitter();
this.getKeyValue = new EventEmitter();
this.formGroup = new FormGroup({});
}
ngOnInit() {
if (isNotEmptyValue(this.formControl.value)) {
this.value = this.formControl.value;
}
}
ngOnChanges(changes) {
const verifyChange = (key) => {
return changes.hasOwnProperty(key) && !changes[key].firstChange;
};
for (const change of Object.entries(changes)) {
const key = change[0];
const value = change[1].currentValue;
this.validateInputProperty(key, value);
}
if (verifyChange("formControl")) {
this.formControl = changes.formControl.currentValue;
this.value = this.formControl.value;
}
if (verifyChange("disabled")) {
this.disabled = Boolean(changes.disabled.currentValue);
this.setDisabled();
}
}
validateInputProperty(key, value) {
if (VALIDATE_KEY_VALUES[key] && !isValidKeyValue(key, value)) {
this[key] = DEFAULT_VALUES[key];
throwErrorMessage("kwikui-calendar", this.id, key, value, DEFAULT_VALUES[key]);
}
}
setDisabled() {
if (this.formGroup.controls[this.formControlName] !== undefined) {
if (this.disabled === true) {
this.formGroup.controls[this.formControlName].disable({
emitEvent: false
});
}
else {
this.formGroup.controls[this.formControlName].enable({
emitEvent: false
});
}
}
}
handleOnDayClick(day) {
this.value = day;
this.emitEvent(this.onDayClick, day);
this.emitEvent(this.getKeyValue, {
key: this.formControlName,
value: this.value
});
}
handleOnMonthChange(month) {
this.emitEvent(this.onMonthChange, month);
}
emitEvent(event, data) {
event.emit(data);
}
/** Method Implementations for Abstract Control */
writeValue(value) { }
registerOnChange(fn) { }
registerOnTouched(fn) { }
setDisabledState(isDisabled) { }
}
/** @nocollapse */ KwikUICalendarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikUICalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ KwikUICalendarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: KwikUICalendarComponent, selector: "kwikui-calendar", inputs: { disabled: "disabled", disableItems: "disableItems", formControl: "formControl", formControlName: "formControlName", id: "id", isShowAdjacentValues: "isShowAdjacentValues", min: "min", max: "max", value: "value" }, outputs: { onDayClick: "onDayClick", onMonthChange: "onMonthChange", getKeyValue: "getKeyValue" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((() => KwikUICalendarComponent)),
multi: true
}
], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"calendar\"\n [class.disabled]=\"disabled\"\n [formGroup]=\"formGroup\"\n>\n <tui-calendar\n [disabledItemHandler]=\"disableItems\"\n [min]=\"min\"\n [max]=\"max\"\n [showAdjacent]=\"isShowAdjacentValues\"\n [value]=\"value\"\n (dayClick)=\"handleOnDayClick($event)\"\n (monthChange)=\"handleOnMonthChange($event)\"\n ></tui-calendar\n></div>\n", styles: [".calendar{width:-moz-fit-content;width:fit-content}.calendar.disabled{opacity:.75;pointer-events:none}\n"], components: [{ type: i1.TuiCalendarComponent, selector: "tui-calendar", inputs: ["initialView", "month", "disabledItemHandler", "min", "max", "minViewedMonth", "maxViewedMonth", "hoveredItem", "showAdjacent", "markerHandler", "value"], outputs: ["dayClick", "monthChange", "hoveredItemChange"] }], directives: [{ type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikUICalendarComponent, decorators: [{
type: Component,
args: [{
selector: "kwikui-calendar",
templateUrl: "./calendar.component.html",
styleUrls: ["./calendar.component.scss"],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((() => KwikUICalendarComponent)),
multi: true
}
]
}]
}], ctorParameters: function () { return []; }, propDecorators: { disabled: [{
type: Input
}], disableItems: [{
type: Input
}], formControl: [{
type: Input
}], formControlName: [{
type: Input
}], id: [{
type: Input
}], isShowAdjacentValues: [{
type: Input
}], min: [{
type: Input
}], max: [{
type: Input
}], value: [{
type: Input
}], onDayClick: [{
type: Output
}], onMonthChange: [{
type: Output
}], getKeyValue: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa3VpL3NyYy9saWIvY29tcG9uZW50cy9jb3JlL2NhbGVuZGFycy9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lrdWkvc3JjL2xpYi9jb21wb25lbnRzL2NvcmUvY2FsZW5kYXJzL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sVUFBVSxFQUNYLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFFTCxXQUFXLEVBQ1gsU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7O0FBY3hELE1BQU0sT0FBTyx1QkFBdUI7SUE0QmxDO1FBMUJTLGFBQVEsR0FBWSxjQUFjLENBQUMsUUFBUSxDQUFDO1FBRTVDLGlCQUFZLEdBQWEsY0FBYyxDQUFDLFlBQVksQ0FBQztRQUVyRCxnQkFBVyxHQUFnQixJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUUvQyxvQkFBZSxHQUFXLGNBQWMsQ0FBQyxlQUFlLENBQUM7UUFFekQsT0FBRSxHQUFXLGNBQWMsQ0FBQyxFQUFFLENBQUM7UUFFL0IseUJBQW9CLEdBQVksY0FBYyxDQUFDLG9C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RyxFQUFFLHdCQUF3QixFQUFDOzRCQUN0RCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtpQkFDRjswRUFHVSxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLEVBQUU7c0JBQVYsS0FBSztnQkFFRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBRUcsR0FBRztzQkFBWCxLQUFLO2dCQUVHLEdBQUc7c0JBQVgsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFR1aURheSwgVHVpTW9udGggfSBmcm9tIFwiQHRhaWdhLXVpL2Nka1wiO1xuaW1wb3J0IHtcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtR3JvdXAsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgaXNOb3RFbXB0eVZhbHVlIH0gZnJvbSBcImt3aWtpZC10b29sa2l0XCI7XG5pbXBvcnQgeyB0aHJvd0Vycm9yTWVzc2FnZSB9IGZyb20gXCIuLi8uLi8uLi8uLi9oZWxwZXJzL2t3aWt1aS5jb21tb24uaGVscGVyc1wiO1xuaW1wb3J0IHsgREVGQVVMVF9WQUxVRVMsIFZBTElEQVRFX0tFWV9WQUxVRVMgfSBmcm9tIFwiLi9jYWxlbmRhci5jb25zdGFudHNcIjtcbmltcG9ydCB7IGlzVmFsaWRLZXlWYWx1ZSB9IGZyb20gXCIuL2NhbGVuZGFyLnZhbGlkYXRpb25cIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImt3aWt1aS1jYWxlbmRhclwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9jYWxlbmRhci5jb21wb25lbnQuc2Nzc1wiXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBLd2lrVUlDYWxlbmRhckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBLd2lrVUlDYWxlbmRhckNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gREVGQVVMVF9WQUxVRVMuZGlzYWJsZWQ7XG5cbiAgQElucHV0KCkgZGlzYWJsZUl0ZW1zOiBGdW5jdGlvbiA9IERFRkFVTFRfVkFMVUVTLmRpc2FibGVJdGVtcztcblxuICBASW5wdXQoKSBmb3JtQ29udHJvbDogRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woe30pO1xuXG4gIEBJbnB1dCgpIGZvcm1Db250cm9sTmFtZTogc3RyaW5nID0gREVGQVVMVF9WQUxVRVMuZm9ybUNvbnRyb2xOYW1lO1xuXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmcgPSBERUZBVUxUX1ZBTFVFUy5pZDtcblxuICBASW5wdXQoKSBpc1Nob3dBZGphY2VudFZhbHVlczogYm9vbGVhbiA9IERFRkFVTFRfVkFMVUVTLmlzU2hvd0FkamFjZW50VmFsdWVzO1xuXG4gIEBJbnB1dCgpIG1pbjogVHVpRGF5ID0gREVGQVVMVF9WQUxVRVMubWluO1xuXG4gIEBJbnB1dCgpIG1heDogVHVpRGF5ID0gREVGQVVMVF9WQUxVRVMubWF4O1xuXG4gIEBJbnB1dCgpIHZhbHVlOiBUdWlEYXkgPSBERUZBVUxUX1ZBTFVFUy52YWx1ZTtcblxuICBAT3V0cHV0KCkgb25EYXlDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAT3V0cHV0KCkgb25Nb250aENoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAT3V0cHV0KCkgZ2V0S2V5VmFsdWU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgZm9ybUdyb3VwOiBGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKGlzTm90RW1wdHlWYWx1ZSh0aGlzLmZvcm1Db250cm9sLnZhbHVlKSkge1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuZm9ybUNvbnRyb2wudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGNvbnN0IHZlcmlmeUNoYW5nZSA9IChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIGNoYW5nZXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhY2hhbmdlc1trZXldLmZpcnN0Q2hhbmdlO1xuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBPYmplY3QuZW50cmllcyhjaGFuZ2VzKSkge1xuICAgICAgY29uc3Qga2V5OiBzdHJpbmcgPSBjaGFuZ2VbMF07XG4gICAgICBjb25zdCB2YWx1ZTogYW55ID0gY2hhbmdlWzFdLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMudmFsaWRhdGVJbnB1dFByb3BlcnR5KGtleSwgdmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJmb3JtQ29udHJvbFwiKSkge1xuICAgICAgdGhpcy5mb3JtQ29udHJvbCA9IGNoYW5nZXMuZm9ybUNvbnRyb2wuY3VycmVudFZhbHVlO1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuZm9ybUNvbnRyb2wudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImRpc2FibGVkXCIpKSB7XG4gICAgICB0aGlzLmRpc2FibGVkID0gQm9vbGVhbihjaGFuZ2VzLmRpc2FibGVkLmN1cnJlbnRWYWx1ZSk7XG4gICAgICB0aGlzLnNldERpc2FibGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUlucHV0UHJvcGVydHkoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoVkFMSURBVEVfS0VZX1ZBTFVFU1trZXldICYmICFpc1ZhbGlkS2V5VmFsdWUoa2V5LCB2YWx1ZSkpIHtcbiAgICAgIHRoaXNba2V5XSA9IERFRkFVTFRfVkFMVUVTW2tleV07XG4gICAgICB0aHJvd0Vycm9yTWVzc2FnZShcbiAgICAgICAgXCJrd2lrdWktY2FsZW5kYXJcIixcbiAgICAgICAgdGhpcy5pZCxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgREVGQVVMVF9WQUxVRVNba2V5XVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzZXREaXNhYmxlZCgpIHtcbiAgICBpZiAodGhpcy5mb3JtR3JvdXAuY29udHJvbHNbdGhpcy5mb3JtQ29udHJvbE5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW3RoaXMuZm9ybUNvbnRyb2xOYW1lXS5kaXNhYmxlKHtcbiAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbdGhpcy5mb3JtQ29udHJvbE5hbWVdLmVuYWJsZSh7XG4gICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYW5kbGVPbkRheUNsaWNrKGRheTogVHVpRGF5KSB7XG4gICAgdGhpcy52YWx1ZSA9IGRheTtcblxuICAgIHRoaXMuZW1pdEV2ZW50KHRoaXMub25EYXlDbGljaywgZGF5KTtcbiAgICB0aGlzLmVtaXRFdmVudCh0aGlzLmdldEtleVZhbHVlLCB7XG4gICAgICBrZXk6IHRoaXMuZm9ybUNvbnRyb2xOYW1lLFxuICAgICAgdmFsdWU6IHRoaXMudmFsdWVcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZU9uTW9udGhDaGFuZ2UobW9udGg6IFR1aU1vbnRoKSB7XG4gICAgdGhpcy5lbWl0RXZlbnQodGhpcy5vbk1vbnRoQ2hhbmdlLCBtb250aCk7XG4gIH1cblxuICBlbWl0RXZlbnQoZXZlbnQ6IGFueSwgZGF0YTogYW55KSB7XG4gICAgZXZlbnQuZW1pdChkYXRhKTtcbiAgfVxuXG4gIC8qKiBNZXRob2QgSW1wbGVtZW50YXRpb25zIGZvciBBYnN0cmFjdCBDb250cm9sICovXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge31cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHt9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge31cblxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7fVxufVxuIiwiPGRpdlxuICBjbGFzcz1cImNhbGVuZGFyXCJcbiAgW2NsYXNzLmRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIlxuPlxuICA8dHVpLWNhbGVuZGFyXG4gICAgW2Rpc2FibGVkSXRlbUhhbmRsZXJdPVwiZGlzYWJsZUl0ZW1zXCJcbiAgICBbbWluXT1cIm1pblwiXG4gICAgW21heF09XCJtYXhcIlxuICAgIFtzaG93QWRqYWNlbnRdPVwiaXNTaG93QWRqYWNlbnRWYWx1ZXNcIlxuICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgKGRheUNsaWNrKT1cImhhbmRsZU9uRGF5Q2xpY2soJGV2ZW50KVwiXG4gICAgKG1vbnRoQ2hhbmdlKT1cImhhbmRsZU9uTW9udGhDaGFuZ2UoJGV2ZW50KVwiXG4gID48L3R1aS1jYWxlbmRhclxuPjwvZGl2PlxuIl19