tolga-ng2
Version:
Angular 2/4 components and directives
125 lines • 17.3 kB
JavaScript
import { Component, forwardRef, Input } from '@angular/core';
import { NG_VALUE_ACCESSOR } from "@angular/forms";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/forms";
export class NgsmDatepickerComponent {
constructor() {
this.propagateChange = (_) => { };
}
ngOnInit() {
// this.ngsmService.log("ngsmDatepicker", "ngOnInit");
// if (this.config && this.config.id) {
// this.ngsmService.log("ngsmDatepicker", `ngOnInit: ${this.config.id}`);
// }
}
ngOnChanges() {
if (this.config && this.config.id) {
//this.ngsmService.log("ngsmDatepicker", `ngOnChanges: ${this.config.id}`);
this.init();
}
}
async getClassNames(selectedDate) {
if (this.config.required && !selectedDate)
return "invalid";
else if (this.config.required && selectedDate)
return "valid";
return "";
}
async init() {
//this.ngsmService.log("ngsmDatepicker", "init");
let self = this;
setTimeout(function () {
$(`#${self.config.id}`).calendar({
type: 'date',
minDate: self.config.minDate,
maxDate: self.config.maxDate,
on: "click",
today: true,
formatInput: false,
date: function (date, settings) {
console.log('Date: %s', date);
},
onChange: jQuery.proxy(function (value) {
const isValidDate = moment(value).isValid();
console.log('Is valid date: %s, %s', value, isValidDate);
if (!isValidDate)
return;
let formatedDate = moment(value).format("MM/DD/YYYY");
if (moment(value).isBefore(moment(this.config.minDate))) {
//self.ngsmService.log("ngsmDatepicker", 'Date is before MinDate');
formatedDate = moment().format("MM/DD/YYYY");
}
//self.innerValue = moment(value).format("MM/DD/YYYY");
//self.ngsmService.log("ngsmDatepicker", self.innerValue);
self.propagateChange(formatedDate);
self.getClassNames(formatedDate);
}, self)
});
}, 250);
}
async onKeyupClick(event) {
event.preventDefault();
return;
if (!event)
return;
console.log(event.key);
if (event.key === "Backspace")
return;
}
async innerValueChanged(event) {
if (!event)
return;
const isValidDate = moment(this.value).isValid();
if (!isValidDate) {
return;
}
}
get value() {
//this.ngsmService.log("ngsmDatepicker", `value(): ${this.innerValue}`);
return this.innerValue;
}
;
writeValue(value) {
if (value && value !== null) {
//this.ngsmService.log("ngsmDatepicker", `writeValue: ${value}`);
this.innerValue = value;
}
else {
if (this.config && this.config.id) {
this.innerValue = "";
// this.ngsmService.log("ngsmDatepicker", `clear`);
// let self = this;
// setTimeout(function () {
// (<any>$(`#${self.config.id}`)).calendar('clear');
// }, 200);
}
}
}
onTouchedCallback() { }
registerOnTouched() { }
registerOnChange(fn) {
this.propagateChange = fn;
}
}
NgsmDatepickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgsmDatepickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
NgsmDatepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: NgsmDatepickerComponent, selector: "ngsm-datepicker", inputs: { config: "config" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NgsmDatepickerComponent),
multi: true
}
], usesOnChanges: true, ngImport: i0, template: "<div id=\"{{config.id}}\"\r\n class=\"ui calendar\">\r\n <div class=\"ui input left icon\">\r\n <i class=\"calendar icon\"></i>\r\n <!-- (ngModelChange)=\"innerValueChanged($event)\" -->\r\n <!-- (keyup)=\"onKeyupClick($event)\" -->\r\n <input [(ngModel)]=\"innerValue\" \r\n [ngClass]=\"getClassNames(innerValue)\"\r\n [disabled]=\"config.disabled\"\r\n placeholder=\"{{config.placeholder}}\"\r\n autofocus=\"false\">\r\n </div>\r\n</div>", styles: [".valid{border-left:5px solid #42A948!important}.invalid{border-left:5px solid #a94442!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgsmDatepickerComponent, decorators: [{
type: Component,
args: [{ selector: 'ngsm-datepicker', providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NgsmDatepickerComponent),
multi: true
}
], template: "<div id=\"{{config.id}}\"\r\n class=\"ui calendar\">\r\n <div class=\"ui input left icon\">\r\n <i class=\"calendar icon\"></i>\r\n <!-- (ngModelChange)=\"innerValueChanged($event)\" -->\r\n <!-- (keyup)=\"onKeyupClick($event)\" -->\r\n <input [(ngModel)]=\"innerValue\" \r\n [ngClass]=\"getClassNames(innerValue)\"\r\n [disabled]=\"config.disabled\"\r\n placeholder=\"{{config.placeholder}}\"\r\n autofocus=\"false\">\r\n </div>\r\n</div>", styles: [".valid{border-left:5px solid #42A948!important}.invalid{border-left:5px solid #a94442!important}\n"] }]
}], ctorParameters: function () { return []; }, propDecorators: { config: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdzbS1kYXRlcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbmdzbS9jb21wb25lbnRzL25nc20tZGF0ZXBpY2tlci9uZ3NtLWRhdGVwaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9uZ3NtL2NvbXBvbmVudHMvbmdzbS1kYXRlcGlja2VyL25nc20tZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBaUJ6RSxNQUFNLE9BQU8sdUJBQXVCO0lBTWxDO1FBaUdBLG9CQUFlLEdBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQWpHbEIsQ0FBQztJQUVqQixRQUFRO1FBQ04sc0RBQXNEO1FBQ3RELHVDQUF1QztRQUN2QywyRUFBMkU7UUFDM0UsSUFBSTtJQUNOLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFO1lBQ2pDLDJFQUEyRTtZQUMzRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDYjtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUFDLFlBQW9CO1FBQ3RDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTyxTQUFTLENBQUM7YUFDdkQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxZQUFZO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFDOUQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsS0FBSyxD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c0Q7Z0JBQ3RELFdBQVc7YUFDWjtTQUNGO0lBQ0gsQ0FBQztJQUVELGlCQUFpQixLQUFLLENBQUM7SUFDdkIsaUJBQWlCLEtBQUssQ0FBQztJQUd2QixnQkFBZ0IsQ0FBQyxFQUFFO1FBQ2pCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQzVCLENBQUM7O29IQTNHVSx1QkFBdUI7d0dBQXZCLHVCQUF1Qix3RUFSdkI7UUFDVDtZQUNFLE9BQU8sRUFBRSxpQkFBaUI7WUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztZQUN0RCxLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YsK0NDaEJILHFlQVlNOzJGRE1PLHVCQUF1QjtrQkFabkMsU0FBUzsrQkFDRSxpQkFBaUIsYUFHaEI7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLENBQUM7NEJBQ3RELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGOzBFQUlRLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5wdXQsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgTmdzbURhdGVwaWNrZXJDb25maWcgfSBmcm9tICcuLi8uLi9tb2RlbHMvbmdzbURhdGVwaWNrZXJDb25maWcnO1xyXG5cclxuZGVjbGFyZSB2YXIgbW9tZW50OiBhbnk7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25nc20tZGF0ZXBpY2tlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL25nc20tZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbmdzbS1kYXRlcGlja2VyLmNvbXBvbmVudC5jc3MnXSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5nc21EYXRlcGlja2VyQ29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWVcclxuICAgIH1cclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3NtRGF0ZXBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICBASW5wdXQoKSBjb25maWc6IE5nc21EYXRlcGlja2VyQ29uZmlnO1xyXG5cclxuICBpbm5lclZhbHVlOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgLy8gdGhpcy5uZ3NtU2VydmljZS5sb2coXCJuZ3NtRGF0ZXBpY2tlclwiLCBcIm5nT25Jbml0XCIpO1xyXG4gICAgLy8gaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmlkKSB7XHJcbiAgICAvLyAgIHRoaXMubmdzbVNlcnZpY2UubG9nKFwibmdzbURhdGVwaWNrZXJcIiwgYG5nT25Jbml0OiAke3RoaXMuY29uZmlnLmlkfWApO1xyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoKSB7XHJcbiAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuaWQpIHtcclxuICAgICAgLy90aGlzLm5nc21TZXJ2aWNlLmxvZyhcIm5nc21EYXRlcGlja2VyXCIsIGBuZ09uQ2hhbmdlczogJHt0aGlzLmNvbmZpZy5pZH1gKTtcclxuICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRDbGFzc05hbWVzKHNlbGVjdGVkRGF0ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5jb25maWcucmVxdWlyZWQgJiYgIXNlbGVjdGVkRGF0ZSkgcmV0dXJuIFwiaW52YWxpZFwiO1xyXG4gICAgZWxzZSBpZiAodGhpcy5jb25maWcucmVxdWlyZWQgJiYgc2VsZWN0ZWREYXRlKSByZXR1cm4gXCJ2YWxpZFwiO1xyXG4gICAgcmV0dXJuIFwiXCI7XHJcbiAgfVxyXG5cclxuICBhc3luYyBpbml0KCkge1xyXG4gICAgLy90aGlzLm5nc21TZXJ2aWNlLmxvZyhcIm5nc21EYXRlcGlja2VyXCIsIFwiaW5pdFwiKTtcclxuICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAoPGFueT4kKGAjJHtzZWxmLmNvbmZpZy5pZH1gKSkuY2FsZW5kYXIoe1xyXG4gICAgICAgIHR5cGU6ICdkYXRlJyxcclxuICAgICAgICBtaW5EYXRlOiBzZWxmLmNvbmZpZy5taW5EYXRlLFxyXG4gICAgICAgIG1heERhdGU6IHNlbGYuY29uZmlnLm1heERhdGUsXHJcbiAgICAgICAgb246IFwiY2xpY2tcIixcclxuICAgICAgICB0b2RheTogdHJ1ZSxcclxuICAgICAgICBmb3JtYXRJbnB1dDogZmFsc2UsXHJcbiAgICAgICAgZGF0ZTogZnVuY3Rpb24gKGRhdGUsIHNldHRpbmdzKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnRGF0ZTogJXMnLCBkYXRlKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQ2hhbmdlOiBqUXVlcnkucHJveHkoZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICBjb25zdCBpc1ZhbGlkRGF0ZSA9IG1vbWVudCh2YWx1ZSkuaXNWYWxpZCgpO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0lzIHZhbGlkIGRhdGU6ICVzLCAlcycsIHZhbHVlLCBpc1ZhbGlkRGF0ZSk7XHJcbiAgICAgICAgICBpZiAoIWlzVmFsaWREYXRlKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgbGV0IGZvcm1hdGVkRGF0ZSA9IG1vbWVudCh2YWx1ZSkuZm9ybWF0KFwiTU0vREQvWVlZWVwiKTtcclxuXHJcbiAgICAgICAgICBpZiAobW9tZW50KHZhbHVlKS5pc0JlZm9yZShtb21lbnQodGhpcy5jb25maWcubWluRGF0ZSkpKSB7XHJcbiAgICAgICAgICAgIC8vc2VsZi5uZ3NtU2VydmljZS5sb2coXCJuZ3NtRGF0ZXBpY2tlclwiLCAnRGF0ZSBpcyBiZWZvcmUgTWluRGF0ZScpO1xyXG4gICAgICAgICAgICBmb3JtYXRlZERhdGUgPSBtb21lbnQoKS5mb3JtYXQoXCJNTS9ERC9ZWVlZXCIpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vc2VsZi5pbm5lclZhbHVlID0gbW9tZW50KHZhbHVlKS5mb3JtYXQoXCJNTS9ERC9ZWVlZXCIpO1xyXG4gICAgICAgICAgLy9zZWxmLm5nc21TZXJ2aWNlLmxvZyhcIm5nc21EYXRlcGlja2VyXCIsIHNlbGYuaW5uZXJWYWx1ZSk7XHJcbiAgICAgICAgICBzZWxmLnByb3BhZ2F0ZUNoYW5nZShmb3JtYXRlZERhdGUpO1xyXG4gICAgICAgICAgc2VsZi5nZXRDbGFzc05hbWVzKGZvcm1hdGVkRGF0ZSk7XHJcbiAgICAgICAgfSwgc2VsZilcclxuICAgICAgfSk7XHJcbiAgICB9LCAyNTApO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25LZXl1cENsaWNrKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgcmV0dXJuO1xyXG4gICAgaWYgKCFldmVudCkgcmV0dXJuO1xyXG4gICAgY29uc29sZS5sb2coZXZlbnQua2V5KTtcclxuICAgIGlmIChldmVudC5rZXkgPT09IFwiQmFja3NwYWNlXCIpIHJldHVybjtcclxuICB9XHJcblxyXG4gIGFzeW5jIGlubmVyVmFsdWVDaGFuZ2VkKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICghZXZlbnQpIHJldHVybjtcclxuICAgIGNvbnN0IGlzVmFsaWREYXRlID0gbW9tZW50KHRoaXMudmFsdWUpLmlzVmFsaWQoKTtcclxuICAgIGlmICghaXNWYWxpZERhdGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHZhbHVlKCk6IGFueSB7XHJcbiAgICAvL3RoaXMubmdzbVNlcnZpY2UubG9nKFwibmdzbURhdGVwaWNrZXJcIiwgYHZhbHVlKCk6ICR7dGhpcy5pbm5lclZhbHVlfWApO1xyXG4gICAgcmV0dXJuIHRoaXMuaW5uZXJWYWx1ZTtcclxuICB9O1xyXG5cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAvL3RoaXMubmdzbVNlcnZpY2UubG9nKFwibmdzbURhdGVwaWNrZXJcIiwgYHdyaXRlVmFsdWU6ICR7dmFsdWV9YCk7XHJcbiAgICAgIHRoaXMuaW5uZXJWYWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5pZCkge1xyXG4gICAgICAgIHRoaXMuaW5uZXJWYWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgLy8gdGhpcy5uZ3NtU2VydmljZS5sb2coXCJuZ3NtRGF0ZXBpY2tlclwiLCBgY2xlYXJgKTtcclxuICAgICAgICAvLyBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgLy8gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gICAoPGFueT4kKGAjJHtzZWxmLmNvbmZpZy5pZH1gKSkuY2FsZW5kYXIoJ2NsZWFyJyk7XHJcbiAgICAgICAgLy8gfSwgMjAwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25Ub3VjaGVkQ2FsbGJhY2soKSB7IH1cclxuICByZWdpc3Rlck9uVG91Y2hlZCgpIHsgfVxyXG4gIHByb3BhZ2F0ZUNoYW5nZSA9IChfOiBhbnkpID0+IHsgfTtcclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbikge1xyXG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG5cclxufVxyXG4iLCI8ZGl2IGlkPVwie3tjb25maWcuaWR9fVwiXHJcbiAgY2xhc3M9XCJ1aSBjYWxlbmRhclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJ1aSBpbnB1dCBsZWZ0IGljb25cIj5cclxuICAgIDxpIGNsYXNzPVwiY2FsZW5kYXIgaWNvblwiPjwvaT5cclxuICAgIDwhLS0gKG5nTW9kZWxDaGFuZ2UpPVwiaW5uZXJWYWx1ZUNoYW5nZWQoJGV2ZW50KVwiIC0tPlxyXG4gICAgPCEtLSAoa2V5dXApPVwib25LZXl1cENsaWNrKCRldmVudClcIiAtLT5cclxuICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cImlubmVyVmFsdWVcIiAgICAgICAgICBcclxuICAgICAgW25nQ2xhc3NdPVwiZ2V0Q2xhc3NOYW1lcyhpbm5lclZhbHVlKVwiXHJcbiAgICAgIFtkaXNhYmxlZF09XCJjb25maWcuZGlzYWJsZWRcIlxyXG4gICAgICBwbGFjZWhvbGRlcj1cInt7Y29uZmlnLnBsYWNlaG9sZGVyfX1cIlxyXG4gICAgICBhdXRvZm9jdXM9XCJmYWxzZVwiPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=