UNPKG

tolga-ng2

Version:

Angular 2/4 components and directives

125 lines 17.3 kB
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=