diff --git a/packages/common/src/editors/__tests__/dateEditor.spec.ts b/packages/common/src/editors/__tests__/dateEditor.spec.ts index 020136596..e289d3b02 100644 --- a/packages/common/src/editors/__tests__/dateEditor.spec.ts +++ b/packages/common/src/editors/__tests__/dateEditor.spec.ts @@ -170,7 +170,7 @@ describe('DateEditor', () => { const editorElm = editor.editorDomElement; expect(editor.getValue()).toBe('2001-01-02T11:02:02.000Z'); - expect(editorElm[0].defaultValue).toBe('2001-01-02T11:02:02.000Z'); + expect(editorElm.defaultValue).toBe('2001-01-02T11:02:02.000Z'); }); it('should hide the DOM element when the "hide" method is called', () => { diff --git a/packages/common/src/editors/dateEditor.ts b/packages/common/src/editors/dateEditor.ts index 91e67e58c..7744167db 100644 --- a/packages/common/src/editors/dateEditor.ts +++ b/packages/common/src/editors/dateEditor.ts @@ -20,7 +20,15 @@ import { SlickGrid, SlickNamespace, } from './../interfaces/index'; -import { destroyObjectDomElementProps, getDescendantProperty, mapFlatpickrDateFormatWithFieldType, mapMomentDateFormatWithFieldType, setDeepValue } from './../services/utilities'; +import { + destroyObjectDomElementProps, + emptyElement, + getDescendantProperty, + mapFlatpickrDateFormatWithFieldType, + mapMomentDateFormatWithFieldType, + setDeepValue +} from './../services/utilities'; +import { BindingEventService } from '../services/bindingEvent.service'; import { TranslaterService } from '../services/translater.service'; // using external non-typed js libraries @@ -31,10 +39,11 @@ declare const Slick: SlickNamespace; * https://chmln.github.io/flatpickr */ export class DateEditor implements Editor { - protected _$inputWithData: any; - protected _$input: any; - protected _$editorInputGroupElm: any; - protected _$closeButtonGroupElm: any; + protected _bindEventService: BindingEventService; + protected _closeButtonElm!: HTMLButtonElement; + protected _editorInputGroupElm!: HTMLDivElement; + protected _inputElm!: HTMLInputElement; + protected _inputWithDataElm!: HTMLInputElement | null; protected _isValueTouched = false; protected _lastTriggeredByClearDate = false; protected _originalDate?: string; @@ -64,6 +73,7 @@ export class DateEditor implements Editor { if (this.gridOptions?.translater) { this._translaterService = this.gridOptions.translater; } + this._bindEventService = new BindingEventService(); this.init(); } @@ -83,8 +93,8 @@ export class DateEditor implements Editor { } /** Getter for the Editor DOM Element */ - get editorDomElement(): any { - return this._$input; + get editorDomElement(): HTMLInputElement { + return this._inputElm; } /** Get Flatpickr options passed to the editor by the user */ @@ -102,7 +112,7 @@ export class DateEditor implements Editor { /** Get the Validator function, can be passed in Editor property or Column Definition */ get validator(): EditorValidator | undefined { - return (this.columnEditor && this.columnEditor.validator) || (this.columnDef && this.columnDef.validator); + return this.columnEditor?.validator ?? this.columnDef?.validator; } init(): void { @@ -146,26 +156,39 @@ export class DateEditor implements Editor { this._pickerMergedOptions.altInputClass = 'flatpickr-alt-input form-control'; } - this._$editorInputGroupElm = $(`
`); - const $closeButtonGroupElm = $(``); - this._$closeButtonGroupElm = $(``); + this._editorInputGroupElm = document.createElement('div'); + this._editorInputGroupElm.className = 'flatpickr input-group'; + + const closeButtonGroupElm = document.createElement('span'); + closeButtonGroupElm.className = 'input-group-btn input-group-append'; + closeButtonGroupElm.dataset.clear = ''; + + this._closeButtonElm = document.createElement('button'); + this._closeButtonElm.type = 'button'; + this._closeButtonElm.className = 'btn btn-default icon-clear'; + + this._inputElm = document.createElement('input'); + this._inputElm.dataset.input = ''; + this._inputElm.dataset.defaultdate = this.defaultDate; + this._inputElm.className = inputCssClasses.replace(/\./g, ' '); + this._inputElm.placeholder = placeholder; + this._inputElm.title = title; - this._$input = $(``); - this._$input.appendTo(this._$editorInputGroupElm); + this._editorInputGroupElm.appendChild(this._inputElm); // show clear date button (unless user specifically doesn't want it) if (!this.columnEditor?.params?.hideClearButton) { - this._$closeButtonGroupElm.appendTo($closeButtonGroupElm); - $closeButtonGroupElm.appendTo(this._$editorInputGroupElm); - this._$closeButtonGroupElm.on('click', () => this._lastTriggeredByClearDate = true); + closeButtonGroupElm.appendChild(this._closeButtonElm); + this._editorInputGroupElm.appendChild(closeButtonGroupElm); + this._bindEventService.bind(this._closeButtonElm, 'click', () => this._lastTriggeredByClearDate = true); } - this._$editorInputGroupElm.appendTo(this.args.container); - this.flatInstance = (this._$editorInputGroupElm[0] && typeof this._$editorInputGroupElm[0].flatpickr === 'function') ? this._$editorInputGroupElm[0].flatpickr(this._pickerMergedOptions) : flatpickr(this._$editorInputGroupElm, this._pickerMergedOptions as unknown as Partial