From a9f855e91bbef10da2a697852ccf5e17457cdfae Mon Sep 17 00:00:00 2001 From: Julia Volkova Date: Wed, 13 Aug 2025 17:10:53 +0300 Subject: [PATCH 001/101] Toolbar: close menu when a focused item is selected via the enter/space key (T1301705) (#30698) --- .../ui/toolbar/internal/toolbar.menu.list.ts | 2 +- .../ui/toolbar/internal/toolbar.menu.ts | 48 ++++++- .../toolbar.menu.tests.js | 135 ++++++++++++++++++ 3 files changed, 177 insertions(+), 8 deletions(-) diff --git a/packages/devextreme/js/__internal/ui/toolbar/internal/toolbar.menu.list.ts b/packages/devextreme/js/__internal/ui/toolbar/internal/toolbar.menu.list.ts index 3756d70ce9fb..ee47d801d69b 100644 --- a/packages/devextreme/js/__internal/ui/toolbar/internal/toolbar.menu.list.ts +++ b/packages/devextreme/js/__internal/ui/toolbar/internal/toolbar.menu.list.ts @@ -9,7 +9,7 @@ import type { ActionConfig } from '@ts/core/widget/component'; import type { ItemRenderInfo, ItemTemplate } from '@ts/ui/collection/collection_widget.base'; import { ListBase } from '@ts/ui/list/list.base'; -const TOOLBAR_MENU_ACTION_CLASS = 'dx-toolbar-menu-action'; +export const TOOLBAR_MENU_ACTION_CLASS = 'dx-toolbar-menu-action'; const TOOLBAR_HIDDEN_BUTTON_CLASS = 'dx-toolbar-hidden-button'; const TOOLBAR_HIDDEN_BUTTON_GROUP_CLASS = 'dx-toolbar-hidden-button-group'; const TOOLBAR_MENU_SECTION_CLASS = 'dx-toolbar-menu-section'; diff --git a/packages/devextreme/js/__internal/ui/toolbar/internal/toolbar.menu.ts b/packages/devextreme/js/__internal/ui/toolbar/internal/toolbar.menu.ts index ea612a503e44..9668323e01af 100644 --- a/packages/devextreme/js/__internal/ui/toolbar/internal/toolbar.menu.ts +++ b/packages/devextreme/js/__internal/ui/toolbar/internal/toolbar.menu.ts @@ -18,7 +18,7 @@ import Widget from '@ts/core/widget/widget'; import Button from '@ts/ui/button/wrapper'; import type { ListBase } from '@ts/ui/list/list.base'; import Popup from '@ts/ui/popup/m_popup'; -import ToolbarMenuList from '@ts/ui/toolbar/internal/toolbar.menu.list'; +import ToolbarMenuList, { TOOLBAR_MENU_ACTION_CLASS } from '@ts/ui/toolbar/internal/toolbar.menu.list'; import { toggleItemFocusableElementTabIndex } from '@ts/ui/toolbar/toolbar.utils'; const DROP_DOWN_MENU_CLASS = 'dx-dropdownmenu'; @@ -277,8 +277,26 @@ export default class DropDownMenu extends Widget { dragEnabled: false, showTitle: false, fullScreen: false, + ignoreChildEvents: false, _fixWrapperPosition: true, }); + this._popup.registerKeyHandler('space', ( + e: DxEvent, + ) => { + this._popupKeyHandler(e); + }); + this._popup.registerKeyHandler('enter', ( + e: DxEvent, + ) => { + this._popupKeyHandler(e); + }); + this._popup.registerKeyHandler('escape', ( + e: DxEvent, + ): void => { + if (this._popup?.$overlayContent().is($(e.target))) { + this.option('opened', false); + } + }); } _getMaxHeight(): number { @@ -317,12 +335,10 @@ export default class DropDownMenu extends Widget { indicateLoading: false, noDataText: '', itemTemplate, - onItemClick: (e: ItemClickEvent): void => { - const { closeOnClick } = this.option(); - if (closeOnClick) { - this.option('opened', false); - } - this._itemClickAction?.(e); + onItemClick: ( + e: ItemClickEvent, + ) => { + this._itemClickHandler(e); }, tabIndex: -1, focusStateEnabled: false, @@ -332,6 +348,24 @@ export default class DropDownMenu extends Widget { }); } + _popupKeyHandler(e: DxEvent): void { + if ($(e.target).closest(`.${TOOLBAR_MENU_ACTION_CLASS}`).length) { + this._closePopup(); + } + } + + _closePopup(): void { + const { closeOnClick } = this.option(); + if (closeOnClick) { + this.option('opened', false); + } + } + + _itemClickHandler(e: ItemClickEvent): void { + this._closePopup(); + this._itemClickAction?.(e); + } + _itemOptionChanged( item: Item, property: 'disabled', diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/toolbar.menu.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/toolbar.menu.tests.js index 8224365149da..1a8af796c1d5 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/toolbar.menu.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/toolbar.menu.tests.js @@ -3,6 +3,7 @@ import $ from 'jquery'; import ArrayStore from 'common/data/array_store'; import fx from 'common/core/animation/fx'; import Button from 'ui/button'; +import 'ui/check_box'; import Popup from '__internal/ui/popup/m_popup'; import DropDownMenu from '__internal/ui/toolbar/internal/toolbar.menu'; import ToolbarMenuList from '__internal/ui/toolbar/internal/toolbar.menu.list'; @@ -13,6 +14,7 @@ import config from 'core/config'; import { DataSource } from 'common/data/data_source/data_source'; import { isRenderer } from 'core/utils/type'; import themes from 'ui/themes'; +import { shouldSkipOnMobile } from '../../helpers/device.js'; import 'generic_light.css!'; @@ -32,6 +34,8 @@ const DROP_DOWN_MENU_POPUP_CLASS = 'dx-dropdownmenu-popup'; const DROP_DOWN_MENU_POPUP_WRAPPER_CLASS = 'dx-dropdownmenu-popup-wrapper'; const LIST_ITEM_CLASS = 'dx-list-item'; const SCROLLVIEW_CONTENT_CLASS = 'dx-scrollview-content'; +const CHECK_BOX_CLASS = 'dx-checkbox'; +const BUTTON_CLASS = 'dx-button'; const moduleConfig = { @@ -595,6 +599,137 @@ QUnit.module('widget sizing render', moduleConfig, () => { }); + QUnit.module('esc on popup', { + beforeEach: function() { + this.instance.option({ + opened: false, + items: [{ template: () => $('
').dxCheckBox({ value: false }) }], + }); + }, + afterEach: function() { + this.instance.option('opened', false); + } + }, () => { + QUnit.test('esc on popup overlay should close popup', function(assert) { + if(shouldSkipOnMobile(assert)) { + return; + } + + this.overflowMenu.$button().focusin(); + this.keyboard.keyDown('enter'); + + const popup = this.overflowMenu.popup(); + assert.equal(popup.option('visible'), true, 'popup is visible'); + + const $popupContent = popup.$overlayContent(); + + keyboardMock($popupContent).keyDown('esc'); + assert.equal(popup.option('visible'), false, 'esc on popup overlay closed popup'); + }); + + QUnit.test('esc on nested items should NOT close popup', function(assert) { + if(shouldSkipOnMobile(assert)) { + return; + } + + this.overflowMenu.$button().focusin(); + this.keyboard.keyDown('enter'); + + const popup = this.overflowMenu.popup(); + assert.equal(popup.option('visible'), true, 'popup is visible'); + + const $checkBox = this.overflowMenu.$popupContent().find(`.${CHECK_BOX_CLASS}`).first(); + + keyboardMock($checkBox).keyDown('esc'); + assert.equal(popup.option('visible'), true, 'esc on nested item did not close popup'); + }); + }); + + QUnit.module('space/enter on list item (T1301705)', { + beforeEach: function() { + this.instance.option({ + closeOnClick: true, + opened: false, + items: [ + { + template: () => $('
').dxCheckBox({ value: false }), + widget: 'dxCheckBox', + }, + { + template: () => $('
').dxButton({ text: 'Button' }) + }, + ] + }); + }, + afterEach: function() { + this.instance.option('opened', false); + } + }, () => { + QUnit.test('space on a not dxButton in nested list item should NOT close popup', function(assert) { + if(shouldSkipOnMobile(assert)) { + return; + } + + this.overflowMenu.$button().focusin(); + this.keyboard.keyDown('enter'); + + const popup = this.overflowMenu.popup(); + assert.equal(popup.option('visible'), true, 'popup is visible'); + + const $checkBox = this.overflowMenu.$popupContent().find(`.${CHECK_BOX_CLASS}`).first(); + + keyboardMock($checkBox).keyDown('space'); + assert.equal(popup.option('visible'), true, 'space on a dxCheckBox did not close popup'); + }); + + QUnit.test('enter on a not dxButton in nested list item should NOT close popup', function(assert) { + if(shouldSkipOnMobile(assert)) { + return; + } + + this.overflowMenu.$button().focusin(); + this.keyboard.keyDown('enter'); + + const popup = this.overflowMenu.popup(); + assert.equal(popup.option('visible'), true, 'popup is visible'); + + const $checkBox = this.overflowMenu.$popupContent().find(`.${CHECK_BOX_CLASS}`).first(); + + keyboardMock($checkBox).keyDown('enter'); + assert.equal(popup.option('visible'), true, 'enter on a dxCheckBox did not close popup'); + }); + + QUnit.test('space on a dxButton in nested list item should close popup', function(assert) { + if(shouldSkipOnMobile(assert)) { + return; + } + this.overflowMenu.$button().focusin(); + this.keyboard.keyDown('enter'); + + const popup = this.overflowMenu.popup(); + assert.equal(popup.option('visible'), true, 'popup is visible'); + + const $button = this.overflowMenu.$popupContent().find(`.${BUTTON_CLASS}`).first(); + keyboardMock($button).keyDown('space'); + assert.equal(popup.option('visible'), false, 'space on a dxButton closed popup'); + }); + + QUnit.test('enter on a dxButton in nested list item should close popup', function(assert) { + if(shouldSkipOnMobile(assert)) { + return; + } + this.overflowMenu.$button().focusin(); + this.keyboard.keyDown('enter'); + + const popup = this.overflowMenu.popup(); + assert.equal(popup.option('visible'), true, 'popup is visible'); + + const $button = this.overflowMenu.$popupContent().find(`.${BUTTON_CLASS}`).first(); + keyboardMock($button).keyDown('enter'); + assert.equal(popup.option('visible'), false, 'enter on a dxButton closed popup'); + }); + }); + QUnit.test('Enter or space press should call onItemClick (T318240)', function(assert) { let itemClicked = 0; From fd686675648a72eaf2606f5ab0920f2d7d59fb2e Mon Sep 17 00:00:00 2001 From: Ruslan Farkhutdinov Date: Wed, 13 Aug 2025 17:11:41 +0300 Subject: [PATCH 002/101] FileUploader: Remove "m" prefix (#30743) Co-authored-by: Ruslan Farkhutdinov --- .../{m_file_uploader.ts => file_uploader.ts} | 34 ++++--------------- packages/devextreme/js/ui/file_uploader.js | 2 +- 2 files changed, 7 insertions(+), 29 deletions(-) rename packages/devextreme/js/__internal/ui/{m_file_uploader.ts => file_uploader.ts} (97%) diff --git a/packages/devextreme/js/__internal/ui/m_file_uploader.ts b/packages/devextreme/js/__internal/ui/file_uploader.ts similarity index 97% rename from packages/devextreme/js/__internal/ui/m_file_uploader.ts rename to packages/devextreme/js/__internal/ui/file_uploader.ts index 66a9100d1ff1..af993dd5b144 100644 --- a/packages/devextreme/js/__internal/ui/m_file_uploader.ts +++ b/packages/devextreme/js/__internal/ui/file_uploader.ts @@ -234,7 +234,6 @@ class FileBlobReader { }; } - // eslint-disable-next-line class-methods-use-this sliceFile(file: File, startPos: number, length: number): Blob | null { if (file.slice) { return file.slice(startPos, startPos + length); @@ -303,7 +302,7 @@ class FileUploadStrategyBase { file.request = xhr; } - // eslint-disable-next-line @typescript-eslint/no-unused-vars, class-methods-use-this + // eslint-disable-next-line @typescript-eslint/no-unused-vars _createUploadArgument(_file: FileUploaderItem): UploadChunkInfo { // This is an abstract method and should be implemented in subclasses. // Returning a default object to satisfy the return type. @@ -316,7 +315,7 @@ class FileUploadStrategyBase { }; } - // eslint-disable-next-line @typescript-eslint/no-unused-vars, class-methods-use-this + // eslint-disable-next-line @typescript-eslint/no-unused-vars _uploadCore(_file: FileUploaderItem): void { } @@ -335,7 +334,6 @@ class FileUploadStrategyBase { this._handleProgressCore(file, e); } - // eslint-disable-next-line class-methods-use-this _handleProgressCore( // eslint-disable-next-line @typescript-eslint/no-unused-vars _file: FileUploaderItem, @@ -344,7 +342,6 @@ class FileUploadStrategyBase { ): void { } - // eslint-disable-next-line class-methods-use-this _handleFileError(file: FileUploaderItem, error: unknown): void { file._isError = true; file.onError.fire(error); @@ -372,7 +369,6 @@ class FileUploadStrategyBase { return (this._isStatusError(e.status) || !file._isProgressStarted) && !file.isAborted; } - // eslint-disable-next-line class-methods-use-this _isStatusError(status: number): boolean { return (status >= 400 && status < 500) || (status >= 500 && status < 600); } @@ -454,7 +450,6 @@ class FileUploadStrategyBase { } } - // eslint-disable-next-line class-methods-use-this _getLoadedData( loaded: number, total: number, @@ -544,7 +539,6 @@ class ChunksFileUploadStrategyBase extends FileUploadStrategyBase { } } - // eslint-disable-next-line class-methods-use-this _sendChunkCore( // eslint-disable-next-line @typescript-eslint/no-unused-vars _file: FileUploaderItem, @@ -558,7 +552,6 @@ class ChunksFileUploadStrategyBase extends FileUploadStrategyBase { return Deferred().reject(); } - // eslint-disable-next-line class-methods-use-this _tryRaiseStartLoad(file: FileUploaderItem): void { if (!file.isStartLoad) { file.isStartLoad = true; @@ -566,7 +559,7 @@ class ChunksFileUploadStrategyBase extends FileUploadStrategyBase { } } - // eslint-disable-next-line @typescript-eslint/no-unused-vars, class-methods-use-this + // eslint-disable-next-line @typescript-eslint/no-unused-vars _getEvent(_e: Event): null { return null; } @@ -575,7 +568,6 @@ class ChunksFileUploadStrategyBase extends FileUploadStrategyBase { return this._createChunksInfo(file.chunksData); } - // eslint-disable-next-line class-methods-use-this _createChunksInfo(chunksData?: FileUploaderChunksData): UploadChunkInfo { return { bytesUploaded: chunksData?.loadedBytes ?? 0, @@ -655,7 +647,7 @@ class CustomChunksFileUploadStrategy extends ChunksFileUploadStrategyBase { } } - // eslint-disable-next-line @typescript-eslint/no-unused-vars, class-methods-use-this + // eslint-disable-next-line @typescript-eslint/no-unused-vars _shouldHandleError(_file: FileUploaderItem, _error: unknown): boolean { return true; } @@ -681,14 +673,13 @@ class WholeFileUploadStrategyBase extends FileUploadStrategyBase { } } - // eslint-disable-next-line @typescript-eslint/no-unused-vars, class-methods-use-this + // eslint-disable-next-line @typescript-eslint/no-unused-vars _uploadFile(_file: FileUploaderItem): PromiseLike | DeferredObj { // Abstract method: subclasses should override this. // Return a rejected Deferred to satisfy the return type. return Deferred().reject(); } - // eslint-disable-next-line class-methods-use-this _handleProgressCore( file: FileUploaderItem, e: Event | { loaded?: number; total?: number }, @@ -760,7 +751,7 @@ class CustomWholeFileUploadStrategy extends WholeFileUploadStrategyBase { } } - // eslint-disable-next-line @typescript-eslint/no-unused-vars, class-methods-use-this + // eslint-disable-next-line @typescript-eslint/no-unused-vars _shouldHandleError(_file: FileUploaderItem, _e: unknown): boolean { return true; } @@ -1074,7 +1065,6 @@ class FileUploader extends Editor { this.option({ value: files?.concat(value) }); } - // eslint-disable-next-line class-methods-use-this _getFiles(fileList: FileList): File[] { return [...fileList]; } @@ -1218,7 +1208,6 @@ class FileUploader extends Editor { return minFileSize > 0 ? fileSize >= minFileSize : true; } - // eslint-disable-next-line class-methods-use-this _isFileExtensionAllowed(file: File, allowedExtensions: string[]): boolean { for (let i = 0, n = allowedExtensions.length; i < n; i += 1) { let allowedExtension = allowedExtensions[i]; @@ -1276,7 +1265,6 @@ class FileUploader extends Editor { this._dropZoneLeaveAction = this._createActionByOption('onDropZoneLeave'); } - // eslint-disable-next-line class-methods-use-this _createFile(value: File): FileUploaderItem { return { value, @@ -1298,7 +1286,6 @@ class FileUploader extends Editor { }; } - // eslint-disable-next-line class-methods-use-this _resetFileState(file: FileUploaderItem): void { file.isAborted = false; file.uploadStarted = false; @@ -1531,12 +1518,10 @@ class FileUploader extends Editor { ); } - // eslint-disable-next-line class-methods-use-this _hasInvalidFile(files: FileUploaderItem[]): boolean { return files.some((file) => !file.isValid()); } - // eslint-disable-next-line class-methods-use-this _getFileSize(size: number): string { const labels = [ messageLocalization.format('dxFileUploader-bytes'), @@ -1622,7 +1607,6 @@ class FileUploader extends Editor { ); } - // eslint-disable-next-line class-methods-use-this _detachSelectFileDialogHandlers(target: FileDialogEventTarget): void { if (!isDefined(target)) { return; @@ -2007,12 +1991,10 @@ class FileUploader extends Editor { this._setLoadedSize(totalLoadedFilesSize); } - // eslint-disable-next-line class-methods-use-this _getProgressValue(ratio: number): number { return Math.floor(ratio * 100); } - // eslint-disable-next-line class-methods-use-this _initStatusMessage(file: FileUploaderItem): void { file.$statusMessage?.css('display', 'none'); } @@ -2120,7 +2102,6 @@ class FileUploader extends Editor { : (e as MouseEvent).clientY + this._getDocumentScrollTop(); } - // eslint-disable-next-line class-methods-use-this _getTouchEventX(e: TouchEvent): number { let touchPoint: TouchList | null = null; if (e.changedTouches.length > 0) { @@ -2131,7 +2112,6 @@ class FileUploader extends Editor { return touchPoint ? touchPoint[0].pageX : 0; } - // eslint-disable-next-line class-methods-use-this _getTouchEventY(e: TouchEvent): number { let touchPoint: TouchList | null = null; if (e.changedTouches.length > 0) { @@ -2142,13 +2122,11 @@ class FileUploader extends Editor { return touchPoint ? touchPoint[0].pageY : 0; } - // eslint-disable-next-line class-methods-use-this _getDocumentScrollTop(): number { const document = domAdapter.getDocument(); return document.documentElement.scrollTop || document.body.scrollTop; } - // eslint-disable-next-line class-methods-use-this _getDocumentScrollLeft(): number { const document = domAdapter.getDocument(); return document.documentElement.scrollLeft || document.body.scrollLeft; diff --git a/packages/devextreme/js/ui/file_uploader.js b/packages/devextreme/js/ui/file_uploader.js index 29f76ccce87c..28b6c53e40ca 100644 --- a/packages/devextreme/js/ui/file_uploader.js +++ b/packages/devextreme/js/ui/file_uploader.js @@ -1,4 +1,4 @@ -import FileUploader from '../__internal/ui/m_file_uploader'; +import FileUploader from '../__internal/ui/file_uploader'; export default FileUploader; From 993a25fbcc9c4f50eeb3c9ceeb826c81104920c7 Mon Sep 17 00:00:00 2001 From: Ilya Vinogradov Date: Wed, 13 Aug 2025 21:28:53 +0400 Subject: [PATCH 003/101] DataGrid(T1278804): bounces to the top on an attempt to scroll down when an adaptive row is expanded and virtual scrolling is enabled (#30716) --- .../tests/dataGrid/common/scrolling.ts | 63 ++++++++++++++++++- .../m_keyboard_navigation.ts | 4 +- 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/e2e/testcafe-devextreme/tests/dataGrid/common/scrolling.ts b/e2e/testcafe-devextreme/tests/dataGrid/common/scrolling.ts index 35996af8c303..2c0acacacb96 100644 --- a/e2e/testcafe-devextreme/tests/dataGrid/common/scrolling.ts +++ b/e2e/testcafe-devextreme/tests/dataGrid/common/scrolling.ts @@ -20,12 +20,12 @@ async function getRightScrollOffset(dataGrid: DataGrid): Promise { return maxHorizontalOffset - scrollLeft; } -function getData(rowCount, colCount): Record[] { +function getData(rowCount: number, colCount: number): Record[] { const items: Record[] = []; for (let i = 0; i < rowCount; i += 1) { const item: Record = {}; for (let j = 0; j < colCount; j += 1) { - item[`field_${i}_${j}`] = `val_${i}_${j}`; + item[`field_${j}`] = `val_${i}_${j}`; } items.push(item); } @@ -1824,3 +1824,62 @@ test('DataGrid - Scrolling position is reset to far right on an attempt to scrol enabled: false, }, })); + +[true, false].forEach((nativeScroll) => { + type TestCaseWindow = typeof window & { dataGridScrollableEventValues?: number[] }; + + test( + `Should not scroll back on top with virtual scrolling and adaptive master detail (nativeScroll: ${nativeScroll}) [T1278804]`, + async (t) => { + // NOTE: idx + 1 logic inside POM + const adaptiveCellIdx = 101; + const scrollValuesThreshold = 100; + + const dataGrid = new DataGrid('#container'); + const firstRow = dataGrid.getDataRow(0); + const firstDataCell = firstRow.getDataCell(0); + const adaptiveCell = firstRow.getCommandCell(adaptiveCellIdx); + const scrollContainer = dataGrid.getScrollContainer(); + + await t + .click(firstDataCell.element) + .click(adaptiveCell.element); + + await t + .scroll(scrollContainer, 0, 1000) + .scroll(scrollContainer, 0, 1000); + + const scrollOffsets = await t + .eval(() => (window as TestCaseWindow).dataGridScrollableEventValues) as number[]; + + const hasSmallScrollValues = scrollOffsets.some((offset) => offset < scrollValuesThreshold); + await t.expect(hasSmallScrollValues).notOk(); + }, + ).before(async () => { + await createWidget('dxDataGrid', { + dataSource: getData(3, 100).map((item, idx) => ({ ...item, id: idx })), + keyExpr: 'id', + columnHidingEnabled: true, + focusedRowEnabled: true, + scrolling: { + mode: 'virtual', + useNative: nativeScroll, + }, + onContentReady: ({ component }) => { + const testWindow = window as TestCaseWindow; + + component.getScrollable().on('scroll', ({ scrollOffset: { top } }) => { + if (!Array.isArray(testWindow.dataGridScrollableEventValues)) { + testWindow.dataGridScrollableEventValues = []; + } + + testWindow.dataGridScrollableEventValues.push(top); + }); + }, + width: 400, + height: 400, + }); + }).after(async (t) => t.eval(() => { + delete (window as TestCaseWindow).dataGridScrollableEventValues; + })); +}); diff --git a/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_keyboard_navigation.ts b/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_keyboard_navigation.ts index 70117051948f..2caa680a051c 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_keyboard_navigation.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_keyboard_navigation.ts @@ -3006,7 +3006,9 @@ const adaptiveColumns = (Base: ModuleType) => class A protected _hideVisibleColumnInView({ view, isCommandColumn, visibleIndex }) { super._hideVisibleColumnInView({ view, isCommandColumn, visibleIndex }); if (view.name === ROWS_VIEW) { - this._rowsView.renderFocusState(null); + this._rowsView.renderFocusState({ + preventScroll: shouldPreventScroll(this), + }); } } }; From 6005ab1d23b40d05977c7d7da136a8abe8c014e3 Mon Sep 17 00:00:00 2001 From: Alexander Kozlovskiy Date: Thu, 14 Aug 2025 13:30:10 +0400 Subject: [PATCH 004/101] Calendar: improve Views and Selection strategies types (#30688) --- .../js/__internal/core/utils/m_date.ts | 54 ++-- .../ui/calendar/m_calendar.base_view.ts | 280 ++++++++++-------- .../m_calendar.multiple.selection.strategy.ts | 47 ++- .../ui/calendar/m_calendar.navigator.ts | 2 +- .../m_calendar.range.selection.strategy.ts | 122 +++++--- .../calendar/m_calendar.selection.strategy.ts | 59 ++-- .../m_calendar.single.selection.strategy.ts | 42 ++- .../js/__internal/ui/calendar/m_calendar.ts | 157 +++++----- .../ui/calendar/m_calendar.views.ts | 182 ++++++------ .../ui/date_range_box/m_date_range_box.ts | 4 +- .../date_range_box/m_multiselect_date_box.ts | 8 +- .../strategy/m_rangeCalendar.ts | 8 +- packages/devextreme/js/ui/calendar.d.ts | 2 +- .../calendar.tests.js | 38 +-- packages/devextreme/ts/dx.all.d.ts | 2 +- 15 files changed, 575 insertions(+), 432 deletions(-) diff --git a/packages/devextreme/js/__internal/core/utils/m_date.ts b/packages/devextreme/js/__internal/core/utils/m_date.ts index 5b252005804f..897db6958bf4 100644 --- a/packages/devextreme/js/__internal/core/utils/m_date.ts +++ b/packages/devextreme/js/__internal/core/utils/m_date.ts @@ -425,24 +425,26 @@ function getDateIntervalByString(intervalString) { return result; } -function sameDate(date1, date2) { +function sameDate(date1, date2): boolean { return sameMonthAndYear(date1, date2) && date1.getDate() === date2.getDate(); } -function sameMonthAndYear(date1, date2) { +function sameMonthAndYear(date1, date2): boolean { return sameYear(date1, date2) && date1.getMonth() === date2.getMonth(); } -function sameYear(date1, date2) { +function sameYear(date1, date2): boolean { return date1 && date2 && date1.getFullYear() === date2.getFullYear(); } -function sameHoursAndMinutes(date1, date2) { +function sameHoursAndMinutes(date1, date2): boolean { return date1 && date2 && date1.getHours() === date2.getHours() && date1.getMinutes() === date2.getMinutes(); } -const sameDecade = function (date1, date2) { - if (!isDefined(date1) || !isDefined(date2)) return; +const sameDecade = function (date1, date2): boolean { + if (!isDefined(date1) || !isDefined(date2)) { + return false; + } const startDecadeDate1 = date1.getFullYear() - date1.getFullYear() % 10; const startDecadeDate2 = date2.getFullYear() - date2.getFullYear() % 10; @@ -450,8 +452,10 @@ const sameDecade = function (date1, date2) { return date1 && date2 && startDecadeDate1 === startDecadeDate2; }; -const sameCentury = function (date1, date2) { - if (!isDefined(date1) || !isDefined(date2)) return; +const sameCentury = function (date1, date2): boolean { + if (!isDefined(date1) || !isDefined(date2)) { + return false; + } const startCenturyDate1 = date1.getFullYear() - date1.getFullYear() % 100; const startCenturyDate2 = date2.getFullYear() - date2.getFullYear() % 100; @@ -540,20 +544,27 @@ function getLastDateInYear(year) { function getDayWeekNumber(date, firstDayOfWeek) { let day = date.getDay() - firstDayOfWeek + 1; - if (day <= 0) { day += DAYS_IN_WEEK; } + if (day <= 0) { + day += DAYS_IN_WEEK; + } return day; } -function getWeekNumber(date, firstDayOfWeek, rule) { - const firstWeekDayInYear = getDayWeekNumber(getFirstDateInYear(date.getFullYear()), firstDayOfWeek); +function getWeekNumber(date, firstDayOfWeek, rule): number { + const firstWeekDayInYear = getDayWeekNumber( + getFirstDateInYear(date.getFullYear()), + firstDayOfWeek, + ); const lastWeekDayInYear = getDayWeekNumber(getLastDateInYear(date.getFullYear()), firstDayOfWeek); const daysInFirstWeek = DAYS_IN_WEEK - firstWeekDayInYear + 1; let weekNumber = Math.ceil((getDayNumber(date) - daysInFirstWeek) / 7); switch (rule) { case 'fullWeek': { - if (daysInFirstWeek === DAYS_IN_WEEK) { weekNumber++; } + if (daysInFirstWeek === DAYS_IN_WEEK) { + weekNumber += 1; + } if (weekNumber === 0) { const lastDateInPreviousYear = getLastDateInYear(date.getFullYear() - 1); return getWeekNumber(lastDateInPreviousYear, firstDayOfWeek, rule); @@ -561,20 +572,28 @@ function getWeekNumber(date, firstDayOfWeek, rule) { return weekNumber; } case 'firstDay': { - if (daysInFirstWeek > 0) { weekNumber++; } + if (daysInFirstWeek > 0) { + weekNumber += 1; + } const isSunday = firstWeekDayInYear === SUNDAY_WEEK_NUMBER || lastWeekDayInYear === SUNDAY_WEEK_NUMBER; - if ((weekNumber > USUAL_WEEK_COUNT_IN_YEAR && !isSunday) || weekNumber === 54) { weekNumber = 1; } + if ((weekNumber > USUAL_WEEK_COUNT_IN_YEAR && !isSunday) || weekNumber === 54) { + weekNumber = 1; + } return weekNumber; } case 'firstFourDays': { - if (daysInFirstWeek > 3) { weekNumber++; } + if (daysInFirstWeek > 3) { + weekNumber += 1; + } const isThursday = firstWeekDayInYear === THURSDAY_WEEK_NUMBER || lastWeekDayInYear === THURSDAY_WEEK_NUMBER; - if (weekNumber > USUAL_WEEK_COUNT_IN_YEAR && !isThursday) { weekNumber = 1; } + if (weekNumber > USUAL_WEEK_COUNT_IN_YEAR && !isThursday) { + weekNumber = 1; + } if (weekNumber === 0) { const lastDateInPreviousYear = getLastDateInYear(date.getFullYear() - 1); @@ -583,6 +602,7 @@ function getWeekNumber(date, firstDayOfWeek, rule) { return weekNumber; } default: + return weekNumber; break; } } @@ -699,7 +719,7 @@ const makeDate = function (date) { }; const getDatesOfInterval = function (startDate, endDate, step) { - const result: any[] = []; + const result: Date[] = []; let currentDate = new Date(startDate.getTime()); while (currentDate < endDate) { diff --git a/packages/devextreme/js/__internal/ui/calendar/m_calendar.base_view.ts b/packages/devextreme/js/__internal/ui/calendar/m_calendar.base_view.ts index 236aea3a4270..0541cc90ba95 100644 --- a/packages/devextreme/js/__internal/ui/calendar/m_calendar.base_view.ts +++ b/packages/devextreme/js/__internal/ui/calendar/m_calendar.base_view.ts @@ -1,19 +1,22 @@ +import type { template } from '@js/common'; import { name as clickEventName } from '@js/common/core/events/click'; import eventsEngine from '@js/common/core/events/core/events_engine'; import { start as hoverStartEventName } from '@js/common/core/events/hover'; import { addNamespace } from '@js/common/core/events/utils/index'; import dateLocalization from '@js/common/core/localization/date'; import messageLocalization from '@js/common/core/localization/message'; -import Class from '@js/core/class'; import domAdapter from '@js/core/dom_adapter'; import { getPublicElement } from '@js/core/element'; import { data as elementData } from '@js/core/element_data'; import type { dxElementWrapper } from '@js/core/renderer'; import $ from '@js/core/renderer'; -import { noop } from '@js/core/utils/common'; import coreDateUtils from '@js/core/utils/date'; import dateSerialization from '@js/core/utils/date_serialization'; -import type { CalendarSelectionMode, CalendarZoomLevel, DisabledDate } from '@js/ui/calendar'; +import type { DxEvent } from '@js/events'; +import type { + CalendarSelectionMode, CalendarZoomLevel, CellTemplateData, DisabledDate, +} from '@js/ui/calendar'; +import type { DefaultActionArgs } from '@ts/core/widget/component'; import type { OptionChanged } from '@ts/core/widget/types'; import type { WidgetProperties } from '@ts/core/widget/widget'; import Widget from '@ts/core/widget/widget'; @@ -57,11 +60,25 @@ const SELECTION_MODE = { range: 'range', }; +export interface CellEvent extends DefaultActionArgs { + event: DxEvent; + value: Date; +} + +export interface WeekNumberClickEvent extends DefaultActionArgs { + event: DxEvent; + rowDates: Date[]; +} + export interface BaseViewProperties extends WidgetProperties { date: Date; value?: Date | Date[]; + min?: Date; + + max?: Date; + contouredDate?: Date; _todayDate: () => Date; @@ -83,6 +100,14 @@ export interface BaseViewProperties extends WidgetProperties { range: Date[]; hoveredRange: Date[]; + + cellTemplate?: template | ( + (itemData: CellTemplateData, itemIndex: number, itemElement: Element) => dxElementWrapper + ); + + onCellClick?: (e: CellEvent) => void; + onCellHover?: (e: CellEvent) => void; + onWeekNumberClick?: (e: WeekNumberClickEvent) => void; } class BaseView< @@ -92,13 +117,13 @@ class BaseView< $body!: dxElementWrapper; - _disabledDatesHandler?: Date[] | ((data: DisabledDate) => boolean); + _disabledDatesHandler!: ((data: DisabledDate) => boolean); - _cellClickAction!: (e: Record) => void; + _cellClickAction!: (e: CellEvent) => void; - _cellHoverAction!: (e: Record) => void; + _cellHoverAction!: (e: CellEvent) => void; - _weekNumberCellClickAction!: (e: Record) => void; + _weekNumberCellClickAction!: (e: WeekNumberClickEvent) => void; _$rangeEndHoverCell!: dxElementWrapper; @@ -106,15 +131,14 @@ class BaseView< _$rangeEndDateCell!: dxElementWrapper; - _$rangeCells!: dxElementWrapper; + _$rangeCells!: dxElementWrapper[]; - _$hoveredRangeCells!: dxElementWrapper; + _$hoveredRangeCells!: dxElementWrapper[]; _$rangeStartHoverCell!: dxElementWrapper; - _$selectedCells!: dxElementWrapper; + _$selectedCells!: dxElementWrapper[]; - // eslint-disable-next-line class-methods-use-this _getViewName(): string { return 'base'; } @@ -154,7 +178,6 @@ class BaseView< this._updateTableAriaLabel(); } - // eslint-disable-next-line class-methods-use-this _getLocalizedWidgetName(): string { const localizedWidgetName = messageLocalization.format('dxCalendar-ariaWidgetName'); @@ -165,8 +188,8 @@ class BaseView< const { value } = this.option(); const localizedWidgetName = this._getLocalizedWidgetName(); - // @ts-expect-error - const formattedDate = dateLocalization.format(value, ARIA_LABEL_DATE_FORMAT); + const formattedDate = dateLocalization + .format(value as Date | undefined, ARIA_LABEL_DATE_FORMAT); // @ts-expect-error ts-error const selectedDatesText = messageLocalization.format('dxCalendar-selectedDate', formattedDate); @@ -179,8 +202,7 @@ class BaseView< const { value } = this.option(); const localizedWidgetName = this._getLocalizedWidgetName(); - // @ts-expect-error ts-error - const [startDate, endDate] = value; + const [startDate, endDate] = value as [Date, Date]; const formattedStartDate = dateLocalization.format(startDate, ARIA_LABEL_DATE_FORMAT); const formattedEndDate = dateLocalization.format(endDate, ARIA_LABEL_DATE_FORMAT); @@ -207,8 +229,8 @@ class BaseView< _getMultipleRangesText(): string { const { value } = this.option(); - // @ts-expect-error ts-error - const ranges = coreDateUtils.getRangesByDates(value.map((date) => new Date(date))); + const rangeValue = value as Date[]; + const ranges = coreDateUtils.getRangesByDates(rangeValue.map((date) => new Date(date))); if (ranges.length > 2) { // @ts-expect-error ts-error @@ -227,7 +249,7 @@ class BaseView< return result; } - _getRangeText(range) { + _getRangeText(range: [Date | undefined, Date | undefined]): string { const [startDate, endDate] = range; const formattedStartDate = dateLocalization.format(startDate, ARIA_LABEL_DATE_FORMAT); @@ -238,20 +260,18 @@ class BaseView< ? messageLocalization.format('dxCalendar-selectedMultipleDateRange', formattedStartDate, formattedEndDate) : formattedStartDate; - return selectedDatesText; + return `${selectedDatesText}`; } - // @ts-expect-error ts-error - _getTableAriaLabel() { + _getTableAriaLabel(): string { const { value, selectionMode } = this.option(); - const isValueEmpty = !value || Array.isArray(value) && !value.filter(Boolean).length; + const isValueEmpty = !value || (Array.isArray(value) && !value.filter(Boolean).length); if (isValueEmpty) { return this._getLocalizedWidgetName(); } - // eslint-disable-next-line default-case, @typescript-eslint/switch-exhaustiveness-check switch (selectionMode) { case SELECTION_MODE.single: return this._getSingleModeAriaLabel(); @@ -259,10 +279,12 @@ class BaseView< return this._getRangeModeAriaLabel(); case SELECTION_MODE.multiple: return this._getMultipleModeAriaLabel(); + default: + return this._getSingleModeAriaLabel(); } } - _updateTableAriaLabel() { + _updateTableAriaLabel(): void { const label = this._getTableAriaLabel(); this.setAria({ label }, this._$table); @@ -279,17 +301,17 @@ class BaseView< _renderBody(): void { this.$body = $('').appendTo(this._$table); - const rowData = { + const rowData: { cellDate: Date; prevCellDate: Date | null; row: HTMLElement | undefined } = { cellDate: this._getFirstCellData(), prevCellDate: null, + row: undefined, }; const { rowCount: rowsCount, colCount: colsCount } = this.option(); - for (let rowIndex = 0, rowCount = rowsCount; rowIndex < rowCount; rowIndex++) { - // @ts-expect-error ts-error + for (let rowIndex = 0, rowCount = rowsCount; rowIndex < rowCount; rowIndex += 1) { rowData.row = this._createRow(); - for (let colIndex = 0, colCount = colsCount; colIndex < colCount; colIndex++) { + for (let colIndex = 0, colCount = colsCount; colIndex < colCount; colIndex += 1) { this._renderCell(rowData, colIndex); } @@ -298,9 +320,10 @@ class BaseView< } // eslint-disable-next-line @typescript-eslint/no-unused-vars - _renderWeekNumberCell(rowData) {} + _renderWeekNumberCell(rowData?: unknown): void { + } - _createRow() { + _createRow(): HTMLElement { const row = domAdapter.createElement('tr'); this.setAria('role', 'row', $(row)); @@ -309,7 +332,7 @@ class BaseView< return row; } - _createCell(cellDate, cellIndex) { + _createCell(cellDate: Date, cellIndex: number): { cell: HTMLElement; $cell: dxElementWrapper } { const cell = domAdapter.createElement('td'); const $cell = $(cell); @@ -327,7 +350,10 @@ class BaseView< return { cell, $cell }; } - _renderCell(params, cellIndex) { + _renderCell( + params: { cellDate: Date; prevCellDate: Date | null; row: HTMLElement | undefined }, + cellIndex: number, + ): void { const { cellDate, prevCellDate, row } = params; // T425127 @@ -339,7 +365,7 @@ class BaseView< const { cell, $cell } = this._createCell(cellDate, cellIndex); - const cellTemplate = this.option('cellTemplate'); + const { cellTemplate } = this.option(); $(row).append(cell); @@ -347,14 +373,13 @@ class BaseView< // @ts-expect-error ts-error cellTemplate.render(this._prepareCellTemplateData(cellDate, cellIndex, $cell)); } else { - // @ts-expect-error ts-error cell.innerHTML = this._getCellText(cellDate); } params.cellDate = this._getNextCellData(cellDate); } - _getClassNameByDate(cellDate, cellIndex) { + _getClassNameByDate(cellDate: Date, cellIndex: number): string { let className = CALENDAR_CELL_CLASS; if (this._isTodayCell(cellDate)) { @@ -394,7 +419,11 @@ class BaseView< return className; } - _prepareCellTemplateData(cellDate, cellIndex, $cell) { + _prepareCellTemplateData(cellDate: Date, cellIndex: number, $cell: dxElementWrapper): { + model: CellTemplateData; + container: Element; + index: number; + } { const isDateCell = cellDate instanceof Date; const text = isDateCell ? this._getCellText(cellDate) : cellDate; const date = isDateCell ? cellDate : undefined; @@ -415,6 +444,7 @@ class BaseView< if (!$(e.currentTarget).hasClass(CALENDAR_EMPTY_CELL_CLASS)) { this._cellClickAction({ event: e, + // @ts-expect-error ts-error value: $(e.currentTarget).data(CALENDAR_DATE_VALUE_KEY), }); } @@ -426,14 +456,20 @@ class BaseView< if (selectionMode === SELECTION_MODE.range) { this._createCellHoverAction(); - eventsEngine.on(this._$table, CALENDAR_DXHOVERSTART_EVENT_NAME, NOT_WEEK_CELL_SELECTOR, (e) => { - if (!$(e.currentTarget).hasClass(CALENDAR_EMPTY_CELL_CLASS)) { - this._cellHoverAction({ - event: e, - value: $(e.currentTarget).data(CALENDAR_DATE_VALUE_KEY), - }); - } - }); + eventsEngine.on( + this._$table, + CALENDAR_DXHOVERSTART_EVENT_NAME, + NOT_WEEK_CELL_SELECTOR, + (e) => { + if (!$(e.currentTarget).hasClass(CALENDAR_EMPTY_CELL_CLASS)) { + this._cellHoverAction({ + event: e, + // @ts-expect-error ts-error + value: $(e.currentTarget).data(CALENDAR_DATE_VALUE_KEY), + }); + } + }, + ); } if (selectionMode !== SELECTION_MODE.single) { @@ -443,11 +479,15 @@ class BaseView< const $row = $(e.currentTarget).closest('tr'); const firstDateInRow = $row.find(`.${CALENDAR_CELL_CLASS}`).first().data(CALENDAR_DATE_VALUE_KEY); - const lastDateInRow = $row.find(`.${CALENDAR_CELL_CLASS}`).last().data(CALENDAR_DATE_VALUE_KEY); - const rowDates = [...coreDateUtils.getDatesOfInterval(firstDateInRow, lastDateInRow, DAY_INTERVAL), lastDateInRow]; + const lastDateInRow = $row.find(`.${CALENDAR_CELL_CLASS}`).last().data(CALENDAR_DATE_VALUE_KEY) ; + const rowDates = [ + ...coreDateUtils.getDatesOfInterval(firstDateInRow, lastDateInRow, DAY_INTERVAL), + lastDateInRow, + ]; this._weekNumberCellClickAction({ event: e, + // @ts-expect-error ts-error rowDates, }); }); @@ -455,99 +495,90 @@ class BaseView< } _createCellClickAction(): void { - // @ts-expect-error ts-error this._cellClickAction = this._createActionByOption('onCellClick'); } _createCellHoverAction(): void { - // @ts-expect-error ts-error this._cellHoverAction = this._createActionByOption('onCellHover'); } _createWeekNumberCellClickAction(): void { - // @ts-expect-error ts-error this._weekNumberCellClickAction = this._createActionByOption('onWeekNumberClick'); } _createDisabledDatesHandler(): void { const { disabledDates } = this.option(); - // @ts-expect-error ts-error + this._disabledDatesHandler = Array.isArray(disabledDates) ? this._getDefaultDisabledDatesHandler(disabledDates) - // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - : disabledDates || noop; + : disabledDates ?? ((): boolean => false); } // eslint-disable-next-line @typescript-eslint/no-unused-vars - _getDefaultDisabledDatesHandler(disabledDates): (args) => void { - return noop; + _getDefaultDisabledDatesHandler(disabledDates: Date[]): (args) => boolean { + return () => false; } - // @ts-expect-error ts-error // eslint-disable-next-line @typescript-eslint/no-unused-vars - _isTodayCell(cellDate): boolean { - Class.abstract(); + _isTodayCell(cellDate: Date): boolean { + return false; } - // @ts-expect-error ts-error // eslint-disable-next-line @typescript-eslint/no-unused-vars - _isDateOutOfRange(cellDate): boolean { - Class.abstract(); + _isDateOutOfRange(cellDate: Date): boolean { + return false; } - isDateDisabled(cellDate): boolean { + isDateDisabled(cellDate: Date): boolean { const dateParts = { date: cellDate, view: this._getViewName(), }; - // @ts-expect-error ts-error - return this._disabledDatesHandler(dateParts); + + return this._disabledDatesHandler(dateParts as DisabledDate); } - // @ts-expect-error ts-error // eslint-disable-next-line @typescript-eslint/no-unused-vars - _isOtherView(cellDate): boolean { - Class.abstract(); + _isOtherView(cellDate: Date): boolean { + return false; } - // @ts-expect-error ts-error // eslint-disable-next-line @typescript-eslint/no-unused-vars - _isStartDayOfMonth(cellDate): boolean { - Class.abstract(); + _isStartDayOfMonth(cellDate: Date): boolean { + return false; } - // @ts-expect-error ts-error // eslint-disable-next-line @typescript-eslint/no-unused-vars - _isEndDayOfMonth(cellDate): boolean { - Class.abstract(); + _isEndDayOfMonth(cellDate: Date): boolean { + return false; } // eslint-disable-next-line @typescript-eslint/no-unused-vars - _getCellText(cellDate) { - Class.abstract(); + _getCellText(cellDate: Date): string { + return ''; } - _getFirstCellData() { - Class.abstract(); + _getFirstCellData(): Date { + return new Date(); } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _getNextCellData(date) { - Class.abstract(); + _getNextCellData(date: Date): Date { + return new Date(date); } - _renderContouredDate(contouredDate?) { - if (!this.option('focusStateEnabled')) { + _renderContouredDate(contouredDate?: Date | undefined): void { + const { focusStateEnabled } = this.option(); + if (!focusStateEnabled) { return; } - - contouredDate = contouredDate || this.option('contouredDate'); + const { contouredDate: currentContouredDate } = this.option(); + const newContouredDate = contouredDate ?? currentContouredDate; const $oldContouredCell = this._getContouredCell(); - const $newContouredCell = this._getCellByDate(contouredDate); + const $newContouredCell = this._getCellByDate(newContouredDate); $oldContouredCell.removeClass(CALENDAR_CONTOURED_DATE_CLASS); - if (contouredDate) { + if (newContouredDate) { $newContouredCell.addClass(CALENDAR_CONTOURED_DATE_CLASS); } } @@ -561,72 +592,73 @@ class BaseView< return; } - let value = this.option('value'); + let { value = [] } = this.option(); if (!Array.isArray(value)) { - // @ts-expect-error ts-error value = [value]; } this._updateSelectedClass(value); } - _updateSelectedClass(value): void { + _updateSelectedClass(value: Date[]): void { if (this._isRangeMode() && !this._isMonthView()) { return; } - // @ts-expect-error ts-error - this._$selectedCells?.forEach(($cell) => { $cell.removeClass(CALENDAR_SELECTED_DATE_CLASS); }); - this._$selectedCells = value.map((value) => this._getCellByDate(value)); - // @ts-expect-error ts-error + + this._$selectedCells?.forEach(($cell: dxElementWrapper) => { + $cell.removeClass(CALENDAR_SELECTED_DATE_CLASS); + }); + + this._$selectedCells = value.map((date: Date) => this._getCellByDate(date)); this._$selectedCells.forEach(($cell) => { $cell.addClass(CALENDAR_SELECTED_DATE_CLASS); }); } _renderRange(): void { - const { allowValueSelection, value, range } = this.option(); + const { allowValueSelection, value = [], range } = this.option(); if (!allowValueSelection || !this._isRangeMode() || !this._isMonthView()) { return; } - // @ts-expect-error ts-error + this._$rangeCells?.forEach(($cell) => { $cell.removeClass(CALENDAR_CELL_IN_RANGE_CLASS); }); - // @ts-expect-error ts-error - this._$hoveredRangeCells?.forEach(($cell) => { $cell.removeClass(CALENDAR_CELL_RANGE_HOVER_CLASS); }); + this._$hoveredRangeCells?.forEach(($cell) => { + $cell.removeClass(CALENDAR_CELL_RANGE_HOVER_CLASS); + }); this._$rangeStartHoverCell?.removeClass(CALENDAR_CELL_RANGE_HOVER_START_CLASS); this._$rangeEndHoverCell?.removeClass(CALENDAR_CELL_RANGE_HOVER_END_CLASS); this._$rangeStartDateCell?.removeClass(CALENDAR_RANGE_START_DATE_CLASS); this._$rangeEndDateCell?.removeClass(CALENDAR_RANGE_END_DATE_CLASS); - // @ts-expect-error ts-error - this._$rangeCells = range.map((value) => this._getCellByDate(value)); - // @ts-expect-error ts-error + + this._$rangeCells = range.map((date) => this._getCellByDate(date)); this._$rangeStartDateCell = this._getCellByDate(value[0]); - // @ts-expect-error ts-error this._$rangeEndDateCell = this._getCellByDate(value[1]); - // @ts-expect-error ts-error - this._$rangeCells.forEach(($cell) => { $cell.addClass(CALENDAR_CELL_IN_RANGE_CLASS); }); + this._$rangeCells.forEach(($cell) => { $cell.addClass(CALENDAR_CELL_IN_RANGE_CLASS); }); this._$rangeStartDateCell?.addClass(CALENDAR_RANGE_START_DATE_CLASS); this._$rangeEndDateCell?.addClass(CALENDAR_RANGE_END_DATE_CLASS); } - _renderHoveredRange() { + _renderHoveredRange(): void { const { allowValueSelection, hoveredRange } = this.option(); if (!allowValueSelection || !this._isRangeMode() || !this._isMonthView()) { return; } - // @ts-expect-error ts-error - this._$hoveredRangeCells?.forEach(($cell) => { $cell.removeClass(CALENDAR_CELL_RANGE_HOVER_CLASS); }); + + this._$hoveredRangeCells?.forEach(($cell) => { + $cell.removeClass(CALENDAR_CELL_RANGE_HOVER_CLASS); + }); this._$rangeStartHoverCell?.removeClass(CALENDAR_CELL_RANGE_HOVER_START_CLASS); this._$rangeEndHoverCell?.removeClass(CALENDAR_CELL_RANGE_HOVER_END_CLASS); - // @ts-expect-error ts-error + this._$hoveredRangeCells = hoveredRange - .map((value) => this._getCellByDate(value)); + .map((date) => this._getCellByDate(date)); this._$rangeStartHoverCell = this._getCellByDate(hoveredRange[0]); this._$rangeEndHoverCell = this._getCellByDate(hoveredRange[hoveredRange.length - 1]); - // @ts-expect-error ts-error + this._$hoveredRangeCells.forEach(($cell) => { $cell.addClass(CALENDAR_CELL_RANGE_HOVER_CLASS); }); @@ -651,13 +683,13 @@ class BaseView< return null; } - getCellAriaLabel(date) { + getCellAriaLabel(date: Date): string { const viewName = this._getViewName(); const isToday = this._isTodayCell(date); const format = this._getCurrentDateFormat(); const dateRangeText = format - ? dateLocalization.format(date, format) + ? `${dateLocalization.format(date, format)}` : this._getCellText(date); const ariaLabel = isToday @@ -668,23 +700,23 @@ class BaseView< } _getFirstAvailableDate(): Date { - let date = this.option('date'); - const min = this.option('min'); - // @ts-expect-error ts-error - date = coreDateUtils.getViewFirstCellDate(this._getViewName(), date); - // @ts-expect-error ts-error - return new Date(min && date < min ? min : date); + const { date, min } = this.option(); + const firstAvailableDate = coreDateUtils.getViewFirstCellDate( + this._getViewName(), + date, + ) ?? date; + + return new Date(min && firstAvailableDate < min ? min : firstAvailableDate); } - // @ts-expect-error ts-error // eslint-disable-next-line @typescript-eslint/no-unused-vars - _getCellByDate(contouredDate): dxElementWrapper { - Class.abstract(); + _getCellByDate(contouredDate: Date | undefined): dxElementWrapper { + return $(); } - // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars - isBoundary(date?) { - Class.abstract(); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + isBoundary(date?: Date): boolean { + return false; } _optionChanged(args: OptionChanged): void { @@ -701,7 +733,7 @@ class BaseView< this._renderHoveredRange(); break; case 'contouredDate': - this._renderContouredDate(value); + this._renderContouredDate(value as Date | undefined); break; case 'onCellClick': this._createCellClickAction(); diff --git a/packages/devextreme/js/__internal/ui/calendar/m_calendar.multiple.selection.strategy.ts b/packages/devextreme/js/__internal/ui/calendar/m_calendar.multiple.selection.strategy.ts index 61961bf0b882..491f87668d3e 100644 --- a/packages/devextreme/js/__internal/ui/calendar/m_calendar.multiple.selection.strategy.ts +++ b/packages/devextreme/js/__internal/ui/calendar/m_calendar.multiple.selection.strategy.ts @@ -1,23 +1,44 @@ +import type { DxEvent } from '@js/events'; + +import type Calendar from './m_calendar'; +import type { WeekNumberClickEvent } from './m_calendar.base_view'; import CalendarSelectionStrategy from './m_calendar.selection.strategy'; class CalendarMultiSelectionStrategy extends CalendarSelectionStrategy { - constructor(component) { + constructor(component: Calendar) { super(component); this.NAME = 'MultiSelection'; } - getViewOptions() { + dateOption(optionName: 'value'): (Date | null)[]; + dateOption(optionName: 'min' | 'max'): Date | null; + dateOption(optionName: 'min' | 'max' | 'value'): Date | null | (Date | null)[] { + if (optionName === 'value') { + return this.calendar._getDateOption('value') as Date[] | null; + } + return this.calendar._getDateOption(optionName); + } + + getViewOptions(): { + value: (Date | null)[]; + range: Date[]; + selectionMode: 'multiple'; + onWeekNumberClick?: ((e: WeekNumberClickEvent) => void) | null; + } { return { value: this.dateOption('value'), range: [], selectionMode: 'multiple', - onWeekNumberClick: this._shouldHandleWeekNumberClick() ? this._weekNumberClickHandler.bind(this) : null, + onWeekNumberClick: this._shouldHandleWeekNumberClick() + ? this._weekNumberClickHandler.bind(this) + : null, }; } - selectValue(selectedValue, e) { + selectValue(selectedValue: Date, e: DxEvent): void { const value = [...this.dateOption('value')]; - const alreadySelectedIndex = value.findIndex((date) => date?.toDateString() === selectedValue.toDateString()); + const alreadySelectedIndex = value + .findIndex((date) => date?.toDateString() === selectedValue.toDateString()); if (alreadySelectedIndex > -1) { value.splice(alreadySelectedIndex, 1); @@ -31,23 +52,25 @@ class CalendarMultiSelectionStrategy extends CalendarSelectionStrategy { this.dateValue(value, e); } - updateAriaSelected(value?, previousValue?) { - value ??= this.dateOption('value'); - previousValue ??= []; + updateAriaSelected(val?: (Date | null)[], previousVal?: (Date | null)[]): void { + const value = val ?? this.dateOption('value'); + const previousValue = previousVal ?? []; super.updateAriaSelected(value, previousValue); } - getDefaultCurrentDate() { - const dates = this.dateOption('value').filter(Boolean); + getDefaultCurrentDate(): Date | null { + const value = this.dateOption('value'); + const dates = value.filter((date) => date !== null); + return this._getLowestDateInArray(dates); } - restoreValue() { + restoreValue(): void { this.calendar.option('value', []); } - _weekNumberClickHandler({ rowDates, event }) { + _weekNumberClickHandler({ rowDates, event }: WeekNumberClickEvent): void { const selectedDates = rowDates.filter((date) => !this._isDateDisabled(date)); this.dateValue(selectedDates, event); diff --git a/packages/devextreme/js/__internal/ui/calendar/m_calendar.navigator.ts b/packages/devextreme/js/__internal/ui/calendar/m_calendar.navigator.ts index 11d486a7e460..df4ed75f69cb 100644 --- a/packages/devextreme/js/__internal/ui/calendar/m_calendar.navigator.ts +++ b/packages/devextreme/js/__internal/ui/calendar/m_calendar.navigator.ts @@ -17,7 +17,7 @@ const CALENDAR_NAVIGATOR_CAPTION_BUTTON_CLASS = 'dx-calendar-caption-button'; const BUTTON_TEXT_CLASS = 'dx-button-text'; export interface NavigatorOptions extends WidgetOptions { - onClick?: ((e: ClickEvent) => void); + onClick?: ((e: { direction: number; event: ClickEvent }) => void); onCaptionClick?: ((e: ClickEvent) => void); type?: ButtonType; stylingMode?: ButtonStyle; diff --git a/packages/devextreme/js/__internal/ui/calendar/m_calendar.range.selection.strategy.ts b/packages/devextreme/js/__internal/ui/calendar/m_calendar.range.selection.strategy.ts index b866abc2474e..97270adca7c4 100644 --- a/packages/devextreme/js/__internal/ui/calendar/m_calendar.range.selection.strategy.ts +++ b/packages/devextreme/js/__internal/ui/calendar/m_calendar.range.selection.strategy.ts @@ -1,16 +1,34 @@ import dateUtils from '@js/core/utils/date'; +import type { DxEvent } from '@js/events'; +import type Calendar from './m_calendar'; +import type { CellEvent, WeekNumberClickEvent } from './m_calendar.base_view'; import CalendarSelectionStrategy from './m_calendar.selection.strategy'; const DAY_INTERVAL = 86400000; class CalendarRangeSelectionStrategy extends CalendarSelectionStrategy { - constructor(component) { + constructor(component: Calendar) { super(component); this.NAME = 'RangeSelection'; } - getViewOptions() { + dateOption(optionName: 'value'): (Date | null)[]; + dateOption(optionName: 'min' | 'max'): Date | null; + dateOption(optionName: 'min' | 'max' | 'value'): Date | null | (Date | null)[] { + if (optionName === 'value') { + return this.calendar._getDateOption('value') as (Date | null)[] || null; + } + return this.calendar._getDateOption(optionName); + } + + getViewOptions(): { + value: (Date | null)[]; + range: Date[]; + selectionMode: 'range'; + onCellHover?: (e: CellEvent) => void; + onWeekNumberClick?: ((e: WeekNumberClickEvent) => void) | null; + } { const value = this._getValue(); const range = this._getDaysInRange(value[0], value[1]); @@ -19,27 +37,31 @@ class CalendarRangeSelectionStrategy extends CalendarSelectionStrategy { range, selectionMode: 'range', onCellHover: this._cellHoverHandler.bind(this), - onWeekNumberClick: this._shouldHandleWeekNumberClick() ? this._weekNumberClickHandler.bind(this) : null, + onWeekNumberClick: this._shouldHandleWeekNumberClick() + ? this._weekNumberClickHandler.bind(this) + : null, }; } - selectValue(selectedValue, e) { + selectValue(selectedValue: Date, e: DxEvent): void { const [startDate, endDate] = this._getValue(); this.skipNavigate(); this._updateCurrentDate(selectedValue); this._currentDateChanged = true; + const { allowChangeSelectionOrder, currentSelection } = this.calendar.option(); - if (this.calendar.option('_allowChangeSelectionOrder') === true) { + if (allowChangeSelectionOrder === true) { this.calendar._valueSelected = true; - - if (this.calendar.option('_currentSelection') === 'startDate') { - if (this.calendar._convertToDate(selectedValue) > this.calendar._convertToDate(endDate)) { + const convertedSelectedValue = this.calendar._convertToDate(selectedValue) as Date; + if (currentSelection === 'startDate') { + if (convertedSelectedValue > (this.calendar._convertToDate(endDate) ?? new Date(0))) { this.dateValue([selectedValue, null], e); } else { this.dateValue([selectedValue, endDate], e); } - } else if (this.calendar._convertToDate(selectedValue) >= this.calendar._convertToDate(startDate)) { + } else if (convertedSelectedValue + >= (this.calendar._convertToDate(startDate) ?? new Date(0))) { this.dateValue([startDate, selectedValue], e); } else { this.dateValue([selectedValue, null], e); @@ -47,49 +69,52 @@ class CalendarRangeSelectionStrategy extends CalendarSelectionStrategy { } else if (!startDate || endDate) { this.dateValue([selectedValue, null], e); } else { - this.dateValue(startDate < selectedValue ? [startDate, selectedValue] : [selectedValue, startDate], e); + this.dateValue( + startDate < selectedValue + ? [startDate, selectedValue] + : [selectedValue, startDate], + e, + ); } } - updateAriaSelected(value?, previousValue?) { - value ??= this._getValue(); - previousValue ??= []; - + updateAriaSelected(val?: (Date | null)[] | null, previousVal?: (Date | null)[] | null): void { + const value = val ?? this._getValue(); + const previousValue = previousVal ?? []; super.updateAriaSelected(value, previousValue); } - processValueChanged(value, previousValue) { + processValueChanged(value: (Date | null)[], previousValue: (Date | null)[]): void { super.processValueChanged(value, previousValue); const range = this._getRange(); this._updateViewsOption('range', range); } - getDefaultCurrentDate() { - // eslint-disable-next-line @typescript-eslint/naming-convention - const { _allowChangeSelectionOrder, _currentSelection } = this.calendar.option(); + getDefaultCurrentDate(): Date | null { + const { allowChangeSelectionOrder, currentSelection } = this.calendar.option(); const value = this.dateOption('value'); - if (_allowChangeSelectionOrder) { - if (_currentSelection === 'startDate' && value[0]) { + if (allowChangeSelectionOrder) { + if (currentSelection === 'startDate' && value[0]) { return value[0]; } - if (_currentSelection === 'endDate' && value[1]) { + if (currentSelection === 'endDate' && value[1]) { return value[1]; } } - const dates = value.filter((value) => value); + const dates = value.filter((date) => date !== null); return this._getLowestDateInArray(dates); } - restoreValue() { + restoreValue(): void { this.calendar.option('value', [null, null]); } - _getValue() { + _getValue(): (Date | null)[] { const value = this.dateOption('value'); if (!value.length) { @@ -105,53 +130,60 @@ class CalendarRangeSelectionStrategy extends CalendarSelectionStrategy { return [startDate, endDate]; } - _getRange() { + _getRange(): Date[] { const [startDate, endDate] = this._getValue(); return this._getDaysInRange(startDate, endDate); } - _getDaysInRange(startDate, endDate) { + _getDaysInRange(startDate: Date | null, endDate: Date | null): Date[] { if (!startDate || !endDate) { return []; } const { currentDate, viewsCount } = this.calendar.option(); const isAdditionalViewDate = this.calendar._isAdditionalViewDate(currentDate); - const firstDateInViews = dateUtils.getFirstMonthDate(currentDate, isAdditionalViewDate ? -2 : -1); - const lastDateInViews = dateUtils.getLastMonthDate(currentDate, isAdditionalViewDate ? 1 : viewsCount); - - // @ts-expect-error - const rangeStartDate = new Date(Math.max(firstDateInViews, startDate)); - // @ts-expect-error - const rangeEndDate = new Date(Math.min(lastDateInViews, endDate)); - - return [...dateUtils.getDatesOfInterval(rangeStartDate, rangeEndDate, DAY_INTERVAL), rangeEndDate]; + const firstDateInViews = dateUtils.getFirstMonthDate( + currentDate, + isAdditionalViewDate ? -2 : -1, + ) as Date; + const lastDateInViews = dateUtils.getLastMonthDate( + currentDate, + isAdditionalViewDate ? 1 : viewsCount, + ) as Date; + + const rangeStartDate = new Date(Math.max(firstDateInViews.getTime(), startDate.getTime())); + const rangeEndDate = new Date(Math.min(lastDateInViews.getTime(), endDate.getTime())); + + return [ + ...dateUtils.getDatesOfInterval(rangeStartDate, rangeEndDate, DAY_INTERVAL), + rangeEndDate, + ]; } - _cellHoverHandler(e) { + _cellHoverHandler(e: CellEvent): void { const isMaxZoomLevel = this._isMaxZoomLevel(); const [startDate, endDate] = this._getValue(); - // eslint-disable-next-line @typescript-eslint/naming-convention - const { _allowChangeSelectionOrder, _currentSelection } = this.calendar.option(); + + const { allowChangeSelectionOrder, currentSelection } = this.calendar.option(); if (isMaxZoomLevel) { - const skipHoveredRange = _allowChangeSelectionOrder && _currentSelection === 'startDate'; + const skipHoveredRange = allowChangeSelectionOrder && currentSelection === 'startDate'; if (startDate && !endDate && !skipHoveredRange) { if (e.value > startDate) { this._updateViewsOption('hoveredRange', this._getDaysInRange(startDate, e.value)); return; } - } else if (!startDate && endDate && !(_allowChangeSelectionOrder && _currentSelection === 'endDate')) { + } else if (!startDate && endDate && !(allowChangeSelectionOrder && currentSelection === 'endDate')) { if (e.value < endDate) { this._updateViewsOption('hoveredRange', this._getDaysInRange(e.value, endDate)); return; } } else if (startDate && endDate) { - if (_currentSelection === 'startDate' && e.value < startDate) { + if (currentSelection === 'startDate' && e.value < startDate) { this._updateViewsOption('hoveredRange', this._getDaysInRange(e.value, startDate)); return; - } if (_currentSelection === 'endDate' && e.value > endDate) { + } if (currentSelection === 'endDate' && e.value > endDate) { this._updateViewsOption('hoveredRange', this._getDaysInRange(endDate, e.value)); return; } @@ -161,9 +193,11 @@ class CalendarRangeSelectionStrategy extends CalendarSelectionStrategy { } } - _weekNumberClickHandler({ rowDates, event }) { + _weekNumberClickHandler({ rowDates, event }: WeekNumberClickEvent): void { const selectedDates = rowDates.filter((date) => !this._isDateDisabled(date)); - const value = selectedDates.length ? [selectedDates[0], selectedDates[selectedDates.length - 1]] : [null, null]; + const value = selectedDates.length + ? [selectedDates[0], selectedDates[selectedDates.length - 1]] + : [null, null]; this.dateValue(value, event); } diff --git a/packages/devextreme/js/__internal/ui/calendar/m_calendar.selection.strategy.ts b/packages/devextreme/js/__internal/ui/calendar/m_calendar.selection.strategy.ts index de434e828e48..ccf00ffba9f0 100644 --- a/packages/devextreme/js/__internal/ui/calendar/m_calendar.selection.strategy.ts +++ b/packages/devextreme/js/__internal/ui/calendar/m_calendar.selection.strategy.ts @@ -1,48 +1,54 @@ +import type { DateLike } from '@js/common'; import dateUtils from '@js/core/utils/date'; import { isDefined } from '@js/core/utils/type'; +import type { DxEvent } from '@js/events'; + +import type Calendar from './m_calendar'; class CalendarSelectionStrategy { - public NAME?: string; + public NAME!: string; - public calendar; + public calendar!: Calendar; public _currentDateChanged?: boolean; - constructor(component) { + constructor(component: Calendar) { this.calendar = component; } - dateOption(optionName) { - return this.calendar._getDateOption(optionName); - } - - dateValue(value, e) { + dateValue(value: Date | null | (Date | null)[], e: DxEvent): void { this.calendar._dateValue(value, e); } - skipNavigate() { + skipNavigate(): void { this.calendar._skipNavigate = true; } - updateAriaSelected(value, previousValue) { + updateAriaSelected(value: (Date | null)[], previousValue: (Date | null)[]): void { this.calendar._updateAriaSelected(value, previousValue); + const { currentDate = new Date() } = this.calendar.option(); - if (value[0] && this.calendar.option('currentDate').getTime() === value[0].getTime()) { + if (value[0] && currentDate.getTime() === value[0].getTime()) { this.calendar._updateAriaId(value[0]); } } - processValueChanged(value, previousValue) { + processValueChanged( + val: Date | null | (Date | null)[], + previousVal: Date | null | (Date | null)[], + ): void { + let value = val; + let previousValue = previousVal; if (isDefined(value) && !Array.isArray(value)) { value = [value]; } if (isDefined(previousValue) && !Array.isArray(previousValue)) { previousValue = [previousValue]; } - value = value?.map((item) => this._convertToDate(item)) || []; - previousValue = previousValue?.map((item) => this._convertToDate(item)) || []; + value = value?.map((item) => this._convertToDate(item)) ?? []; + previousValue = previousValue?.map((item) => this._convertToDate(item)) ?? []; - this._updateViewsValue(value); + this._updateViewsValue(value.filter((item): item is Date => item !== null)); this.updateAriaSelected(value, previousValue); if (!this._currentDateChanged) { @@ -51,7 +57,7 @@ class CalendarSelectionStrategy { this._currentDateChanged = false; } - _isDateDisabled(date) { + _isDateDisabled(date: Date): boolean { const min = this.calendar._getDateOption('min'); const max = this.calendar._getDateOption('max'); const isLessThanMin = isDefined(min) && date < min && !dateUtils.sameDate(min, date); @@ -60,37 +66,38 @@ class CalendarSelectionStrategy { return this.calendar._view.isDateDisabled(date) || isLessThanMin || isBiggerThanMax; } - // @ts-expect-error - _getLowestDateInArray(dates) { + _getLowestDateInArray(dates: (Date | null)[]): Date | null { if (dates.length) { - return new Date(Math.min(...dates)); + return new Date(Math.min(...dates.map((date) => date?.getTime() ?? Infinity))); } + + return null; } - _convertToDate(value) { + _convertToDate(value: DateLike): Date | null { return this.calendar._convertToDate(value); } - _isMaxZoomLevel() { + _isMaxZoomLevel(): boolean { return this.calendar._isMaxZoomLevel(); } - _updateViewsOption(optionName, optionValue) { + _updateViewsOption(optionName: string, optionValue: Date | Date[]): void { this.calendar._updateViewsOption(optionName, optionValue); } - _updateViewsValue(value) { + _updateViewsValue(value: Date | Date[]): void { this._updateViewsOption('value', value); } - _updateCurrentDate(value) { + _updateCurrentDate(value: Date | null): void { this.calendar.option('currentDate', value ?? new Date()); } - _shouldHandleWeekNumberClick() { + _shouldHandleWeekNumberClick(): boolean { const { selectionMode, selectWeekOnClick } = this.calendar.option(); - return selectWeekOnClick && selectionMode !== 'single'; + return selectWeekOnClick === true && selectionMode !== 'single'; } } diff --git a/packages/devextreme/js/__internal/ui/calendar/m_calendar.single.selection.strategy.ts b/packages/devextreme/js/__internal/ui/calendar/m_calendar.single.selection.strategy.ts index 73196c216cad..09c8bc75b870 100644 --- a/packages/devextreme/js/__internal/ui/calendar/m_calendar.single.selection.strategy.ts +++ b/packages/devextreme/js/__internal/ui/calendar/m_calendar.single.selection.strategy.ts @@ -1,46 +1,56 @@ +import type { DxEvent } from '@js/events'; + +import type Calendar from './m_calendar'; import CalendarSelectionStrategy from './m_calendar.selection.strategy'; class CalendarSingleSelectionStrategy extends CalendarSelectionStrategy { - constructor(component) { + constructor(component: Calendar) { super(component); this.NAME = 'SingleSelection'; } - getViewOptions() { + dateOption(optionName: 'min' | 'max' | 'value'): Date | null { + if (optionName === 'value') { + return this.calendar._getDateOption('value') as Date | null; + } + return this.calendar._getDateOption(optionName); + } + + getViewOptions(): { + value: Date | undefined; + range: Date[]; + selectionMode: 'single'; + } { + const value = this.dateOption('value') ?? undefined; + return { - value: this.dateOption('value'), + value, range: [], selectionMode: 'single', }; } - selectValue(selectedValue, e) { + selectValue(selectedValue: Date, e: DxEvent): void { this.skipNavigate(); this.dateValue(selectedValue, e); } - updateAriaSelected(value?, previousValue?) { - value ??= [this.dateOption('value')]; - previousValue ??= []; + updateAriaSelected(val?: (Date | null)[], previousVal?: (Date | null)[]): void { + const value = val ?? [this.dateOption('value')]; + const previousValue = previousVal ?? []; super.updateAriaSelected(value, previousValue); } - getDefaultCurrentDate() { - const date = this.dateOption('value'); - - if (date === '') { - return new Date(); - } - - return date; + getDefaultCurrentDate(): Date | null { + return this.dateOption('value'); } restoreValue(): void { this.calendar.option('value', null); } - _updateViewsValue(value) { + _updateViewsValue(value: Date[]): void { this._updateViewsOption('value', value[0]); } } diff --git a/packages/devextreme/js/__internal/ui/calendar/m_calendar.ts b/packages/devextreme/js/__internal/ui/calendar/m_calendar.ts index 6b23a99a34ed..6cacf4a87676 100644 --- a/packages/devextreme/js/__internal/ui/calendar/m_calendar.ts +++ b/packages/devextreme/js/__internal/ui/calendar/m_calendar.ts @@ -1,4 +1,3 @@ -import type { AnimationConfig } from '@js/common/core/animation'; import { fx } from '@js/common/core/animation'; import { move } from '@js/common/core/animation/translator'; import eventsEngine from '@js/common/core/events/core/events_engine'; @@ -37,7 +36,7 @@ import type { SwipeEndEvent, SwipeStartEvent, SwipeUpdateEvent } from '@ts/event import Button from '@ts/ui/button/wrapper'; import Editor from '@ts/ui/editor/editor'; -import type { BaseViewProperties } from './m_calendar.base_view'; +import type { BaseViewProperties, CellEvent } from './m_calendar.base_view'; import CalendarMultipleSelectionStrategy from './m_calendar.multiple.selection.strategy'; import type { NavigatorOptions } from './m_calendar.navigator'; import Navigator from './m_calendar.navigator'; @@ -96,9 +95,13 @@ export interface CalendarProperties extends Properties { todayButtonText?: string; - _rangeMin?: Date; - _rangeMax?: Date; + rangeMin?: Date; + rangeMax?: Date; + allowChangeSelectionOrder?: boolean; + currentSelection?: 'startDate' | 'endDate'; _todayDate: () => Date; + onCellClick?: (e: CellEvent) => void; + onContouredChanged?: (e: { activeElement: string }) => void; } class Calendar< @@ -112,9 +115,9 @@ class Calendar< _skipNavigate?: boolean; - _onContouredChanged?: (arg) => void; + _onContouredChanged?: (activeElement: string) => void; - _cellClickAction?: (e) => void; + _cellClickAction?: (e: CellEvent) => void; _view!: MonthView | YearView | DecadeView | CenturyView; @@ -138,7 +141,7 @@ class Calendar< _alreadyViewRender?: boolean; - _waitRenderViewTimeout?: ReturnType; + _waitRenderViewTimeout?: NodeJS.Timeout; _$footer?: dxElementWrapper; @@ -150,6 +153,8 @@ class Calendar< _isOtherViewCellClicked?: boolean; + _valueSelected?: boolean; + _getDefaultOptions(): TProperties { return { ...super._getDefaultOptions(), @@ -217,7 +222,7 @@ class Calendar< if (isCommandKeyPressed(e)) { this._navigateUp(); } else { - if (fx.isAnimating(this._view.$element())) { + if (fx.isAnimating(this._view.$element().get(0))) { return; } this._moveCurrentDateByOffset(-1 * this._view.option('colCount')); @@ -228,7 +233,7 @@ class Calendar< if (isCommandKeyPressed(e)) { this._navigateDown(); } else { - if (fx.isAnimating(this._view.$element())) { + if (fx.isAnimating(this._view.$element().get(0))) { return; } this._moveCurrentDateByOffset(1 * this._view.option('colCount')); @@ -307,14 +312,16 @@ class Calendar< return undefined; } + // eslint-disable-next-line @typescript-eslint/no-unsafe-return return dateSerialization.getDateSerializationFormat(value); } - _convertToDate(value): Date | null { + _convertToDate(value: DateLike | undefined): Date | null { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return return dateSerialization.deserializeDate(value); } - _dateValue(value: Date | Date[], event: DxEvent): void { + _dateValue(value: Date | null | (Date | null)[], event: DxEvent): void { if (event) { if (event.type === 'keydown') { const cellElement = this._view._getContouredCell().get(0); @@ -336,6 +343,7 @@ class Calendar< ): void { const serializationFormat = this._getSerializationFormat(optionName); const serializedValue = this._isArrayValue(optionName, optionValue) + // eslint-disable-next-line @typescript-eslint/no-unsafe-return ? optionValue.map((value) => dateSerialization.serializeDate(value, serializationFormat)) : dateSerialization.serializeDate(optionValue, serializationFormat); @@ -345,15 +353,15 @@ class Calendar< _getDateOption(optionName: 'value'): Date | null | (Date | null)[]; _getDateOption(optionName: 'min' | 'max'): Date | null; _getDateOption(optionName: 'value' | 'min' | 'max'): Date | null | (Date | null)[] { - const { value } = this.option(); - - if (!this._isArrayValue(optionName, value)) { - const { [optionName]: optionValue } = this.option(); - + let { [optionName]: optionValue } = this.option(); + if (!this._isArrayValue(optionName, optionValue)) { + if (optionValue === '') { + optionValue = null; + } return this._convertToDate(optionValue); } - const valueArray = value ?? []; + const valueArray = optionValue ?? []; return valueArray.map((item) => this._convertToDate(item)); } @@ -599,21 +607,22 @@ class Calendar< _initCurrentDate(): void { const { currentDate = new Date() } = this.option(); - const date = this._getNormalizedDate(this._selectionStrategy.getDefaultCurrentDate()) + const defaultCurrentDate = this._selectionStrategy.getDefaultCurrentDate(); + const date = (defaultCurrentDate ? this._getNormalizedDate(defaultCurrentDate) : null) ?? this._getNormalizedDate(currentDate); this.option('currentDate', date); } - _getNormalizedDate(date: Date): Date { + _getNormalizedDate(date: Date): Date; + _getNormalizedDate(date: null): null; + _getNormalizedDate(date: Date | null): Date | null { const normalizedDate = dateUtils.normalizeDate(date, this._getMinDate(), this._getMaxDate()); return isDefined(normalizedDate) ? this._getDate(normalizedDate) : date; } - _initActions() { - // @ts-expect-error ts-error + _initActions(): void { this._cellClickAction = this._createActionByOption('onCellClick'); - // @ts-expect-error ts-error this._onContouredChanged = this._createActionByOption('onContouredChanged'); } @@ -701,7 +710,7 @@ class Calendar< } _getMinDate(): Date { - const { _rangeMin: rangeMin } = this.option(); + const { rangeMin } = this.option(); if (rangeMin) { return rangeMin; } @@ -715,7 +724,7 @@ class Calendar< } _getMaxDate(): Date { - const { _rangeMax: rangeMax } = this.option(); + const { rangeMax } = this.option(); if (rangeMax) { return rangeMax; } @@ -771,6 +780,7 @@ class Calendar< this._moveToClosestAvailableDate(date); + // eslint-disable-next-line no-restricted-globals this._waitRenderViewTimeout = setTimeout(() => { this._alreadyViewRender = false; }); @@ -1008,7 +1018,7 @@ class Calendar< return `${coefficient * 100 * rtlCorrection}%`; } - _cellClickHandler(e: { event: DxEvent; value: Date }): void { + _cellClickHandler(e: CellEvent): void { const zoomLevel = this.option('zoomLevel'); const nextView = dateUtils.getViewDown(zoomLevel); @@ -1098,7 +1108,7 @@ class Calendar< }; } - _navigatorClickHandler(e): void { + _navigatorClickHandler(e: { direction: number; event: ClickEvent }): void { const { currentDate, viewsCount } = this.option(); let offset = e.direction; @@ -1165,8 +1175,7 @@ class Calendar< } _swipeStartHandler(event: SwipeStartEvent): void { - // @ts-expect-error ts-error - fx.stop(this._$viewsWrapper, true); + fx.stop(this._$viewsWrapper.get(0), true); const { viewsCount } = this.option(); this._toggleGestureCoverCursor('grabbing'); @@ -1209,6 +1218,7 @@ class Calendar< && (rtlEnabled ? moveOffset === -1 : moveOffset === 1); if (moveOffset === 0) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._animateWrapper(0, ANIMATION_DURATION_SHOW_VIEW); return; } @@ -1324,10 +1334,15 @@ class Calendar< .appendTo(this.$element()); const { value } = this.option(); + this._setSubmitValue(value); } - _setSubmitValue(value): void { + _setSubmitValue(value: DateLike | DateLike[] | undefined): void { + if (this._isArrayValue('value', value)) { + return; + } + const dateValue = this._convertToDate(value); this._getSubmitElement() .val(dateSerialization.serializeDate(dateValue, CALENDAR_INPUT_STANDARD_PATTERN)); @@ -1338,8 +1353,8 @@ class Calendar< } _animateShowView(): void { - // @ts-expect-error ts-error - fx.stop(this._view.$element(), true); + fx.stop(this._view.$element().get(0), true); + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._popAnimationView( this._view, POP_ANIMATION_FROM, @@ -1350,8 +1365,8 @@ class Calendar< const { viewsCount } = this.option(); if (viewsCount > 1) { - // @ts-expect-error ts-error - fx.stop(this._additionalView.$element(), true); + fx.stop(this._additionalView.$element().get(0), true); + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._popAnimationView( this._additionalView, POP_ANIMATION_FROM, @@ -1363,12 +1378,11 @@ class Calendar< _popAnimationView( view: MonthView | YearView | DecadeView | CenturyView, - from: AnimationConfig['from'], - to: AnimationConfig['to'], + from: number, + to: number, duration: number, ): Promise { - // @ts-expect-error ts-error - return fx.animate(view.$element(), { + return fx.animate(view.$element().get(0), { type: 'pop', from: { scale: from, @@ -1414,9 +1428,8 @@ class Calendar< } } - _animateWrapper(to: AnimationConfig['to'], duration: number): Promise { - // @ts-expect-error ts-error - return fx.animate(this._$viewsWrapper, { + _animateWrapper(to: number, duration: number): Promise { + return fx.animate(this._$viewsWrapper.get(0), { type: 'slide', // @ts-expect-error ts-error from: { left: this._$viewsWrapper.position().left }, @@ -1429,10 +1442,11 @@ class Calendar< return new Date(value); } - _toTodayView(args: ClickEvent): void { + _toTodayView(args: DxEvent): void { const today = new Date(); if (this._isMaxZoomLevel()) { + // @ts-expect-error ts-error this._selectionStrategy.selectValue(today, args.event); return; } @@ -1440,6 +1454,7 @@ class Calendar< this._preventViewChangeAnimation = true; this.option('zoomLevel', this.option('maxZoomLevel')); + // @ts-expect-error this._selectionStrategy.selectValue(today, args.event); this._animateShowView(); @@ -1463,11 +1478,11 @@ class Calendar< } const { viewsCount } = this.option(); - let viewOffset; - let viewToCreateKey; - let viewToRemoveKey; - let viewBeforeCreateKey; - let viewAfterRemoveKey; + let viewOffset = -1; + let viewToCreateKey = '_afterView'; + let viewToRemoveKey = '_beforeView'; + let viewBeforeCreateKey = viewsCount === 1 ? '_view' : '_additionalView'; + let viewAfterRemoveKey = '_view'; if (offset < 0) { viewOffset = 1; @@ -1475,12 +1490,6 @@ class Calendar< viewToRemoveKey = '_afterView'; viewBeforeCreateKey = '_view'; viewAfterRemoveKey = viewsCount === 1 ? '_view' : '_additionalView'; - } else { - viewOffset = -1; - viewToCreateKey = '_afterView'; - viewToRemoveKey = '_beforeView'; - viewBeforeCreateKey = viewsCount === 1 ? '_view' : '_additionalView'; - viewAfterRemoveKey = '_view'; } if (!this[viewToCreateKey]) { @@ -1599,21 +1608,21 @@ class Calendar< _setViewsMinOption(min: Date): void { this._restoreViewsMinMaxOptions(); - this.option('_rangeMin', this._convertToDate(min)); + this.option('rangeMin', this._convertToDate(min)); this._updateViewsOption('min', this._getMinDate()); } _setViewsMaxOption(max: Date): void { this._restoreViewsMinMaxOptions(); - this.option('_rangeMax', this._convertToDate(max)); + this.option('rangeMax', this._convertToDate(max)); this._updateViewsOption('max', this._getMaxDate()); } _restoreViewsMinMaxOptions(): void { this._resetActiveState(); this.option({ - _rangeMin: null, - _rangeMax: null, + rangeMin: null, + rangeMax: null, }); this._updateViewsOption('min', this._getMinDate()); @@ -1634,23 +1643,38 @@ class Calendar< this.setAria('label', localizedNextButtonLabel, this._navigator._nextButton.$element()); } - _updateAriaSelected(value: Date[], previousValue: Date[]): void { - previousValue.forEach((item) => { + _updateAriaSelected( + value: (Date | null)[] | null, + previousValue: (Date | null)[] | null, + ): void { + previousValue?.forEach((item) => { + if (!item) { + return; + } this.setAria('selected', false, this._view._getCellByDate(item)); }); - value.forEach((item) => { + value?.forEach((item) => { + if (!item) { + return; + } this.setAria('selected', true, this._view._getCellByDate(item)); }); const { viewsCount } = this.option(); if (viewsCount > 1) { - previousValue.forEach((item) => { + previousValue?.forEach((item) => { + if (!item) { + return; + } this.setAria('selected', false, this._additionalView._getCellByDate(item)); }); - value.forEach((item) => { + value?.forEach((item) => { + if (!item) { + return; + } this.setAria('selected', true, this._additionalView._getCellByDate(item)); }); } @@ -1710,7 +1734,7 @@ class Calendar< this._invalidate(); break; case 'currentDate': - this.setAria('id', undefined, this._view._getCellByDate(previousValue)); + this.setAria('id', undefined, this._view._getCellByDate(previousValue as Date)); this._updateCurrentDate(value as Date); break; case 'zoomLevel': @@ -1731,10 +1755,12 @@ class Calendar< const isSameValue = dateUtils.sameDatesArrays(value, previousValue); if (!isSameValue) { - this._selectionStrategy.processValueChanged(value, previousValue); + this._selectionStrategy.processValueChanged( + value as (Date | null)[], + previousValue as (Date | null)[], + ); } - - this._setSubmitValue(value); + this._setSubmitValue(value as DateLike | DateLike[] | undefined); super._optionChanged(args); break; } @@ -1746,7 +1772,6 @@ class Calendar< this._view.option('onCellClick', value); break; case 'onContouredChanged': - // @ts-expect-error ts-error this._onContouredChanged = this._createActionByOption('onContouredChanged'); break; case 'disabledDates': diff --git a/packages/devextreme/js/__internal/ui/calendar/m_calendar.views.ts b/packages/devextreme/js/__internal/ui/calendar/m_calendar.views.ts index 337d5f807f26..d85d53ba03e6 100644 --- a/packages/devextreme/js/__internal/ui/calendar/m_calendar.views.ts +++ b/packages/devextreme/js/__internal/ui/calendar/m_calendar.views.ts @@ -1,5 +1,4 @@ /* eslint-disable max-classes-per-file */ -import type { template } from '@js/common'; import dateLocalization from '@js/common/core/localization/date'; import domAdapter from '@js/core/dom_adapter'; import type { dxElementWrapper } from '@js/core/renderer'; @@ -7,7 +6,7 @@ import $ from '@js/core/renderer'; import dateUtils from '@js/core/utils/date'; import dateSerialization from '@js/core/utils/date_serialization'; import type { - CalendarSelectionMode, CellTemplateData, FirstDayOfWeek, WeekNumberRule, + CalendarSelectionMode, FirstDayOfWeek, WeekNumberRule, } from '@js/ui/calendar'; import type { BaseViewProperties } from './m_calendar.base_view'; @@ -28,10 +27,6 @@ export interface MonthViewProperties extends BaseViewProperties { selectionMode?: CalendarSelectionMode; selectWeekOnClick?: boolean; - - cellTemplate?: template | ( - (itemData: CellTemplateData, itemIndex: number, itemElement: Element) => dxElementWrapper - ); } export class MonthView extends BaseView { @@ -73,7 +68,7 @@ export class MonthView extends BaseView { const { colCount: columnsCount, showWeekNumbers } = this.option(); - for (let colIndex = 0, colCount = columnsCount; colIndex < colCount; colIndex++) { + for (let colIndex = 0, colCount = columnsCount; colIndex < colCount; colIndex += 1) { this._renderHeaderCell(colIndex, $headerRow); } @@ -82,8 +77,8 @@ export class MonthView extends BaseView { } } - _renderHeaderCell(cellIndex, $headerRow): void { - const { firstDayOfWeek } = this.option(); + _renderHeaderCell(cellIndex: number, $headerRow: dxElementWrapper): void { + const { firstDayOfWeek = 0 } = this.option(); const { full: fullCaption, @@ -100,7 +95,7 @@ export class MonthView extends BaseView { $headerRow.append($cell); } - _renderWeekHeaderCell($headerRow): void { + _renderWeekHeaderCell($headerRow: dxElementWrapper): void { const $weekNumberHeaderCell = $('') // @ts-expect-error ts-error .attr({ @@ -112,7 +107,7 @@ export class MonthView extends BaseView { $headerRow.prepend($weekNumberHeaderCell); } - _renderWeekNumberCell(rowData): void { + _renderWeekNumberCell(rowData: { cellDate: Date; prevCellDate: Date; row: HTMLElement }): void { const { showWeekNumbers, cellTemplate, @@ -139,7 +134,7 @@ export class MonthView extends BaseView { // @ts-expect-error ts-error cellTemplate.render(this._prepareCellTemplateData(weekNumber, -1, $cell)); } else { - cell.innerHTML = weekNumber; + cell.innerHTML = `${weekNumber}`; } rowData.row.prepend(cell); @@ -150,11 +145,15 @@ export class MonthView extends BaseView { }, $cell); } - _getWeekNumber(date) { - const { weekNumberRule, firstDayOfWeek } = this.option(); + _getWeekNumber(date: Date): number { + const { weekNumberRule = 'auto', firstDayOfWeek } = this.option(); if (weekNumberRule === 'auto') { - return dateUtils.getWeekNumber(date, firstDayOfWeek, firstDayOfWeek === 1 ? 'firstFourDays' : 'firstDay'); + return dateUtils.getWeekNumber( + date, + firstDayOfWeek, + firstDayOfWeek === 1 ? 'firstFourDays' : 'firstDay', + ); } return dateUtils.getWeekNumber(date, firstDayOfWeek, weekNumberRule); @@ -163,42 +162,41 @@ export class MonthView extends BaseView { getNavigatorCaption(): string { const { date } = this.option(); - // @ts-expect-error ts-error - return dateLocalization.format(date, 'monthandyear'); + return `${dateLocalization.format(date, 'monthandyear')}`; } - _isTodayCell(cellDate): boolean { + _isTodayCell(cellDate: Date): boolean { const { _todayDate: today } = this.option(); return dateUtils.sameDate(cellDate, today()); } - _isDateOutOfRange(cellDate) { + _isDateOutOfRange(cellDate: Date): boolean { const minDate = this.option('min'); const maxDate = this.option('max'); return !dateUtils.dateInRange(cellDate, minDate, maxDate, 'date'); } - _isOtherView(cellDate): boolean { + _isOtherView(cellDate: Date): boolean { const { date } = this.option(); return cellDate.getMonth() !== date.getMonth(); } - _isStartDayOfMonth(cellDate) { + _isStartDayOfMonth(cellDate: Date): boolean { return dateUtils.sameDate(cellDate, dateUtils.getFirstMonthDate(this.option('date'))); } - _isEndDayOfMonth(cellDate) { + _isEndDayOfMonth(cellDate: Date): boolean { return dateUtils.sameDate(cellDate, dateUtils.getLastMonthDate(this.option('date'))); } - _getCellText(cellDate) { - return dateLocalization.format(cellDate, 'd'); + _getCellText(cellDate: Date): string { + return `${dateLocalization.format(cellDate, 'd')}`; } - _getDayCaption(day) { + _getDayCaption(day: number): { full: string; abbreviated: string } { const { colCount: daysInWeek } = this.option(); const dayIndex = day % daysInWeek; @@ -208,11 +206,9 @@ export class MonthView extends BaseView { }; } - _getFirstCellData() { - const { firstDayOfWeek } = this.option(); - - const firstDay = dateUtils.getFirstMonthDate(this.option('date')); - // @ts-expect-error ts-error + _getFirstCellData(): Date { + const { firstDayOfWeek = 0, date } = this.option(); + const firstDay = dateUtils.getFirstMonthDate(date) as Date; let firstMonthDayOffset = firstDayOfWeek - firstDay.getDay(); const { colCount: daysInWeek } = this.option(); @@ -220,39 +216,34 @@ export class MonthView extends BaseView { firstMonthDayOffset -= daysInWeek; } - // @ts-expect-error ts-error firstDay.setDate(firstDay.getDate() + firstMonthDayOffset); return firstDay; } - _getNextCellData(date?) { - date = new Date(date); - date.setDate(date.getDate() + 1); - return date; + _getNextCellData(date: Date): Date { + const newDate = new Date(date); + newDate.setDate(newDate.getDate() + 1); + + return newDate; } - _getCellByDate(date) { + _getCellByDate(date: Date): dxElementWrapper { return this._$table.find(`td[data-value='${dateSerialization.serializeDate(date, dateUtils.getShortDateFormat())}']`); } - isBoundary(date) { + isBoundary(date: Date): boolean { return dateUtils.sameMonthAndYear(date, this.option('min')) || dateUtils.sameMonthAndYear(date, this.option('max')); } - _getDefaultDisabledDatesHandler(disabledDates) { - // @ts-expect-error - return function (args) { - const isDisabledDate = disabledDates.some((item) => dateUtils.sameDate(item, args.date)); - - if (isDisabledDate) { - return true; - } - }; + _getDefaultDisabledDatesHandler( + disabledDates: Date[], + ): (args: { date: Date }) => boolean { + return (args) => disabledDates.some((item) => dateUtils.sameDate(item, args.date)); } } export class YearView extends BaseView { - _getViewName() { + _getViewName(): string { return 'year'; } @@ -260,30 +251,29 @@ export class YearView extends BaseView { return 'monthandyear'; } - _isTodayCell(cellDate) { + _isTodayCell(cellDate: Date): boolean { const { _todayDate: today } = this.option(); return dateUtils.sameMonthAndYear(cellDate, today()); } - _isDateOutOfRange(cellDate) { + _isDateOutOfRange(cellDate: Date): boolean { return !dateUtils.dateInRange(cellDate, dateUtils.getFirstMonthDate(this.option('min')), dateUtils.getLastMonthDate(this.option('max'))); } - _isOtherView() { + _isOtherView(): boolean { return false; } - _isStartDayOfMonth() { + _isStartDayOfMonth(): boolean { return false; } - _isEndDayOfMonth() { + _isEndDayOfMonth(): boolean { return false; } - // eslint-disable-next-line class-methods-use-this - _getCellText(cellDate): string { + _getCellText(cellDate: Date): string { return dateLocalization.getMonthNames('abbreviated')[cellDate.getMonth()]; } @@ -297,13 +287,14 @@ export class YearView extends BaseView { return data; } - _getNextCellData(date) { - date = new Date(date); - date.setMonth(date.getMonth() + 1); - return date; + _getNextCellData(date: Date): Date { + const newDate = new Date(date); + newDate.setMonth(newDate.getMonth() + 1); + + return newDate; } - _getCellByDate(date) { + _getCellByDate(date: Date): dxElementWrapper { const foundDate = new Date(date); foundDate.setDate(1); @@ -316,59 +307,59 @@ export class YearView extends BaseView { return `${dateLocalization.format(date, 'yyyy')}`; } - isBoundary(date) { + isBoundary(date: Date): boolean { return dateUtils.sameYear(date, this.option('min')) || dateUtils.sameYear(date, this.option('max')); } - _renderWeekNumberCell() {} + _renderWeekNumberCell(): void {} } export class DecadeView extends BaseView { - _getViewName() { + _getViewName(): string { return 'decade'; } - _isTodayCell(cellDate) { + _isTodayCell(cellDate: Date): boolean { const { _todayDate: today } = this.option(); return dateUtils.sameYear(cellDate, today()); } - _isDateOutOfRange(cellDate): boolean { - const min = this.option('min'); - const max = this.option('max'); - // @ts-expect-error ts-error + _isDateOutOfRange(cellDate: Date): boolean { + const { min, max } = this.option(); + return !dateUtils.dateInRange(cellDate.getFullYear(), min?.getFullYear(), max?.getFullYear()); } - _isOtherView(cellDate) { + _isOtherView(cellDate: Date): boolean { const date = new Date(cellDate); date.setMonth(1); return !dateUtils.sameDecade(date, this.option('date')); } - _isStartDayOfMonth() { + _isStartDayOfMonth(): boolean { return false; } - _isEndDayOfMonth() { + _isEndDayOfMonth(): boolean { return false; } - _getCellText(cellDate) { - return dateLocalization.format(cellDate, 'yyyy'); + _getCellText(cellDate: Date): string { + return `${dateLocalization.format(cellDate, 'yyyy')}`; } - _getFirstCellData() { + _getFirstCellData(): Date { const year = dateUtils.getFirstYearInDecade(this.option('date')) - 1; return dateUtils.createDateWithFullYear(year, 0, 1); } - _getNextCellData(date): Date { - date = new Date(date); - date.setFullYear(date.getFullYear() + 1); - return date; + _getNextCellData(date: Date): Date { + const newDate = new Date(date); + newDate.setFullYear(newDate.getFullYear() + 1); + + return newDate; } getNavigatorCaption(): string { @@ -383,11 +374,11 @@ export class DecadeView extends BaseView { return `${dateLocalization.format(startDate, 'yyyy')}-${dateLocalization.format(endDate, 'yyyy')}`; } - _isValueOnCurrentView(currentDate, value) { + _isValueOnCurrentView(currentDate: Date, value: Date): boolean { return dateUtils.sameDecade(currentDate, value); } - _getCellByDate(date) { + _getCellByDate(date: Date): dxElementWrapper { const foundDate = new Date(date); foundDate.setDate(1); foundDate.setMonth(0); @@ -395,25 +386,25 @@ export class DecadeView extends BaseView { return this._$table.find(`td[data-value='${dateSerialization.serializeDate(foundDate, dateUtils.getShortDateFormat())}']`); } - isBoundary(date) { + isBoundary(date: Date): boolean { return dateUtils.sameDecade(date, this.option('min')) || dateUtils.sameDecade(date, this.option('max')); } - _renderWeekNumberCell() {} + _renderWeekNumberCell(): void {} } export class CenturyView extends BaseView { - _getViewName() { + _getViewName(): string { return 'century'; } - _isTodayCell(cellDate) { + _isTodayCell(cellDate: Date): boolean { const { _todayDate: today } = this.option(); return dateUtils.sameDecade(cellDate, today()); } - _isDateOutOfRange(cellDate) { + _isDateOutOfRange(cellDate: Date): boolean { const decade = dateUtils.getFirstYearInDecade(cellDate); const minDecade = dateUtils.getFirstYearInDecade(this.option('min')); const maxDecade = dateUtils.getFirstYearInDecade(this.option('max')); @@ -421,22 +412,22 @@ export class CenturyView extends BaseView { return !dateUtils.dateInRange(decade, minDecade, maxDecade); } - _isOtherView(cellDate) { + _isOtherView(cellDate: Date): boolean { const date = new Date(cellDate); date.setMonth(1); return !dateUtils.sameCentury(date, this.option('date')); } - _isStartDayOfMonth() { + _isStartDayOfMonth(): boolean { return false; } - _isEndDayOfMonth() { + _isEndDayOfMonth(): boolean { return false; } - _getCellText(cellDate): string { + _getCellText(cellDate: Date): string { const startDate = dateLocalization.format(cellDate, 'yyyy'); const endDate = new Date(cellDate); @@ -445,18 +436,19 @@ export class CenturyView extends BaseView { return `${startDate} - ${dateLocalization.format(endDate, 'yyyy')}`; } - _getFirstCellData() { + _getFirstCellData(): Date { const decade = dateUtils.getFirstDecadeInCentury(this.option('date')) - 10; return dateUtils.createDateWithFullYear(decade, 0, 1); } - _getNextCellData(date) { - date = new Date(date); - date.setFullYear(date.getFullYear() + 10); - return date; + _getNextCellData(date: Date): Date { + const newDate = new Date(date); + newDate.setFullYear(newDate.getFullYear() + 10); + + return newDate; } - _getCellByDate(date) { + _getCellByDate(date: Date): dxElementWrapper { const foundDate = new Date(date); foundDate.setDate(1); foundDate.setMonth(0); @@ -477,7 +469,7 @@ export class CenturyView extends BaseView { return `${dateLocalization.format(startDate, 'yyyy')}-${dateLocalization.format(endDate, 'yyyy')}`; } - isBoundary(date) { + isBoundary(date: Date): boolean { return dateUtils.sameCentury(date, this.option('min')) || dateUtils.sameCentury(date, this.option('max')); } diff --git a/packages/devextreme/js/__internal/ui/date_range_box/m_date_range_box.ts b/packages/devextreme/js/__internal/ui/date_range_box/m_date_range_box.ts index f0eecbaca3fa..87ccccac5fc4 100644 --- a/packages/devextreme/js/__internal/ui/date_range_box/m_date_range_box.ts +++ b/packages/devextreme/js/__internal/ui/date_range_box/m_date_range_box.ts @@ -149,7 +149,7 @@ class DateRangeBox extends Editor { value: [null, null], valueChangeEvent: 'change', _internalValidationErrors: [], - _currentSelection: 'startDate', + currentSelection: 'startDate', }); } @@ -1061,7 +1061,7 @@ class DateRangeBox extends Editor { break; } - case '_currentSelection': + case 'currentSelection': break; default: // @ts-expect-error diff --git a/packages/devextreme/js/__internal/ui/date_range_box/m_multiselect_date_box.ts b/packages/devextreme/js/__internal/ui/date_range_box/m_multiselect_date_box.ts index ba789d13cdbb..de786de86282 100644 --- a/packages/devextreme/js/__internal/ui/date_range_box/m_multiselect_date_box.ts +++ b/packages/devextreme/js/__internal/ui/date_range_box/m_multiselect_date_box.ts @@ -159,10 +159,10 @@ class MultiselectDateBox extends TypedDateBox { const dateRangeBox = this._getDateRangeBox(); const [startDateInput, endDateInput] = dateRangeBox.field(); if ($(target).is($(startDateInput))) { - dateRangeBox.option('_currentSelection', 'startDate'); + dateRangeBox.option('currentSelection', 'startDate'); } if ($(target).is($(endDateInput))) { - dateRangeBox.option('_currentSelection', 'endDate'); + dateRangeBox.option('currentSelection', 'endDate'); } if (!dateRangeBox.getStartDateBox().getStrategy().getWidget()) { @@ -181,7 +181,7 @@ class MultiselectDateBox extends TypedDateBox { calendar.option('currentDate', startDate); } this.getStrategy().setActiveStartDateBox(); - calendar.option('_currentSelection', 'startDate'); + calendar.option('currentSelection', 'startDate'); if (dateRangeBox.option('disableOutOfRangeSelection')) { // @ts-expect-error @@ -203,7 +203,7 @@ class MultiselectDateBox extends TypedDateBox { calendar.option('currentDate', endDate); } dateRangeBox.getStartDateBox().getStrategy().setActiveEndDateBox(); - calendar.option('_currentSelection', 'endDate'); + calendar.option('currentSelection', 'endDate'); if (dateRangeBox.option('disableOutOfRangeSelection')) { // @ts-expect-error diff --git a/packages/devextreme/js/__internal/ui/date_range_box/strategy/m_rangeCalendar.ts b/packages/devextreme/js/__internal/ui/date_range_box/strategy/m_rangeCalendar.ts index 47475137df67..179a411b42c1 100644 --- a/packages/devextreme/js/__internal/ui/date_range_box/strategy/m_rangeCalendar.ts +++ b/packages/devextreme/js/__internal/ui/date_range_box/strategy/m_rangeCalendar.ts @@ -133,8 +133,8 @@ class RangeCalendarStrategy extends CalendarStrategy { value, selectionMode: 'range', viewsCount: multiView ? 2 : 1, - _allowChangeSelectionOrder: true, - _currentSelection: this.getCurrentSelection(), + allowChangeSelectionOrder: true, + currentSelection: this.getCurrentSelection(), }); } @@ -234,11 +234,11 @@ class RangeCalendarStrategy extends CalendarStrategy { } getCurrentSelection() { - return this.getDateRangeBox().option('_currentSelection'); + return this.getDateRangeBox().option('currentSelection'); } _getCalendarCurrentSelection() { - return this.getWidget().option('_currentSelection'); + return this.getWidget().option('currentSelection'); } _closeDropDownByEnter(): boolean { diff --git a/packages/devextreme/js/ui/calendar.d.ts b/packages/devextreme/js/ui/calendar.d.ts index 4d710412e16a..068c55287281 100644 --- a/packages/devextreme/js/ui/calendar.d.ts +++ b/packages/devextreme/js/ui/calendar.d.ts @@ -78,7 +78,7 @@ export type ValueChangedEvent = NativeEventInfo { - QUnit.test(`Click by cell should change startDate value if _allowChangeSelectionOrder is true and _currentSelection is startDate, initial value: ${JSON.stringify(value)}`, function(assert) { + QUnit.test(`Click by cell should change startDate value if allowChangeSelectionOrder is true and currentSelection is startDate, initial value: ${JSON.stringify(value)}`, function(assert) { this.reinit({ value, selectionMode: 'range', - _allowChangeSelectionOrder: true, - _currentSelection: 'startDate', + allowChangeSelectionOrder: true, + currentSelection: 'startDate', }); let $startDateCell = $(this.calendar.$element()).find(`.${CALENDAR_CELL_CLASS}`).eq(20); @@ -2444,12 +2444,12 @@ QUnit.module('Options', { assert.deepEqual(this.calendar.option('value'), [startCellDate, value[1]]); }); - QUnit.test(`Click by cell should change startDate value and reselect endDate if _allowChangeSelectionOrder is true and _currentSelection is startDate, startDate > endDate, initial value: ${JSON.stringify(value)}`, function(assert) { + QUnit.test(`Click by cell should change startDate value and reselect endDate if allowChangeSelectionOrder is true and currentSelection is startDate, startDate > endDate, initial value: ${JSON.stringify(value)}`, function(assert) { this.reinit({ value, selectionMode: 'range', - _allowChangeSelectionOrder: true, - _currentSelection: 'startDate', + allowChangeSelectionOrder: true, + currentSelection: 'startDate', }); const $startDateCell = $(this.calendar.$element()).find(`.${CALENDAR_CELL_CLASS}`).eq(30); @@ -2459,12 +2459,12 @@ QUnit.module('Options', { assert.deepEqual(this.calendar.option('value'), [startCellDate, null]); }); - QUnit.test(`Click by cell should change endDate value and reselect startDate if _allowChangeSelectionOrder is true and _currentSelection is endDate, endDate < startDate, initial value: ${JSON.stringify(value)}`, function(assert) { + QUnit.test(`Click by cell should change endDate value and reselect startDate if allowChangeSelectionOrder is true and currentSelection is endDate, endDate < startDate, initial value: ${JSON.stringify(value)}`, function(assert) { this.reinit({ value, selectionMode: 'range', - _allowChangeSelectionOrder: true, - _currentSelection: 'endDate', + allowChangeSelectionOrder: true, + currentSelection: 'endDate', }); const $endCellDate = $(this.calendar.$element()).find(`.${CALENDAR_CELL_CLASS}`).eq(7); @@ -2474,12 +2474,12 @@ QUnit.module('Options', { assert.deepEqual(this.calendar.option('value'), endCellDate < value[0] ? [endCellDate, null] : [null, endCellDate]); }); - QUnit.test(`Click by cell should change endDate value if _allowChangeSelectionOrder is true and _currentSelection is endDate, initial value: ${JSON.stringify(value)}`, function(assert) { + QUnit.test(`Click by cell should change endDate value if allowChangeSelectionOrder is true and currentSelection is endDate, initial value: ${JSON.stringify(value)}`, function(assert) { this.reinit({ value, selectionMode: 'range', - _allowChangeSelectionOrder: true, - _currentSelection: 'endDate', + allowChangeSelectionOrder: true, + currentSelection: 'endDate', }); let $endDateCell = $(this.calendar.$element()).find(`.${CALENDAR_CELL_CLASS}`).eq(25); @@ -2495,12 +2495,12 @@ QUnit.module('Options', { assert.deepEqual(this.calendar.option('value'), [value[0], endCellDate]); }); - QUnit.test(`Click by cell should change endDate then startDate value if _allowChangeSelectionOrder is true and _currentSelection is endDate then startDate, initial value: ${JSON.stringify(value)}`, function(assert) { + QUnit.test(`Click by cell should change endDate then startDate value if allowChangeSelectionOrder is true and currentSelection is endDate then startDate, initial value: ${JSON.stringify(value)}`, function(assert) { this.reinit({ value, selectionMode: 'range', - _allowChangeSelectionOrder: true, - _currentSelection: 'endDate', + allowChangeSelectionOrder: true, + currentSelection: 'endDate', }); const $endDateCell = $(this.calendar.$element()).find(`.${CALENDAR_CELL_CLASS}`).eq(30); @@ -2509,7 +2509,7 @@ QUnit.module('Options', { assert.deepEqual(this.calendar.option('value'), [value[0], endCellDate]); - this.calendar.option('_currentSelection', 'startDate'); + this.calendar.option('currentSelection', 'startDate'); const $startDateCell = $(this.calendar.$element()).find(`.${CALENDAR_CELL_CLASS}`).eq(10); const startCellDate = dataUtils.data($startDateCell.get(0), CALENDAR_DATE_VALUE_KEY); @@ -2519,12 +2519,12 @@ QUnit.module('Options', { }); }); - QUnit.test('Range should not be displayed on cell hover if only startDate is defined and _allowChangeSelectionOrder is true and _currentSelection is startDate', function(assert) { + QUnit.test('Range should not be displayed on cell hover if only startDate is defined and allowChangeSelectionOrder is true and currentSelection is startDate', function(assert) { this.reinit({ value: ['2023/04/01', null], selectionMode: 'range', - _allowChangeSelectionOrder: true, - _currentSelection: 'startDate', + allowChangeSelectionOrder: true, + currentSelection: 'startDate', }); const $cellToHover = $(this.calendar.$element()).find(`.${CALENDAR_CELL_CLASS}`).eq(20); diff --git a/packages/devextreme/ts/dx.all.d.ts b/packages/devextreme/ts/dx.all.d.ts index 3f1c02220775..6db48f96b739 100644 --- a/packages/devextreme/ts/dx.all.d.ts +++ b/packages/devextreme/ts/dx.all.d.ts @@ -9806,7 +9806,7 @@ declare module DevExpress.ui { export type CalendarSelectionMode = 'single' | 'multiple' | 'range'; export type CalendarZoomLevel = 'century' | 'decade' | 'month' | 'year'; export type CellTemplateData = { - readonly date: Date; + readonly date?: Date; readonly view: string; readonly text?: string; }; From 6d9e607189a7c915e131f2c3dedd709c20409aed Mon Sep 17 00:00:00 2001 From: Alex Lavrov <36633600+alexslavr@users.noreply.github.com> Date: Thu, 14 Aug 2025 14:21:51 +0400 Subject: [PATCH 005/101] Make scheduler template doctags consistent (#30753) --- packages/devextreme/js/ui/scheduler.d.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/devextreme/js/ui/scheduler.d.ts b/packages/devextreme/js/ui/scheduler.d.ts index 0dfecd43cfb2..3a0d09938f77 100644 --- a/packages/devextreme/js/ui/scheduler.d.ts +++ b/packages/devextreme/js/ui/scheduler.d.ts @@ -446,6 +446,7 @@ export interface dxSchedulerOptions extends WidgetOptions { /** * @docid * @default "appointmentCollector" + * @type_function_param1 data:{ui/scheduler:AppointmentCollectorTemplateData} * @public */ appointmentCollectorTemplate?: template | ((data: AppointmentCollectorTemplateData, collectorElement: DxElement) => string | UserDefinedElement); @@ -514,8 +515,6 @@ export interface dxSchedulerOptions extends WidgetOptions { * @docid * @default "item" * @type_function_param1 model:{ui/scheduler:AppointmentTemplateData} - * @type_function_param1_field appointmentData:object - * @type_function_param1_field targetedAppointmentData:object * @public */ appointmentTemplate?: template | ((model: AppointmentTemplateData, itemIndex: number, contentElement: DxElement) => string | UserDefinedElement); @@ -523,8 +522,6 @@ export interface dxSchedulerOptions extends WidgetOptions { * @docid * @default "appointmentTooltip" * @type_function_param1 model:{ui/scheduler:AppointmentTooltipTemplateData} - * @type_function_param1_field appointmentData:object - * @type_function_param1_field targetedAppointmentData:object * @public */ appointmentTooltipTemplate?: template | ((model: AppointmentTooltipTemplateData, itemIndex: number, contentElement: DxElement) => string | UserDefinedElement); From 53c61520286e6f345cf5bafb23e83b8406793093 Mon Sep 17 00:00:00 2001 From: Mikhail Preyskurantov <5574159+mpreyskurantov@users.noreply.github.com> Date: Thu, 14 Aug 2025 14:19:13 +0300 Subject: [PATCH 006/101] Remove DOMComponentOptions.bindingOptions (#30745) --- packages/devextreme-react/src/autocomplete.ts | 2 -- packages/devextreme-react/src/card-view.ts | 5 ----- packages/devextreme-react/src/color-box.ts | 2 -- packages/devextreme-react/src/data-grid.ts | 4 ---- packages/devextreme-react/src/date-box.ts | 3 --- packages/devextreme-react/src/date-range-box.ts | 3 --- packages/devextreme-react/src/drop-down-box.ts | 2 -- packages/devextreme-react/src/drop-down-button.ts | 1 - packages/devextreme-react/src/form.ts | 2 -- packages/devextreme-react/src/html-editor.ts | 1 - packages/devextreme-react/src/list.ts | 3 --- packages/devextreme-react/src/lookup.ts | 1 - packages/devextreme-react/src/number-box.ts | 1 - packages/devextreme-react/src/scheduler.ts | 1 - packages/devextreme-react/src/select-box.ts | 2 -- packages/devextreme-react/src/tag-box.ts | 2 -- packages/devextreme-react/src/text-box.ts | 1 - packages/devextreme-react/src/tree-list.ts | 4 ---- packages/devextreme-react/src/tree-view.ts | 2 -- packages/devextreme-vue/src/autocomplete.ts | 4 ---- packages/devextreme-vue/src/card-view.ts | 10 ---------- packages/devextreme-vue/src/color-box.ts | 4 ---- packages/devextreme-vue/src/data-grid.ts | 8 -------- packages/devextreme-vue/src/date-box.ts | 6 ------ packages/devextreme-vue/src/date-range-box.ts | 6 ------ packages/devextreme-vue/src/drop-down-box.ts | 4 ---- packages/devextreme-vue/src/drop-down-button.ts | 2 -- packages/devextreme-vue/src/form.ts | 4 ---- packages/devextreme-vue/src/html-editor.ts | 2 -- packages/devextreme-vue/src/list.ts | 6 ------ packages/devextreme-vue/src/lookup.ts | 2 -- packages/devextreme-vue/src/number-box.ts | 2 -- packages/devextreme-vue/src/scheduler.ts | 2 -- packages/devextreme-vue/src/select-box.ts | 4 ---- packages/devextreme-vue/src/tag-box.ts | 4 ---- packages/devextreme-vue/src/text-box.ts | 2 -- packages/devextreme-vue/src/tree-list.ts | 8 -------- packages/devextreme-vue/src/tree-view.ts | 4 ---- packages/devextreme/js/core/dom_component.d.ts | 6 ------ packages/devextreme/ts/dx.all.d.ts | 4 ---- 40 files changed, 136 deletions(-) diff --git a/packages/devextreme-react/src/autocomplete.ts b/packages/devextreme-react/src/autocomplete.ts index faa06f6e00b2..8111a067985a 100644 --- a/packages/devextreme-react/src/autocomplete.ts +++ b/packages/devextreme-react/src/autocomplete.ts @@ -238,7 +238,6 @@ type IDropDownOptionsProps = React.PropsWithChildren<{ hide?: AnimationConfig; show?: AnimationConfig; }; - bindingOptions?: Record; container?: any | string | undefined; contentTemplate?: ((contentElement: any) => string | any) | template; deferRendering?: boolean; @@ -461,7 +460,6 @@ const Offset = Object.assign(_comp type IOptionsProps = React.PropsWithChildren<{ accessKey?: string | undefined; activeStateEnabled?: boolean; - bindingOptions?: Record; disabled?: boolean; elementAttr?: Record; focusStateEnabled?: boolean; diff --git a/packages/devextreme-react/src/card-view.ts b/packages/devextreme-react/src/card-view.ts index 4550b420cb7a..3f9f937fde89 100644 --- a/packages/devextreme-react/src/card-view.ts +++ b/packages/devextreme-react/src/card-view.ts @@ -290,7 +290,6 @@ const ButtonItem = Object.assign; disabled?: boolean; elementAttr?: Record; focusStateEnabled?: boolean; @@ -1118,7 +1117,6 @@ type IFilterBuilderProps = React.PropsWithChildren<{ accessKey?: string | undefined; activeStateEnabled?: boolean; allowHierarchicalFields?: boolean; - bindingOptions?: Record; customOperations?: Array; disabled?: boolean; elementAttr?: Record; @@ -1274,7 +1272,6 @@ type IFormProps = React.PropsWithChildren<{ activeStateEnabled?: boolean; alignItemLabels?: boolean; alignItemLabelsInAllGroups?: boolean; - bindingOptions?: Record; colCount?: Mode | number; colCountByScreen?: Record | { lg?: number | undefined; @@ -1802,7 +1799,6 @@ type ILoadPanelProps = React.PropsWithChildren<{ hide?: AnimationConfig; show?: AnimationConfig; }; - bindingOptions?: Record; container?: any | string | undefined; deferRendering?: boolean; delay?: number; @@ -2497,7 +2493,6 @@ type ITabPanelOptionsProps = React.PropsWithChildren<{ accessKey?: string | undefined; activeStateEnabled?: boolean; animationEnabled?: boolean; - bindingOptions?: Record; dataSource?: Array | DataSource | DataSourceOptions | null | Store | string; deferRendering?: boolean; disabled?: boolean; diff --git a/packages/devextreme-react/src/color-box.ts b/packages/devextreme-react/src/color-box.ts index 912cfd710627..80daac8ac3dd 100644 --- a/packages/devextreme-react/src/color-box.ts +++ b/packages/devextreme-react/src/color-box.ts @@ -228,7 +228,6 @@ type IDropDownOptionsProps = React.PropsWithChildren<{ hide?: AnimationConfig; show?: AnimationConfig; }; - bindingOptions?: Record; container?: any | string | undefined; contentTemplate?: ((contentElement: any) => string | any) | template; deferRendering?: boolean; @@ -421,7 +420,6 @@ const Offset = Object.assign(_comp type IOptionsProps = React.PropsWithChildren<{ accessKey?: string | undefined; activeStateEnabled?: boolean; - bindingOptions?: Record; disabled?: boolean; elementAttr?: Record; focusStateEnabled?: boolean; diff --git a/packages/devextreme-react/src/data-grid.ts b/packages/devextreme-react/src/data-grid.ts index fb0b610fdff0..2ccce8b026e3 100644 --- a/packages/devextreme-react/src/data-grid.ts +++ b/packages/devextreme-react/src/data-grid.ts @@ -1194,7 +1194,6 @@ type IFilterBuilderProps = React.PropsWithChildren<{ accessKey?: string | undefined; activeStateEnabled?: boolean; allowHierarchicalFields?: boolean; - bindingOptions?: Record; customOperations?: Array; disabled?: boolean; elementAttr?: Record; @@ -1271,7 +1270,6 @@ type IFilterBuilderPopupProps = React.PropsWithChildren<{ hide?: AnimationConfig; show?: AnimationConfig; }; - bindingOptions?: Record; container?: any | string | undefined; contentTemplate?: ((contentElement: any) => string | any) | template; deferRendering?: boolean; @@ -1492,7 +1490,6 @@ type IFormProps = React.PropsWithChildren<{ activeStateEnabled?: boolean; alignItemLabels?: boolean; alignItemLabelsInAllGroups?: boolean; - bindingOptions?: Record; colCount?: Mode | number; colCountByScreen?: Record | { lg?: number | undefined; @@ -2231,7 +2228,6 @@ type IPopupProps = React.PropsWithChildren<{ hide?: AnimationConfig; show?: AnimationConfig; }; - bindingOptions?: Record; container?: any | string | undefined; contentTemplate?: ((contentElement: any) => string | any) | template; deferRendering?: boolean; diff --git a/packages/devextreme-react/src/date-box.ts b/packages/devextreme-react/src/date-box.ts index 04623f10a14c..3ba0d33fd256 100644 --- a/packages/devextreme-react/src/date-box.ts +++ b/packages/devextreme-react/src/date-box.ts @@ -204,7 +204,6 @@ const Button = Object.assign(_comp type ICalendarOptionsProps = React.PropsWithChildren<{ accessKey?: string | undefined; activeStateEnabled?: boolean; - bindingOptions?: Record; cellTemplate?: ((itemData: { date: Date, text: string, view: string }, itemIndex: number, itemElement: any) => string | any) | template; dateSerializationFormat?: string | undefined; disabled?: boolean; @@ -323,7 +322,6 @@ type IDropDownOptionsProps = React.PropsWithChildren<{ hide?: AnimationConfig; show?: AnimationConfig; }; - bindingOptions?: Record; container?: any | string | undefined; contentTemplate?: ((contentElement: any) => string | any) | template; deferRendering?: boolean; @@ -516,7 +514,6 @@ const Offset = Object.assign(_comp type IOptionsProps = React.PropsWithChildren<{ accessKey?: string | undefined; activeStateEnabled?: boolean; - bindingOptions?: Record; disabled?: boolean; elementAttr?: Record; focusStateEnabled?: boolean; diff --git a/packages/devextreme-react/src/date-range-box.ts b/packages/devextreme-react/src/date-range-box.ts index 2a9d0f02735c..aed0ca125d1d 100644 --- a/packages/devextreme-react/src/date-range-box.ts +++ b/packages/devextreme-react/src/date-range-box.ts @@ -209,7 +209,6 @@ const Button = Object.assign(_comp type ICalendarOptionsProps = React.PropsWithChildren<{ accessKey?: string | undefined; activeStateEnabled?: boolean; - bindingOptions?: Record; cellTemplate?: ((itemData: { date: Date, text: string, view: string }, itemIndex: number, itemElement: any) => string | any) | template; dateSerializationFormat?: string | undefined; disabled?: boolean; @@ -328,7 +327,6 @@ type IDropDownOptionsProps = React.PropsWithChildren<{ hide?: AnimationConfig; show?: AnimationConfig; }; - bindingOptions?: Record; container?: any | string | undefined; contentTemplate?: ((contentElement: any) => string | any) | template; deferRendering?: boolean; @@ -521,7 +519,6 @@ const Offset = Object.assign(_comp type IOptionsProps = React.PropsWithChildren<{ accessKey?: string | undefined; activeStateEnabled?: boolean; - bindingOptions?: Record; disabled?: boolean; elementAttr?: Record; focusStateEnabled?: boolean; diff --git a/packages/devextreme-react/src/drop-down-box.ts b/packages/devextreme-react/src/drop-down-box.ts index 1ce6ad427e48..64dd507db116 100644 --- a/packages/devextreme-react/src/drop-down-box.ts +++ b/packages/devextreme-react/src/drop-down-box.ts @@ -232,7 +232,6 @@ type IDropDownOptionsProps = React.PropsWithChildren<{ hide?: AnimationConfig; show?: AnimationConfig; }; - bindingOptions?: Record; container?: any | string | undefined; contentTemplate?: ((contentElement: any) => string | any) | template; deferRendering?: boolean; @@ -425,7 +424,6 @@ const Offset = Object.assign(_comp type IOptionsProps = React.PropsWithChildren<{ accessKey?: string | undefined; activeStateEnabled?: boolean; - bindingOptions?: Record; disabled?: boolean; elementAttr?: Record; focusStateEnabled?: boolean; diff --git a/packages/devextreme-react/src/drop-down-button.ts b/packages/devextreme-react/src/drop-down-button.ts index 4ca42dd49f41..2c06e7766b52 100644 --- a/packages/devextreme-react/src/drop-down-button.ts +++ b/packages/devextreme-react/src/drop-down-button.ts @@ -188,7 +188,6 @@ type IDropDownOptionsProps = React.PropsWithChildren<{ hide?: AnimationConfig; show?: AnimationConfig; }; - bindingOptions?: Record; container?: any | string | undefined; contentTemplate?: ((contentElement: any) => string | any) | template; deferRendering?: boolean; diff --git a/packages/devextreme-react/src/form.ts b/packages/devextreme-react/src/form.ts index 4556b4cf2005..4c79fe8c58ed 100644 --- a/packages/devextreme-react/src/form.ts +++ b/packages/devextreme-react/src/form.ts @@ -150,7 +150,6 @@ const ButtonItem = Object.assign; disabled?: boolean; elementAttr?: Record; focusStateEnabled?: boolean; @@ -813,7 +812,6 @@ type ITabPanelOptionsProps = React.PropsWithChildren<{ accessKey?: string | undefined; activeStateEnabled?: boolean; animationEnabled?: boolean; - bindingOptions?: Record; dataSource?: Array | DataSource | DataSourceOptions | null | Store | string; deferRendering?: boolean; disabled?: boolean; diff --git a/packages/devextreme-react/src/html-editor.ts b/packages/devextreme-react/src/html-editor.ts index 7d1749a5da91..dbe6f550fcf0 100644 --- a/packages/devextreme-react/src/html-editor.ts +++ b/packages/devextreme-react/src/html-editor.ts @@ -138,7 +138,6 @@ type IFileUploaderOptionsProps = React.PropsWithChildren<{ activeStateEnabled?: boolean; allowCanceling?: boolean; allowedFileExtensions?: Array; - bindingOptions?: Record; chunkSize?: number; dialogTrigger?: any | string | undefined; disabled?: boolean; diff --git a/packages/devextreme-react/src/list.ts b/packages/devextreme-react/src/list.ts index 1472716c8125..9514436e019e 100644 --- a/packages/devextreme-react/src/list.ts +++ b/packages/devextreme-react/src/list.ts @@ -200,7 +200,6 @@ type IItemDraggingProps = React.PropsWithChildren<{ allowDropInsideItem?: boolean; allowReordering?: boolean; autoScroll?: boolean; - bindingOptions?: Record; boundary?: any | string | undefined; container?: any | string | undefined; cursorOffset?: Record | string | { @@ -281,7 +280,6 @@ const MenuItem = Object.assign(_ type IOptionsProps = React.PropsWithChildren<{ accessKey?: string | undefined; activeStateEnabled?: boolean; - bindingOptions?: Record; disabled?: boolean; elementAttr?: Record; focusStateEnabled?: boolean; @@ -330,7 +328,6 @@ const Options = Object.assign(_co type ISearchEditorOptionsProps = React.PropsWithChildren<{ accessKey?: string | undefined; activeStateEnabled?: boolean; - bindingOptions?: Record; buttons?: Array; disabled?: boolean; elementAttr?: Record; diff --git a/packages/devextreme-react/src/lookup.ts b/packages/devextreme-react/src/lookup.ts index e63130e88f8c..25bb3d4c4066 100644 --- a/packages/devextreme-react/src/lookup.ts +++ b/packages/devextreme-react/src/lookup.ts @@ -199,7 +199,6 @@ type IDropDownOptionsProps = React.PropsWithChildren<{ hide?: AnimationConfig; show?: AnimationConfig; }; - bindingOptions?: Record; container?: any | string | undefined; contentTemplate?: ((contentElement: any) => string | any) | template; deferRendering?: boolean; diff --git a/packages/devextreme-react/src/number-box.ts b/packages/devextreme-react/src/number-box.ts index 7695a4805f9a..35e3966a2be6 100644 --- a/packages/devextreme-react/src/number-box.ts +++ b/packages/devextreme-react/src/number-box.ts @@ -135,7 +135,6 @@ const Format = Object.assign(_comp type IOptionsProps = React.PropsWithChildren<{ accessKey?: string | undefined; activeStateEnabled?: boolean; - bindingOptions?: Record; disabled?: boolean; elementAttr?: Record; focusStateEnabled?: boolean; diff --git a/packages/devextreme-react/src/scheduler.ts b/packages/devextreme-react/src/scheduler.ts index 88433a476629..5c15c77e859a 100644 --- a/packages/devextreme-react/src/scheduler.ts +++ b/packages/devextreme-react/src/scheduler.ts @@ -269,7 +269,6 @@ const Item = Object.assign(_componen type IOptionsProps = React.PropsWithChildren<{ accessKey?: string | undefined; activeStateEnabled?: boolean; - bindingOptions?: Record; buttonTemplate?: ((buttonData: any, buttonContent: any) => string | any) | template; disabled?: boolean; elementAttr?: Record; diff --git a/packages/devextreme-react/src/select-box.ts b/packages/devextreme-react/src/select-box.ts index 9c33ab0f5787..40a3601c49f1 100644 --- a/packages/devextreme-react/src/select-box.ts +++ b/packages/devextreme-react/src/select-box.ts @@ -246,7 +246,6 @@ type IDropDownOptionsProps = React.PropsWithChildren<{ hide?: AnimationConfig; show?: AnimationConfig; }; - bindingOptions?: Record; container?: any | string | undefined; contentTemplate?: ((contentElement: any) => string | any) | template; deferRendering?: boolean; @@ -469,7 +468,6 @@ const Offset = Object.assign(_comp type IOptionsProps = React.PropsWithChildren<{ accessKey?: string | undefined; activeStateEnabled?: boolean; - bindingOptions?: Record; disabled?: boolean; elementAttr?: Record; focusStateEnabled?: boolean; diff --git a/packages/devextreme-react/src/tag-box.ts b/packages/devextreme-react/src/tag-box.ts index 4f5255398f38..19af6e94ac26 100644 --- a/packages/devextreme-react/src/tag-box.ts +++ b/packages/devextreme-react/src/tag-box.ts @@ -252,7 +252,6 @@ type IDropDownOptionsProps = React.PropsWithChildren<{ hide?: AnimationConfig; show?: AnimationConfig; }; - bindingOptions?: Record; container?: any | string | undefined; contentTemplate?: ((contentElement: any) => string | any) | template; deferRendering?: boolean; @@ -475,7 +474,6 @@ const Offset = Object.assign(_comp type IOptionsProps = React.PropsWithChildren<{ accessKey?: string | undefined; activeStateEnabled?: boolean; - bindingOptions?: Record; disabled?: boolean; elementAttr?: Record; focusStateEnabled?: boolean; diff --git a/packages/devextreme-react/src/text-box.ts b/packages/devextreme-react/src/text-box.ts index a922707bd7c1..4a5756cdf743 100644 --- a/packages/devextreme-react/src/text-box.ts +++ b/packages/devextreme-react/src/text-box.ts @@ -111,7 +111,6 @@ const Button = Object.assign(_comp type IOptionsProps = React.PropsWithChildren<{ accessKey?: string | undefined; activeStateEnabled?: boolean; - bindingOptions?: Record; disabled?: boolean; elementAttr?: Record; focusStateEnabled?: boolean; diff --git a/packages/devextreme-react/src/tree-list.ts b/packages/devextreme-react/src/tree-list.ts index 3b4926778343..77ee94fa5ca6 100644 --- a/packages/devextreme-react/src/tree-list.ts +++ b/packages/devextreme-react/src/tree-list.ts @@ -1007,7 +1007,6 @@ type IFilterBuilderProps = React.PropsWithChildren<{ accessKey?: string | undefined; activeStateEnabled?: boolean; allowHierarchicalFields?: boolean; - bindingOptions?: Record; customOperations?: Array; disabled?: boolean; elementAttr?: Record; @@ -1084,7 +1083,6 @@ type IFilterBuilderPopupProps = React.PropsWithChildren<{ hide?: AnimationConfig; show?: AnimationConfig; }; - bindingOptions?: Record; container?: any | string | undefined; contentTemplate?: ((contentElement: any) => string | any) | template; deferRendering?: boolean; @@ -1305,7 +1303,6 @@ type IFormProps = React.PropsWithChildren<{ activeStateEnabled?: boolean; alignItemLabels?: boolean; alignItemLabelsInAllGroups?: boolean; - bindingOptions?: Record; colCount?: Mode | number; colCountByScreen?: Record | { lg?: number | undefined; @@ -1907,7 +1904,6 @@ type IPopupProps = React.PropsWithChildren<{ hide?: AnimationConfig; show?: AnimationConfig; }; - bindingOptions?: Record; container?: any | string | undefined; contentTemplate?: ((contentElement: any) => string | any) | template; deferRendering?: boolean; diff --git a/packages/devextreme-react/src/tree-view.ts b/packages/devextreme-react/src/tree-view.ts index 63a8cc0010d2..980124ba2734 100644 --- a/packages/devextreme-react/src/tree-view.ts +++ b/packages/devextreme-react/src/tree-view.ts @@ -164,7 +164,6 @@ const Item = Object.assign(_componen type IOptionsProps = React.PropsWithChildren<{ accessKey?: string | undefined; activeStateEnabled?: boolean; - bindingOptions?: Record; disabled?: boolean; elementAttr?: Record; focusStateEnabled?: boolean; @@ -213,7 +212,6 @@ const Options = Object.assign(_co type ISearchEditorOptionsProps = React.PropsWithChildren<{ accessKey?: string | undefined; activeStateEnabled?: boolean; - bindingOptions?: Record; buttons?: Array; disabled?: boolean; elementAttr?: Record; diff --git a/packages/devextreme-vue/src/autocomplete.ts b/packages/devextreme-vue/src/autocomplete.ts index 15337792b36c..2e4c7a1a9c9c 100644 --- a/packages/devextreme-vue/src/autocomplete.ts +++ b/packages/devextreme-vue/src/autocomplete.ts @@ -460,7 +460,6 @@ const DxDropDownOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:animation": null, - "update:bindingOptions": null, "update:container": null, "update:contentTemplate": null, "update:deferRendering": null, @@ -511,7 +510,6 @@ const DxDropDownOptionsConfig = { props: { accessKey: String, animation: Object as PropType>, - bindingOptions: Object as PropType>, container: {}, contentTemplate: {}, deferRendering: Boolean, @@ -709,7 +707,6 @@ const DxOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:activeStateEnabled": null, - "update:bindingOptions": null, "update:disabled": null, "update:elementAttr": null, "update:focusStateEnabled": null, @@ -736,7 +733,6 @@ const DxOptionsConfig = { props: { accessKey: String, activeStateEnabled: Boolean, - bindingOptions: Object as PropType>, disabled: Boolean, elementAttr: Object as PropType>, focusStateEnabled: Boolean, diff --git a/packages/devextreme-vue/src/card-view.ts b/packages/devextreme-vue/src/card-view.ts index a0d05557cd52..30519845ca11 100644 --- a/packages/devextreme-vue/src/card-view.ts +++ b/packages/devextreme-vue/src/card-view.ts @@ -617,7 +617,6 @@ const DxButtonOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:activeStateEnabled": null, - "update:bindingOptions": null, "update:disabled": null, "update:elementAttr": null, "update:focusStateEnabled": null, @@ -644,7 +643,6 @@ const DxButtonOptionsConfig = { props: { accessKey: String, activeStateEnabled: Boolean, - bindingOptions: Object as PropType>, disabled: Boolean, elementAttr: Object as PropType>, focusStateEnabled: Boolean, @@ -1496,7 +1494,6 @@ const DxFilterBuilderConfig = { "update:accessKey": null, "update:activeStateEnabled": null, "update:allowHierarchicalFields": null, - "update:bindingOptions": null, "update:customOperations": null, "update:disabled": null, "update:elementAttr": null, @@ -1526,7 +1523,6 @@ const DxFilterBuilderConfig = { accessKey: String, activeStateEnabled: Boolean, allowHierarchicalFields: Boolean, - bindingOptions: Object as PropType>, customOperations: Array as PropType>, disabled: Boolean, elementAttr: Object as PropType>, @@ -1663,7 +1659,6 @@ const DxFormConfig = { "update:activeStateEnabled": null, "update:alignItemLabels": null, "update:alignItemLabelsInAllGroups": null, - "update:bindingOptions": null, "update:colCount": null, "update:colCountByScreen": null, "update:customizeItem": null, @@ -1706,7 +1701,6 @@ const DxFormConfig = { activeStateEnabled: Boolean, alignItemLabels: Boolean, alignItemLabelsInAllGroups: Boolean, - bindingOptions: Object as PropType>, colCount: [String, Number] as PropType, colCountByScreen: Object as PropType>, customizeItem: Function as PropType<((item: dxFormSimpleItem | dxFormGroupItem | dxFormTabbedItem | dxFormEmptyItem | dxFormButtonItem) => void)>, @@ -2192,7 +2186,6 @@ const DxLoadPanelConfig = { "update:isActive": null, "update:hoveredElement": null, "update:animation": null, - "update:bindingOptions": null, "update:container": null, "update:deferRendering": null, "update:delay": null, @@ -2228,7 +2221,6 @@ const DxLoadPanelConfig = { }, props: { animation: Object as PropType>, - bindingOptions: Object as PropType>, container: {}, deferRendering: Boolean, delay: Number, @@ -2898,7 +2890,6 @@ const DxTabPanelOptionsConfig = { "update:accessKey": null, "update:activeStateEnabled": null, "update:animationEnabled": null, - "update:bindingOptions": null, "update:dataSource": null, "update:deferRendering": null, "update:disabled": null, @@ -2946,7 +2937,6 @@ const DxTabPanelOptionsConfig = { accessKey: String, activeStateEnabled: Boolean, animationEnabled: Boolean, - bindingOptions: Object as PropType>, dataSource: [Array, Object, String] as PropType<(Array) | DataSource | DataSourceOptions | null | Store | string | Record>, deferRendering: Boolean, disabled: Boolean, diff --git a/packages/devextreme-vue/src/color-box.ts b/packages/devextreme-vue/src/color-box.ts index ec7d02f0ac78..74da06fadbe1 100644 --- a/packages/devextreme-vue/src/color-box.ts +++ b/packages/devextreme-vue/src/color-box.ts @@ -404,7 +404,6 @@ const DxDropDownOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:animation": null, - "update:bindingOptions": null, "update:container": null, "update:contentTemplate": null, "update:deferRendering": null, @@ -455,7 +454,6 @@ const DxDropDownOptionsConfig = { props: { accessKey: String, animation: Object as PropType>, - bindingOptions: Object as PropType>, container: {}, contentTemplate: {}, deferRendering: Boolean, @@ -627,7 +625,6 @@ const DxOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:activeStateEnabled": null, - "update:bindingOptions": null, "update:disabled": null, "update:elementAttr": null, "update:focusStateEnabled": null, @@ -654,7 +651,6 @@ const DxOptionsConfig = { props: { accessKey: String, activeStateEnabled: Boolean, - bindingOptions: Object as PropType>, disabled: Boolean, elementAttr: Object as PropType>, focusStateEnabled: Boolean, diff --git a/packages/devextreme-vue/src/data-grid.ts b/packages/devextreme-vue/src/data-grid.ts index 63e4aa970b42..b08e1adbaaa3 100644 --- a/packages/devextreme-vue/src/data-grid.ts +++ b/packages/devextreme-vue/src/data-grid.ts @@ -1642,7 +1642,6 @@ const DxFilterBuilderConfig = { "update:accessKey": null, "update:activeStateEnabled": null, "update:allowHierarchicalFields": null, - "update:bindingOptions": null, "update:customOperations": null, "update:disabled": null, "update:elementAttr": null, @@ -1672,7 +1671,6 @@ const DxFilterBuilderConfig = { accessKey: String, activeStateEnabled: Boolean, allowHierarchicalFields: Boolean, - bindingOptions: Object as PropType>, customOperations: Array as PropType>, disabled: Boolean, elementAttr: Object as PropType>, @@ -1718,7 +1716,6 @@ const DxFilterBuilderPopupConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:animation": null, - "update:bindingOptions": null, "update:container": null, "update:contentTemplate": null, "update:deferRendering": null, @@ -1769,7 +1766,6 @@ const DxFilterBuilderPopupConfig = { props: { accessKey: String, animation: Object as PropType>, - bindingOptions: Object as PropType>, container: {}, contentTemplate: {}, deferRendering: Boolean, @@ -1963,7 +1959,6 @@ const DxFormConfig = { "update:activeStateEnabled": null, "update:alignItemLabels": null, "update:alignItemLabelsInAllGroups": null, - "update:bindingOptions": null, "update:colCount": null, "update:colCountByScreen": null, "update:customizeItem": null, @@ -2006,7 +2001,6 @@ const DxFormConfig = { activeStateEnabled: Boolean, alignItemLabels: Boolean, alignItemLabelsInAllGroups: Boolean, - bindingOptions: Object as PropType>, colCount: [String, Number] as PropType, colCountByScreen: Object as PropType>, customizeItem: Function as PropType<((item: dxFormSimpleItem | dxFormGroupItem | dxFormTabbedItem | dxFormEmptyItem | dxFormButtonItem) => void)>, @@ -2765,7 +2759,6 @@ const DxPopupConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:animation": null, - "update:bindingOptions": null, "update:container": null, "update:contentTemplate": null, "update:deferRendering": null, @@ -2816,7 +2809,6 @@ const DxPopupConfig = { props: { accessKey: String, animation: Object as PropType>, - bindingOptions: Object as PropType>, container: {}, contentTemplate: {}, deferRendering: Boolean, diff --git a/packages/devextreme-vue/src/date-box.ts b/packages/devextreme-vue/src/date-box.ts index 7c7a1cc0b627..a5957c5a99eb 100644 --- a/packages/devextreme-vue/src/date-box.ts +++ b/packages/devextreme-vue/src/date-box.ts @@ -455,7 +455,6 @@ const DxCalendarOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:activeStateEnabled": null, - "update:bindingOptions": null, "update:cellTemplate": null, "update:dateSerializationFormat": null, "update:disabled": null, @@ -499,7 +498,6 @@ const DxCalendarOptionsConfig = { props: { accessKey: String, activeStateEnabled: Boolean, - bindingOptions: Object as PropType>, cellTemplate: {}, dateSerializationFormat: String, disabled: Boolean, @@ -600,7 +598,6 @@ const DxDropDownOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:animation": null, - "update:bindingOptions": null, "update:container": null, "update:contentTemplate": null, "update:deferRendering": null, @@ -651,7 +648,6 @@ const DxDropDownOptionsConfig = { props: { accessKey: String, animation: Object as PropType>, - bindingOptions: Object as PropType>, container: {}, contentTemplate: {}, deferRendering: Boolean, @@ -823,7 +819,6 @@ const DxOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:activeStateEnabled": null, - "update:bindingOptions": null, "update:disabled": null, "update:elementAttr": null, "update:focusStateEnabled": null, @@ -850,7 +845,6 @@ const DxOptionsConfig = { props: { accessKey: String, activeStateEnabled: Boolean, - bindingOptions: Object as PropType>, disabled: Boolean, elementAttr: Object as PropType>, focusStateEnabled: Boolean, diff --git a/packages/devextreme-vue/src/date-range-box.ts b/packages/devextreme-vue/src/date-range-box.ts index 64d8ffe709ab..ff5f88b085c1 100644 --- a/packages/devextreme-vue/src/date-range-box.ts +++ b/packages/devextreme-vue/src/date-range-box.ts @@ -464,7 +464,6 @@ const DxCalendarOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:activeStateEnabled": null, - "update:bindingOptions": null, "update:cellTemplate": null, "update:dateSerializationFormat": null, "update:disabled": null, @@ -508,7 +507,6 @@ const DxCalendarOptionsConfig = { props: { accessKey: String, activeStateEnabled: Boolean, - bindingOptions: Object as PropType>, cellTemplate: {}, dateSerializationFormat: String, disabled: Boolean, @@ -609,7 +607,6 @@ const DxDropDownOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:animation": null, - "update:bindingOptions": null, "update:container": null, "update:contentTemplate": null, "update:deferRendering": null, @@ -660,7 +657,6 @@ const DxDropDownOptionsConfig = { props: { accessKey: String, animation: Object as PropType>, - bindingOptions: Object as PropType>, container: {}, contentTemplate: {}, deferRendering: Boolean, @@ -832,7 +828,6 @@ const DxOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:activeStateEnabled": null, - "update:bindingOptions": null, "update:disabled": null, "update:elementAttr": null, "update:focusStateEnabled": null, @@ -859,7 +854,6 @@ const DxOptionsConfig = { props: { accessKey: String, activeStateEnabled: Boolean, - bindingOptions: Object as PropType>, disabled: Boolean, elementAttr: Object as PropType>, focusStateEnabled: Boolean, diff --git a/packages/devextreme-vue/src/drop-down-box.ts b/packages/devextreme-vue/src/drop-down-box.ts index dd1a6a395c1b..d134464f505d 100644 --- a/packages/devextreme-vue/src/drop-down-box.ts +++ b/packages/devextreme-vue/src/drop-down-box.ts @@ -419,7 +419,6 @@ const DxDropDownOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:animation": null, - "update:bindingOptions": null, "update:container": null, "update:contentTemplate": null, "update:deferRendering": null, @@ -470,7 +469,6 @@ const DxDropDownOptionsConfig = { props: { accessKey: String, animation: Object as PropType>, - bindingOptions: Object as PropType>, container: {}, contentTemplate: {}, deferRendering: Boolean, @@ -642,7 +640,6 @@ const DxOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:activeStateEnabled": null, - "update:bindingOptions": null, "update:disabled": null, "update:elementAttr": null, "update:focusStateEnabled": null, @@ -669,7 +666,6 @@ const DxOptionsConfig = { props: { accessKey: String, activeStateEnabled: Boolean, - bindingOptions: Object as PropType>, disabled: Boolean, elementAttr: Object as PropType>, focusStateEnabled: Boolean, diff --git a/packages/devextreme-vue/src/drop-down-button.ts b/packages/devextreme-vue/src/drop-down-button.ts index 84976224aca1..86f556f124c6 100644 --- a/packages/devextreme-vue/src/drop-down-button.ts +++ b/packages/devextreme-vue/src/drop-down-button.ts @@ -303,7 +303,6 @@ const DxDropDownOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:animation": null, - "update:bindingOptions": null, "update:container": null, "update:contentTemplate": null, "update:deferRendering": null, @@ -354,7 +353,6 @@ const DxDropDownOptionsConfig = { props: { accessKey: String, animation: Object as PropType>, - bindingOptions: Object as PropType>, container: {}, contentTemplate: {}, deferRendering: Boolean, diff --git a/packages/devextreme-vue/src/form.ts b/packages/devextreme-vue/src/form.ts index 8c7686123377..6a120b0f5f25 100644 --- a/packages/devextreme-vue/src/form.ts +++ b/packages/devextreme-vue/src/form.ts @@ -300,7 +300,6 @@ const DxButtonOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:activeStateEnabled": null, - "update:bindingOptions": null, "update:disabled": null, "update:elementAttr": null, "update:focusStateEnabled": null, @@ -327,7 +326,6 @@ const DxButtonOptionsConfig = { props: { accessKey: String, activeStateEnabled: Boolean, - bindingOptions: Object as PropType>, disabled: Boolean, elementAttr: Object as PropType>, focusStateEnabled: Boolean, @@ -952,7 +950,6 @@ const DxTabPanelOptionsConfig = { "update:accessKey": null, "update:activeStateEnabled": null, "update:animationEnabled": null, - "update:bindingOptions": null, "update:dataSource": null, "update:deferRendering": null, "update:disabled": null, @@ -1000,7 +997,6 @@ const DxTabPanelOptionsConfig = { accessKey: String, activeStateEnabled: Boolean, animationEnabled: Boolean, - bindingOptions: Object as PropType>, dataSource: [Array, Object, String] as PropType<(Array) | DataSource | DataSourceOptions | null | Store | string | Record>, deferRendering: Boolean, disabled: Boolean, diff --git a/packages/devextreme-vue/src/html-editor.ts b/packages/devextreme-vue/src/html-editor.ts index 235839d5b88e..32d125827096 100644 --- a/packages/devextreme-vue/src/html-editor.ts +++ b/packages/devextreme-vue/src/html-editor.ts @@ -294,7 +294,6 @@ const DxFileUploaderOptionsConfig = { "update:activeStateEnabled": null, "update:allowCanceling": null, "update:allowedFileExtensions": null, - "update:bindingOptions": null, "update:chunkSize": null, "update:dialogTrigger": null, "update:disabled": null, @@ -361,7 +360,6 @@ const DxFileUploaderOptionsConfig = { activeStateEnabled: Boolean, allowCanceling: Boolean, allowedFileExtensions: Array as PropType>, - bindingOptions: Object as PropType>, chunkSize: Number, dialogTrigger: {}, disabled: Boolean, diff --git a/packages/devextreme-vue/src/list.ts b/packages/devextreme-vue/src/list.ts index d75fb8db400d..47113d5ea735 100644 --- a/packages/devextreme-vue/src/list.ts +++ b/packages/devextreme-vue/src/list.ts @@ -438,7 +438,6 @@ const DxItemDraggingConfig = { "update:allowDropInsideItem": null, "update:allowReordering": null, "update:autoScroll": null, - "update:bindingOptions": null, "update:boundary": null, "update:container": null, "update:cursorOffset": null, @@ -472,7 +471,6 @@ const DxItemDraggingConfig = { allowDropInsideItem: Boolean, allowReordering: Boolean, autoScroll: Boolean, - bindingOptions: Object as PropType>, boundary: {}, container: {}, cursorOffset: [Object, String] as PropType | string>, @@ -539,7 +537,6 @@ const DxOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:activeStateEnabled": null, - "update:bindingOptions": null, "update:disabled": null, "update:elementAttr": null, "update:focusStateEnabled": null, @@ -566,7 +563,6 @@ const DxOptionsConfig = { props: { accessKey: String, activeStateEnabled: Boolean, - bindingOptions: Object as PropType>, disabled: Boolean, elementAttr: Object as PropType>, focusStateEnabled: Boolean, @@ -604,7 +600,6 @@ const DxSearchEditorOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:activeStateEnabled": null, - "update:bindingOptions": null, "update:buttons": null, "update:disabled": null, "update:elementAttr": null, @@ -662,7 +657,6 @@ const DxSearchEditorOptionsConfig = { props: { accessKey: String, activeStateEnabled: Boolean, - bindingOptions: Object as PropType>, buttons: Array as PropType>, disabled: Boolean, elementAttr: Object as PropType>, diff --git a/packages/devextreme-vue/src/lookup.ts b/packages/devextreme-vue/src/lookup.ts index 5d1172b95ba5..2c98c0120be3 100644 --- a/packages/devextreme-vue/src/lookup.ts +++ b/packages/devextreme-vue/src/lookup.ts @@ -439,7 +439,6 @@ const DxDropDownOptionsConfig = { "update:isActive": null, "update:hoveredElement": null, "update:animation": null, - "update:bindingOptions": null, "update:container": null, "update:contentTemplate": null, "update:deferRendering": null, @@ -481,7 +480,6 @@ const DxDropDownOptionsConfig = { }, props: { animation: Object as PropType>, - bindingOptions: Object as PropType>, container: {}, contentTemplate: {}, deferRendering: Boolean, diff --git a/packages/devextreme-vue/src/number-box.ts b/packages/devextreme-vue/src/number-box.ts index cc3f6acfffc0..a6a3340932f4 100644 --- a/packages/devextreme-vue/src/number-box.ts +++ b/packages/devextreme-vue/src/number-box.ts @@ -301,7 +301,6 @@ const DxOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:activeStateEnabled": null, - "update:bindingOptions": null, "update:disabled": null, "update:elementAttr": null, "update:focusStateEnabled": null, @@ -328,7 +327,6 @@ const DxOptionsConfig = { props: { accessKey: String, activeStateEnabled: Boolean, - bindingOptions: Object as PropType>, disabled: Boolean, elementAttr: Object as PropType>, focusStateEnabled: Boolean, diff --git a/packages/devextreme-vue/src/scheduler.ts b/packages/devextreme-vue/src/scheduler.ts index 146bffafe585..3f5be69d9875 100644 --- a/packages/devextreme-vue/src/scheduler.ts +++ b/packages/devextreme-vue/src/scheduler.ts @@ -468,7 +468,6 @@ const DxOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:activeStateEnabled": null, - "update:bindingOptions": null, "update:buttonTemplate": null, "update:disabled": null, "update:elementAttr": null, @@ -496,7 +495,6 @@ const DxOptionsConfig = { props: { accessKey: String, activeStateEnabled: Boolean, - bindingOptions: Object as PropType>, buttonTemplate: {}, disabled: Boolean, elementAttr: Object as PropType>, diff --git a/packages/devextreme-vue/src/select-box.ts b/packages/devextreme-vue/src/select-box.ts index 2cd88fe5eb57..60a6b00fcd86 100644 --- a/packages/devextreme-vue/src/select-box.ts +++ b/packages/devextreme-vue/src/select-box.ts @@ -485,7 +485,6 @@ const DxDropDownOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:animation": null, - "update:bindingOptions": null, "update:container": null, "update:contentTemplate": null, "update:deferRendering": null, @@ -536,7 +535,6 @@ const DxDropDownOptionsConfig = { props: { accessKey: String, animation: Object as PropType>, - bindingOptions: Object as PropType>, container: {}, contentTemplate: {}, deferRendering: Boolean, @@ -734,7 +732,6 @@ const DxOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:activeStateEnabled": null, - "update:bindingOptions": null, "update:disabled": null, "update:elementAttr": null, "update:focusStateEnabled": null, @@ -761,7 +758,6 @@ const DxOptionsConfig = { props: { accessKey: String, activeStateEnabled: Boolean, - bindingOptions: Object as PropType>, disabled: Boolean, elementAttr: Object as PropType>, focusStateEnabled: Boolean, diff --git a/packages/devextreme-vue/src/tag-box.ts b/packages/devextreme-vue/src/tag-box.ts index 586ae49ee698..46fd6851c3e0 100644 --- a/packages/devextreme-vue/src/tag-box.ts +++ b/packages/devextreme-vue/src/tag-box.ts @@ -504,7 +504,6 @@ const DxDropDownOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:animation": null, - "update:bindingOptions": null, "update:container": null, "update:contentTemplate": null, "update:deferRendering": null, @@ -555,7 +554,6 @@ const DxDropDownOptionsConfig = { props: { accessKey: String, animation: Object as PropType>, - bindingOptions: Object as PropType>, container: {}, contentTemplate: {}, deferRendering: Boolean, @@ -753,7 +751,6 @@ const DxOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:activeStateEnabled": null, - "update:bindingOptions": null, "update:disabled": null, "update:elementAttr": null, "update:focusStateEnabled": null, @@ -780,7 +777,6 @@ const DxOptionsConfig = { props: { accessKey: String, activeStateEnabled: Boolean, - bindingOptions: Object as PropType>, disabled: Boolean, elementAttr: Object as PropType>, focusStateEnabled: Boolean, diff --git a/packages/devextreme-vue/src/text-box.ts b/packages/devextreme-vue/src/text-box.ts index d6b787cf5319..de9e1d52f1a0 100644 --- a/packages/devextreme-vue/src/text-box.ts +++ b/packages/devextreme-vue/src/text-box.ts @@ -273,7 +273,6 @@ const DxOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:activeStateEnabled": null, - "update:bindingOptions": null, "update:disabled": null, "update:elementAttr": null, "update:focusStateEnabled": null, @@ -300,7 +299,6 @@ const DxOptionsConfig = { props: { accessKey: String, activeStateEnabled: Boolean, - bindingOptions: Object as PropType>, disabled: Boolean, elementAttr: Object as PropType>, focusStateEnabled: Boolean, diff --git a/packages/devextreme-vue/src/tree-list.ts b/packages/devextreme-vue/src/tree-list.ts index 4df3822f547a..05fa72d4b82f 100644 --- a/packages/devextreme-vue/src/tree-list.ts +++ b/packages/devextreme-vue/src/tree-list.ts @@ -1460,7 +1460,6 @@ const DxFilterBuilderConfig = { "update:accessKey": null, "update:activeStateEnabled": null, "update:allowHierarchicalFields": null, - "update:bindingOptions": null, "update:customOperations": null, "update:disabled": null, "update:elementAttr": null, @@ -1490,7 +1489,6 @@ const DxFilterBuilderConfig = { accessKey: String, activeStateEnabled: Boolean, allowHierarchicalFields: Boolean, - bindingOptions: Object as PropType>, customOperations: Array as PropType>, disabled: Boolean, elementAttr: Object as PropType>, @@ -1536,7 +1534,6 @@ const DxFilterBuilderPopupConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:animation": null, - "update:bindingOptions": null, "update:container": null, "update:contentTemplate": null, "update:deferRendering": null, @@ -1587,7 +1584,6 @@ const DxFilterBuilderPopupConfig = { props: { accessKey: String, animation: Object as PropType>, - bindingOptions: Object as PropType>, container: {}, contentTemplate: {}, deferRendering: Boolean, @@ -1781,7 +1777,6 @@ const DxFormConfig = { "update:activeStateEnabled": null, "update:alignItemLabels": null, "update:alignItemLabelsInAllGroups": null, - "update:bindingOptions": null, "update:colCount": null, "update:colCountByScreen": null, "update:customizeItem": null, @@ -1824,7 +1819,6 @@ const DxFormConfig = { activeStateEnabled: Boolean, alignItemLabels: Boolean, alignItemLabelsInAllGroups: Boolean, - bindingOptions: Object as PropType>, colCount: [String, Number] as PropType, colCountByScreen: Object as PropType>, customizeItem: Function as PropType<((item: dxFormSimpleItem | dxFormGroupItem | dxFormTabbedItem | dxFormEmptyItem | dxFormButtonItem) => void)>, @@ -2448,7 +2442,6 @@ const DxPopupConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:animation": null, - "update:bindingOptions": null, "update:container": null, "update:contentTemplate": null, "update:deferRendering": null, @@ -2499,7 +2492,6 @@ const DxPopupConfig = { props: { accessKey: String, animation: Object as PropType>, - bindingOptions: Object as PropType>, container: {}, contentTemplate: {}, deferRendering: Boolean, diff --git a/packages/devextreme-vue/src/tree-view.ts b/packages/devextreme-vue/src/tree-view.ts index e19bdcda3e5a..89b9c4b8a3a7 100644 --- a/packages/devextreme-vue/src/tree-view.ts +++ b/packages/devextreme-vue/src/tree-view.ts @@ -366,7 +366,6 @@ const DxOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:activeStateEnabled": null, - "update:bindingOptions": null, "update:disabled": null, "update:elementAttr": null, "update:focusStateEnabled": null, @@ -393,7 +392,6 @@ const DxOptionsConfig = { props: { accessKey: String, activeStateEnabled: Boolean, - bindingOptions: Object as PropType>, disabled: Boolean, elementAttr: Object as PropType>, focusStateEnabled: Boolean, @@ -431,7 +429,6 @@ const DxSearchEditorOptionsConfig = { "update:hoveredElement": null, "update:accessKey": null, "update:activeStateEnabled": null, - "update:bindingOptions": null, "update:buttons": null, "update:disabled": null, "update:elementAttr": null, @@ -489,7 +486,6 @@ const DxSearchEditorOptionsConfig = { props: { accessKey: String, activeStateEnabled: Boolean, - bindingOptions: Object as PropType>, buttons: Array as PropType>, disabled: Boolean, elementAttr: Object as PropType>, diff --git a/packages/devextreme/js/core/dom_component.d.ts b/packages/devextreme/js/core/dom_component.d.ts index 8a9896e26434..7cfd3f609d89 100644 --- a/packages/devextreme/js/core/dom_component.d.ts +++ b/packages/devextreme/js/core/dom_component.d.ts @@ -33,12 +33,6 @@ export interface DOMComponentOptions extends ComponentOptions< InitializedEventInfo, OptionChangedEventInfo > { - /** - * @docid - * @default {} - * @public - */ - bindingOptions?: { [key: string]: any }; /** * @docid * @default {} diff --git a/packages/devextreme/ts/dx.all.d.ts b/packages/devextreme/ts/dx.all.d.ts index 6db48f96b739..298a46802f8a 100644 --- a/packages/devextreme/ts/dx.all.d.ts +++ b/packages/devextreme/ts/dx.all.d.ts @@ -713,10 +713,6 @@ declare module DevExpress { DevExpress.common.core.events.InitializedEventInfo, DevExpress.DOMComponent.OptionChangedEventInfo > { - /** - * [descr:DOMComponentOptions.bindingOptions] - */ - bindingOptions?: { [key: string]: any }; /** * [descr:DOMComponentOptions.elementAttr] */ From c5e5018f1e416f30db6eed519fbd14699222327c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marker=20dao=20=C2=AE?= Date: Thu, 14 Aug 2025 14:20:00 +0200 Subject: [PATCH 007/101] Notify: Improve typing (#30685) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: marker dao ® --- .../devextreme/js/__internal/ui/m_notify.ts | 331 ++++++++++++------ 1 file changed, 220 insertions(+), 111 deletions(-) diff --git a/packages/devextreme/js/__internal/ui/m_notify.ts b/packages/devextreme/js/__internal/ui/m_notify.ts index 6ff1229898cf..f3ab8cf28fc3 100644 --- a/packages/devextreme/js/__internal/ui/m_notify.ts +++ b/packages/devextreme/js/__internal/ui/m_notify.ts @@ -1,157 +1,266 @@ +import type { dxElementWrapper } from '@js/core/renderer'; import $ from '@js/core/renderer'; -import { extend } from '@js/core/utils/extend'; import { isPlainObject, isString } from '@js/core/utils/type'; import { value as viewPort } from '@js/core/utils/view_port'; import { getWindow } from '@js/core/utils/window'; +import type { + HiddenEvent, + Properties as ToastProperties, + ShowingEvent, +} from '@js/ui/toast'; import Toast from '@js/ui/toast'; +type DefaultDirection = 'down-push' | 'up-push'; + +type NotifyType = 'info' | 'warning' | 'error' | 'success'; + +interface Dimensions { + toastWidth: number; + toastHeight: number; + windowHeight: number; + windowWidth: number; +} + +interface NotifyCoordinates { + top?: number; + bottom?: number; + left?: number; + right?: number; +} + +interface PositionStyles { + top: number | string; + bottom: number | string; + left: number | string; + right: number | string; +} + +type CoordinateFunction = (dimensions: Dimensions) => NotifyCoordinates; +type PositionStylesFunction = ( + coordinates: NotifyCoordinates, + dimensions: Dimensions, +) => PositionStyles; + const window = getWindow(); -let $notify = null; -const $containers = {}; -function notify(message, /* optional */ typeOrStack, displayTime) { - const options = isPlainObject(message) ? message : { message }; - const stack = isPlainObject(typeOrStack) ? typeOrStack : undefined; - const type = isPlainObject(typeOrStack) ? undefined : typeOrStack; - const { onHidden: userOnHidden } = options; +let $notify: dxElementWrapper | null = null; - if (stack?.position) { - const { position } = stack; - const direction = stack.direction || getDefaultDirection(position); - const containerKey = isString(position) - ? position - : `${position.top}-${position.left}-${position.bottom}-${position.right}`; +const $containers: Record = {}; - const { onShowing: userOnShowing } = options; - const $container = getStackContainer(containerKey); - setContainerClasses($container, direction); +const COORDINATE_ALIASES: Record = { + 'top left': { top: 10, left: 10 }, + 'top right': { top: 10, right: 10 }, + 'bottom left': { bottom: 10, left: 10 }, + 'bottom right': { bottom: 10, right: 10 }, + 'top center': (dimensions: Dimensions): NotifyCoordinates => ({ + top: 10, + left: Math.round(dimensions.windowWidth / 2 - dimensions.toastWidth / 2), + }), + 'left center': (dimensions: Dimensions): NotifyCoordinates => ({ + top: Math.round(dimensions.windowHeight / 2 - dimensions.toastHeight / 2), + left: 10, + }), + 'right center': (dimensions: Dimensions): NotifyCoordinates => ({ + top: Math.round(dimensions.windowHeight / 2 - dimensions.toastHeight / 2), + right: 10, + }), + center: (dimensions: Dimensions): NotifyCoordinates => ({ + top: Math.round(dimensions.windowHeight / 2 - dimensions.toastHeight / 2), + left: Math.round(dimensions.windowWidth / 2 - dimensions.toastWidth / 2), + }), + 'bottom center': (dimensions: Dimensions): NotifyCoordinates => ({ + bottom: 10, + left: Math.round(dimensions.windowWidth / 2 - dimensions.toastWidth / 2), + }), +}; - extend(options, { - container: $container, - _skipContentPositioning: true, - onShowing(args) { - setContainerStyles($container, direction, position); - userOnShowing?.(args); - }, - }); - } +const POSITION_STYLES_MAP: Record = { + up: (coordinates: NotifyCoordinates, dimensions: Dimensions): PositionStyles => ({ + bottom: coordinates.bottom + ?? dimensions.windowHeight - dimensions.toastHeight - (coordinates.top ?? 0), + top: '', + left: coordinates.left ?? '', + right: coordinates.right ?? '', + }), + down: (coordinates: NotifyCoordinates, dimensions: Dimensions): PositionStyles => ({ + top: coordinates.top + ?? dimensions.windowHeight - dimensions.toastHeight - (coordinates.bottom ?? 0), + bottom: '', + left: coordinates.left ?? '', + right: coordinates.right ?? '', + }), + left: (coordinates: NotifyCoordinates, dimensions: Dimensions): PositionStyles => ({ + right: coordinates.right + ?? dimensions.windowWidth - dimensions.toastWidth - (coordinates.left ?? 0), + left: '', + top: coordinates.top ?? '', + bottom: coordinates.bottom ?? '', + }), + right: (coordinates: NotifyCoordinates, dimensions: Dimensions): PositionStyles => ({ + left: coordinates.left + ?? dimensions.windowWidth - dimensions.toastWidth - (coordinates.right ?? 0), + right: '', + top: coordinates.top ?? '', + bottom: coordinates.bottom ?? '', + }), +}; - extend(options, { - type, - displayTime, - onHidden(args) { - $(args.element).remove(); - userOnHidden?.(args); - }, - }); - // @ts-expect-error - $notify = $('
').appendTo(viewPort()); - // @ts-expect-error - new Toast($notify, options).show(); -} +const getDefaultDirection = (position: string | NotifyCoordinates): DefaultDirection => { + const condition = isString(position) && position.includes('top'); -const getDefaultDirection = (position) => (isString(position) && position.includes('top') ? 'down-push' : 'up-push'); + return condition ? 'down-push' : 'up-push'; +}; -const createStackContainer = (key) => { +const createStackContainer = (key: string): dxElementWrapper => { const $container = $('
').appendTo(viewPort()); + $containers[key] = $container; return $container; }; -const getStackContainer = (key) => { +const getStackContainer = (key: string): dxElementWrapper => { const $container = $containers[key]; return $container || createStackContainer(key); }; -const setContainerClasses = (container, direction) => { +const setContainerClasses = (container: dxElementWrapper, direction: string): void => { const containerClasses = `dx-toast-stack dx-toast-stack-${direction}-direction`; container.removeAttr('class').addClass(containerClasses); }; -const setContainerStyles = (container, direction, position) => { - const { offsetWidth: toastWidth, offsetHeight: toastHeight } = container.children().first().get(0); +const getNotifyCoordinatesByAlias = (alias: string, dimensions: Dimensions): NotifyCoordinates => { + const coordinate = alias + ? COORDINATE_ALIASES[alias] + : COORDINATE_ALIASES['bottom center']; + + return typeof coordinate === 'function' ? coordinate(dimensions) : coordinate; +}; + +const getPositionStylesByNotifyCoordinates = ( + direction: string, + coordinates: NotifyCoordinates, + dimensions: Dimensions, +): PositionStyles => { + const directionKey = direction.replace(/-push|-stack/g, ''); + const styleFunction = POSITION_STYLES_MAP[directionKey]; + + return styleFunction ? styleFunction(coordinates, dimensions) : { + top: '', + bottom: '', + left: '', + right: '', + }; +}; + +const setContainerStyles = ( + container: dxElementWrapper, + direction: string, + position: string | NotifyCoordinates, +): void => { + const { + // @ts-expect-error 'offsetWidth' does not exist on type 'Element' + offsetWidth: toastWidth, + // @ts-expect-error 'offsetHeight' does not exist on type 'Element' + offsetHeight: toastHeight, + } = container.children().first().get(0); - const dimensions = { + const dimensions: Dimensions = { toastWidth, toastHeight, windowHeight: window.innerHeight, windowWidth: window.innerWidth, }; - const coordinates = isString(position) ? getCoordinatesByAlias(position, dimensions) : position; + const coordinates = isString(position) + ? getNotifyCoordinatesByAlias(position, dimensions) + : position; - const styles = getPositionStylesByCoordinates(direction, coordinates, dimensions); + const styles = getPositionStylesByNotifyCoordinates(direction, coordinates, dimensions); container.css(styles); }; -const getCoordinatesByAlias = (alias, { - toastWidth, toastHeight, windowHeight, windowWidth, -}) => { - switch (alias) { - case 'top left': - return { top: 10, left: 10 }; - case 'top right': - return { top: 10, right: 10 }; - case 'bottom left': - return { bottom: 10, left: 10 }; - case 'bottom right': - return { bottom: 10, right: 10 }; - case 'top center': - return { top: 10, left: Math.round(windowWidth / 2 - toastWidth / 2) }; - case 'left center': - return { top: Math.round(windowHeight / 2 - toastHeight / 2), left: 10 }; - case 'right center': - return { top: Math.round(windowHeight / 2 - toastHeight / 2), right: 10 }; - case 'center': - return { - top: Math.round(windowHeight / 2 - toastHeight / 2), - left: Math.round(windowWidth / 2 - toastWidth / 2), - }; - case 'bottom center': - default: - return { bottom: 10, left: Math.round(windowWidth / 2 - toastWidth / 2) }; - } -}; -// @ts-expect-error -const getPositionStylesByCoordinates = (direction, coordinates, dimensions) => { +const getToastOptions = ( + message: ToastProperties | string, + typeOrStack?: NotifyType, + displayTime?: number, +): ToastProperties => { + const userOptions = isPlainObject(message) ? message : { message }; + + const stack = isPlainObject(typeOrStack) ? typeOrStack : undefined; + const type = isPlainObject(typeOrStack) ? undefined : typeOrStack; + const { - toastWidth, toastHeight, windowHeight, windowWidth, - } = dimensions; - - // eslint-disable-next-line default-case - switch (direction.replace(/-push|-stack/g, '')) { - case 'up': - return { - bottom: coordinates.bottom ?? windowHeight - toastHeight - coordinates.top, - top: '', - left: coordinates.left ?? '', - right: coordinates.right ?? '', - }; - case 'down': - return { - top: coordinates.top ?? windowHeight - toastHeight - coordinates.bottom, - bottom: '', - left: coordinates.left ?? '', - right: coordinates.right ?? '', - }; - case 'left': - return { - right: coordinates.right ?? windowWidth - toastWidth - coordinates.left, - left: '', - top: coordinates.top ?? '', - bottom: coordinates.bottom ?? '', - }; - case 'right': - return { - left: coordinates.left ?? windowWidth - toastWidth - coordinates.right, - right: '', - top: coordinates.top ?? '', - bottom: coordinates.bottom ?? '', - }; + onHidden: userOnHidden, + onShowing: userOnShowing, + } = userOptions; + + const defaultConfiguration: Partial = { + onHidden: (e: HiddenEvent): void => { + $(e.element).remove(); + userOnHidden?.(e); + }, + }; + + if (type !== undefined) { + defaultConfiguration.type = type; + } + + if (displayTime !== undefined) { + defaultConfiguration.displayTime = displayTime; + } + + if (stack?.position) { + const { position } = stack; + + const direction = stack.direction || getDefaultDirection(position); + + const containerKey = isString(position) + ? position + : `${position.top}-${position.left}-${position.bottom}-${position.right}`; + + const $container = getStackContainer(containerKey); + + setContainerClasses($container, direction); + + const options = { + ...userOptions, + ...defaultConfiguration, + container: $container, + _skipContentPositioning: true, + onShowing: (e: ShowingEvent): void => { + setContainerStyles($container, direction, position); + userOnShowing?.(e); + }, + }; + + return options; } + + const options = { + ...userOptions, + ...defaultConfiguration, + }; + + return options; +}; + +const notify = ( + message: ToastProperties | string, + typeOrStack?: NotifyType, + displayTime?: number, +): void => { + const options = getToastOptions(message, typeOrStack, displayTime); + + $notify = $('
').appendTo(viewPort()); + + // @ts-expect-error Toast constructor accepts jQuery element + const toast = new Toast($notify, options); + + // eslint-disable-next-line @typescript-eslint/no-floating-promises + toast.show(); }; /// #DEBUG From cdd7e6e15a6e85210aa3172fd86faa9f671e8241 Mon Sep 17 00:00:00 2001 From: Vladimir Bushmanov Date: Thu, 14 Aug 2025 18:06:44 +0500 Subject: [PATCH 008/101] Scheduler: refactor view model output and sorted Index (#30732) Co-authored-by: Vladimir Bushmanov --- .../dragAndDrop/outlookDragging/base.ts | 2 +- .../scheduler/common/rerenderOnResize.ts | 19 +- .../scheduler/__tests__/appointments.test.ts | 25 ++ .../appointments/m_appointment_collection.ts | 416 ++++++++++-------- .../scheduler/appointments/resizing/m_core.ts | 5 +- .../scheduler/appointments/resizing/types.ts | 14 +- .../utils/countVisibleAppointments.test.ts | 37 -- .../utils/countVisibleAppointments.ts | 28 -- .../utils/count_visible_appointments.test.ts | 99 +++++ .../utils/count_visible_appointments.ts | 36 ++ .../utils/get_arrays_diff.test.ts | 205 +++++++++ .../appointments/utils/get_arrays_diff.ts | 66 +++ .../appointments/utils/get_view_model_diff.ts | 68 +++ .../utils/sorted_index_utils.test.ts | 97 ++++ .../appointments/utils/sorted_index_utils.ts | 37 ++ .../m_compact_appointments_helper.ts | 4 +- .../js/__internal/scheduler/m_scheduler.ts | 37 +- .../js/__internal/scheduler/m_subscribes.ts | 24 +- .../js/__internal/scheduler/m_utils.ts | 9 +- .../js/__internal/scheduler/types.ts | 48 -- .../get_repainted_appointments.ts | 154 ------- .../generate_view_model/add_collector.ts | 99 +++++ .../m_view_model_generator.ts | 150 +------ .../generate_view_model/plain_view_model.ts | 28 ++ .../view_model/generate_view_model/types.ts | 108 +++++ .../m_appointments_layout_manager.ts | 17 +- .../scheduler/workspaces/m_work_space.ts | 13 +- .../appointment.filtering.tests.js | 16 +- .../appointment.monthView.tests.js | 48 +- .../appointment.templates.tests.js | 7 +- .../appointment.timeLines.tests.js | 6 +- .../appointment.week.based.views.tests.js | 4 +- .../appointmentPopup.tests.js | 2 +- .../appointments.horizontalStrategy.tests.js | 21 +- .../appointments.tests.js | 171 +++---- .../appointments.verticalStrategy.tests.js | 44 +- .../common.events.tests.js | 6 +- .../integration.RTL.tests.js | 12 +- .../integration.agenda.tests.js | 2 +- .../integration.appointmentCollector.tests.js | 2 +- .../integration.appointmentTooltip.tests.js | 7 +- ...integration.multiWeekAppointments.tests.js | 32 +- .../integration.workSpace.tests.js | 3 +- .../layoutManager.tests.js | 33 +- .../subscribes.tests.js | 14 +- .../timezones.tests.js | 6 +- .../virtual_scrolling.integration.tests.js | 169 ++++--- .../virtual_scrolling.monthView.tests.js | 24 +- .../virtual_scrolling.timeline.tests.js | 66 +-- 49 files changed, 1520 insertions(+), 1020 deletions(-) create mode 100644 packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts delete mode 100644 packages/devextreme/js/__internal/scheduler/appointments/utils/countVisibleAppointments.test.ts delete mode 100644 packages/devextreme/js/__internal/scheduler/appointments/utils/countVisibleAppointments.ts create mode 100644 packages/devextreme/js/__internal/scheduler/appointments/utils/count_visible_appointments.test.ts create mode 100644 packages/devextreme/js/__internal/scheduler/appointments/utils/count_visible_appointments.ts create mode 100644 packages/devextreme/js/__internal/scheduler/appointments/utils/get_arrays_diff.test.ts create mode 100644 packages/devextreme/js/__internal/scheduler/appointments/utils/get_arrays_diff.ts create mode 100644 packages/devextreme/js/__internal/scheduler/appointments/utils/get_view_model_diff.ts create mode 100644 packages/devextreme/js/__internal/scheduler/appointments/utils/sorted_index_utils.test.ts create mode 100644 packages/devextreme/js/__internal/scheduler/appointments/utils/sorted_index_utils.ts delete mode 100644 packages/devextreme/js/__internal/scheduler/view_model/detect_changes/get_repainted_appointments.ts create mode 100644 packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/add_collector.ts create mode 100644 packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/plain_view_model.ts create mode 100644 packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/types.ts diff --git a/e2e/testcafe-devextreme/tests/scheduler/common/dragAndDrop/outlookDragging/base.ts b/e2e/testcafe-devextreme/tests/scheduler/common/dragAndDrop/outlookDragging/base.ts index 7d8cd42ca804..01c859e4709c 100644 --- a/e2e/testcafe-devextreme/tests/scheduler/common/dragAndDrop/outlookDragging/base.ts +++ b/e2e/testcafe-devextreme/tests/scheduler/common/dragAndDrop/outlookDragging/base.ts @@ -113,7 +113,7 @@ test('Basic drag-n-drop movements from tooltip in month view', async (t) => { .ok(); await t - .click(scheduler.collectors.find('1').element) + .click(scheduler.collectors.find('1', 1).element) .expect(scheduler.appointmentTooltip.isVisible()).ok() .drag(scheduler.appointmentTooltip.getListItem('Appointment 4').element, 320, 150) .expect(await takeScreenshot('drag-n-drop-\'Appointment 4\'-from-tooltip-in-month.png', scheduler.workSpace)) diff --git a/e2e/testcafe-devextreme/tests/scheduler/common/rerenderOnResize.ts b/e2e/testcafe-devextreme/tests/scheduler/common/rerenderOnResize.ts index adfdd703f9d2..8600efa565a3 100644 --- a/e2e/testcafe-devextreme/tests/scheduler/common/rerenderOnResize.ts +++ b/e2e/testcafe-devextreme/tests/scheduler/common/rerenderOnResize.ts @@ -8,7 +8,6 @@ fixture.disablePageReloads`Re-render on resize` .page(url(__dirname, '../../container.html')); const createScheduler = async (container, options?): Promise => createWidget('dxScheduler', { - ...options, currentDate: new Date(2020, 8, 7), startDayHour: 8, endDayHour: 20, @@ -27,24 +26,34 @@ const createScheduler = async (container, options?): Promise => createWidg endDate: new Date(2020, 8, 7, 9), text: 'test', }], + ...options, }, container); -safeSizeTest('Appointment should re-rendered on window resize when width and height not set (T1139566)', async (t) => { +safeSizeTest('Appointment should re-rendered on window resize-up (T1139566)', async (t) => { + const scheduler = new Scheduler('#container'); + const { element } = scheduler.getAppointment('test'); + + await setStyleAttribute(element, 'background-color: red;'); + await t.resizeWindow(800, 400); + await t.expect(await getStyleAttribute(element)).match(/transform: translate\(0px, 0px\); width: 10\d\.\d\d\dpx; height: 50px;/); +}, [400, 400]).before(async () => createScheduler('#container', { currentView: 'workWeek' })); + +safeSizeTest('Appointment should not re-rendered on window resize when width and height not set (T1139566)', async (t) => { const scheduler = new Scheduler('#container'); const { element } = scheduler.getAppointment('test'); await setStyleAttribute(element, 'background-color: red;'); await t.resizeWindow(300, 300); - await t.expect(await getStyleAttribute(element)).eql('transform: translate(0px, 26px); width: 200px; height: 74px;'); + await t.expect(await getStyleAttribute(element)).eql('transform: translate(0px, 26px); width: 200px; height: 74px; background-color: red;'); }).before(async () => createScheduler('#container')); -safeSizeTest('Appointment should re-rendered on window resize when width and height have percent value (T1139566)', async (t) => { +safeSizeTest('Appointment should not re-rendered on window resize when width and height have percent value (T1139566)', async (t) => { const scheduler = new Scheduler('#container'); const { element } = scheduler.getAppointment('test'); await setStyleAttribute(element, 'background-color: red;'); await t.resizeWindow(300, 400); - await t.expect(await getStyleAttribute(element)).eql('transform: translate(0px, 26px); width: 200px; height: 74px;'); + await t.expect(await getStyleAttribute(element)).eql('transform: translate(0px, 26px); width: 200px; height: 74px; background-color: red;'); }).before(async () => createScheduler('#container', { width: '100%', height: '100%' })); safeSizeTest('Appointment should not re-rendered on window resize when width and height have static value (T1139566)', async (t) => { diff --git a/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts b/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts new file mode 100644 index 000000000000..7aef71a8911b --- /dev/null +++ b/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts @@ -0,0 +1,25 @@ +import { + describe, expect, it, +} from '@jest/globals'; + +import { createScheduler } from './__mock__/create_scheduler'; +import { setupSchedulerTestEnvironment } from './__mock__/m_mock_scheduler'; + +describe('Appointments', () => { + it('All-day appointment should not be resizable if current view is "day"', async () => { + setupSchedulerTestEnvironment(); + const { container } = await createScheduler({ + dataSource: [{ + text: 'Appointment 1', + startDate: new Date(2015, 1, 9, 8), + endDate: new Date(2015, 1, 9, 9), + allDay: true, + }], + currentView: 'day', + currentDate: new Date(2015, 1, 9, 8), + }); + + const appointment = container.querySelector('.dx-scheduler-appointment'); + expect(appointment && !appointment.classList.contains('dx-resizable')).toBe(true); + }); +}); diff --git a/packages/devextreme/js/__internal/scheduler/appointments/m_appointment_collection.ts b/packages/devextreme/js/__internal/scheduler/appointments/m_appointment_collection.ts index 07d215b05bc0..5781ccd516e2 100644 --- a/packages/devextreme/js/__internal/scheduler/appointments/m_appointment_collection.ts +++ b/packages/devextreme/js/__internal/scheduler/appointments/m_appointment_collection.ts @@ -28,36 +28,49 @@ import { APPOINTMENT_SETTINGS_KEY } from '../constants'; import { APPOINTMENT_CONTENT_CLASSES, APPOINTMENT_DRAG_SOURCE_CLASS, APPOINTMENT_ITEM_CLASS } from '../m_classes'; import { getRecurrenceProcessor } from '../m_recurrence'; import timeZoneUtils from '../m_utils_time_zone'; -import type { AppointmentViewModel } from '../types'; import { AppointmentAdapter } from '../utils/appointment_adapter/appointment_adapter'; import type { AppointmentDataAccessor } from '../utils/data_accessor/appointment_data_accessor'; import { getAppointmentGroupValues } from '../utils/resource_manager/appointment_groups_utils'; import { getGroupTexts } from '../utils/resource_manager/group_utils'; +import type { + AppointmentAgendaViewModel, + AppointmentCollectorViewModel, + AppointmentItemViewModel, + AppointmentViewModelPlain, +} from '../view_model/generate_view_model/types'; import { AgendaAppointment } from './appointment/agenda_appointment'; import { Appointment } from './appointment/m_appointment'; import { createAgendaAppointmentLayout, createAppointmentLayout } from './m_appointment_layout'; import { getAppointmentDateRange } from './resizing/m_core'; -import { countVisibleAppointments } from './utils/countVisibleAppointments'; +import { countVisibleAppointments } from './utils/count_visible_appointments'; +import { isNeedToAdd } from './utils/get_arrays_diff'; +import { getViewModelDiff } from './utils/get_view_model_diff'; import { getAppointmentTakesSeveralDays, sortAppointmentsByStartDate } from './utils/m_utils'; +import { getNextElement, getPrevElement } from './utils/sorted_index_utils'; const COMPONENT_CLASS = 'dx-scheduler-scrollable-appointments'; const DBLCLICK_EVENT_NAME = addNamespace(dblclickEvent, 'dxSchedulerAppointment'); const toMs = dateUtils.dateToMilliseconds; -const isAllDayAppointment = ( - appointment: AppointmentViewModel, -): boolean => Boolean(appointment.settings[0]?.allDay); + +interface ViewModelDiff { + item: AppointmentViewModelPlain; + element?: dxElementWrapper; + needToAdd?: true; + needToRemove?: true; +} // @ts-expect-error class SchedulerAppointments extends CollectionWidget { - _virtualAppointments: any; + // NOTE: The key of this array is `sortedIndex` of appointment rendered in Element + renderedElementsBySortedIndex: dxElementWrapper[] = []; _appointmentClickTimeout: any; _$currentAppointment: any; - _currentAppointmentSettings: any; + _currentAppointmentSettings?: AppointmentViewModelPlain; _preventSingleAppointmentClick: any; @@ -85,11 +98,6 @@ class SchedulerAppointments extends CollectionWidget { return countVisibleAppointments(this.option('items') ?? []); } - constructor(element, options) { - super(element, options); - this._virtualAppointments = {}; - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars option(optionName?: string, value?: any) { return super.option(...arguments); @@ -124,14 +132,19 @@ class SchedulerAppointments extends CollectionWidget { const navigatableItems = this._getNavigatableItems(); const focusedItem = navigatableItems.filter('.dx-state-focused'); let index = focusedItem.data(APPOINTMENT_SETTINGS_KEY).sortedIndex; + let $nextAppointment = e.shiftKey + ? getPrevElement(index, this.renderedElementsBySortedIndex) + : getNextElement(index, this.renderedElementsBySortedIndex); const lastIndex = navigatableItems.length - 1; - if ((index > 0 && e.shiftKey) || (index < lastIndex && !e.shiftKey)) { + if ($nextAppointment || (index > 0 && e.shiftKey) || (index < lastIndex && !e.shiftKey)) { e.preventDefault(); - e.shiftKey ? index-- : index++; + if (!$nextAppointment) { + e.shiftKey ? index-- : index++; + $nextAppointment = this._getNavigatableItemByIndex(index); + } - const $nextAppointment = this._getNavigatableItemByIndex(index); this._resetTabIndex($nextAppointment); // @ts-expect-error eventsEngine.trigger($nextAppointment, 'focus'); @@ -228,14 +241,33 @@ class SchedulerAppointments extends CollectionWidget { }); } + protected getItemsDiff( + previousValue: AppointmentViewModelPlain[] = [], + value: AppointmentViewModelPlain[] = [], + ): ViewModelDiff[] { + const elementsInRenderOrder = previousValue + .map(({ sortedIndex }) => this.renderedElementsBySortedIndex[sortedIndex]); + const diff = getViewModelDiff(previousValue, value, this.appointmentDataProvider); + diff + .filter((item) => !isNeedToAdd(item)) + .forEach((item, index) => { + (item as ViewModelDiff).element = elementsInRenderOrder[index]; + }); + + return diff; + } + _optionChanged(args) { switch (args.name) { case 'items': (this as any)._cleanFocusState(); - this._clearDropDownItems(); - this._clearDropDownItemsElements(); - this._repaintAppointments(args.value); - this._renderDropDownAppointments(); + + if (this.isAgendaView) { + this.forceRepaintAllAppointments(args.value || []); + } else { + const diff = this.getItemsDiff(args.previousValue, args.value); + this.repaintAppointments(diff); + } this._attachAppointmentsEvents(); break; @@ -246,7 +278,9 @@ class SchedulerAppointments extends CollectionWidget { case 'allowDrag': case 'allowResize': case 'allowAllDayResize': - (this as any)._invalidate(); + (this as any)._cleanFocusState(); + this.forceRepaintAllAppointments(this.option('items') || []); + this._attachAppointmentsEvents(); break; case 'focusedElement': this._resetTabIndex($(args.value)); @@ -256,7 +290,7 @@ class SchedulerAppointments extends CollectionWidget { break; case 'focusStateEnabled': this._clearDropDownItemsElements(); - this._renderDropDownAppointments(); + this.renderDropDownAppointments(); super._optionChanged(args); break; @@ -265,39 +299,66 @@ class SchedulerAppointments extends CollectionWidget { } } - _isRepaintAll(appointments: AppointmentViewModel[]): boolean { - return this.isAgendaView || appointments.every((item) => item.needRepaint); - } - _applyFragment(fragment: dxElementWrapper, allDay: boolean): void { if (fragment.children().length > 0) { this._getAppointmentContainer(allDay).append(fragment); } } - _repaintAppointments(appointments: AppointmentViewModel[]): void { + protected forceRepaintAllAppointments(items: AppointmentViewModelPlain[]): void { + this.renderedElementsBySortedIndex = []; this._renderByFragments(($commonFragment, $allDayFragment) => { - const isRepaintAll = this._isRepaintAll(appointments); + this._getAppointmentContainer(true).html(''); + this._getAppointmentContainer(false).html(''); + if (items.length === 0) { + this._cleanItemContainer(); + } + + items.forEach((item, index) => { + const container = item.allDay + ? $allDayFragment + : $commonFragment; + this._renderItem(index, item, container); + }); + }); + } + + protected repaintAppointments(diff: ViewModelDiff[]): void { + this.renderedElementsBySortedIndex = []; + this._renderByFragments(($commonFragment, $allDayFragment) => { + const isRepaintAll = this.isAgendaView + || !diff.some((item) => item.needToAdd === undefined && item.needToRemove === undefined); if (isRepaintAll) { this._getAppointmentContainer(true).html(''); this._getAppointmentContainer(false).html(''); } - if (!appointments.length) { + if (diff.length === 0) { this._cleanItemContainer(); } - appointments.forEach((appointment, index) => { - const container = isAllDayAppointment(appointment) - ? $allDayFragment - : $commonFragment; + diff.forEach((item, index) => { + if (isRepaintAll && item.needToRemove) { + return; + } + + if (item.needToRemove) { + item.element?.detach(); + item.element?.remove(); + return; + } + + if (item.needToAdd) { + const container = item.item.allDay + ? $allDayFragment + : $commonFragment; + this._renderItem(index, item.item, container); + return; + } - if (appointment.needRemove) { - this._clearItem(appointment); - } else if (isRepaintAll || appointment.needRepaint) { - appointment.needRepaint = false; - this._clearItem(appointment); - this._renderItem(index, appointment, container); + if (item.element) { + item.element.data(APPOINTMENT_SETTINGS_KEY, item.item); + this.renderedElementsBySortedIndex[item.item.sortedIndex] = item.element; } }); }); @@ -338,22 +399,6 @@ class SchedulerAppointments extends CollectionWidget { (this as any)._attachHoverEvents(); } - _clearItem(item: AppointmentViewModel): void { - const $items = this._findItemElementByItem(item.itemData); - if (!$items.length) { - return; - } - - each($items, (_, $item: any) => { - $item.detach(); - $item.remove(); - }); - } - - _clearDropDownItems() { - this._virtualAppointments = {}; - } - _clearDropDownItemsElements() { this.invoke('clearCompactAppointments'); } @@ -395,8 +440,6 @@ class SchedulerAppointments extends CollectionWidget { if ($allDayContainer) { $allDayContainer.empty(); } - - this._virtualAppointments = {}; } _clean() { @@ -425,7 +468,7 @@ class SchedulerAppointments extends CollectionWidget { const formatText = this.invoke( 'getTextAndFormatDate', model.appointmentData, - this._currentAppointmentSettings?.agendaSettings || model.targetedAppointmentData, + (this._currentAppointmentSettings as any)?.agendaSettings || model.targetedAppointmentData, 'TIME', ); @@ -515,23 +558,26 @@ class SchedulerAppointments extends CollectionWidget { _renderItem( index: number, - item: AppointmentViewModel, + item: AppointmentViewModelPlain, container: dxElementWrapper, - ): dxElementWrapper[] { - const { itemData } = item; - const $items: dxElementWrapper[] = []; - - for (let i = 0; i < item.settings.length; i++) { - const setting = item.settings[i]; - this._currentAppointmentSettings = setting; - const $item = super._renderItem(index, itemData, container); + ): dxElementWrapper { + if ('items' in item) { + return this.renderDropDownAppointment(container, item); + } - $item.data(APPOINTMENT_SETTINGS_KEY, setting); + this._currentAppointmentSettings = item; + const $item = super._renderItem(index, item.itemData, container); - $items.push($item); + $item.data(APPOINTMENT_SETTINGS_KEY, item); + if (item.sortedIndex !== -1) { + // NOTE: fallback for integration testing + if (!this.renderedElementsBySortedIndex) { + this.renderedElementsBySortedIndex = []; + } + this.renderedElementsBySortedIndex[item.sortedIndex] = $item; } - return $items; + return $item; } _getItemContent($itemFrame) { @@ -568,63 +614,90 @@ class SchedulerAppointments extends CollectionWidget { } _postprocessRenderItem(args) { - this._renderAppointment(args.itemElement, this._currentAppointmentSettings); + this.renderAppointment( + args.itemElement, + this._currentAppointmentSettings as AppointmentAgendaViewModel | AppointmentItemViewModel, + ); } - _renderAppointment(element, settings) { + renderAppointment( + element: dxElementWrapper, + settings: AppointmentAgendaViewModel | AppointmentItemViewModel, + ): void { element.data(APPOINTMENT_SETTINGS_KEY, settings); - this._applyResourceDataAttr(element); - const rawAppointment = (this as any)._getItemData(element); - const geometry = this.invoke('getAppointmentGeometry', settings); - - if (settings.virtual) { - const appointmentConfig = { - itemData: rawAppointment, - groupIndex: settings.groupIndex, - groups: this.option('groups'), - }; - const deferredColor = this.option('getAppointmentColor')(appointmentConfig); + if (this.isAgendaView) { + this.renderAgendaAppointment(element, settings as AppointmentAgendaViewModel); + return; + } - this._processVirtualAppointment(settings, element, rawAppointment, deferredColor); - } else { - const allowResize = this.option('allowResize') && (!isDefined(settings.skipResizing) || isString(settings.skipResizing)); - const allowDrag = this.option('allowDrag'); - const { allDay } = settings; - const { groups, groupsLeafs, resourceById } = this.option('getResourceManager')(); - const config: any = { - data: rawAppointment, - groupIndex: settings.groupIndex, - groupTexts: getGroupTexts(groups, groupsLeafs, resourceById, settings.groupIndex), - observer: this.option('observer'), - geometry, - direction: settings.direction || 'vertical', - allowResize, - allowDrag, - allDay, - reduced: settings.appointmentReduced, - isCompact: settings.isCompact, - startDate: new Date(settings.info?.appointment.startDate), - cellWidth: this.invoke('getCellWidth'), - cellHeight: this.invoke('getCellHeight'), - resizableConfig: this._resizableConfig(rawAppointment, settings), - groups: this.option('groups'), - partIndex: settings.partIndex, - partTotalCount: settings.partTotalCount, + this.renderGeneralAppointment(element, settings as AppointmentItemViewModel); + } + + renderAgendaAppointment( + element: dxElementWrapper, + settings: AppointmentAgendaViewModel, + ): void { + const { allDay } = settings; + const { groups, groupsLeafs, resourceById } = this.option('getResourceManager')(); + const config: any = { + data: settings.itemData, + groupIndex: settings.groupIndex, + groupTexts: getGroupTexts(groups, groupsLeafs, resourceById, settings.groupIndex), + observer: this.option('observer'), + geometry: settings, + direction: settings.direction || 'vertical', + allowResize: false, + allowDrag: false, + allDay, + cellWidth: this.invoke('getCellWidth'), + cellHeight: this.invoke('getCellHeight'), + groups: this.option('groups'), + + dataAccessors: this.option('dataAccessors'), + timeZoneCalculator: this.option('timeZoneCalculator'), + getResourceManager: this.option('getResourceManager'), + }; - dataAccessors: this.dataAccessors, - timeZoneCalculator: this.option('timeZoneCalculator'), - getResizableStep: this.option('getResizableStep'), - getResourceManager: this.option('getResourceManager'), - }; + (this as any)._createComponent(element, AgendaAppointment, config); + } + + renderGeneralAppointment( + element: dxElementWrapper, + settings: AppointmentItemViewModel, + ): void { + const allowResize = this.option('allowResize') && (!isDefined(settings.skipResizing) || isString(settings.skipResizing)); + const allowDrag = this.option('allowDrag'); + const { allDay } = settings; + const { groups, groupsLeafs, resourceById } = this.option('getResourceManager')(); + const config: any = { + data: settings.itemData, + groupIndex: settings.groupIndex, + groupTexts: getGroupTexts(groups, groupsLeafs, resourceById, settings.groupIndex), + observer: this.option('observer'), + geometry: settings, + direction: settings.direction || 'vertical', + allowResize, + allowDrag, + allDay, + reduced: settings.reduced, + isCompact: settings.isCompact, + startDate: new Date(settings.info?.appointment.startDate), + cellWidth: this.invoke('getCellWidth'), + cellHeight: this.invoke('getCellHeight'), + resizableConfig: this._resizableConfig(settings.itemData, settings), + groups: this.option('groups'), + partIndex: settings.partIndex, + partTotalCount: settings.partTotalCount, + + dataAccessors: this.option('dataAccessors'), + timeZoneCalculator: this.option('timeZoneCalculator'), + getResizableStep: this.option('getResizableStep'), + getResourceManager: this.option('getResourceManager'), + }; - (this as any)._createComponent( - element, - this.isAgendaView ? AgendaAppointment : Appointment, - config, - ); - } + (this as any)._createComponent(element, Appointment, config); } _applyResourceDataAttr($appointment) { @@ -899,71 +972,60 @@ class SchedulerAppointments extends CollectionWidget { return result; } - _processVirtualAppointment(appointmentSetting, $appointment, appointmentData, color) { - const virtualAppointment = appointmentSetting.virtual; - const virtualGroupIndex = virtualAppointment.index; + protected renderDropDownAppointments(): void { + this._renderByFragments(($commonFragment, $allDayFragment) => { + const items: AppointmentViewModelPlain[] = this.option('items') || []; + items.forEach((item) => { + if ('items' in item) { + const $fragment = item.allDay ? $allDayFragment : $commonFragment; + this.renderDropDownAppointment($fragment, item); + } + }); + }); + } - if (!isDefined(this._virtualAppointments[virtualGroupIndex])) { - this._virtualAppointments[virtualGroupIndex] = { - coordinates: { - top: virtualAppointment.top, - left: virtualAppointment.left, - }, - items: { data: [], colors: [], settings: [] }, - isAllDay: !!virtualAppointment.isAllDay, - buttonColor: color, - sortedIndex: appointmentSetting.sortedIndex, + protected renderDropDownAppointment( + $fragment: dxElementWrapper, + appointment: AppointmentCollectorViewModel, + ): dxElementWrapper { + const virtualItems = appointment.items; + const buttonWidth = this.invoke('getDropDownAppointmentWidth', appointment.allDay); + const buttonHeight = this.invoke('getDropDownAppointmentHeight'); + const rtlOffset = this.option('rtlEnabled') ? buttonWidth : 0; + const isGroupCompact = !appointment.allDay && this.invoke('supportCompactDropDownAppointments'); + const items: any = { data: [], colors: [], settings: [] }; + virtualItems.forEach((item) => { + const appointmentConfig = { + itemData: item.itemData, + groupIndex: appointment.groupIndex, + groups: this.option('groups'), }; - } - - appointmentSetting.targetedAppointmentData = this.invoke('getTargetedAppointmentData', appointmentData, $appointment); + const buttonColor = this.option('getAppointmentColor')(appointmentConfig); - this._virtualAppointments[virtualGroupIndex].items.settings.push(appointmentSetting); - this._virtualAppointments[virtualGroupIndex].items.data.push(appointmentData); - this._virtualAppointments[virtualGroupIndex].items.colors.push(color); - - $appointment.remove(); - } - - _renderContentImpl() { - super._renderContentImpl(); - this._renderDropDownAppointments(); - } + items.data.push(item.itemData); + items.colors.push(buttonColor); + items.settings.push(item); + }); - _renderDropDownAppointments() { - this._renderByFragments(($commonFragment, $allDayFragment) => { - each(this._virtualAppointments, (groupIndex) => { - const virtualGroup = this._virtualAppointments[groupIndex]; - const virtualItems = virtualGroup.items; - const virtualCoordinates = virtualGroup.coordinates; - const $fragment = virtualGroup.isAllDay ? $allDayFragment : $commonFragment; - const { left } = virtualCoordinates; - const buttonWidth = this.invoke('getDropDownAppointmentWidth', virtualGroup.isAllDay); - const buttonHeight = this.invoke('getDropDownAppointmentHeight'); - const rtlOffset = this.option('rtlEnabled') ? buttonWidth : 0; - - this.notifyObserver('renderCompactAppointments', { - $container: $fragment, - coordinates: { - top: virtualCoordinates.top, - left: left + rtlOffset, - }, - items: virtualItems, - buttonColor: virtualGroup.buttonColor, - sortedIndex: virtualGroup.sortedIndex, - width: buttonWidth - this.option('_collectorOffset'), - height: buttonHeight, - onAppointmentClick: this.option('onItemClick'), - allowDrag: this.option('allowDrag'), - cellWidth: this.invoke('getCellWidth'), - isCompact: this.invoke('isAdaptive') || this._isGroupCompact(virtualGroup), - }); - }); + const $item = this.invoke('renderCompactAppointments', { + $container: $fragment, + coordinates: { + top: appointment.top, + left: appointment.left + rtlOffset, + }, + items, + buttonColor: items.colors[0], + sortedIndex: appointment.sortedIndex, + width: buttonWidth - this.option('_collectorOffset'), + height: buttonHeight, + onAppointmentClick: this.option('onItemClick'), + allowDrag: this.option('allowDrag'), + cellWidth: this.invoke('getCellWidth'), + isCompact: this.invoke('isAdaptive') || isGroupCompact, }); - } + this.renderedElementsBySortedIndex[appointment.sortedIndex] = $item; - _isGroupCompact(virtualGroup) { - return !virtualGroup.isAllDay && this.invoke('supportCompactDropDownAppointments'); + return $item; } _sortAppointmentsByStartDate(appointments) { diff --git a/packages/devextreme/js/__internal/scheduler/appointments/resizing/m_core.ts b/packages/devextreme/js/__internal/scheduler/appointments/resizing/m_core.ts index ecade3444554..af05c12c71ec 100644 --- a/packages/devextreme/js/__internal/scheduler/appointments/resizing/m_core.ts +++ b/packages/devextreme/js/__internal/scheduler/appointments/resizing/m_core.ts @@ -173,12 +173,11 @@ const getAppointmentCellsInfo = (options: GetAppointmentDateRangeOptions): Cells ? [DOMMetaData.allDayPanelCellsMeta] : DOMMetaData.dateTableCellsMeta; - const { positionByMap } = appointmentSettings; const { height: cellHeight, width: cellWidth, - } = DOMMetaTable[positionByMap.rowIndex][positionByMap.columnIndex]; - const cellCountInRow = DOMMetaTable[positionByMap.rowIndex].length; + } = DOMMetaTable[appointmentSettings.rowIndex][appointmentSettings.columnIndex]; + const cellCountInRow = DOMMetaTable[appointmentSettings.rowIndex].length; return { cellWidth, diff --git a/packages/devextreme/js/__internal/scheduler/appointments/resizing/types.ts b/packages/devextreme/js/__internal/scheduler/appointments/resizing/types.ts index 5137d3faf857..743ec8db2ba4 100644 --- a/packages/devextreme/js/__internal/scheduler/appointments/resizing/types.ts +++ b/packages/devextreme/js/__internal/scheduler/appointments/resizing/types.ts @@ -1,6 +1,7 @@ import type { TimeZoneCalculator } from '../../r1/timezone_calculator'; -import type { SafeAppointment, ViewDataProviderType } from '../../types'; +import type { ViewDataProviderType } from '../../types'; import type { AppointmentDataAccessor } from '../../utils/data_accessor/appointment_data_accessor'; +import type { AppointmentItemViewModel } from '../../view_model/generate_view_model/types'; export type Rect = Pick; @@ -9,16 +10,7 @@ export interface GetAppointmentDateRangeOptions { left: boolean; right: boolean; }; - appointmentSettings: { - allDay: boolean; - info: SafeAppointment & { - appointment: SafeAppointment; - }; - positionByMap: { - rowIndex: number; - columnIndex: number; - }; - }; + appointmentSettings: AppointmentItemViewModel; isVerticalGroupedWorkSpace: boolean; appointmentRect: Rect; parentAppointmentRect: Rect; diff --git a/packages/devextreme/js/__internal/scheduler/appointments/utils/countVisibleAppointments.test.ts b/packages/devextreme/js/__internal/scheduler/appointments/utils/countVisibleAppointments.test.ts deleted file mode 100644 index 3c2511146f69..000000000000 --- a/packages/devextreme/js/__internal/scheduler/appointments/utils/countVisibleAppointments.test.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { describe, expect, it } from '@jest/globals'; - -import { countVisibleAppointments } from './countVisibleAppointments'; - -describe('countVisibleAppointments', () => { - it('should return correct number of visible appointments', () => { - expect(countVisibleAppointments([ - { needRepaint: true, needRemove: false, settings: [{}, {}, {}] }, - { needRepaint: true, needRemove: true, settings: [{}, {}, {}] }, - { needRepaint: true, needRemove: false, settings: [{}] }, - ])).toBe(4); - }); - - it('should return correct number of visible appointments with parts', () => { - expect(countVisibleAppointments([ - { - needRepaint: true, - needRemove: false, - settings: [ - { partIndex: 1, partTotalCount: 2 }, - {}, - { partIndex: 0, partTotalCount: 2 }, - { partIndex: 1, partTotalCount: 2 }, - {}, - { partIndex: 0, partTotalCount: 2 }, - ], - }, - { needRepaint: true, needRemove: true, settings: [{}, {}, {}] }, - { - needRepaint: true, - needRemove: false, - settings: [ - { partIndex: 0, partTotalCount: 2 }], - }, - ])).toBe(6); - }); -}); diff --git a/packages/devextreme/js/__internal/scheduler/appointments/utils/countVisibleAppointments.ts b/packages/devextreme/js/__internal/scheduler/appointments/utils/countVisibleAppointments.ts deleted file mode 100644 index 8dcc07b40980..000000000000 --- a/packages/devextreme/js/__internal/scheduler/appointments/utils/countVisibleAppointments.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { isDefined } from '@ts/core/utils/m_type'; - -interface SettingsItem { - partIndex?: number; - partTotalCount?: number; -} -interface Item { - needRepaint: boolean; - needRemove: boolean; - settings: SettingsItem[]; -} - -const countVisibleRepeats = (settings: SettingsItem[]): number => { - let isPreviousPart = false; - - return settings.reduce((total, settingsItem) => { - const result = isPreviousPart ? total : total + 1; - const { partIndex, partTotalCount } = settingsItem; - - isPreviousPart = isDefined(partTotalCount) && partIndex !== (partTotalCount - 1); - - return result; - }, 0); -}; - -export const countVisibleAppointments = (items: Item[]): number => items - .filter(({ needRemove }) => !needRemove) - .reduce((total, item) => total + countVisibleRepeats(item.settings), 0); diff --git a/packages/devextreme/js/__internal/scheduler/appointments/utils/count_visible_appointments.test.ts b/packages/devextreme/js/__internal/scheduler/appointments/utils/count_visible_appointments.test.ts new file mode 100644 index 000000000000..9978c9271cd9 --- /dev/null +++ b/packages/devextreme/js/__internal/scheduler/appointments/utils/count_visible_appointments.test.ts @@ -0,0 +1,99 @@ +import { describe, expect, it } from '@jest/globals'; + +import { countVisibleAppointments } from './count_visible_appointments'; + +const createAppointment = (date: number) => ({ + startDate: new Date(date), + endDate: new Date(date + 1), +}); + +describe('countVisibleAppointments', () => { + it('should return correct number of agenda appointments', () => { + expect(countVisibleAppointments([ + { itemData: 1, agendaSettings: createAppointment(0) } as any, + { itemData: 2, agendaSettings: createAppointment(1) } as any, + { itemData: 3, agendaSettings: createAppointment(2) } as any, + ])).toBe(3); + }); + + it('should return correct number of appointments with collectors', () => { + expect(countVisibleAppointments([ + { itemData: 1, info: { appointment: createAppointment(1) } } as any, + { + itemData: 2, + items: [ + { itemData: 3, info: { appointment: createAppointment(2) } } as any, + { itemData: 4, info: { appointment: createAppointment(3) } } as any, + ], + } as any, + ])).toBe(3); + }); + + it('should return correct number of appointments with parts', () => { + expect(countVisibleAppointments([ + { + itemData: 1, + info: { appointment: createAppointment(1) }, + partIndex: 0, + partTotalCount: 2, + } as any, + { + itemData: 1, + info: { appointment: createAppointment(1) }, + partIndex: 1, + partTotalCount: 2, + } as any, + { itemData: 2, info: { appointment: createAppointment(1) } } as any, + { itemData: 3, info: { appointment: createAppointment(2) } } as any, + ])).toBe(3); + }); + + it('should return correct number of appointments with parts and collectors', () => { + expect(countVisibleAppointments([ + { + itemData: 3, + items: [ + { + itemData: 3, + info: { appointment: createAppointment(2) }, + partIndex: 0, + partTotalCount: 2, + } as any, + ], + } as any, + { + itemData: 1, + info: { appointment: createAppointment(1) }, + partIndex: 0, + partTotalCount: 3, + } as any, + { + itemData: 1, + info: { appointment: createAppointment(1) }, + partIndex: 1, + partTotalCount: 3, + } as any, + { itemData: 2, info: { appointment: createAppointment(1) } } as any, + { + itemData: 3, + info: { appointment: createAppointment(2) }, + partIndex: 1, + partTotalCount: 2, + } as any, + { + itemData: 2, + items: [ + { itemData: 4, info: { appointment: createAppointment(1) } } as any, + { itemData: 5, info: { appointment: createAppointment(2) } } as any, + { + itemData: 1, + info: { appointment: createAppointment(1) }, + partIndex: 2, + partTotalCount: 3, + } as any, + { itemData: 6, info: { appointment: createAppointment(3) } } as any, + ], + } as any, + ])).toBe(6); + }); +}); diff --git a/packages/devextreme/js/__internal/scheduler/appointments/utils/count_visible_appointments.ts b/packages/devextreme/js/__internal/scheduler/appointments/utils/count_visible_appointments.ts new file mode 100644 index 000000000000..9cbaf097bbda --- /dev/null +++ b/packages/devextreme/js/__internal/scheduler/appointments/utils/count_visible_appointments.ts @@ -0,0 +1,36 @@ +import type { SafeAppointment } from '../../types'; +import type { + AppointmentItemViewModel, + AppointmentViewModelPlain, +} from '../../view_model/generate_view_model/types'; + +export const countVisibleAppointments = (items: AppointmentViewModelPlain[]): number => { + const alreadyCountedPartHash = new Map(); + const countPart = (item: AppointmentItemViewModel): boolean => { + if (!item.partTotalCount) { + return true; + } + + const key = `${item.info.appointment.startDate.getTime()}${item.info.appointment.endDate.getTime()}`; + const savedItems = alreadyCountedPartHash.get(key) ?? []; + + if (savedItems.includes(item.itemData)) { + return false; + } + + alreadyCountedPartHash.set(key, [...savedItems, item.itemData]); + return true; + }; + + return items.reduce((count, item) => { + if ('items' in item) { + return count + item.items.filter(countPart).length; + } + + if ('info' in item && !countPart(item)) { + return count; + } + + return count + 1; + }, 0); +}; diff --git a/packages/devextreme/js/__internal/scheduler/appointments/utils/get_arrays_diff.test.ts b/packages/devextreme/js/__internal/scheduler/appointments/utils/get_arrays_diff.test.ts new file mode 100644 index 000000000000..cd4eaa0500a6 --- /dev/null +++ b/packages/devextreme/js/__internal/scheduler/appointments/utils/get_arrays_diff.test.ts @@ -0,0 +1,205 @@ +import { + describe, expect, it, +} from '@jest/globals'; + +import { getArraysDiff, isNeedToAdd, isNeedToRemove } from './get_arrays_diff'; + +interface Obj { id: number; name: string } + +const compare = (a: Obj, b: Obj): boolean => a.id === b.id && a.name === b.name; + +const getOperations = (items: ReturnType>): string => items + .map((item) => { + if (isNeedToAdd(item)) { + return '+'; + } + return isNeedToRemove(item) ? '-' : '='; + }) + .join(''); + +describe('getArraysDiff', () => { + it('should process both empty arrays', () => { + const diff = getArraysDiff([], [], compare); + expect(diff).toEqual([]); + }); + + it('should no mark for no changes', () => { + const a: Obj[] = [ + { id: 1, name: 'A' }, + { id: 2, name: 'B' }, + { id: 3, name: 'C' }, + ]; + const b: Obj[] = [ + { id: 1, name: 'A' }, + { id: 2, name: 'B' }, + { id: 3, name: 'C' }, + ]; + + const diff = getArraysDiff(a, b, compare); + + expect(getOperations(diff)).toBe('==='); + expect(diff).toEqual([ + { item: a[0] }, + { item: a[1] }, + { item: a[2] }, + ]); + }); + + it('should mark insertion from empty to something', () => { + const a: Obj[] = []; + const b: Obj[] = [ + { id: 10, name: 'X' }, + { id: 11, name: 'Y' }, + ]; + + const diff = getArraysDiff(a, b, compare); + + expect(getOperations(diff)).toBe('++'); + expect(diff).toEqual([ + { item: b[0], needToAdd: true }, + { item: b[1], needToAdd: true }, + ]); + }); + + it('should removal from something to empty', () => { + const a: Obj[] = [ + { id: 5, name: 'A' }, + { id: 6, name: 'B' }, + ]; + const b: Obj[] = []; + + const diff = getArraysDiff(a, b, compare); + + expect(getOperations(diff)).toBe('--'); + expect(diff).toEqual([ + { item: a[0], needToRemove: true }, + { item: a[1], needToRemove: true }, + ]); + }); + + it('should mark remove and add for one object replacement', () => { + const a: Obj[] = [ + { id: 1, name: 'A' }, + { id: 2, name: 'B' }, + { id: 4, name: 'D' }, + ]; + const b: Obj[] = [ + { id: 1, name: 'A' }, + { id: 3, name: 'C' }, + { id: 4, name: 'D' }, + ]; + + const diff = getArraysDiff(a, b, compare); + + expect(getOperations(diff)).toBe('=+-='); + expect(diff).toEqual([ + { item: a[0] }, + { item: b[1], needToAdd: true }, + { item: a[1], needToRemove: true }, + { item: a[2] }, + ]); + }); + + it('should mark remove and add for changes inside object', () => { + const a: Obj[] = [ + { id: 1, name: 'A' }, + { id: 2, name: 'B' }, + { id: 4, name: 'D' }, + ]; + const b: Obj[] = [ + { id: 1, name: 'A' }, + { id: 2, name: 'C' }, + { id: 4, name: 'D' }, + ]; + + const diff = getArraysDiff(a, b, compare); + + expect(getOperations(diff)).toBe('=+-='); + expect(diff).toEqual([ + { item: a[0] }, + { item: b[1], needToAdd: true }, + { item: a[1], needToRemove: true }, + { item: a[2] }, + ]); + }); + + it('should choose optimum operations for reordering', () => { + const a: Obj[] = [ + { id: 1, name: 'A' }, + { id: 2, name: 'B' }, + { id: 3, name: 'C' }, + { id: 4, name: 'D' }, + ]; + const b: Obj[] = [ + { id: 4, name: 'D' }, + { id: 1, name: 'A' }, + { id: 2, name: 'B' }, + { id: 3, name: 'C' }, + ]; + + const diff = getArraysDiff(a, b, compare); + + expect(getOperations(diff)).toBe('+===-'); + expect(diff).toEqual([ + { item: b[0], needToAdd: true }, + { item: a[0] }, + { item: a[1] }, + { item: a[2] }, + { item: a[3], needToRemove: true }, + ]); + }); + + it('should choose optimum operations for reordering, insertion and removal', () => { + const a: Obj[] = [ + { id: 1, name: 'A' }, + { id: 2, name: 'B' }, + { id: 3, name: 'C' }, + { id: 4, name: 'D' }, + ]; + const b: Obj[] = [ + { id: 4, name: 'D' }, + { id: 1, name: 'A' }, + { id: 5, name: 'E' }, + { id: 3, name: 'C' }, + ]; + + const diff = getArraysDiff(a, b, compare); + + expect(getOperations(diff)).toBe('+=+-=-'); + expect(diff).toEqual([ + { item: b[0], needToAdd: true }, + { item: a[0] }, + { item: b[2], needToAdd: true }, + { item: a[1], needToRemove: true }, + { item: a[2] }, + { item: a[3], needToRemove: true }, + ]); + }); + + it('should save additional props in second object', () => { + const a: Obj[] = [ + { id: 1, name: 'A' }, + { id: 2, name: 'B' }, + { id: 3, name: 'C' }, + { id: 4, name: 'D' }, + ]; + const b: (Obj & { extra: number })[] = [ + { id: 4, name: 'D', extra: 10 }, + { id: 1, name: 'A', extra: 20 }, + { id: 5, name: 'E', extra: 30 }, + { id: 3, name: 'C', extra: 40 }, + ]; + + const diff = getArraysDiff(a, b, compare); + + expect(getOperations(diff)).toBe('+=+-=-'); + expect(diff).toEqual([ + { item: b[0], needToAdd: true }, + { item: b[1] }, + { item: b[2], needToAdd: true }, + { item: a[1], needToRemove: true }, + { item: b[3] }, + { item: a[3], needToRemove: true }, + ]); + }); +}); diff --git a/packages/devextreme/js/__internal/scheduler/appointments/utils/get_arrays_diff.ts b/packages/devextreme/js/__internal/scheduler/appointments/utils/get_arrays_diff.ts new file mode 100644 index 000000000000..3aaac3902732 --- /dev/null +++ b/packages/devextreme/js/__internal/scheduler/appointments/utils/get_arrays_diff.ts @@ -0,0 +1,66 @@ +interface NoChanges { item: A } +interface ToRemove { item: A; needToRemove: true } +interface ToAdd { item: B; needToAdd: true } + +export type DiffItem = + | NoChanges + | ToRemove + | ToAdd; + +export const isNeedToRemove = ( + item: DiffItem, +): item is ToRemove => (item as ToRemove).needToRemove; + +export const isNeedToAdd = ( + item: DiffItem, +): item is ToAdd => (item as ToAdd).needToAdd; + +export function getArraysDiff( + a: A[], + b: B[], + equal: (x: A, y: B) => boolean, +): DiffItem[] { + const n = a.length; + const m = b.length; + + const dp: number[][] = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0)); + + for (let i = 1; i <= n; i += 1) { + const ai = a[i - 1]; + for (let j = 1; j <= m; j += 1) { + dp[i][j] = equal(ai, b[j - 1]) + ? dp[i - 1][j - 1] + 1 + : Math.max(dp[i - 1][j], dp[i][j - 1]); + } + } + + const result: DiffItem[] = []; + let i = n; + let j = m; + + while (i > 0 && j > 0) { + if (equal(a[i - 1], b[j - 1])) { + result.push({ item: b[j - 1] }); + i -= 1; + j -= 1; + } else if (dp[i - 1][j] >= dp[i][j - 1]) { + result.push({ item: a[i - 1], needToRemove: true }); + i -= 1; + } else { + result.push({ item: b[j - 1], needToAdd: true }); + j -= 1; + } + } + + while (i > 0) { + result.push({ item: a[i - 1], needToRemove: true }); + i -= 1; + } + while (j > 0) { + result.push({ item: b[j - 1], needToAdd: true }); + j -= 1; + } + + result.reverse(); + return result; +} diff --git a/packages/devextreme/js/__internal/scheduler/appointments/utils/get_view_model_diff.ts b/packages/devextreme/js/__internal/scheduler/appointments/utils/get_view_model_diff.ts new file mode 100644 index 000000000000..65267fe1cb44 --- /dev/null +++ b/packages/devextreme/js/__internal/scheduler/appointments/utils/get_view_model_diff.ts @@ -0,0 +1,68 @@ +import { equalByValue } from '@js/core/utils/common'; + +import type { SafeAppointment } from '../../types'; +import type { AppointmentDataProvider } from '../../view_model/generate_view_model/data_provider/m_appointment_data_provider'; +import type { AppointmentViewModelPlain } from '../../view_model/generate_view_model/types'; +import type { DiffItem } from './get_arrays_diff'; +import { getArraysDiff } from './get_arrays_diff'; + +const getObjectToCompare = ( + item: AppointmentViewModelPlain, +): object => { + if ('agendaSettings' in item) { + return {}; + } + + if ('items' in item) { + return { + allDay: item.allDay, + groupIndex: item.groupIndex, + top: item.top, + left: item.left, + items: item.items.length, + }; + } + + return { + allDay: item.allDay, + groupIndex: item.groupIndex, + direction: item.direction, + left: item.left, + top: item.top, + height: item.height, + width: item.width, + reduced: item.reduced, + partIndex: item.partIndex, + partTotalCount: item.partTotalCount, + rowIndex: item.rowIndex, + columnIndex: item.columnIndex, + }; +}; + +const isDataChanged = ( + data: SafeAppointment, + appointmentDataProvider: AppointmentDataProvider, +): boolean => { + const updatedData = appointmentDataProvider.getUpdatedAppointment(); + + return updatedData === data || appointmentDataProvider + .getUpdatedAppointmentKeys() + .some((item) => data[item.key] === item.value); +}; + +const compareViewModel = (appointmentDataProvider: AppointmentDataProvider) => ( + viewModelOld: AppointmentViewModelPlain, + viewModelNext: AppointmentViewModelPlain, +): boolean => viewModelOld.itemData === viewModelNext.itemData + && !isDataChanged(viewModelNext.itemData, appointmentDataProvider) + && equalByValue(getObjectToCompare(viewModelOld), getObjectToCompare(viewModelNext)); + +export const getViewModelDiff = ( + viewModelOld: AppointmentViewModelPlain[], + viewModelNext: AppointmentViewModelPlain[], + appointmentDataProvider: AppointmentDataProvider, +): DiffItem[] => getArraysDiff( + viewModelOld, + viewModelNext, + compareViewModel(appointmentDataProvider), +); diff --git a/packages/devextreme/js/__internal/scheduler/appointments/utils/sorted_index_utils.test.ts b/packages/devextreme/js/__internal/scheduler/appointments/utils/sorted_index_utils.test.ts new file mode 100644 index 000000000000..dea90ab102e7 --- /dev/null +++ b/packages/devextreme/js/__internal/scheduler/appointments/utils/sorted_index_utils.test.ts @@ -0,0 +1,97 @@ +import { + describe, expect, it, jest, +} from '@jest/globals'; +import $ from '@js/core/renderer'; + +import { getNextElement, getPrevElement, isElementCanBeFocused } from './sorted_index_utils'; + +const createContainer = () => { + const container = document.createElement('div'); + const $element = $(container); + jest.spyOn($element, 'is').mockImplementation((selector) => selector === ':visible'); + return $element; +}; +const createDisabledContainer = () => { + const $container = createContainer(); + $container.addClass('dx-state-disabled'); + return $container; +}; + +describe('sorted index utils', () => { + describe('isElementCanBeFocused', () => { + it('should return true for pure div', () => { + expect(isElementCanBeFocused(createContainer())).toBe(true); + }); + + it('should return false for invisible div', () => { + const container = document.createElement('div'); + expect(isElementCanBeFocused($(container))).toBe(false); + }); + + it('should return false for disabled div', () => { + expect(isElementCanBeFocused(createDisabledContainer())).toBe(false); + }); + }); + + describe('getPrevElement', () => { + it('should return prev element', () => { + const elements = [ + createContainer(), + createContainer(), + createContainer(), + ]; + + expect(getPrevElement(2, elements)).toBe(elements[1]); + }); + + it('should return prev element that exist and not disabled', () => { + const elements = [ + createContainer(), + undefined, + createDisabledContainer(), + createContainer(), + ]; + + expect(getPrevElement(3, elements as any)).toBe(elements[0]); + }); + + it('should return undefined', () => { + const elements = [ + createContainer(), + ]; + + expect(getPrevElement(0, elements)).toBe(undefined); + }); + }); + + describe('getNextElement', () => { + it('should return next element', () => { + const elements = [ + createContainer(), + createContainer(), + createContainer(), + ]; + + expect(getNextElement(2, elements)).toBe(elements[3]); + }); + + it('should return next element that exist and not disabled', () => { + const elements = [ + createContainer(), + undefined, + createDisabledContainer(), + createContainer(), + ]; + + expect(getNextElement(0, elements as any)).toBe(elements[3]); + }); + + it('should return undefined', () => { + const elements = [ + createContainer(), + ]; + + expect(getNextElement(0, elements)).toBe(undefined); + }); + }); +}); diff --git a/packages/devextreme/js/__internal/scheduler/appointments/utils/sorted_index_utils.ts b/packages/devextreme/js/__internal/scheduler/appointments/utils/sorted_index_utils.ts new file mode 100644 index 000000000000..8e78379255a0 --- /dev/null +++ b/packages/devextreme/js/__internal/scheduler/appointments/utils/sorted_index_utils.ts @@ -0,0 +1,37 @@ +import type { dxElementWrapper } from '@js/core/renderer'; + +export const isElementCanBeFocused = ($element: dxElementWrapper): boolean => Boolean( + $element && $element.is(':visible') && !$element.hasClass('dx-state-disabled'), +); + +export const getPrevElement = ( + sortedIndex: number, + renderedElementsBySortedIndex: dxElementWrapper[] = [], +): dxElementWrapper | undefined => { + let index = sortedIndex - 1; + while (index >= 0) { + const $nextElement = renderedElementsBySortedIndex[index]; + if (isElementCanBeFocused($nextElement)) { + return $nextElement; + } + index -= 1; + } + + return undefined; +}; + +export const getNextElement = ( + sortedIndex: number, + renderedElementsBySortedIndex: dxElementWrapper[] = [], +): dxElementWrapper | undefined => { + let index = sortedIndex + 1; + while (index < renderedElementsBySortedIndex.length) { + const $nextElement = renderedElementsBySortedIndex[index]; + if (isElementCanBeFocused($nextElement)) { + return $nextElement; + } + index += 1; + } + + return undefined; +}; diff --git a/packages/devextreme/js/__internal/scheduler/m_compact_appointments_helper.ts b/packages/devextreme/js/__internal/scheduler/m_compact_appointments_helper.ts index a2f533bb9ae4..6c3a6592160d 100644 --- a/packages/devextreme/js/__internal/scheduler/m_compact_appointments_helper.ts +++ b/packages/devextreme/js/__internal/scheduler/m_compact_appointments_helper.ts @@ -1,7 +1,7 @@ import { locate, move } from '@js/common/core/animation/translator'; import dateLocalization from '@js/common/core/localization/date'; import messageLocalization from '@js/common/core/localization/message'; -import $ from '@js/core/renderer'; +import $, { type dxElementWrapper } from '@js/core/renderer'; import { FunctionTemplate } from '@js/core/templates/function_template'; import Button from '@js/ui/button'; @@ -21,7 +21,7 @@ export class CompactAppointmentsHelper { constructor(public instance) { } - render(options) { + render(options): dxElementWrapper { const { isCompact, items } = options; const template = this._createTemplate(items.data.length, isCompact); diff --git a/packages/devextreme/js/__internal/scheduler/m_scheduler.ts b/packages/devextreme/js/__internal/scheduler/m_scheduler.ts index df5238d29e16..19b32dc748d5 100644 --- a/packages/devextreme/js/__internal/scheduler/m_scheduler.ts +++ b/packages/devextreme/js/__internal/scheduler/m_scheduler.ts @@ -57,7 +57,6 @@ import { import { SchedulerOptionsBaseWidget } from './scheduler_options_base_widget'; import { DesktopTooltipStrategy } from './tooltip_strategies/m_desktop_tooltip_strategy'; import { MobileTooltipStrategy } from './tooltip_strategies/m_mobile_tooltip_strategy'; -import type { AppointmentViewModel } from './types'; import { AppointmentAdapter } from './utils/appointment_adapter/appointment_adapter'; import { AppointmentDataAccessor } from './utils/data_accessor/appointment_data_accessor'; import type { IFieldExpr } from './utils/index'; @@ -70,6 +69,10 @@ import { getLeafGroupValues } from './utils/resource_manager/group_utils'; import { createResourceEditorModel } from './utils/resource_manager/popup_utils'; import { ResourceManager } from './utils/resource_manager/resource_manager'; import { AppointmentDataProvider } from './view_model/generate_view_model/data_provider/m_appointment_data_provider'; +import type { + AppointmentAgendaViewModel, + AppointmentViewModelPlain, +} from './view_model/generate_view_model/types'; import AppointmentLayoutManager from './view_model/m_appointments_layout_manager'; import SchedulerAgenda from './workspaces/m_agenda'; import SchedulerTimelineDay from './workspaces/m_timeline_day'; @@ -867,7 +870,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { workspace.option('allDayExpanded', this._isAllDayExpanded()); // @ts-expect-error - const viewModel: AppointmentViewModel[] = this._isVisible() + const viewModel: AppointmentViewModelPlain[] = this._isVisible() ? this._getAppointmentsToRepaint() : []; @@ -875,13 +878,9 @@ class Scheduler extends SchedulerOptionsBaseWidget { this.appointmentDataProvider.cleanState(); } - _getAppointmentsToRepaint(): AppointmentViewModel[] { + _getAppointmentsToRepaint(): AppointmentViewModelPlain[] { const appointmentsMap = this._layoutManager.createAppointmentsMap(); - - return this._layoutManager.getRepaintedAppointments( - appointmentsMap, - this.getAppointmentsInstance().option('items'), - ); + return appointmentsMap; } _initExpressions(fields: IFieldExpr) { @@ -1677,10 +1676,8 @@ class Scheduler extends SchedulerOptionsBaseWidget { } getTargetedAppointment(appointment, element) { - const settings: any = utils.dataAccessors.getAppointmentSettings(element); - const info = utils.dataAccessors.getAppointmentInfo(element); - - const appointmentIndex = $(element).data(this._appointments._itemIndexKey()); + const settings = utils.dataAccessors.getAppointmentSettings(element)!; + const info = 'info' in settings ? settings.info : undefined; const adapter = new AppointmentAdapter( appointment, @@ -1690,7 +1687,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { const targetedAdapter = adapter.clone(); if (this._isAgenda() && adapter.isRecurrent) { - const { agendaSettings } = settings; + const { agendaSettings } = settings as AppointmentAgendaViewModel; targetedAdapter.startDate = this._dataAccessors.get('startDate', agendaSettings); targetedAdapter.endDate = this._dataAccessors.get('endDate', agendaSettings); @@ -1701,7 +1698,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { const rawTargetedAppointment = targetedAdapter.source; if (element) { - this.setTargetedAppointmentResources(rawTargetedAppointment, element, appointmentIndex); + this.setTargetedAppointmentResources(rawTargetedAppointment, element); } if (info) { @@ -1838,10 +1835,6 @@ class Scheduler extends SchedulerOptionsBaseWidget { return this._layoutManager; } - getRenderingStrategyInstance() { - return this._layoutManager.getRenderingStrategyInstance(); - } - getActions() { return this._actions; } @@ -1889,15 +1882,13 @@ class Scheduler extends SchedulerOptionsBaseWidget { return startDateTimeStamp <= dayTimeStamp && dayTimeStamp <= endDateTimeStamp; } - setTargetedAppointmentResources(rawAppointment, element, appointmentIndex) { + setTargetedAppointmentResources(rawAppointment, element) { const groups = this.getViewOption('groups'); if (groups?.length) { const { resourceById, groupsLeafs } = this.resourceManager; - const appointmentSettings = this._isAgenda() - ? this._layoutManager._positionMap[appointmentIndex][0] - : utils.dataAccessors.getAppointmentSettings(element) || {}; - const cellGroups = getLeafGroupValues(groupsLeafs, appointmentSettings.groupIndex); + const appointmentSettings = utils.dataAccessors.getAppointmentSettings(element); + const cellGroups = getLeafGroupValues(groupsLeafs, appointmentSettings?.groupIndex); setAppointmentGroupValues(rawAppointment, resourceById, cellGroups); } diff --git a/packages/devextreme/js/__internal/scheduler/m_subscribes.ts b/packages/devextreme/js/__internal/scheduler/m_subscribes.ts index e3be1887fc7a..2b2020c5e662 100644 --- a/packages/devextreme/js/__internal/scheduler/m_subscribes.ts +++ b/packages/devextreme/js/__internal/scheduler/m_subscribes.ts @@ -1,3 +1,4 @@ +import type { dxElementWrapper } from '@js/core/renderer'; import $ from '@js/core/renderer'; import dateUtils from '@js/core/utils/date'; import { extend } from '@js/core/utils/extend'; @@ -8,6 +9,7 @@ import { formatDates, getFormatType } from './appointments/m_text_utils'; import { AGENDA_LAST_IN_DATE_APPOINTMENT_CLASS } from './m_classes'; import { utils } from './m_utils'; import { AppointmentAdapter } from './utils/appointment_adapter/appointment_adapter'; +import type { AppointmentItemViewModel } from './view_model/generate_view_model/types'; const toMs = dateUtils.dateToMilliseconds; @@ -54,10 +56,10 @@ const subscribes = { }, updateAppointmentAfterResize(options) { - const info = utils.dataAccessors.getAppointmentInfo(options.$appointment); - const { exceptionDate } = info.sourceAppointment; + const { info } = utils.dataAccessors.getAppointmentSettings(options.$appointment) as AppointmentItemViewModel; + const { startDate } = info.sourceAppointment; - this._checkRecurringAppointment(options.target, options.data, exceptionDate, () => { + this._checkRecurringAppointment(options.target, options.data, startDate, () => { this._updateAppointment(options.target, options.data, function () { this._appointments.moveAppointmentBack(); }); @@ -71,7 +73,7 @@ const subscribes = { updateAppointmentAfterDrag({ event, element, rawAppointment, isDropToTheSameCell, isDropToSelfScheduler, }) { - const info = utils.dataAccessors.getAppointmentInfo(element); + const { info } = utils.dataAccessors.getAppointmentSettings(element) as AppointmentItemViewModel; // NOTE: enrich target appointment with additional data from the source // in case of one appointment of series will change const targetedRawAppointment = extend({}, rawAppointment, this._getUpdatedData(rawAppointment)); @@ -164,10 +166,6 @@ const subscribes = { return this.getWorkSpace().needRecalculateResizableArea(); }, - getAppointmentGeometry(settings) { - return this.getLayoutManager().getRenderingStrategyInstance().getAppointmentGeometry(settings); - }, - isAllDay(appointmentData) { return this.getLayoutManager().getRenderingStrategyInstance().isAllDay(appointmentData); }, @@ -198,15 +196,15 @@ const subscribes = { }, getMaxAppointmentCountPerCellByType(isAllDay) { - return this.getRenderingStrategyInstance()._getMaxAppointmentCountPerCellByType(isAllDay); + return this.getLayoutManager().getRenderingStrategyInstance()._getMaxAppointmentCountPerCellByType(isAllDay); }, needCorrectAppointmentDates() { - return this.getRenderingStrategyInstance().needCorrectAppointmentDates(); + return this.getLayoutManager().getRenderingStrategyInstance().needCorrectAppointmentDates(); }, getRenderingStrategyDirection() { - return this.getRenderingStrategyInstance().getDirection(); + return this.getLayoutManager().getRenderingStrategyInstance().getDirection(); }, updateAppointmentEndDate(options) { @@ -225,8 +223,8 @@ const subscribes = { return updatedEndDate; }, - renderCompactAppointments(options) { - this._compactAppointmentsHelper.render(options); + renderCompactAppointments(options): dxElementWrapper { + return this._compactAppointmentsHelper.render(options); }, clearCompactAppointments() { diff --git a/packages/devextreme/js/__internal/scheduler/m_utils.ts b/packages/devextreme/js/__internal/scheduler/m_utils.ts index 65aec06ca642..6b1880fd4cb8 100644 --- a/packages/devextreme/js/__internal/scheduler/m_utils.ts +++ b/packages/devextreme/js/__internal/scheduler/m_utils.ts @@ -3,15 +3,12 @@ import $ from '@js/core/renderer'; import { getOuterHeight, setHeight, setWidth } from '@js/core/utils/size'; import { APPOINTMENT_SETTINGS_KEY } from './constants'; +import type { AppointmentViewModelPlain } from './view_model/generate_view_model/types'; export const utils = { dataAccessors: { - getAppointmentSettings: (element) => $(element).data(APPOINTMENT_SETTINGS_KEY), - - getAppointmentInfo: (element) => { - const settings: any = utils.dataAccessors.getAppointmentSettings(element); - return settings?.info; - }, + getAppointmentSettings: (element) => $(element) + .data(APPOINTMENT_SETTINGS_KEY) as unknown as AppointmentViewModelPlain | undefined, }, DOM: { getHeaderHeight: (header) => (header diff --git a/packages/devextreme/js/__internal/scheduler/types.ts b/packages/devextreme/js/__internal/scheduler/types.ts index f295f2f13317..f51a22e174aa 100644 --- a/packages/devextreme/js/__internal/scheduler/types.ts +++ b/packages/devextreme/js/__internal/scheduler/types.ts @@ -28,60 +28,12 @@ export interface AppointmentDataItem { rawAppointment: SafeAppointment; } -export interface BaseAppointmentViewModelSettings { - allDay?: boolean; - direction: string; - groupIndex: number; - sortedIndex: number; -} - -export interface AppointmentViewModelSettings extends BaseAppointmentViewModelSettings { - index: number; // current level in stack - count: number; // max level including appointments not in stack - info: { - sourceAppointment: { - startDate: Date; - endDate: Date; - }; - appointment: { - startDate: Date; - endDate: Date; - }; - }; - left: number; - top: number; - height: number; - width: number; - isCompact: boolean; - appointmentReduced: 'head' | 'body' | 'tail' | undefined; - partIndex: number; - partTotalCount: number; -} - -export interface AgendaViewModelSettings extends BaseAppointmentViewModelSettings { - agendaSettings: { - startDate: Date; - endDate: Date; - }; - height: number; - width: string; -} - -export interface AppointmentViewModel { - itemData: SafeAppointment; - needRepaint: boolean; - needRemove: boolean; - settings: (AppointmentViewModelSettings & AgendaViewModelSettings)[]; -} - export interface AppointmentGeometry { empty: boolean; left: number; top: number; width: number; height: number; - leftVirtualWidth: number; - topVirtualHeight: number; } export type GetDateForHeaderText = ( diff --git a/packages/devextreme/js/__internal/scheduler/view_model/detect_changes/get_repainted_appointments.ts b/packages/devextreme/js/__internal/scheduler/view_model/detect_changes/get_repainted_appointments.ts deleted file mode 100644 index ff219dc9ad75..000000000000 --- a/packages/devextreme/js/__internal/scheduler/view_model/detect_changes/get_repainted_appointments.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { equalByValue } from '@js/core/utils/common'; -import type { - AgendaViewModelSettings, - AppointmentViewModel, - AppointmentViewModelSettings, - SafeAppointment, -} from '@ts/scheduler/types'; - -import type { - AppointmentDataProvider, -} from '../generate_view_model/data_provider/m_appointment_data_provider'; - -type Settings = AppointmentViewModelSettings & AgendaViewModelSettings & { - columnIndex: number; - rowIndex: number; - positionByMap: number; - topVirtualCellCount: number; - leftVirtualCellCount: number; - leftVirtualWidth: number; - topVirtualHeight: number; - hMax: number; - vMax: number; - reduced?: string; -}; - -const isDataChanged = ( - data: SafeAppointment, - appointmentDataProvider: AppointmentDataProvider, -): boolean => { - const updatedData = appointmentDataProvider.getUpdatedAppointment(); - - return updatedData === data || appointmentDataProvider - .getUpdatedAppointmentKeys() - .some((item) => data[item.key] === item.value); -}; - -const isAppointmentShouldAppear = ( - currentAppointment: AppointmentViewModel, - sourceAppointment: AppointmentViewModel, -): boolean => currentAppointment.needRepaint && sourceAppointment.needRemove; - -const createSettingsToCompare = ( - currentSetting: Settings, -): Partial => { - const leftVirtualCellCount = currentSetting.leftVirtualCellCount || 0; - const topVirtualCellCount = currentSetting.topVirtualCellCount || 0; - const columnIndex = currentSetting.columnIndex + leftVirtualCellCount; - const rowIndex = currentSetting.rowIndex + topVirtualCellCount; - const hMax = currentSetting.reduced ? currentSetting.hMax : undefined; - const vMax = currentSetting.reduced ? currentSetting.vMax : undefined; - - return { - ...currentSetting, - columnIndex, - rowIndex, - positionByMap: undefined, - topVirtualCellCount: undefined, - leftVirtualCellCount: undefined, - leftVirtualWidth: undefined, - topVirtualHeight: undefined, - hMax, - vMax, - info: undefined, - }; -}; - -const isSettingChanged = ( - settings: Settings[], - sourceSetting: Settings[], -): boolean => { - if (settings.length !== sourceSetting.length) { - return true; - } - - for (let i = 0; i < settings.length; i += 1) { - const newSettings = createSettingsToCompare(settings[i]); - const oldSettings = createSettingsToCompare(sourceSetting[i]); - - if (oldSettings) { // exclude sortedIndex property for comparison in commonUtils.equalByValue - oldSettings.sortedIndex = newSettings.sortedIndex; - } - - if (!equalByValue(newSettings, oldSettings)) { - return true; - } - } - - return false; -}; - -const getAssociatedSourceAppointment = ( - currentAppointment: AppointmentViewModel, - sourceAppointments: AppointmentViewModel[], -): AppointmentViewModel | undefined => sourceAppointments - .find((item) => item.itemData === currentAppointment.itemData); - -const getDeletedAppointments = ( - currentAppointments: AppointmentViewModel[], - sourceAppointments: AppointmentViewModel[], -): AppointmentViewModel[] => { - const result: AppointmentViewModel[] = []; - - sourceAppointments.forEach((sourceAppointment) => { - const currentAppointment = getAssociatedSourceAppointment( - sourceAppointment, - currentAppointments, - ); - if (!currentAppointment) { - sourceAppointment.needRemove = true; - result.push(sourceAppointment); - } - }); - - return result; -}; - -export const getRepaintedAppointments = ( - currentAppointments: AppointmentViewModel[], - sourceAppointments: AppointmentViewModel[], - { - appointmentRenderingStrategyName, - appointmentDataProvider, - }: { - appointmentRenderingStrategyName: string; - appointmentDataProvider: AppointmentDataProvider; - }, -): AppointmentViewModel[] => { - if (sourceAppointments.length === 0 || appointmentRenderingStrategyName === 'agenda') { - return currentAppointments; - } - - currentAppointments.forEach((appointment) => { - const sourceAppointment = getAssociatedSourceAppointment(appointment, sourceAppointments); - - if (sourceAppointment) { - const isDataChangedBool = isDataChanged(appointment.itemData, appointmentDataProvider); - const isSettingChangedBool = isSettingChanged( - appointment.settings as unknown as Settings[], - sourceAppointment.settings as unknown as Settings[], - ); - const isAppointmentShouldAppearBool = isAppointmentShouldAppear( - appointment, - sourceAppointment, - ); - - appointment.needRepaint = isDataChangedBool - || isSettingChangedBool - || isAppointmentShouldAppearBool; - } - }); - - return currentAppointments - .concat(getDeletedAppointments(currentAppointments, sourceAppointments)); -}; diff --git a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/add_collector.ts b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/add_collector.ts new file mode 100644 index 000000000000..aec62e4488c1 --- /dev/null +++ b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/add_collector.ts @@ -0,0 +1,99 @@ +import { isDefined } from '@js/core/utils/type'; +import type { SafeAppointment } from '@ts/scheduler/types'; + +import { plainViewModel } from './plain_view_model'; +import type { + AppointmentCollectorViewModel, + AppointmentItemViewModel, + AppointmentViewModelInternal, + AppointmentViewModelPlain, + AppointmentViewModelSettingsInternal, +} from './types'; + +const cropSettingsProps = ( + setting: AppointmentViewModelSettingsInternal & { + itemData: SafeAppointment; + }, +): AppointmentItemViewModel => ({ + itemData: setting.itemData, + allDay: Boolean(setting.allDay), + direction: setting.direction, + groupIndex: setting.groupIndex, + sortedIndex: setting.sortedIndex, + skipResizing: setting.skipResizing, + level: setting.index, + maxLevel: setting.count, + info: { + sourceAppointment: setting.info.sourceAppointment, + appointment: setting.info.appointment, + }, + empty: setting.geometry.empty, + left: setting.geometry.left, + top: setting.geometry.top, + height: setting.geometry.height, + width: setting.geometry.width, + isCompact: setting.isCompact, + reduced: setting.appointmentReduced, + partIndex: setting.partIndex, + partTotalCount: setting.partTotalCount, + rowIndex: setting.positionByMap.rowIndex, + columnIndex: setting.positionByMap.columnIndex, +}); + +const processVirtualAppointment = ( + virtualAppointments: Record, + appointmentSetting: AppointmentViewModelSettingsInternal & { + itemData: SafeAppointment; + }, +): void => { + if (!appointmentSetting.virtual) { + return; + } + + const virtualAppointment = appointmentSetting.virtual; + const virtualGroupIndex = virtualAppointment.index; + + if (!isDefined(virtualAppointments[virtualGroupIndex])) { + virtualAppointments[virtualGroupIndex] = { + itemData: appointmentSetting.itemData, + allDay: Boolean(virtualAppointment.isAllDay), + groupIndex: appointmentSetting.groupIndex, + sortedIndex: appointmentSetting.sortedIndex, + top: virtualAppointment.top, + left: virtualAppointment.left, + items: [], + }; + } + + virtualAppointments[virtualGroupIndex].items.push(cropSettingsProps(appointmentSetting)); +}; + +export const addCollector = ( + viewModel: AppointmentViewModelInternal[], +): AppointmentViewModelPlain[] => { + const settings = plainViewModel(viewModel); + const result: AppointmentViewModelPlain[] = []; + const virtualAppointments: Record = {}; + + settings.forEach((setting) => { + switch (true) { + case Boolean(setting.virtual): + processVirtualAppointment(virtualAppointments, setting); + break; + default: + result.push(cropSettingsProps(setting)); + } + }); + + const combined = [ + ...result, + ...Object.values(virtualAppointments), + ]; + + return combined + .sort((a, b) => a.sortedIndex - b.sortedIndex) + .map((item, sortedIndex) => ({ + ...item, + sortedIndex, + })); +}; diff --git a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/m_view_model_generator.ts b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/m_view_model_generator.ts index b3cb7703a388..6d7ac97a5a94 100644 --- a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/m_view_model_generator.ts +++ b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/m_view_model_generator.ts @@ -1,7 +1,8 @@ import { dateUtilsTs } from '@ts/core/utils/date'; -import { getAppointmentKey } from '@ts/scheduler/r1/utils/index'; -import type { AppointmentViewModel, RenderStrategyName, SafeAppointment } from '@ts/scheduler/types'; +import type { RenderStrategyName, SafeAppointment } from '@ts/scheduler/types'; +import { addCollector } from './add_collector'; +import { plainViewModel } from './plain_view_model'; import AgendaAppointmentsStrategy from './rendering_strategies/m_strategy_agenda'; import type BaseAppointmentsStrategy from './rendering_strategies/m_strategy_base'; import HorizontalAppointmentsStrategy from './rendering_strategies/m_strategy_horizontal'; @@ -9,6 +10,7 @@ import HorizontalMonthAppointmentsStrategy from './rendering_strategies/m_strate import HorizontalMonthLineAppointmentsStrategy from './rendering_strategies/m_strategy_horizontal_month_line'; import VerticalAppointmentsStrategy from './rendering_strategies/m_strategy_vertical'; import WeekAppointmentRenderingStrategy from './rendering_strategies/m_strategy_week'; +import type { AppointmentViewModelInternal } from './types'; const RENDERING_STRATEGIES: Record = { horizontal: HorizontalAppointmentsStrategy, @@ -43,14 +45,24 @@ export class AppointmentViewModelGenerator { const positionMap = renderingStrategy.createTaskPositionMap(appointments); // appointments are mutated inside! const shiftedViewModel = this.postProcess(appointments, positionMap); const viewModel = this.unshiftViewModelAppointmentsByViewOffset(shiftedViewModel, viewOffset); + viewModel.forEach((item) => { + item.settings.forEach((settings) => { + settings.geometry = options.appointmentRenderingStrategyName === 'agenda' + ? undefined + : renderingStrategy.getAppointmentGeometry(settings); + }); + }); + const viewModelPlain = options.appointmentRenderingStrategyName === 'agenda' + ? plainViewModel(viewModel) + : addCollector(viewModel); return { positionMap, - viewModel, + viewModel: viewModelPlain, }; } - postProcess(filteredItems: SafeAppointment[], positionMap): AppointmentViewModel[] { + postProcess(filteredItems: SafeAppointment[], positionMap): AppointmentViewModelInternal[] { const renderingStrategy = this.getRenderingStrategy(); return filteredItems.map((data, index) => { @@ -67,7 +79,7 @@ export class AppointmentViewModelGenerator { : 'horizontal'; }); - const item: AppointmentViewModel = { + const item: AppointmentViewModelInternal = { itemData: data, settings: appointmentSettings, needRepaint: true, @@ -78,138 +90,24 @@ export class AppointmentViewModelGenerator { }); } - makeRenovatedViewModels(viewModel, supportAllDayRow, isVerticalGrouping) { - const strategy = this.getRenderingStrategy(); - const regularViewModels: any = []; - const allDayViewModels: any = []; - const compactOptions: any = []; - const isAllDayPanel = supportAllDayRow && !isVerticalGrouping; - - viewModel.forEach(({ itemData, settings }) => { - settings.forEach((options) => { - const item = this.prepareViewModel(options, strategy, itemData); - if (options.isCompact) { - compactOptions.push({ - compactViewModel: options.virtual, - appointmentViewModel: item, - }); - } else if (options.allDay && isAllDayPanel) { - allDayViewModels.push(item); - } else { - regularViewModels.push(item); - } - }); - }); - - const compactViewModels = this.prepareCompactViewModels(compactOptions, supportAllDayRow); - - const result = { - allDay: allDayViewModels, - regular: regularViewModels, - ...compactViewModels, - }; - - return result; - } - - prepareViewModel(options, strategy, itemData) { - const geometry = strategy.getAppointmentGeometry(options); - - const viewModel = { - key: getAppointmentKey(geometry), - appointment: itemData, - geometry: { - ...geometry, - // TODO move to the rendering strategies - leftVirtualWidth: options.leftVirtualWidth, - topVirtualHeight: options.topVirtualHeight, - }, - info: { - ...options.info, - allDay: options.allDay, - direction: options.direction, - appointmentReduced: options.appointmentReduced, - groupIndex: options.groupIndex, - }, - }; - - return viewModel; - } - - getCompactViewModelFrame(compactViewModel) { - return { - isAllDay: !!compactViewModel.isAllDay, - isCompact: compactViewModel.isCompact, - groupIndex: compactViewModel.groupIndex, - geometry: { - left: compactViewModel.left, - top: compactViewModel.top, - width: compactViewModel.width, - height: compactViewModel.height, - }, - items: { - colors: [], - data: [], - settings: [], - }, - }; - } - - prepareCompactViewModels(compactOptions, supportAllDayRow) { - const regularCompact = {}; - const allDayCompact = {}; - - compactOptions.forEach(({ compactViewModel, appointmentViewModel }) => { - const { - index, - isAllDay, - } = compactViewModel; - const viewModel = isAllDay && supportAllDayRow - ? allDayCompact - : regularCompact; - - if (!viewModel[index]) { - viewModel[index] = this.getCompactViewModelFrame(compactViewModel); - } - - const { - settings, - data, - colors, - } = viewModel[index].items; - - settings.push(appointmentViewModel); - data.push(appointmentViewModel.appointment); - colors.push(appointmentViewModel.info.resourceColor); - }); - - const toArray = (items) => Object - .keys(items) - .map((key) => ({ key, ...items[key] })); - - const allDayViewModels = toArray(allDayCompact); - const regularViewModels = toArray(regularCompact); - - return { - allDayCompact: allDayViewModels, - regularCompact: regularViewModels, - }; - } - // NOTE: Unfortunately, we cannot implement immutable behavior here // because in this case it will break the refs (keys) of dataSource's appointments, // and it will break appointment updates :( private unshiftViewModelAppointmentsByViewOffset( - viewModel: AppointmentViewModel[], + viewModel: AppointmentViewModelInternal[], viewOffset: number, - ): AppointmentViewModel[] { + ): AppointmentViewModelInternal[] { const processedAppointments = new Set(); // eslint-disable-next-line no-restricted-syntax for (const model of viewModel) { // eslint-disable-next-line no-restricted-syntax for (const setting of model.settings ?? []) { - const appointment = (setting as any)?.info?.appointment; + const appointment = setting?.info?.appointment as { + startDate: Date; + endDate: Date; + normalizedEndDate: Date; + } | undefined; if (appointment && !processedAppointments.has(appointment)) { appointment.startDate = dateUtilsTs diff --git a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/plain_view_model.ts b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/plain_view_model.ts new file mode 100644 index 000000000000..123f50b2ba75 --- /dev/null +++ b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/plain_view_model.ts @@ -0,0 +1,28 @@ +import type { SafeAppointment } from '@ts/scheduler/types'; + +import type { + AgendaViewModelSettingsInternal, + AppointmentViewModelInternal, + AppointmentViewModelSettingsInternal, +} from './types'; + +export const plainViewModel = ( + viewModel: AppointmentViewModelInternal[], +): (AppointmentViewModelSettingsInternal & AgendaViewModelSettingsInternal & { + itemData: SafeAppointment; +})[] => { + const result: (AppointmentViewModelSettingsInternal & AgendaViewModelSettingsInternal & { + itemData: SafeAppointment; + })[] = []; + + viewModel.forEach((appointment) => { + appointment.settings.forEach((setting) => { + result.push({ + ...setting, + itemData: appointment.itemData, + }); + }); + }); + + return result; +}; diff --git a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/types.ts b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/types.ts new file mode 100644 index 000000000000..9762a37b3b59 --- /dev/null +++ b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/types.ts @@ -0,0 +1,108 @@ +import type { AppointmentGeometry, SafeAppointment } from '@ts/scheduler/types'; + +interface SimpleAppointment { + allDay?: boolean; + startDate: Date; + endDate: Date; +} + +export interface BaseViewModelSettingsInternal { + allDay?: boolean; + direction: string; + groupIndex: number; + sortedIndex: number; + // added by getAppointmentGeometry + skipResizing?: true; + geometry: AppointmentGeometry; + virtual?: { + left: number; + top: number; + width: number; + height: number; + index: string; + isAllDay?: boolean; + groupIndex: number; + isCompact: true; + }; +} + +export interface AppointmentViewModelSettingsInternal extends BaseViewModelSettingsInternal { + index: number; + count: number; + info: { + sourceAppointment: SimpleAppointment; + appointment: SimpleAppointment; + }; + positionByMap: { + rowIndex: number; + columnIndex: number; + }; + left: number; + top: number; + height: number; + width: number; + isCompact: boolean; + appointmentReduced: 'head' | 'body' | 'tail' | undefined; + partIndex: number; + partTotalCount: number; +} + +export interface AgendaViewModelSettingsInternal extends BaseViewModelSettingsInternal { + agendaSettings: SimpleAppointment; + height: number; + width: string; +} + +export interface AppointmentViewModelInternal { + itemData: SafeAppointment; // it will save in DOM by key: dxItemData + needRepaint: boolean; + needRemove: boolean; + settings: (AppointmentViewModelSettingsInternal & AgendaViewModelSettingsInternal)[]; +} + +export interface BaseAppointmentViewModel { + itemData: SafeAppointment; + allDay: boolean; + groupIndex: number; + sortedIndex: number; +} + +export interface AppointmentCollectorViewModel extends BaseAppointmentViewModel { + top: number; + left: number; + items: AppointmentItemViewModel[]; +} + +export interface AppointmentAgendaViewModel extends BaseAppointmentViewModel { + direction: string; + agendaSettings: SimpleAppointment; + height: number; + width: string; +} + +export interface AppointmentItemViewModel extends BaseAppointmentViewModel { + direction: string; + skipResizing?: true; + level: number; + maxLevel: number; + info: { + sourceAppointment: SimpleAppointment; + appointment: SimpleAppointment; + }; + empty: boolean; + left: number; + top: number; + height: number; + width: number; + isCompact: boolean; + reduced: 'head' | 'body' | 'tail' | undefined; + partIndex: number; + partTotalCount: number; + rowIndex: number; + columnIndex: number; +} + +export type AppointmentViewModelPlain = + | AppointmentAgendaViewModel + | AppointmentItemViewModel + | AppointmentCollectorViewModel; diff --git a/packages/devextreme/js/__internal/scheduler/view_model/m_appointments_layout_manager.ts b/packages/devextreme/js/__internal/scheduler/view_model/m_appointments_layout_manager.ts index 6369602af747..c788d4f6a312 100644 --- a/packages/devextreme/js/__internal/scheduler/view_model/m_appointments_layout_manager.ts +++ b/packages/devextreme/js/__internal/scheduler/view_model/m_appointments_layout_manager.ts @@ -5,16 +5,15 @@ import type Scheduler from '../m_scheduler'; import { getCellDuration } from '../r1/utils/index'; import type { AppointmentDataItem, - AppointmentViewModel, RenderStrategyName, SafeAppointment, ViewType, } from '../types'; import type { ResourceManager } from '../utils/resource_manager/resource_manager'; import { getAllDayHeight, getCellHeight, getCellWidth } from '../workspaces/helpers/m_position_helper'; -import { getRepaintedAppointments } from './detect_changes/get_repainted_appointments'; import { createAppointmentFilter } from './filtering/create_appointment_filter'; import { AppointmentViewModelGenerator } from './generate_view_model/m_view_model_generator'; +import type { AppointmentViewModelPlain } from './generate_view_model/types'; import { getAppointmentDataItems } from './preparation/get_appointment_data_items'; const toMs = dateUtils.dateToMilliseconds; @@ -153,7 +152,7 @@ class AppointmentLayoutManager { }; } - public createAppointmentsMap(): AppointmentViewModel[] { + public createAppointmentsMap(): AppointmentViewModelPlain[] { const renderingStrategyOptions = this._getRenderingStrategyOptions(); const { @@ -161,21 +160,11 @@ class AppointmentLayoutManager { positionMap, } = this.appointmentViewModel.generate(this.filteredItems, renderingStrategyOptions) as any; - this._positionMap = positionMap; // TODO get rid of this after remove old render + this._positionMap = positionMap; return viewModel; } - public getRepaintedAppointments( - currentAppointments: AppointmentViewModel[], - sourceAppointments: AppointmentViewModel[], - ): AppointmentViewModel[] { - return getRepaintedAppointments(currentAppointments, sourceAppointments, { - appointmentRenderingStrategyName: this.appointmentRenderingStrategyName, - appointmentDataProvider: this.instance.appointmentDataProvider, - }); - } - public getRenderingStrategyInstance() { const renderingStrategy = this.appointmentViewModel.getRenderingStrategy(); diff --git a/packages/devextreme/js/__internal/scheduler/workspaces/m_work_space.ts b/packages/devextreme/js/__internal/scheduler/workspaces/m_work_space.ts index 2147260659c7..a72a12c552c2 100644 --- a/packages/devextreme/js/__internal/scheduler/workspaces/m_work_space.ts +++ b/packages/devextreme/js/__internal/scheduler/workspaces/m_work_space.ts @@ -3235,16 +3235,15 @@ const createDragBehaviorConfig = ( const createDragAppointment = (itemData, settings, appointments) => { const appointmentIndex = appointments.option('items').length; - - settings.isCompact = false; - settings.virtual = false; - - const items = appointments._renderItem(appointmentIndex, { + const $item = appointments._renderItem(appointmentIndex, { itemData, - settings: [settings], + ...settings, + isCompact: false, + virtual: false, + sortedIndex: -1, }); - return items[0]; + return $item; }; const onDragStart = (e) => { diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.filtering.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.filtering.tests.js index 8e09651f81a2..253d5b8dcfd5 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.filtering.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.filtering.tests.js @@ -279,8 +279,8 @@ module('Integration: Appointment filtering', { $appointments = scheduler.instance.$element().find('.' + APPOINTMENT_CLASS); assert.equal($appointments.length, 3, 'There are three appointments'); - assert.deepEqual(dataUtils.data($appointments.get(0), 'dxItemData'), tasks[0], 'Appointment data is OK'); - assert.deepEqual(dataUtils.data($appointments.get(1), 'dxItemData'), tasks[1], 'Appointment data is OK'); + assert.deepEqual(dataUtils.data($appointments.get(0), 'dxItemData'), tasks[1], 'Appointment data is OK'); + assert.deepEqual(dataUtils.data($appointments.get(1), 'dxItemData'), tasks[0], 'Appointment data is OK'); assert.deepEqual(dataUtils.data($appointments.get(2), 'dxItemData'), tasks[2], 'Appointment data is OK'); }); @@ -357,8 +357,8 @@ module('Integration: Appointment filtering', { assert.equal($appointments.length, 4, 'There are four appointment'); assert.deepEqual(dataUtils.data($appointments.get(0), 'dxItemData'), tasks[1], 'The first appointment data is OK'); - assert.deepEqual(dataUtils.data($appointments.get(1), 'dxItemData'), tasks[1], 'The second appointment dat is OK'); - assert.deepEqual(dataUtils.data($appointments.get(2), 'dxItemData'), tasks[3], 'The first appointment data is OK'); + assert.deepEqual(dataUtils.data($appointments.get(2), 'dxItemData'), tasks[1], 'The second appointment dat is OK'); + assert.deepEqual(dataUtils.data($appointments.get(1), 'dxItemData'), tasks[3], 'The first appointment data is OK'); assert.deepEqual(dataUtils.data($appointments.get(3), 'dxItemData'), tasks[3], 'The second appointment dat is OK'); }); @@ -401,8 +401,8 @@ module('Integration: Appointment filtering', { assert.equal($appointments.length, 4, 'There are four appointment'); assert.deepEqual(dataUtils.data($appointments.get(0), 'dxItemData'), tasks[1], 'The first appointment data is OK'); - assert.deepEqual(dataUtils.data($appointments.get(1), 'dxItemData'), tasks[1], 'The second appointment dat is OK'); - assert.deepEqual(dataUtils.data($appointments.get(2), 'dxItemData'), tasks[3], 'The first appointment data is OK'); + assert.deepEqual(dataUtils.data($appointments.get(2), 'dxItemData'), tasks[1], 'The second appointment dat is OK'); + assert.deepEqual(dataUtils.data($appointments.get(1), 'dxItemData'), tasks[3], 'The first appointment data is OK'); assert.deepEqual(dataUtils.data($appointments.get(3), 'dxItemData'), tasks[3], 'The second appointment dat is OK'); }); @@ -445,8 +445,8 @@ module('Integration: Appointment filtering', { assert.equal($appointments.length, 4, 'There are four appointment'); assert.deepEqual(dataUtils.data($appointments.get(0), 'dxItemData'), tasks[1], 'The first appointment data is OK'); - assert.deepEqual(dataUtils.data($appointments.get(1), 'dxItemData'), tasks[1], 'The second appointment data is OK'); - assert.deepEqual(dataUtils.data($appointments.get(2), 'dxItemData'), tasks[3], 'The first appointment data is OK'); + assert.deepEqual(dataUtils.data($appointments.get(2), 'dxItemData'), tasks[1], 'The second appointment data is OK'); + assert.deepEqual(dataUtils.data($appointments.get(1), 'dxItemData'), tasks[3], 'The first appointment data is OK'); assert.deepEqual(dataUtils.data($appointments.get(3), 'dxItemData'), tasks[3], 'The second appointment data is OK'); }); diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.monthView.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.monthView.tests.js index c7b7a673e8e3..03ddfdb0d1b8 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.monthView.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.monthView.tests.js @@ -492,9 +492,43 @@ module('Integration: Appointments in Month view', { }); const appointments = scheduler.instance._getAppointmentsToRepaint(); - assert.strictEqual(appointments[0].settings[1].index, 0, 'Long term appointment tail has right index'); - assert.strictEqual(appointments[1].settings[0].index, 1, 'Appointment next to long term appointment head has right index'); - assert.strictEqual(appointments[2].settings[0].index, 1, 'Appointment next to long term appointment tail has right index'); + const parts = appointments.map((item) => ({ + level: item.level, + maxLevel: item.maxLevel, + partIndex: item.partIndex, + partTotalCount: item.partTotalCount, + reduced: item.reduced, + })); + assert.deepEqual(parts, [ + { + level: 0, + maxLevel: 2, + partIndex: 0, + partTotalCount: 2, + reduced: 'head', + }, + { + level: 1, + maxLevel: 2, + partIndex: undefined, + partTotalCount: undefined, + reduced: null, + }, + { + level: 0, + maxLevel: 2, + partIndex: 1, + partTotalCount: 2, + reduced: 'tail', + }, + { + level: 1, + maxLevel: 2, + partIndex: undefined, + partTotalCount: undefined, + reduced: null, + } + ], 'Parts should be correct'); }); test('Appointment should be rendered correctly after changing view (T593699)', async function(assert) { @@ -761,11 +795,11 @@ module('Integration: Appointments in Month view', { expected: [ { color: '#ff0000', - indices: [0, 1, 4] + indices: [0, 2, 3] }, { color: '#0000ff', - indices: [2, 3, 5] + indices: [1, 4, 5] } ] }, { @@ -773,11 +807,11 @@ module('Integration: Appointments in Month view', { expected: [ { color: '#ff0000', - indices: [0, 1, 2] + indices: [0, 2, 3] }, { color: '#0000ff', - indices: [3, 4, 5] + indices: [1, 4, 5] } ] } diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.templates.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.templates.tests.js index 11d738f2139b..0a205d858cfb 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.templates.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.templates.tests.js @@ -70,7 +70,7 @@ QUnit.module('Integration: Appointment templates', { }; }; - const createTestForRecurrenceData = (assert, scheduler) => { + const createTestForRecurrenceData = (assert, scheduler, isInsideTooltip) => { eventCallCount = 0; return (model, index, container) => { @@ -85,7 +85,8 @@ QUnit.module('Integration: Appointment templates', { assert.equal(targetedAppointmentData[startDateExpr].getDate(), expectedStartDate, `start date of targetedAppointmentData should be equal ${expectedStartDate}`); assert.equal(targetedAppointmentData[endDateExpr].getDate(), expectedEndDate, `end date of targetedAppointmentData should be equal ${expectedEndDate}`); - assert.equal(index, 0, 'index argument should be 0'); + const expectedIndex = isInsideTooltip ? 0 : eventCallCount; + assert.equal(index, expectedIndex, `index argument should be ${expectedIndex}`); assert.equal(appointmentData[textExpr], targetedAppointmentData[textExpr], 'appointmentData.text and targetedAppointmentData.text arguments should be equal'); eventCallCount++; @@ -347,7 +348,7 @@ QUnit.module('Integration: Appointment templates', { scheduler.option( 'appointmentTooltipTemplate', - testCase.appointmentTooltip(assert, scheduler) + testCase.appointmentTooltip(assert, scheduler, true) ); const clock = sinon.useFakeTimers(); diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.timeLines.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.timeLines.tests.js index 7de25425e571..d100dcf8d02b 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.timeLines.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.timeLines.tests.js @@ -589,9 +589,9 @@ module('Integration: Appointments in Timeline views', { }); assert.strictEqual(scheduler.appointments.getAppointmentCount(), 4, 'Appointments are rendered'); - assert.strictEqual($(scheduler.appointments.getAppointment(0)).position().left, $(scheduler.appointments.getAppointment(3)).position().left, 'Appointments have same left coordinate'); - assert.strictEqual($(scheduler.appointments.getAppointment(0)).innerWidth(), $(scheduler.appointments.getAppointment(3)).innerWidth(), 'Appointments with equal coords have same width'); - assert.strictEqual($(scheduler.appointments.getAppointment(1)).innerWidth(), $(scheduler.appointments.getAppointment(3)).innerWidth(), 'Appointments with defferent coords have same width'); + assert.strictEqual($(scheduler.appointments.getAppointment(2)).position().left, $(scheduler.appointments.getAppointment(3)).position().left, 'Appointments have same left coordinate'); + assert.strictEqual($(scheduler.appointments.getAppointment(2)).innerWidth(), $(scheduler.appointments.getAppointment(3)).innerWidth(), 'Appointments with equal coords have same width'); + assert.strictEqual($(scheduler.appointments.getAppointment(3)).innerWidth(), $(scheduler.appointments.getAppointment(3)).innerWidth(), 'Appointments with defferent coords have same width'); }); }); }); diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.week.based.views.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.week.based.views.tests.js index e2445f2af64e..7c25bf02d26c 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.week.based.views.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.week.based.views.tests.js @@ -417,8 +417,8 @@ module('Integration: Appointment Day, Week views', { await waitForAsync(() => getAppointmentColor(tasks.eq(0)) === '#cb2824'); assert.equal(getAppointmentColor(tasks.eq(0)), '#cb2824', 'Color is OK'); assert.equal(getAppointmentColor(tasks.eq(1)), '#cb7d7b', 'Color is OK'); - assert.equal(getAppointmentColor(tasks.eq(2)), '#cb2824', 'Color is OK'); - assert.equal(getAppointmentColor(tasks.eq(3)), '#cb7d7b', 'Color is OK'); + assert.equal(getAppointmentColor(tasks.eq(2)), '#cb7d7b', 'Color is OK'); + assert.equal(getAppointmentColor(tasks.eq(3)), '#cb2824', 'Color is OK'); assert.equal(getAppointmentColor(tasks.eq(4)), '#cb7d7b', 'Color is OK'); }); diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointmentPopup.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointmentPopup.tests.js index d45420c5dd34..bf39e042c724 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointmentPopup.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointmentPopup.tests.js @@ -1649,7 +1649,7 @@ QUnit.module('Appointment Popup', moduleOptions, () => { if(args.name === 'formData') formDataChangedCount++; }); - scheduler.appointments.dblclick(0); + scheduler.appointments.dblclick(1); formData = scheduler.appointmentForm.getFormInstance().option('formData'); assert.deepEqual(formData.startDate, appointments[0].startDate, 'Second opening appointment form has right startDate'); diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.horizontalStrategy.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.horizontalStrategy.tests.js index 69255405a88a..6fb0e3aba822 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.horizontalStrategy.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.horizontalStrategy.tests.js @@ -76,7 +76,8 @@ module('Horizontal Month Strategy', moduleOptions, () => { endDate: new Date(2015, 2, 6, 6), allDay: true }, - settings: [{ top: 0, left: 0, count: 1, index: 0, width: 40, allDay: true }] + sortedIndex: -1, + top: 0, left: 0, count: 1, index: 0, width: 40, allDay: true }]; const instance = createInstance({ @@ -95,7 +96,8 @@ module('Horizontal Month Strategy', moduleOptions, () => { startDate: new Date(2015, 2, 1), endDate: new Date(2015, 2, 8) }, - settings: [{ top: 0, left: 0, max: 135 }] + sortedIndex: -1, + top: 0, left: 0, max: 135 }]; const instance = createInstance({ @@ -115,7 +117,8 @@ module('Horizontal Month Strategy', moduleOptions, () => { startDate: new Date(2015, 1, 9, 11), endDate: new Date(2015, 1, 9, 12) }, - settings: [{ top: 0, left: 0, empty: true }] + sortedIndex: -1, + top: 0, left: 0, empty: true }]; const instance = createInstance({ @@ -134,7 +137,8 @@ module('Horizontal Month Strategy', moduleOptions, () => { startDate: new Date(2015, 1, 9, 8), endDate: new Date(2015, 1, 9, 12) }, - settings: [{ top: 0, left: 0, height: 50, width: 39.5, empty: true }] + sortedIndex: -1, + top: 0, left: 0, height: 50, width: 39.5, empty: true }]; const instance = createInstance({ @@ -153,7 +157,8 @@ module('Horizontal Month Strategy', moduleOptions, () => { startDate: new Date(2015, 1, 9, 8), endDate: new Date(2015, 1, 9, 12) }, - settings: [{ top: 0, left: 0, height: 18.5, width: 10, empty: true }] + sortedIndex: -1, + top: 0, left: 0, height: 18.5, width: 10, empty: true }]; const instance = createInstance({ @@ -175,7 +180,8 @@ module('Horizontal Strategy', moduleOptions, () => { endDate: new Date(2015, 1, 9, 2), allDay: true }, - settings: [{ top: 0, left: 0, count: 1, index: 0, width: 40, allDay: true }] + sortedIndex: -1, + top: 0, left: 0, count: 1, index: 0, width: 40, allDay: true }]; const instance = createInstance({ @@ -196,7 +202,8 @@ module('Horizontal Strategy', moduleOptions, () => { endDate: new Date(2015, 1, 9, 2), allDay: true }, - settings: [{ width: 2 }] + sortedIndex: -1, + width: 2 }]; const instance = createInstance({ diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.tests.js index 62a3c4aec731..94f5f45b4db0 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.tests.js @@ -158,7 +158,7 @@ QUnit.module('Appointments', moduleOptions, () => { items: [ { itemData: data, - settings: [{}], + sortedIndex: -1, }, ], }, testConfig); @@ -177,7 +177,7 @@ QUnit.module('Appointments', moduleOptions, () => { items: [ { itemData: data, - settings: [], + sortedIndex: -1, } ], }, testConfig); @@ -193,14 +193,14 @@ QUnit.module('Appointments', moduleOptions, () => { text: 'Appointment 1', startDate: new Date() }, - settings: [{}] + sortedIndex: -1, }, { itemData: { text: 'Appointment 2', startDate: new Date() }, - settings: [{}] + sortedIndex: -1, } ], }, testConfig); @@ -218,7 +218,7 @@ QUnit.module('Appointments', moduleOptions, () => { startDate: new Date(), recurrenceRule: 'FREQ=YEARLY;COUNT=1' }, - settings: [{}] + sortedIndex: -1, } ], }, testConfig); @@ -236,11 +236,8 @@ QUnit.module('Appointments', moduleOptions, () => { startDate: new Date(2015, 1, 9, 8), endDate: new Date(2015, 1, 9, 9) }, - settings: [ - { - height: 40 - } - ] + sortedIndex: -1, + height: 40, } ], }, testConfig); @@ -261,9 +258,8 @@ QUnit.module('Appointments', moduleOptions, () => { startDate: new Date(2015, 1, 9, 8), endDate: new Date(2015, 1, 9, 9) }, - settings: [{ height: 30 }], - needRepaint: true, - needRemove: false, + sortedIndex: -1, + height: 30, } ]); @@ -282,13 +278,12 @@ QUnit.module('Appointments', moduleOptions, () => { const instance = createInstance({ items: [ { - itemData: - { + itemData: { text: 'Appointment 1', startDate: new Date(2015, 1, 9, 8), endDate: new Date(2015, 1, 9, 9) }, - settings: [] + sortedIndex: -1, } ], allowResize: false, @@ -299,28 +294,6 @@ QUnit.module('Appointments', moduleOptions, () => { assert.notOk($appointment.data('dxResizable'), 'Appointment is not dxResizable'); }); - QUnit.test('All-day appointment should not be resizable if current view is \'day\'', function(assert) { - const instance = createInstance({ - items: [ - { - itemData: - { - text: 'Appointment 1', - startDate: new Date(2015, 1, 9, 8), - endDate: new Date(2015, 1, 9, 9), - allDay: true - }, - settings: [] - } - ], - allowAllDayResize: false, - }, testConfig); - - const $appointment = instance.$element().find('.dx-scheduler-appointment').first(); - - assert.notOk($appointment.hasClass('dx-resizable'), 'Appointment is not resizable'); - }); - QUnit.test('moveAppointmentBack should affect on appointment only first time', async function(assert) { const item = { itemData: { @@ -328,10 +301,9 @@ QUnit.module('Appointments', moduleOptions, () => { startDate: new Date(2015, 1, 9, 8), endDate: new Date(2015, 1, 9, 9) }, - settings: [{ - height: 40, - width: 40 - }] + sortedIndex: -1, + height: 40, + width: 40, }; const instance = createInstance({ @@ -366,13 +338,11 @@ QUnit.module('Appointments', moduleOptions, () => { startDate: new Date(2015, 1, 9, 8), endDate: new Date(2015, 1, 9, 9) }, - settings: [{ - sortedIndex: 0, - height: 40, - width: 40, - left: 0, - top: 100 - }] + sortedIndex: 0, + height: 40, + width: 40, + left: 0, + top: 100, }; const instance = createInstance({ @@ -400,13 +370,11 @@ QUnit.module('Appointments', moduleOptions, () => { startDate: new Date(2015, 1, 9, 8), endDate: new Date(2015, 1, 9, 9) }, - settings: [{ - sortedIndex: 0, - height: 40, - width: 40, - left: 0, - top: 100 - }] + sortedIndex: 0, + height: 40, + width: 40, + left: 0, + top: 100, }; const instance = createInstance({ @@ -436,9 +404,8 @@ QUnit.module('Appointments', moduleOptions, () => { endDate: new Date(2015, 1, 9, 9), allDay: true }, - settings: [{ allDay: true }], - needRepaint: true, - needRemove: false, + sortedIndex: -1, + allDay: true, }; const instance = createInstance({}, testConfig); @@ -459,22 +426,18 @@ QUnit.module('Appointments', moduleOptions, () => { }); QUnit.test('Appointment should be rendered a many times if coordinates array contains a few items', async function(assert) { - const item = { - itemData: { - text: 'Appointment 1', - startDate: new Date(2015, 1, 9, 8), - endDate: new Date(2015, 1, 9, 10) - }, - settings: [ - { top: 0, left: 0, height: 10, sortedIndex: 0, width: 10, count: 1, index: 0 }, - { top: 10, left: 10, height: 10, sortedIndex: 0, width: 10, count: 1, index: 0 }, - { top: 20, left: 20, height: 10, sortedIndex: 0, width: 10, count: 1, index: 0 } - ] + const itemData = { + text: 'Appointment 1', + startDate: new Date(2015, 1, 9, 8), + endDate: new Date(2015, 1, 9, 10) }; + const items = [ + { itemData, top: 0, left: 0, height: 10, sortedIndex: 0, width: 10, maxLevel: 1, level: 0 }, + { itemData, top: 10, left: 10, height: 10, sortedIndex: 1, width: 10, maxLevel: 1, level: 0 }, + { itemData, top: 20, left: 20, height: 10, sortedIndex: 2, width: 10, maxLevel: 1, level: 0 }, + ]; - const instance = createInstance({ - items: [item], - }, { + const instance = createInstance({ items }, { ...testConfig, coordinates: [{ top: 0, left: 0 }, { top: 10, left: 10 }, { top: 20, left: 20 }], }); @@ -485,7 +448,7 @@ QUnit.module('Appointments', moduleOptions, () => { assert.deepEqual(translator.locate($appointment.eq(0)), { top: 0, left: 0 }, 'appointment is rendered in right place'); assert.deepEqual(translator.locate($appointment.eq(1)), { top: 10, left: 10 }, 'appointment is rendered in right place'); assert.deepEqual(translator.locate($appointment.eq(2)), { top: 20, left: 20 }, 'appointment is rendered in right place'); - assert.deepEqual(instance.option('items'), [item], 'items are not affected'); + assert.deepEqual(instance.option('items'), items, 'items are not affected'); }); QUnit.test('Delta time for resizable appointment should be 0 if appointment isn\'t resized', async function(assert) { @@ -524,7 +487,7 @@ QUnit.module('Appointments', moduleOptions, () => { startDate: new Date(2015, 1, 9, 8), endDate: new Date(2015, 1, 9, 9) }, - settings: [{}] + sortedIndex: -1, }; const instance = createInstance({ @@ -614,7 +577,7 @@ QUnit.module('Appointments Actions', moduleOptions, () => { startDate: new Date(2015, 1, 9, 8), endDate: new Date(2015, 1, 9, 9) }, - settings: [{}] + sortedIndex: -1, }; const instance = createInstance({ @@ -641,14 +604,14 @@ QUnit.module('Appointments Actions', moduleOptions, () => { startDate: new Date(2015, 2, 9, 10), endDate: new Date(2015, 2, 9, 10) }, - settings: [{}] + sortedIndex: -1, }, { itemData: { text: 'Appointment 2', startDate: new Date(2015, 2, 10, 8), endDate: new Date(2015, 2, 10, 9) }, - settings: [{}] + sortedIndex: -1, }]; createInstance({ @@ -676,7 +639,7 @@ QUnit.module('Appointments Actions', moduleOptions, () => { startDate: new Date(2015, 1, 9, 8), endDate: new Date(2015, 1, 9, 9) }, - settings: [{}] + sortedIndex: -1, }; const instance = createInstance({ @@ -703,7 +666,7 @@ QUnit.module('Appointments Keyboard Navigation', moduleOptions, () => { startDate: new Date(2015, 1, 9, 8), endDate: new Date(2015, 1, 9, 9) }, - settings: [{ sortedIndex: 0 }] + sortedIndex: 0, }; const instance = createInstance({ @@ -733,7 +696,7 @@ QUnit.module('Appointments Keyboard Navigation', moduleOptions, () => { startDate: new Date(2015, 1, 9, 8), endDate: new Date(2015, 1, 9, 10) }, - settings: [{}] + sortedIndex: -1, }, { itemData: { @@ -741,7 +704,7 @@ QUnit.module('Appointments Keyboard Navigation', moduleOptions, () => { startDate: new Date(2015, 1, 9, 9), endDate: new Date(2015, 1, 9, 10) }, - settings: [{}] + sortedIndex: -1, } ]; @@ -768,9 +731,7 @@ QUnit.module('Appointments Keyboard Navigation', moduleOptions, () => { startDate: new Date(2015, 1, 9, 8), endDate: new Date(2015, 1, 9, 10) }, - settings: [{ - sortedIndex: 0 - }] + sortedIndex: 0, }, { itemData: { @@ -778,9 +739,7 @@ QUnit.module('Appointments Keyboard Navigation', moduleOptions, () => { startDate: new Date(2015, 1, 9, 9), endDate: new Date(2015, 1, 9, 10) }, - settings: [{ - sortedIndex: 1 - }] + sortedIndex: 1, } ]; @@ -813,9 +772,7 @@ QUnit.module('Appointments Keyboard Navigation', moduleOptions, () => { startDate: new Date(2015, 1, 9, 8), endDate: new Date(2015, 1, 9, 10) }, - settings: [{ - sortedIndex: 0 - }] + sortedIndex: 0, }, { itemData: { @@ -823,9 +780,7 @@ QUnit.module('Appointments Keyboard Navigation', moduleOptions, () => { startDate: new Date(2015, 1, 9, 9), endDate: new Date(2015, 1, 9, 10) }, - settings: [{ - sortedIndex: 1 - }] + sortedIndex: 1, } ]; @@ -864,9 +819,7 @@ QUnit.module('Appointments Keyboard Navigation', moduleOptions, () => { startDate: new Date(2015, 1, 9, 8), endDate: new Date(2015, 1, 9, 10) }, - settings: [{ - sortedIndex: 0 - }] + sortedIndex: 0 }, { itemData: { @@ -874,9 +827,7 @@ QUnit.module('Appointments Keyboard Navigation', moduleOptions, () => { startDate: new Date(2015, 1, 9, 9), endDate: new Date(2015, 1, 9, 10) }, - settings: [{ - sortedIndex: 1 - }] + sortedIndex: 1 } ]; @@ -907,9 +858,7 @@ QUnit.module('Appointments Keyboard Navigation', moduleOptions, () => { startDate: new Date(2015, 10, 3, 9), endDate: new Date(2015, 10, 3, 11) }, - settings: [{ - sortedIndex: 0 - }] + sortedIndex: -1 } ]; @@ -947,9 +896,7 @@ QUnit.module('Appointments Keyboard Navigation', moduleOptions, () => { startDate: new Date(2015, 1, 9, 8), endDate: new Date(2015, 1, 9, 10) }, - settings: [{ - sortedIndex: 0 - }] + sortedIndex: 0 }, { itemData: { @@ -957,9 +904,7 @@ QUnit.module('Appointments Keyboard Navigation', moduleOptions, () => { startDate: new Date(2015, 1, 9, 9), endDate: new Date(2015, 1, 9, 10) }, - settings: [{ - sortedIndex: 1 - }] + sortedIndex: 1 } ]; @@ -990,9 +935,7 @@ QUnit.module('Appointments Keyboard Navigation', moduleOptions, () => { startDate: new Date(2015, 9, 16, 9), endDate: new Date(2015, 9, 16, 11) }, - settings: [{ - sortedIndex: 0 - }] + sortedIndex: 0 }, { itemData: { @@ -1000,9 +943,7 @@ QUnit.module('Appointments Keyboard Navigation', moduleOptions, () => { startDate: new Date(2015, 9, 17, 8), endDate: new Date(2015, 9, 17, 10) }, - settings: [{ - sortedIndex: 1 - }] + sortedIndex: 1 } ]; diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.verticalStrategy.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.verticalStrategy.tests.js index d9eb6e8f2c3e..99d16ede49d1 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.verticalStrategy.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.verticalStrategy.tests.js @@ -40,6 +40,10 @@ const createInstance = (options) => { getLoadedResources: () => [], getResourceManager: getEmptyResourceManager, getAppointmentColor: () => new Deferred(), + getAppointmentDataProvider: () => ({ + getUpdatedAppointment: () => false, + getUpdatedAppointmentKeys: () => [], + }), }).dxSchedulerAppointments('instance'); }; @@ -63,9 +67,8 @@ module('Vertical Strategy', moduleOptions, () => { endDate: new Date(2015, 1, 9, 12), allDay: true }, - settings: [{ width: 40, height: 100, allDay: true }], - needRepaint: true, - needRemove: false, + sortedIndex: 0, + width: 40, height: 100, allDay: true, }, { itemData: { text: 'Appointment 2', @@ -73,9 +76,8 @@ module('Vertical Strategy', moduleOptions, () => { endDate: new Date(2015, 1, 9, 12), allDay: true }, - settings: [{ width: 40, height: 100, allDay: true }], - needRepaint: true, - needRemove: false, + sortedIndex: 1, + width: 40, height: 100, allDay: true, }]; const instance = createInstance({ @@ -96,9 +98,8 @@ module('Vertical Strategy', moduleOptions, () => { endDate: new Date(2015, 1, 9, 12), allDay: true }, - settings: [{ count: 1, index: 0, width: 35, height: 100, allDay: true, empty: true }], - needRepaint: true, - needRemove: false, + sortedIndex: 0, + maxLevel: 1, level: 0, width: 35, height: 100, allDay: true, empty: true }, { itemData: { text: 'Appointment 2', @@ -106,9 +107,8 @@ module('Vertical Strategy', moduleOptions, () => { endDate: new Date(2015, 1, 9, 12), allDay: true }, - settings: [{ count: 1, index: 0, width: 35, height: 100, allDay: true, empty: true }], - needRepaint: true, - needRemove: false, + sortedIndex: 1, + maxLevel: 1, level: 0, width: 35, height: 100, allDay: true, empty: true }]; const instance = createInstance({ @@ -134,17 +134,15 @@ module('Vertical All Day Strategy', moduleOptions, () => { startDate: new Date(), allDay: true }, - settings: [{ count: 1, index: 0, width: 40, height: 100, allDay: true }], - needRepaint: true, - needRemove: false, + sortedIndex: 0, + maxLevel: 1, level: 0, width: 40, height: 100, allDay: true, }, { itemData: { text: 'Appointment 2', startDate: new Date() }, - settings: [{ count: 1, index: 0, width: 40, height: 100 }], - needRepaint: true, - needRemove: false, + sortedIndex: 1, + maxLevel: 1, level: 0, width: 40, height: 100, }]; instance.option('items', items); @@ -159,9 +157,8 @@ module('Vertical All Day Strategy', moduleOptions, () => { text: 'Appointment 1', startDate: new Date() }, - settings: [{ count: 1, index: 0, width: 40, height: 100 }], - needRepaint: true, - needRemove: false, + sortedIndex: 0, + maxLevel: 1, level: 0, width: 40, height: 100, }]; const instance = createInstance({ @@ -179,9 +176,8 @@ module('Vertical All Day Strategy', moduleOptions, () => { startDate: new Date(), allDay: true }, - settings: [{ count: 1, index: 0, width: 40, height: 100, allDay: true }], - needRepaint: true, - needRemove: false, + sortedIndex: 0, + maxLevel: 1, level: 0, width: 40, height: 100, allDay: true, }] ); diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/common.events.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/common.events.tests.js index 233251097e2a..635017bc97ee 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/common.events.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/common.events.tests.js @@ -224,8 +224,8 @@ QUnit.module('Events', { const changedItems = appointments.option('items'); - assert.notDeepEqual(initialItems[0].settings, changedItems[0].settings, 'Item\'s settings were changed'); - assert.notDeepEqual(initialItems[1].settings, changedItems[1].settings, 'Item\'s settings were changed'); + assert.notDeepEqual(initialItems[0], changedItems[0], 'Item\'s settings were changed'); + assert.notDeepEqual(initialItems[1], changedItems[1], 'Item\'s settings were changed'); }); QUnit.test('targetedAppointmentData should return correct allDay appointmentData', async function(assert) { @@ -688,7 +688,7 @@ QUnit.module('Events', { }); const workspaceSpy = sinon.spy(scheduler.instance._workSpace, '_dimensionChanged'); - const appointmentsSpy = sinon.spy(scheduler.instance._appointments, '_repaintAppointments'); + const appointmentsSpy = sinon.spy(scheduler.instance._appointments, 'repaintAppointments'); resizeCallbacks.fire(); diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.RTL.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.RTL.tests.js index 581ff5a23cc3..8dcbd932f050 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.RTL.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.RTL.tests.js @@ -28,28 +28,28 @@ module('RTL', moduleConfig, () => { month: [ { top: 256, - left: 599 + left: 250 }, { top: 256, - left: 250 + left: 599 } ], week: [ { top: 0, - left: 539 + left: 241 }, { top: 0, - left: 241 + left: 539 } ], day: [ { top: 0, - left: 324 + left: 25 }, { top: 0, - left: 25 + left: 324 } ] }; diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.agenda.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.agenda.tests.js index c7cd5cc2b9a3..b4dcc060949b 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.agenda.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.agenda.tests.js @@ -306,7 +306,7 @@ module('Integration: Agenda', moduleConfig, () => { dataSource: [] }); - const renderingStrategy = instance.getRenderingStrategyInstance(); + const renderingStrategy = instance.getLayoutManager().getRenderingStrategyInstance(); const rows = [ [0, 1, 0, 2, 1, 1, 1], [3, 0, 1, 0, 1, 1, 1] diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.appointmentCollector.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.appointmentCollector.tests.js index d5795a8d793f..dbb04d986dc6 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.appointmentCollector.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.appointmentCollector.tests.js @@ -680,7 +680,7 @@ module('Integration: Appointments Collector, adaptivityEnabled = false', baseCon view: 'month', expectedNumberOfCollectors: 9, expectedText: '5 more', - collectorIndex: 3, + collectorIndex: 0, description: 'Scheduler should render correct number of collectors and pass correct number of appointments to them in month view (T965267)', }, { dataSource: [{ diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.appointmentTooltip.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.appointmentTooltip.tests.js index 08408a22da83..9f837445d2fe 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.appointmentTooltip.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.appointmentTooltip.tests.js @@ -1167,7 +1167,12 @@ module('New common tooltip for compact and cell appointments', moduleConfig, () startDate: new Date(2017, 4, 22, 9, 30), endDate: new Date(2017, 4, 22, 11, 30) }); - assert.equal(scheduler.appointments.compact.getButtonText(), '2 more', 'Count of compact buttons should be increase after add appointment'); + scheduler.instance.addAppointment({ + text: 'Temp appointment 3', + startDate: new Date(2017, 4, 22, 9, 30), + endDate: new Date(2017, 4, 22, 11, 30) + }); + assert.equal(scheduler.appointments.compact.getButtonText(4), '3 more', 'Count of compact buttons should be increase after add appointment'); assert.equal(scheduler.appointments.compact.getButtonCount(), 5, 'Count of compact buttons shouldn\'t change'); }); diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.multiWeekAppointments.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.multiWeekAppointments.tests.js index c133db3b5f18..4386c44f5703 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.multiWeekAppointments.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.multiWeekAppointments.tests.js @@ -564,11 +564,10 @@ QUnit.test('Grouped multi-week appointments should have a correct left offset', const $appointments = $(this.instance.$element()).find('.dx-scheduler-appointment'); assert.roughEqual(translator.locate($appointments.eq(0)).left, 50, 2.001); - assert.roughEqual(translator.locate($appointments.eq(1)).left, 0, 1.001); + assert.roughEqual(translator.locate($appointments.eq(1)).left, 399, 1.001); assert.roughEqual(translator.locate($appointments.eq(2)).left, 0, 1.001); - - assert.roughEqual(translator.locate($appointments.eq(3)).left, 399, 1.001); - assert.roughEqual(translator.locate($appointments.eq(4)).left, 349, 1.001); + assert.roughEqual(translator.locate($appointments.eq(3)).left, 349, 1.001); + assert.roughEqual(translator.locate($appointments.eq(4)).left, 0, 1.001); assert.roughEqual(translator.locate($appointments.eq(5)).left, 349, 1.001); }); @@ -614,13 +613,12 @@ QUnit.test('Grouped multi-week appointments should have a correct left offset', const $appointments = $(this.instance.$element()).find('.dx-scheduler-appointment'); - assert.roughEqual(translator.locate($appointments.eq(0)).left, cellWidth * 14, 2.001, 'The first head is OK'); - assert.roughEqual(translator.locate($appointments.eq(1)).left, cellWidth * 14, 1.001, 'The first body is OK'); - assert.roughEqual(translator.locate($appointments.eq(2)).left, cellWidth * 19, 2.001, 'The first tail is OK'); - - assert.roughEqual(translator.locate($appointments.eq(3)).left, cellWidth * 7, 1.001, 'The second head is OK'); - assert.roughEqual(translator.locate($appointments.eq(4)).left, cellWidth * 7, 1.001, 'The second body is OK'); - assert.roughEqual(translator.locate($appointments.eq(5)).left, cellWidth * 12, 2.001, 'The second tail is OK'); + assert.roughEqual(translator.locate($appointments.eq(0)).left, cellWidth * 7, 1.001, 'The second head is OK'); + assert.roughEqual(translator.locate($appointments.eq(1)).left, cellWidth * 14, 2.001, 'The first head is OK'); + assert.roughEqual(translator.locate($appointments.eq(2)).left, cellWidth * 7, 1.001, 'The second body is OK'); + assert.roughEqual(translator.locate($appointments.eq(3)).left, cellWidth * 14, 1.001, 'The first body is OK'); + assert.roughEqual(translator.locate($appointments.eq(4)).left, cellWidth * 12, 2.001, 'The second tail is OK'); + assert.roughEqual(translator.locate($appointments.eq(5)).left, cellWidth * 19, 2.001, 'The first tail is OK'); }); }); @@ -654,15 +652,15 @@ QUnit.test('Multi-week grouped appointments should be painted correctly', async const $appointments = $(this.instance.$element()).find('.dx-scheduler-appointment'); assert.equal(new Color($appointments.eq(0).css('backgroundColor')).toHex(), '#8bb6ff', 'Color is OK'); - assert.equal(new Color($appointments.eq(1).css('backgroundColor')).toHex(), '#8bb6ff', 'Color is OK'); - assert.equal(new Color($appointments.eq(2).css('backgroundColor')).toHex(), '#8bb6ff', 'Color is OK'); + assert.equal(new Color($appointments.eq(1).css('backgroundColor')).toHex(), '#ff8b8b', 'Color is OK'); + assert.equal(new Color($appointments.eq(2).css('backgroundColor')).toHex(), '#8bffa6', 'Color is OK'); - assert.equal(new Color($appointments.eq(3).css('backgroundColor')).toHex(), '#ff8b8b', 'Color is OK'); + assert.equal(new Color($appointments.eq(3).css('backgroundColor')).toHex(), '#8bb6ff', 'Color is OK'); assert.equal(new Color($appointments.eq(4).css('backgroundColor')).toHex(), '#ff8b8b', 'Color is OK'); - assert.equal(new Color($appointments.eq(5).css('backgroundColor')).toHex(), '#ff8b8b', 'Color is OK'); + assert.equal(new Color($appointments.eq(5).css('backgroundColor')).toHex(), '#8bffa6', 'Color is OK'); - assert.equal(new Color($appointments.eq(6).css('backgroundColor')).toHex(), '#8bffa6', 'Color is OK'); - assert.equal(new Color($appointments.eq(7).css('backgroundColor')).toHex(), '#8bffa6', 'Color is OK'); + assert.equal(new Color($appointments.eq(6).css('backgroundColor')).toHex(), '#8bb6ff', 'Color is OK'); + assert.equal(new Color($appointments.eq(7).css('backgroundColor')).toHex(), '#ff8b8b', 'Color is OK'); assert.equal(new Color($appointments.eq(8).css('backgroundColor')).toHex(), '#8bffa6', 'Color is OK'); }); diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.workSpace.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.workSpace.tests.js index b88ae5436dbb..8fa618099c01 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.workSpace.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.workSpace.tests.js @@ -714,7 +714,8 @@ module('Integration: Work space', { ...moduleConfig }, () => { }, 'Cell data has UTC dates'); }); - test('Appointments in month view should be sorted same as in all-day section', async function(assert) { + // TODO: remove skip with new view model - now in month view order reversed and this test checks nothing + test.skip('Appointments in month view should be sorted same as in all-day section', async function(assert) { const items = [{ text: '1', startDate: new Date(2016, 1, 11, 13, 0), diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/layoutManager.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/layoutManager.tests.js index d8524e17ec80..36efb46732bd 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/layoutManager.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/layoutManager.tests.js @@ -64,19 +64,19 @@ QUnit.test('Scheduler should have a right rendering strategy for timeline views' }] }); - assert.ok(this.instance.getRenderingStrategyInstance() instanceof HorizontalAppointmentsStrategy, 'timelineDay strategy is OK'); + assert.ok(this.instance.getLayoutManager().getRenderingStrategyInstance() instanceof HorizontalAppointmentsStrategy, 'timelineDay strategy is OK'); this.instance.option('currentView', 'timelineWeek'); await waitAsync(0); - assert.ok(this.instance.getRenderingStrategyInstance() instanceof HorizontalAppointmentsStrategy, 'timelineWeek strategy is OK'); + assert.ok(this.instance.getLayoutManager().getRenderingStrategyInstance() instanceof HorizontalAppointmentsStrategy, 'timelineWeek strategy is OK'); this.instance.option('currentView', 'timelineWorkWeek'); await waitAsync(0); - assert.ok(this.instance.getRenderingStrategyInstance() instanceof HorizontalAppointmentsStrategy, 'timelineWorkWeek strategy is OK'); + assert.ok(this.instance.getLayoutManager().getRenderingStrategyInstance() instanceof HorizontalAppointmentsStrategy, 'timelineWorkWeek strategy is OK'); this.instance.option('currentView', 'timelineMonth'); await waitAsync(0); - assert.ok(this.instance.getRenderingStrategyInstance() instanceof HorizontalMonthLineAppointmentsStrategy, 'timelineMonth strategy is OK'); + assert.ok(this.instance.getLayoutManager().getRenderingStrategyInstance() instanceof HorizontalMonthLineAppointmentsStrategy, 'timelineMonth strategy is OK'); }); QUnit.test('Scheduler should have a right rendering strategy for views with config', async function(assert) { @@ -97,11 +97,11 @@ QUnit.test('Scheduler should have a right rendering strategy for views with conf }] }); - assert.ok(this.instance.getRenderingStrategyInstance() instanceof VerticalAppointmentStrategy, 'Strategy is OK'); + assert.ok(this.instance.getLayoutManager().getRenderingStrategyInstance() instanceof VerticalAppointmentStrategy, 'Strategy is OK'); this.instance.option('currentView', 'MonthView'); await waitAsync(0); - assert.ok(this.instance.getRenderingStrategyInstance() instanceof HorizontalAppointmentsStrategy, 'Strategy is OK'); + assert.ok(this.instance.getLayoutManager().getRenderingStrategyInstance() instanceof HorizontalAppointmentsStrategy, 'Strategy is OK'); }); QUnit.module('Appointments', moduleOptions); @@ -328,11 +328,11 @@ QUnit.test('Four rival appointments should have correct positions', async functi assert.roughEqual(this.scheduler.appointments.getAppointmentWidth(1), this.scheduler.workSpace.getCellWidth(), 1.1, 'appointment has a right size'); assert.equal(this.scheduler.appointments.getAppointmentPosition(2).left, 0, 'appointment is rendered in right place'); - assert.roughEqual(this.scheduler.appointments.getAppointmentPosition(2).top, 68, 1.5, 'appointment is rendered in right place'); + assert.roughEqual(this.scheduler.appointments.getAppointmentPosition(2).top, 54, 1.5, 'appointment is rendered in right place'); assert.roughEqual(this.scheduler.appointments.getAppointmentWidth(2), this.scheduler.workSpace.getCellWidth(), 1.1, 'appointment has a right size'); assert.equal(this.scheduler.appointments.getAppointmentPosition(3).left, 0, 'appointment is rendered in right place'); - assert.roughEqual(this.scheduler.appointments.getAppointmentPosition(3).top, 54, 1.5, 'appointment is rendered in right place'); + assert.roughEqual(this.scheduler.appointments.getAppointmentPosition(3).top, 68, 1.5, 'appointment is rendered in right place'); assert.roughEqual(this.scheduler.appointments.getAppointmentWidth(3), this.scheduler.workSpace.getCellWidth(), 1.1, 'appointment has a right size'); }); @@ -1255,18 +1255,21 @@ QUnit.test('Three rival appointments with two columns should have correct positi const cellWidth = $tableCell.get(0).getBoundingClientRect().width; const offset = APPOINTMENT_DEFAULT_LEFT_OFFSET; const firstAppointmentPosition = translator.locate($appointment.eq(0)); - const secondAppointmentPosition = translator.locate($appointment.eq(1)); - const thirdAppointmentPosition = translator.locate($appointment.eq(2)); + const secondAppointmentPosition = translator.locate($appointment.eq(2)); + const thirdAppointmentPosition = translator.locate($appointment.eq(1)); assert.equal($appointment.length, 3, 'All appointments are rendered'); + assert.equal($appointment.eq(0).find('.dx-scheduler-appointment-title').text(), 'Appointment 1'); assert.equal(firstAppointmentPosition.top, 0, 'appointment is rendered in right place'); assert.roughEqual(firstAppointmentPosition.left, cellWidth, 1, 'appointment is rendered in right place'); assert.roughEqual(getOuterWidth($appointment.eq(0)), (cellWidth - offset) / 2, 1, 'appointment has a right size'); + assert.equal($appointment.eq(2).find('.dx-scheduler-appointment-title').text(), 'Appointment 2'); assert.equal(secondAppointmentPosition.top, 2 * cellHeight, 'appointment is rendered in right place'); assert.roughEqual(secondAppointmentPosition.left, cellWidth + $appointment.eq(0).outerWidth(), 1, 'appointment is rendered in right place'); - assert.roughEqual(getOuterWidth($appointment.eq(1)), (cellWidth - offset) / 2, 1, 'appointment has a right size'); + assert.roughEqual(getOuterWidth($appointment.eq(2)), (cellWidth - offset) / 2, 1, 'appointment has a right size'); + assert.equal($appointment.eq(1).find('.dx-scheduler-appointment-title').text(), 'Appointment 3'); assert.equal(thirdAppointmentPosition.top, 0, 'appointment is rendered in right place'); assert.roughEqual(thirdAppointmentPosition.left, cellWidth + $appointment.eq(0).outerWidth(), 1, 'appointment is rendered in right place'); assert.roughEqual(getOuterWidth($appointment.eq(1)), (cellWidth - offset) / 2, 1, 'appointment has a right size'); @@ -1299,10 +1302,10 @@ QUnit.test('Four rival appointments with three columns should have correct posit assert.deepEqual(this.scheduler.appointments.getAppointmentPosition(0), { top: 0, left: cellWidth }, 'appointment is rendered in right place'); assert.roughEqual(this.scheduler.appointments.getAppointmentWidth(0), expectedAppWidth, 1, 'appointment has a right size'); - assert.deepEqual(this.scheduler.appointments.getAppointmentPosition(1), { top: 2 * cellHeight, left: cellWidth + 2 * expectedAppWidth }, 'appointment is rendered in right place'); + assert.deepEqual(this.scheduler.appointments.getAppointmentPosition(1), { top: 0, left: cellWidth + expectedAppWidth }, 'appointment is rendered in right place'); assert.roughEqual(this.scheduler.appointments.getAppointmentWidth(1), expectedAppWidth, 1, 'appointment has a right size'); - assert.deepEqual(this.scheduler.appointments.getAppointmentPosition(2), { top: 0, left: cellWidth + expectedAppWidth }, 'appointment is rendered in right place'); + assert.deepEqual(this.scheduler.appointments.getAppointmentPosition(2), { top: 2 * cellHeight, left: cellWidth + 2 * expectedAppWidth }, 'appointment is rendered in right place'); assert.roughEqual(this.scheduler.appointments.getAppointmentWidth(2), expectedAppWidth, 1, 'appointment has a right size'); assert.deepEqual(this.scheduler.appointments.getAppointmentPosition(3), { top: 4 * cellHeight, left: cellWidth + expectedAppWidth }, 'appointment is rendered in right place'); @@ -1682,7 +1685,7 @@ QUnit.test('Full-size appointment should not have empty class in "auto" mode', a } ); - const getHeightStub = sinon.stub(this.instance.getRenderingStrategyInstance(), '_getAppointmentDefaultHeight').callsFake(function() { + const getHeightStub = sinon.stub(this.instance.getLayoutManager().getRenderingStrategyInstance(), '_getAppointmentDefaultHeight').callsFake(function() { return 18; }); @@ -2359,7 +2362,7 @@ QUnit.test('_isAppointmentEmpty should work correctly in different strategies', currentView: 'timelineDay' }); - const renderingStrategy = this.instance.getRenderingStrategyInstance(); + const renderingStrategy = this.instance.getLayoutManager().getRenderingStrategyInstance(); assert.ok(renderingStrategy._isAppointmentEmpty(34, 41), 'Appointment is empty'); assert.notOk(renderingStrategy._isAppointmentEmpty(36, 41), 'Appointment isn\'t empty'); diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/subscribes.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/subscribes.tests.js index 7167545a69e6..1ed93acbcb66 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/subscribes.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/subscribes.tests.js @@ -562,7 +562,7 @@ module('Subscribes', { test('"getAppointmentDurationInMs" should return visible appointment duration', async function(assert) { await this.createInstance(); - const renderingStrategy = this.instance.getRenderingStrategyInstance(); + const renderingStrategy = this.instance.getLayoutManager().getRenderingStrategyInstance(); const result = renderingStrategy.getAppointmentDurationInMs( new Date(2015, 2, 2, 8), new Date(2015, 2, 2, 20) @@ -580,7 +580,7 @@ module('Subscribes', { }); await waitAsync(0); - const renderingStrategy = this.instance.getRenderingStrategyInstance(); + const renderingStrategy = this.instance.getLayoutManager().getRenderingStrategyInstance(); const result = renderingStrategy.getAppointmentDurationInMs( new Date(2015, 2, 2, 8), new Date(2015, 2, 4, 20) @@ -598,7 +598,7 @@ module('Subscribes', { }); await waitAsync(0); - const renderingStrategy = this.instance.getRenderingStrategyInstance(); + const renderingStrategy = this.instance.getLayoutManager().getRenderingStrategyInstance(); const result = renderingStrategy.getAppointmentDurationInMs( new Date(2015, 2, 2, 8), new Date(2015, 2, 3, 0) @@ -615,7 +615,7 @@ module('Subscribes', { }); await waitAsync(0); - const renderingStrategy = this.instance.getRenderingStrategyInstance(); + const renderingStrategy = this.instance.getLayoutManager().getRenderingStrategyInstance(); const result = renderingStrategy.getAppointmentDurationInMs( new Date(2015, 4, 25, 21), new Date(2015, 4, 26, 3) @@ -632,7 +632,7 @@ module('Subscribes', { }); await waitAsync(0); - const renderingStrategy = this.instance.getRenderingStrategyInstance(); + const renderingStrategy = this.instance.getLayoutManager().getRenderingStrategyInstance(); const result = renderingStrategy.getAppointmentDurationInMs( new Date(2015, 2, 2, 10), new Date(2015, 2, 4, 17) @@ -649,7 +649,7 @@ module('Subscribes', { }); await waitAsync(0); - const renderingStrategy = this.instance.getRenderingStrategyInstance(); + const renderingStrategy = this.instance.getLayoutManager().getRenderingStrategyInstance(); const result = renderingStrategy.getAppointmentDurationInMs( new Date(2015, 2, 2, 7), new Date(2015, 2, 4, 21), @@ -666,7 +666,7 @@ module('Subscribes', { }); await waitAsync(0); - const renderingStrategy = this.instance.getRenderingStrategyInstance(); + const renderingStrategy = this.instance.getLayoutManager().getRenderingStrategyInstance(); const result = renderingStrategy.getAppointmentDurationInMs( new Date(2015, 2, 2, 7), new Date(2015, 2, 4, 21), diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/timezones.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/timezones.tests.js index ab55570431de..ff9b2e7ff8b2 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/timezones.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/timezones.tests.js @@ -1607,7 +1607,7 @@ module('Scheduler grid', moduleConfigWithClock, () => { const $element = scheduler.getElement(); let $appt = $element.find(CLASSES.appointment); const cellHeight = $element.find(CLASSES.dateTableCell).eq(0).get(0).getBoundingClientRect().height; - const apptPosition = translator.locate($appt.eq(0)); + const apptPosition = translator.locate($appt.eq(1)); const clientTzOffset = new Date('2015-05-27T23:00:00+01:00').getTimezoneOffset() / 60; const cellsCount = (new Date( @@ -2122,8 +2122,8 @@ module('Fixed client time zone offset', { $appointments = rootElement.find(CLASSES.appointment); assert.equal($appointments.length, 2, 'Appointment count is OK'); - assert.equal($appointments.eq(1).position().top, initialAppointmentTop, 'Appointment top is OK'); - assert.roughEqual(getOuterHeight($appointments.eq(1)), cellHeight * 5, 2.001, 'Appointment height is OK'); + assert.equal($appointments.eq(0).position().top, initialAppointmentTop, 'Appointment top is OK'); + assert.roughEqual(getOuterHeight($appointments.eq(0)), cellHeight * 5, 2.001, 'Appointment height is OK'); }); [{ diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/virtual_scrolling.integration.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/virtual_scrolling.integration.tests.js index 3ec26eb324c5..841a5b1416bb 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/virtual_scrolling.integration.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/virtual_scrolling.integration.tests.js @@ -242,10 +242,10 @@ module('Virtual scrolling integration', () => { { y: 2200, appointmentRects: [ - { left: -9824, top: -10151, height: 650 }, { left: -9749, top: -11901, height: 50 }, + { left: -9224, top: -11901, height: 50 }, + { left: -9824, top: -10151, height: 650 }, { left: -9299, top: -10151, height: 650 }, - { left: -9224, top: -11901, height: 50 } ] }] }, @@ -270,10 +270,10 @@ module('Virtual scrolling integration', () => { }, { y: 2200, appointmentRects: [ - { left: -9824, top: -10149, height: 650 }, { left: -9749, top: -11899, height: 50 }, + { left: -9224, top: -11899, height: 50 }, + { left: -9824, top: -10149, height: 650 }, { left: -9299, top: -10149, height: 650 }, - { left: -9224, top: -11899, height: 50 } ] }] } @@ -678,9 +678,9 @@ module('Virtual scrolling integration', () => { offset: { x: 0, y: 2300 }, appointmentRects: [ { left: -9714, top: -10093, height: 350 }, - { left: -9629, top: -12143, height: 50 }, { left: -9714, top: -9543, height: 300 }, - { left: -9629, top: -9693, height: 50 } + { left: -9629, top: -12143, height: 50 }, + { left: -9629, top: -9693, height: 50 }, ] }] }, @@ -698,9 +698,9 @@ module('Virtual scrolling integration', () => { offset: { x: 0, y: 2300 }, appointmentRects: [ { left: -9714, top: -10091, height: 300 }, - { left: -9629, top: -12191, height: 50 }, { left: -9714, top: -9641, height: 400 }, - { left: -9629, top: -9791, height: 50 } + { left: -9629, top: -12191, height: 50 }, + { left: -9629, top: -9791, height: 50 }, ] } ] @@ -925,8 +925,8 @@ module('Virtual scrolling integration', () => { }, { offset: { x: 0, y: 2200 }, appointmentRects: [ - { left: -9874, top: -10150, height: 650 }, { left: -9799, top: -11900, height: 50 }, + { left: -9874, top: -10150, height: 650 }, ] }, { offset: { x: 520, y: 0 }, @@ -943,8 +943,8 @@ module('Virtual scrolling integration', () => { }, { offset: { x: 520, y: 2200 }, appointmentRects: [ - { left: -9869, top: -10150, height: 650 }, { left: -9794, top: -11900, height: 50 }, + { left: -9869, top: -10150, height: 650 }, ] }] }, { @@ -964,8 +964,8 @@ module('Virtual scrolling integration', () => { }, { offset: { x: 0, y: 2200 }, appointmentRects: [ - { left: -9874, top: -10149, height: 650 }, { left: -9799, top: -11899, height: 50 }, + { left: -9874, top: -10149, height: 650 }, ] }, { offset: { x: 520, y: 0 }, @@ -982,8 +982,8 @@ module('Virtual scrolling integration', () => { }, { offset: { x: 520, y: 2200 }, appointmentRects: [ - { left: -9869, top: -10149, height: 650 }, { left: -9794, top: -11899, height: 50 }, + { left: -9869, top: -10149, height: 650 }, ] }] } @@ -1485,7 +1485,7 @@ module('Virtual scrolling integration', () => { { offsetY: 0, expected: [ - [{ + { groupIndex: 0, left: 0, top: 100, @@ -1505,23 +1505,32 @@ module('Virtual scrolling integration', () => { left: 523, top: 100, height: 450 - }], - [] + } ] }, { offsetY: 500, expected: [ - [{ + { groupIndex: 0, left: 0, top: 250, height: 300 + }, { + groupIndex: 0, + left: 0, + top: 900, + height: 400 }, { groupIndex: 0, left: 175, top: 250, height: 300 + }, { + groupIndex: 0, + left: 175, + top: 900, + height: 400 }, { groupIndex: 1, left: 350, @@ -1529,38 +1538,26 @@ module('Virtual scrolling integration', () => { height: 300 }, { groupIndex: 1, - left: 523, - top: 250, - height: 300 - }], - [{ - groupIndex: 0, - left: 0, - top: 900, - height: 400 - }, { - groupIndex: 0, - left: 175, + left: 350, top: 900, height: 400 }, { groupIndex: 1, - left: 350, - top: 900, - height: 400 + left: 523, + top: 250, + height: 300 }, { groupIndex: 1, left: 523, top: 900, height: 400 - }] + } ] }, { offsetY: 900, expected: [ - [], - [{ + { groupIndex: 0, left: 0, top: 900, @@ -1580,21 +1577,32 @@ module('Virtual scrolling integration', () => { left: 523, top: 900, height: 650 - }]] + } + ] }, { offsetY: 500, expected: [ - [{ + { groupIndex: 0, left: 0, top: 250, height: 300 + }, { + groupIndex: 0, + left: 0, + top: 900, + height: 400 }, { groupIndex: 0, left: 175, top: 250, height: 300 + }, { + groupIndex: 0, + left: 175, + top: 900, + height: 400 }, { groupIndex: 1, left: 350, @@ -1602,31 +1610,20 @@ module('Virtual scrolling integration', () => { height: 300 }, { groupIndex: 1, - left: 523, - top: 250, - height: 300 - }], - [{ - groupIndex: 0, - left: 0, - top: 900, - height: 400 - }, { - groupIndex: 0, - left: 175, + left: 350, top: 900, height: 400 }, { groupIndex: 1, - left: 350, - top: 900, - height: 400 + left: 523, + top: 250, + height: 300 }, { groupIndex: 1, left: 523, top: 900, height: 400 - }] + } ] } ].forEach(({ offsetY, expected }) => { @@ -1638,24 +1635,18 @@ module('Virtual scrolling integration', () => { assert.equal(items.length, expected.length, `Appointments amount is correct for offsetY=${offsetY}`); - expected.forEach((expect, index) => { - const { settings } = items[index]; - - assert.equal(settings.length, expect.length, `Appointment settings amount ${settings.length} is correct`); - - settings.forEach((setting, index) => { - const { - left, - top, - groupIndex, - height - } = expect[index]; + expected.forEach((expectItem, index) => { + const { + left, + top, + groupIndex, + height + } = expectItem; - assert.equal(setting.groupIndex, groupIndex, `Settings groupIndex ${setting.groupIndex} is correct`); - assert.roughEqual(setting.top, top, 1.01, `Settings top ${setting.top} is correct`); - assert.roughEqual(setting.left, left, 1.01, `Settings left ${setting.left} is correct`); - assert.equal(setting.height, height, `Settings height ${setting.height} is correct`); - }); + assert.equal(items[index].groupIndex, groupIndex, `Settings groupIndex ${groupIndex} is correct`); + assert.roughEqual(items[index].top, top, 1.01, `Settings top ${top} is correct`); + assert.roughEqual(items[index].left, left, 1.01, `Settings left ${left} is correct`); + assert.equal(items[index].height, height, `Settings height ${height} is correct`); }); }, scrollable, @@ -1893,14 +1884,14 @@ module('Virtual scrolling integration', () => { groupIndex: 0, top: 300, height: 300 - }, { - groupIndex: 0, - top: 300, - height: 300 }, { groupIndex: 1, top: 1000, height: 350 + }, { + groupIndex: 0, + top: 300, + height: 300 }, { groupIndex: 1, top: 1000, @@ -1925,14 +1916,14 @@ module('Virtual scrolling integration', () => { groupIndex: 0, top: 300, height: 300 - }, { - groupIndex: 0, - top: 300, - height: 300 }, { groupIndex: 1, top: 1000, height: 350 + }, { + groupIndex: 0, + top: 300, + height: 300 }, { groupIndex: 1, top: 1000, @@ -1951,13 +1942,9 @@ module('Virtual scrolling integration', () => { () => { const items = instance._appointments.option('items'); - assert.equal(items.length, 1, `Appointments amount is correct for offsetY=${offsetY}`); - - const { settings } = items[0]; - - assert.equal(settings.length, expected.length, `Appointment settings amount ${settings.length} is correct`); + assert.equal(items.length, expected.length, `Appointments amount is correct for offsetY=${offsetY}`); - settings.forEach((setting, index) => { + items.forEach((setting, index) => { const { top, groupIndex, @@ -3001,11 +2988,11 @@ module('Virtual scrolling integration', () => { const { expectedReducers } = option; const appointments = this.scheduler.instance.getAppointmentsInstance(); - const { settings } = appointments.option('items')[0]; + const settings = appointments.option('items'); assert.equal(settings.length, expectedReducers.length, 'Appointment settings amount is correct'); expectedReducers.forEach((expected, i) => { - assert.equal(settings[i].appointmentReduced, expected, `Part "${i}" has correct reducer state`); + assert.equal(settings[i].reduced, expected, `Part "${i}" has correct reducer state`); }); }); }); @@ -3104,16 +3091,8 @@ module('Virtual scrolling integration', () => { () => { appointmentsItems = this.instance.getAppointmentsInstance().option('items'); - assert.equal(appointmentsItems.length, 2, 'Items length is correct'); - - assert.deepEqual(appointmentsItems[0].itemData, dataSourceItems[1], 'Item0 is correct'); - assert.notOk(appointmentsItems[0].needRepaint, 'Item0 should be repainted'); - assert.notOk(appointmentsItems[0].needRemove, 'Item0 should not be removed'); - - assert.deepEqual(appointmentsItems[1].itemData, dataSourceItems[0], 'Item1 is correct'); - assert.notOk(appointmentsItems[1].needRepaint, 'Item1 should be repainted'); - assert.ok(appointmentsItems[1].needRemove, 'Item1 should not be removed'); - + assert.equal(appointmentsItems.length, 1, 'Items length is correct'); + assert.equal(appointmentsItems[0].itemData, dataSourceItems[1], 'Item is correct'); }, scrollable, { y: 1000 } diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/virtual_scrolling.monthView.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/virtual_scrolling.monthView.tests.js index fc7c5a68c1bd..49a39a7dda27 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/virtual_scrolling.monthView.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/virtual_scrolling.monthView.tests.js @@ -281,30 +281,30 @@ module('Virtual scrolling Month View', () => { left: -10324, top: -9837, width: 150 - }, { - left: -10324, - top: -9762, - width: 150 - }, { - left: -10324, - top: -9687, - width: 150 - }, { - left: -10324, - top: -9612, - width: 75 }, { left: -9574, top: -9837, width: 450 + }, { + left: -10324, + top: -9762, + width: 150 }, { left: -9649, top: -9762, width: 525 + }, { + left: -10324, + top: -9687, + width: 150 }, { left: -9649, top: -9687, width: 525 + }, { + left: -10324, + top: -9612, + width: 75 }, { left: -9649, top: -9612, diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/virtual_scrolling.timeline.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/virtual_scrolling.timeline.tests.js index 995dfea93cf4..7abe73e28689 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/virtual_scrolling.timeline.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/virtual_scrolling.timeline.tests.js @@ -217,25 +217,25 @@ module('Virtual scrolling timelines', () => { { offset: { x: 6200 }, expectedRects: [{ - left: -10099, - top: -9522, - width: 1400 - }, { left: -8899, top: -9669, width: 200 + }, { + left: -10099, + top: -9522, + width: 1400 }] }, { offset: { x: 7200 }, expectedRects: [{ - left: -10299, - top: -9522, - width: 1000 - }, { left: -9899, top: -9669, width: 1200 + }, { + left: -10299, + top: -9522, + width: 1000 }] }, { @@ -269,10 +269,6 @@ module('Virtual scrolling timelines', () => { { offset: { x: 12000 }, expectedRects: [{ - left: -10299, - top: -9522, - width: 1600 - }, { left: -9899, top: -9817, width: 1200 @@ -280,21 +276,25 @@ module('Virtual scrolling timelines', () => { left: -9899, top: -9669, width: 1200 + }, { + left: -10299, + top: -9522, + width: 1600 }] }, { offset: { x: 13000 }, expectedRects: [{ left: -10299, - top: -9522, + top: -9817, width: 1600 }, { left: -10299, - top: -9817, + top: -9669, width: 1600 }, { left: -10299, - top: -9669, + top: -9522, width: 1600 }] }, @@ -302,15 +302,15 @@ module('Virtual scrolling timelines', () => { offset: { x: 14000 }, expectedRects: [{ left: -10299, - top: -9522, + top: -9817, width: 1600 }, { left: -10299, - top: -9817, + top: -9669, width: 1600 }, { left: -10299, - top: -9669, + top: -9522, width: 1600 }] }, @@ -318,25 +318,21 @@ module('Virtual scrolling timelines', () => { offset: { x: 15000 }, expectedRects: [{ left: -10299, - top: -9522, + top: -9817, width: 1600 }, { left: -10299, - top: -9817, + top: -9669, width: 1600 }, { left: -10299, - top: -9669, + top: -9522, width: 1600 }] }, { offset: { x: 17000 }, expectedRects: [{ - left: -10299, - top: -9522, - width: 1600 - }, { left: -10299, top: -9817, width: 1400 @@ -344,15 +340,15 @@ module('Virtual scrolling timelines', () => { left: -10299, top: -9669, width: 1400 + }, { + left: -10299, + top: -9522, + width: 1600 }] }, { offset: { x: 17500 }, expectedRects: [{ - left: -10399, - top: -9522, - width: 1600 - }, { left: -10399, top: -9817, width: 1000 @@ -360,15 +356,15 @@ module('Virtual scrolling timelines', () => { left: -10399, top: -9669, width: 1000 + }, { + left: -10399, + top: -9522, + width: 1600 }] }, { offset: { x: 18000 }, expectedRects: [{ - left: -10299, - top: -9522, - width: 1600 - }, { left: -10299, top: -9817, width: 400 @@ -376,6 +372,10 @@ module('Virtual scrolling timelines', () => { left: -10299, top: -9669, width: 400 + }, { + left: -10299, + top: -9522, + width: 1600 }] }, { From 72c25c1575b1ef4c13daa1c40992ba83c4157102 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marker=20dao=20=C2=AE?= Date: Thu, 14 Aug 2025 16:17:38 +0200 Subject: [PATCH 009/101] LoadPanel: Improve typing (#30761) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: marker dao ® --- .../js/__internal/ui/m_load_panel.ts | 47 +++++++++++-------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/packages/devextreme/js/__internal/ui/m_load_panel.ts b/packages/devextreme/js/__internal/ui/m_load_panel.ts index ac3a84f0d09f..21eee9bfb1f1 100644 --- a/packages/devextreme/js/__internal/ui/m_load_panel.ts +++ b/packages/devextreme/js/__internal/ui/m_load_panel.ts @@ -4,10 +4,11 @@ import type { DefaultOptionsRule } from '@js/core/options/utils'; import type { dxElementWrapper } from '@js/core/renderer'; import $ from '@js/core/renderer'; import { noop } from '@js/core/utils/common'; +import type { DeferredObj } from '@js/core/utils/deferred'; import { Deferred } from '@js/core/utils/deferred'; import LoadIndicator from '@js/ui/load_indicator'; import type { Properties } from '@js/ui/load_panel'; -import { isFluent, isMaterial } from '@js/ui/themes'; +import { current, isFluent, isMaterial } from '@js/ui/themes'; import type { OptionChanged } from '@ts/core/widget/types'; import type { SupportedKeys } from '@ts/core/widget/widget'; import Overlay from '@ts/ui/overlay/overlay'; @@ -29,6 +30,7 @@ class LoadPanel extends Overlay { _$loadPanelContentWrapper?: dxElementWrapper; + // eslint-disable-next-line no-restricted-globals -- needed for delayed panel show _showTimeout?: ReturnType; _supportedKeys(): SupportedKeys { @@ -44,7 +46,7 @@ class LoadPanel extends Overlay { message: messageLocalization.format('Loading'), width: 222, height: 90, - // @ts-expect-error ts-error + // @ts-expect-error 'null' is not assignable animation: null, showIndicator: true, indicatorSrc: '', @@ -68,8 +70,7 @@ class LoadPanel extends Overlay { }, { device(): boolean { - // @ts-expect-error ts-error - return isMaterial(); + return isMaterial(current()); }, options: { message: '', @@ -81,8 +82,7 @@ class LoadPanel extends Overlay { }, { device(): boolean { - // @ts-expect-error ts-error - return isFluent(); + return isFluent(current()); }, options: { width: 'auto', @@ -93,8 +93,7 @@ class LoadPanel extends Overlay { } _init(): void { - // @ts-expect-error ts-error - super._init.apply(this, arguments); + super._init(); } _render(): void { @@ -113,13 +112,15 @@ class LoadPanel extends Overlay { const showIndicator = this.option('showIndicator'); if (!showIndicator) { const aria = this._getAriaAttributes(); - // @ts-expect-error ts-error + + // @ts-expect-error attr should have overload this.$wrapper().attr(aria); } } - _getAriaAttributes() { + _getAriaAttributes(): Record { const { message } = this.option(); + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing const label = message || messageLocalization.format('Loading'); @@ -131,9 +132,8 @@ class LoadPanel extends Overlay { return aria; } - // @ts-expect-error ts-error - _renderContentImpl(): void { - super._renderContentImpl(); + _renderContentImpl(): Promise { + const result = super._renderContentImpl(); this.$content().addClass(LOADPANEL_CONTENT_CLASS); @@ -145,9 +145,11 @@ class LoadPanel extends Overlay { this._cleanPreviousContent(); this._renderLoadIndicator(); this._renderMessage(); + + return result; } - _show() { + _show(): DeferredObj | Promise { const { delay } = this.option(); if (!delay) { @@ -158,8 +160,10 @@ class LoadPanel extends Overlay { const callBase = super._show.bind(this); this._clearShowTimeout(); + + // eslint-disable-next-line no-restricted-globals -- needed for delayed panel show this._showTimeout = setTimeout(() => { - // @ts-expect-error ts-error + // @ts-expect-error done should be typed callBase().done(() => { deferred.resolve(); }); @@ -168,8 +172,9 @@ class LoadPanel extends Overlay { return deferred.promise(); } - _hide() { + _hide(): DeferredObj | Promise { this._clearShowTimeout(); + return super._hide(); } @@ -184,9 +189,12 @@ class LoadPanel extends Overlay { const { message } = this.option(); - if (!message) return; + if (!message) { + return; + } - const $message = $('
').addClass(LOADPANEL_MESSAGE_CLASS) + const $message = $('
') + .addClass(LOADPANEL_MESSAGE_CLASS) .text(message); this._$loadPanelContentWrapper.append($message); @@ -212,7 +220,8 @@ class LoadPanel extends Overlay { _cleanPreviousContent(): void { this.$content().find(`.${LOADPANEL_MESSAGE_CLASS}`).remove(); this.$content().find(`.${LOADPANEL_INDICATOR_CLASS}`).remove(); - delete this._$indicator; + + this._$indicator = undefined; } _togglePaneVisible(): void { From 490970ee009c183f9f83735a5c997166967a8eb1 Mon Sep 17 00:00:00 2001 From: Alyar Date: Thu, 14 Aug 2025 18:50:03 +0400 Subject: [PATCH 010/101] DataGrid: Skip unstable testcafe tests for quick navigation with keyboard (#30728) Co-authored-by: Alyar <> --- .../keyboardNavigation/keyboardNavigation.functional.ts | 8 ++++---- .../keyboardNavigation/keyboardNavigation.visual.ts | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/e2e/testcafe-devextreme/tests/dataGrid/common/keyboardNavigation/keyboardNavigation.functional.ts b/e2e/testcafe-devextreme/tests/dataGrid/common/keyboardNavigation/keyboardNavigation.functional.ts index c66431a78d2f..4914d9836a35 100644 --- a/e2e/testcafe-devextreme/tests/dataGrid/common/keyboardNavigation/keyboardNavigation.functional.ts +++ b/e2e/testcafe-devextreme/tests/dataGrid/common/keyboardNavigation/keyboardNavigation.functional.ts @@ -5514,7 +5514,7 @@ test('Focus events should be called when pressing the Ctrl + End key when virtua })(); }); -test('Focus events should be called when pressing the Ctrl + End key when virtual scrolling and columns are enabled', async (t) => { +test.meta({ unstable: true })('Focus events should be called when pressing the Ctrl + End key when virtual scrolling and columns are enabled', async (t) => { // arrange const dataGrid = new DataGrid('#container'); @@ -5584,7 +5584,7 @@ test('Focus events should be called when pressing the Ctrl + End key when virtua })(); }); -test('Focus events should be called when pressing the Ctrl + End key when rowRenderingMode is \'virtual\'', async (t) => { +test.meta({ unstable: true })('Focus events should be called when pressing the Ctrl + End key when rowRenderingMode is \'virtual\'', async (t) => { // arrange const dataGrid = new DataGrid('#container'); @@ -5653,7 +5653,7 @@ test('Focus events should be called when pressing the Ctrl + End key when rowRen })(); }); -test('Focus events should be called when pressing the Ctrl + End key when infinite scrolling is enabled', async (t) => { +test.meta({ unstable: true })('Focus events should be called when pressing the Ctrl + End key when infinite scrolling is enabled', async (t) => { // arrange const dataGrid = new DataGrid('#container'); @@ -5879,7 +5879,7 @@ test('Focus events should be called when pressing the Ctrl + End key when virtua })(); }); -test('Focus events should be called when pressing the Ctrl + End key when virtual columns, virtual scrolling and focusedRowEnabled are enabled', async (t) => { +test.meta({ unstable: true })('Focus events should be called when pressing the Ctrl + End key when virtual columns, virtual scrolling and focusedRowEnabled are enabled', async (t) => { // arrange const dataGrid = new DataGrid('#container'); diff --git a/e2e/testcafe-devextreme/tests/dataGrid/common/keyboardNavigation/keyboardNavigation.visual.ts b/e2e/testcafe-devextreme/tests/dataGrid/common/keyboardNavigation/keyboardNavigation.visual.ts index 6d370b6a1b9b..f8a879191153 100644 --- a/e2e/testcafe-devextreme/tests/dataGrid/common/keyboardNavigation/keyboardNavigation.visual.ts +++ b/e2e/testcafe-devextreme/tests/dataGrid/common/keyboardNavigation/keyboardNavigation.visual.ts @@ -431,7 +431,7 @@ test('Navigate to first cell in the first row when pressing the Ctrl + Home key' showBorders: true, })); -test('Navigate to last cell in the last row when virtual scrolling is enabled', async (t) => { +test.meta({ unstable: true })('Navigate to last cell in the last row when virtual scrolling is enabled', async (t) => { // arrange const dataGrid = new DataGrid('#container'); const { takeScreenshot, compareResults } = createScreenshotsComparer(t); @@ -496,7 +496,7 @@ test('Navigate to first cell in the first row when virtual scrolling is enabled' }, })); -test('Navigate to last cell in the last row when virtual scrolling and columns are enabled', async (t) => { +test.meta({ unstable: true })('Navigate to last cell in the last row when virtual scrolling and columns are enabled', async (t) => { // arrange const dataGrid = new DataGrid('#container'); const { takeScreenshot, compareResults } = createScreenshotsComparer(t); @@ -568,7 +568,7 @@ test('Navigate to first cell in the first row when virtual scrolling and columns })); [true, false].forEach((useNative) => { - test(`${useNative ? 'Native' : 'Simulated'} scrolling: Focus should be on the first focusable cell when pressing the Ctrl + Home key when row dragging, virtual scrolling and columns are enabled`, async (t) => { + test.meta({ unstable: true })(`${useNative ? 'Native' : 'Simulated'} scrolling: Focus should be on the first focusable cell when pressing the Ctrl + Home key when row dragging, virtual scrolling and columns are enabled`, async (t) => { // arrange const dataGrid = new DataGrid('#container'); const { takeScreenshot, compareResults } = createScreenshotsComparer(t); @@ -612,7 +612,7 @@ test('Navigate to first cell in the first row when virtual scrolling and columns }, })); - test(`${useNative ? 'Native' : 'Simulated'} scrolling: Focus should be on the last focusable cell when pressing the Ctrl + Home key when row dragging, virtual scrolling and columns are enabled`, async (t) => { + test.meta({ unstable: true })(`${useNative ? 'Native' : 'Simulated'} scrolling: Focus should be on the last focusable cell when pressing the Ctrl + Home key when row dragging, virtual scrolling and columns are enabled`, async (t) => { // arrange const dataGrid = new DataGrid('#container'); const { takeScreenshot, compareResults } = createScreenshotsComparer(t); From 19fcfe26515cece3091e063b4a5968ce6799b874 Mon Sep 17 00:00:00 2001 From: Alexander Kozlovskiy Date: Thu, 14 Aug 2025 22:59:33 +0400 Subject: [PATCH 011/101] Calendar: remove m_ frefix (#30764) --- ...endar.base_view.ts => calendar.base_view.ts} | 0 ... => calendar.multiple.selection.strategy.ts} | 6 +++--- ...endar.navigator.ts => calendar.navigator.ts} | 0 ....ts => calendar.range.selection.strategy.ts} | 7 ++++--- ...rategy.ts => calendar.selection.strategy.ts} | 2 +- ...ts => calendar.single.selection.strategy.ts} | 4 ++-- .../ui/calendar/{m_calendar.ts => calendar.ts} | 16 ++++++++-------- .../{m_calendar.views.ts => calendar.views.ts} | 17 +++++++++++++++-- packages/devextreme/js/ui/calendar.js | 2 +- .../testing/helpers/calendarFixtures.js | 2 +- .../calendar.tests.js | 2 +- .../calendarView.markup.tests.js | 4 ++-- .../calendarViews.tests.js | 4 ++-- 13 files changed, 40 insertions(+), 26 deletions(-) rename packages/devextreme/js/__internal/ui/calendar/{m_calendar.base_view.ts => calendar.base_view.ts} (100%) rename packages/devextreme/js/__internal/ui/calendar/{m_calendar.multiple.selection.strategy.ts => calendar.multiple.selection.strategy.ts} (92%) rename packages/devextreme/js/__internal/ui/calendar/{m_calendar.navigator.ts => calendar.navigator.ts} (100%) rename packages/devextreme/js/__internal/ui/calendar/{m_calendar.range.selection.strategy.ts => calendar.range.selection.strategy.ts} (96%) rename packages/devextreme/js/__internal/ui/calendar/{m_calendar.selection.strategy.ts => calendar.selection.strategy.ts} (98%) rename packages/devextreme/js/__internal/ui/calendar/{m_calendar.single.selection.strategy.ts => calendar.single.selection.strategy.ts} (92%) rename packages/devextreme/js/__internal/ui/calendar/{m_calendar.ts => calendar.ts} (99%) rename packages/devextreme/js/__internal/ui/calendar/{m_calendar.views.ts => calendar.views.ts} (92%) diff --git a/packages/devextreme/js/__internal/ui/calendar/m_calendar.base_view.ts b/packages/devextreme/js/__internal/ui/calendar/calendar.base_view.ts similarity index 100% rename from packages/devextreme/js/__internal/ui/calendar/m_calendar.base_view.ts rename to packages/devextreme/js/__internal/ui/calendar/calendar.base_view.ts diff --git a/packages/devextreme/js/__internal/ui/calendar/m_calendar.multiple.selection.strategy.ts b/packages/devextreme/js/__internal/ui/calendar/calendar.multiple.selection.strategy.ts similarity index 92% rename from packages/devextreme/js/__internal/ui/calendar/m_calendar.multiple.selection.strategy.ts rename to packages/devextreme/js/__internal/ui/calendar/calendar.multiple.selection.strategy.ts index 491f87668d3e..d622b5711afa 100644 --- a/packages/devextreme/js/__internal/ui/calendar/m_calendar.multiple.selection.strategy.ts +++ b/packages/devextreme/js/__internal/ui/calendar/calendar.multiple.selection.strategy.ts @@ -1,8 +1,8 @@ import type { DxEvent } from '@js/events'; -import type Calendar from './m_calendar'; -import type { WeekNumberClickEvent } from './m_calendar.base_view'; -import CalendarSelectionStrategy from './m_calendar.selection.strategy'; +import type Calendar from './calendar'; +import type { WeekNumberClickEvent } from './calendar.base_view'; +import CalendarSelectionStrategy from './calendar.selection.strategy'; class CalendarMultiSelectionStrategy extends CalendarSelectionStrategy { constructor(component: Calendar) { diff --git a/packages/devextreme/js/__internal/ui/calendar/m_calendar.navigator.ts b/packages/devextreme/js/__internal/ui/calendar/calendar.navigator.ts similarity index 100% rename from packages/devextreme/js/__internal/ui/calendar/m_calendar.navigator.ts rename to packages/devextreme/js/__internal/ui/calendar/calendar.navigator.ts diff --git a/packages/devextreme/js/__internal/ui/calendar/m_calendar.range.selection.strategy.ts b/packages/devextreme/js/__internal/ui/calendar/calendar.range.selection.strategy.ts similarity index 96% rename from packages/devextreme/js/__internal/ui/calendar/m_calendar.range.selection.strategy.ts rename to packages/devextreme/js/__internal/ui/calendar/calendar.range.selection.strategy.ts index 97270adca7c4..ede782301589 100644 --- a/packages/devextreme/js/__internal/ui/calendar/m_calendar.range.selection.strategy.ts +++ b/packages/devextreme/js/__internal/ui/calendar/calendar.range.selection.strategy.ts @@ -1,9 +1,9 @@ import dateUtils from '@js/core/utils/date'; import type { DxEvent } from '@js/events'; -import type Calendar from './m_calendar'; -import type { CellEvent, WeekNumberClickEvent } from './m_calendar.base_view'; -import CalendarSelectionStrategy from './m_calendar.selection.strategy'; +import type Calendar from './calendar'; +import type { CellEvent, WeekNumberClickEvent } from './calendar.base_view'; +import CalendarSelectionStrategy from './calendar.selection.strategy'; const DAY_INTERVAL = 86400000; @@ -154,6 +154,7 @@ class CalendarRangeSelectionStrategy extends CalendarSelectionStrategy { const rangeStartDate = new Date(Math.max(firstDateInViews.getTime(), startDate.getTime())); const rangeEndDate = new Date(Math.min(lastDateInViews.getTime(), endDate.getTime())); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return return [ ...dateUtils.getDatesOfInterval(rangeStartDate, rangeEndDate, DAY_INTERVAL), rangeEndDate, diff --git a/packages/devextreme/js/__internal/ui/calendar/m_calendar.selection.strategy.ts b/packages/devextreme/js/__internal/ui/calendar/calendar.selection.strategy.ts similarity index 98% rename from packages/devextreme/js/__internal/ui/calendar/m_calendar.selection.strategy.ts rename to packages/devextreme/js/__internal/ui/calendar/calendar.selection.strategy.ts index ccf00ffba9f0..3ab59f1456a6 100644 --- a/packages/devextreme/js/__internal/ui/calendar/m_calendar.selection.strategy.ts +++ b/packages/devextreme/js/__internal/ui/calendar/calendar.selection.strategy.ts @@ -3,7 +3,7 @@ import dateUtils from '@js/core/utils/date'; import { isDefined } from '@js/core/utils/type'; import type { DxEvent } from '@js/events'; -import type Calendar from './m_calendar'; +import type Calendar from './calendar'; class CalendarSelectionStrategy { public NAME!: string; diff --git a/packages/devextreme/js/__internal/ui/calendar/m_calendar.single.selection.strategy.ts b/packages/devextreme/js/__internal/ui/calendar/calendar.single.selection.strategy.ts similarity index 92% rename from packages/devextreme/js/__internal/ui/calendar/m_calendar.single.selection.strategy.ts rename to packages/devextreme/js/__internal/ui/calendar/calendar.single.selection.strategy.ts index 09c8bc75b870..9a3d3873c2a3 100644 --- a/packages/devextreme/js/__internal/ui/calendar/m_calendar.single.selection.strategy.ts +++ b/packages/devextreme/js/__internal/ui/calendar/calendar.single.selection.strategy.ts @@ -1,7 +1,7 @@ import type { DxEvent } from '@js/events'; -import type Calendar from './m_calendar'; -import CalendarSelectionStrategy from './m_calendar.selection.strategy'; +import type Calendar from './calendar'; +import CalendarSelectionStrategy from './calendar.selection.strategy'; class CalendarSingleSelectionStrategy extends CalendarSelectionStrategy { constructor(component: Calendar) { diff --git a/packages/devextreme/js/__internal/ui/calendar/m_calendar.ts b/packages/devextreme/js/__internal/ui/calendar/calendar.ts similarity index 99% rename from packages/devextreme/js/__internal/ui/calendar/m_calendar.ts rename to packages/devextreme/js/__internal/ui/calendar/calendar.ts index 6cacf4a87676..ccd1cec99d41 100644 --- a/packages/devextreme/js/__internal/ui/calendar/m_calendar.ts +++ b/packages/devextreme/js/__internal/ui/calendar/calendar.ts @@ -36,16 +36,16 @@ import type { SwipeEndEvent, SwipeStartEvent, SwipeUpdateEvent } from '@ts/event import Button from '@ts/ui/button/wrapper'; import Editor from '@ts/ui/editor/editor'; -import type { BaseViewProperties, CellEvent } from './m_calendar.base_view'; -import CalendarMultipleSelectionStrategy from './m_calendar.multiple.selection.strategy'; -import type { NavigatorOptions } from './m_calendar.navigator'; -import Navigator from './m_calendar.navigator'; -import CalendarRangeSelectionStrategy from './m_calendar.range.selection.strategy'; -import CalendarSingleSelectionStrategy from './m_calendar.single.selection.strategy'; +import type { BaseViewProperties, CellEvent } from './calendar.base_view'; +import CalendarMultipleSelectionStrategy from './calendar.multiple.selection.strategy'; +import type { NavigatorOptions } from './calendar.navigator'; +import Navigator from './calendar.navigator'; +import CalendarRangeSelectionStrategy from './calendar.range.selection.strategy'; +import CalendarSingleSelectionStrategy from './calendar.single.selection.strategy'; import type { CenturyView, DecadeView, MonthView, MonthViewProperties, YearView, -} from './m_calendar.views'; -import Views from './m_calendar.views'; +} from './calendar.views'; +import Views from './calendar.views'; const CALENDAR_CLASS = 'dx-calendar'; const CALENDAR_BODY_CLASS = 'dx-calendar-body'; diff --git a/packages/devextreme/js/__internal/ui/calendar/m_calendar.views.ts b/packages/devextreme/js/__internal/ui/calendar/calendar.views.ts similarity index 92% rename from packages/devextreme/js/__internal/ui/calendar/m_calendar.views.ts rename to packages/devextreme/js/__internal/ui/calendar/calendar.views.ts index d85d53ba03e6..2f8803b52e83 100644 --- a/packages/devextreme/js/__internal/ui/calendar/m_calendar.views.ts +++ b/packages/devextreme/js/__internal/ui/calendar/calendar.views.ts @@ -9,8 +9,8 @@ import type { CalendarSelectionMode, FirstDayOfWeek, WeekNumberRule, } from '@js/ui/calendar'; -import type { BaseViewProperties } from './m_calendar.base_view'; -import BaseView from './m_calendar.base_view'; +import type { BaseViewProperties } from './calendar.base_view'; +import BaseView from './calendar.base_view'; const CALENDAR_OTHER_MONTH_CLASS = 'dx-calendar-other-month'; const CALENDAR_OTHER_VIEW_CLASS = 'dx-calendar-other-view'; @@ -149,6 +149,7 @@ export class MonthView extends BaseView { const { weekNumberRule = 'auto', firstDayOfWeek } = this.option(); if (weekNumberRule === 'auto') { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return return dateUtils.getWeekNumber( date, firstDayOfWeek, @@ -156,6 +157,7 @@ export class MonthView extends BaseView { ); } + // eslint-disable-next-line @typescript-eslint/no-unsafe-return return dateUtils.getWeekNumber(date, firstDayOfWeek, weekNumberRule); } @@ -168,6 +170,7 @@ export class MonthView extends BaseView { _isTodayCell(cellDate: Date): boolean { const { _todayDate: today } = this.option(); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return return dateUtils.sameDate(cellDate, today()); } @@ -185,10 +188,12 @@ export class MonthView extends BaseView { } _isStartDayOfMonth(cellDate: Date): boolean { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return return dateUtils.sameDate(cellDate, dateUtils.getFirstMonthDate(this.option('date'))); } _isEndDayOfMonth(cellDate: Date): boolean { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return return dateUtils.sameDate(cellDate, dateUtils.getLastMonthDate(this.option('date'))); } @@ -232,6 +237,7 @@ export class MonthView extends BaseView { } isBoundary(date: Date): boolean { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return return dateUtils.sameMonthAndYear(date, this.option('min')) || dateUtils.sameMonthAndYear(date, this.option('max')); } @@ -254,6 +260,7 @@ export class YearView extends BaseView { _isTodayCell(cellDate: Date): boolean { const { _todayDate: today } = this.option(); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return return dateUtils.sameMonthAndYear(cellDate, today()); } @@ -308,6 +315,7 @@ export class YearView extends BaseView { } isBoundary(date: Date): boolean { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return return dateUtils.sameYear(date, this.option('min')) || dateUtils.sameYear(date, this.option('max')); } @@ -322,6 +330,7 @@ export class DecadeView extends BaseView { _isTodayCell(cellDate: Date): boolean { const { _todayDate: today } = this.option(); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return return dateUtils.sameYear(cellDate, today()); } @@ -375,6 +384,7 @@ export class DecadeView extends BaseView { } _isValueOnCurrentView(currentDate: Date, value: Date): boolean { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return return dateUtils.sameDecade(currentDate, value); } @@ -387,6 +397,7 @@ export class DecadeView extends BaseView { } isBoundary(date: Date): boolean { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return return dateUtils.sameDecade(date, this.option('min')) || dateUtils.sameDecade(date, this.option('max')); } @@ -401,6 +412,7 @@ export class CenturyView extends BaseView { _isTodayCell(cellDate: Date): boolean { const { _todayDate: today } = this.option(); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return return dateUtils.sameDecade(cellDate, today()); } @@ -470,6 +482,7 @@ export class CenturyView extends BaseView { } isBoundary(date: Date): boolean { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return return dateUtils.sameCentury(date, this.option('min')) || dateUtils.sameCentury(date, this.option('max')); } diff --git a/packages/devextreme/js/ui/calendar.js b/packages/devextreme/js/ui/calendar.js index 76277ee88ade..e53b45095d72 100644 --- a/packages/devextreme/js/ui/calendar.js +++ b/packages/devextreme/js/ui/calendar.js @@ -1,4 +1,4 @@ -import Calendar from '../__internal/ui/calendar/m_calendar'; +import Calendar from '../__internal/ui/calendar/calendar'; export default Calendar; // STYLE calendar diff --git a/packages/devextreme/testing/helpers/calendarFixtures.js b/packages/devextreme/testing/helpers/calendarFixtures.js index 0f7d9261ea2e..905ee592c731 100644 --- a/packages/devextreme/testing/helpers/calendarFixtures.js +++ b/packages/devextreme/testing/helpers/calendarFixtures.js @@ -1,7 +1,7 @@ import $ from 'jquery'; import { noop } from 'core/utils/common'; import Class from 'core/class'; -import Views from '__internal/ui/calendar/m_calendar.views'; +import Views from '__internal/ui/calendar/calendar.views'; const TEXTEDITOR_INPUT_SELECTOR = '.dx-texteditor-input'; diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/calendar.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/calendar.tests.js index 43bea2f922af..552986e5a668 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/calendar.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/calendar.tests.js @@ -6,7 +6,7 @@ import dateSerialization from 'core/utils/date_serialization'; import { noop } from 'core/utils/common'; import swipeEvents from 'common/core/events/swipe'; import fx from 'common/core/animation/fx'; -import Views from '__internal/ui/calendar/m_calendar.views'; +import Views from '__internal/ui/calendar/calendar.views'; import Calendar from 'ui/calendar'; import pointerMock from '../../helpers/pointerMock.js'; import keyboardMock from '../../helpers/keyboardMock.js'; diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/calendarView.markup.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/calendarView.markup.tests.js index e80fa16e1624..7d0c5fe57b5e 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/calendarView.markup.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/calendarView.markup.tests.js @@ -1,7 +1,7 @@ import $ from 'jquery'; import dateUtils from 'core/utils/date'; -import BaseView from '__internal/ui/calendar/m_calendar.base_view'; -import Views from '__internal/ui/calendar/m_calendar.views'; +import BaseView from '__internal/ui/calendar/calendar.base_view'; +import Views from '__internal/ui/calendar/calendar.views'; import fx from 'common/core/animation/fx'; import dateSerialization from 'core/utils/date_serialization'; diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/calendarViews.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/calendarViews.tests.js index c651dd953a7d..29428c9cd567 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/calendarViews.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/calendarViews.tests.js @@ -1,8 +1,8 @@ import $ from 'jquery'; import { noop } from 'core/utils/common'; import dateUtils from 'core/utils/date'; -import BaseView from '__internal/ui/calendar/m_calendar.base_view'; -import Views from '__internal/ui/calendar/m_calendar.views'; +import BaseView from '__internal/ui/calendar/calendar.base_view'; +import Views from '__internal/ui/calendar/calendar.views'; import pointerMock from '../../helpers/pointerMock.js'; import fx from 'common/core/animation/fx'; import dateSerialization from 'core/utils/date_serialization'; From 7480fd8f27429b4f6d044221558a37d54660d29b Mon Sep 17 00:00:00 2001 From: Andrey Dolzhikov <16618553+Raushen@users.noreply.github.com> Date: Fri, 15 Aug 2025 00:22:32 +0300 Subject: [PATCH 012/101] T1280020 - DataGrid - The 'row' parameter in the FocusedRowChanged event refers to a non-focused row if the grid height is small (#30678) --- .../tests/dataGrid/common/scrolling.ts | 26 +++++++++++++++++++ .../grids/grid_core/focus/m_focus.ts | 23 ++++++++++------ 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/e2e/testcafe-devextreme/tests/dataGrid/common/scrolling.ts b/e2e/testcafe-devextreme/tests/dataGrid/common/scrolling.ts index 2c0acacacb96..8b5ee51c3427 100644 --- a/e2e/testcafe-devextreme/tests/dataGrid/common/scrolling.ts +++ b/e2e/testcafe-devextreme/tests/dataGrid/common/scrolling.ts @@ -1825,6 +1825,32 @@ test('DataGrid - Scrolling position is reset to far right on an attempt to scrol }, })); +// T1280020 +test('DataGrid - The "row" parameter in the FocusedRowChanged event refers to a non-focused row if the grid height is small', async (t) => { + const dataGrid = new DataGrid('#container'); + const otherContainer = Selector('#otherContainer'); + + await dataGrid.apiOption('focusedRowKey', '2'); + await t.expect(otherContainer.innerText).eql('2'); + + await dataGrid.apiOption('focusedRowKey', '0'); + await t.expect(otherContainer.innerText).eql('0'); +}).before(async () => createWidget('dxDataGrid', { + height: 70, + dataSource: [ + { id: '0' }, + { id: '1' }, + { id: '2' }, + ], + scrolling: { mode: 'virtual' }, + keyExpr: 'id', + focusedRowEnabled: true, + onFocusedRowChanged(e) { + const data = e.row?.data; + $('#otherContainer').text(data.id); + }, +})); + [true, false].forEach((nativeScroll) => { type TestCaseWindow = typeof window & { dataGridScrollableEventValues?: number[] }; diff --git a/packages/devextreme/js/__internal/grids/grid_core/focus/m_focus.ts b/packages/devextreme/js/__internal/grids/grid_core/focus/m_focus.ts index 3ddc7c5270e2..f1d5b4e54949 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/focus/m_focus.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/focus/m_focus.ts @@ -1,9 +1,10 @@ /* eslint-disable max-classes-per-file */ import $ from '@js/core/renderer'; import { equalByValue } from '@js/core/utils/common'; -import { Deferred, when } from '@js/core/utils/deferred'; +import { Deferred, type DeferredObj, when } from '@js/core/utils/deferred'; import { each } from '@js/core/utils/iterator'; import { isBoolean, isDefined } from '@js/core/utils/type'; +import type { Key } from '@ts/grids/new/grid_core/data_controller/types'; import type { ColumnsController } from '../columns_controller/m_columns_controller'; import type { DataController } from '../data_controller/m_data_controller'; @@ -53,8 +54,9 @@ export class FocusController extends core.ViewController { return; } - this._focusRowByKey(value); - this.getKeyboardController()._fireFocusedRowChanged(); + this._focusRowByKey(value).done(() => { + this.getKeyboardController()._fireFocusedRowChanged(); + }); args.handled = true; break; @@ -166,12 +168,14 @@ export class FocusController extends core.ViewController { } } - private _focusRowByKey(key) { + private _focusRowByKey( + key: Key, + ): DeferredObj { if (!isDefined(key)) { this._resetFocusedRow(); - } else { - this._navigateToRow(key, true); + return Deferred().resolve(); } + return this._navigateToRow(key, true); } public _resetFocusedRow() { @@ -205,10 +209,13 @@ export class FocusController extends core.ViewController { if (!this.isAutoNavigateToFocusedRow()) { this.option('focusedRowIndex', -1); } - return this._navigateToRow(key); + return this._navigateToRow(key, false); } - public _navigateToRow(key, needFocusRow?) { + public _navigateToRow( + key: Key, + needFocusRow: boolean, + ): DeferredObj { const that = this; const isAutoNavigate = that.isAutoNavigateToFocusedRow(); // @ts-expect-error From 5ce4f556ea14470ded6d441c3de7bde60853c1fd Mon Sep 17 00:00:00 2001 From: AlexKamaev Date: Fri, 15 Aug 2025 12:16:03 +0400 Subject: [PATCH 013/101] DxGantt: fix task progress precision issue after task update (T1303620) (#30760) --- packages/devextreme/js/ui/gantt/ui.gantt.dialogs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devextreme/js/ui/gantt/ui.gantt.dialogs.js b/packages/devextreme/js/ui/gantt/ui.gantt.dialogs.js index 911312d17c85..cf73a79ece52 100644 --- a/packages/devextreme/js/ui/gantt/ui.gantt.dialogs.js +++ b/packages/devextreme/js/ui/gantt/ui.gantt.dialogs.js @@ -256,7 +256,7 @@ class TaskEditDialogInfo extends DialogInfoBase { this._parameters.title = formData.title; this._parameters.start = formData.start; this._parameters.end = formData.end; - this._parameters.progress = formData.progress * 100; + this._parameters.progress = Math.round(formData.progress * 100); this._parameters.assigned = formData.assigned; } isValidated() { From 5c59b4ff88da4ce103716ce4581b1aaa3e2c836c Mon Sep 17 00:00:00 2001 From: Aleksei Semikozov Date: Fri, 15 Aug 2025 16:36:10 +0400 Subject: [PATCH 014/101] Scheduler: Rename observer to scheduler (#30627) --- .../appointments/appointment/m_appointment.ts | 25 +++++++++------- .../appointments/appointment/m_types.ts | 3 +- .../appointments/m_appointment_collection.ts | 17 +++++------ .../base/m_widget_notify_scheduler.ts | 19 ++++++++++++ .../scheduler/base/m_widget_observer.ts | 21 ------------- .../__internal/scheduler/m_publisher_mixin.ts | 16 ---------- .../js/__internal/scheduler/m_scheduler.ts | 18 +++++++---- .../js/__internal/scheduler/m_subscribes.ts | 5 +++- .../scheduler/workspaces/m_work_space.ts | 30 ++++++++++++++++--- .../agenda.tests.js | 4 +-- .../appointment.tests.js | 6 ++-- .../appointments.horizontalStrategy.tests.js | 6 ++-- .../appointments.tests.js | 6 ++-- .../appointments.verticalStrategy.tests.js | 6 ++-- .../integration.base.tests.js | 6 ++-- 15 files changed, 104 insertions(+), 84 deletions(-) create mode 100644 packages/devextreme/js/__internal/scheduler/base/m_widget_notify_scheduler.ts delete mode 100644 packages/devextreme/js/__internal/scheduler/base/m_widget_observer.ts delete mode 100644 packages/devextreme/js/__internal/scheduler/m_publisher_mixin.ts diff --git a/packages/devextreme/js/__internal/scheduler/appointments/appointment/m_appointment.ts b/packages/devextreme/js/__internal/scheduler/appointments/appointment/m_appointment.ts index 0d357306ff4d..77aa6fac3294 100644 --- a/packages/devextreme/js/__internal/scheduler/appointments/appointment/m_appointment.ts +++ b/packages/devextreme/js/__internal/scheduler/appointments/appointment/m_appointment.ts @@ -24,6 +24,7 @@ import { REDUCED_APPOINTMENT_PARTS_CLASSES, } from '../../m_classes'; import { getRecurrenceProcessor } from '../../m_recurrence'; +import type { SubscribeKey, SubscribeMethods } from '../../m_subscribes'; import type { AppointmentDataAccessor } from '../../utils/data_accessor/appointment_data_accessor'; import type { AppointmentProperties } from './m_types'; import { @@ -72,20 +73,24 @@ export class Appointment extends DOMComponent { }); } - notifyObserver(subject, args) { - const observer = this.option('observer'); - if (observer) { - observer.fire(subject, args); - } + notifyObserver( + funcName: Subject, + args: Parameters, + ): void { + this.invoke(funcName, ...args); } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - invoke(funcName: string) { - const observer = this.option('observer'); + invoke( + funcName: Subject, + ...args: Parameters + ): ReturnType | undefined { + const notifyScheduler = this.option('notifyScheduler'); - if (observer) { - return observer.fire.apply(observer, arguments); + if (!notifyScheduler) { + return undefined; } + + return notifyScheduler.invoke(funcName, ...args); } _optionChanged(args) { diff --git a/packages/devextreme/js/__internal/scheduler/appointments/appointment/m_types.ts b/packages/devextreme/js/__internal/scheduler/appointments/appointment/m_types.ts index b48fb8f7decd..42daf2e45316 100644 --- a/packages/devextreme/js/__internal/scheduler/appointments/appointment/m_types.ts +++ b/packages/devextreme/js/__internal/scheduler/appointments/appointment/m_types.ts @@ -1,4 +1,5 @@ import type { Orientation } from '@js/common'; +import type NotifyScheduler from '@ts/scheduler/base/m_widget_notify_scheduler'; import type { TimeZoneCalculator } from '@ts/scheduler/r1/timezone_calculator/calculator'; import type { SafeAppointment } from '@ts/scheduler/types'; import type { AppointmentDataAccessor } from '@ts/scheduler/utils/data_accessor/appointment_data_accessor'; @@ -8,7 +9,7 @@ export interface AppointmentProperties extends Record { data: SafeAppointment; groupIndex?: number; groupTexts: string[]; - observer: any; + notifyScheduler: NotifyScheduler | undefined; geometry: any; direction: Orientation; allowResize: boolean; diff --git a/packages/devextreme/js/__internal/scheduler/appointments/m_appointment_collection.ts b/packages/devextreme/js/__internal/scheduler/appointments/m_appointment_collection.ts index 5781ccd516e2..4497ac044c8d 100644 --- a/packages/devextreme/js/__internal/scheduler/appointments/m_appointment_collection.ts +++ b/packages/devextreme/js/__internal/scheduler/appointments/m_appointment_collection.ts @@ -104,18 +104,17 @@ class SchedulerAppointments extends CollectionWidget { } notifyObserver(subject, args) { - const observer: any = this.option('observer'); - if (observer) { - observer.fire(subject, args); + const notifyScheduler: any = this.option('notifyScheduler'); + if (notifyScheduler) { + notifyScheduler.invoke(subject, args); } } - // eslint-disable-next-line @typescript-eslint/no-unused-vars invoke(funcName: string, ...args) { - const observer: any = this.option('observer'); + const notifyScheduler: any = this.option('notifyScheduler'); - if (observer) { - return observer.fire.apply(observer, arguments); + if (notifyScheduler) { + return notifyScheduler.invoke(funcName, ...args); } } @@ -645,7 +644,7 @@ class SchedulerAppointments extends CollectionWidget { data: settings.itemData, groupIndex: settings.groupIndex, groupTexts: getGroupTexts(groups, groupsLeafs, resourceById, settings.groupIndex), - observer: this.option('observer'), + notifyScheduler: this.option('notifyScheduler'), geometry: settings, direction: settings.direction || 'vertical', allowResize: false, @@ -675,7 +674,7 @@ class SchedulerAppointments extends CollectionWidget { data: settings.itemData, groupIndex: settings.groupIndex, groupTexts: getGroupTexts(groups, groupsLeafs, resourceById, settings.groupIndex), - observer: this.option('observer'), + notifyScheduler: this.option('notifyScheduler'), geometry: settings, direction: settings.direction || 'vertical', allowResize, diff --git a/packages/devextreme/js/__internal/scheduler/base/m_widget_notify_scheduler.ts b/packages/devextreme/js/__internal/scheduler/base/m_widget_notify_scheduler.ts new file mode 100644 index 000000000000..8312f57b98ef --- /dev/null +++ b/packages/devextreme/js/__internal/scheduler/base/m_widget_notify_scheduler.ts @@ -0,0 +1,19 @@ +import type Scheduler from '../m_scheduler'; +import type { SubscribeKey, SubscribeMethods } from '../m_subscribes'; + +class NotifyScheduler { + scheduler: Scheduler; + + constructor({ scheduler }: { scheduler: Scheduler }) { + this.scheduler = scheduler; + } + + invoke( + funcName: Subject, + ...args: Parameters + ): ReturnType { + return this.scheduler.fire(funcName, ...args); + } +} + +export default NotifyScheduler; diff --git a/packages/devextreme/js/__internal/scheduler/base/m_widget_observer.ts b/packages/devextreme/js/__internal/scheduler/base/m_widget_observer.ts deleted file mode 100644 index 4a79561d25f4..000000000000 --- a/packages/devextreme/js/__internal/scheduler/base/m_widget_observer.ts +++ /dev/null @@ -1,21 +0,0 @@ -import Widget from '@js/ui/widget/ui.widget'; - -class WidgetObserver extends Widget { - notifyObserver(subject, args) { - const observer = this.option('observer') as any; - - if (observer) { - observer.fire(subject, args); - } - } - - invoke() { - const observer = this.option('observer') as any; - - if (observer) { - return observer.fire.apply(observer, arguments); - } - } -} - -export default WidgetObserver; diff --git a/packages/devextreme/js/__internal/scheduler/m_publisher_mixin.ts b/packages/devextreme/js/__internal/scheduler/m_publisher_mixin.ts deleted file mode 100644 index 10c67212df1b..000000000000 --- a/packages/devextreme/js/__internal/scheduler/m_publisher_mixin.ts +++ /dev/null @@ -1,16 +0,0 @@ -const publisherMixin = { - notifyObserver(subject, args) { - const observer = this.option('observer'); - if (observer) { - observer.fire(subject, args); - } - }, - invoke() { - const observer = this.option('observer'); - - if (observer) { - return observer.fire.apply(observer, arguments); - } - }, -}; -export default publisherMixin; diff --git a/packages/devextreme/js/__internal/scheduler/m_scheduler.ts b/packages/devextreme/js/__internal/scheduler/m_scheduler.ts index 19b32dc748d5..68e1a2cb56f1 100644 --- a/packages/devextreme/js/__internal/scheduler/m_scheduler.ts +++ b/packages/devextreme/js/__internal/scheduler/m_scheduler.ts @@ -37,12 +37,14 @@ import { getA11yStatusText } from './a11y_status/a11y_status_text'; import { AppointmentForm } from './appointment_popup/m_form'; import { ACTION_TO_APPOINTMENT, AppointmentPopup } from './appointment_popup/m_popup'; import AppointmentCollection from './appointments/m_appointment_collection'; +import NotifyScheduler from './base/m_widget_notify_scheduler'; import { SchedulerHeader } from './header/m_header'; import type { HeaderOptions } from './header/types'; import { CompactAppointmentsHelper } from './m_compact_appointments_helper'; import { AppointmentTooltipInfo } from './m_data_structures'; import { hide as hideLoading, show as showLoading } from './m_loading'; import { getRecurrenceProcessor } from './m_recurrence'; +import type { SubscribeKey, SubscribeMethods } from './m_subscribes'; import subscribes from './m_subscribes'; import { utils } from './m_utils'; import timeZoneUtils, { type TimezoneLabel } from './m_utils_time_zone'; @@ -196,6 +198,8 @@ class Scheduler extends SchedulerOptionsBaseWidget { _subscribes: any; + _notifyScheduler!: NotifyScheduler; + _recurrenceDialog: any; _layoutManager!: AppointmentLayoutManager; @@ -742,6 +746,8 @@ class Scheduler extends SchedulerOptionsBaseWidget { this._subscribes = subscribes; this.resourceManager = new ResourceManager(this.option('resources')); + + this._notifyScheduler = new NotifyScheduler({ scheduler: this }); } createAppointmentDataProvider() { @@ -1230,7 +1236,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { getAppointmentDataProvider: () => this.appointmentDataProvider, dataAccessors: this._dataAccessors, - observer: this, + notifyScheduler: this._notifyScheduler, onItemRendered: this._getAppointmentRenderedAction(), onItemClick: this._createActionByOption('onAppointmentClick'), onItemContextMenu: this._createActionByOption('onAppointmentContextMenu'), @@ -1370,7 +1376,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { renovateRender: this._isRenovatedRender(isVirtualScrolling), }, currentViewOptions); - result.observer = this; + result.notifyScheduler = this._notifyScheduler; result.groups = groupsResources; result.onCellClick = this._createActionByOption('onCellClick'); result.onCellContextMenu = this._createActionByOption('onCellContextMenu'); @@ -1713,15 +1719,17 @@ class Scheduler extends SchedulerOptionsBaseWidget { this._subscribes[subject] = subscribes[subject] = action; } - fire(subject) { + fire( + subject: Subject, + ...args: Parameters + ): ReturnType { const callback = this._subscribes[subject]; - const args = Array.prototype.slice.call(arguments); if (!isFunction(callback)) { throw errors.Error('E1031', subject); } - return callback.apply(this, args.slice(1)); + return callback.call(this, ...args); } getTargetCellData() { diff --git a/packages/devextreme/js/__internal/scheduler/m_subscribes.ts b/packages/devextreme/js/__internal/scheduler/m_subscribes.ts index 2b2020c5e662..0a48557989ce 100644 --- a/packages/devextreme/js/__internal/scheduler/m_subscribes.ts +++ b/packages/devextreme/js/__internal/scheduler/m_subscribes.ts @@ -316,5 +316,8 @@ const subscribes = { removeDroppableCellClass() { this._workSpace.removeDroppableCellClass(); }, -}; +} as const; + export default subscribes; +export type SubscribeMethods = typeof subscribes; +export type SubscribeKey = keyof typeof subscribes; diff --git a/packages/devextreme/js/__internal/scheduler/workspaces/m_work_space.ts b/packages/devextreme/js/__internal/scheduler/workspaces/m_work_space.ts index a72a12c552c2..2c3fbad6ec93 100644 --- a/packages/devextreme/js/__internal/scheduler/workspaces/m_work_space.ts +++ b/packages/devextreme/js/__internal/scheduler/workspaces/m_work_space.ts @@ -31,6 +31,7 @@ import { getWindow, hasWindow } from '@js/core/utils/window'; import type { dxSchedulerOptions } from '@js/ui/scheduler'; import Scrollable from '@js/ui/scroll_view/ui.scrollable'; import errors from '@js/ui/widget/ui.errors'; +import Widget from '@js/ui/widget/ui.widget'; import { getMemoizeScrollTo } from '@ts/core/utils/scroll'; import { AllDayPanelTitleComponent, @@ -51,7 +52,7 @@ import { } from '@ts/scheduler/r1/utils/index'; import type { SafeAppointment, ViewType } from '@ts/scheduler/types'; -import WidgetObserver from '../base/m_widget_observer'; +import type NotifyScheduler from '../base/m_widget_notify_scheduler'; import { APPOINTMENT_SETTINGS_KEY } from '../constants'; import { Cache } from '../global_cache'; import AppointmentDragBehavior from '../m_appointment_drag_behavior'; @@ -66,6 +67,7 @@ import { VERTICAL_GROUP_COUNT_CLASSES, VIRTUAL_CELL_CLASS, } from '../m_classes'; +import type { SubscribeKey, SubscribeMethods } from '../m_subscribes'; import tableCreatorModule from '../m_table_creator'; import { utils } from '../m_utils'; import VerticalShader from '../shaders/m_current_time_shader_vertical'; @@ -109,8 +111,8 @@ const { tableCreator } = tableCreatorModule; // The constant is needed so that the dragging is not sharp. To prevent small twitches const DRAGGING_MOUSE_FAULT = 10; -// @ts-expect-error -const { abstract } = WidgetObserver; +// @ts-expect-error Widget exposes a static abstract() helper not typed in its d.ts +const { abstract } = Widget; const toMs = dateUtils.dateToMilliseconds; const COMPONENT_CLASS = 'dx-scheduler-work-space'; @@ -202,7 +204,7 @@ type WorkspaceOptionsInternal = Omit & { startDayHour: number; endDayHour: number; }; -class SchedulerWorkSpace extends WidgetObserver { +class SchedulerWorkSpace extends Widget { _viewDataProvider: any; _cache: any; @@ -393,6 +395,26 @@ class SchedulerWorkSpace extends WidgetObserver { return this.option('draggingMode') === 'default'; } + notifyObserver( + funcName: Subject, + args: Parameters, + ): void { + this.invoke(funcName, ...args); + } + + invoke( + funcName: Subject, + ...args: Parameters + ): ReturnType | undefined { + const notifyScheduler = this.option('notifyScheduler') as NotifyScheduler | undefined; + + if (!notifyScheduler) { + return undefined; + } + + return notifyScheduler.invoke(funcName, ...args); + } + _supportedKeys() { const clickHandler = function (e) { e.preventDefault(); diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/agenda.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/agenda.tests.js index a54b7e8368b5..f267c419505e 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/agenda.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/agenda.tests.js @@ -37,8 +37,8 @@ module('Agenda', {}, () => { onContentReady: e => { e.component.onDataSourceChanged(rows); }, - observer: { - fire: (functionName) => { + notifyScheduler: { + invoke: (functionName) => { if(functionName === 'getLayoutManager') { return { getRenderingStrategyInstance: () => { diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.tests.js index 6663496791bb..58c09313bef4 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.tests.js @@ -16,8 +16,8 @@ testStart(function() { }); const createInstance = () => { - const observer = { - fire: (command) => { + const notifyScheduler = { + invoke: (command) => { switch(command) { case 'getCellHeight': return CELL_HEIGHT; @@ -32,7 +32,7 @@ const createInstance = () => { }; return $('#scheduler-appointment').dxSchedulerAppointment({ - observer, + notifyScheduler, getAppointmentColor: () => new Deferred(), dataAccessors: { get(prop, obj) { diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.horizontalStrategy.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.horizontalStrategy.tests.js index 6fb0e3aba822..3d6ed37baa4b 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.horizontalStrategy.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.horizontalStrategy.tests.js @@ -18,8 +18,8 @@ testStart(function() { }); const createInstance = (options = {}) => { - const createObserver = (renderingStrategy) => ({ - fire: (command, field, obj, value) => { + const createMockScheduler = (renderingStrategy) => ({ + invoke: (command, field, obj, value) => { switch(command) { case 'getEndDayHour': if(renderingStrategy === 'horizontalMonthLine') { @@ -48,7 +48,7 @@ const createInstance = (options = {}) => { }); return $('#scheduler-appointments').dxSchedulerAppointments({ - observer: createObserver(options.renderingStrategy), + notifyScheduler: createMockScheduler(options.renderingStrategy), ...options, dataAccessors: mockDataAccessor, getResources: () => [], diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.tests.js index 94f5f45b4db0..785fd2027ac3 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.tests.js @@ -84,8 +84,8 @@ const createInstance = (options, subscribesConfig) => { subscribesConfig.cellHeight, ); - const observer = { - fire: function(subject) { + const notifyScheduler = { + invoke: function(subject) { const callback = subscribes[subject]; const args = Array.prototype.slice.call(arguments); @@ -94,7 +94,7 @@ const createInstance = (options, subscribesConfig) => { }; const instance = $('#scheduler-appointments').dxSchedulerAppointments({ - observer, + notifyScheduler, ...options, timeZoneCalculator: createTimeZoneCalculator(), getLoadedResources: () => [], diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.verticalStrategy.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.verticalStrategy.tests.js index 99d16ede49d1..3095dac93ee7 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.verticalStrategy.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.verticalStrategy.tests.js @@ -16,8 +16,8 @@ testStart(function() { }); const createInstance = (options) => { - const observer = { - fire: (command, field, obj, value) => { + const notifyScheduler = { + invoke: (command, field, obj, value) => { switch(command) { case 'getAppointmentGeometry': return { @@ -34,7 +34,7 @@ const createInstance = (options) => { }; return $('#scheduler-appointments').dxSchedulerAppointments({ - observer, + notifyScheduler, ...options, dataAccessors: mockDataAccessor, getLoadedResources: () => [], diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.base.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.base.tests.js index b1e7835a6d71..2c67f0e973ad 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.base.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.base.tests.js @@ -172,11 +172,11 @@ QUnit.test('Scheduler should handle events from units', async function(assert) { this.instance.subscribe('testFunction', spy); - const observer = unit.option('observer'); + const notifyScheduler = unit.option('notifyScheduler'); - assert.equal(observer, this.instance, 'observer is instance of scheduler'); + assert.equal(notifyScheduler.scheduler, this.instance, 'notifyScheduler is instance of scheduler'); - unit.notifyObserver('testFunction', { a: 1 }); + unit.invoke('testFunction', { a: 1 }); assert.ok(spy.calledOnce, 'testFunction called once'); assert.deepEqual(spy.getCall(0).args[0], { a: 1 }, 'testFunction has right args'); From 2633195b92e2aef27435361f875ae3c60f99b01d Mon Sep 17 00:00:00 2001 From: Alexander Kozlovskiy Date: Fri, 15 Aug 2025 16:41:18 +0400 Subject: [PATCH 015/101] FileUploader: no error should be thrown on drag to custom dropZone specified as a string --- .../js/__internal/ui/file_uploader.ts | 14 +++++--------- .../fileUploader.tests.js | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/packages/devextreme/js/__internal/ui/file_uploader.ts b/packages/devextreme/js/__internal/ui/file_uploader.ts index af993dd5b144..3f255e009c8e 100644 --- a/packages/devextreme/js/__internal/ui/file_uploader.ts +++ b/packages/devextreme/js/__internal/ui/file_uploader.ts @@ -1747,20 +1747,16 @@ class FileUploader extends Editor { _getDropZoneElement(isCustomTarget: boolean, e: DxEvent): Element | undefined { if (!e.currentTarget) { - return; + return undefined; } const { dropZone } = this.option(); - // @ts-expect-error dropZone option public type: it can be an array of Elements or NodeList - const targetList = isCustomTarget ? Array.from(dropZone) : [this._$inputWrapper]; - - const targetListElements = targetList.map( - (element: dxElementWrapper | string) => $(element).get(0), - ); + const targetList = isCustomTarget ? $(dropZone).toArray() : [this._$inputWrapper]; + const targetListElements = targetList.map((element) => $(element).get(0)); + const currentTargetIndex = targetListElements.indexOf(e.currentTarget); - // eslint-disable-next-line consistent-return - return targetListElements[targetListElements.indexOf(e.currentTarget)]; + return targetListElements[currentTargetIndex]; } // eslint-disable-next-line @typescript-eslint/no-invalid-void-type, consistent-return diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/fileUploader.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/fileUploader.tests.js index 5c2579611920..aa370900dc19 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/fileUploader.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/fileUploader.tests.js @@ -3901,6 +3901,25 @@ QUnit.module('Drag and drop', moduleConfig, () => { assert.notOk(onDropZoneLeaveSpy.called); }); + QUnit.test('dropZoneEnter should not cause an error if custom dropZone is specified as string', function(assert) { + const customDropZone = $('
').addClass('drop').appendTo('#qunit-fixture'); + const onDropZoneEnterSpy = sinon.spy(); + + $('#fileuploader').dxFileUploader({ + uploadMode: 'useButtons', + dropZone: '.drop', + onDropZoneEnter: onDropZoneEnterSpy + }); + + try { + triggerDragEvent(customDropZone, 'dragenter'); + + assert.ok(true, 'No error is thrown'); + } catch(error) { + assert.ok(false, `Error is thrown: ${error}`); + } + }); + QUnit.test('onValueChanged event should not fire if dragged item is not file', function(assert) { const onValueChangedSpy = sinon.spy(); From efd863e54098ec392b63557a65d716a646282776 Mon Sep 17 00:00:00 2001 From: Vladimir Bushmanov Date: Mon, 18 Aug 2025 15:27:53 +0500 Subject: [PATCH 016/101] Scheduler: fix screenshots after view model refactoring (#30788) Co-authored-by: Vladimir Bushmanov --- ..._contextMenu_click (fluent.blue.light).png | Bin 85400 -> 83293 bytes ...ontextMenu_click (material.blue.light).png | Bin 76468 -> 74072 bytes .../etalons/scheduler_contextMenu_click.png | Bin 74533 -> 73033 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/demos/testing/widgets/scheduler/etalons/scheduler_contextMenu_click (fluent.blue.light).png b/apps/demos/testing/widgets/scheduler/etalons/scheduler_contextMenu_click (fluent.blue.light).png index a13ce337558af749f37bf8acd96733980d171809..79837dce07d6a9156b3e517afa21fb2858b8fbb6 100644 GIT binary patch literal 83293 zcmcG$1z1&EyDu)%ol?>%9U`HGlG3F}Nl7Y_(kb02jg*w2bO|b*5(0{X2ndUmZl(FZ zbAS8Xd%knN^S|f0&$*8eZe44xx#k$-9lv^qJ5ozSi4cz#@4|%(gvz(&buL^$ce`-m zqCO55ywasQU4H5==7r}Xp?QtWTMfSNuT$eFvK6qEN;rw zOu0o@H0Njrcc8Rzm_tZp;kRLS!oUAS^1krj{v=y3@{e~(WPhcE{dFDuHudG-{*-G( zi+mRO>l0PEf4h|f&AX@gRQybTe{{A&`-A&q|M=%Jtrk`P>%}3fI>UFQ|8w7I_ix`m z%=bTd(>u3RxJ-Pv72ZCc=+3cQ9W7JKk)|)C_GP^(ia$4L@#g^O$m@5@)(Q?-JXF5PrON%7?t^K&Hg$0YI^dZ}j^fB*w+1}oh>YAF!`1mFF0&N9x zIwHk*hS*+97A`K_;I>xNHZ#FzNl78SmKJ-zKEu0b_Q}b~yv7YAXc=OT99&$Hy@{N= z`(vgfEdc>!9nr-{7U_@iQoQR6QA{K+1@K$ ziZRqriy9jxv%MB+y#H*(_NNIw(0^-BqZH4;e*OB3WS)CF@c}2n@Ri0U-plMi>K%uc zM~ZN9adV-*8c%lmLqbDQ!Y=c-Q+N%6V6u&Hh>2}Z4z?SVB za-OA;b-l{})H{rbKFY}4oEfHKe(=U-=LoUPNh=hpqM{;}xw-k?%C~6cL=M!#Lf7Ow zSFS5pn8d}?PLKa2rl$4;6H9-b?@csl^c31`KIVV%s_OBC=-;cQ9X8H-8UXbke?QH#QoApR+2>KDoaA`**h$JV~ixT@=)rQ<)NjSBQ4LB1+HDP{r9< z==t;K^Yimg3w@U?EG(SxadDZ2g%cP9PM$|Z;QaJIe%#*P?)1TPn+2|Gpp)^>OiQDd ztb6z^3N9i23(vQw0qibwYGg9;@Zi^%8P$KOdZ2W2dg|QY+iU){Set-WB!bcZ;HlWO zZz3Q_kX3&Q3K=W_<*(sf^vhxnmgCh{jemanWJ-D^bau+W_t+fFkC*Ptmhy2rKG_}e z0wnz25+DJ72J60j`6BMRNT6G!(Pb}6PD$B)ust{4v{=$yn zs?qt`X=Genx25p5Pm)gK-WS!*?(Q$mem=;G;t~;c>)yVNb9i`Yyb5Dkgu;gUB~67L z8x$P8O+iK`>+di9*S?u;u@O#hSjzVKUTKc*a9Py;Wx)BFr(uh~)aTEi3Fxm=FfuX% zsCUZ|OLfA$JJsm(vazwve5o{-dvmWs12)x|>)3q{Qbxx3aeM35K(zU#C08g32g|`s ziG~b+;%e0KB*a6}WxWxU>z@zSMBot>RdWs{S}#sk(@(a_Ku4vvmy$tWqqG63RWB^wl! zl;#$fmX!4MsU;*Nj2k^kVcKCK-;DyUN5;l>v2$}rUFPE9dC-@{Wocux3lF{nQ%+5Q zB}oq(398O|C|mu5`+5UIAq7@2+FzCJ?7Fu(or4T^d#)!jD@)zm`#M4yyNjP1vH+Z6 zo6o+6G57)rHGC`9M%RSpHE!}wUX27O{WLwzm|9&e?9gc@xHS}TmI$!8JD;dItJCD| zhOkhZ*-LI=9n6En!z%l6VW{j5fGuSe711-y2~CnRJS5Fpn4`|ZCc?8(MtdO`vjB0SDck72~b($dl= zq(tH9VnFUK9WWI+!qfx<=~u%MK#pW zbaf@%*QjjTPFEuiDx9IhAC8tP!@!}aGOxSg zX&M+9oMiU{9f@SalUM5Vp4^2= zsIeKc2AYDBd?Oso-3fB8P&F0NXSH@CS}NN%Ix0ese~7>))PMhk>*vp(C*M}SmGu1j zobNRkE9Ug*+nY=3FGQF@Abt6w10v6$+7h?P=MM)H(}h&n`XH4$fGU?K-(5u{T&?|h z0w6h3^nf8>p*7geQSKyy#iHX4@%LSS_(iE32Jx@yN1X1(7+6o_0a|q)8 zJ(DzoW*2}k3TkVUL?8cfD#K>*3>+9x8!a`E1BuiV&u9a>iGW%#P^NuoD896m7gk#k)}M zBZaC|Y8>PMS8D0Pn3|_Y`*X?nOkkREHKVBntl^uVtpB)VYHE7jeeGkOLiB+qXnH}A zJ0=0AZh-Of02p4YW%XOTyB+L+-XEq0L6LI_2o%|kyz<@qtd#c28a86Xb3UWD&z?WO zHCBFqdvB|Q_^Ruo8loRz0BNB7L9o?2PGDz7qhovyO;C@-|E&qwf}) z>(ZcASJWj$Rw0n(zW(DMcFO_5DKZ8I4O!WXErlRlc@3&VV01uzbWqlVK#0id2FL>$ zc`c^f+`fH#2Fi8G{ehD>UDUKQsvVP;692CSfZxuH^-7X|)IHku`M>ge|8Kn4f8Wr7 zvwT>`^0(d0TM^p926*UP?|4{eQKe5(k6rRDs>|ZmBm-0|Wi+PqYK>vpUl+9fiwnf^ z{xQLDxBpx7+Y9nUzsdU=D7ROYmCphLF93od=niEpH+g-d<=lVG{f1-HKBanw=z<|= z94n}}THDV-Vn036b4}&K2v9o<{U_N0r>my&3JT17>oaY^ja%*by!w@apvfhr_P^>H zH#j}5do(u71yU0rHmxYf|HbjfhxqeOkXUI_KBA_++nBd*-HMRuL7W?+y*8oX%|S~J zWZg)GE&bDTjxfX@04xqL$wexWLp=|e=OhJ$t3}QDZQ!h5N`{8CCHE>8_m)Q}C@INE zNN%dB5r8i&GN`eRFbaO2apl^zWG>xT&z?PN{rXxL7Y~mGfb?#Oo{-%awiN#RDox(| zB=tnFlYq(We$;Y}{iu3?4LFB$ngN>@7$mj5T^0dbEMf+=iMNlPOH7)s%btUIiT!NL z#?BrJ!<|%7Rh97CVFPg2FVlmvbpV^v#m>)9lq-Njp$2kf80(XgD5Q_quD(*wPy}_w z58n`BG_*Eev%R}JX9%i(^&Qv-D1Dq$fO0F)3!sz)-B#`d1qFTl^vUYmo4aZ+L?RJv zt}u~0D~92H&XvOkOCMTn7&9rqI#$tRQH6Y9lJ?rePI`|?MEi*YApw8Dni{^f@7# zc81u%X{HtJ{gdUO3E)*Za1jx4aU86y=$b}v?aiU&p-|BR0s=M~cQv}>88wmRLB}SV z2eGyY*uD0%DFd{HVco+nh&^x!2^H?B7inZ!fSKgI|2~OB{l$!^MJEp2znxrD@+o5S zHyd|}UcY{g6eKoWFnV6U;2iTu3Y=wu+72*~oe}8{Kz#vIoUr@jXhQn(q%Y)=-8!{eYcx)m@X*CrU zJXou_obwY-(TrHQDnvRdHB}chKpk)pqu(BBHnIfRjJ`KPio%wN?rH}C5E&iav9R%B zv)k(IuSXVB~`Av+Cj04i;vGm>2L{A9OrckqVD;~z<{b&FhnuNlaH z8-DxP2rjX+vuh|UC>VZomj_W$pgxwL{1rfz8^4od9ibJJ* zepiANokaGssN>H8s7tRuQy!6#k>4N4LVMpdQG^EAE5CEdcLp6d90-ZIp zGj5af85RdTO0a6ybvMtG?VfZoM}`O8G0gDA^YfP1JvP)fe>OS8$`XO_Hiw`m;tijG zKs zJjzb{pB>sXHZ>s*z~RL!Wa40cN$&=~vICR|1B@{S+6PaU3;PEWgq6`URha8o+G{L8 zk=?PE$*HL!5}pS@ilLJr)2ynhYOu7lB%z}lK zX6A;Zloa6Iz~Ojixv(uGgj0d2o$MfblsyLx*o`D(z#|ea^EgUzbmpJ)6iW50f43!T=QWMKUw*Tn+jUqdLXUs#%5y&1cnD5 zz&9>@g%o)!I5;>j0R${aQ95{uy&;_NqiScz<$yS3Rj$zCdO&hW zwGoGy&CSCDIg7#_df47;6ZP>BaOmjh*p64TE9R4?g3p2ov=2g5;Nt}(LMtpSB`6x{ zg}`k90`mqvU^}Fox_WxBHP6n@BHj#v_@B;8lKs^WPr3Ey&ypdS#Rg0a3?>Ic*o`oh zNWf840^AlHr6=HU8dNiQKZMz#;6XnLkU+ek69qHLwAc1g9bh=Tr9}qr?im#u%PuXQ z4TVO9@BneSFHyS;mpay6CDzQQNFOW6#mK%IA*5Tp?>bKg%JP`?C2~` zhdjy*L|{IfO+9rY>T-AJA$adv00^VI;T{9K97TEga{p>Yi-xr|2f#vSR~Kq_bu~IQ zl?wO}aY@EJY-|_+UdDjs+4iEBXGibo>4g=0gH(tcw^y9}0qz|J-UAr~Qa|9HUAJa# z88;s;UWVC5ToCy3hWW)smOZ&Sj^3dmn~%?!k%;gSSD|>onPhHmZUdm0G2Ge#383D& zVCHHhRI6-@jjhtAQOdvkZ|B&M7_)POEhdY8hP6 zEu8J8{(m_*0Qi%W6WD}pk3mv3Tq)ctNRquHMJuKZssob7*+flg^R^(&wds}|a!!p( zk4+QAv_cSsm?i#e55F=A3O<7w(KRrL{AB&0H-R0nhh?u9eEWxu_tD@z$;ikWvfF~O zT|x994%NYdAGAp0;bKNDxERg*o-VEv7fK;>nUdars#LmYT z3nK?`@A_W#zyQ*ZyoW&e4~~DY9~>ME*V^e$LPT3^RL>70D%Wjw)YHdjPSo-v$?x@v z9-ACLMLj*r<>lpp46%5i71&ons-R;KLWO?HBIsVlajVU z69Y-;HHyfo)JHt`zuiN$L%M`32N>OVEbhQp^n$u zk$X%!V`oDQ=7kESI#{b2LQ)W1z(9p)N~Bi>XxINBUP=)<7>ERgFb|>tLCF09w?m=Z z_iGHwtM}w^7bzy_RsrXIF1aUwWWpq~Lt=0tqNZSI5C`TJ7vt27t3d+owO%)7JMor} zAK=w;Yo@Icgae{{VWqEv-xw{w-wz8O_R0<-W?}p9f_i0!UC?1c*v`6!M*A8y9Z~qK z2O_egyMh}0{^5{jf1A}ALPs!SBKX_GE@-cR?tTU@EOYM_cC7euPm@A&uL+BkV|Ti|dG5}#F= zYP!3NK7INWvaDpt|K{?NkQOpmbnW-5rvNA0}oM`wa3xFkMaZbZ;anIe8l>sv3HM@HOH6ATQtf z9tuM*5$BW#B4&s)5&bB6^eZ3w14yGB6sFym0$j+qQ6QXVz+YKIH|y^=;Te(Um8_|X zii#&-$}+UT;-!zSjE|4=nl@){Z8^OVv1^B^MA~+&iZM*QyfL7UwtG2qv}&x?AC8sB z4kO|bws=njDJw#1;N!vC#DgMwAe!OK1HFolFhT%x);%66sVo3?A#jO6fRK=*Km$HF z+FOR~5CRY6yP>Jsr9L7OBK;T?SWduMIyC=4a0Jnn8M$nvft1^o-mB2fD#$VPIpAfH;?xlLJ@ZHUdW^>_$szI1+JlP5;ZQ z3L#B?_KXC2Y6x3FBN+%dMA{FS5S$t|C>?NV=vV|09D+BC)roR!J`4j`)oJnfV_{*T z1_YN2CsO#O3H%O3OF$?73|gm%s0Twd4t+}%E>Idc|F|_gIrR3RS%`=@96xXW(g1e{sS5cBavT7hksC6%i2H7~on&+W zkOeoCgqR7@v$LZQ0ChmbCH7jjJJjzQ5z&d?gvo^_7S3ta#5x9u=Uz);^ZJSHS^yLd z&FleSK(E!gKiCu zr&A6~aAraNSA2I)tC=8^10&ezM}E7X#O$ZuCnI4Q47RfjdSNrmU}qMSi75S#+T>bmlk>#q;IOp@hNfaC#* zRoU1=kaQPR>x`2)M5^%VA~-VgrOZgIv9XclDBn2|fCH30VjTEE891+kS^~i?Ic_fs zu|PHgO3=Ln&?o>2f#WCqPwxWs!AX$<$baP(6?djQrkVG8>_s2cjBi=ij0$hK>36BAq8g%UUF$Dr)M2*4-G$J;CewBN%$TJf}HGFfM^i$+i+e2Dg`3%1|U*xfZvd2IEPRT zdI5qpHHcV2T_J}`Kun|HDSLq&aPaZ-0gyAL{a!$@xC0c!x>p2lrSbIl1cCs-u?Qsq zJKB!CB7`FY5aP_*q1r={jygo|EdM`OgF{D-J|V3Ev(^hxvdEzZFr;u_>RcJ9WNS#5 zLc+s=CXqXI*s<0^Kw;$Q3}_2qU*GQy&a4n8K)e#t{9n$QCIBKUFE2r^siH$3 zBKe_9vIFOR=HPS|;3)!|{Lr6-<^l>SGe8;SgaK$NrC;%|f-r}3B^AvUfb$_CA%eEU zOtd1lfvOK5as!gUSu7mQYmY|fp)8bsMgP~A=ScfOgBX&;5Qs#8xM)OdNdWADP{3hB z%D@3i?Bv9ETG*wNA{OyJcHB~s2qsE!3NWc+JD?abvUm=6a!ply%I><-Re-Twhi0L42apo5u;`yrP=r`!#Y6$Iz0)2&3DUoDGk-zdjDnc&{_?jo4lHa2+tUtK_lY zN%wxM)>Z2I*%GeI=DmxD>>mJ4Kg}q`K18=QKF#s;31tmwXtF!G6?YAr>)4D69s$Si z*Wr|oo)tYxF_UWN3cLvKIUh?b;SQRlE5U=vGG;UA4aV&!Pu_MmpyjMqa_u_1c3$yK z4%MTHdMKT@^1K_;AyF;q+O~)9BoG<=&bcEqJmJX=CT_cFhm?d!qQA zSd+ttEONF4DpOH9de1wEM+fIq*JOWnJe|@Y3r~K)qjSPg^j^jNa}k}ihnOr*?l$(_ zwNsj0fz5iFzDGqK)f=+30rFixbDaD6Ou~m#Un?t0dwoc7e0yg{$@nejoJFl^;95S; zDGu?lr{hhgKLR{6@(!2*A0yowJahUK7RE`ANEgXlFPC8n&xgk!z7r3>%w6(www1=% zCHh`|vHUNk@D19>*Qq^G+jwiDU9sQkIl1^%6>yw=uI^w<2vD-T$zCf7EtL#N8+qGr z%*(TA=x_4#Wc^oBEzujfjzA~>_+1NT{!85WMcfK^r0(%^C$v0q*`QK5v+Anz^(7q0 zFjnqZq;*@RIgnzH(`}$$ACGvm+$w?HTSQ;5aL0^C7m~(bEscR!heBQDLJb-`@AE3& zQJ0xF8h2Y3k)gEG)j`b|;!(TX(!9nUa%CNqyrC8QWyck6lEIgpDOGs;+(6r)_gu4E zxog6eCtY&vW2`Y>{Y7RRW(QNnvtlyryobs>C&^V@C0@C`Qj&DzDTe;HJh{twZNBGP zP12Al*K#G*wwv0~=;I3ncRO-B&&(DOXzv%C&(GJrPL@3K5b%~RCe@n?EUGSvq6w&Y z=~b$@e&zOguktAeR%0WPK z1?og4wexP^#Ld4~>2rGRge-)@d2y=&?jOPtPs<>*{CYG^Z1)>g)_1mAJ7~K?qh@7` z>8)nG`*`q4WhZ}%gz!rwCl>h|_hc@fdcM>ns5=R27!9edlTQ!wlCr+=;?{#(M-C}j zHzL5`=~me)vOmb#Wob@T)OSN4GZb%1c;QAUd94Fq{c7b(lgit2Hm9uo$l z;t>v?rPKVbNhYW89G#T}E>EFTkB{c;s8Cnt1(LtJgmWrk`eG>P>IcvIPb9M)v}U45 zv#)EbGsB7eKf1<}QImRcF1$$yC$5-TnxzXlTN__w<5b<=;}xK-|0?KxdF#nyNFuwy zJ;7r>)>uQ^c@r&3vFgk|l~58{Q;>XYJ7D3=hpcT7r!6q(#Qs+k+yEw$?m&azFo}IoDn!u?kq)nE~l|zsoZVyV?%?* zq90%6$C)ts$f(QffiR=>GJ)+!c4#t`CNDpg9~zgm8z>LIT6*2Qpzy}g>$#y((TLmh zWnb4r0@lT(d{pj)Ex$Ixh>TbHmiWt^EPqxB{9u@%>GVyu0uA-;Y{L{Dn%iF*e zV?Uf<5meZ{T zI?|T2pk{(u_K@ZsgN!43RbA8e6Px?2Jpy`LEiTpKsi^SO2Z!Dq*WNbX{^O^5Fe^*z z;ApvKF8hPlIE>zKaHTZgcy%Fh0%uAxcE!k~;3$R4uF;QZi0(KjK?Pe($7fab#L%#H zv$xXJI^d^)aU5l45!B=)Z;lmx?%7z)LC=s;!?^I;JzG-!jMeSkomY3Y9!pM<()DU~ zQN0`2VDu1vpM$Q+GhJ@^LI9$Vl#>!gZ$G@?F3c^^ke_Ph&`%*^D)w$kB6My@3|iY3-m2 z>v`+l9bu9w0v+P(?~bJfjK2_Z2gx$+zf27AX>wA&@r$iI@#(bd%w^6?M7A{HTO?*- zC#q2aO3u0M6B!v$>2)l@BGT$jeGi<^8VXMgHEz9Tnd}Tuul`ziH^pSw{$5TZKo;U$9o-%S|>O7e`KY_V4YD7{-_vUJ+AlSeM9e>F|GRYb39DR z_F9#IGk2Gqn+1(-1?wdZPBG!e4f@7$ZxViqd(qThPuR~TYZ7VHkGFijkY#fY^mJ~H zryO4;vcaU6TOHx96ut5OBrC(pbx?D__D9C^l;4x~PZed>E?L3%rjBoo#Z20#gkkY# z2KT><+M>lW)*%+Jy40Q=9aXu4{N;)_;aB9?EhFEXg0Wzeh;sqmKs2TF_MWj;#=Fmo zaB#)op8}0Nm=9npsSPA9!#?<3F8|_gNu=t_ddB`)hF7Oz_=h5^IPr>g`TON#;$I(= z1te+jT4-hIn`oYgp?jt8m5c{1Ecu%`cQf>5CCk5%^%Qf*aXSq@WO9`$dQ9b2v(J?G z_LG_7$WJy?$zB0=FM_g>Fy&Y>&x4P6{K@0Xl{U%ZFULwA&AAhn5YR zxVSJ4G6nc%zES@9obOFuu9tFkyT^@gpr5UeLZxWf8{RXsTVtBU>rE%pU3;Kykm5ANSMP>?sb9S0+toP;$nnHWiNzT_`4R0CCnI5^Qjne~}*Vq()h`tq< z-f5JoPmr7D=H_93oAtEF#%p`dyvt_u`nGV;)GO-!+UIvS?^U1ja4swiHQAd1!8i+QZX0!}%6uK1m_)!~OFWZmq^c7xrb&OC~1IhBY62 z7Z*sHJ->pfQDo7Tk-Vm=XBODaM{wfzo(jzx{VHdYZc7#F+?-frCZBsKjQBj~stt#a zEYnS#{z^!9^U<-QWo{rR)H&Y)A=M(>VX-48@z3ff@}J(PE3Z^>M_*W$|*CNSj&O#nz@+)f%t%!E#Db z`xbV*Bt>g3DQ}`XJJL_;FDIRyB^<@m-P{#F^$pkHyspn`)Wj`DGL)z1P+UD zun^s|h~c;XfkWGN=ci*jl4~h~mpSs|?4ySLixhU@U#?CH0%aNO6#V{)Bw? z!1fV)#*P#Rp&DvZ)H&%c-q--&eDH0|Pb27=KP2VZrsvXCM~VjxQ5#}W>AQ9`SieTu zK7NhXIdF1iC;!R!N|Kwv*Il6Ee)8Z`V`0{uasz&zw~FI>zdqM$1X2ZLhS{K2-i7i; z-my^lMNhOn&;FVXgD|`#z&*l7FX@ZS4I)#MNUMWg%zUYv`V>(jdg|R(r6i}|FzGkns`3lfK_cBHVnD2%RQLC zzKockq+P*$CwMfgvJo&)SW59~^0L*C12eVA$w~8t$2TNO&j)rsI!d;e5%~PUA(o_{ z|8!3(J7a~kEM$=L#-w*Zpw`E&pR)Y}N>Y-Vw<~O@UF%hAQo>e5OKVQH8RCO{nJH`< zT+{-8+KB(BJ83nYCG@Bcd3q)fGxZDpMoYztC78ZjuS_mErkGH)hL)uce*CZv!|MJLn(>_>_kOu^M7@8QG zArxZSGC6w>UUZI`f3~aFn!USK^Uc+Bv4E6!*@K7b+Da>7iAg(o+kg2h*W^lMNyZ%ga7a_wFh`!l)K(}_0e4}mY@j1r4bjb`uL(go}3gR*SlP* z4#ld2>ooQgHish#I`Sc;0u)XLMV`_ve8ENG1wx*R(#hFd2QznM(e(XPvD8;Fif6Bf zUAvLD_lU+4_3=sfAI-()`lxNGrpBa?Ch-Ce{bonQBH0GoQL9^o0%crFbwm9I?ho#d z{xpoo(@fja5IU`yqxLam3D%66t1I~;K|S{LkLVpiA9-5FpZcl$K9WBTP1{P&xoz$} zx0+ht|M*TSSh1Igr(SR8KEXpqB|VkE1U%-7PT^ngd>yW{KSv<5FTcH^h3a#jLtq>I ztOPCPl7pF+p3+0w%x{rpg_yq0j#Sgh3OLu%d;#S+c%)+yY-=sVS@kLV~D&N5m60zHm?c81Lw z|D38}(BvJf@P0o1wk0rr5R&2rg|*jL+OH9Pn@aKHC>nkAY3lLN+#va&`Np)=|Eko!;Gc#9iwpq?~+(zdWXCY$M9-qCp@|Bg-B*2F}fu~T|Sjw!Lw@23}9 z7%vw(RggHDuPWyD*o9$d6S)-c?1tF2?5Ay6K3n>U^SL1%b=V_yM%7V4Sm{we(|`C? zc-bMI#{sWW#>X{O$)A3qXAHA=to3D*4)&}|5`|vMXF>kZQ#*>(zAue9(+Y+Ao>s@S z?kSu3Hr{EqW*48kZZb2IbdCw+UkjLO3_5)$Si{EKh17nUw_xn5?>%$@{23p2mn5+zT>AHI zS@}G#?Hu`QH!T{@g;G1&g6jfNmrF0f@OV7i#i*OD4_=^Q2nJqi7H)Kv6dUB3Pti@( zudNDN^F~|Yym80NPF;faJ)0J1Tbo$5&qeZSfyG8q=H~D8R$qH@4>TNT3zT1U`IXd6` z_nccLp$cjIQKt%Z9&PXKl5)k>7ZxfN4{Qw>^x><$EvgL7L|+yk^() z#?)9JsaO75?O%yiitTipdwwzCo@_Ky#H9rF3Db5LYUzG-eodvqQc)eUY2jml7Vn_n z85p*{r7pfLD_M15$o4JYPL`g9-N%k1N70STfzD>sF}UKc4%S2;-hn7O?b{Bwi^x?E z;IpgI?z-mrnIkXxnlBq=cX#e@ZaqG$T6I11-bto@a2uaP@Jb2!=9-DpITq*EeerHo z{klM>nCG&tyvm=Q&M;z6iw^9swS^)%CGAoTMN=2zQW7`SeUz|0keR5N{Q7lE5s}jSTm^-}`oF|l z+v<1FRgcTV6x9iuZ!kJLU)&lkNr{^xR5zsdMGq5~{Cy*SmL<0@j_+AL{^0wMZDTta z;fv#8nlhBa8G*2OJi7KtNAd$>_s3NJe)p4V--iL{ ze6^Ii!X5Oy9^==~v0Ge)MBNKldR2-$epk!>wo&q8rpaX^QX2DMXr~ek`^}Xu8L*RF zfJsh5`pWl^0pG(f4sC}=)hr<+? z<(69caU!Z}Mc2o~pQt=ilVyq+VxfzvqkP0S>Y{(KJlF4@e%;qMLiwc#M`g8hx0aM7MN6qJqJ6KU$0E9>kIxbqSf|yfnIwMX{zE!Te-olV?g_p>6bO}dylIJO|d_;eA zD=88#pg%`)$Ay_Ba54*|Ps+K$^cj)k;2-gQy6^#xu$7Bww%-Ox zs2sNp`q9QOcxH#&@MT-I#GtYIcEP{0L!Cc)L{?B~d|=^`WKhyaJ<1igg4f5JNO@^@ zeuvCAI~1#z=+H_w6nmWfk5*xW>~~#ziM07=xhk#HlKuB~R71TZ!?3W<*t||Xj0}tQSGI%Ake%y<@%J}B2PqdxpoCjwu96QB!jDER@k^72GERGwEPLi})z523J@&zKjkf!9q0&Mcv zI$}w;8|QW&|Gq<^E0ARVS@guI*eH|wG)Y@*?Yqk#o znyZQ5+LK5hYBg-!BcdTB>~1YzZ|Cd}Asxfq;`37Sv1OhsC3L3W*Tu~`#Kb2Vk5rxgM;8Q{mWPH_X*XFsFQS7 zv>NExr&dJFU6)PtsOMuSv?Jq0STypaD?WPyeD3(*N*wF9inHbxu*DYt| zOKaUV(i42tuR@d@p_Pb(V~U?Snb4VAG+bgQ^|nB*`;VxH&Xi|&m5j|rQ{hX~elhv4 zWV@Z&GBMX?H0ijqeq?EKa*G?IQ*9HXFIAg%Xgp}ak{${mIN`(=*&;kswZlEWYtkJ+ z^F8#O+LgwXrXlTo6w~2Q$du*)3tOZT|K#ZU?+W}$$)x;z{1}>UQgZ2CTJc@l=Gdf5 zOdnd9j@lTvT}y_Lk z5}`VKoBDI@jb^*^Gfsg_-%I7>Gy3=qVR4+7_4w=T$FI~nIBvPEY*e1)q}+}hejRS^ zST4AIPy1CfMS%fNNBQISiUdF6dEx@8(yp*mA8Nsq)Ae$KiKr^qRu8w z)I>9`gUUq}`XM!6T8$Bg5dLF)Le2LVFfgb`C9-=`lfN`6Kl|#5of9$hq4GZ6)qBa> zcO15*4$X0gcm)cT4Fgl$&<70fhBm{XeXqH#1Oeek9vkL0_?q}_>5XErqhLMb_Zh~PI^J|eiKU(@; zS3l9kR293cwNMw3oLIxz_Y_LvsnHRej@_ZjH))4CC-?* zZ^ka|+qvbBWWHXP*axQGzHp_j?YKw5xAacEpM=ymL*=({z_H;QBvsPmXc+#Y({ZvVn=umW_zY5B*?iy6mdHceZqq`Yr1z2?(z|-cbqWzFwX+*!c{#6gzi+wvoCDYG;2ZAgyOaE-hSeI(ukosjH{~%*p}ze0 z4V`C=$UUoiG`DesE}^<79By&#tCtP7V5Xmt=`r2tVCVT}Zd>Fje?Ux%%KN?T`+g+< z_^V{;P4}h?nncQ7V!PEMi`p$bIaWYMwPauFLyXq(F`?XCvmzgNOVV_i(Xke7wn&+A9aQV_xXqjK=;$;`Gud zk!kF=TI-)%1qnr|slrgY%~aA{J!2&XIMbWcJk}svEo~a;K1w{EJ!rPcfEm%bF4s1hxf9z8yg z&VqWVo%YW3a}MOr@)4KZQ$@_y%%jiUsQD2(#rs;y-uFB1%HUTnvZCJR$fqA!JOi1N znq$y=8vo&BFHutkaex2Du4AuG|&NhJESO zZJB7WlHflb&a+hAx~VrZf9>@6W+Un$i>tFK!s0ZCA7BGuJN9%w!xE_biBE*na`rL6$(4Ih(YOB>H(Q={uGM_gz*pX$6Gn?mnP=-O1ZCj zmeqOhUVbwN%R!8gr^V~@BXQ9j9|2{D2z|;UZOyki46m+iNWY~TxcSXt{c28ua0?^K ziQ3IKLY@Vl&_iS-8lVN6#oWS(K|>>8y4dYBU_2}u*W#yr>x0s75+^gK zV^6Fc>TsRu#i!%~vv02nTy;L3unb8!)Ll~5R^ckNi0yZlmoH|)kw!hb7!k;%Pg;tj z@*2H{G6p>^kea0R!bR$v7%?aw_*Wib`Rp^)4D^{%I^iWAQ;WXCn|et)DzEhyUjpz2 zFo<=ri&Nhv4cr(!rd>jFcmYFrr6Au*k?U`b2`ay?n|S*l=rYc zFi|!uL|03NewvO*d-9siZ1!gcUC!tF95~YE=NQn`xW(mW#u9{sbIj?hjf z;j-s5|b#q<6n;4%py&?4)TId|g^Zl~Jx{Pv}Zv(win@qK+f>58t;w z^GCV#M_ywAlJ;e}h{M8!GwQ8hrN4?YARbbrkq{z>`iO*Y{cE0&&Kl_Q+@jsLmNSeZ z6UJZFLj104U)6?8FCD$6qW-F zlv5d;>O=nh4*dT}w6wHtDk@?XWx3OeO+6upe={lj`Um_^x*~Dz%46gRVUf1|f6Tpk zJl0>=_uWi|D1<~vLMihYnNl*PBtynbna9XfQKnD`i3~-hgv@0~rlhC{g=7w8tdODS zv#Z~Ip3n7M*Y&*a>vjKe|8f4#I1b10{eJh}Yp=ET`n(rYfabqGP$o$6Sd_86J=ZgT zy1?wULAC=gu8~?fNM@%9WW#^S2SW2E@GMBx-PMDu(ob(85APTcrUjXA=2Zi<$_@KY z3*)!A<{qsON>u&bLh&}Kz-2O@C;+xd*7xUL=oZK)0nVk40&a+t`%{D12(F4qA|VDt zl`@g=Ozt)+jfY6?D%9aFE<#)?5vL$3nDv`^(tR~KSrgjY6X3R>PLy0_hhxRo^ayTp zL9?oo9ig|N`kIIUQL$OGnQ9GD9|ON&2KhLsg-N7Dxk>I9>+f$& zZ<(x<=fJ&}b8@mqkSg?s#zsqjqK7I#QD>o+1tbIz9GP7Q@U;XV?u?q{+;Fd&+V!LkN6J;)AdvYI~5ac;y8-S?|{qE z5(9$G=wqU8w-yP_e)K4c4=Yc&7F<6~fK{%G*|SiXU6#MczK$+cipds3~GuuSuDLB3iBcV(Z-Y@69aEw;{|3MH%nZ=Ub6eEk`v?FQ=-Cuna&TGx$=tiBKvrh(1>j1`;t) z$76T?S|*f<9+Y6Uob0VRR%F%01|cCR3W~6(z2ECT+FZBRY1;)YWm=jxLdyjCguo{O zm*XH5Ip~?G*ku#Do}3YO=#6A~L# z5+f>Ey9+jXc z@Cbl5t^7442j~fGbctxdTE0O>nc9-OgOfEl7{0*o8L-t?pzcIh43$)Y%ynZ!v8#(E zx5uv;zMWAm{POiU?PgI?{a$!vLg zMh2)ff7YzF>ejUabx$`Hl^<~L`tU8?;6`~%Ojq&B4JU;I65d7&dw#LX)*isJtU2Qs znfls%r%vOzApKdYnzo^8*UzrKl1%2oXOG-m>QIX6g@5q(%BxdjS>{_bJGtS8jg z%Fsb6H`pCd3jdW}!erD{0lUa^8L| zHr54NKVcO5E2Pr?y~V!hFex)wLjr)@OcONRmd(Cthnfk%vxF~MTrBYyPNG+EngMPY zL2!b!c=gJa{pt{4TLNA~WcSu0FHmh?Jo@kn<*F5lK2!Bdw~m0e`YP$n$NC)8suO^j zg5|&ofD>%kfe6-mP$~Z2>^mcxk-Lw7e6Xztod_lUCv2JbofW}GJpfJP5R}tq5V&`` zHtlOUm1O~@DcPck)~M*?*)S||C%`jl*Io34z-4kb)aRyEmvaA0XW{Q0(eakNdn*&1 zf|mQbk?;X>%xcz&IdndUJ^}Li6ubbe!X_zLpOdLT#6jXrk!{Q5lPnFQ^MD{cVgm53;rge|E=-T%v%%4cUieF*szUk=AA z*L%i+&HIZW*m8uU2iFJsxSN01ypDGXE&+xfc8kFadjz2sHVi=NW`7jR1?F zeSh=hj3e&3dP(i3%ysZ8;viM0+q_u?nwRTf$&_PXfF6b&yxtd0em{gCmi^EtUrTT= z8EV%RfGOI1(v1#yX_QREGf% zDTuJtOv_-}gJ_0lk`^PCgVCU+T7&0N{P6HL+NbU($>%z;QXu*bSb7q!gr{CNlk z#@jb?u+rR$*Z^0~N#gSFFU3m692QerqSqa-za~tPX}Z2dm=1O z6yH^3#7O7KR z&RI*fCYB(EVBX?J5RTMBDy#{jCA5NuZf}%{UXbAi9v^{ML8>?aan~Ifjbpk1s{%r* zSLCpj;3XsaQp|KkSS$eiAW#KE|HbbF)x!r11!i0_6n#gHj5P8rUojy}1SjTh`?3G{ z0b1Z1?s!6Fi#+{<{uFOdbYL~N$Dvl@m_E4QYH zGC|OMO)Zl{$pGWS@}H-PXbar%U`N2f2)b*%K=ClZN4AApw5;~ zz2Hwg^U;ggR*;J(;L4L2FmxY`5@Fdu&3#$01-G(;&8wdd60(3$-~ZQ3#QcKSIXkTB z{{oUz4aB5`)XsS!bRTY@_o@n8Dl~&F$ABP%^idUNoLSmq7idbBkj?=WzlGrjxZckY zPC{7OZvwlq4~&5$x%EAi#L6N{C19DBY~y51Tc?j+L%FBwH!1~U&$t5k4lL5aZM55j zg`**SEp+G##ck~d&;ky6Ga%AL@`jK^14ab2X+gdpQ0BV+cyHzU-Xbnn4x|o3HivCZ zGc)$`k_7rfEbgQS^E?-)p-VkC?ko}RwLtNw6_CZ%H#8{L+yohwfNp^yhV_4NIj>3f z2GGP;;5fX!eP|OQ*F*Y>i+5&qc=A;Yab)dzfRLvNH)Q1AoiwxPDmu`38F5{T5c%m~ zB|!!Z<9`)wU~p?80>UXt~C4gbJ*6m2qHOBlH;te}GTy z`6t<_FNk=*h zSUf~p)6L0CF@Txf!gmUqTsDQPLEI)o=NbmGnUHs2L&aWQ%WRd1&-M^Pt|xOVM#KvY zF+#`!wO!?%5%&Fo2=@HJ&7S0(%X z{Q21TSG;z}w|3BqT!o;Wa!=4By&|3WPF)lnydM zhd~bkCF&SxHJnUTX=X&hjSUMQ+rz(e=Tjy{G=Kme$Q(`s0g56?mIR70NmGGWMQje= z59pP*aRSl-cMi~yx;R(|c$2xU+7`&(5DytZ3-G!^L$?a3yk^iftVAF^SH-@xeUcr zEsMCr%XhlQ>bOw8AB3r+Yvgs24@9r0ZHOBPJPl)T;)%y@9c1|;9SQhy{Nq*z0$Bs` zvQ*(3p;?c<&*OK~nEq#x+Q8mpjRx`qqxW+Ui8hI7MM@IQo zt2p==HFq7!Rmw`&mhqe}x_fH~uqP|n6160$YYBuu0n1bgxX2MXt!9l2%RVttE?eV7 z^}9B#$M#Y-bAZ&PgqthwEN)ErmJ-@OcI(T%GZT!y=QB^P=rW-7|N1`urPQ(ax<3R* zJ-X{ZMim_?2r}=riFa9R&myC=_sV(gk=a3)U_PUtS3-wAs(kI197@C@-*VUNG6!I8 zd5uzG299OdV0g+M$&Q8)GV$!ly%wNIwh;ssg0w><6mdqBC}{d@mEX5p>_;phcJDkp znniFh_{$jWy4IU!hl_YiO3zwsl@ed)qIE;=-1W_spKGpsT(_wpW?^B^K_faovHs)q zt|Rl&Ua56DZfdW3O-duhv`Pn=qwaK{%a(Z@U~yHJl8sMnmv7zF!X~x~-%f7HcTU@m zzi2m_)m_(c{Oyw(o}K9tjsihDe=b#MQJkrw7T@bL>*RBD2r1_(WX)8No<=CyJO5+k zel{_$Xm6mZPK+j@TfQUtY0NanJw`7h{l0N!`hWrs7D@P@TQE8hRkbPZw#%DuK1RQ6 zqzBK!o?oFR;%w^nrFI+2xZU2dlKWKN3UEgU@I`JsnXoeJXnV={ z>Qx&Uq|YYxOw65bNNQ8MK9PS|`%#ZcD8H|cHnb|}#4-Y+_exxx3O07qECOED8noLWAU+_- z2v5w1u)49w6Vf=?6rkV`n67NowC8M3&~=2O$l#{KB6Nbu`faT12L5asOoKiN8gwV> z2W{upW5hj#zmDDg5a!13JU$7tfFM;`WlmL2fZEuxeE!pz9!Tw{MF{iY11TYQ4*)sI z@`1jaE9bw^$4)L_PuaJPI_uW2AMSc0PFm9d(UkrIey|4c3rujiRNoy(#lb|RJA=<7 zF4ZF?sK22)E0CNhEi`+4wZX({kFSc0dv|wi>G|3duLW>;7`-DGwzYp#+0MKxINjrCkBR|-Kv-_UOXevo$)|u#ciA=`IWF{My+e< zS$|Oho`TY<`Csh;8zy!(_)K;ugOq6b)_dEk=UN-Lxvd&jrft2jPAT`nmlu_f%=YZM zKuu@IAKHFgci(-pmGYIBLW5VIS5`a{N=qBHpOWJ?P%1A=o5s)1EDSBUI$QJYqVXH= zcvL)?VEY+K6XJFnWyj%c#2KWXNl*t&5_S|4B2tO#5TQ;WCmAo}B?JVf6hd#pL50oz z?NYi9Y3xvo-w)djSOf9b0gs=8(+1L9BaHL2aPg1N3GWHyJ>*B$vqc7xlui!P6o_Q& z2tpDLNA9jLxcS0o#taGS*l%G{1qdzDDFoX-Hi}gZ|IL+ZAs8TB7|c67AvSPZPXULI z{SjV=qB+S=ldE>DSQGm}LNkl!QN zDYi3|sYu>jnr4;6Xa#?!Uw6(_|T zmDTYMEc5q%EHhvF&KdpaQfh(a$pHtA!`Aht@8)t=KTxf9Z2IE8@`Sv^FQEXru9Uq= zp|!{N6g}^zGie!E^X^*0i0Z*6E!GIR6Ct#{Gq3h1?#129%zw!vJw(871ce8QX|t*R zdaz%jfazBk@2Vytm!jfI4zxKD1e#`NdhwS>4JYy}sdaR8cEOy$w?{7KVpR`u^g&Ne z#PFDr<}hF;V$)+O>UgER`J|GC1vkc(HN2|F1gjd!nH3#ip@No4(jhovn|LMOZ88tG zG@*sTg9f~kv|k_xYoNhkv+s0kRxkavG%q3|l7q#D;UkNjCMW=iGl7Z)7lc#?&54GI%`4#&{W>-@38^nb;Z0rkUbE`Fi^h!7hYpW_jrUBpJutm& z>m}v4wSQ`S@KO3>COW_Jh4wVhqQTfB)$4JzZ>yKjkjeu6uiK)Kji9 z=53;mm(= z8CNiGrvKraz^)=r5F%g^I5ffvAfnV2v>6?SQG=^Lq=nNJB~VM?lMh^2FYpP#ZA)Yv zDV;OV+Jwh-tT}M?>Zeay^n1r6C*3s9n7LjLJrr=u%RettLtS0T)2qOQT0DQNQp0m4 z8s+7CW>{6)X5H)rs`@hu1N0s_3ct^_37(j$ydm#UTvu(%N5fqb(wkeN@iu|q?)v*R zTOaQ%w0rF)s}3lCkeSO0y$`+DlaEiRR@VgkBcjeTJFy>s??(fFqP*pvs73v|V9)Hu9#_IMd=k1zfvr+b<+%oUJb4K)M zb=j8O^*UphBy_n5iv$d*86gxg47n8mqfVT;IO`QVyGe=oTi57V>te7Be9i5A> z#%DGmr;*E>9*koX_>W{&vA#g(DMeFL4tQr=;CzmZoYs*3DiZMy5Pxz?1fpjT(t@Om zQafoIqPSsSVAGH}=+j6etTX^X6@DYufy+*ySV-O!F>q|vd*E_#zGV8b)a&vV@dyOL zG=okO#h)&$C!{)NDYu=3(~rY+r9{JItb3zNf62ZV&OxHh=SMD7d<<2q#QvZ4E?v-B&j zO%jP)3({j|Gl%0^5(*eD8kYP}Z>7HRa&lsD%y6vp+j9RG5=rxUO#_}Ej(DHzQI~R( zprheA+1G6IB|k8>G{=^quA?xVF|w2HQ~HLJfu&0`+miih`+xuYr`x$SpZKY}^*ugQ z4p;JOB_!UAJ*jMZD#t`s@w9S}`{;n*0VA`$3o9si^xrsy^Bi@SICL*GpkUlAhhMXK z4oxw7uTW{E@ZR`1G;qOx(t7B~7bfRD<1=NKTq@$Gb$ zJtVuoN3Xdg^_9uew=P>&>$?L7AD(^}Ng;i+>8f?s^^)(K6v|oMHmP^zE^Ng1;VHu= z!?pn%9jOoi3EV`FQ7p1fQAdXXJ`DHmhYur=^kD(?mWMRS+L>;R$Q3&t63uT<0PQB5 zyrBd6cDNuMyLVG}Ai$iHM8h1CYa{S-_crspDp^pR!fu)68BBT{CH60}1TSRzClGy{m^Pa%FIIW+($qY3y) zv*6PROe&y|upQ{GzpT;IATN%p+>?fFmfMOJCj{32cu?n|bKg&>>k=;6@70f-?_KG30J<~-+h{|XMf0!Q;Vn7BbP#} z-sn$v=LH1+;^)(U^Qn1(mBE6gXbVT6#IEQ~r;3U$#7*hunN7SpRhMBJ=6Ya4wW(ov zx~8u*S2|A4>RU#~P~>kT^gykuvVE}2%WQu01A&g3=lL3?`Z<>*rOT@wSKBaOdp_N@ zCsp~>ialfcHH8TqZ;qU$V`kUv`$%Jzm*21Am&xB3HP}@mIZgHO#EjJZmeb6SdwGq% zN=BF(%e{(PYI{_X8cVYvg_J}e5;24DC@tZd5Hv3Gg-);s)9627maqe%ZVGUJZARYV zSIEf_n2wu3_C&JhAdV^sRUd|&v~9vkL6kwPQeE5#ZF`X-(E$oBrA;_xm6r@4P4x8^y!0b_J9d?Dp=Qif&#aQvE7_-m9Z|el1@Sp4 zp{^ZI<{ToEFNAK(YYH29;NdW`m~g-Qo|%Q;%B+oBsZI}YR&YL-tE+8}x3J0Bon_IJ zahCpd-o@xUdx8gyFZ!|lOk*_O@A|P}z-O=Q)vEgI2J(?^(VhF2hh|>LS999?D{^wx z?&6UozT*S)x%nB%bv5fHot2~*1|Zo%ZsNyQ)>CyftoG{YuJp;DflHxSdd(?>t{uU$dTWNl@=kzPDU`*E?KU zX)JQ=eu-t+on_Aw)h!%p*wj(c-@JU&q!KsX)QOKnK1UMjK7=ZSj_{Whe&6pf-*eLM zF5k0MDqMY|aUN(_EU^hSwimkvcNJ_cd~``_#{=JhlCoMl+XGH}vqW7zeCosP*SMCJ zaM6F2;&07*#3cAZK0xzm@!{rQY5~-?yDlXSrF^{q{zri2$gY4_qq}bUZ98}}ymnaI z&_6C<%$I7cf_MMG@?y)FTfBSj4KG)nu}##du@{D0dOF89ucmKi&1Ak#Ox$TU zzxsNs@zq}6hqo=4bCd4+)Owx9P@pD`-GFQ`l_@&}^_-hUqA!bu)_OSPc}|sYyT-s0 zXW(3;PV%*I!v_|fmzOAh(Z5~oBmvdd0bt@|V+KeQH>&^h*a=wpW_T8MBH>%?D zYPd@+viC^?li`cXsq^AdY;>BzA(h$JqN1LWBWbX$YvKFlzPc_R0g-|%VA zZ!LZDzV7Z9N(Dy8heP4tjgA||DSf<6ADX%Qrrvf3e0F$qt+1uT z>ZO#yIYH-Q)``X4yjZfdW-OuXp)09u`uh9UhIGntUSe)Iom=)TD{f(Gn}MTd&$Y0= zIje`8n?L>XoTp%CU-)eP>iZ$PQqk*|QU+583NAl)5%zMTHNk2Xm>8{n5!h1iDY4P-G z@o$lwt@ciPVP4vJMDsOV_GY-Q;&~=c;UOedww_{3^v7%aKC1dX5a@|}^jd9J|FUgyl|v93pfW#6xfSn>s^>(o%GIaEFI&F&qe@&DxL)xZ=LRe$l-6X%no z=R4zkX~M6+FsV78?3pzr5xb%EJa+BbG&gB^dqL+#AGXgDQRA01(pq#CZ4{|9gsi{( zcwkDU+IUJoD6b@Mk-hj=U1W&hNuM*d+hb{pBgEIc>ghkaW;{}wuK|}SU7&rxp5j)R zl67tQW10_`D=U2}mo@t@Flip!I3zy$GURn$g;^C#xP7y}x+R73kWnbLtw>>bNkTr= zLG`0Aue0?(~{Nj+qt8~*SSi@ zOuv0>a@bvE(}2^F4_b%whkHF|zcp)0#vlO30U)Ifx^0jieJXDeRgw${O*)Q$NcgTe z{Gos!z5h~k$$}yOyMogi=j|vMoV54SciRpg&`|DPo+97!`M37Q1=S>~^6O|}h z(-eBO&kXhE#%<0X(whxtD2k`P9kjbsH*K|jjwofeQzTRY=vF76ht zkw0=x*)lZX)%*&d{DSks9gjWTPVK6QG2Lkye!0e@)juxpzRdGx{!ve4Z7KNgQo5** zA7qn}j@^|0)>!lCnOzjF%sc8ITEAFuU)bn9%0D;X$dK49vZX^YsgdXIZo8~o(KgK2 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

^+*Ue+m4>w0*Sdc|h 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 L1@jI6|{%b6Nsn2GYfm|g$H#zJ%PXx7x0 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 UIWt!;?}0yADJ98rapQOY3lRO^6aWAK diff --git a/apps/demos/testing/widgets/scheduler/etalons/scheduler_contextMenu_click (material.blue.light).png b/apps/demos/testing/widgets/scheduler/etalons/scheduler_contextMenu_click (material.blue.light).png index 059f3228295240f34f2a73bd6ffe4a788872da2e..769cf801527850e4228f431c134ebdc334e94964 100644 GIT binary patch literal 74072 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

meIjGOR8U<{uU5`s#R)3~8LDt5Ii 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%0DB)#O5GFfhaO2q2N7{M5IiH{MH-o4x1Ils?L z_Z^e*!1;j3$a_;Rr+SY{5sV>*2>!(8Q~kZyQRV#io){!0_OGjAh`nQ&f69p=u4wZA zy+=VJCk?9$J2ct)XV0D~aTpT?{-5H9Ylx2@WkmK_g3UigE_#vSgS^Q||E=+Y|9g%9 z|L3N(Xfymo1w zUg}0|k>?M_I_TV0UW5=7QRLR=Hub@Y&;N4g<}c+lKD=edEsEjSf1MUA!X%d*LggdqGpZ7v$p+6x8!MLYL zKT_x1>p4O%{I(zx3Qfk=9^r5lA#w=asd)zYF-u9Fl|s6Ns{**7gNpkxH8qkHcR#D> zn{~0xJ<)@Bdps@|=+WKI-KvVzs`iRQc6S>ehjm1f<289?&kQC+HRm_2RDC9>Gf{SL zpdC6PgSU%5K59}X+uPeWRxB}IP<}c$=YoV5f-A!0diq zBYz8Z#3sOs6z&Q@sgch(){uPNFV=K+=ln6hQ@RA zrpi}E7+>+;TMO7Kk6I|FlpmXZNDVZNL2&D-ceBEoThPg65+X3~b|)vjQ^MZRA%;%W zF~0fr;l?o-p`zVGa)U|Z-%ZcPZGHZCIvx^v;t2oZ|Wl2z|zw2ZJ_8`?>Jur5OCcduU zT%G3As*_#~Fy>vYLA6G9|HLoVNX+tMq>40-!I~_n?IlkRO%Kv6Sq#9M=wY5phUJ3a z1Y5TCY~sDHf`yeHD0h^z!6^iP<|CH3Dm_3aEM(GwpQ${ClVa|hjRpN(uRs{Kx1U^+ zzrjY+t*)v2a=8NL6zP}E9k=UM-AwbN+lRL5+?w82;*aNkcqe9|xR^A3`Sz=*Q_#6? zM=7J?jIE(Iy?y_z*TYmJ`Z%UftF%y$y-u(z;GMCiM&{9>u!>#=H!y#f$+w*^m}Di9 zMqZ}%={4;)?Y8ZyjZZb4=)NP_(GTec&3VN3gQoXpe9(*9UZ-|7|SNV)t zA8wWtC?}!1Zxs*~7TQp?aG@N$ao+pMqMBe)Z3Cdh2Qp31 zcznGe#Wd#7W>P3Rx5N6G+o;hwt}hrxN|5cpN<+Qs~N0D>!8t;##hl>0^HNZ!`h2HdH@LvDKA&%9$DV*rsMp$(|OC)9YhHrMyNyWh@ zL1DOR9v$jTR>q4x8(S%FW!d|^-En5Cm!S}YWF0^qvtr3#mus4dX~~~?>s}m2D1-t< zPPiZGxiUfe*1hF^tQ1(H5f-6!gPV#L)$9IYY~dS{{E+c<1*+4td^T<{mekky=ASp|6G(}!RFOuk2qW?s7jJh>6LKw*RsV2L%R?EbZ-c-aGGSs(x@22Wp$WUn2 z+Ju7Wy*pi{*VD_+Ic#Ik3+vlWr@T2-3N%r!Z!C&XI5eL|kbiT|v1M(ck;&OT0TJC8 z#$lsY+h_}I*kTfq+3>TnONaKOi=k|NKE8RP&oAd-Ir9@6d8G17cTS01UQLTlB%=r- zdw$8#F~0j2Q+I)pl_LF%&MCaGa+bezU6IO-R#zbKCQ`YUo+?NfStzAe0- ze2lLi*Bx)H)Jkw!K$; zlyqnlpN_)L8#eCg<(MEO{&Z5d%U6;~CBlfD^(8~n(##!5^{uHgVb*ayPYC&~Vl~0d z-&s2bE(L2nOkCQHa~ilpH0Wc$xGX0S&|&&qba_a4Gx%{1KaX00&bWQ}xyj=Mu1HlE zYbRvg`4i<}Bu24$&XK`^Ne4XjUM-=~-eQ!@ahJ8v7}s++8XJT+r5v(h0Sx@W!wT2a zOucdi>p6ScD~&a3x>qWpZJ}w-^^R)cw>FU_$0)w)gaw`7a5A^yXjPpQs)dxv<_T8~ zHLFTyq4t`G2I2~T1kDic^jdl|M)c~GktcehBBy}iQD!8)h7ZOYdyUMvSnXhJdmq-s z@kvgZ-nwGiSe>xBNZkxeRVUPp{;r2t7u<_kn}cG8goJ<+3Bk?Z+PViX%08aQkvh4DR^Ln2&qCFXh8B z^ZY1d-bS+0Zu0Hv_3DkQK?d}7CO+#4l=GrVzMuWWxkHkVO(gK2kAz#2tHZXNW@9*N zFcYYe2XC!Ux&tCnCgi^-wu;l9!JDS_e@t4qPNYlDc9?!}CqaI09dV$khJt#b?}rZz z$X_b-)<{P;{Q;Kq`!p+ipKo1u9oN`C^EEUbK<#lYdjUm5&h{tWfoSNam;k^WXe7Kq z5uV(YWFg8sxY(oj6HLlZ*I13{Vxi9-x&QTjs4$ey)X+wpYr(KdH>$t z#vH0PY=1OWrV|FzmYVcFLL3x$23A%&0+fWTtl^m|ldb6ra_D@G*SYOScPP@Ep$r*I zONPucy`~fmeUA`3zw5b^-;+;Qyw8{XL~@kE6O&U?IGonyyBes-;yCRV1@BG`?s40e z;&vN0KITcsk?DGF70lGxF7&5yTV1U4wnf<2{rss-=5wMfJjgw*8w5EQJnX{WS!_uk zqLqLDZ7tQ{mAQcHj^XXq>AZa>D&hvn$dgi2u~FdrhKJ2}W~xrMr{h$sn4)kQ)$RLe zQVj{XI2XR16G;e|+HFQc_b3ft>4l?S6?SU=LIUU8LjY#$C}}v43Bb z<(u|NwTQ!Nis|?7--1YZ*=^?`Y3b=z3x4;v^Bxa-38!n8nUysz2myU;WaNdqI$oW47@EV*47;O~)7HquL{~{gYyaKtb>EL4rX9gZ zC`4R{b2pdAghHNNU%q_d;^E-{jmpZ(VhlOl-<~^dWV$89$BR;987($@{Kyg^kLwjz zP(Zb7K7!`D@zd=2o3?wbg9+nWM?+9GYlO&LgK((aAInTAj%Wpg!WpF@4(hgAz(+a6b74Sl~`m$RK&@mH_VREu6oPP@ST(E50N zaCL6!j;F=*R4n7xdFb8zylz55f@Y&LLzO0qj+PdoNpI}hF&Mz%WQA|?oNZIg)RcOi z^=u&InxTN6nb~Z$C&qcE-hqlrI+mI&Zro@zS2Dk-h|_IPwFY!G_VFG zUb=t>~^D+Z#Hs%ntU@JAtF>#-&` zyR+T7FqKFUIG*Qw3Se451G@I@Pkv+y;8#q`d3f;EX&Cqduxh%U4|*&Gc@Nx=i-0np(1>m`r%jK4~x1Z6ug3Iih}Rs2gs zD_h&b#zt72K+mrU`JL%O*qdCR?K*ERwTaX9Z|DG6*R=u_4pur3uWyr* zlVK6<vNt1HX{C^2L!ewdPq?8}029XFnh9YC&7s}D~t$ZebGO%}*)ietp zi|+SY%W--Jh81VaG%3pX7a6zELx`4^76|f6lU_7%(9qD3Ur>M<*IV_at}X!>(ulx$ zbFAPgGc$9B{5Y3&iWx;lMMJ{}y(U+7;9&gug@u$uz6=Zu)O2(JCHWkGAqsh&b?u+S zX1uz(`up&3@6`PKk8-^xn2(XFsH$4p+0pUw5q7d|8fxKnTyiONRx<_H=>3Iaj~w=n z|C>&ORjwNQ6|v8sKO=^SIq&`iKu2r-9n7Yst?iqe3lNuNkx@~fDk{v+_ZE_plCmv{ zp!2V_wfhSd(!;xr0YpAZS3%ZsbmS;2E7ME~Dc_y}KnGk)JcF1^VRf9EhKAkn+XLI? zL#g0nK#J-W`U(J5M!905qfvk-c%APRC}s)IfJr4_Gkn0i=uVZ%&C5H!xcG`P{u>)g zSA)zrS1^WoMGP_T7#Q-!;VS484nDprfa|@5CYXb@T}@WhucukP7xLmkKqvb(Yn~+u zNgX0gNKWoPS{s;caH6XNs3d%MVbbWj8_CSb7-h&7ZnHgA7VaeN;J~h?ruJGxLseH- z-W=Hc*T%;2)pkYVOKJdH2u-fL#v|FH;ZEWJf!hr+<^a!bv4If*;{EjLQ@gsFS~s9U zjG=dcYXO)sJb#`muB?oi&SOJ~foMn!#&mjmIx#U}Sn~O^@n9M^aQS!X=>sXuI+bb~ z8raAo7#k_2rA$B>)RpOcr3{8NnVOkZd0#rZ?#)M(wYGkY6S;d2CK@Y73Ms7feW45! zp2GdBU zn6zud8yoo}BO~9lo50tVls85`d5Tx*uqwsD$tfc%E0&?t6GyHHP>xZ(G~0amBO=8R z3!vnA=WzulgVqf5j~=09LZ0su6Fb2T4lccaq;W@WWciV$4s>_p8_3JaJ&k|)IIg!7 zFu{8fKVhf!A353C4;;?MC;V1%{+3z)pL7@yYRj+xPZez9A6>YS3fv6h_c%zj>ynB9 zg>ncTIM5$;7=A3xMj#Q6_Ah-o@Qdq@WCZ2@7s*Ke_gMCx{x_NuRv=6Izx-|F|DKNi zkRiIeyW4#B(+Vb3+Ljc7fCL1YR|DAbU?q$k7MZ8h262Cc;G*X?^II#ct*J8NRDDkd zpX;-NPM}k?zP!ctI@_V($4(UJRVyHF3{d28+~D`}n0 zTu&Ie?@ORhW@l&R(|KZmr`Z=qMk1@1X?Mp{Nz*ei{fcBPe?~CP8<9E>k zq|@L?W7m2~n*|g#9}W)AvyAp%DB5+_gaFp(UFU2_1YDzmDgbKMq$ipJFX|9TQW#@2 zI&X>D+Ol-aCaE;v91Xyv7Z8-s85uneyYXRRyg6G#7ZVdBc=;wOr)@3mgrI_pV8e-6N&0{|tfIj} zf??mrM=yFtMsbLNiwid@Dk_iyguqEj{`~vkpjm$s1K_yi!_{6+ z0O7#RLhV2P{{5DSi0Hkb2ZwK4Rzd<6kYj_PsKk|OuV1rS&#-~R7=UR&VUq}XCV|4i z$JUF@A6`6r0b&3M5?$ZRwc4*=Yn(P-@q-w(o~aB7fJ30numTbkL^RM^0Pdhi1FS_Y zEt#1DZpKf;I)U!JI@^^K6@B>R$rIo?0A4YMRF#!Qfi49-rUhdhU}=g5eBgL<;b0BS znp;*DW9NIE4)cdUvGCs*{Hm&Wdx$*XE>e&-SXx+ot7dA} zXHC^}CEVKD0<7laBLp&zdR-R&U+e3RzrJHycXxNgW;TzrlTAsMBBKaU5K!Z~EcmcH zz@$iBh2QNqEGW?;Bw*yfA{d5FP75>^T4VWmo-}$a37;6kK(%JIDN-V>LaxdPO-o59a`p!txkkUPN;%Yinu} zw0{bKsj6g(O8in=d(cOh1@tohvyARvD1aJg=52XN!8gSW6XYtF-r-Ji5R#r<*YOW? zyR;-|CIkKbxi#zSZ$Mad0u;j>!bS^oXj*VycWnZ-GnnFE9t;WWj}$4A!<^28G9D55 z!w|S3$nnrhG%9H0U$TLWDuqQa(!Ts9bszu&&aZPoxwlXK{24j0W(;_AXTBj37>lLl zMCIyyKhFN65`FO8ZedXQcKw1axT7q?=aQ1G@gj7XWGOBwp#rkfs=Of-@H=G&4d|p3 z=#YKWf@TUxQ`9aNFG*w|RTxrx< zzYs4V=#~T88=sZX==u~Bm z2;k|wK+3`Adjo+baFE3E?F@N_5Fn9Vr}f+%mVC|~z$_p9;2g$43&R}xt5(i7e_erG zDhEg&V6%1UthZq*%iyfno06G1h{`+vEf@(Kkc24+cz{OLKG&|n$D55qeMu?=p`wCh zy{@}orX5#8@KuzQz5(2yt+m7k{)lJ}bZH_(K_y|Rs5yX9prHXV1lp4&a&~Q>8b@^- z1BkQ+$xA02n51y0xan;gyr@wvE~4)3)3I5gnzfo-nV0U)z8+qBBbpz1wsaY@^G8YL zxwq)QO3BFhkuQ^Yv6&Zlaj_Z)vL$gyRPQPvhCep|lMQlum@M?USP65k^EiI9KAaWT zyDAC^`}d^|wZ_KBEiElYA%C~tUd@y{O0Qo5vc{{!FD9`rL- z*aOogq^C#Om!F(CgK)I4vnztFBmkzKA@jR&=pPu^0$D<+QFf9TL{Ul#9^_`u;k~OQ zg6{9YZ9uLE#F`PHOt5Sa#^Rz9a*c0@fu&0r}MB zh=*0boqP_)5v~$xHjsje90E&%J3K20j8T z4-|EFcD6r@UgPrlH3L2Ui)okO8Wd9gB(NM*ZM(p4Tt!gPcE?|6Io9UqXALBl8CXQJ zUTP&RzyWF>##Ev~@Dv&5GnGa#Mgj!@D7xRCP7?~cv-S1$&A*VFCZ06idhu^a@LrBE^JmA*b%-R|61CqQS5KIeL{FMm2%{?co7 z2L5eCFzhWcrr~r-#{;aJXaN!eskpA&f(z&gjN4$lu$F*i zh_zj4bO1Jir9Ac@tE)MZRG9P{lYlB30ak4V5IvStS{fZ13J>#ZkjDqXqr#Y68Zr(# z2$onk00rd(W*!?;k%}Wz2y+)40%mUoi0H_{$BSL`CG*Qr*+@fzYF}M^8Z5t z2=4z)312wVfgaI(@DMt`*5J!jzRl8AcRQj$^49mE!yeK6Euo`Ixpa;3!MsMc?NcZT z&o%0%a^xab&TR@^)$cTnjbdtE8T2LpGVUXG@+YhvDimD}efwnJzkhokjIqI+IgWF? zN*m0%6?FWJ^TRMUIIu>FwJ*MW63ppxsu$e*ef4;P=N2!$sS4|N-7}KU`>#jjg{SLM zD;vH}7*BFjWb_d%;G@K-zKu)JY(vn|I~HTY6@#d{9;tbMtlOmH3Q?yDhO}*E&`wUo z+S9gp5y^(Ak0crczNMn&v z3Lb`^*VB#kr(QONpN+_*f9m)4-FyuARkYB)bg&`<{ zi)Oc0I)05s;EY;Cr*jN+1hDa}rYyPEb|-eT|35MgNO`Nu5+aZfCtEpg+D(hc%% zl0{;tn-{Oblr!R{1c<*}vuz~qF)U?EPZQ57`5?VYP3KRi*1#;vlb*IyTDX8jf}f5K zE#-%BRC|wGED7Km^E~FM&nB@w9Qoeb3Gplqzrpq};-2d9@qVt_dmpxcgg**VA5`vW z^Tk(F>oxC}q1g(svTQr%vxqwQAWwRZx*C3W2N&Ms;Ae&PnMPvgoZOzazJgHFdx0!> zxNSH!=l1%kQgYY@*LuFO;8#7VUk&HsZ7m^f)8D@ly-oiJT|P9gJngH`Lb;ci(unI^ zXZPf&Geltg>{$7lF-xjb!D!0cmG_1?62n{ol^6Sp=WwMJv$oguz)Z(L=;QhUzp%o2 zk{uh{hQ@2|8-HL==>F6>a{UpKrmu*#cVrvKZ&w00R;Jd6XDP?L4C!#~+)DTCD9uEX z<{fg=M8q(ex^uT2;a z(M!UG8!}YcSqS~DpoSgCcn;5dHYrEAuu9xSUp<#W*Oj}@92V6HZcAk^B=^i>`nm6c z`K2Pjul@|triN^_#(gg>ny)c@1g;{-m3)0aXT?ZtDbKsINF-i@xh~L90w43r#$tt6YVrL zIW@(B{Z3W$K7(S<@1uXpZ>p13n&Lv&c}^+l?VhRFk`EaaFW!8q_p@-vhGpBT*6Ts# z?=O3VT2Pi+G{)|R+a7io3H+4(#k)3ww~{0eH?1L!;d3b--V?z*_o(Wzd1OkOgts1U z7xR!*{Kg{H-Ea7z;PnGqm6ie$!8???+We?ZC~52~EWF)(nwT8!YB;$sM_OEi3cf!{ zcLa{Iy3`OI-l%~|{oNxCF?sz6e#k#Y@lXR^9wB*opX1=Ig_ZwRT+SP2uIVH6mEl0R z?PtzOoGfhc&e+clHlE^Jg=yFZ|3-&k*OFPf+Y%}|A9_Of_rGmsMQuz)XilP1tM5Il zD#KG-`mqsF@rm*%vB1z`Q~Z&8n-J3Wfdf>I_ecwC?yd6apf_0_|{@BFDfxFm-OMiB(YRcz&fiOQ?jf^TTi=lt?8Hk+?GLRChw zkwAg-lbz2Khc_X)*E7m)0$>is5FMV=nu|rEPj`vdF5Kx9+x6hxo(fRk9??cWjeO~? z6mhPTisf#%%$amy`f-X%ZU#T5K1-$kP3|Mn@iPhQ}K74fsluycfQ%k(=8 z?Y6y(^;cB-m|dI6NV1q74yaw&7rqee^!xL#*lG93nYNV1--5xdY_IP3D3$h=*< z@tSQLfSjS0`HuB#+^%G;F*y75p=a(9DfUnLKDK*TehuGasM$)s^E+&O#1+PSc-U@- zp+NGiZ!+s4Ut9u|RFodi^u8*r*vdB`(d@ElobDKby5Xs1gmuBu!MR0*^|Nk)$Q&X4 zTpC@`YI8R79cHNWdu^iIMj?qeM>tS*Z0?x0+{VL=e0OPf>T{3Sy5z(i!pHPyBp&`I zyME9p=Xx{tl(%cq%E+-hfhS_$SwgSk_;REPowv|>&-_&~miOT`1d)ZLzE!nU-uM<@ zzQd-yM~N(au}N?3j`jRw$o?MuID*E_qiTeXQ6V;Gyc=I4U3a=)dWg@_7(7OBg4gch z6|Qr-Xk;Ha(lMc_l;!n>9kpQ@SgrROBwpo$lI>z{cieA zDH1lR^KPHrC!2hFGCSo|HwWqV`M6H*th%YV*o|Hf7q82uxa)GvX!16kY4kCvueRL| z?hc5eq2AU~zVJC&tpWe7-%b_Y&dfWpbTe(oxLiO!a|f<-Al=)ulm6H$aKGC!w!WLb zW3{Ov4|+*5te40x=b1yv4lMzg`-LR^ytRbFCDtAwTps&Z82L|afoF`IF_%G03>d`H!`*iUXbIj79RpPD`-H1o>H zH9pp<_Ig14mKMs>$XR@?>U^sA!mBp2|EkFnxhz-X>KsryiTE*ge_ni#J|2%Qb5^0e4Y{+54_f8HSaa= zUB-BPvNx^|#~wxBLfGmGs|1$5CN*bmbKa1)<%i8HoJza;>|AVYpYmiDGo!=ml_iSFuE9{zc7 zwCTJ-Tlh#&1$J7~gKbU5tioI3HYrj&s*|7)3BOCU{L90|LtJA0;!DZM>Wy&%?Y_v**4F!Kr^^=CbNQDn6s)`I&$ru# zua*n)FMHmNukl;kQl*>h?$>zk8w$P=_NnocJ($TWUDT21(wDxsMK>azxaAEt`BFM7 zkd)TbyOny2Ayat(d<9zg)oX$ZfJjA^nf&d?)$pMoR@c{Ifg7lk_vr+ zl59?r7(<8(asdwP#L3W&hI|X7)p?Au+%D6V>3m#HL0(da*)OH(=J#=d_@gteX)k{2 z{ik~W;RG6)Uy2)}4}eU`f8CqD;H4(>e<=80bm3nmvRzq3Q7=XQoQSNDv@wVtlg9xo z01Cd3UGlL`yEI>~5f?{@fbJ9B>b*|Yo!D=S^xQB|GHHwZJqCAL^JrqlrkK}Oy6k=2 zKjSMtc{EY&rL1TWcvP4J?}J)^^L8vwIsK!kkQ?9IZ8>@a{(mz|LbY=0Jz=+a7+gr~M4onn+p7)33++%jEy*F8_AoYE`c|3;o5vw;-6V+_HZw@Xx6J zyA%6~lHSvzFdJ9WxROZ>4?hxLwadYE?PS^(H{LgTdAQPY%qU@?r#SZ|PRtACTrKZ{ zOIw{|g}hbldVzJBXqvpGo^Hh>D!k=O$V^rpR--uu-S}8SL`6CENeliWKOU-7IH# zo(<#oSFMqI4Aa%S%Q3)-pWTai**`Kj(_{6$ITqaD8_3Wid~bxe{DTc8D!dvA@lnt- zhKQU`AG8>Z^=!2hELkig)rq#s{HD`Ceb8lB!5+02jh1YGf{7t8ukGZcG&6 z%<*)stRsHq`9X^{zdK>~tVkz^supp^x4KAjm6_Y#e9y2Ihc!ppy?w~U0o~LNp}dJZ zT+zBP^84CJs!MNA^BaUYM%(4gWi8Ee6!??oEOmXxxEKVM+}bnV+Ay;-L;In9#3{jV zk(ol3nedMm{9ZC<31oo+#y0kpLgOqsI%AJp!@r(=9O|il%12g^4xZaOW7~Qlm4HC% zbdh9_lOX6#cDJN2a|9)Rc{e~(%6T<*6t&Sl+NHlFdy!+NH0!^p_AoXmKC>s@*@@tb z5xK+A9&$8_$nHwB0dig772azzA*naWQ-qS6L0>jo)VgM^+(yZ!Hhqh4!>Y1$5WWmb zklzvKU$G&aQ@+|Q{-#wE92WPBwUUSkh<$sCQm3o^d&|_@l7U8 z-QlMpYB3lTG8_pb5Z}F=U@$SCRJ1^}>oPy3>GmQbPZ_3#l4O_Op-+VB7n%Rmuw-Oh z8{m?zQ_;S*${nJp(->;s?WbPg#Vg}hZi*cHc`vqws2wzw&251SqW@9B3kD_Rq`)8- z#p9J6zTn*JVmlA?UZho*Q&EQS9yHa3T9krpmJ_m+S-8K7{$1mL+63a96XLkE;eVY) z_z!h(WG$263q&oIi2mBh=Aq!fy~QrR+sLbp;AkoK9akd8%SOSMwR-)Q^>u}EG46Rb z5qi$z9qDr+f7w29)Mkt?XPB=~T_--`7Wbnow+xF}!a!XL{LM>(?dSFL=KVg;<0_71 zF3x9qt^FW*mi)^WX!XlA_v?DHzuQ)GM*HkY{B~EoxDa`wdQNGP>vhE_JNgP!{!n0YEM%7g2@q78}4YIDkd8PT5GUqLy`e_!eEy8pxG?Kcgj zRa?;4zisem!w>`D4Hr2^EN_IK3pqwAZ`7h91i5#_0$Mv&+=Ey9koww!)ykT^FUszj z$06#){w@DmlUHSyA9`)!+9JNax-HGntX{x}2oqUwN zQ`5zUhu-yQIVYu!Z0BEvVonc=1auBo02dCD_e0uh<&5A@mdNBtqtu!4KA4*bTk04+ z4bByiam2T$u9yt7y+hh5ZA>m!m8x8Sc(X^@T&~~6U0a%0ZHeh1lu%S%bd_4$<*KxB z^GKk?H_*tvPxg{yFun}9d|I(n_-?Y3eG^CDOCo6_@^f>UP?bToo^{X$n6h_R1b=^JQ2B{2=a=YeJ?7 zzF@*5eeqR-eV#?Qdm|u?Ryc0NB`)ureEnr(F53QAS}2iLczjxyG)mB_3Xy!`u!0qv zLi7Z+v-tbrf$uM+CPOXcrg=K2H&=Y;d_;_d9!WFvp*G^peC3Fpz21SZr z$wxjnUed(=ay7&HQeuf)cV1Pou0Q6p8qUXUL0KEgpX{zHWI14RN)3HIq7G4yo$jZ= zVV1OtQMt)nH_;AKK`wj2D4au69hY0$v>ES>W~+e?t>ySOLSHZv83&1#Vi<{Jr5+T( z(&5I8v{|)Cm=D@azROCQW~D5Z<-;ojv^$1ez=sAW|FoZ1bm1WZ7o09x@y~~obM2Kc z9)4oz#bjHN4FKg$Ofmi%;B)O&}lvfn@CAZHU(%j4*7G|A_!Sc=-fHe;Xjjq ztqZ-PZ;T2(@Pvw0Eu8H7a*7|VC;r-#)>Sx`jZON6X1Kh*bN8iot;!LSu=ZQ3OZa6; z&}kgzw2%h}W>H`rrRx)Y#;`g;bvL4p{n6(nPoW&D_JmtEoYpP`ag#yH0o?iSVTOjv z3n!G)Mc?cXB~RsBf+Ks(At}u#j201lD~6rqm}23pRhtjqUQYOhm9lQqS@Jp^Uc=>HiQcaqudH3oI$asIA*K& zTN+4%dR=WQKJKI+?jnF|6{A;Bl=GbM`!wDnpst*D5xNtOUQ5=g{V?hb*vh}|aqzqo ziv>ohs(3@zRN^PAW7#@dYbFo_=v%uX8fDCz$|7R7bGN_iTM(^m#`I)j=y$1~kw25& zZ-pYpwXruGPV;HBW2bqwl6e`Qh_^ee;$65+8xWQ|w4t2OI); zNNkXbw*((iuQGkN2y?eU5`~9iP1O!Z60|re&z=N9IzWXaF^?;Dbs2&z?O-h%kSF?3 z2d~}#Y5Q6zbJUB6v5yLJJ`qt49?XrunDZ7ZhR5^6541aA0Ov&?$_B0aKO%V|8vxx0 z9F+Zus1%1S@tf@mRVnaf`WnUP>`{B~gKhiN+exLNH_hI)T18Qtg9&W5U zNlbvKvj*QAWkr%QHa4~gC4MYtt;n^z*xlZ4SqN(0iYB+xw!PIsIiNZv=*cKb3>l-*88yCfo@;b3^yG+cm zBW-9{1_dIERb?j1ySDdbbbzCV>w$!uwaoYxsy<_?y3EH%B$L5;+n46fa%mFxJ6<05 z-wFV>6;xi^lU=4PY`kPpb`q5ji6dgAH#zFk`5VL`o6_h=}|jhg{-pRnKtYA0vSL-YcIy|PXHjb6h0??J6n2llYkTKVl+a-tFqQHR!riH*;ch;~^ zr44cK6olum4*`FWW+~EI{dc(*v;sj$T~8Hv-R|-X_&|{7TH&OWhF4Nxea+^ywG1fsAO+0*>jt!vDH?Gv+Z<7h_^YLj1pcbWG-W zV)H7Kd(??^EUgQw{@#%Wr|ZUM(zCjU$O1EG$-RyZK$$vH>w?M>H{(>BE;0vhaQy>Z z72Q3Gj^z&XunGDlJddrl9qrldxna=>xSzmSw9OT$<%(0cYRDL~OK&~b{->4Rc2^u% z8;mCJr)OPrmB|4@-gtG4g#XsOS8vG-VaQC854H~B47P9Jf@X|fBObUs2kL=FWlb1k z%DBKz-9MXM3(#}iKgX`xiJxKtx_O&jccC? z*#Lb4hm{KC|Nfq`CRvW`XCRy55u91IYbW!2dUl~x*}D`dbceTd_|-73?TLWXvpSo9 z`tWa^ku?!Oo~r|MtixzsR{5o43i+>{+_g1Sdnt+@kD^tJ5VDN8>x5AWgX;&V7G;-| z(YAfr4|I%vxpflhb#36q7+rv*rhb?&`K)s3XUO?c)d&@Co*mEL zahOTPV*4lo+%a1iK8CphIa;6o57i^~F!&3msR@dU)^i$^3gZ751b;`wPP(MD6=Fr6 z*HHrrT3NQ5-T;v&wPGGiZ73uzIVMk>AT(Y6KK11(YF_dfbA7ZapgJ3_;Az!&m*P+r z!6NqJjeSVk=fYI_-wuo^v!rp1S>s3e%N(ko-fD|gyJ56&yn&;=t=XenCn+p9L$yif z6%^OM;_Z8x=5KbE?RUod$@+@%o(VKHg?piD%6V!9_E&jozAN6NIq-c- zjW<1A)qK_Gk@WFX>hk$X9%NfMvS#l;Z|2MQ5Gf?QG@ajlr}FE(&Qd+RUze?vpD1_i zIB!F&%cTnTJLZrPX+S(b!R$)0k(%Z*S~p#u;2vj*rLD8(>}$)CyugpLOzl(%CfAC! zo1$)B$_)Ie_o``v2m5YUrCCFiT97$( zXbY4n-ER>laGpckrk~E6$#&<5u@wM&!>nlnc44kW-PR&6sxwM^%Em@*Nv)A@O6cSy;05Z zVeJ-LA0@c+A4F&a@=!X!(w$JXHsSRWL%kj$iDm!0K@tTP6G*`@b8Q;e1*x_IIaxv3 z)ivC<>_I}u@5X&Tt6EVlKx!ee$!86K$QO>Y>aUD_*_0}T$V1o|(-Dmo_S z_&%3>+%Q@4iBY^54fD1h^1NFSe19S??ApV7Idfug#4x@w%7R_7!MUI;Z-3Lq z_6YetlWNTR9%km==72X8E3SzRZ$#}8ZjIt7xW}4_R``(Y>G=~XNV!sQ?Ca?xJO{NH zzXCNN1U>WR^C+rQ>h+Spa@J1QWK6mde_^f|C(w@@UWlp}KUHLJK0nSFHOJjgd1X3~ zv+wwJF%RdoJ~3RcC$>MGFD*0qD?7EFF!uGX^cIG|b3b_}XHExlvNVPJkLT>qu6;qG zb+J6c^kP)q?eEPyg@rajZGHw$dyW^?SB}AACC%*FwyvO^}4)-*W2xT+oDh$&)Qt zQt%tJB;nP)J;|Rp9bb%}csRSP6Z#z9Ztw+{UkTAY-A6U(Arg5v5_ccG=o`-Ze651F z+G)u#F#dS6w05eC;faM3a&73U#T3;bY=tk-_$24HOsZk&ycoec#JI|$Or_EO?w z39Yed0rutE(+nJyX6oA=tM^)#Tn2Yb-pU`Nq@9YXUnHK}qD_hfKpMcR5-=dvZ=I>? zsvWV`VpT^n3U%Ii@HFQp(O=JpjBjNMH{d^xJ z_WUrfV{F2QrLBZ>!TLumoa8JoW$*>pJ&ifkB4&(eaLJM@qKm%2$7?|2Stoh}VSVUH z&#dpeL@Cwal(~-`vpNx*H$+s#nr-*q#;<^hMlqSXsx0k!Qla;kX3I`_uF2y^HQgE3 zlmLN*d7)0Qg@h;C;*oaG#KIM8JkMX`fWg=HJV5Du7Qb1oZ4nWF(>t5ZeYQPUnPt!` zQ@|j0vA2PtCvIX2r^8qd-jL@H41tu-7))VZ4`{#gTp`H4t%Waph^if=zU&JA56=Y` z)oj!l5%x%^lu7o(pvPFTn3tz=627-sbYJXIMqTI^!27_?kFhBlG0M2Lk1@+ctwxBF zz%QC4vQ{|AAct~*#SiSo(;Kf3h@-fFk~waR5DX{;hp0?6ZlG+5EEaJ9^0mW;lEMTu5J8*Dd<~|)G8u4GJ(gx3)putQ^6!YgzSGuR5 z9|UEWV2xC)HfSoXjtlm06d;7}YZI+r+DUAz6OE-q;*^7j_58tlUY9A_cN!KdOQu|> znjc(a-r|^I&Ng_vNhikx7<#>0K3~TPEz6X_+E0fAiS-;UUKD0jH-;FA&Qak0ifa>i zE)~2>GqBddr651v1>S;@p(mgg@u9uk;>65cG73bbXk>|U)xH;dw|w=ImN5QJ_Od;7eZ3~B)sFyXB|tdF?3Q!_&}UexvW2NgOJx46gM)`N zmFm#~xRXEmkoB94Gd>A9{oc9@odbx zW;+x4tW`%r_x_OY@vHq<-dX6u-J3-pSM)qqX37$_M7x-F!og3D)&9l#?vFt z-%!fu=M#x3YY1FA8f5v7Zd575rYGH!)CCQemeEEH3TV5f=Doyg&MpXb6U!3Z|1{hS zeM}5t$M;JMQ;V~qVi@c!j=EN9%_I9d-R)oFsChoGpJqiB-CX&u)!ejdJt8whxQsW{ zveH3@p_Pl*=2B%o$>x(;=bp-|%rwQr8ItF2ypH|(-W@pvR(Lzq44s2rCGcaok9kRG z>sQ!%SO3*+AN29I5OtzL#a>a>b1@UO;Lv`yS)cJ@1}k_}+lr{r&ujzaKV`kTI(U+s zh$Bjb2q>HE_#ODVx0>%|8622h*ncx>WB8@U?-xyf`mp2M6qs^F0PWIl^ZkFg`|fzG z-~ZpH2xafRD?-Q$B_lh@4k251L`L>)CxwiJ?5xNh$x6yDD?2M>uZ;V=uKN7O_jk^D zoX794a~`M9L!WTp_xt_6#_M`ruj@G^0LN|$&_+al1j64;N3s&o>;68ji(nY(=fugG z&+WgvzopVY5Y!5C$4=i0QeOIEHM?bwJtgE>vCmXY5$xJa)A)ncE+y=SMtA`i>sS=M zqh)TSgWx}-XfT#W@24q-bauSK|Bmw)p(L-Z!8`8L&k^D@OX?sb(Z22lLI(ab!V;SC zDDcH=);H{Ow*-5%oHB!he)92lJW2`ol)BzA-~2wL($;(W2sT`2pds$(QN20E9_JV; zH+O#fi{C?bwh`{oBFPa49xVMUaK#Y8SQoe)@aOLs?vCbGEjrHFcT@0u;?KLR(0m#k zvn8evMB83S2Bk3G{W>+AeE~n!Ho{5JF*1K8vtswkC%13>4xSf<_7ZQ*Pq5}OJ#XAg zocnxfZ9lv^jjFs;c1+-H2tk=>0?et&CSU*{;>SKvr&IHRm37H`|DmD#G&zuUb&5?+ zmXCRh3z&bt+xC;Jj>^?VF|c$1WZJr zOF+k>UjjAJ5wO$I2?+>{#T+o_p{!cO)81Z`eunb;IfWdx<#>f!PH#USNtv-oAZX26zqm2+b=%Z6C zV7N1gBYCZ%N_J1D+>%j#=KmDxc#s-DCO(bDuBQI~}oqD_hv`;*Ezb?YmRb7@riNOC)v9PTi19i2}BO zp8FLBL>ZcFiKK6b`+k6UKn1m1djIe~<0ZYs9P4+Qd8ve~$rkzxEr5H`H1cpNVqYXB|&J8r8u!c@~NT`278o69tVKYmu@;JFae*uWuH{h;&L^&~n^Nk&H?nX?8q z8Usi=zw}$Fki+;@1iSyFmOpLs=hIEx zjyGme^1(<{RbHJ~yY#bNf9~`*iR!a)tylLS0Wo;ewR#YkwSeqT&mXCFiviMNu}r!; zcRNc**?r(KwLLqhVVPG{^v_g_yw|NDs44&OAZmC%Hz`|g|B-vGA>#A{!+EDCu1+TJ z(2niX$-iEdg+BPIy*opATpxEWe&AU7P^O^*x|jz#YGI zpP|lFP5uO2n?FOGXz~VyH0F!|5CWjZ-qX8%Zz$=M3^UV3RNd<3I$EH+Uub_T@^FPI z>!rteKwabW);s|UeL_VDDW_AX#P$mC#bX%{=Hxe)hT{_LszQLb51{G4pPt5p&ny#6 z19X1g+6|IcQz{(c5f@VQCGQNZtv_FEh5hX?n=NgCVe$IRzX55r$cca;C_ zpKRQuf8Q5Cgx41Lo~3C%`_Ym~n?7v$x0b8?J9e}G%}Z2$z{lgz5G5B9dFT&s(@@!Q|>sgU*x z@~e=7`U7Vcus-L+Af-=R0G$uq?oVm-kktSA1_)tdtocF+w*Xb*`@=vF0VF>?yOdN4 zkadaNfan4k{EDTr;fFtSvWQsJH-C-LmJde^FSWeo1`1ZD6`=EjjG0s=|7>gir=3HZ z4P4Qa0-w1FZ!^N)(;qZ2;(%1%U1%ir?ADc)_s7w?1EL4~)_q*RDyGgLM%OI^1A6D# z4ztalUw00?IaCsw^2ou2cd#ktaZw%zAUD@~NeuqCQZ}&6-2Wk?scQ z81S2YB0~ZSS_OC7x)(>Pe+zW#|=frw6d~T zU8W{ZR<%(OMp@6-}TQcO?=AZtD=DkNoEk0V28dIa#3mMNSa` zX<@q?Bp`-<0@L&UV3~@Z9?e;a4Wj#%BX*H3W%q%R^KdRT*s^`e^{-f|81J7h9WagR z24(^f^3@f)^Yw+F-9mgoE#Qg*&AwX;7^}eWL(FejL?@r!DlIK_5JdD_;Bf#a2xui3 z4aM%B9>2dyK@9{5`dnB|AmKJMCj z5;XYEh7wW|dUzG@e>96rHe!W?dd(!rHZ%)#UO_CKeBh76+_>}LtEQl!AmZF1k&tf0 zCixB=59N5iqm6uM-9?}02+Q<^f(pM!zbb=){)763!E@yr+|Wf>ryd(qDW^y#FBDXt z`5TSh|Dz`G_|F^#ZKIAGa1aTopvbAa!Ae{uQa*HOdvz^1b!Eg zEpOerB@I1B9J27<_s_hf6LENqvOyT2Kps@fgO%?I(xuVWZG%^cZhv=f`}pxHZnO?i zY_9_$M;-{Ul*@H{7v0_6fxN>+G7Mdz0|d0c-*ecZqPqzkEd1~b#MXgNX+^xcV#Llz zGB1pWE5Sf7W+DleJ*5Y-DliB=mmiI#16k}Jo<30XyY$x4m<9G=LH(fzNRd3;Uu}H> zG7Uf(#x$kBo0-o_$uz3>MkHET36lfyDUl2fB2)nt3!m~LBJg?c4Uf%42#<~fZEYHq z8CpTvf+*y=jf#Ho8Tv`|37MHVz{CVjHH#y?ms-Up2GdHNN>aui9-ISOB5>z1O`xKosHsT~v4;T|Spi7_7PrGYz^`BwT zAc>a?M!Tm$eTj+g3@b_0lnAh_{b}uMqFL#Ij|VFl`uHbsXWrhDpf5BH%=fEo94Vcx zAmr4T5oh>m6~$>pCL@VaIF*y14=h#0#mxgD7Z42rhOk%)*kbgMv(#58FG@A8Gk%MeJkEeooCo(G`_%W0=dh)>KU zofu+Ps!R89fegnw4PqSaMu#N8=DyJC2v;NNg&ms;gwfU#t6mNmQSo9A&O5@AND`)S z3V6Itkgubh{n;%bSvxs7%>mg~O=6P_>3F~*fJCW)mB&J&0o>rJ)vj3BR?(dyopr5- z$oYz={Vi^ABP?e(2;kzdc>(rsKB!B{K(~S145lN$rY7mE5fJyzi4D*G(qFlbF$xI zx9bjM%7+k0si9Aylg5E{X9{v7=oXX_j~_%8W?{(7yBNZ*btZ)KC6nFv3P%ElD^%U0 zJiuZDLZzzIfeQ^SEpbR&nm-5@L__hi^3FvdW}@8!3X?#u&Pq%3gINKz&32&b5{0x1 zszkni*D~!y90xywMMMW=3qaii*!fXMkK;Uf`V`g(Op^vA@koIS_H0T(Ax~SUfo?$& zd~bVs7P`+Eat2TeVd$;|B4CN@k{+7nGA1Q+Oc0eTAdUiw*b(Tm5IkF_jA5gv6N{vq zFc&~C1X8IQXdeRF%LLI6Ve12dw+wi!@J20=OF)^{;#hqOg4LmN@ohU%az9L3-J-ikA(d)|cAa&q?9yWuOTi=M zKq>-yh_H_2$&hv$C_b=|1S_0^Nc#^%6lN0WEZu_vio!sJ_rY&<4UI-9dxU&TfZ2tD z0?Z>8esT&5pkKCuw3C&!wFxZDwj))~K~1CgJWa$~SZqLD=L@K5z2GxG2GrF*w^>-b zMT2y>^v8Zv*p<_EyOWcXLt)?(C|Id0qN~8F-+~m?lGPvsMv_b9iuN>Z*b&Fb|VF|F!u3Cx!m=d9YW2 z&!dY9`MU*_#srxC-D(FAu^9jFc6EPpn}2<&t|vp8w2Misg1%nsoGnzE^Sks?-}!&L ztk>El76ip-+mk`Zt{**JdX(etu^?ZOka(PUocz+VqY-m&?ob7V5T)6aSZ2lQW5Y|_ zrP9`&2`Hh-CXa6Oj{74VF!7jB-WqqT+qF3wZS;ySu~(LOxW&gYnTk-M?U zEIvNSH^diZE=oP$m6&>8rLCU3%(zdH=1gl;O3EzLZ{DK{08$x~OKM9eC2s9-!#9(* zUXP0mpnQah2?Hvm1GOiGh4x8Dz!MRNTo9jT8A>mhz8^qjkSO~oFb%5RGp>!>2hMmS zzb&%uCgY{mC&`Gb(qJP5`Sa&D0-+9S5)msSoqp+}nKuJOGFUN9n$I>hJby_dxZITE zZ7OsZ%p?ijQm3|ckBc%0NRhIN(_=^CNU9F3vhAcj^*}!np6d}YXM)X#t9K5ZL>Nl! zDa@Jh$9M#Au_pW?G|}J6E!7? z9UmTiJ5r;abh6D*dTgH&aDsm@aIYl7zuW1sh7}pPrxeV5_KN`UUvh3HB^*Ey*nG-) znDtV1rxkx*@D5I0qQ$sazHoQeC`;L#!J+0G<3ODl)l`W)*MHw7Gf#KZ?0Wtq(<^a5 zJWoekPdcq#ss31fb^O-H&YjB{@6M)KL3EF7NlVw^7-dvx72=|7Txb~7SNIVd^XU|Tt(zx6w-O?8ik$jsp<@lW7gT(Ib59Lygs}(I2{>I~P z29Ju)@Azy9NspzR{X$&F)n9Qm-m3(6q=u-rJk+Q1X2484HqmtTaQw=f;^xwQTYeAi zlSTo)aV2|<=9|BKWs;6J5iTE`j+jt^4hgBK*?6(>DZY7VTqlzK!n8C2!TCgrXx!fx z2d4|4x6fQ38y{P8Sif~S*5G4tlJ1Tq4#o2Gm%*7Q;h=^h?9624Z`<$ll40B<^@u$W&*sb9_%AX53lG;AV&M1(PxSmJwl!|I^@ zFSfOI%J*h>UsAl^PMLjm{%5h#!zfcnNs-3|w&NugK_}jup{5N^#Oxp1chRM?QjOfY zdCI!$QJx6(yhC_w3J)M+r^9+=EJJNG5`C^rN8t0XJei>NZ@-bMnP7hcP;zu?nLaE* z#_EHmxZTBiX^#f=ym^RckH8_=6$*N09=z=z4T45{^4Ydb7k_tM+Q$lz_Q#tfeH~u? z@>2T8s;0>DVy3|vVPdaI!tcGo*R^N@SRNL>2p7u59iig@Le$pegC{QomcLO8c2+Q& zUcIOwtkOD4)TG&Uyp-eZib@gv(-}j>J8OP6R+W#4f0f{*(duI)%SguPjbsr@HRJBg zy}S0fBwm)(mPMIo8U&^YTr{XOwZep|FlfY-?XP2xvr4>ponj=n_*F#)Ye8Kg5Vm^9 zmBZXlxUcT~hbV6OW$sq5HmWz#fpE0>i59bO!q1s-&~h2Kb&hM3$G-Q%loZC9I_LFn zkjB{B8HrmR>2K$C0Sjmay?1fY`TX&>v(YaF6K=Xtil4VXN*A>49a0g}Y-W4KfjIbj zVVC&SqmB7332tpM;1mpMtxEKGri)5o&(So}-dKJ4>8C{Vk4%GW*JcQJz8?j^)*xVv z0d2hh%a`EOt`9I~Aobmod`|`&P-8Q3CruEi`27!H-?e8r#=;xFO!??KIS(-Xv zztkco@!0LBm5jYtkgKDhb))2>+xGbRpCN=5EnBVY@A%_IsYR+k;bHrgZjJ;9y*aYo z$6We-htt!|liXl9Jo>rcix}Tp<{KNSW;-*6el|B4C+~Pw^{(Zy@7N_@TMysk$NBNp zrPpPV@Yd5ztP)eQMEF-kQH7abOv4Yx1Z$$};@T)Q!Lqdsf~9{faMkeL-5Q4XHK`F7(&e zQ?AcbS=AB4swAao<8%Gdy^K3DW50x_wl^{)Ya)40Sr9v(;SVFJD$Xa=Y_f8a+eL+x&aTOM zSC=YBK@fXal4rZ_@iwi+wcIFH>XBPT{kB=t@@kWwIzh7^1a2m7tz!rMNq2Hji?0rk zIsdA(*$N0?3;51`0#_Ut7ek~=PF|iCsi&_#toKf<_@||ToZf|{R~q{HY4@iEE>;}> z#bQQ$FD&516R%2NqNh&+*xZadc01?y+Qg|(Q`wZ>*^!7^{+Y$MTd>Fan{rPi_UVfo zE8XR**h#ZDQ@_*BEaFjz4Al8t^c|~J8h@$Xl~_X;g+0}2Qo4itz5elvfD#kW(bgr6 z5N<5VSdPgm?9FnT_YP=a0f8wyg z=T+U=+$S|F>KE$ z<%7FwerM~h{b*EVNx4m2VSlvsRu4%?!RWQ|UvVK`y8cUViQ~CvH(D;eI(3-xg>$Ei zmJ81{lH5Q?b*`Db>Ab|w#bo?ZqOye!*)J;1KG& zbnN!rHsfUVOjOcsK51=hyf^HF{A3zcHdnqJc3KkJF|j&cdiB(DSuNe3S~nyvCdQLo z|IEnyT#17l&JpYvR-G<0B(*f8uV-8B;!mIAF!`AxaMs9DJa79Wq ztb&e6Sb*@d46VA%xNsPgIgxH<#CVC)t2%O1H~JMb?-7?ES6AMR;}J4r=Yq`{C)|~o+kA(l&c@W0 zL=OB+_SAkhIyhh+d(E80fSE3jnM^_^)R~OB08emFyK7EgI@g9ElWmVFVgCaEl2!bd zI@bDY!ZoEQzD;$liM&jDw(Q)rcU0bUc{0j2yk?)6@FIKF96lexu_#`SGEdsfftO-^ zpYKI-YUvWH)9W3Z+vMSz5Ah^#q?9Qfh&or6b%y z5qnHKhabpy<>lhlR}%M#p` zVjaQ#i%`gn>x@NxJre>6jUs)`FltyjJTKK?&b> zz3`Ez!8t-VRcp8JE02(57HxmD$CGh&YATO6Agq^BU%ba*h~X`b_&I}Rq02LqKSVLjb)j;Ue8-H*@&bLvi>}4Q6*l_pg;AZN z5sg)MBiq}YDkk8SQE*yw3;m!lkCT1gDAD+FZW@~?zn;IRfui*>kCK$gaC1gQ50){U z47bZWjZ~)+MHs@wNf$OsFmFbEySwDHEeSoZg_@qoDR3Te-Eq~sPFtjVNx@l_Ew`K` z{8s~6q!6FTve2#Mbaisd=mFx$)`AC|oV#Nm)vEnn6{JIYo?LCsn zT190{RHyp{mbhfGCVor4`6e<_x*Nw<4-PTBsIzqkc!n*7!*Ut|5ahXOeL>pWg+OUe(R2>KDX%}k^Vb> z((WLNv}6P2AJdvHfp=ZbM(dEy7qp4I*@doVr_1N$+?L&+7%9aOHd&M3y7|nJ@woHs zRO!}-z90G>#YtMir?ogX>@rysW4{y&D$%6QF%QvO@8V~M2ZRKeJa8ck{bt<%cK&0g zSr^T|pKAl=R9FH=R$(HA_$zI()dq8**1^-N!wH^ zBd4c5cL-ZUv(j`)Oev_R$mAEn{a`uBd3B~u0 z@-LS7uU?DoR)teAS|=n%J}W&D&cW-VmT}=+vu*`L-7##s{knlQUTn-Sny4>55wYXe z$}k0gWE}*28<$f)?b`8kS8{ma*Xzmg=GP(}#tu>1qAzbOa_uF0x4vXO+pGR|%2q72 zWvGigr?iAChfTbLg=jG9>(fX-LVrGv>J0JxR23Jp$Zs(-B2kfxdK43u64DsbUK<+b z+;x>4|Fz;yI<@hBe12Dk7LQFT?&gu*GU`z##n7L&t>Dk_-;ON4;5 zOT0CII{#?e!uEKL4UJ-ypo32FfhEg;kV(q&>kC|Ms<^UOHH!=-kJ)O~#oi!uIZi_7 zqUF-a(D!nri-YjU$;B~RSqqu|Uvf(?d|kVtNbI_P!V*8tUgG1bWpC%P>Y!Umfo8XP zm4})e-)A~rQdGEHFsLoUQ!wq{X(^<;ctt#wC)dbxaZ>?{b_Na$^fXDr@B0Qms zQU%8J>m$miiy~n#2KmTeW0M$iq}ZrN{Dp7J)-PJ97sVvI2*LEuvGEFvq^VhszRQ~- z|1;|7bHfqu>uld-lpIiBhrJn))4th5a`jZ27&J?1N!aet2V%0|h(gvXSIQyxgPV$P znVUl%tQ`?!tuhzhvT33)S$eI<3e^v(*ap=1Hm}l8&g5BY z;7nFLI3GF^df%M7?1dRDSjLIELI3_uDur3kS3Upfdu&N+=|0p;kvLktJjOKg2aq_a%}LkDVfYW~~DL#s!kGR^On zY}~yW6<3t4Aoy^MwZTx)@F&k>#pTbHGA0ppgl{s_8}sd-B(8bgN}lTKv)kzS&9gb` zwrc@bBDgLu%p#Is+ooKD>6m-zLau6K|Hhg_;+A*7Iq`YxBt2f$*G60TE@}zB?cc(l zeinUpuOpSs`3(CDXRfxS>k2b;ikD{ZzPrZ+;KS5zS?NyR=EL4|72eqEUAH$zg7G@M z7}LZIn0NNhIv%b$y`fBzz1L8Tzj|d+SmkP=r1W^(+4tj&86w3-;;}l-lBN7!MP&C#h8=PD z9+-yQ{~oN~`#D6Xb^CZ6eT23AlC}f+8(dhV}OY2{qp3t99SwB`q zJb86J<)dO1or(ghwV?CdTv(Du>GMwsc_NdK;u2zg!_RZeYmnyH=zsK`v2Yyp=vL>_ z`_l2ddOmqm9OuX9EcS{>l~eV>RyIpf^C<#Rc(sXmtv?6UrSN_3iPHy~zVp=G)9^5p zlq(Ex75zEM-1X_i(EI_pQX_@}&blb|F=-bKq1dOtJn5s!haDuH zPIinLT)*34BF4J4tD1J)V=}>+Fo+k^y_hcWf!8bOpu>vob2YVzSaeh##`{+Ds!r!p z*waat4Ku;|*J@~Dg^h`=d8#O{s>XN~b&~9um zk0VWf>SnxaztqPkHRV+LrO7kz6^Hz29d*|EzLwRr6uk_iimvw~{5mzLw`Yp;qwcC> zxje3{&48{CV{1v?;ZdBK4hzr1<8whN$(!4g`1UOuW=lL9za)btb)8p(%HC#daa_$x zXRX^7ad6?g?oksWtMa;gn_v8=c{jDLLL5JTn_9KpSgUPrCB!hDj*B}9GbC- z2d!#;pO;FXne#jr?X~gAGd>~Ky`p#d$NTPC+|tDvoiq8E&rMeGN#9J?dhI}EyY5`` z4r5Y4>r?}r4A<_sCC&E{%Zhl5QDX@^9dnC1tB97q*X=BOorEpV*zL*c`n&yy^%Hmo z@8>`A5xCG3(7Vu^sAJ@qX#%NDKR_YSe(YIrHyL@J^)-##+@YblT-jV)q0%+QBYX_( z0)eoIJ1gEOo!Z~j%zn|fQ?ScA_H5~qg@*o2i%p8k{dON#RUU<{RDy+F1|Hu{^mz8U zMqBGLk&&$c9q1rnh&l!JZV>@c@rR=<&U6-4<)f`Wo@X<-@b6rHGrPfFw$7LJwCnqJ zh<6!+A#rAsSr}utm6*Ps6wT4W*1bifj8 zcM)-#U$u1>Drhah2`2a2Ha=Ew_%Vk=aNEm42XIJ^o^mPzCs^3_H!1iC(k_&f8r<$U z*G$VIvPa+aB9-TMLs``@&_WAdF{_?moAF?=FPMD>WMo)HPWTZ^V>gecVt+r@(BtzH zah?mJ1Q_G#e{iR`%#*Qyk&RH^t;qQIs=Qqe9C`ey)?@T(q%ju-?hgr;*^fn@M#(#KusxPF0y2`#fSMeH16GjeM`zjP-<|Nm6hMUT%pojL^y_9-{@6yegkJu2&Dwa4rhXo_X4)a>i+$V+}uzwlDRtsD%t?%{4n7F z<)6TF`^kQOA_wO}Ly0CoXLc);U63cV}LaepXJ=@E;bg*#!kNZ%R5QqvaV= z!6qO+l0o8AdX(fRPMM2eRwNJr9yOUq19h zNDMgEx&&|*BsGr?4e!Ij8xpV8)m4DQXypIWZ}^C(^*o4z!g(zc2EF&QFQ;@EG-E06 zI2>KB-DUvLW#a}Y|ANqW13YNZj-9BFJGE9GdEVF1Oe-C3irbp9nwqGQ{jM__zJ z{R`8+rx;$10It%~%F1}+L*PDu0-!}DjSu&C+5iwGZ(ZhZffQ^9^d5pe&?BSd2?(7hZrO`=8UaNgtTjbwV&95tc8UL4u}Np3y4+tarf7CR4xM?mNJ3l@kO*Kw-E0 zSETqaCV25`we(f=XRcQzIz{u zK+wIt@vPKmFdP9Gf+utd95NzUEQ%I@Uik=kIdlt4aMmq6<|&|&sXPIY?U{$DO~6VFO~jlk@031505vE#S^q@Yuw8mO*ug|{ zl7!st5rhD$2(uKa{?hB_Ybm>ZcRU5+(lxs?iEJDkYduQ5s~|(&r3+`(KuTB#e}gG7 z8iMZ11XS7@;DI2{h%CG*;cGVGR|Z*W6gOP@Y9G1%m&*-hWM#!XdGa1&zdINmiM#|H z6wX9x7=ALH+DM}TfUAHaZ=%ST*k>kpRfUkF-}sAk0gW+#@{sN-WatGXsR z048Vw9Rw=jk?+9zM;RHhfWG(8kRqI|gVuk%ivcIN!k{Pt@Cjyqeqz9(%q-A=i46if z!NIm=LXcHow)&N=0aFkzM_?#rILQb1AW%Gqc%5bdSNPvt703e0fc;?v91wE70GymJ z!s|_m0)*2Y0uUMjQIfy8{!S_^V2nL&5MaahGA%^HMi-d!UEjX7m_|v+0Z{F0t|p>l zAoPzbG6@5W8(P8MA3u9jOG{2#`dCIr1_CPpF9ZDoLERA455*N_O0jtRWaOJLYZmtu6J<)23Oc4MQ zpmt^T1Q=L}X5wG0cwAO?nc>kQKVUQf^f8GXY*r_mOG|XP5zY$GRBK=(hTMTx?|7~@ z+YY`BgjfKUJ5W`G>|m$Q?q=f$q1{eoBdmuP~I6}ajbP+??D}D(;xFRqHQu9anv%iQ^h>`I? z;82E6gC!pfoZzuxb$0zz`6jD>i3rniReEdVo~U8|E3mKo&w{|>De3hAWC((v=->cfA}MI#Fq zfIk9j0r+}AdRP~7m+vE_2Njc{7m)EzCIoa)_|E}27T_;k0^ubn>jLBz*f72a(>{de zmG;y}#(Q6_WqSn$Rjz}7*uSN234g9PvHFnc&$J_25)^}-B5McTpRL%JKf6E!`Thq0 z`v-p14K`^ul8MAyn&e^4ex0-F=@3slZ9I1)LB& zfef`%?z1N>#wsNA97sw-_W?T#z5{UI3TkQ=u)HH0j_Yu_Jp%s03&1jh8rB%E-y033 zC?ld1_4{Hz1$i4RsFz$9bzm<7IMvd!vRgVjH-N0=T21dbgIeQ%m7RM0nbEY4=3of< zU#EPdHq3Juyu>eZ0GZr{0B&VtlaAKk<}(7qHARp|A`>w+wJb2VK_(yow+H;_ zK#9d!z?!iGf)9)-l)-fZ#YyEPk!Wa{Q6H=qr0obSnh9$lM#$zHv}w@aC81vfI7u%6 z*^ih_$f*ioeE1aH<6tsaid@@((sj?mq89-7fHxhe_mP4C>LUkmGPnk~#hK=U4=LOm z3?h?~LGX@5bPho6DMJ(oFkLsKT(HE#atW{1fc-)>>QEgW%!r-E&dLO=+K_Z8gHHw+ zVxn$?#q=-eUzHHep7h-Fh^+<90+{0xuzncz-n);GbbzgdjgIG98z=g50c%b_AWi z#c24Wj14SHz$ggvu6Rgx(OUQ?g(xyU4o;1K)-*-M)AZ~d96h=KZD#_P3=}kbvc&NU|#I#(>8W7bg#Ig}VfV zda4yoGPpy^!Vds~38f4~78`;VR5vnGlLuQ8$cK!o-&az$?rEM8!ZHNic^6o{kLaUWis4s!1QgunO&b;Sbu|fY0Zj04U>m zD;(RP@VELi`5B@T*w!RPqH4hd$V7p39w8SZ!vaWYFjN8dxeSxr!34E*IoB;8MnL7leNyNwmM@UDp zWR$R|r^_)$M&9Xg#$D4qk~-?@}mQqiHxVU zmDL0Qo)M8T9!%nPN4M*OzglM`1Lzc*9yUk<;M69w-#sVI=(%zfOrculT_)FeMPmCG zG9Ur~{J*zj-i2jS1N>ZJmyPV8z>*ZPthAs6fvg!}(}L~}wi*FMtF3$lVqzW}T)Z_a z$G~FAq9vRf<;?EuGl;$mvw)=zruEv-yuzM=0ZgV9@GZK!TN!;m18f+jiZ{suDUCcq zIp70q+K5(Xp`3+mIuXwUhy##QE+gtJ;>0L3`t0-HzkmO`$3i|hNF+g#E1zCZd&K1Cs+JFUY46c?wufCclAps#EJBq?$#V(ix0VJ8$rD!odOjnw+Pf zYdc*5H%aijLIot)i&j*`gN2ujXK1qtggR#+IiYevqy=zZ0P?&B%!(&ag?j@2F+?nf z_n}XqBRj+vxFG-ln!9yj6Is2=?BfMWqb5Qd3xKyr!X~^K7}~I_VFu3^=xdmdK>%jm zApueZj5A8Zhs-ds*d%nsOx!X%%{ z%_~R)UINOR!BwaPX7G?G-5I;OUGsvPHAR{ITl3P0vIBJ~(p8UISSDFi&z=ePKc|uT zrD_qCM<^r%u;=wWuyu*oCn@x(5E0a7l{RR*a zp~L{Amjf1c@x(8%Ou&)_UB==Kt@1QJ{)V_gKQjM=irUpA!`pS&VTeQN1M${jZ-W#8Q_5(GJoOL{|brQY#o~y#V4uLMF2+FGW}& zDjoqT5d4p!QaTMqmZsOa=UM7d(gXY`unUa43xztjV$q^E=3JwV>k$4+jLM#vQpFMUoDC55zW9w^6VV9Xj$CrZNnH?F|Mo`Kp72dv{T zOjlw4IW6RugPm-kNG&SpBD*>kIk1;2)+rja#q78MI|_wlR1Al6fys^ZHF{BqLkM{fJg!n3D=P?# zN71bv0Q(762_XJt7=T&aA6CI+Vj34+J0Ah$u#+3lf#(AcoZ_`b4GT182R50IJH5Al zhqmy&>cDJF$aEZke{_f*=xs2cAyaN*1o|klDu;)Hnuc`J%iDFV;MfH`T zC6YgYMDT>8hm%+`5MJVeG)W1yVF-OlB*7xZ>#{Uv=Nqsn5qYAZpr!P|f|l#@s0x%2 zCpW;)w-s`A95xMsatX@CxgGpU18;VtpZ> z1J(*6v_S9C!Y&@TEK=CrP7w70cVpxV1qu_G-d>X7pUz$W8(U5|DxkAvDcfY4+%TI@34R(EnIlx>Tef1ZDja0| zY5|HBq+!%eY5XkRRNXhAl%E2MJauz#dDXdTLNk4v{ZezY;lwPLE7VUUu)@~TV*3Nx z*IL1cl&Q4LP4jJb^Qz@d_y7_a6clU2cF|H1=3{o!&wRWt25B9Uz^SWM6Hy+*DslbDk{Hwb?!U`It00mjzK(yxlKJt z^~>>1a5zn|^Y`ZB|<{8i#TCzdcfnn}BSyH--Oc{?A(|31P6 zn(Ij(07}zo-I~7F$1u;Od#=LVCSNg4G|Hl?Dg>lj7vr_Hsj^FC+775)a69>Mo zFcFS6LxLZ4+3LvFIe)y-z4KXwVSZC}O2q^}6?WbU$&8M^cax>n!?+qsi8Ws0W6a>g z2h^U$)1)7aU96ippYqxavPM1+zkQ$T+ulN-HFlz8wzCa~zEy{3z z?doE=Dzl)^$?mB0yP0xTQnTaTlp=j=lmM(b8xzeJ4M){{gFF({`ZW;%sp%%(w#4%Pnol%zfTE%%249b<~1lp8pLpERXC*3fgG~?pxdo;$u z0HzUYi+X1gZ3?H2^5KXaK`v$FD7DgFfoku`KP^t$J;zc;%lYcH2;P-4+^KBFVKY|8 z@9sx^#j&($VyTqcY1)hvc{}z##8X#U@3EOwyPW9osXu{@==5z^74pE7C@1q|R#hyy z3nOKszyGR;;*TjsOw-(Xz%$KN84!IHB@dh_WcsZtYLE(G6S7u^Gw=3KY9uV&c}jO( z-7$5F^UH%Xqg|I>8rws-LL>G|hX>t$IHt)RVQ$J%q1QNOvqiM`Hpn6UY+y{-U!a@6 z>^1ryEvvn4a}RiAD1912n#$;!vhAnyba1K~{xmF2ZNN+Y({)4!*A$dwqy_?t3w<@B ziNlF@Hl;Umt?SPD6Tt<0?#wz>ENPP2z7~@+RwuEF1I!P=zf?I!gcxMIv$yLa=Jb45 zB+KaQB5p1+A+<0X1Lnby2PQtAeywH(*4iLKItvoTfwH1B?RT2nu zvf|?tv^i<~?P~z;eJ$en-RE4L(rnsBTZ4ONv&@AnI;X3A zjfp%qoiQyAk{;}t0daP$e0%rbnC_XBp2WqPiADw&ytmv+y~mMeo<)+sLgej=NA*gD z8ne_xOf|~np&~Fe*o*)J^p!K%6YT6qXHB(9cVCABY`ZA@VuS0ZWnYru#sT4p6fA8^ zL8FdExHPRH?wJd}C$yyNbw8H#{2p}0m76;cxa=PphbLlW6<7xO!(-ozRk0ght=;B% zO5bQjXxH@YF74HnH)GM0S7?163X3mb=`s9oW>3Yp#Pt=;k53E!mP)hunGe27q2>yy zfHWRnuwx%|yzKv|Moz!TPiF6k))Egh=dRf49*c>hD)_{E>#2-HkzdE(ZeWnAmV;p7lRVnG+rvbEJo_IN6E!SGiYTB)Ou!-mx^a;h(q z0O{^qyq!kQ@S*c!!|EIX_wjXp-8BK+{n?ro2{B?!)bxiTn!N zW=lmH_4F42H$KDQbw&d~X+JVO0dbesu*Yn~P#0qC&iG{JeB(3A3mNVe$Uoi z&2=U_T)F7lhxJSM?Sw{)vkRFuRVTrf*?RkKtCis6fj~}2agz)0*DpS=s&=>IFOgo% z$R0kZu&uSk*DOx|Wj7=}O_#?vb<|0tpfxwMd(o&Nb|^7~TAsRRir$4)8tySSF(nP& z>LO=8IZbBvJ-A&%!lg0kX zK(G4^VEvL0U5{G10NZz31jQ6OQd*`zb_ve)r3E|W7Ov>!OTiLyxqyZQtgKK zef_jYOx)Bec3c-wpuT&QMBe6jui3{dyv|2Y8%^%5;y1bWPt-WmaP22QO_tu-d>7zd z^2Gjp)ja{2nI?lNpnia3nA;T#(sx5et(H`b2R$<~uJ`vkCq9Et2< z99TuIW%|bk?OAT$d?u|tLcs`#B$6T1e!CKA5m)5-oSt-UpP9M3-n-G35Y|2v7m50L z`pWhD3&$kKgbD16LVJGIpMp9JXXe(&BViw;uFrp^zb`{vT>Ie3V$*6#PQcjU~4S8?3$2bYR@ZHf#oAB&kz8r8ws zc#kdFJ;CU4oV}r=7{)Cg1UQ|HQ!qUmXg|1)RAyJ^>?|8yU1>Yp-SP~=k&HOIgzx*s z@{o(%vx%n<4zGLm??=a+mYY+Azyjzi6GgX(tU)Ywegok>HdUP4BufWY8$7H)SO9>D zNqZ`-&bur|tAgTt?1mjJ{=Fg(T^NLTd{SYYD<3$|OyJ+Q*c`pq_m1ba{Wdl&xmWLf zT}x|@n2Qj*ZoQmFjLtH3>sD1Y*XN2jw!NEwT5LZAI!33qTo4@$5BS@U?YOF!iVzlDlVT^tg9 zBQfBz;`HrNORt1Gj#Y=FC#lUAp}EEvv!rmlhX8BpxH*3;v^R)2Wc93{vBS`g*d3o8 zW;}e0=#`md;FjR-n-ez?uv{o7_H@PTD~Gk*Ux$GG!V6RCIwp^1Z{=c%2V6N9#aRCZ zx)1N;KO__Fa3&1o8NDIE<7|GHo<3U8jvwMs(F+S{>5`-nN#0t*^#l^n&pwnY$ zjR9a$+n?5{A#vVU~T3nVQx~$KFuaF z$9-QJ54B2>14ThAHexQQR)*5+XwbFs)#j#H`$n>1jo^eApI4jC=P~DAS2|K#camKq zy3l0DZ;pJAzj>=K^>r1Wl|>xUa0TPOF@_pmH&1Zig;%=JGqM!B$$;U=6Gv7}Nx zH!IG+^=;jtID8>&bEw$mIm|goIQTOvTe|1=o^fC;URQs*;TXPdG_3y8u;oU1ssQ$nVb%~Va57ueD82RL>j&&)Q3FWwg@2N#G+~fv4gB2OJh1#TB18X}Vs;ERlk3h?W53+B z^cNi2=M}R_OG*bvBT#P&1JbJ}hd%gadW_rM>iG63B z+zT|^=j-xM?Ow~o%l#B(68|c9=N$7Hf^BMVZuZY1?q$#PW_F#PtuPgkDd~xO8qKVF zm0rZNlz6&Qx5vJjs>l0&L0m27)lrc*`65P@FKKF@%meRPW4$$pwVpypTA9@X4-F()1E1- z4i*f0Uk!yRgieH!bf~4$&K6mzR5omqGjEZR33kL{!@>lv7Oyx9;nO$HzdgGn$@4)V zJ6H5$NY6x#I({Pf5$m?n8VBg!e` zg_$N7v8p$B$?Ic6J+cOh_xRw6Eh(;f-Fj+*>#=qDe9GPvqgx7_mlIBGwwPNfDr{=+ zkZandY5wqkrnUTDt)XLc6>Bm!-#XxK%QX>6J5N_05Vra|RMhiOjV#G4w(0|&M7GlQ z^Hg1yY%_HhT<1G#&$s!slt{^J6qUy>i+Mns264-ZHv$>Cz1~ zH8_Yxr-D!vgfb)GFIQ~zq1Ihu{zY1y4C?=tT>vy|0`Szs-RU^1(Hc>Zj9XBs_P#EUf{~txW50ik}a%iblKfm2L?X2$s~)uwTJ2 zwsYr8ThRo$?{Irt-^MjpVAuA`z`h#*kF!s_>pSevwU%FL{-l;m z$Jbk`rbPC;Fjn@(8mJjQ@Q@dgDD;hI`Sv4f>g^8?mtW3G;)aTW(eiKqh~`FwwNoW# zn#J<$9s$8jxz2)&CFM@!vDkx`VdPZ!r#MS?cb^$IY;AZhJR_gM38&IIv6!)JTKGHJ z)rn69&)K$oJ?BIQMz#ClJRZS-Lb|=k`lB_?$>c77$D=2#w>F-Aw0b^dZuDI6ms|dW zi;Da=w0@4I6E6`6hAL|gHj@jiIpaB-Ru&VM1U<=D{q@Y|Hk0+~UDKEW+@FmS7MV7g zkDA_?kWq@gNcy4*(^mP*G?)U5+~_=`X}#r$oB70VL}*N~uB1nr>6uT+6v~dde7wWo zF8!$Cp(TFCIa$?Y%T-byog3A!_*ymu2pOK4EMCwK48bydcRM;AXD!;e&v4>uL81#O znd9knzogBdBVE#-rlKnFVDdBYHTqgquiAmki0vmoMu+-fb(R zg=t_F$c+Y1llSQ0AB%NGH?nZ}mag``o>xF10x1)U-@-HRYsHCJpa^u z@cy(Xk9>LB39J4-tffq)bUs6|4E=%=4-lk$Ct6saY5daruf`j=uvsTqK=Mz!MpLUk z;mjG4*I6~~(A|$QXwo(577%_v@g;Ay(2^hfRf(cW>2-pXuV{rv8(((*#X796+ZN0j z&-zsNkJpeIvJDEkhlYq~$H{5+q<8mTw2l-OZQ^cD^0!ahGxu3qvZTR~CcL8m!vf(r z!P(VGx!S2rT`V4AWF0Zxy=muKzNY5yv3i1i!!t`->NGIoemD1m*(mH@qPd;H>w>KA zMn9m6t>+koiv>O6PZb;_+?=EKv9__G6AviqcKF}^g`0gIGP26(X*U|zn(q%VF<$R7 z@x+Y|e(4pwKy`4ULh4DzejA(cLFdH}GI=ePJh*EfB39No)e{6fA)SqtJON|dTUvkW zm3Z39?XyO)^evyB6iC_<%Ga^;C~Kbh?)8UaSNuuA=ueW#)|*+kz8rgfz&#Z7#E7=~ zeL$C6alA%?}x~e`? z2cDRI=*l^FH3^lNImvGqtOT1VMSe-_yVs5>Sq@iR0R>%>9(eA7YtebQU7MS;fZOqF zaGqa`?qcfw2tg8?pc*5Hu58R2{Kthrin_TxtZZR%5e%u)Kzs%_R$4|zhj$;KA)fEg zV}hGZHZieS!eKbw#y%Ef3D%mb?64Tyv<59)Q^I~|NagzfrspCJr$d_g|FRIbS z89(G{63w`rK`|0YGcc(r*l`@7$J7ZyYKR3iMOpbWms40Ew zecYF6=md%fT}oE(v#}AzEehoGD#;3qd6}DxGe*-j_zsTK0cFuDGp-nxtf~Nu(|@>H zly9|spW+WY)0v)iE}l@NNH$648^*!lwFTui2t6?l>@!~D=#B^c%zh_&B^78_vQ4tOW|6OCWTBJ9k7Oz>=Ee zb+G@zurv&&#z^qo>`GIm1Ea?VxKzQe#UH4YJ{-OQx|>IzHqIDVIF7?zO|yV1IQ%NX zAE3LF(H5|4tA64Rx4-i6pE8_=o%%7z931@0G_s-pqB0Hr`T>Yahv2dZF0Pnq17wcJ z%W3O;$U32_S#XgfD=8r<;Ua-|vtXi-lA~~3d3HI6?|@wgZ3r!ceAD~9-wr?Ix5n-; zQB7~Yi{*NZYv+Vt?2`CkuO&jq#;hOna?gn2_Gqo)5L}7+Sf=&^AB1i_dvw5_dm)bMz;C}vqVYRB3^1_C>H)3Wp2YSPQl=r-QZh0! zq>kEMt_+7JJY55hn6^k$4p-;WGBPyKc$SuyRiH8LUFgf911%6M7uR#pD96K9I1+jz zpkc7s95iwuQd-l71&Al*B7sCa3G=acuPC1VA!%S{!HZTfRSas0a`DNQFAvDFT$#M8 z6KH|`B6jtMog>~Y6MkttO(ucHt;=;$4!#MJBS%kh%I~vh-OHJ>ntY5g8OvwMJq1c? zvyNC1>b;k&e;G)p|P)~}Ot8q?=p>tsx$=VCS!^9GxBQ-@?WzETD@Cw?t_ z{VAOZWStAo{L9X*{N{FzdNiJ;za(eG@bBu4@yWWTsN)HM$ci^Es&KU`wn;Zx+RU|`?|JP}0|m2>c$3UGOrfj_VD_4UPpkDT%5{rgZe z>LSaYlSqk#XXgYmR3m<1f~Y{c-*4i@Py_eaNM8rDYejD1gMOZSopJ4;8NkqiqHv|= zKmy2zx)qQGnN5FrgTNG%df1rUsP+&sEU``m=fQWE?_aX$I-8V~^jH6?&qmDLNNHYd z@EE|Cx0mh`AX$1)Xy{##o`3;$%+%B!s7{exD^3f?v;!vTt{Z92(gE}oRwq*X!Pc5HRF zOuY0PDLhBBrf3hN#HX2Iw?o49m(EIL_mT`lEQdd($Qv)QzP6eUM zb)O}8zARl9x%vB4lG!5Z?#Ypf5fBT=PJ&R`uG}cF8DVwyS$r@(5h$?(hX?8=$;$I*x>tV`-|!_3jcLA1;5Pm6x%n&^an#^Pd`}Lul=Cy1 z(@s5IhwiQ5r`CBtVNt>{FRVYC)fej-mabr0Y<1%bXLOT~Tya7c2Y@se2__a2Z*XVy z7ab{$5$x{l5je-tv(7?$p`BbU_j?jQAP-Z1)2i25AF| zuMme?MpOHP-5O8;j>e#B0s0E0_L9m0!d!ZsXR;|n{zEvu5p25&?JV1nX7{f8rq(rG zMPim!*>dTOi@!CD7pAph4Xuehxxl~*Jq_70jdGPZdtMekKY;>=wc#aO-<#zW>g52( z9saRtcbSTRr>xNvmI)t=9|ibPiTQiP3L@*G6>iz5 zxv1jA5xn1PPZufL;PU(|)HJa`?o2@T6VC+&Kc0NYXP5IB$Oq+xpb|ToMRS3h!1FZup?{=5hB24mOgA{DTl}0p}L` z&dF^4f4yTdTK$15pJGl^+%umv+_m-pQD)}IlD-*bT5M<$b*8O^G5{V>m(87HLBq-0 z3-6CRs)Z|PQaV5Jz)^Vnrh=YXFKqTqLE#u418#G7i9VO#iMx(-bP7(XQF&*WYH7?; zw|pO15Di`J93Occri}Ui_OQ+Im}xJ(;pCD?#ovxm*LH4}F_WT6_50p<&fn~}iAw$; zH-w7KtktaCJ%~!*W*)J64g(gMN5 z+sW(JR}OZ1T;L77yp(XhfBm6aN3{7K#fTMCmlIg|s|9JOH3rIk7 z7YxrTRxtY)E?@fKOvtd)QgG0wjU!~&YHpE}@=hXEXmq{i>js?Tfa8 z*|pQ_RmsHj;Vx-Ot@xoYd`%nu^(&E zYTrlS!1$s2_uvI;f_jrh#E)jG=CEayu8tnvLb zcAJ%xy@ic6l=>5M%4gDMuvI7BB_!28XL8U!vpEoZ-jw!ta`(0H5TFhGUC1cN-I`qR z`@ec2)BimE{__^_$nyU!_{8D*pTD$RWs{V+JO77_z~Ri~OX@8*d1=Ev|M>L%Y%*f~ z>)N>gyw%zyyLT{L;Qzqo@PdvQw0z@KyA+WftCapRJCGm*sZugg65z(aS)b9ZUTwt={@rR6fXf5Q=^u+sts$oJVm zfd-$lyTry2bd2R-_Kp2j*omfkU(y;zwEBOqaC)GZV<49U2JeW#1B9l#yPJrb?A6X}twh0%WWWkD!c04((lC8iJ2TRG>BoNi4_#-$Ir09yr%;5ElSc zqMEC#FjWQk{;#gNiWz+cVLTFS6%Up^3eU=-2lr^e5HZjUWQ>ez+@KZfoc$}p-gARz zuHOqnt-#RGro4|IU%_6$9weh{ke~7f8jJ7o?>nG~q84`(0KGRtrlHZ1u{~lfp@0H@ z;keCUQQadz4)?Y@z3u^}$aN$CDY8=LF|ObPXhfw4;kAedMSj*y*+oSW2?=MdETiRZ zZTUcVFDoZUMoB5h4T3R{R?!IC!gW2g*+hRbi*MO&06I{r03sw;kUV=5vkEe8axyY0 z=ya%+UE$qg3}HKhNN`s9=V#%(1_Z@O5r#}^b0D+^Why{*RR%ulpi(vmu^~uqdvcAh z{=>0If(mn5IyedCIdp~aR=3Xgq?f}N{~bf<;mLlA29t3ptLr-N74n!v``LhWM(aWmv}bm*uc zC@2WDeOmn>s=t2y`dAbw6|cdeLootth@JtJJ*E#w2w*+l3djWw>>d7j+d#9G-9}da z@JaG&_C-CR^Q7eGzksgoXnY@f2dZ-6)L~Kx$ZUjoL~`Bq8NIqv)d2i3+Bwzu!l6Y0 z>`_6jFAeM&RJeD*UK@JH_}VrihPVxiOhI*hIC%$V1NblzTwstRw$ZDNgyy6Bo28A- z&6m9PJ)l-sg`Jj}nHd5WLFhf%4;=sngn$CC89HrXc=)Uz)vdEI)J^JP!wUA_P_KjI zHqz-LEAG`ch_?ZWXmcKDN_#gz<Q)7>2N=RLiEaw1Y{vGh5Dqw8H_^setG>N{flyVm_HMflkk{iYEVc}g%7L5;049)@mY(~TN{IBreIVP%f@bt{XD1t+6o7;JVGbBe z{vKEZBmj8{ic^gTf2jy!In4|wbl3o905`jwKBjs zY-+J%;6Y#eu$1*!cpf6_O`?F|r zzyd4yC?vi4`uP>yZX$rCx(Ph~(VT#i37nRIs6Ve9Ic8r@>fOXggu=dLWpR)WJ6$~< zl?I4$gq3$P3P4=|6~Kw#9k4r~vZ;Fn=DU+|S!^?UPnZ5|hxwW2sxuep*ps!>)zG_u zCo@qBEnrY&A?4;K3dc++*a}3^2-TJ~9V~ZXgV_&}TY-Ui;9j7-ySaq2!8{R;VEN4# z7NSX8;kkhV)*ORkNYbEUmNiA^e4YU$Olf)m31To9h@E)}jSmg18Z97&69*@PUC9b0 zfRY3S2AYDW02WdvNNeD94g*v*0`;IHD1e&)3}G@?5WqtvH!W1NP26wfK#b;M0OF9z z09bPH+yf}x$m`Dr0BU$#KoCPuxD1Q{w7Wc9q0B+N4jj#-_JuKAMW7;Fz`#uX4H!LS z_=3kpyKzob6fq>E=;Y~;u5921Y#ZsND?pW>X326)8xS_++TnzVjGjhbn7WIK1Qvd8 zd%#fvDN8;Gi?gyI86@ZTZ+jSEq~4EU?eGl<&{o!@(9wm*wFecD9E=!nA_=S&f)(7L z*h&t)SiBjv5!jkMhYADf^<~FkV9Y?4PUF0zR@?0Yn2lgJCNB=?H}ko3z6Sng`S46c zoqq+II64YAy@`xO6&oOdEPQeb3flUBoPl}3ojZ4I`2om-dZ4@9;XahqsR;>3bal}= zJ_I3X0YL@@)J-@q0uC0UU{DzcuN)qpo(uB=aD>p;v5-&n9G*AgXn(J*Sq>Jl1Bagm zD^g(X?SdO9T!`~9H8KfX{g(kqm$4`WFHk6_P?XHy#EWgLj zd^&iSSXo&OfTaweh0-vHIj4Z4N`<0q;3aq_PeG=KBz-0g% z`0`Ys%mQHhgGNy@L~w9Yq7opi5R8NM^Y!fl*9MT}H^T&2ZUAm02v-OB{9{OwnTNyB zVkiS4S^%MBaPEjON;q4qtEwFwuj1m=G&D#(0U&_cw+mF7<2?jb&2R1_y}BfoYRnPScOw;cq~d#5M_Rcr{Vl-pbnDr zRvpTXP_6>m4T0RJKup2p)(FK90A5BH!HVG3D{|x;BHI9;Rt^>fILj8IqJ^yxH12J< zNEOnhprB)w`b^RKbDmV!~CSE ztUQ?*z{mow6JQ%-cV*S>6WU3D>B#eto1g)J74IqvDuYQ5Rf0f)tGySMg8&y8fP4E} zHR(|EI{q4Xi9`eNlv!x20U}(Ji59SwhN+RomK$P{02l?7RM{A8o>Y4>?iL%M;f7F@ z+9{0d4Zsg!{0}+ys2Y8RUE$owr>j|6EXRJrW(h4UG$2TURyBaR?l!b1+R^3b^CcxG z&;Kmtg=w>Caf9VpfV?;ac%eu{$N6uFi{x=!pVO4sTa`iSZZPwE<9WcA0WnikV2qOh z8`fR`Ynz}%Kz>J=cMEP5A`E)AYd z7CmXiz{DYU7i{~x%K@;!kkis4uPe*G4>Zu9AbxKR%#R%4Eg;Mcx+6Xb$*eRoOz{Nz zKja6nV30ACss}5LrtTYA}qi?g#b|6$p?yx{-m9r>fO@ zLPS!6N@y|)ym(-rfE`}(Y=Mn-I~FsEvJ1Djw|h~L7XlRFatB4Bq9KT4w$S+od>*($ zbA{w7EITm9Fe@iTrdh&42Xc|}gFixnU*LkpmV{A+$s681+$rJo2>d90#Dw^NSb76% zA?8yZj!)p&Lsmh-ArVIEOBix6_rdN9gih43M8YaY>U|&H06i=amCF@`;E>Yf0j6PS zS6gJMEjtDi8{A$&Lw`oIu?F1WqKe75@(gTCpje_4v_8wuj$b((h6ks;XqN^Q@?MuPMK9jF0T&NlAMYxoO&>Z9fCc;- z?0KMZQlRGuoPp7Y9BELXXASzG;VliYfe&iGmkh-Ky7faYL5LpxZ?|ZBC|eHjVwAJ= zc)5Ib6>3FvkJhjPv&by3*ES(c9c&^ZG&L}o^FhqzNdQTnegNdbz0U)vs8E-~!gZrD zBny&uul||!+6Q*p?+mvAADq_IH#9tkoFQ~D1IH*x8wN%I-=Ld7K@FH!Meb$TJ}y{+ zdMI3clbWBO|2ah4piu=obT}SD*E49`ccK~_rjAa@12HEk{6YYg1tb(gp-@y(V67h9 z96`6v2Va9%AR9Hy8Y{?p0D%orV#Z4iyX>D*=tEU`!+p!I|ZFT|GN$E68@Ny_d)=5yQZi6Wow8IqmxlF{lFG~qnBO|9n zs$3}tmJ^`W0|7Lvbp`+)x#ZZh1F@TS*iE0@w+*!!iUqnVEga;6&K5>ySE8O#F`VW6Ty5*=n>H!|QZ?JXKuG40K83J^95 z_v8=-2LSMC;Ade1Ku7kRZc>UFp+*g^=m{j?J5!MtWL@uFz~ifj$YUHtm) zGBUk_K?q&}-(ZM>?g-5G=*8V4P(B}Uz<*C>F^gcyVZ^VO{RV<>g8^VZ47!E6YNj*3 z6TGjWnz;b`M7RPx>;`D&hJwl!g2~>(^aSf4n#7RINf~uje=|PtqynNH6;)^ydrC=3 zAs!Z;#lc*0nvt;st}s7?fzrQ@DVz3qjeP#uNR#}%Nc{IUADHsoMYyttLo65>c+5Px zkUb1%iHFWAP^QCWTowl)*0~b@ag_1zOZOx@*!9DPpGWTB_CK}%W&e{e!1H>xc*C{O znT3|;fg9B?5=fosFqaY5F9`Doc>&RJmE%OmJw)f=$Mc{}DLgwnN}2;IkP2j-5s+(2 z%E$=z3HE{BnytLL=Z@jb-0{y**f~qfQ`zU!>$?=#eBZ6EbPv;|C);p^OY|kl)dT;w zMEiGDboON4ic16J(f+G4@Ec4|`($kPjR3e*%MMA^zjTAbGqAe&NR9U0HZpI{3wJ0a z8H!Ljuum>nh3Q1zf?DVz(HR%SP6 z9e3nPrnEfL6yJ5WO?QzVRaFdYigqTBN@~6$6@<@bF|(v2QApGg2?it+3%AR+X}N4} zms4Efr~OVDI!VHs;c0drt0HS^f93J9m{j(t+r_fof;-_CEy_Y>Kzp_0XK1|_-$++R zk)B1CV&&mF{D^wZ_{?Gl)AZ~&EG5n#8(-w_j^B?PSJ}4mCEbvzOl95lexKQ4B>l`x(^l-tG39hu ztC53~D*=YvsTRiMT|3TW_BXT)63;c7&cvtjTQWKe*^!+da84od&XsdLDb-hE6jl~k zDWbLR#h;0;=Lx@mPb)`u47_E0vexll;(m@9OfW(Jq3R2N_>ING`9Oqe>>eUbo+RO$;E= zyzQ{~#gqO0^ql*+Y)T_Y^m!A6orN2%?bsjOn3VHN)1da`|7y=8Und_k_iifwowp*T zbYQJ%c_u^H{`*ylQlAy`%2K92W@GH53vcD7=SJxhWqfpK( zNw|ou9waFk$7!cko}QA^7$2YgI5cqT3V-yM^hi@i(FWe!Z!$;@^W;}e4P}nLAt*r_ zze=`uCYq+3{1&O^DmxjzLhWfh*{`AZzTNw>`b0mA2Magr^4*Y1s!=x4JLd=p{HB@6 z@m?j*n)OG&cCe?fDRH2T|G0>~Uaj8gyQ0xG;5ntIl0`bvlF!cZ$c0`uFYtyBw_Y{p z)fTTQn>+g3H*?R$Bx&`nFz;2R)zxK@N520uyDejAp%TYE@by>2&$73Xo2CTcJX;1G z6t;(#i+ge5XTY04K_9aR>d z$v?q!xV_}XP5JuFH8Xb4D_$lFU85InE82vtw29HfBzu2c-Xn&vjBEBw=Hpqy4MP>bC9?eFOO^}y?UmLj+@IgXxIj&tHj!U}x>QF{WhRD!t<{Zq$=rnbtDU&+EunzU zn%2y3F6A1ItF{J0pBo=4CS=^Ea#t5qEvP=t+_+VkY7(%odeq=P70iwqk9UqEG3&r% z>L-g*T#D^oN0syLSet8WnzOD>$0zNiatRxT^`&0v^Jdo($1wg6O(`5l_w0NsrDvp` zrcV1VbxRLx1~rC7sd7d*o<6v`Cp6Vbn@?3txw?74j#~2P@zMk*^;%(LpPS241y(we zTk2MptQBSl#*g-V^wm;XCUsZm2E4pD4f^}uGV<=|<7RBP%wk2-Mo&r{FIK&5rDr2! zQXa~gbFW)IV^hmSDcgl~rYuhTu5us&qwHf<9;uRZ0_VwxxmbEfg3O!NFv=iM4_U=n zSX~5BwpnMU`~2Xgkk$kVtlz+3;gW@yb>xiE&pjqtVeQNhBG+z>pQg}%BDHwood7Y- zb2xIC zX6$dusZFMu$ZsaQqdH~ObpIFUp17&)`MdG0wR~-46D?L*B4w3w?xJ36JOSBlt1%I! z-m!6$)Mwte{;u~>+p3Pz^}|&>^-$WO@^#cuC3d%fes4#i;#aZBQ&*fqaA|C*AOhWgj;m`ZNZAjxyi zZ0r|fbI$vzd^K)+V#mJz+@hnFfpgWJfBS;Lz_V?e4qDpi%U5)t4{eZ%Uf7UJWz1NL zHb0{eL)>Zm)cd+uL$UF)+68x0%;IHdblPu)f)d(SwCn{;Q~SD% zy5Th;k2>wFSu4%&Fr`j}>91zDx>B0&GV`R!259^l3eb_j@btyxNvQ?}z*Ic>C}}~R zNpoY$oqD#d{Oy;@gRq-gQr~-&Gq-<=1`;)6=FV2pZE9d@C7~BLZ{HBTxF>X8FgE(` z=)_~Q^O8~3JOMC=+@5(q<*w_VsXoiGubPp3n!q_4XH@zfTg)0|e9yTI63@i2#fzCc zXKEhA)TjY%A~;hzac7=A-cX}H?$z7<1~2I^lWcA4V;4*buI#YqT5hs<_6x?V7jIFUF#Y=4ophiK zT3`H+w`7b3l^sL{4(Qmx$73TgH$wk@PxTLzBa|?7wI`EmlUB7a+C(QhsW-Z;3iyiH zsW8g62j}QKe{zE3(}4WO*zJfp(k#GZzOaonxvgEvV8`f4t{ojwuWqOmjLAxmv}Znl z3Fl9?SQeuf)hI}v<(*qP?aePmhS}+;-ICo{C(-a(GP-V3PTW}^imi6g=AUT#hesO? zIq>xAjD7c6@beuKQat<@)PgsU`L-W97VMKj`BUiuWr}Iupn-;6dFhRur$#n8#Y)+F zkBWJ2$mx($8Xcj!cIS=ni)&A>kxOshjl4X&x4i15dcc0nN1pe1{H*r{-mv)RvWs(R z)45cbJcPQnU@onQaseC>Jqj9tR%4fR61 z13#RNg;lEPPktXbmz3{LYIP|8InMlYGxwLs$EP{CUb5j4qlpiA`l5`lnN8m5>NwNI=u zBu1aB2Ni@VDNjc>cjWaoGCIL_V4wB!y#<@~u(dIkr zOP_tJ6f}K9uMl@Fdkw9^TCVPox2%5yzQ%+r6yR` z6ra<|*t7-ETY6Ht^z!)_byW8jdB|#f9^W0%7H8_QN~(4eCvy{R>0w?@*Ae1Quh=Fw z*t;q+w0;J^n~HpjM5i!sbL)nyVpw^^g_Sd>1owzd5@IJBwz|fCsQAXoJul=n(HjaB zvVHn{Cq2VvJFs_vsY}oPYpQ^|%g36{aP0AbixM8V&W2)kWY5T?V|~-kiu!1$k}OKC zfBPZJ`(CxzhsoUfVw3A1hkPyrDlXR5IyIkT=igX-E}&QckEU34`f!hAhRPkEAVMc; zNE2sX#*K8Kh|0i&G#}6UM@wc`fOE@kczD64p83P!fR#|yIo6N({1PL6x&}>KP0n?X z2hzh5KEa3gH9pPFhr%}VI9G}urew|Q`n*bN(Kh&VHfP^hM~F8W zyDENh`kcs&R`jQ|+h7SMeTKy75ZI(2{5mX|-S*iE^*c%lnnSX`24|W5s6T$1{NQs#%${ zA8bw*s+`&tk9bV0=peu5R28Y1ZTVsndSz^Fvo(z)W~mrZak_T z=e{#4K6Dgo%Tf}dYx+UYwZQK~IN4*#E4ox`wUPKsu$ra*=oQu2u*jJBx4 z*;|jYRX8Q5t%*JUojzP!Jyqsc_&oW6vUFBVlmk~K_tAJw)xeg4wvp%)jdDaSOc{0c z%7MHZehraIhNr|SA0@nkoD?&9Hv-7`%71!>H~kB?jC$o+8#Y*;go7uzHNeX!@+FaA zXsy3ib>v<66b34U0-BU150cR8|Hf4fl1r6DKbhVV!%%e#mNs)cAgAEMK3;a=qMK#`!Mb zRa?NaM04@i^Ut}d+yQaT1&)Sdw;$xOtsEI&`m0r;2JHmsw$tF|4Jr-oLrujw2LLbv7{X z4Xb~^IfZlaMAgyN{6TX{lkE$iaJVInntfAt5{+`w~}V>I2ZQ=UAD0D45m z)(6&%l4;fo*j3aO2A%bL?frfSl===_N=c=YCv+F6vcykrau$YdU!s@$iM#d03;v|=%HiehGVeG7CE$V_HcP<GAx+A4MkVlVm>S}t^qo7%XSq+Ay{ z`u^;bZ%1tBVxKR(l<$3_FXM<4hX2P-h0YI_Li!&0@wb8mEk&BbX`#}cD^l*+4{j>l zUU#)Jlwe6oo0fTXn>O1y z6is;f&Q%C%84*3*9&L44 zpy<&0h3*a`(enGpXop|VOp^3!tlSJIooL)+T22wqz*_JfZIE>eR$%%T+B373%t9Y~ zYO?3{dbhZy__wn>_N^hlTTKPAc-~=n-rN9p~#?o^b7b%+P((@%;68fg?%p zEyS-TZnTXpLOn=|VWLWmb^ebJUC(br5oVce3+)m4M#cTXs`WYko!enWRqEG`7e!ws z@h0X%KRhMw_w>7umNR)0Pd#OKJZXL00js!S8vPYvB^7RHk%NDm<^Jh|^U@s-&02pN^Q>A$#fOqLy-h@O4T> z8tL?$TKJUT`t@7a|F?e)*aYEWRCVYWM}(^aYBm_vol|0{+dEiAPRRanjMRHW`n#dX z+UMb1Z^+Ob&WMOsvm|H8JR?opTdbpx=Zm4xtCcet)fADWvedQhz1&@m{p=}iA1!*# zw~>CML@yZT?`hfVOZN%se6zrov82*LKff^4xTvN_^j0PQt!(o-$9tOLWN1B<6PM4= zXu&(PL0y-`$olrD6X}v_`g_-d3W8bQ=F=OkP6-d*R&uV2t)HR3uvE9!O2D#GPQIJs zjU65K*X{9*oVlRU|CJs82K-)reS&WFtH~F3k#D}UdD%f_W&$1W%=wi$gwGeZyD}OF zIqX=(3O%nI(pOzviF($g-y}B?E9z5A<=z!AZMqn(k}!9+BmVi>d`l9&$J}hUdFSvo z)qK`9%V7$tTExH6-iw~Q)0&dcf`KG+>m$A2cbmMrvKwB%jg0zJ9R7Nug50>t{6;bT z2Y3JRn^y<4_GPkSMiZ*4Nw(k7br(}}&_zK}ho3}0Y}xkUm%09T`j6UxW;PV|x=Wa^ zd1vDd+F4xqB)aFv|Dzat>spb;Igf=4!EZ!U{IYYg>&cdapb(ci-kc3a2eW zCq{<-!|Np2HaBYMPZbjvmYS|G;$=)A&j!)fJvi%Zunh> zU%%-U_k61u5z6Y>zOkwe@}z@H$B$jue`Cl$^5Y9;Kp`$5IHZ2}u1H5FE8Z_rUr#9> zj&I&B4m51$HFF+a6vB?bqKKzb462IKEBe&&M2D~^nXj}ny`XTwCmz|rS<2l}-$^}q zO?K0-x5QI6`Tl9LO-G+o-)kD5cH~{oXbZ3&(60@Xxja9NQLH%M-tZuzFx!f!Mcc?p z=!vL=veed}w|az?S<4AON<$NPNrtaGFG$;KF(!Ske6|$u@QBJ_78HMfoMwCSdN>D) zsKW&EQZnoX(^;CFPEb`C;E8;zdeuIyPs$|X!)z?sJUQC-GIA>@l)AS6^Yt>n-xc>Q zH&znee?PjIcR)ykU;44;A%6~R4fLQGxBq$`M{cmP`~3brUo6j%!8)_o7lwwkM9Jn{ z0YO0>Org!nSfPsa$E1l2Ch?G`ckLB0qOgs@ugF|I&bT5Hol90=ZILmR_MXYMqMF)` zSPJ)3`%uXP?mV5P3v*3hjGsSWX-${$Y`vv^JUg7;^qTc0=124+4SX)Ro9;1qLgo`a zBBO6)HKaTg2qv!nexliTFmVo8g4Wj71j}zM9ZrJ@Tr8gaVUdee4r#U>)f7*r9v2N^ zNIoRVco_0O8j{D1e2;j{W-IuSi?9c$4X4NV=}~|9q3yp7R@$R+m>Ma4T4(Uf6|h#4 z(Iz1F(+akoEUP~9hCX1c?rtpE?O56ULcf5^SXbps1clD7y2 zm*Qb94Cuo6Jk;tNTf3{pDAvetoE-VQxH_ z{g|S1>(^E9pCSF2yUN_-zu+~3x_^1ZJ2onAo7@aPc(W0U5%UBob?noY@GX)y%)Xh( zeSvT$yJfzd3lRD8YG?d)tYW0@3bWNlyojN|JI`u$+Cz;w{8S(LHwFN1=kim55jgzs zEY_BXnsE3D52ED$`SpK%sa>%36H(TVhb0p4@$EAn$_`XQS_g}mr3eF_y}~J(*kMQR z$bmr5K!?t^z8!&uhLZZ19u9xb>=KcCNwS9rPv)g=cPsQB6mT$|5$b3`1`R3GddP{%!BRV zaVrgaRAfEx%JXSm3-A*Q3yXwLfW$gLCXg*y=Au@yizLL7nkl)|PpeBuk;O*b^|@=y z;pj`clvQ4ilC%)HGRVQjbq7?iMNtT6hP!tZ)Z-)Sw9p8;8MtVcKWxZ7CfmmPKobWo zH=KdwG2G7D2R&vh0Um~;(t*z3K|VU-I!TPoG7M4f5HjHbE#8W>jt&LL_Yc9q3HR@I zXN|Unu-Yco6R$>}r8DYvP8u$*na{Zsi%AAuj=X&GWXD*<+{>=nfc!0)YHkK**~(~P zI~J7x1=>Kk%_h5Z^Gx2SOjNIA4TNj#+}wBJ zVt>eeNDK%2O$4xuwefP z=Efk(L~I1oHZg;X_9O^D?tqj9F5QuNJraERAO-@xDgXVjymj%`DdqdCkF<7bJ4gJ9!y9n7)0%H zoq77h9ZS`4{JY%h@~{Tx#AqglFtPY#A6JU;2V=bWy_b{rPQEwkOgjTsXSj=Sfo!Q% zQdBfs9jilO1usCS;|o63pka_R^xAGSL5|BL;_IYH>2l@D6~yf)fTuAcj-VUfD7K=E zGIpjxEHhGBp$G-^8R~uUA>Rprk~R$TRRJaU8u)SpPu)5hE~(Z9$`imXPJupc3@Nd{ zM6g$F^clu}g$MH(Br@oc0o!c`&^DOpuZ{;WA*ci8=YbKqv<5g^gZ$zG8(RR%u!HYi z2)e6VkEbc6PcccTczB2*`lM#N{gErAo|Qo~A+iht?+g~O;Rf&ge$=fe=)PQh+A6!R zT9avd0^8@df8>?h>U&o=BCZ7-FNUMjbYs73j?s>0wtEHeM*aTuV~u%l%^;s>@L3pX zk}*7cBs~GuY&(cA@IX#agS@4gBkz)}gO-1-&1C4ziX8KY-H$o_nqm2YU`aAhT74k%>g1QeY6y|Df+fVsY`C z)8znoQD3@)Cv^Y`EPz`e77g@ukQvelqzj5vEL+IRM$Zhq{^2DV0vhTPq@E#51|&t& zH+G_w0&O|UZ(*|l3JTsx06dJ#;QinO_6_hLv@NWy8v#o}-A((>O?uq|8aH)sVs+by zc6^c7rUz`MH|g&>)Teqq%}uTyJytp5qkGV#sV|P(t~<7Xw@fs!OIGE;HdH~le!Xm6 z^ZGn~rJilCZ$M(pd5uE4K5-oPky(>V@-QvcGr4=;y%vto=Xq4jS%R(C5l_P4$ni%{ z2h{fH(&?HET;HbDfDG@@T=lhW^Ry zS*hV$t(8Z`obufmN6RBwS34inU9#XsGt@KyT|fjPOl$z8rwCmDY3xj=*ZyVCn)nxk zg9cyP+E6AK`p0q+EW<#bSO^(bAVHHi1i4NuN83j{1aNss_&|!#H9+=k*i(gRz+b-= zw5v3Hrbi%Y0LkZ;YYsdi|K!!2aS2t@oP5;K7rg!C8Gl52MGS6GWWfj+Pr9c&5<^3Z8gl3D9!e73V z-6}s5%k#G26hTzoN@YXm2t1YAs66QwZ&EUn?{fL~$ewTWQi~C8R&~}y?b-P@_^wvMUq%Udjfsbw>+Xg( zq@{~+6kOe#RI(T#(TL;J->k^QHarX#V zf)orbS{QMTo5ZZM(n?GjgC{@b`n*?8l#$#|ZE0E^@v0wxPhUI_b%2csUnHQwUXe8-bFP9Ds( zrFQAy6YnOPN#g90MxBbI4IBJ(N@3}MX#INN^|6dBhOYehe4RCld%{Jg4|uhyi>Vk&y{E|nbS7r+ zObdIKV;{~5AKCmcQx?n5XM3`!@7fRAK?K=d)zr{<3ZW{XC`4W{=3vDi?zzs2ss$7m z1Nl_-C`%KTF~u&Br^5s?1!1Ou&3*)VW^VZmE$Sm0ckZ0q-CCK2NfR78>_kDLd=X-7 z0SG`$!d~aW9!Xmi@2pNJlVn_076)1&i5gJoD`H8rb1Q-q0I1Q1bP=SQG^4g2sd|T0 zqu+J)52vb?pl_y&gfARu)(>bRs*cCeUc>O_Tp3$vtZ7VhtalMTPvwii24m>rXJuKz*#r7>l1w71qNL@gm6X7vHsD#ZzG!ftqh9fg^>Y&y~q zRgH~X8TOpLzxg8vf3XG-g_$7j;E`cyo)N3Vil#{_p}xS^E% z9bU7u1})M4i2+tiA@Mw48N*s_+*ws$-Z;NF$*0d^5+0JUO*uA@nD|Z^t@cXaIo6V@ z&^3ap#d|=W6*+-$wM!4=te~#;h5Q+$7)1YIkjy>mmRr!@&`OZO^=bq5@TfI+h30tGWbGA*>QkfExM?GjL4DB&XPK2%=7Aw4VE2ho0yUT2&* zlw*fl!O?F~d36ao1BKCfSc{`7d#qpga8!<$h~XN7r~cp$33bg8@=BR;y4a7#oM-Qo zQ{+t<-n8R1+9o23J!*JxG?bFG{{)BNTF!L)QyX4s8=B{34Arh@PPY5BcU~K2RJ&-7 zld?XM(b15w##hbzWyd5|7Itli+c$;3zlaUxYO5DeRp~hgk)YHkJ!>EqLmiN$*ajdk@*h%5B5&~ z@rzq@xFaX))%yJST+dVq`xR=fWRFiA_&XgCL+SQtNnb8Pw-@=>eV&8-W|4w|0)(RP z?ey2obS26(HZ>u%cV}xQ{IH|A)DKgh?08x)B>cd}>s@k^HdbOD{+goX_GfkMXLZlR zQ0&I7+s&dE4Nk@!1QZT#M%6JM4g)l*AjtPYh^Sr1s?gdKNIX2;4&afM{A-IM?aNL4 z_se`q&Hl;s0@ss)|KUr=^<^m0Tpy$W!%PmMCHxdES zAP&C-dojci)ra;kqF^N8tKLE2n_9oB&@iI)U=lQkwbaOMJ{5%>Lq^qMTXkGP1&+3! zUNf&Jh7gIRp#;px$+-*BCusA4th+W>2Os2V0@4|Ouy-FJYln?2T#DXXJIJ&fAuRc= zq?ZIU7&qL9BwGZDNJX&KknnG?iPqT>r52 zbnn1GE1D2Mjoj_@9^Sg=R^=#sNWgS}B)k(qyzJyXwLNdouKGfPHcRdTqkK91kUuq75bF9f8*vKggmHfd&~&3~29i6Sxd0 z_7IDJRNs}u9T?Qqu(v=NvtavF4ge0o#yEhchM|yg_&1^kP|XaR<-fi9Kn=p=cup~h z`gYE;0;*(=a+KE>`@<7}4S_JcPT0NFLqM#$lhYN@j7!=e2aEsf)(CQf>L59?L)~jf z8xRr*(lP@yo=;uP$y?)~3?6$B*R1CuEPkWoOg z7X&Vy?uB$rP|kx%1`%v6#-Wqkg=U5PLoxyPP3wilMU>)*z*dz1hmZiak05ME7Fg)n zLuW>gyHb$$Id)%imj;D;p>G2QZ|vxU0qG-kI9cpnMcYe2U~%RvI)WgPZ4F+@4lO4@ z_CPFTIi#N5{CEc+Ak_;~5G>6Ks~{9cV3dYZGlgHmH}*y`VSsOS13Um4_;AZ;1lhj$ z`LHq+pkcrZ;cLcEpll@AlF5RWA9ZIyi!6ICNI$Gx5(L)*Faf>;dmWT3mjDe2v5#*> z94^4r36S9bYVIq8s%+bKr5hF@C5<#l3P?B72uLYXf-FH03F+=`kZx2I5D=7ZRHQ{w zkrD}Mk&@cy?eo3wJKxN=XZGH|_T$VmYc1Bg_8$Lg9tZ4ahU*NI{R<|NY;5=d#GyoxB~Z^oEsGkf&|?O~@+5o$Fqw;QYWbCb?gX@lC_$6W9xzJ$X0>4r zP?I1m7>bYsCV>bUBK-)=dk&RAD+aV=6wnP}{VVaNu7B+sIp~Bc@~FN6kO;o{>jxZ) z06wjs0LZB>lyT(q_a(Ou{jfo`6;VQm^(uvsh$t&#DI%P6$kN{4L;`&=0Cu2|L@FF$ z)j+R;;58!diH(Dak?>>x=&&4;F#t>;XqX0=xGPNELI~i%wm+flIm}pFf;H`=lXwDX z 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 diff --git a/apps/demos/testing/widgets/scheduler/etalons/scheduler_contextMenu_click.png b/apps/demos/testing/widgets/scheduler/etalons/scheduler_contextMenu_click.png index 3940f1fe1f7a383fe3a835bbdc8c9a4edcc087f3..6952d36cad77452fd647447fa3c507968c63925a 100644 GIT binary patch literal 73033 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 WMh9m00DMCd;L_IA)j+CSh5ru*HOx@} literal 74533 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%0Dsq_>etP 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

o=s7v%Y={XJ%0PCgHsBo-^au z>VzdOKj%GtQ1SX2oMA&8hPR#s_G`x2XIxG)UVY)?8@0-)CNtgLZ!D!n6kasV^W*wd zSDEczxi3ny=$5`O8E61##N|!cb)v9Xt z&ug|cVJY9QP`C7!*4WG-yz>(G$+RE_g_@Uw99?^aA91BRF`v1|^)CH*qN94lV2X6m z>W57+{R#nZ*7*j%Om>qySKgJ8JH)=_^arDKxw53{LlQ$B#b;>VbZJwYxf;K_e-T$m zD{=R*;Dn}x1f%w9!P442?tHpVZ^9h+-aS`*qUe~lqP0+n&V@Jo`V+* zX0M;^ew6wucp->g=1M=i=2DctLahDdN`!^Y^xhHt&?jXr^kR{Fv&YHEX=~M+9bt81 z_Ych%<4Q8LzHG^GAZ!A`X@@CdcolzB8<2B9k$pcal}*-Uo5t zzn4@iCUxkYc+xLXgZ&ZF_GSL8!PXe032|I|#OxsWr%Ox0SC*q8M>%GAMMQYt-FyY- zikOZ&JQ{|fa=otpSs7!wRkv6@wBIzXD!t~iB|o!-%ZL9G#bvA2AIB{cua+4Ux9)Jg zdv&LZJ%5BgX^t#>oE*Ia5!a;ULrxBFDK;5@J3XG&M$pBrzy&8DZ3s619QV{-p3{fEmU zyN)yGPPZ23NE$qCxqM>6DvuU7?xYi3L?5TVepeAs{iz){_;Vc(s;(QO6~2`gqplXx z{=zMqe5IU3GL0RtAhMl9xojry?#I0E(U$Nuyfb*!b-Uo&bzEg}xsF~Dk7Bwx13J$r zN$iZO^x_O~=zes=DA=6_V_uC`ds}jP?vuAF9W-d$q`h*z_aWJq0TsT9?u6ppSKdi% z&NZ{`mR4;cVFg_pQ%|lbII{=&-Ve5AS@PKM-gV)$@>%|Fr_`Q$_1hn!Qb7j7j;+ zS-F-OHEoa1`m6_GSKD^_XJtv3GoHQ?ZX*L zt;biS=vp!ai&N%bt2`(grZc!QV=>*{Xk%r;fY5B!YjcJot7ZG#5<}GJEv4eCMne_d z-{)<@r#*U$9)x)``6k|suUJKKjn?HYd*|yb-|yYL^e*=0edp5VUxIlYtb6yXtdp9# zdy?^U5qDb1A1Ml|GiIN)E*zr`>2w=c@;c-^$-r|EMEZ3OASFz7WdkEzZ_!nRGT7|a}A_U2Ww;};qo{THe(Ha?iXC$Xm2l_;TN znn4w$4vqwd=XN*G3Bq!dGXiKC0tkSwuCB$oK9=F(Vf%F9_2~H%oEFC20D&&wLva>w zpn@QDui;-oTqS|{cW`z-fkv~qMOh;7WZe^9GfKocJ1uPmAh#9nbsO!P?;O~A7y}bB zc;mZ52^HSuFAIGygEHnDKw6lfG{X|n0K)JPyT^B+|7*IF+YasV@12jM?PbCNvV~4+J^H_UrRYAZ=lg7^caGDH4Q=b!9ln>@Kj{8XA_ng_(QWO!wRd z3+3-?4DC$?IyVt0%KMlc5t9igf;p0vWogBC1Ge*Ox;AIOK`;%T@pW{fCJc%_ix zR5iI8jF_Wp0nhn>IiG}wc{YYeG(5_jrWY>k!W98Z zd5P3eYNn2;^{=&o3a<5D=Cv4wZejd)SFs7&_QbXlqeZ5OS~89$06M(%M9F7Ud!anp zwI3r=B0ri1To>V30U-y9kgnl;ZHgH@$RgN1 z&4=cY2fv>Vw z!n#7J=m)--?}{z~&a7oSdJzw&4J#d()F$xf{<^jj^KJwIBJT=}DhxD;vj)&9#P1yo z4>PtC*s+P2K@pl5wieuiSt0I?x#$pZ3V%aOPfg~(orgW&7%10ZOqwF@VJ^f;XA0+? ze>>X%X2*zopP3eC7gX=zDCp`2wOgECH7|J~h5UPtK_~>`$-tu8|4+gD|3jSrfAmoe z#01GF-xxv1)1lTfc>xk&O(?@Buii+YN21nMTE)NzGZ|pRL_k;49XKTXD>oBsbj0&2 z#4kYPoJ&XLWDGNF0d4Y{=?POk65h1AojZ2J92m=I`286u{Sc()P+fARJyU787txksP%`%bIvT|}i@p(qN5Hbh9 zckSv`;zaZ1!f$h+5u{;CTG4~K`v442)lHb;A=H?4;NK`?PY=ZKfG&^)+7QAeU>HJKK>&dcKYc5ZS7BNIh#TM1 z`2uI&148J9jlU5>xk*_B21Q;JcqG7`Apj8TRUkoH?5`qZ0Nwi<7Y8A2oOn_ogaDct zs-2mbl$?AWNarjdC~QQ<#Wh=HfRX`t1607DhVRC(93@utZ!CxF3k!he@nprvMrP@4tI;7W==LAYr6vKogY)UJjUgK@6cq z0IXoeO9dnTh!oB0xD4UtxcKcB5|k5w`3bO@doW}H=(HV%^nf{oN!dMu^dJh(tcd?X z)gs|lXZwD66Ij4QAkGc2VE*|PeE15e*%O)uBzYyv#?=7`uL6)WB7Y>2;07QTjE7rH zEI!T50LU5w@*T7Fws-GZ;3Kid%g1ir^3944{kHVP6QA0Zc2K?;Vi`=1gk~Bcc*9g$02K-1Tpz z2>--GmD~WVKfqf-f^|d5(*}&BPXNjh*>ON1$BBmz5LpH|OYs>zN`zuT#6o!TO0h2w z#yKmHjddk84fMj5tB;r+Aq66yz=S~zWD~J!Bz!BtO5x#Kc}sZx1{j0GC*v5#;;{IU z@|ihJ;N(YUCR3MQ6Z1Gib2b3DWWb+V@+*PzW6Iw{WTtUc1H$pwoeGu<{R1jXiW0s8;GNq1M#u+eKA9 zp>Z1jRcY~0-Z-B_?%x-V|I$7D?~>(zu`6!wN`caO0_#tjKlEkZt3(6mnk(K2Q zobg7S1)7hXIZId`e~%}6A#!u{5;9Sjy2f-;cK$t!Qpw*z5(-QXqMtbu_T?16{_)=j zp_9V-_hbL@$Qt+jpU$bb^t%z7iPbx35RC+`g)ne$7XmOj)vIa20YE;w1`D-51gVaN z&x95S2M4jg4(WvDG*PWbwxMZe25-F=IK+ulCEqMCYU4c-Ti-S}KSxMY{Dd=xknJcb z0&upF?V~u55}>OL^qeio1K?aiS9}oJ6yS@sQ17<^6q1w>_=VWvs7D3>XVU@u*X_fj zQ=4E*gjLQMQmqC+7a_4>SFk?KpTtcNV=+RW1H{^1jDv3o65OE(p{*Sqp?P_nyJa|T z1BFD~hTg+*0ISN?hhW`_kqsgUKT;WBi$k_IDg*#snut^mK93~6R=`jMF)#F6A$S@9 zR;t1VLFWPNW^i0J05Nl2!4-*$0MOKHAj=NeU8F8I7^+{N4BWKE-n-1TBR(mK18_(K zBwD~ONsz3O9Cb)jp1`Ua0IP1Cgo0Oe31U|BC&94+G0zE_pcVELsg~g6Has#ypz_ir z_5IgP70a?*@c>IB5EdZuN1WA6n4`9EM8Y<5@Z&=mJmh+5{|0ly>67US^?iyV)>hnwD5oUyTH_#FvUp>SaH8{TU;b*3&_-ZKXZ~-bFx68pg;K{mY@-Y9nz#Xbg2fTBl+rO_ z4x~Rd2J2xMz#GH6qe6iKX6U>A2 zM~eG@c}vU6%EI;b!$T)Fi0*5eFdrrsw#abe2zLOdgQi=__XiEg&EMk^z_k$sW)1Le zVw*J<5v;3(L#Ti$QX5$M&_|x1J=>)LCxad!G1tVh#nIJAQjhvaAbJt7EqOmz$axAR zp)}x+Nl8g1D3HB|bF)ik`;!%63qm}i2m%WL>a>!Q#HE?&rOinDk^XEBv_FsEmkFZ+ zE4+Fi`0m2Vmr={a3rKmOpEF_P82Sy6O9kLb!Eq_>KT|4gcHlrrIU{7=pP9xMndm$CU9BgFA9YKYyw`V?Syrch&{u14uH5w(mUl~5iXq)S`NXZT?2)r~Z{r*4zWEfnqqgo;&C6L!2gO^wh6 z32nE({{)suJs3z*@E6r|`v|l*VM(KDL|RI&HsHAZyMJ+!Cp=uC8|@pMIZqHW6tEeQ zF5043M9N0Q5(c^uhEthf@!F+ch=&z3${NsqKnqKR10o!=z{IkGc?F0!43XM|)CZ0X zcnK`1C=v2OY|KK6jRsWilPA~F-?APC9y1H@T)=@x&%^j-&b-5^NuLKAC!}PY|yFz;dm3mm3|y{yyI)F$Viua>g!gpo!jvbr+w@=NaJA^VB!5I&3J1KsPvm{E`plVxg zZ1!|M0T=qoU`B-0DOm3zA`s*%(55M}IgiHROF>DRuIgUhLBXPpo;-n)SO}qiAQ&_kt7Gjf< z!gaZk-6dH1UWeF#`};$7u3Lyy5VkJD6@`|G)Tz%;Szs;#;4%G6es-Fl;Jy;0zDA`H zabFsezTh|MZt+K@h|FF@QnIe?iMt(2Rsxa@Vzc-PJT*U9dpJKHz><-$SKge^@Y#XD zf(x)2?kFTZ&mQDO$AM5r6BJe?Ir;fn`T2AO?Gd^EtW5+M!-%yLmWM?FnsnEIqKQLffLg&sJ4<|hNEQPqw|eN<9tBRY^f^tjzr!^B z0ogV{S_AfgG|t7FUOiNxhrB>{7qeFqes#B0;r}qaT|x+$1dHw`@+xVRoSJTgl#F`>j2)G#g9KIttg%2t`Daa}ZRY00)Q; zp@r#AT%SQE`r#%rLrL{=Q}eA2PxQJ)qn|Cf`q#Sg`$GT zApM@56KjAzuPVlYPa5^ajUBxcLqo$v#G`>pfQXO48(o8)0!bek|(4;G!E&4NG% z;iH{R=Z$TYc>JlV9TsN;IO$Yma@1DE$|LcAv=1%)RjnikT-SFNVwLve0rnu-lqh%?R zt!0c$!$f_A;wNgC8v&oK(+6@bjP^ZsrgzYbxwn8$cZ=2uam|MxP0UzYrrQ?H?|U@f zI`@G!$EBy!ZGOV$@cHw3#NU$LOOc7iE%u_|j$;Cp|J|J*a(ul}xnyr+nPYxs4SS5x{9e_EXmQqN&@oLVir^^@+&AL}*U*qa>$9HLfohRGjiUr;Km#5jCvY=(~f zE9c2e4OGFbsG@a{uZdHj2WGT}qUV+kdgfj6b-$l)E8g*FV!>p`oSI4VhJCH`KThIu>OY?sX*6a4U`vF~ks?mMbTzi0efV3dW0zQ>~D)UWe1O4A|(nd>&$ z->gW={CUf2=-thlr=Js3_E_#A$la#jt^4oBQCOGesJt0-;hmn>D;K+PK+*7VQ~j}x z9W3?5RLv=ym$A80L4rHgsh20jX%aU&7wAWR-_Y0aSS>-(cPg#iVRfgd%Pp;SO$GL2 z&!VD#->7XV{%z0?==8j?+go3w^G&jMyX4pN))W?Yd2p8%u3QzFC_XSHM}mrmS2R4FC3F_NKY({IM)Io?29&TA?x?XB|kPiGjU6hwhM)IBMB z$(Xs}$%Xr@(*oN@kAJ+}Wccb?LPiN!pxE`U4-I*Kny19iZAt>nR_t%yl;(0gcR*yajZ=J3Sb8c zbH6isWM26-r_=oLqLJ8ccN)+zqO>z39oTM!Ej+lSd2=?VCU{p&Gmsc{zSY8QXExT{ zw4|z}P(PqTMPaGmWoFdMH8~ruRk^Kd*E#fWe>o}8QlVlA?m>+oaG8$EIM)BN+AaAvuo5{ zc*`x!TSeurnfp7-pd;56uYJVr<9$o%z!zOz0=Pd3MyE3jifx*&rW!&e7MbHlhBi@} z&r^2kR&548X0W$WRcz2;{&N#=eL$~#P>!O-{T$%q1gBrS8BCApr2pL%90MsYYgjLY z_q7@2d|{TNNkXtXm3nF6kGqKs^{apcrt8z|8!Hz5U);StxX#ISm#f5;4-L%}XEaU? zsC6-I{`0st@#?%dr+l=U>xbP}_u1}i^KVf5UU<9sMCus^#~oXzopj!Q5=ibpcgJ2| zTgK>Hi@=ufGvgZTkvM zPZOm}Vp4l#HXmO%$V%a15oXw6efo=_vP7~fu%eG&4;{N5rD1ZH)A7&Mtzy20RSKF$ zADdq8ezpdXtM-qDzDtyEO|{?d8nHfknDt8kg_8wk*MbMNnZKvR{@ScO@PvI(GfBT= z|15}b7btnlpA0gMbq^2LPq*^ca32XjesIs-pbNnIUw7Hkp*!_!&*@J)gIPb;+SzP! z=Qt>PS;LxdkMG68JFB*ty6(ELIz57?a@zy>_YBWke(z83pEYscS@Y$C=KQE(#~6F` zTS=~gXV3vHq&&&744%Kd5I-r+!7pqfr1zA%c0lk?&D`LT2Gy0FvivQ<9`%%3q0gqN zqPomg2mdGTI{7q zWR~*Yz?TCY8V;X1mAqZjw32K$=h&pQar){DmHV-s04nL6+J zg~P8ca&_4OXPi5|edx*p+ue8?gVNQ%8SQ;mw>Hn8y82Gpuzt$2D07$&fWBq`UUtzhyGVnEGwn+-DyH@(7Wmdg#b2DaTDMMq{tf zX64bhODp=ChguxfnhCa}+;d^&DX$IUt4k-g0y}BCgYkm>O2f0|fxg22o+nj+kC)l{ z!C*el25f@vrBI>gS?MKQnmh+pTie(Qr$#P=F<=nY>8n2Z>QtcLFY&^J{kB~09PAV! z5y~^H-p6-=zK{l7&Bvt056Xm@kq%}?O#HSL5j~ZJK!8h5YS#0~S2q|E!Mt92n14jq zohBnXkN`k;(PB&06Emk)K3N`UAx=KeS*Nu~h zRLoDtuhU$d5`CkuQh%n; z*dV^>d==+vd4F@63=sJ4{2zLIpE#c`zZjd5*Lgjr z2a6u_Y;1J5AA7wz`eSHoq-Sp{_!RB`>F?Anc3?BvfeI-uR>5}<2m9w?(C7tfZ;>_zK=1n@%|<}Jzdg{9K5nYE{10JFMkh8 z>J=z=-J12{f(v8vftmvxe1oN;CT^{YDd-p+7+VogFgSO|WWj;+TIGQro(nGzFe+)E z;|f=y^>J>S-dK}xs`A*?dB5qeYn1bP43r%K5#7xsYK+GGv0apir= zoPDku`|?>O_ciZzx_y*|Eyq(V^kNBfvA?D<<*HYQP2LM9tEyjI6Kk-)%HV|HcK7o0 zWfemS4Uv@oS7UykOPMK(+M8N(=XdX~0S2eB2wu5)3O#ct5m&$6KAI{tuG79(OWv-yrHfoK2&A_YI(TNiKvmtj zu!pwg_ox>Q*GUb|MfY;-+9djkeZJG(c$4hcrDo5mjP+9iYuTqV1=6mkUAnRTZDj>N z+b3n3%FNoFC}El`x&vRAp;jLa{hq{dF?3+@((>E?Kc~`_T#f*cuiw z7|q-GCDrDDV6gc)euaJWb~KAtR6?+^lYjixV}e1RiSp^`n}5~>)Tc&Fwyo#Tj{NF3 z$ZU2Zt+zUcUh!(#&$X(uYM;S9TTrl=;4YlrH1TJTaZh8-S8C4e!M5xg9hzH$hLQYr zXSj6qENjzx`73<5qe72J4-Q^Eu)t)wnFk`jDfUNIy@NIh)X}X^oAeVdWEf;|ZVdYP zfOk5mqEAQd#&e*t7t7dR9c6Emdzl!Lm9BYkb55q5v#ON~_rsRY%8LT*Ys|XumRtxN zRO8YzGvT{CKX^5P{_{D;yVh+&wb}a_T*gAOl@f+krN5|h-_FJ&rN^H zU#(Jaaz=#_FMu*lR8IA_TvG1JdyF?TgL)m*SE;d`Fy#v#R;A)SA#rn9b))QTfB^gJ ztTjHDY}9=&G18onxRUfb%PU8l(v`K1f?-hTbBb7JTmUco8ZEVgyH!iS)O>hO_UN2o z>hC%ll54naO@P&VRkNJPAJY?CD>tj`W$}>gl$(X>3NL7kJIeRe<;DtBSqmFKts_k0c^Kkmxfw9;qu!k=iIc_;)VSAFigtt_H^ZTCpc^^yx8$SqI~ zvXqpach$UQ`}n9~n3HU9|HK{!YljA`oR(a^S08UQ8t&h_$;DGyv9_t#n}irII-V6AkHzb&ccCKN0sg2P$m(NDET+&4wp=-mV)fZ#-!e zJo(KtM}#gf%ZE}~MbDA3d&zShTTo|&&13qE8ZBcUmef~Uu%*QhYy52Jsx%(9&?&uj z7W<${WX!_nlFvQ?e>jPg#uRg7K-YjxX@!`Zip8C-pFXVNe{*3duL7!SdU&Ojc zH*r|iM5b&}{k7ma+3SXMWs6L0-zM3tC{3Ai=vb{Ox7T+6VxtGJ48y=DEhRBK-+3*S zQ;qO1j3@3})pa7EGbGo2yLj|;{qG5R&1+dh3IFx*9_F~ zXolT)GfKHOSbNR>S$nnqp&@F^Kfufw3to3$?#%qns0bgN`8~>qfd3$ft^d?*NLKs zq!uJJZ(&kO2A5F3kX(y4IO*j;5KJDn_iF(~K{v7=El4ZqfI$742u=aZ5tZe@j&4^q z+NFvxf`(+sC$|O(A|42FmO!b4iV8D_cKf@Kdk@WP`^{0wyR6tzkN?fT4M^eY1gAQj|NnqYzi3qC`NURP2GAe#Y6Y) zQ?aIlPmCmw*XA4GmZ=RR`_KP=#_s<#BJQTS%qgjxHtl*eC*oEINr~<{#Lm(2htXk3 zRqNe;8ntH}Zch%(9u1gks!_MilwS~;B zT3=blST^RodHkJ)WKPxkyo6Ii^ILzX9VnS_c~d#p=zVv?Zvn5et3`cXS2Q}(i~=jR zv;H3ZkRs7^N38JjXvn$KcB?|x=UP18P$knC9RGfmX?>R0Bc3`dJ;SP>$xg0IlPf4> z6ncdWb zHy^CFObcBdw1?5!K|lJc%WS{yp0dT>Dd%&6H_lbRkhl?+rQMSGVLy#>MchJAv}y81 z-&p*hB(K})=;v`4ulaMw`aV;wc`0#SE%D<;XOSbu#;&u|MFTa}DftQc{Y%5A~LF75bQ_y zasp$Nu1lx zx_a|X(TA(8vF3P?+a?6|8v3pDSTB~~_9{W^6kS4@ZlcJ|kt5t&*zacKxNSVg;=baB z`MJmL$Ezlb_gkt9J+I8j&KaMNYaLZy+`N4fb&JI|_UMthW;rn0Cz%y`gJp z$)&5B9ga|7YVk`pTknC?7Ok!TvQ8;*s0t=jW0bm`5!z2B6nMP66u^Mcy8du!i|Xw2UBU$@6t_8jlSu!G7Q|7nqN<_!D$ z(}Nv`eQqo?!(MmN3}5>~Grw^UQKmyTw+{fm^ehYp{V|DqU|mfCU?Ef~iCF~eqsvC0Fg9^$DD(9h(mMQO2FW(pjPz>=mkL3PWRMM1=Dfq zp+8HoRQ1t3*%%)0T$-PRj@J+Xh(zxa$aZPlI--wCRDF_@8!$?E0f{7KW$tQB$7`W6 zQxAoz4}iM>or}4mGw-+G6-&Dyr|b?aq?gr`7i$V};UErkcX^*~QiE zTz+dUFIq;N^WdqXINP6)XYq)uYu>X>&}R17-v_z6`uk<6aO$*kdFtx?Yh5R9%bM@G zDjR7jDz;=4Zr-41Uh&@IA9f!(Jj;K>MCBiL9~r#9(j(ie5eiKfDz!tYbVfd|Y8tsS zBfGZzWu2^tV9#4?x#S605qOx}0fSD!@{k|HIG&6RTC)s$0R&WQ_r!2o6{uohYN|(m z{UpdRNcWRz0-nW?2S%a2hfJ~_nq1$jfhkw zhuleBxLxp``dAFrxD+5M+<(10K>iRZQ^-I8mRQHLG^2xjQY3eGM;1-pu89l6o(yN) zb^JrtKWF>e{w=wJ4v#7HkM&5)7oruar7>^w<%y*Y*V*mX?mWR(F~dz~89w>4oA_b= zCJiKTe#N4Fx`E1o z+KoFVFt+yX`CP$^3v+;wGB7a6xO_>$9lPc)OXg-|K?sos!+9C!PwW~P1p{8X6Uwzj zrVxO<%{6@nU4ALUO+}P`L(Zx~2M=BvC=eq|kKy&S6A?qR$M-EPYG^J@05S3tfI91D zPp*otJ;1=90~$jLcfkO)JvdtM0t`3!)X3VJ7gAC+wY3aPOd7gSGy}@x;K9&J=f_Ok z+)I5Tbhu4w=_d!KQkl& zdP;c+6+<$VqXFEROp1y87jDlN{uR9jn6co?6mDb)rxYY6vIB~lLngx-*maadaudR* z5O@Msp$@n_C~_@Z6&y_h&dg2%%1M}iHQ(CJgdrutD$N4@XCTE+l&*-@FCJhZU@<`E zVa&2cNXT^WUUi7Y@`84P=_FK$Dzb<`DbV>q`S9ZM@CaIRO!&X}Od3LDQQHu*JAmN) zg#(s&0I=s8&?U>+V z3z12s$AA>^tx>zVbK^(lHB~yne;u2x85)8GZ2|gb) zvdaL+V%$X(=!jMy(xqj@sD1)y3~Uh*5xr+C=D5g0X*WO11&u6QWJv^?48>I|=p(l) zR5Ce(n3US7{AbgLF%i@;BtoHC7)?%?61BzacncGl8%~-M?Pl_48O;0{=;6PwfwWk}`+b72oaa9GKK5}O`!nRPR=W3j zBh#I0Dat#x#cbs4JgzBF@BO1^lQhyIu&QGO5Ra(A;Y7K;Sc0f zm|=V0_XHgD5NvXaiiGfe+Y6G(#*f)(14~1lVz@SToGJ~u&Kv#s?gRVD`6)l~CO4EGZ`jzvt9SVEY7h=!TvNyRfHl{mEbdFkIT^cF; zjKlKF6FT(VF?MS4@7MMe-l~-5+7{Elt;SJDM|*$Qx5Juq@Ifi|@`xFU+r;mwB}1+W z+2SvyeiNPh8pW^qvP1Uitg8+!Y|EHi?P160m={o|blBfN6M4HpjNY*RZMCKl2MNm! zYGp?olx3eBVL2MMbgAziTo%-LUvXGRfBz9LIyVX$8H1oVGc5t}s($*1pV|4Om5p;% zTfBQy7j~-R<7LCwpZK*mn$0HrRdwrz{CUtG4S5IChTCuC@iV#4w47e?m+XkGYEskv z9c=~EqCy1%eNVqn{Mg_oda_+Sto(KZ=dZI&!D-ifEsm~Hak>5Ofs!D1$(4}A<9u$# zvURb$W|X&_7!v=yo!;((34Lpx`MY&b?&Zb>uGM?s6q0;6?`^=B3IolkTK zI}$UQ;W_W1IsELtByQQ>?ChGT{SQqq>Avs&;PW(yVM6T)zTvn=vso~$(%;ihYCCJy z_{%dAT55ZDjweD4BI~6LyHe#ojr;^%PRe4bH>u1b7&y(lf0gHN-QyCNvT{QhJx;?W>dYosfaLr}$&uE66zOH*PW#zNUNB7|-7Y~<} zFbffT-+5Er`?U)-{ZV_#lMm%xo>ld~FFc_$vgSr^?)3;?z59;s7Vp~X-YJ~&{`=WC zP2aLMj8fCM#5nb&?ri-Rcg+ir+G<{3V9>tzVWi@ttqA`|{iEBi&F%U0adg{&q0^hY zIo>yhh2TW8jpu>othBqHhfm5m;LY=4`ZNt?Ow0D?OJ)#?%?}*d5AX6d;LkbRAt1wY z<`{Dv^Hm|S>)+Sfekt(c+K#WHa2TgUg^HL-l-Cmy5>hN721(Qa5uhhP$~a$yOl<4+ z?L^*}2*uXNYJd>5#JB8o;=dd>2Ix1J&p^cT3G^QU z2-DF8uo`mXC%1w(G3_o73I~c>0N?+(fmkIvL~fVX-dA#!+9&S@6xLq@oJJti+yYv$ zW{8_k&^(VSn)$qe0QA96K^j7~Texm0Lc*{dlGnf?-p5NsgB0{KlC1zy43G!80w4?> z05BN?yrA*<88zVgD+mSxGJnKW0GvC5hw+&IWekWrseS-d3&So&bcz91cm=q!OeY9& zuAgolV}mrNUGcmmL1;q(o1_E~=idaR4AI_&Dn5V~bd*TtfD(L-&j4I`5}zZ<0N}(u z=ko`_pCV8YF3-80NU#%uMkLn^_>}!{+fE2oUL1OO2g%7&e2P|}<1RlA7SC5gOp)=J zlg1WLngL2c2VvXxffD2dl$J>a=g_1f zj~Y#)?#N|{JR?Z21gHYT4+0UVC|rX&n|voXvOSntK(ExY$e0OB zVe2FtKwpl;;;crb_$})9gUH#S*q#I`sykrfKFDgr04oQ$EhQDdzy?PbQb$Y-)F&q) zJ*hjOsJMdLJd@oUkVBvnWVcC1m=&^Uvq-)SoVhZcyDzJs|6EgDWf=te>HcTIx?9WZXcBUhfNgb(Au0|4PcKA8H} zS%VyB2ztAimCa@u`h*-s0ML>k5Mh=PVw=Yrc7f9tMc|bF#=~20(s*NbxIN52{8p&=I54@I8cj5Ji-^FTG@g8ZaTU?pnvf!bnRg z!v)!GqVf$~BSB%G-61SY53U-b1vfZX&|Qs^uv9#Gk`ot%)K(GXMsTbpEE@?619{Ro zGOW7eNbZUIQ2+Ql@ZvP3?0fbC3`a;7V?Zb>ctitoNEi{uM1B{s%)09ZJH*sM?j=I{ zgrf_{Fr>_h{_d$(83WLSO3lQ^fglG?v=%9JEk;SkATU7`mBQ!xxKP-X^pB4Lt;-1Y zR;=m&{FmPWp|7tArA8(YgKIZzP(x0eqJdJ|bEd}dBGwPU*YuFcCED=>X01es9H5I5 z?b)m>;u3-~LK&^aoh0Q|0PqR`J7PHJm;>@TVMY+f8?iKidcPTD_z77g^9KO@iltx_Eg%7O%AU4HdbesO7MM`nP@2yC5b9O*6WvoFJG)M5t<}u0bf3Ybul+$=c(jB z5f%}lgsI)z+Y7s!yeyd*O<=bZJpP#E%>S{y`L$$wBfU1*aq>gy8l)i_9>sB>x{{az zo+5C|yx^n|KfR^=uOi|InHKQ}T|fy%gG;kN?Am`tmRPF6Vz4asJP0f(Wb$ijBq$zqHnj8Xp~L?Ba>^GUg3@;mafTRmk$&_a@(?yF0^w_DXgIl= zJP%l+5OLe3PkDr3?4A%+asUMzb8HM^FHaqZ9|SPHXTE*NM@!om^tEM({4?NKB1)Xd zwGFN?`D3;imx!PI4Kp9<$Q=ll>e{QPM=Nw9>pr04bG;0nn;|WZXpLI%BI4f6x581# z@FybD5}khui+9U_9w((fKaX|tpAAnyF-$iK}IO!FW) zOa!a-i`-@K!#x$OhJ4t{2(lQ9AQsqq?0%7Qu40H7Xx)o~}-W? zt|?)%2eFDIffzyLjkoD0k$r&{Q^^F-X(GIUYMZP*G!bUDfuo3b5Q1xIS($5JfB;b` zzlL_tL~HTFE%@Oqhn51K-9`Kfs_#qlG&32T(&ON*5Vj$%n?X-6bsGx44p3?|VI86c@tu&x0Dz_E zl7IXCQ_W72fDo3~3$U@=L55Y{zn{1=&?3Z|fRIT#(S(qIph`rXv6W44gX0M?>VaVM zPK3zQ7kgKMAYG6~{3yx#!**~Hz*0h301e_WTe6=SEu!d>d?i zaN8tCtJd$c)&Pc1y5Z2zW-D+SQUq}#o6!1mJ6$#aQ;oBfOFzDljg?Sd*5rSVItL+l zUW_r?YXE+~28$0Lg~0e2)TlwOR|O>d8ln|uraZBTK?{!f>CqAsB(P!dPv(sqYdseR zJkM8dyui46rT%~Vv6*dzy#@g6E8AS)_BGMG0m2xJi&9@2*NH31`kllqC03kdq zt=RkqY?OjPyF<;Tjt|&lWMA+#U5)$@{YOYzK#jQ^LiVe7-m3-B*$QIzmAE9LbxDdZ^Oy@SV0d>9~m!H*dVZiW~#N+kWT@S`HV zU6@G`opL-d^ram?zm11^9}JQl(~!sRLk)!wzJ^DZaLriy=LOghy4r zRdWgxYA$pUsqWNN06dSp2UZAw5A5sX#A@vq*rbOIai|2=?6eHl&I?2&lDz*xrXxir zarGivXqdWes3Yodb!?z0BJ#kcVJAY2M*xOL41Hu$WdI(Jc}u1NZfQc7d;occGLkWL zgP~tQHkLZlm2;4dnH$pbEFE!aLS~Bhg~TH>!1h8=36DLTw6LT#AdsXyf>~Nw` z*N6E;Fyu8rQZqwsC--YGQ9W8Zj9cm2W?>DSz@nxFP59(540yuA@4NeLBe=NDlX_H$91D~Xgc3qs@$|I2EmF+_|}HQ925i( z)6*G|dE)>Cg%}wfC4@@6z6C5uu)P}Z@1r0A`1ftyns~_lB^u#A1E*8OSS3o*<`CG< zuqpwWlbB~1V}ByM1WCzA{}^YGDDzM-pm4*y?CbuD(u-J%`1q{EssP#E3>^%@d?Q@4 z>=WQZvJpD~)#8V)(21@U{$wp+8of|kkI4v( z#3%~}rY06R5`-5#bP|ljA{m{_FgPIcY|HKT*iEJm;XUCr2b%~o8Jx2u8-RjB>RmWj z>Rhmfu?e2z`QOJw@CpH$4`+&Cv0 zvK*ZU4U{=(eVA(N-CEk_Q@8Q+Ujv)u_e%IN*x(Hr2;H4;8V!%Z=2a@59^|nat-=l*b|dy@qDZ5>(8Px`k!xjYc5Vn zax&CK`*rddC6sa2LygM0nFXaOs#Kg*l;Kd~zrTW-zq~l^x0#Pl6LM8dYDiVBfMO8} zAXGukHh5?_kI;ZQ9%$2q3Pg(?Da*DqimaHWXA1!lbE2g6duqe5S2GuOAxH&C1I7si zex$YbBiXGcxgAW-YOp#??tqgR#t*^8Xb}6fL5_7Vo-u4i!@x&`hQw~$7vl$nSJLSW zJjLXO{1jO|9%R~rQuGNa9$Y}mA0~tEiPW+YE_cZJ$pE9Vf~E@TGvFUM{$P`~-;DUO zzxfnG8EL=}UkzfU^XWXXJ0m8Os2qud7*eLQFhnA;*}vc%vTjm45bc`xM4Ak~kHkDM z1=Qz`N*t5rA>OPe{3Yyl*!ZEyhRl>00D<8cOS4a@*>cCxCq^Jm5_Jx^RO#MBv`crL zFejNBt`!Tz!4f+OQ6<34B@A;#B$+@yWS<}oz61jSx+e)Km|QpR-t|v$`?DS6bd%J~ zH&7eEZVIp-#3)+qQN)99a!?1cD=-D=XL}hTIpIEr5EiqELljJ5_;`3$=;V&HXZoQk zx`J6wgijQ)4a1b|GX#Bj&~iZzL;Qt6XeZ5FX+w?#%|_=KxIJP`SCDQH;)+a6+E?N* zhqQE)``A7VBk@&KQ$xOnd*;RY6BLFv08B(&`pAE&sc3+b(|LEC)4}+KMJM;q2``A1 zqzFPf2JtN7R}z@ONc{H5BqQ!`I=R-J1-J0?_BBGe@4&>g>USwb($h;OL9-1iwKK3d zCTJvZgZ*y6?uJllk*1ORzJ`Va8Ue%;g`~F_rHOd%FAs3ON3uoUP&q}o7-thxF_cBb zJr_v_iRX>bj3Z8T#A2$BwvI9I&m_8Q=nK$7c?4W!;xmLS?JACVzoB;ru{JTN`Y9qs zBF%F=0sjJC#?|Q{#-GTxssI=Q(hE)5Sjq5+S~7c4!nSt}&1vp0Az)3)&y6X;+EN|j z4l)r)c(I^R4f+?Pf>urZ&5*1%VeM(M!kRH2oj#1V;%`es6&1%KgrCC*!pInronbWs z{gb*4GXt6J|M}Xgh$^4yMV9^Ca&p8V2n*p(AgUU2k_$rkAgpeZ)igCPh0@tBHj)1)wT7tW_ z@beRM#e+DPhQTGG&j0)~7gs%L>Lc!rtFoqc!}_Gq7-{!Y3Uq4mfgu?FgRsLq7fVSORTCuK4?lro*@$_L6Lz4gKZ+JKfXwdke)x#lWdp)HP z%8fqIgn}MjpA(MKSrG+EU-7qtApGC(K2rODu1~y4S-t*U%8k|eTVx1p6G)d|4>0@T zRIWU)4M$ucVg?TBuwdVbN-|!$TgyK_*#AdEknzVKA8dXO#b(FA1dNSnq&mL)GOX*6 z%c?XppfmxZf%K?F|9~NcH*zSh#!zD0{t^7>5&DiPTqqTOr`tGJhv?W+BkaE&&i}vZ z@AY$D{_tZtEd}#49Js4@o-m4$SPjtO8tY$I4Yvc$r1^7rSoBHnyNr8*c@pIvR1LyI zd#0i<`X}fH%{=^-J$1g|(@&}U#y*EmM2MDe>3f}Oe@52bUFzoCE0HO)<;k;oUnwLQ zLKB_Mc={TRHg!@xJ$vp^?D6X!PkerVy;W2U(*cL&5?Xo(EgozZrnA&&UE928`0WNw zZG{SvhG*HVI>nJmi&QJU-hJB6QtOi^adB4u^*NQyyYBXDi*FWpOV`~F%#-tpOkWsS zroP93SJ?BBNxVj4uBt!V)f6h84J9Llkz%zd2xEsW@GE>RqqYyBY3< z&=I?`JGxBH-b;|NB*{b8D|0M)Q+_p>l>W-)wYER2dF-Y2?xLBmjLu3YntmuBZ%Wa) zK5|KRi)U%w3u7nS?=m_q5}J2zc?wjdeL_=tPghasxbADIkt@dEOEfSl2W$k-b$@hE z^{)vENl|ffQr?sB)&G*RO7jjNpvToL=cv_NPXz!;+PnkCPAezWQtIB8E>`@Ud&3kk zKjP=mDY>?fH=}r7G_Awjt8OuYu7I*;aKkIE9+j(`OV*yb$ZE@-%L{ z?6G6aZIcv~t?wdz?iOUfl0CDPwK4cutl8JF4XKm1ybs)}CAUAy$#`Zj$X(SC`cC@u zz9N~%TjG|Sd#=p|=ARU#OZ=APFiByp&=NXfER~z+RxRc3x|wn#SMjxo*r(Qe-fvKP zahY)=ho`dk&*uZ>N-Qxat{abBwO8yL@g96P%`3dM@-O>Et2dXpil+B0s`aPYw;rDU zrPnseJn-;`(VJ5YUDRyT)X{Rw@15>TU>}#47+&@`*2jCtjN!NA%e#eqo-j=7*?4X! zimnc|ji!#_@~U1tHr}cIox)va9bPQ{AiYjjp?nqV#*i7Q*7%3Jlmc=R3m>f>mJ7Vl z%fD4Npv1{^1D<-B_$MX7emidcld3;TYoqIm#&V75Dd0dA_r0gvgROh+*{hNM>zrY2 z_(!Xa_`ZSbnBi;NB58z0k~VZOwiIuS-Ntpkq}w5Q znwM;iQE39zQ3qWAI^gn|P9P=D1VF#$n=MXzFnN8Xxysg_5KXfbc&}2Pu$_AL)R`Bz za_?OT8U1AP%O-;UZQgT%BBNy+w~pmc7d^k(8uHCdX~yA;Y|VSAHRDs4Y0LgBdrG{J zTGjD$r!Y$}jrxYhRW%zs$KK8dzRKZTy>h4Xixo9xmvuH&^toNw!*Z;zz;6BE+>@S? zwMX`3+~A62Q3r^Bs@&*gf7ewn>bmmTsS~Te%yH`a?RY0EC6NA!k@Dwg7gg>Z8r842 z0?)Qst+>Z9_Be&U$JKeuRSgCE43K6bF3xHkxs+=xdXK|IQpP{?=fk8t{{@!9qv!d} zb(Nwj_U!YhI9Xm#^X2rPK$)NNq2is@vL`Xr%NZ6MztKzUy;|ikzgGLksxE5%35k^y zCnZ|+EnIkCG;DfwD9`Lj?3K{bYvEjZ7CeGJ^?CR9hD1EFjJrQ@CxP#P>86I5vB*Sw zEqAU!1nCc2J@=HNgC7mtX8sUa6WYg{u5qaHdk@`3L&FO8b$@PNu%@%MSN_N{VUerB zvuoTP{b{P2W!HGmF0{{`_}AoM^{&a~+TY-xGj+c-bB$8;{DDUl73J-A3HQ%4!N97; zgQAOo$cK6;F^XsG2w3rm0y|CilJ#lSqvlgJ7y$bi7%nnTm%Po{05DNsFv}5tq_e$7md<4I+b;LMx1Y~{f8QX;&-J0a z;=Tj7@4bu<&O))RVr#7B_a5wtqZ*HXQYtw@@4myuD19kBo!49;d-d5AGp7^XiOL;g zXFaIs5;NrAb7dRT-aRsB$Waf zxf;Si7rGrsUELa`=FpPge7lIYu?#-^ZXKtHH)9OG$(LIw`wUh zSZ^&}pbqPZdp%M3Z0*d1VtAp!c$X(#*y1T4Ne4!&ZuM|y`GjK6bwP)3hko6CHvVD^ z-_qJ9SaOgQOX-Q<}kI$}5*l_oq zCp-PqD}jx>p4i^iXtprY?y9fSDqglfqlxKsZPIJIFwxyx-{g6DO^QTFm`Z0CJ$b*= z*ZSv?YahFVm1+c-yX$VhRCpkMBET!6WTu$ERh%w@FYMx;dp{Shq-4a*uRGJVS9L1* ziXspDgZDpm-BGmgCpZlAreem1*Y!N> z(|=wcdxbrKY5s?ML1f{HfCY!;X@;k-^*>G~Pbo+Inn|2Y;F}Sx@kj|O|Aqd`C%a{W zY~SzicZhaoZrk-XgfWb&tNe+r&kLs)j&_?bHoR<0qOX)cBVA>qk@8U1Y9D`wXIja{ zGjw$ZXX7VpUpuyLQRXtFr>C2JtD|h|Nj-3(zJyj;`?=iK_R}{%NF@9$-gn-VVrx&{ zrS0!6l|;RnOzK~Tex({I^)>G49jneEK zeWAkyUgq%Np&7tk&FHpOSMAIQVPXa9GSK44{ByUQ7yT+hp%>-qWdN>YnRWo zQE!|#bbsX1$aZq;Iu@j`>2tP2rmNAwB^PCi<`|DHiyi4#n=%96vcr#D;bw;Al zbl|N4;YxUn-Q z#$%n7?TPZQLc3*R=PWB_ZBtLzWh9(uNi7T93)8c<>V@zP9HIsk7KyWtX+Bfq%xvb-=0t?Q&$1Iv%EHM-fNVlw)3Sf70&Git}G2Q)8Mk?ZyOz^EA>z<@+ zIMCcymhLs1!55+PT<+|~}9vopU+;rutVzs?CB-Vo>bsB(re!13K%Z9`*G+ zeZNp1;WopQ?bG!D(Zi5-m82Y1Vo|mHCqu7Oqe@vZmo?`lSz=a%#;jU&+rE;cH`;CR zuoHp+O>8m8XHBnLKTFO`?9C_%>V8loen;sqHFsqmdZjvVsRf$Y8R{o)E9&xY2`h>C zlnlJ;HZR5hu88l|SsoFZI=$&5oo{iik4my)6aRE07xyMF*UX{sZS4pbmA=&~uM8_P zl7fdqGpuQ-Oa$9~By$v04(aHLhU?#q_mviTym_)edG)EEjIZ6Y^NKF7=Q8EX2;R=U zPDkTqJ@agU$jQ)t1%Bg< z7iW7r}7#^)iQq`*Zu{%Ki`OS}-3cYrV>rQxc+PtoLyc0{l#r_c`Ad-~4kuzK~^)&H8g3=DH(=!6GMYCSrcC`P2Mo)|n{vV!0379q+JpQSpwB z)b*+m)!6==I^SqSExPE7%=>$=FRDK$j%xe5H z;)VXKQ!S$BM$}G@_bPgbf0T$0td5UDs8CG4!_>vOU5t9V>dLtKY>zAD(~H-Sxp(Aw zPDko*>UbIXnA)$w=KN7^>ahbgnjuoTM??nn56cAJq?IyvyP;*0vvPB1t+DPpYhAzi z^=8ILY|EHuDrm}M^)>I*t*-j=a;tCqaJ_`a^>unija%}|LLZ&A*XBQUJy)_}OIZ1b zrfUgj_u6t;>CnGUpwoYQiR*R2#!3G8>GcT*C}g^Z$WS&ipY&14y89xFUH|+`@iD6I zmFluQJC2{;efQ$?HENFb+?y&l(?1ZMP_VFwQEQ|%X>Yj1H8YgCj809iH+jn>E->WBKWyM{oEy zKK#zKHFkA~Q~6?|S)OVRrSuImwPjmsYniIX`|>R0UVne8|5m7Q&FP8FS$^qkx13Wh zXU?!Sm0Md?KCvw~`8MWl?rkkXb;c{BV3Xob!K#h5DVHeMcMLADjkYR^QuCLee)J&M zlD-JeqY_b3eyuyhmBrM{Q_8qbsN23*7tHU%wryDUJg1l0Dr&UUgm2zSdHc9DB_ye` zGFAD!r&rXQ2C)5@Uh(Yk4Tm+0=8erVToG)y=O)`FvgYahBP6`t(@iN0I~FxVE^z3W zGAz71r*9I_DY5D_pU8;ZrN-uy&p$-8b$wS6$PXoT50&8`uP2i7y)7J+^lg4SJiMq2A{pPjNjb3-5^ zqRCnC&JXrd-Qd6Ot`1IoW6cn6=DKgWy8MAE)iP^_@#87p)MItC^ryo417d1@MlaEy z@YZi;s*pC<+Ny&?^rZRX**f1o2uOIe)l#@%WrCCV<&8bh zo9;XEH@w#NVbC!@3#z{Ew^NK( znzC!;HEUJNhF6at&$qj`s)}zbwfR}L{!S|sEy3iVvTOa{Rof1*D2c71r#s^NXJCdB zw!1&lzJ58JKV|#+Ew%ff=SSEkJ@fA3w;JBe)}feoL00pr$U+Z~pis&F$@-a1g(tZ9 z%bdl&x||BxQgd1MVScxYZstza9%tI5U0Gi9?KbVwSw-sGJJhB092%Ns;%qaNX*!2b zY&wu|%XUrX+MuSSwOSHQx^lghHX;uN{DipF`7_a{WVn`ds6a_X zSTr2WKi&){@ja=$fjZA$@U^sfYkbn)a*kt7w`?fI`F4lJNfVf|Uj6vxl3-e)aIe0o zl1{-zPR2lEd|cF9=TgMySLbg2%)g`kWWA?7(`}!2P0@lidq&(})b&n#+Zk=EnH6b_ z=AALBR97!G%hNn_vT6lAA4m88Qxng|RvCWWtKRg$;H^bz{Ltjb-__8eW{Yy;rlHU2 zL;4A?H(d(k2yU~Pnf#dkiAj9wd8j4Ng6G#buOKd8eMZURWqdRKA$!K^M(nhlA9X;*tjK~b=bDNnEmnBj5wL-X~!KUA9=IH z{Y;OvOdR+1oM5in^@G!Y{&9r1nsaHc!m6DVXDqm57mKc&^04e5mmNy_nAEUg7u9Lr zN=JUpr&mtdcvdtb%S|b*e4}wsb#p<0z6tB2@YikO1IIh;w+Y3!W?UEYh@=Q8zpyq? zZ=!2TcUn0~HTP}?tKV%EslrF_p4KrHp}(i8h5wq{l(cpxG6kKg6^OMiHOc+Nyo+PV zJc?g&a{Z3?Q;b^tGgc*xvDP0BX`MA&f4FBXJ@1S_r<0$bt&EG5(D>@x*DS6WwmdZ{ zdKOY&wrf9c3U&734MRP5D0Z+#-maWvh!wErPkFP|s5h_O$<6ww`6e#s^)yjmE&W%v zF&cQQ=a(_hfFg)^PjJ`&-`VL<}w0*mAtpXaB|~ zu53ZBXczglyaC~#`^3kcO(ZWQXl%N+e_O56hR#r>hc~~Z^i!s5#i?5-(;3GJGUN>L z%5-J>-0o?n9*h`2Ggq?TX@ZKiL1BQ(Nm>5Y!5kw8D_3f z7N{`l59A+vcC9-7KpLp=1o$JhbW8CjP>}7tt zGVl4cx=RtmnWmC&%URewH^!y>(qo(8x-UB@)=Sy8AX)D1ZvM-D>%BVp$a$kTGsFE2 z#vhLz+&|8$uuP-kM^li_uTNf&kU!Lo#(1B&t28{cj#I-*lcQ>n4Wsz0)Lv;j!L}pm zshnbK4@Mzc%LkQzK4sBQbw!P0)iCSz{>*d@t~JLu6|`$^SaDfwC@EyamBWu5U!22^ znKR%dcCz1MjZjIrgtwD&OQXoFn*wq^NneVa$fT-I@vnLY1*-RO@DsIc6@ ztuU_`C2N=z@10QX&M40M zt(<2$NA}r=l7l7rWNfZxtRGhyfb5SXHmzCd*q1Vz{kn{*pg(&2j3-FrG6?zj{f8-W5|6G{P11mfm35;Dz zt=u!sSfUb4R4Sh5Wna}U?fLmB!qr4;U0=6Eh*eVq_sx8jT61b*v)}gb zm8+zSWhg42IPh6bF&h@J4|Dh_-V{<#?q&&J#fEJUCED;%++a}SzuZy}ClxmmHs!@C2h$epHm5qrA#AQ+ z632GhUV$m`sxzJ8^6=(aPec-Plc7T_N4zqGtUowX%$}nu-fuH;D*EJiW@^d4D#;ef zlZvIod-YCo28#Pl4_Ug^aHZH3QG}W@meFi7(yBDoAI{;t#wvG3VVW|d+*S~;_IPh> zvJ9P;zCqi%GKpc0!^xSkZEOzPB#w>m9PMPNqs_a-bV{*y?DIya_H62|UtD<~9nxhs zGx^^7d6g-t<}+*W_W`4sPR{4S_4}%}*^h{=9`^mo zuO74OOQ(%mK3{*OV87Eg4u%Mil?I0KYTq_X4{T~1lZdOz`)d5*hkLx@PDQCju8?Oj zA#QbBwz6+}yZ3JSmrIIL3d^5zha|Pl{dAZgRLfgDzsua<#vrenj@pF%;?SW|$Jl;t zc00S0iJ)hUm(Q;y+dU@L-#w~Z zk_o&Lh>Tci?^N@b+Er5VDK?97^h;z3RRGK`Q-K|XK(!u`<+U^KGbS= zj4q3K86(2z|FnN^&Wxvb=j}>%??bC!cFEJnKbedCT4mo4r(+R$Y1 zlunStbEmJS$Odnr4|;{nHFjT*MWo6cKQ+EfP$NTB;luOmWe$hTxn%3+_yboon0Z}z zKXu;rllxJZ;fn8tBadCJn~y)){o~wluy4Ne*N*GzH4mTnJ&vCICMT#hoZ8pY7~%RT zBd}l9=~wPd!q(5l_KeUyKh-)kHN5SZsZ4IYeYuLvf+N5A=0kI%cH^!Y8l3)Lr`kEw z%zkVt&3)UyxAAn*s-XG-rB-Lb;*0M>YA8(kANiY#)VnQ5SK_n1v+~glt4bDnvjeUy zf8HiycuQknRJ9ND?o^fK>ID}kdKFq(ZW8qBFVH3|++@K|NtaOzJ`9%(bKQQ=-o4k^ zyO+Kr#=C*huhx0sj%u?clV_jJoA38y#BRKaWBu-W=*2NL`>B`yUF27TaxO8(CD_Zo z^3}!^zxnjSyCHEkQ}#^ahi?6?sK&l2d+mSIokv6;V99wKsqR@(P# zkjmKX$hqTPMO5R97XD@C->kOG^(R9*m8xro;>84&k2L4_*{&@MZwo<7x7%e_(Jj+8 z|1;<3%&5&MuROriOZ*e%>VNq0VbA|LcYp9NGR?Ms5p(|cx9(i@^H8nwA*v{p{cH#9xJXZP3pmTTo)nN%Ja3G(&7%UUkyIyT}wHoMQr zXXfsPW2IjAj4RL6x9<-veZ_u5V$ej{=;sN2cY&-UWpC7sn_GLTf~FPmL-M)932MJD zQ}`##I8*L$p9L5OzehScPeO_%#IKVpU2Epf=Jh=(Z1cO?UUEc9j^(>9F2DG-)hWZx zsM@onBDAzDLdI6F&bPu*di_6Fn`WbCH2EogmST$CmAzTS_lellHu-f)3oOw?HzbVa zNHU{++>-#RdZ%NZSiW#x+^bA#=7R6*xl)mxHHJ*Yv;0^ zei;y&*LS8(jB7iWah#oAsTbG2`NQb7xyMU*(+$DZFxmA=gbo2bSn-Zobm&%2hILXUFM@hJwXR0B_6`@yd|qGQtN-_Njn0$ZVB9(@I;mK2 zy?_NpP?hxTqyohXw|HBoQ!9eCUoNAJS#{T`T`o?zN;=EN?>djX&Zk7DfGn?KO0mFc z|5_16mu-_W0m5a%KD8pt_~Q;amVM+Z>-zDo$UC%cez~0VCdFE(RD%^V6w(cre^!pB zHL5P%qBUIdYj}lyS<`%@uMYRudf$i(U7fqve9f%#?skF5WfiXl0<$u-8u5Qr%2#O5 zb3{+-T{NYjm0^f2xUMC!aEWb#u7HiHEt@*F_*!U2e$V8+_(2xYwfFP)>B#(--`Yjf z`^2zpOhhS*A}V)p-QKA+5?7@{L&rWU-Vdm+{grIgGLO!I?9aUu>*X7$9DAP{PNZrs za(|@r7AU4Yz(!qJb}X(}83d@`^HDk@a!uRZ3iX#1^6pWg?M0j~WN&IdRJ+7PE6ihent zp5J!1`BP8bmRlgI{Qd<^_pfn2JCBtnu}Dc&5bWHGKuhroep+ae%pDYglY;<)cf8Squ#^;9K z=FyVJQelnXw)G*f|A{M=jSsj=2A`EZqKfa`Qy%vB^7l8jtazE;ce=dcA7v7rGylku z9Q+rJ@$kR6i#Pw_LH?(=URw$-JX=0pJaU~cCD3c|<=+uw+tAI~xz+z){@6cM&Hw$n z{(t{g4!>70p}53~=`gqvb}R6GYS;}hA%L6Mq2LAMt2k*E#ot%{@wdSXcCW8Ln5liG zS&}SyG~GG;_O?3zYmR}?0*Gz`v5*5wv^+qBg&Mvvj4#180f3d~lArcg0QmMz(!;+@ zEAems%71*O2W6_v!ePWS0i=A>`}c~6S%uoCwAK_R%I z0QpX^y|AkS6&qe*5g_Gh!EqPNG-O`VKbm!cF5defR(mVRR*3#Kgn^ zAPQ=24Qy9IN}xCnw=xK3oN0WZih)(Of`|env6|Z30{~P7sf(~^_4G2JPC*%0U%3F1 zIZ5WZq<88U;NN|K=M9`BI)dDIanYgZ~)1g*iF5 ziSaP#pDg>0!A%FFo)~QbaILhJB>@I9@azUOl_@nbGcy7_9Y{(+h(c+#Um0k5#!>tb zzZ!l9cnFN$l&!uD4-@VW%lh?V0QHyliUJUOH%S$I%JpTUfRBP=(G&qoPYZ3PZCk<) zrh_g;9Q$AxdkFkE$Q2mD*yf2rE`5+O8zC$}G*1k~Q-GU^VGEdufR1lI3}f7+M~?z0 z>J{R^4-f^)8+4Y}K)n;kY)puHkfn$(k~E0Q#N-8pVi}ATNC@~WZVDdKL=y$tSfHQ+ zV+~CR0;SFc14jq0b0Ft1r9Q@+VCDl}Abu6|4Y2V2Dk@a9wYB;{&uj365eGxyS3NxB z!9svHVPi|nwSyajgM;B4L&!*JU%`(Nhd_#~tgMBt?d!(2wu7MSf>A>x+rajO2APGW zB}BP+534L$YZ0Z==x9!W$l2sBio$7e^QO=yUHlYi1%Oy{AJ+ZP?=w~9V@41HAr6km z+%O}@7a_8!cn2Qb2CWAoP4YSNY@;qBLcI3spzhI1QCetIC`-ZG1@i`2;DOwVFidoQg>>65pQ@8`*n{B?ASpp%X2|6L>$GJ z>O&0W6_ELZsyZx!feCn8YHBnEX^C5@J5jz#Xq+%G7)s5_SlznW)Pc2*Wt;^4xi z(dvw;oSnT6^9FoEd6DfrpzkVzkpUG%Tf{^F>H%)Qf;nddqrpiqNDshfmW7)8u$J7W zWXxBkW`z` z@3h7L!$pNa(jyt>Zi0x0{>@C(zPS70`Vp74)V_n;BGs9LDlieu!QmyY^p+evyV$Pn zli;X;)&=axV62R9=|li-FS@+D>>8cY1O75mxDey1UOJzD61TIJrPPFt5?4_V-$YlU z6@f8x@88h<3dUA&AA=PW=xv8`!4NQleHlKeY(?nHu+W2#n`8T#J48Q4Fznz;P)ir^ zgy0d@B%uS0`kXi|g+^0bT#_XMm3k9MHRS;%qO@Qe%r;2`>kGcV>QiP6rkgs39jvl2 zS=zE!=9w7^8cqHcCX)!PDzMqQ4PF5W%Lg~YxDS+;dCRD4#%%iPO@uXxTPBokEFqpB zY}c;tZ<3fw1~=Z=2*z0es}#C}+L%YR=KTjP{clderHGI!(_VZ(1bTWp z_6mZ-v z68{x(SjWIXjgQ$FNP5m~bYbD@O&=lsNJYF0-=BL%oc<=AdVN_5M|so5p5=nzG7*uy z7YJeGnS3EqNg(rq0Sg%eqMtxSLNHMgX&2!C3HIuK9mZ71BAT*M&f>}3tG$-6)qkxY zWQeboEc`ZyY|wRc+YPT#ZqR8!a|F|lF%@G{M2gGU~ z3$||>qmEcSSS6u>X9(rR0Ogd_RAP}1AsXc`jS_TNLL`5|qsi?69}Y~`23-&~Zet0- z3DQBDlXDI38QLlJV7KOh-UQ8Lb5AS;u);#7rd-JE7lg+*xNKyvx`vmqACe%0r)%r$ z>x)@$V6dSet*NUk#F!0YG`ZM2Fh1S~H{x3`&OBk5Tn$2Ow2&&iCY^!(8!Ka$26+`! z4{etoAdzN9@&a0J*d@d{tjT#_MQ$VjYWOr3Fnltx8Vx{?AqmCbcMcsI{7b9Xo~=m& zwAAT&4~!T%8N+s9pOAQs^-(^q)g*z{j<1Zx4whuu_v6wGAJm-m@ob`6u)9Pmqbe3jHbEGit_YLGdM45hgj2j{1oA}4fa>bZv4iqO zs6voRITr~QBx%?oYsKRX1qYKTe&|!!1}LvUP(}ReD-XYOM+FZX+q&(@2yx0J>j0l_ zNjs&6`&wdXDU)ZD`0`~8hA$T*j!T8qX3C>#?2IYTo+T$^jX@E1LzpZW@Rn9qr4kwi z#JDxH9hbuo(G5_$us}eIy^q|FWEDiA3VXYMa~Ogk{MV8!8=u117Gy|F20R0B=b2Zp z9E3kBT@WZHWU(@bR=R@dNF=&ojtaZ(O9)UEh!bEI6LLE&(VB3|Yh%uLlT9rCKCM9-b z3N>hPu5XgCw6UqcrKLMLIT^80!u9XgE#HH5kWz?8<^|miY*PosA|E6rUBey;Vpay? zCL^^k8#0BbPoGYHbdtr?@NXt`JCge$kpz7b1CCit_Ez}vsevz#(L=_G(L|($lQE%* zgF40IjIHH6c#dQ$7S8crT zfe^yr=}N>h!CAuWhG{V&QX++s5B^=?mXC9D1b+vgITQIl7FK(EJFyYPI>*&zAi|J* z9~o2tBKv4}9F53}8(v;3eIC|Rm( z`lcD_{ou4qgXCXN52+OBN+81iop)b_w1GJIP4cSP+xo{hhj8KA;pGl1bl9z(Y9-48 zcE~}NQFun_FkZ%jL=*uVk8CvXhBiXgg$>DJ4ylwe0d3j_l&tCFDZ3c=SKnD->h zhR_-mt2ovF{uykXgjrcvM^uc!K?I>61hL!p(&{KCFbgn2F~Ok7MYifk+o}3VPawuy z=dEY&=0D9zhClrPZZ=v(2&TVFHcfZrSI}u4+_-dU4ZD35xsl%dX&BU%Kr3ab-v7U? z-2ZKbZ0UZWKKA^s+m5rem=b_d_7%*m;PE`U*Ti+5-wrg*+qy+IW%Yl5bvFS1@izuu zUeWROJlh}p)skASvNuX+(;3fy_3rzmciPa?%5cTLTrsD|nbX11-kq6zQX^8}&i6@q z|9)>Yu$tSy?5c^l(Ff9!ot?z<-Mi4h4Y#ddAqxgzSmY0>y@v2b&rU37;0mXy+* z;?;?`>plZ2XRMDcPzjN*2wwwS8hfeu>6wf>CJDr4?7Pi>-6kL{^RXaM$?Or3N zZ1ra1^sB*yWEn<$`SZ~->oy8i@oK!#Zm43mj({;A_**&}efYtteaSG-dXwD5F1E`u z*9&7qQ^~Q!=ELOH$a%xwo6!;<6pDSu>SN2~9a*N1_qQ3&Jv?L*D!l)}wKem%!+N7$ zT{X+EH?kg|cw(7%*I~;dU)ip!^G`c|tc&s%0gaZ5IO6dqu!3^`(%+Kj64Tm-$9KWo z?rogrY~!aZ*?ErB%5x)&??+*U@zxe&;FnKL{*95oaVO-$H@cM~1+41wiiJI9(XG*I z4tNO%@Kx=3syy&?bN-_ct^T<#8NPeF1L_S*_MIunpxeQd@tiW~?6)7v3omYb{I!u& zXi811!l75X&(3=DRGV1Hk>{5fdJR4s|2gGh)MA|JU%_1SIDO^WZZ)Y6tX$i;+6D=m zgH(@mv=YUCE$`G6n!hqNMrGYKt5LA-Y}Y}ZmTVlNvd|}Oosf0OR(P8MP}r*dk;ioN z9Vt~xzp_=NJ{--scy2xaPI-onVS0ehuTqQsx#9rp9*xH9&mHQ2NUVx2dv5XA&(^hz zh7Film0R+hX_qKk_Rv3Dyc@bzc2&{TiWjpg`W{j$58T%`i+Ee?j{fO3*hWz^`uT4D zM~AI!bToF}Usk!7w;KBXm@w*G>z=lKptMiMDUuv6F~qp_wC{LjxGHGiRiDhTxD7p? zY@%?JH_%EJYbo!WUE1kw49hjfm|V^%+4Q!g;8%FIpeU5iymUM$d4V}D*K6K&;4&4b zi>QX6`DQPj{NT1kwaqO3_y2h`M(4FLdsUyL`WdlwWHGg!4dFRItIN47-!gBsU?osb zgH)kP=Wg(>^GprLXEUVJA_FhCNWZJ-qj4qFIc~9uSM~=DFR% zvSN*3R8-B)eY@N824sO#e9)0nw5S3|@zL&Dcjm%J5ufDg49E6|+)_PruRUu(!IDm- z_h9sqX_k_|39yrsP_Us*}J9~|fN6j01jr+h8oZ~1`Z=_AfDcz;0cXsUTX^>-zq}d+)>dvw?#utFuzJ47!Qva=_|$sl(ZB4s zmKM8T{TOwr;N!#Iq8az-)>zfadK#G&prntWeNj)4zgFvdk9$jj5wZbg4;>_2Ii-tTIKmWO9x$mmTCk-nmA{ec_54JQ|H}f7 zprt@?r=HI^T>p8%$5jG=Jco|IzqIvD`Hwhp9h&E_l1yG0C=K^k=ts9MdQQDho?W(V zT{|g#Mt+lj<_E_|Wd_ndxMeyjwJmSIe`U45(Q@v*uoEit9YseUJGGsd-#v5e@l^Kz z)7n)>McI98i2+Gbx)osvk?xj|PHB)BYA692ItA$-kq(&w326}NZiGQVx&#haopbg+d++Btd)NIe{3#aWcdeJqAxp0HB9XoSxZ?3slE<;@ z@uhwv3!BY3r!3sEwZZp$ucdPF((-V0xSw~4-*CX)ClN$D;Tfr*6oucY8f|gP<<=`g zvWW2GKGi7A%y$>JjE{n#QX7jj{t0Hv*DeIEKrOCWUP^br#BTG&-p{9;y(dG;Y*NDM z(L9s4G>1M)QWCi-^W$7Hdub7W2Ho;~VUN#NAH{>8C4q03P5D%X-8sV$C+z3BsQCVc zY5V|Eyj_BUVVdx%8OEny@mv!R=v5WaQcerU6-f6*@}lSnU2ym3n>KI;`u)lR<=We1 zo)Q?nZd>?IR(-pbz>o#uOk!kg(iJ63c z)220vo%<0t?psB=yW`i=Y&VvZu0k9V<4#y1pX$8hG=*ZankMxsfYOXZmOUY$;>Po0| z2i{skwkOmkkec)R#F*Bq5VaA}mr!0!sDVQE zik}=Un@R-LV^3XZKD|8juO0uh!YQ7Ft~C(h%wvmctLOyQQNYdrg3R=T24*4Fm&M1o z(|(2~7joJ{t*oCBK^IcBZdk7I^uY~Cny&)E#&Ff+GLQVbD&mXb587fIYc0D>kGMHO zsaSS1QQd_tA%6_)EEU$+e9V&l8CCLfyO9TwKw~`o`f{p>wOT1d->miTdfw&IxHmi7 zB=KYNlEu&Vzw{x|64sJ$K~-~RVKmvu0m4brCM)pdK2M)U28|W3LTl7SPb%cusXD}K z57xM$UZ5Or$6T_?1mWxjqF#6KHu$gK?@C09-=qzvEXS?eWNR#~{?Q_1?P_ct%2=?m zZqm$iiSToC08Q6{4w$F{=;yX_GK)%mLdq|t?cC3X-y>Xpd_zlN&TLv4DVNZg**PBS zJ2m9+0y~H{A|p;Ad~mj~xHKRctKn<;>8`7^nSl$ZnnNs$Q!&7`5W!OU{9*7t`=JIi zgwxvbkRrY?vMQ2(#gDg)4Y>VUZh#@}bmCYG92x&l?ILcB< z=rp;6+EEYHU9e0aQedetbTEzd21q|mFNY}fXaT~LOfj#Nb0MIw9}Af|zhxf#vt@qF zCN!>=xG9+p%$Z?}BPTISZb!CVWy2LXB{{XaX~PZ2D+i_U zrB)xSs8-;lhz46@wnr1U1@LonL}1_Y2>)oZsT%*g66-t;E-AJHjlt4Y?`Wz6ZTjqi zqr7%j{*~^7@zR5aN;`7q9jNDy;HVF_gfQN%Cx`q+m(j&o(aC+0H7@TPd~b+AsXrB$ z4;~rO;x#ppQjJguwc*akzU5Bb{D;>2OlSI#2_Rs{UA?~7f(o%4TAtzCauZ|Yuy9M% zo|4s;_O2t$VZi-KyE2da#HL;K74&pIz0#Rs>Aqu5$f0e#U|-^XK4s8L$FT#KZr)mP z^N)yA78?lvEYqH+53JX)g?9+%}-sS1tFUG*LQLmMsFUek)w~;p45$`i5fC^u( zF3wEHird1C8q-rsVK{wT!1bqdhNGp{mkzgm^?^JznL?i#4IhaR|^DEx`NB{>pCJ0RTqXJC z;Qd{KcVsuJ4Eax5bAE~AR98dDSVSpbt!Jt^JK=r&s!0;vIt&O7RE0sV={h?*DZ;SI zif7l;yge8maU}M~l7AT6XK~!HF5q#;7VRnLHFve?f|1T*<}dMZon?B>&G|1sk|n}n zK5=__O-9c^lAEJKv~EV-FPMzR)Q}Yn=yt-Y}R&e-MS!W)1V2s#F(R}MaeOwsXCF@^Z!(7^iYdFzoP+i+B%w9udqLiC3^)qG? zHh6>aQBc#uSgh`~;Dc9LlGLsisy3bSv0hc=XfTPUfevthI0tnNm6lTBrIFcbT6zt` zI3G=WPD!YkO+p1&B2uDjxIdMwcsxp1aeBD+8lKK^+_HqhDPw7V^DHuGR*W+GO4f`$ zPNNxHDliO14Pyt2<>}zW=}Tj@pm2IHSj`CMHsqW^adjggeyrCTzlMyos;J;+0{AXr zSt9}*^jLF?Ve<4A9XqUO*%nl|2TBh70x78ZA~k7w@a1)oiUx(Pdh%pi5?i!%OhtZs z#BNhzqFEy-^K8cK^ciD>7?z3eu;)blC0%!QWyx-3-F~0#9)74?s6V6mV94n#K0uiN z{`$#;46%^2tJm0e!k~UN`M-Gt?FS-pLeICgO+x z@hb|GT}^cp`I>abz6VZoWuw+bkz?PH<{3QFN8G0tq zDYc>>RmE6M%NcxhJqI}BvU^#YwpJ`U8!d0KW)O>>| z&;^GKJ^ZB1K`MLwAw5LBW;y?$tC8|k<%4AIUH#L;?~c8XPl@W9$E|v zEcFfT`sgua&7-bGRvJ#VO>UyxTA%!qi)hLQ`2)ujV;nmbOE+xN@Fm>#v+`5D6(C+9 z!2euJ&nbE-l-l7_6nSZ3i*mkK9;-BRR2btM@~LG2MqOlU@IGj&x^P4Jtpsb0B?>rW zs(ZDJ(SR>4MM3RfzBoZOB$D`QsPETSKX5EV5gZI9w6?$;M2&WDvoU2C=PCC(v~Nse z=JP!Nib^(+e&Z9 zAGBZ$0pjx!Nt~>u-0dk1za_>+p75#%PABp>Q>WwYS*Nf!*H;Nwcy{EsUuYpQ2O=EL8I^e&_(Nh5Bl$TxF5g zjnTF#Vdx;KKoFNd4P4C07mMdI>nfn~I&fMnHFV-2Ow&9R)b`7QLy>vr-o9yujn_JX z!j}#Md488CaR|NT@3PmbzRsYLBP^w1Q#^{?H7e=g(+qrK1Hh)|ozfen*}PChrr<=X z`+?y0$${C2w+E^s;8^Tvlsaj_sHPuT^a!$DoZ%btz2sMvMGRGpNY%JIAhD5PA^7*- zFZ8Yn_pZctpK*gB&7scFRMA>+&TLH5{9uH*;$awP40r%W&ZYQJJ-!!W8_ z`;c|HVOs)T5pe%uHWEBVKuqrLCn)5hR%`=R8V`r zZ}|-!M}a`FSSjwX*g7J6GQ!r!tQId6{W*r}V9hgm^vR~*`!kRL;Ad=^xk{cLB`9S+ zbb6!63K`fl?AAIO6Fewni^g(=7%L0>#1*O36KsBwdR@#`Uq$YX%J*7E)q+dgB21p; z^?NbY1>ebrd-%~-7R8SsRB!dz>MK3C(c}-Uo_r=RDA?J`g!SiysP4Wm>-XXUM4ZM7 z&-~*nqEX&WMFH)@zYjKV=os)2`FYRz<>9Nysm=lEcX#O>FY2zb!f&YrgyVd(Fzn`) zk;8Yvt($V5b~L|WVFaH;pAztN3o14`W?RKR*rhR1D#8DN>a9dqB-Mcx|MToCv~S}tb5*6>nBfADmg^YFQt)$W zN6eZ14rs}PO#1>?Xv4Ha?1h`Sn9lO^uFr`IZNv%7UPPY-e-hPf!G+1gILWH1#%#bn zw*&G(Gf^=upxMS`qfS-;2GGQw-T9{$t%>Zn5Oc_@!%>z4juP6%btv1RM&|*I+6Pk< z+gnK_bQS2ZT^tWckv>UBXR|HpSk*~X&m{u#*uj?RC?)*hy^qCr;Idv+Qu0*Lk7)5v zP^6w+qFGCJH-F5LT6S=QaA%%M#X|hab)I+bC3Ww|1oxuV2O~W4uTP~*0jw5^osdY@>_voPUbSmk;3*ZT8klRsO~huNF$|G zdWR*oryyZd#@e6~WFEa#e``f(#L-H111!=o=RSud{~vH;&V zMsBsi_EFVRYqXK0h5KE_xH3SYP}8FqnhNV0C|y!0VN!C;`Vg^_B@w$;CR9gQs2`a# zE#F&Gs4Q=;1RV3zIsyE3-oCg^4h#_MZ5?5LF zY~7JGvq%Kh^_wRNpQXzQr$*<$A_VhLd!U=(K*Qd-* z<0Dpxrp12Ul9;^q2i3`(`>flXtaDa@Swd|A9M=Sv70iXV>lXr1XcHFSa zfHgARdb4?cJH$_Cuv)BS*Y2d;Oar8m%@a#M=Wg=TQ;IR+Cak?2Ov7u{R>~!QX~nj6 z3?*B1V|_VYg!?g1yspDJ4P2A^f5t@hH+SybT20pbb2(HXeh)o)ca?DS90X8OqB^wa zrYcIgUGKo>>K5Z3^Z*P5WdyKvfUY+i0i+FlOtL&ALZbNHz3-ww+2Dh(8{WE)Tdc@C zwA{(1n2i*tV(wc;M8N%Rcf-n_7__ihHs-6G_nWAYtw5?{x#>0rKDXKAFt5%|@rQjW zV-=)E<6tY(J4|_4mK|}&d>td4x>aMKkTS{N_aP$SuTu=f1w7my#~ZE=gn0*gfJayh zL+s(cj*=T0^Z?<%s)e!R%5LR&CK%+=v|P4JvZ`g6yT@`iiPL;xN^F>>=h4lW_P3zS z5B%4w{+EC% z^e^>4^B*oMV)#F->-#@!MMcy=T#SgD{()DnJ|uhcc?K+V$j7r0n5hqPyW-I2Cs$-| zkK6b3fw3L!Ar0@kQvs4Buv6s!00m0`Ts86>$m9rMafkqbtqUvy`W&E20L5{jjQ_pt zPiAqucmT{V@*Du@05}-U_fNTx|LchV;oL%N{y!(;f6?va9Vn#H7nz3j8+s4;C@W~l Jm&;m&{1=aFa|i$c From fa590c33cc94b6e1c0ef91f363bf074dd48e04bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marker=20dao=20=C2=AE?= Date: Mon, 18 Aug 2025 16:37:13 +0200 Subject: [PATCH 017/101] SwatchContainer: Improve typing (#30781) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: marker dao ® --- .../js/__internal/core/utils/m_swatch_container.ts | 12 +++++++++--- .../ui/overlay/m_overlay_position_controller.ts | 8 +++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/devextreme/js/__internal/core/utils/m_swatch_container.ts b/packages/devextreme/js/__internal/core/utils/m_swatch_container.ts index 7d33b2e0465b..2c7ff8b3c7b5 100644 --- a/packages/devextreme/js/__internal/core/utils/m_swatch_container.ts +++ b/packages/devextreme/js/__internal/core/utils/m_swatch_container.ts @@ -1,13 +1,19 @@ +import type { dxElementWrapper } from '@js/core/renderer'; import $ from '@js/core/renderer'; import { value } from '@js/core/utils/view_port'; const SWATCH_CONTAINER_CLASS_PREFIX = 'dx-swatch-'; -const getSwatchContainer = (element) => { +const getSwatchContainer = ( + element: Element | dxElementWrapper, +): dxElementWrapper => { const $element = $(element); const swatchContainer = $element.closest(`[class^="${SWATCH_CONTAINER_CLASS_PREFIX}"], [class*=" ${SWATCH_CONTAINER_CLASS_PREFIX}"]`); - const viewport = value(); - if (!swatchContainer.length) return viewport; + const viewport: dxElementWrapper = value(); + + if (!swatchContainer.length) { + return viewport; + } const swatchClassRegex = new RegExp(`(\\s|^)(${SWATCH_CONTAINER_CLASS_PREFIX}.*?)(\\s|$)`); const swatchClass = swatchContainer[0].className.match(swatchClassRegex)[2]; diff --git a/packages/devextreme/js/__internal/ui/overlay/m_overlay_position_controller.ts b/packages/devextreme/js/__internal/ui/overlay/m_overlay_position_controller.ts index 1c6372aaf7ec..2b3452758090 100644 --- a/packages/devextreme/js/__internal/ui/overlay/m_overlay_position_controller.ts +++ b/packages/devextreme/js/__internal/ui/overlay/m_overlay_position_controller.ts @@ -210,9 +210,11 @@ export class OverlayPositionController< this._properties.container = element; } - this._$markupContainer = element - ? $(element) - : swatch.getSwatchContainer(this._$root); + if (element) { + this._$markupContainer = $(element); + } else if (this._$root) { + this._$markupContainer = swatch.getSwatchContainer(this._$root); + } this.updateVisualContainer(this._properties.visualContainer); } From 53b6ccb70048dbce23e78e4e7057495a8c8f1648 Mon Sep 17 00:00:00 2001 From: Vladimir Bushmanov Date: Mon, 18 Aug 2025 20:13:22 +0500 Subject: [PATCH 018/101] Scheduler: remove redundant code (DataSourceProvider and loadedResources option) (#30787) Co-authored-by: Vladimir Bushmanov --- .../appointments/m_appointment_collection.ts | 6 +- .../appointments/utils/get_view_model_diff.ts | 16 +-- .../js/__internal/scheduler/m_scheduler.ts | 111 +++++++++--------- .../filterting/{__tests__ => }/remote.test.ts | 2 +- .../scheduler_options_base_widget.ts | 1 + .../scheduler/utils/options/constants.ts | 1 - .../scheduler/utils/options/types.ts | 3 - .../resource_manager/resource_manager.ts | 5 +- .../appointment.dataProcessor.test.ts | 110 ++++++++--------- .../filtering/m_appointment_filter.ts | 4 +- .../m_appointment_data_provider.ts | 85 -------------- .../m_appointment_data_source.ts | 42 +++---- .../m_appointments_layout_manager.ts | 1 - .../scheduler/workspaces/m_agenda.ts | 2 - .../agenda.tests.js | 8 -- .../appointments.tests.js | 9 +- .../appointments.verticalStrategy.tests.js | 2 +- .../common.initialization.tests.js | 10 +- .../common.markup.tests.js | 18 +-- .../common.options.tests.js | 30 ----- .../integration.dateNavigator.tests.js | 4 +- .../integration.workSpace.tests.js | 46 -------- 22 files changed, 164 insertions(+), 352 deletions(-) rename packages/devextreme/js/__internal/scheduler/r1/filterting/{__tests__ => }/remote.test.ts (99%) delete mode 100644 packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/data_provider/m_appointment_data_provider.ts diff --git a/packages/devextreme/js/__internal/scheduler/appointments/m_appointment_collection.ts b/packages/devextreme/js/__internal/scheduler/appointments/m_appointment_collection.ts index 4497ac044c8d..992f154c5514 100644 --- a/packages/devextreme/js/__internal/scheduler/appointments/m_appointment_collection.ts +++ b/packages/devextreme/js/__internal/scheduler/appointments/m_appointment_collection.ts @@ -86,8 +86,8 @@ class SchedulerAppointments extends CollectionWidget { return this.invoke('isVirtualScrolling'); } - get appointmentDataProvider() { - return this.option('getAppointmentDataProvider')(); + get appointmentDataSource() { + return this.option('getAppointmentDataSource')(); } get dataAccessors(): AppointmentDataAccessor { @@ -246,7 +246,7 @@ class SchedulerAppointments extends CollectionWidget { ): ViewModelDiff[] { const elementsInRenderOrder = previousValue .map(({ sortedIndex }) => this.renderedElementsBySortedIndex[sortedIndex]); - const diff = getViewModelDiff(previousValue, value, this.appointmentDataProvider); + const diff = getViewModelDiff(previousValue, value, this.appointmentDataSource); diff .filter((item) => !isNeedToAdd(item)) .forEach((item, index) => { diff --git a/packages/devextreme/js/__internal/scheduler/appointments/utils/get_view_model_diff.ts b/packages/devextreme/js/__internal/scheduler/appointments/utils/get_view_model_diff.ts index 65267fe1cb44..666476f151bf 100644 --- a/packages/devextreme/js/__internal/scheduler/appointments/utils/get_view_model_diff.ts +++ b/packages/devextreme/js/__internal/scheduler/appointments/utils/get_view_model_diff.ts @@ -1,7 +1,7 @@ import { equalByValue } from '@js/core/utils/common'; import type { SafeAppointment } from '../../types'; -import type { AppointmentDataProvider } from '../../view_model/generate_view_model/data_provider/m_appointment_data_provider'; +import type { AppointmentDataSource } from '../../view_model/generate_view_model/data_provider/m_appointment_data_source'; import type { AppointmentViewModelPlain } from '../../view_model/generate_view_model/types'; import type { DiffItem } from './get_arrays_diff'; import { getArraysDiff } from './get_arrays_diff'; @@ -41,28 +41,28 @@ const getObjectToCompare = ( const isDataChanged = ( data: SafeAppointment, - appointmentDataProvider: AppointmentDataProvider, + appointmentDataSource: AppointmentDataSource, ): boolean => { - const updatedData = appointmentDataProvider.getUpdatedAppointment(); + const updatedData = appointmentDataSource.getUpdatedAppointment(); - return updatedData === data || appointmentDataProvider + return updatedData === data || appointmentDataSource .getUpdatedAppointmentKeys() .some((item) => data[item.key] === item.value); }; -const compareViewModel = (appointmentDataProvider: AppointmentDataProvider) => ( +const compareViewModel = (appointmentDataSource: AppointmentDataSource) => ( viewModelOld: AppointmentViewModelPlain, viewModelNext: AppointmentViewModelPlain, ): boolean => viewModelOld.itemData === viewModelNext.itemData - && !isDataChanged(viewModelNext.itemData, appointmentDataProvider) + && !isDataChanged(viewModelNext.itemData, appointmentDataSource) && equalByValue(getObjectToCompare(viewModelOld), getObjectToCompare(viewModelNext)); export const getViewModelDiff = ( viewModelOld: AppointmentViewModelPlain[], viewModelNext: AppointmentViewModelPlain[], - appointmentDataProvider: AppointmentDataProvider, + appointmentDataSource: AppointmentDataSource, ): DiffItem[] => getArraysDiff( viewModelOld, viewModelNext, - compareViewModel(appointmentDataProvider), + compareViewModel(appointmentDataSource), ); diff --git a/packages/devextreme/js/__internal/scheduler/m_scheduler.ts b/packages/devextreme/js/__internal/scheduler/m_scheduler.ts index 68e1a2cb56f1..d5ce49a1201a 100644 --- a/packages/devextreme/js/__internal/scheduler/m_scheduler.ts +++ b/packages/devextreme/js/__internal/scheduler/m_scheduler.ts @@ -48,6 +48,7 @@ import type { SubscribeKey, SubscribeMethods } from './m_subscribes'; import subscribes from './m_subscribes'; import { utils } from './m_utils'; import timeZoneUtils, { type TimezoneLabel } from './m_utils_time_zone'; +import { combineRemoteFilter } from './r1/filterting/remote'; import { createTimeZoneCalculator } from './r1/timezone_calculator/index'; import { excludeFromRecurrence, @@ -70,7 +71,7 @@ import { setAppointmentGroupValues } from './utils/resource_manager/appointment_ import { getLeafGroupValues } from './utils/resource_manager/group_utils'; import { createResourceEditorModel } from './utils/resource_manager/popup_utils'; import { ResourceManager } from './utils/resource_manager/resource_manager'; -import { AppointmentDataProvider } from './view_model/generate_view_model/data_provider/m_appointment_data_provider'; +import { AppointmentDataSource } from './view_model/generate_view_model/data_provider/m_appointment_data_source'; import type { AppointmentAgendaViewModel, AppointmentViewModelPlain, @@ -168,7 +169,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { _appointments: any; - appointmentDataProvider!: AppointmentDataProvider; + appointmentDataSource!: AppointmentDataSource; _dataSource: any; @@ -238,9 +239,8 @@ class Scheduler extends SchedulerOptionsBaseWidget { // @ts-expect-error const resolveCallbacks = new Deferred(); - whenLoaded.done((groupsResources) => { - this.option('loadedResources', groupsResources); - resolveCallbacks.resolve(groupsResources); + whenLoaded.done(() => { + resolveCallbacks.resolve(); }); this._postponeDataSourceLoading(whenLoaded); @@ -278,7 +278,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { this._initDataSource(); this._postponeResourceLoading().done(() => { - this.appointmentDataProvider.setDataSource(this._dataSource); + this.appointmentDataSource.setDataSource(this._dataSource); this._filterAppointmentsByDate(); this._updateOption('workSpace', 'showAllDayPanel', this.option('showAllDayPanel')); }); @@ -338,7 +338,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { case 'resources': this.resourceManager?.dispose(); this.resourceManager = new ResourceManager(this.option('resources')); - this.updateInstances(); + this.updateAppointmentDataSource(); this._postponeResourceLoading().done(() => { this._appointments.option('items', []); @@ -349,7 +349,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { break; case 'startDayHour': case 'endDayHour': - this.updateInstances(); + this.updateAppointmentDataSource(); this._appointments.option('items', []); this._updateOption('workSpace', name, value); @@ -361,7 +361,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { // TODO Vinogradov refactoring: merge it with startDayHour / endDayHour case 'offset': - this.updateInstances(); + this.updateAppointmentDataSource(); this._appointments.option('items', []); this._updateOption('workSpace', 'viewOffset', this.normalizeViewOffsetValue(value)); @@ -456,7 +456,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { break; } case 'showAllDayPanel': - this.updateInstances(); + this.updateAppointmentDataSource(); this.repaint(); break; case 'showCurrentTimeIndicator': @@ -477,7 +477,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { case 'recurrenceEditMode': case 'remoteFiltering': case 'timeZone': - this.updateInstances(); + this.updateAppointmentDataSource(); this.repaint(); break; case 'dropDownAppointmentTemplate': @@ -503,8 +503,6 @@ class Scheduler extends SchedulerOptionsBaseWidget { case 'recurrenceExceptionExpr': case 'disabledExpr': this._updateExpression(name, value); - this.appointmentDataProvider.updateDataAccessors(this._dataAccessors); - this._initAppointmentTemplate(); this.repaint(); break; @@ -518,7 +516,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { this._updateOption('workSpace', args.fullName, value); break; case 'allDayPanelMode': - this.updateInstances(); + this.updateAppointmentDataSource(); this._updateOption('workSpace', args.fullName, value); break; case 'renovateRender': @@ -532,8 +530,6 @@ class Scheduler extends SchedulerOptionsBaseWidget { ? this._header.onToolbarOptionChanged(args.fullName, value) : this.repaint(); break; - case 'loadedResources': - break; default: // @ts-expect-error super._optionChanged(args); @@ -589,7 +585,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { const startDate = this.timeZoneCalculator.createDate(dateRange[0], 'fromGrid'); const endDate = this.timeZoneCalculator.createDate(dateRange[1], 'fromGrid'); - this.appointmentDataProvider.filterByDate( + this.setRemoteFilter( startDate, endDate, this.option('remoteFiltering'), @@ -597,6 +593,27 @@ class Scheduler extends SchedulerOptionsBaseWidget { ); } + setRemoteFilter(min, max, remoteFiltering = false, dateSerializationFormat?) { + const dataSource = this._dataSource; + const dataAccessors = this._dataAccessors; + + if (!dataSource || !remoteFiltering) { + return; + } + + const dataSourceFilter = dataSource.filter(); + const filter = combineRemoteFilter({ + dataSourceFilter, + dataAccessors, + min, + max, + dateSerializationFormat, + forceIsoDateParsing: config().forceIsoDateParsing, + }); + + dataSource.filter(filter); + } + _reloadDataSource() { // @ts-expect-error const result = new Deferred(); @@ -733,7 +750,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { this._initEditing(); - this.updateInstances(); + this.updateAppointmentDataSource(); this._initActions(); @@ -750,35 +767,16 @@ class Scheduler extends SchedulerOptionsBaseWidget { this._notifyScheduler = new NotifyScheduler({ scheduler: this }); } - createAppointmentDataProvider() { - this.appointmentDataProvider?.destroy(); - this.appointmentDataProvider = new AppointmentDataProvider({ - dataSource: this._dataSource, - dataAccessors: this._dataAccessors, - timeZoneCalculator: this.timeZoneCalculator, - dateSerializationFormat: this.option('dateSerializationFormat'), - resources: this.option('resources'), - startDayHour: () => this.getViewOption('startDayHour'), - endDayHour: () => this.getViewOption('endDayHour'), - viewOffset: () => this.getViewOffsetMs(), - allDayPanelMode: () => this.getViewOption('allDayPanelMode'), - showAllDayPanel: () => this.option('showAllDayPanel'), - getResourceManager: () => this.resourceManager, - getIsVirtualScrolling: () => this.isVirtualScrolling(), - getSupportAllDayRow: () => this._workSpace.supportAllDayRow(), - getViewType: () => this._workSpace.type, - getViewDirection: () => this._workSpace.viewDirection, - getDateRange: () => this._workSpace.getDateRange(), - getGroupCount: () => this._workSpace._getGroupCount(), - getViewDataProvider: () => this._workSpace.viewDataProvider, - }); + createAppointmentDataSource() { + this.appointmentDataSource?.destroy(); + this.appointmentDataSource = new AppointmentDataSource(this._dataSource); } - updateInstances() { + updateAppointmentDataSource() { this._timeZoneCalculator = null; if (this.getWorkSpace()) { - this.createAppointmentDataProvider(); + this.createAppointmentDataSource(); } } @@ -881,7 +879,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { : []; this._appointments.option('items', viewModel); - this.appointmentDataProvider.cleanState(); + this.appointmentDataSource.cleanState(); } _getAppointmentsToRepaint(): AppointmentViewModelPlain[] { @@ -987,9 +985,8 @@ class Scheduler extends SchedulerOptionsBaseWidget { this.setAria({ role: 'group' }); } - _initMarkupOnResourceLoaded(groupsResources) { + _initMarkupOnResourceLoaded() { if (!(this as any)._disposed) { - this.option('loadedResources', groupsResources); this._initMarkupCore(); this._reloadDataSource(); } @@ -1024,9 +1021,9 @@ class Scheduler extends SchedulerOptionsBaseWidget { if (groups?.length) { this.resourceManager.loadGroupResources(groups, true) - .then((groupsResources) => this._initMarkupOnResourceLoaded(groupsResources)); + .then(() => this._initMarkupOnResourceLoaded()); } else { - this._initMarkupOnResourceLoaded([]); + this._initMarkupOnResourceLoaded(); } } } @@ -1172,7 +1169,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { }); this._waitAsyncTemplate(() => this._workSpaceRecalculation?.resolve()); - this.createAppointmentDataProvider(); + this.createAppointmentDataSource(); this._filterAppointmentsByDate(); this._validateKeyFieldIfAgendaExist(); this._updateA11yStatus(); @@ -1234,7 +1231,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { getResourceManager: () => this.resourceManager, getAppointmentColor: this.createGetAppointmentColor(), - getAppointmentDataProvider: () => this.appointmentDataProvider, + getAppointmentDataSource: () => this.appointmentDataSource, dataAccessors: this._dataAccessors, notifyScheduler: this._notifyScheduler, onItemRendered: this._getAppointmentRenderedAction(), @@ -1318,7 +1315,6 @@ class Scheduler extends SchedulerOptionsBaseWidget { } _workSpaceConfig(currentViewOptions: NormalizedView) { - const groupsResources = this.option('loadedResources'); const scrolling = this.getViewOption('scrolling'); const isVirtualScrolling = scrolling.mode === 'virtual'; const horizontalVirtualScrollingAllowed = isVirtualScrolling @@ -1377,7 +1373,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { }, currentViewOptions); result.notifyScheduler = this._notifyScheduler; - result.groups = groupsResources; + result.groups = this.resourceManager.groupResources(); result.onCellClick = this._createActionByOption('onCellClick'); result.onCellContextMenu = this._createActionByOption('onCellContextMenu'); result.currentDate = this.getViewOption('currentDate'); @@ -1387,7 +1383,6 @@ class Scheduler extends SchedulerOptionsBaseWidget { result.timeCellTemplate = result.timeCellTemplate ? this._getTemplate(result.timeCellTemplate) : null; result.resourceCellTemplate = result.resourceCellTemplate ? this._getTemplate(result.resourceCellTemplate) : null; result.dateCellTemplate = result.dateCellTemplate ? this._getTemplate(result.dateCellTemplate) : null; - result.getAppointmentDataProvider = () => this.appointmentDataProvider; return result; } @@ -1524,7 +1519,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { delete singleRawAppointment[this._dataAccessors.expr.recurrenceExceptionExpr]; delete singleRawAppointment[this._dataAccessors.expr.recurrenceRuleExpr]; - const keyPropertyName = this.appointmentDataProvider.keyName; + const keyPropertyName = this.appointmentDataSource.keyName; delete singleRawAppointment[keyPropertyName]; /* eslint-enable @typescript-eslint/no-dynamic-delete */ @@ -1768,7 +1763,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { this._expandAllDayPanel(rawAppointment); try { - deferred = this.appointmentDataProvider + deferred = this.appointmentDataSource .update(target, rawAppointment) .done(() => { dragEvent?.cancel.resolve(false); @@ -2080,7 +2075,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { this._expandAllDayPanel(serializedAppointment); - return this.appointmentDataProvider + return this.appointmentDataSource .add(serializedAppointment) .always((storeAppointment) => this._onDataPromiseCompleted(StoreEventNames.ADDED, storeAppointment)); }); @@ -2110,7 +2105,7 @@ class Scheduler extends SchedulerOptionsBaseWidget { processDeleteAppointment(rawAppointment, deletingOptions) { this._processActionResult(deletingOptions, function (canceled) { if (!canceled) { - this.appointmentDataProvider + this.appointmentDataSource .remove(rawAppointment) .always((storeAppointment) => this._onDataPromiseCompleted( StoreEventNames.DELETED, @@ -2161,12 +2156,12 @@ class Scheduler extends SchedulerOptionsBaseWidget { } _validateKeyFieldIfAgendaExist() { - if (!this.appointmentDataProvider.isDataSourceInit) { + if (!this.appointmentDataSource.isDataSourceInit) { return; } const hasAgendaView = this.hasAgendaView(); - const isKeyNotExist = !this.appointmentDataProvider.keyName; + const isKeyNotExist = !this.appointmentDataSource.keyName; if (hasAgendaView && isKeyNotExist) { errors.log('W1023'); diff --git a/packages/devextreme/js/__internal/scheduler/r1/filterting/__tests__/remote.test.ts b/packages/devextreme/js/__internal/scheduler/r1/filterting/remote.test.ts similarity index 99% rename from packages/devextreme/js/__internal/scheduler/r1/filterting/__tests__/remote.test.ts rename to packages/devextreme/js/__internal/scheduler/r1/filterting/remote.test.ts index 7c8e2ca7b9e7..bfa22ce7d3a3 100644 --- a/packages/devextreme/js/__internal/scheduler/r1/filterting/__tests__/remote.test.ts +++ b/packages/devextreme/js/__internal/scheduler/r1/filterting/remote.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from '@jest/globals'; -import { combineRemoteFilter } from '../remote'; +import { combineRemoteFilter } from './remote'; describe('Remote filtering', () => { describe('combineRemoteFilter', () => { diff --git a/packages/devextreme/js/__internal/scheduler/scheduler_options_base_widget.ts b/packages/devextreme/js/__internal/scheduler/scheduler_options_base_widget.ts index 0c35abdb09a5..aea012d3de00 100644 --- a/packages/devextreme/js/__internal/scheduler/scheduler_options_base_widget.ts +++ b/packages/devextreme/js/__internal/scheduler/scheduler_options_base_widget.ts @@ -69,6 +69,7 @@ export class SchedulerOptionsBaseWidget extends Widget { // @ts-expect-error super._initMarkup(); this.updateViews(); + this.validateOptions(); } protected schedulerOptionChanged(args: { diff --git a/packages/devextreme/js/__internal/scheduler/utils/options/constants.ts b/packages/devextreme/js/__internal/scheduler/utils/options/constants.ts index 8fdcb0979027..f8b65aa9eea2 100644 --- a/packages/devextreme/js/__internal/scheduler/utils/options/constants.ts +++ b/packages/devextreme/js/__internal/scheduler/utils/options/constants.ts @@ -13,7 +13,6 @@ const DEFAULT_APPOINTMENT_COLLECTOR_TEMPLATE_NAME = 'appointmentCollector'; const DEFAULT_DROP_DOWN_APPOINTMENT_TEMPLATE_NAME = 'dropDownAppointment'; export const DEFAULT_SCHEDULER_INTERNAL_OPTIONS: SchedulerInternalOptions = { - loadedResources: [], indicatorTime: undefined, renovateRender: true, _draggingMode: 'outlook', diff --git a/packages/devextreme/js/__internal/scheduler/utils/options/types.ts b/packages/devextreme/js/__internal/scheduler/utils/options/types.ts index 5ee0dafbfd04..cb6b95d26bdc 100644 --- a/packages/devextreme/js/__internal/scheduler/utils/options/types.ts +++ b/packages/devextreme/js/__internal/scheduler/utils/options/types.ts @@ -1,8 +1,6 @@ import type { template } from '@js/common'; import type { Properties } from '@js/ui/scheduler'; -import type { ResourceLoader } from '../loader/resource_loader'; - export type RawViewType = Required['views'][number]; export type ViewType = Extract; export type ViewObject = Extract; @@ -21,7 +19,6 @@ export type AgendaView = ViewObject & Required { + async loadGroupResources(groups: string[] = [], forceReload = false): Promise { await this.load(groups, forceReload); const { groupTree, groupLeafs } = groupResources(this.resourceById, groups); @@ -48,9 +48,6 @@ export class ResourceManager { this.groups = groups; this.groupsLeafs = groupLeafs; this.groupsTree = groupTree; - - // TODO(9): Get rid of it as soon as you can. Fallback, this class has all necessary - return this.groupResources(); } public groupCount(): number { diff --git a/packages/devextreme/js/__internal/scheduler/view_model/appointment.dataProcessor.test.ts b/packages/devextreme/js/__internal/scheduler/view_model/appointment.dataProcessor.test.ts index 4e03c3863e2d..1ea3a7c6d887 100644 --- a/packages/devextreme/js/__internal/scheduler/view_model/appointment.dataProcessor.test.ts +++ b/packages/devextreme/js/__internal/scheduler/view_model/appointment.dataProcessor.test.ts @@ -34,7 +34,7 @@ describe('data processor', () => { currentDate, }); - scheduler.appointmentDataProvider.filterByDate( + scheduler.setRemoteFilter( new Date(2015, 1, 10, 10), new Date(2015, 1, 10, 13), true, @@ -82,7 +82,7 @@ describe('data processor', () => { ], ]; - scheduler.appointmentDataProvider.filterByDate( + scheduler.setRemoteFilter( new Date(2015, 1, 9, 0), new Date(2015, 1, 10, 13), true, @@ -100,8 +100,8 @@ describe('data processor', () => { const changedDataSource = new DataSource({ store: data, }); - scheduler.appointmentDataProvider.setDataSource(changedDataSource); - scheduler.appointmentDataProvider.filterByDate( + scheduler.option('dataSource', changedDataSource); + scheduler.setRemoteFilter( new Date(2015, 1, 9, 0), new Date(2015, 1, 10, 13), true, @@ -142,7 +142,7 @@ describe('data processor', () => { endDateTimeZoneExpr: 'EndDateTimeZone', }); - scheduler.appointmentDataProvider.filterByDate( + scheduler.setRemoteFilter( new Date(2015, 0, 1, 1), new Date(2015, 0, 2), ); @@ -150,7 +150,7 @@ describe('data processor', () => { dataSource.load().done(() => { dataSource.filter('priorityId', '=', 1); - scheduler.appointmentDataProvider.filterByDate( + scheduler.setRemoteFilter( new Date(2015, 0, 1, 1), new Date(2015, 0, 2), true, @@ -161,7 +161,7 @@ describe('data processor', () => { dataSource.filter(null); - scheduler.appointmentDataProvider.filterByDate( + scheduler.setRemoteFilter( new Date(2015, 0, 1, 1), new Date(2015, 0, 2), true, @@ -194,7 +194,7 @@ describe('data processor', () => { currentDate, }); - scheduler.appointmentDataProvider.filterByDate( + scheduler.setRemoteFilter( new Date(2015, 1, 9, 0), new Date(2015, 1, 10, 13), true, @@ -244,7 +244,7 @@ describe('data processor', () => { currentDate, }); - scheduler.appointmentDataProvider.filterByDate( + scheduler.setRemoteFilter( new Date(2015, 1, 10, 10), new Date(2015, 1, 10, 13), true, @@ -295,7 +295,7 @@ describe('data processor', () => { currentDate, }); - scheduler.appointmentDataProvider.filterByDate( + scheduler.setRemoteFilter( new Date(2015, 1, 10, 10), new Date(2015, 1, 10, 13), true, @@ -343,7 +343,7 @@ describe('data processor', () => { currentDate, }); - scheduler.appointmentDataProvider.filterByDate( + scheduler.setRemoteFilter( new Date(2015, 1, 10, 11, 5), new Date(2015, 1, 10, 11, 45), true, @@ -368,7 +368,7 @@ describe('data processor', () => { currentDate, }); - scheduler.appointmentDataProvider.filterByDate( + scheduler.setRemoteFilter( new Date(2015, 1, 9), new Date(2015, 1, 20), ); @@ -395,7 +395,7 @@ describe('data processor', () => { allDayExpr: 'AllDay', }); - scheduler.appointmentDataProvider.filterByDate( + scheduler.setRemoteFilter( new Date(2015, 1, 10, 12), new Date(2015, 1, 11), true, @@ -422,7 +422,7 @@ describe('data processor', () => { currentDate, }); - scheduler.appointmentDataProvider.filterByDate( + scheduler.setRemoteFilter( new Date(2015, 1, 11), new Date(2015, 1, 11, 11), true, @@ -457,7 +457,7 @@ describe('data processor', () => { recurrenceRuleExpr: '_recurrenceRule', }); - scheduler.appointmentDataProvider.filterByDate( + scheduler.setRemoteFilter( new Date(2015, 1, 10), new Date(2015, 1, 10, 13), true, @@ -491,7 +491,7 @@ describe('data processor', () => { recurrenceRuleExpr: null, }); - scheduler.appointmentDataProvider.filterByDate( + scheduler.setRemoteFilter( new Date(2015, 1, 10), new Date(2015, 1, 10, 13), true, @@ -526,7 +526,7 @@ describe('data processor', () => { recurrenceRuleExpr: '', }); - scheduler.appointmentDataProvider.filterByDate( + scheduler.setRemoteFilter( new Date(2015, 1, 10), new Date(2015, 1, 10, 13), true, @@ -554,7 +554,7 @@ describe('data processor', () => { recurrenceRuleExpr: '', }); - scheduler.appointmentDataProvider.filterByDate( + scheduler.setRemoteFilter( new Date(2015, 1, 9, 0), new Date(2015, 1, 9, 23, 59), ); @@ -592,7 +592,7 @@ describe('data processor', () => { recurrenceExceptionExpr: 'Exception', }); - scheduler.appointmentDataProvider.filterByDate( + scheduler.setRemoteFilter( new Date(2015, 0, 1, 0), new Date(2015, 0, 3), ); @@ -637,7 +637,7 @@ describe('data processor', () => { recurrenceExceptionExpr: 'Exception', }); - scheduler.appointmentDataProvider.filterByDate( + scheduler.setRemoteFilter( new Date(2015, 0, 1, 0), new Date(2015, 0, 3), true, @@ -649,7 +649,7 @@ describe('data processor', () => { existingFilter[1] = newUserFilter; dataSource.filter(existingFilter); - scheduler.appointmentDataProvider.filterByDate( + scheduler.setRemoteFilter( new Date(2014, 11, 29, 0), new Date(2014, 11, 30), true, @@ -678,9 +678,9 @@ describe('data processor', () => { recurrenceExceptionExpr: 'Exception', }); - scheduler.appointmentDataProvider.add({ text: 'a', StartDate: new Date(2015, 0, 1, 1).toString(), EndDate: new Date(2015, 0, 1, 2).toString() }); - scheduler.appointmentDataProvider.add({ text: 'b', StartDate: new Date(2015, 0, 1, 3, 30).toString(), EndDate: new Date(2015, 0, 1, 6, 0).toString() }); - scheduler.appointmentDataProvider.add({ text: 'c', StartDate: new Date(2015, 0, 1, 8).toString(), EndDate: new Date(2015, 0, 1, 9).toString() }); + scheduler.appointmentDataSource.add({ text: 'a', StartDate: new Date(2015, 0, 1, 1).toString(), EndDate: new Date(2015, 0, 1, 2).toString() }); + scheduler.appointmentDataSource.add({ text: 'b', StartDate: new Date(2015, 0, 1, 3, 30).toString(), EndDate: new Date(2015, 0, 1, 6, 0).toString() }); + scheduler.appointmentDataSource.add({ text: 'c', StartDate: new Date(2015, 0, 1, 8).toString(), EndDate: new Date(2015, 0, 1, 9).toString() }); scheduler.repaint(); const appts = scheduler._layoutManager.filteredItems; @@ -703,8 +703,8 @@ describe('data processor', () => { recurrenceExceptionExpr: 'Exception', }); - scheduler.appointmentDataProvider.add({ text: 'a', StartDate: new Date(2015, 0, 1, 1).toString(), EndDate: new Date(2015, 0, 1, 3).toString() }); - scheduler.appointmentDataProvider.add({ text: 'b', StartDate: new Date(2015, 0, 1, 3, 45).toString(), EndDate: new Date(2015, 0, 1, 3, 50).toString() }); + scheduler.appointmentDataSource.add({ text: 'a', StartDate: new Date(2015, 0, 1, 1).toString(), EndDate: new Date(2015, 0, 1, 3).toString() }); + scheduler.appointmentDataSource.add({ text: 'b', StartDate: new Date(2015, 0, 1, 3, 45).toString(), EndDate: new Date(2015, 0, 1, 3, 50).toString() }); scheduler.repaint(); const appts = scheduler._layoutManager.filteredItems; @@ -728,9 +728,9 @@ describe('data processor', () => { recurrenceExceptionExpr: 'Exception', }); - scheduler.appointmentDataProvider.add({ text: 'a', StartDate: new Date(2015, 0, 1, 3).toString(), EndDate: new Date(2015, 0, 1, 3, 10).toString() }); - scheduler.appointmentDataProvider.add({ text: 'b', StartDate: new Date(2015, 0, 1, 3, 40).toString(), EndDate: new Date(2015, 0, 1, 7, 20).toString() }); - scheduler.appointmentDataProvider.add({ text: 'c', StartDate: new Date(2015, 0, 1, 7, 35).toString(), EndDate: new Date(2015, 0, 1, 9).toString() }); + scheduler.appointmentDataSource.add({ text: 'a', StartDate: new Date(2015, 0, 1, 3).toString(), EndDate: new Date(2015, 0, 1, 3, 10).toString() }); + scheduler.appointmentDataSource.add({ text: 'b', StartDate: new Date(2015, 0, 1, 3, 40).toString(), EndDate: new Date(2015, 0, 1, 7, 20).toString() }); + scheduler.appointmentDataSource.add({ text: 'c', StartDate: new Date(2015, 0, 1, 7, 35).toString(), EndDate: new Date(2015, 0, 1, 9).toString() }); scheduler.repaint(); const appts = scheduler._layoutManager.filteredItems; @@ -753,13 +753,13 @@ describe('data processor', () => { recurrenceExceptionExpr: 'RecException', }); - scheduler.appointmentDataProvider.add({ text: 'a', StartDate: new Date(2015, 0, 1, 1).toString(), EndDate: new Date(2015, 0, 1, 2).toString() }); - scheduler.appointmentDataProvider.add({ text: 'b', StartDate: new Date(2015, 0, 1, 3, 30).toString(), EndDate: new Date(2015, 0, 1, 6).toString() }); - scheduler.appointmentDataProvider.add({ text: 'c', StartDate: new Date(2015, 0, 1, 8).toString(), EndDate: new Date(2015, 0, 1, 9).toString() }); - scheduler.appointmentDataProvider.add({ + scheduler.appointmentDataSource.add({ text: 'a', StartDate: new Date(2015, 0, 1, 1).toString(), EndDate: new Date(2015, 0, 1, 2).toString() }); + scheduler.appointmentDataSource.add({ text: 'b', StartDate: new Date(2015, 0, 1, 3, 30).toString(), EndDate: new Date(2015, 0, 1, 6).toString() }); + scheduler.appointmentDataSource.add({ text: 'c', StartDate: new Date(2015, 0, 1, 8).toString(), EndDate: new Date(2015, 0, 1, 9).toString() }); + scheduler.appointmentDataSource.add({ text: 'd', StartDate: new Date(2014, 11, 31).toString(), EndDate: new Date(2015, 11, 31, 4).toString(), RecRule: 'FREQ=WEEKLY;BYDAY=WE', }); - scheduler.appointmentDataProvider.add({ + scheduler.appointmentDataSource.add({ text: 'e', StartDate: new Date(2015, 11, 27).toString(), EndDate: new Date(2015, 11, 27, 4).toString(), RecRule: 'FREQ=WEEKLY,BYDAY=TH', }); @@ -789,10 +789,10 @@ describe('data processor', () => { recurrenceExceptionExpr: 'RecException', }); - scheduler.appointmentDataProvider.add({ + scheduler.appointmentDataSource.add({ text: 'a', StartDate: new Date(2015, 0, 5, 2, 0).toString(), EndDate: new Date(2015, 0, 5, 4, 0).toString(), RecRule: 'FREQ=WEEKLY;BYDAY=MO', }); - scheduler.appointmentDataProvider.add({ + scheduler.appointmentDataSource.add({ text: 'b', StartDate: new Date(2015, 0, 5, 6, 0).toString(), EndDate: new Date(2015, 0, 5, 8, 0).toString(), RecRule: 'FREQ=WEEKLY;BYDAY=MO', }); @@ -824,10 +824,10 @@ describe('data processor', () => { recurrenceExceptionExpr: 'RecException', }); - scheduler.appointmentDataProvider.add({ + scheduler.appointmentDataSource.add({ text: 'a', StartDate: new Date(2015, 0, 5, 2, 0).toString(), EndDate: new Date(2015, 0, 5, 4, 0).toString(), RecRule: 'FREQ=WEEKLY;BYDAY=MO', }); - scheduler.appointmentDataProvider.add({ + scheduler.appointmentDataSource.add({ text: 'b', StartDate: new Date(2015, 0, 5, 6, 0).toString(), EndDate: new Date(2015, 0, 5, 8, 0).toString(), RecRule: 'FREQ=WEEKLY;BYDAY=MO', }); @@ -870,16 +870,16 @@ describe('data processor', () => { ], }); - scheduler.appointmentDataProvider.add({ + scheduler.appointmentDataSource.add({ text: 'a', StartDate: new Date(2015, 2, 16, 2), EndDate: new Date(2015, 2, 16, 2, 30), ownerId: [1, 2], }); - scheduler.appointmentDataProvider.add({ + scheduler.appointmentDataSource.add({ text: 'b', StartDate: new Date(2015, 2, 16, 2), EndDate: new Date(2015, 2, 16, 2, 30), ownerId: 1, roomId: [1, 2], managerId: 4, }); - scheduler.appointmentDataProvider.add({ + scheduler.appointmentDataSource.add({ text: 'c', StartDate: new Date(2015, 2, 16, 2), EndDate: new Date(2015, 2, 16, 2, 30), ownerId: 3, roomId: [1, 2], }); - scheduler.appointmentDataProvider.add({ + scheduler.appointmentDataSource.add({ text: 'd', StartDate: new Date(2015, 2, 16, 2), EndDate: new Date(2015, 2, 16, 2, 30), ownerId: 1, roomId: [1, 2, 3], }); @@ -912,14 +912,14 @@ describe('data processor', () => { recurrenceExceptionExpr: 'Exception', }); - scheduler.appointmentDataProvider.add({ + scheduler.appointmentDataSource.add({ text: 'a', StartDate: new Date(2015, 0, 1, 4).toString(), EndDate: new Date(2015, 0, 1, 6).toString(), AllDay: true, }); - scheduler.appointmentDataProvider.add({ + scheduler.appointmentDataSource.add({ text: 'b', StartDate: new Date(2015, 0, 1, 3, 30).toString(), EndDate: new Date(2015, 0, 1, 6).toString(), AllDay: false, }); - scheduler.appointmentDataProvider.add({ text: 'c', StartDate: new Date(2015, 0, 1, 8).toString(), EndDate: new Date(2015, 0, 1, 9).toString() }); - scheduler.appointmentDataProvider.add({ text: 'd', StartDate: new Date(2015, 0, 1, 4).toString(), EndDate: new Date(2015, 0, 3, 6).toString() }); + scheduler.appointmentDataSource.add({ text: 'c', StartDate: new Date(2015, 0, 1, 8).toString(), EndDate: new Date(2015, 0, 1, 9).toString() }); + scheduler.appointmentDataSource.add({ text: 'd', StartDate: new Date(2015, 0, 1, 4).toString(), EndDate: new Date(2015, 0, 3, 6).toString() }); scheduler.repaint(); const appts = scheduler._layoutManager.filteredItems; @@ -944,7 +944,7 @@ describe('data processor', () => { recurrenceExceptionExpr: 'Exception', }); - scheduler.appointmentDataProvider.add({ + scheduler.appointmentDataSource.add({ text: 'a', StartDate: new Date(2015, 0, 1).toString(), EndDate: new Date(2015, 0, 2).toString(), AllDay: true, RecurrenceRule: 'FREQ=DAILY', }); @@ -977,7 +977,7 @@ describe('data processor', () => { recurrenceExceptionExpr: 'Exception', }); - scheduler.appointmentDataProvider.add({ + scheduler.appointmentDataSource.add({ text: 'a', StartDate: new Date(2015, 0, 1).toString(), EndDate: new Date(2015, 0, 2).toString(), @@ -1008,7 +1008,7 @@ describe('data processor', () => { recurrenceExceptionExpr: 'Exception', }); - scheduler.appointmentDataProvider.add({ + scheduler.appointmentDataSource.add({ text: 'a', startDate: new Date(2020, 6, 16, 0), endDate: new Date(2020, 6, 16, 1), @@ -1035,7 +1035,7 @@ describe('data processor', () => { recurrenceExceptionExpr: 'Exception', }); - scheduler.appointmentDataProvider.add({ + scheduler.appointmentDataSource.add({ text: 'a', StartDate: new Date(2015, 2, 1, 10, 30), EndDate: new Date(2015, 2, 2, 5, 0), @@ -1062,7 +1062,7 @@ describe('data processor', () => { recurrenceExceptionExpr: 'Exception', }); - scheduler.appointmentDataProvider.add({ + scheduler.appointmentDataSource.add({ text: 'a', StartDate: new Date(2015, 2, 1, 7, 0), EndDate: new Date(2015, 2, 2, 0, 30), @@ -1089,7 +1089,7 @@ describe('data processor', () => { recurrenceExceptionExpr: 'Exception', }); - scheduler.appointmentDataProvider.add({ + scheduler.appointmentDataSource.add({ text: 'a', StartDate: new Date(2015, 2, 1, 11, 0), EndDate: new Date(2015, 2, 2, 1, 0), @@ -1117,7 +1117,7 @@ describe('data processor', () => { cellDuration: 60, }); - scheduler.appointmentDataProvider.add({ + scheduler.appointmentDataSource.add({ text: 'a', StartDate: new Date(2015, 2, 1, 11, 0), EndDate: new Date(2015, 2, 1, 1, 0), @@ -1168,7 +1168,7 @@ describe('data processor', () => { cellDuration: 60, }); - scheduler.appointmentDataProvider.add(item); + scheduler.appointmentDataSource.add(item); const result = scheduler._layoutManager.hasAllDayAppointments(); @@ -1205,7 +1205,7 @@ describe('data processor', () => { recurrenceExceptionExpr: 'Exception', }); - scheduler.appointmentDataProvider.filterByDate( + scheduler.setRemoteFilter( new Date(2021, 8, 6, 9), new Date(2021, 8, 6, 12), ); diff --git a/packages/devextreme/js/__internal/scheduler/view_model/filtering/m_appointment_filter.ts b/packages/devextreme/js/__internal/scheduler/view_model/filtering/m_appointment_filter.ts index bbcf5cd1540c..be84e84590a4 100644 --- a/packages/devextreme/js/__internal/scheduler/view_model/filtering/m_appointment_filter.ts +++ b/packages/devextreme/js/__internal/scheduler/view_model/filtering/m_appointment_filter.ts @@ -40,8 +40,6 @@ export class AppointmentFilterBaseStrategy { get showAllDayPanel() { return this._resolveOption('showAllDayPanel'); } - get loadedResources() { return this.options.getResourceManager().groupResources(); } - get supportAllDayRow() { return this._resolveOption('supportAllDayRow'); } get viewType() { return this._resolveOption('viewType'); } @@ -92,7 +90,7 @@ export class AppointmentFilterBaseStrategy { return { ...compareOptions, ...this.getIntervals(compareOptions), - resources: this.loadedResources, + resources: this.options.getResourceManager().groupResources(), firstDayOfWeek: this.firstDayOfWeek, allDayPanelFilter, allDayPanelMode: this.allDayPanelMode, diff --git a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/data_provider/m_appointment_data_provider.ts b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/data_provider/m_appointment_data_provider.ts deleted file mode 100644 index e136734fa3f9..000000000000 --- a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/data_provider/m_appointment_data_provider.ts +++ /dev/null @@ -1,85 +0,0 @@ -import config from '@js/core/config'; - -import { combineRemoteFilter } from '../../../r1/filterting/index'; -import type { AppointmentDataAccessor } from '../../../utils/data_accessor/appointment_data_accessor'; -import { AppointmentDataSource } from './m_appointment_data_source'; - -export class AppointmentDataProvider { - options: any; - - dataSource: any; - - dataAccessors: AppointmentDataAccessor; - - timeZoneCalculator: any; - - appointmentDataSource: AppointmentDataSource; - - constructor(options) { - this.options = options; - this.dataSource = this.options.dataSource; - this.dataAccessors = this.options.dataAccessors; - this.timeZoneCalculator = this.options.timeZoneCalculator; - - this.appointmentDataSource = new AppointmentDataSource(this.dataSource); - } - - get keyName() { - return this.appointmentDataSource.keyName; - } - - get isDataSourceInit() { - return !!this.dataSource; - } - - setDataSource(dataSource): void { - this.dataSource = dataSource; - this.appointmentDataSource.setDataSource(this.dataSource); - } - - updateDataAccessors(dataAccessors): void { - this.dataAccessors = dataAccessors; - } - - // TODO rename to the setRemoteFilter - filterByDate(min, max, remoteFiltering = false, dateSerializationFormat?) { - if (!this.dataSource || !remoteFiltering) { - return; - } - - const dataSourceFilter = this.dataSource.filter(); - const filter = combineRemoteFilter({ - dataSourceFilter, - dataAccessors: this.dataAccessors, - min, - max, - dateSerializationFormat, - forceIsoDateParsing: config().forceIsoDateParsing, - }); - - this.dataSource.filter(filter); - } - - // Appointment data source mappings - cleanState() { this.appointmentDataSource.cleanState(); } - - getUpdatedAppointment() { return this.appointmentDataSource._updatedAppointment; } - - getUpdatedAppointmentKeys() { return this.appointmentDataSource._updatedAppointmentKeys; } - - add(rawAppointment) { - return this.appointmentDataSource.add(rawAppointment); - } - - update(target, rawAppointment) { - return this.appointmentDataSource.update(target, rawAppointment); - } - - remove(rawAppointment) { - return this.appointmentDataSource.remove(rawAppointment); - } - - destroy() { - this.appointmentDataSource.destroy(); - } -} diff --git a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/data_provider/m_appointment_data_source.ts b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/data_provider/m_appointment_data_source.ts index fa131fd58b47..940a04260778 100644 --- a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/data_provider/m_appointment_data_source.ts +++ b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/data_provider/m_appointment_data_source.ts @@ -6,53 +6,53 @@ const STORE_EVENTS = { }; export class AppointmentDataSource { - _updatedAppointmentKeys: any[]; + protected updatedAppointmentKeys: any[]; - _dataSource: any; + protected dataSource: any; - _updatedAppointment: any; + protected updatedAppointment: any; constructor(dataSource) { this.setDataSource(dataSource); - this._updatedAppointmentKeys = []; + this.updatedAppointmentKeys = []; } get keyName() { - const store = this._dataSource.store(); + const store = this.dataSource.store(); return store.key(); } get isDataSourceInit() { - return !!this._dataSource; + return !!this.dataSource; } _getStoreKey(target) { - const store = this._dataSource.store(); + const store = this.dataSource.store(); return store.keyOf(target); } setDataSource(dataSource) { - this._dataSource = dataSource; + this.dataSource = dataSource; this.cleanState(); this._initStoreChangeHandlers(); } _initStoreChangeHandlers() { - const dataSource = this._dataSource; + const { dataSource } = this; const store = dataSource?.store(); if (store) { store.on(STORE_EVENTS.updating, (key) => { const keyName = store.key(); if (keyName) { - this._updatedAppointmentKeys.push({ + this.updatedAppointmentKeys.push({ key: keyName, value: key, }); } else { - this._updatedAppointment = key; + this.updatedAppointment = key; } }); @@ -64,7 +64,7 @@ export class AppointmentDataSource { const itemExists = items.filter((item) => item[keyName] === pushItem.key).length !== 0; if (itemExists) { - this._updatedAppointmentKeys.push({ + this.updatedAppointmentKeys.push({ key: keyName, value: pushItem.key, }); @@ -80,20 +80,20 @@ export class AppointmentDataSource { } getUpdatedAppointment() { - return this._updatedAppointment; + return this.updatedAppointment; } getUpdatedAppointmentKeys() { - return this._updatedAppointmentKeys; + return this.updatedAppointmentKeys; } cleanState() { - this._updatedAppointment = null; - this._updatedAppointmentKeys = []; + this.updatedAppointment = null; + this.updatedAppointmentKeys = []; } add(rawAppointment) { - return this._dataSource.store().insert(rawAppointment).done(() => this._dataSource.load()); + return this.dataSource.store().insert(rawAppointment).done(() => this.dataSource.load()); } update(target, data) { @@ -101,8 +101,8 @@ export class AppointmentDataSource { // @ts-expect-error const d = new Deferred(); - this._dataSource.store().update(key, data) - .done((result) => this._dataSource.load() + this.dataSource.store().update(key, data) + .done((result) => this.dataSource.load() .done(() => d.resolve(result)) .fail(d.reject)) .fail(d.reject); @@ -112,11 +112,11 @@ export class AppointmentDataSource { remove(rawAppointment) { const key = this._getStoreKey(rawAppointment); - return this._dataSource.store().remove(key).done(() => this._dataSource.load()); + return this.dataSource.store().remove(key).done(() => this.dataSource.load()); } destroy() { - const store = this._dataSource?.store(); + const store = this.dataSource?.store(); if (store) { store.off(STORE_EVENTS.updating); diff --git a/packages/devextreme/js/__internal/scheduler/view_model/m_appointments_layout_manager.ts b/packages/devextreme/js/__internal/scheduler/view_model/m_appointments_layout_manager.ts index c788d4f6a312..a1eb4e8173de 100644 --- a/packages/devextreme/js/__internal/scheduler/view_model/m_appointments_layout_manager.ts +++ b/packages/devextreme/js/__internal/scheduler/view_model/m_appointments_layout_manager.ts @@ -93,7 +93,6 @@ class AppointmentLayoutManager { ); return { resources: this.instance.option('resources'), - loadedResources: this.instance.option('loadedResources'), getResourceManager: (): ResourceManager => this.instance.resourceManager, getAppointmentColor: this.instance.createGetAppointmentColor(), dataAccessors: this.instance._dataAccessors, diff --git a/packages/devextreme/js/__internal/scheduler/workspaces/m_agenda.ts b/packages/devextreme/js/__internal/scheduler/workspaces/m_agenda.ts index 491be82ee06f..24b14912597e 100644 --- a/packages/devextreme/js/__internal/scheduler/workspaces/m_agenda.ts +++ b/packages/devextreme/js/__internal/scheduler/workspaces/m_agenda.ts @@ -51,8 +51,6 @@ class SchedulerAgenda extends WorkSpace { get renderingStrategy() { return (this.invoke as any)('getLayoutManager').getRenderingStrategyInstance(); } - get appointmentDataProvider() { return (this.option('getAppointmentDataProvider') as any)(); } - getStartViewDate() { return this._startViewDate; } diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/agenda.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/agenda.tests.js index f267c419505e..56fe791e38fc 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/agenda.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/agenda.tests.js @@ -1,7 +1,6 @@ import $ from 'jquery'; import SchedulerAgenda from '__internal/scheduler/workspaces/m_agenda'; import dateLocalization from 'common/core/localization/date'; -import { AppointmentDataProvider } from '__internal/scheduler/view_model/generate_view_model/data_provider/m_appointment_data_provider'; import { getEmptyResourceManager } from '../../helpers/scheduler/mockResourceManager.js'; @@ -31,8 +30,6 @@ module('Agenda', {}, () => { rows.push(singleGroup); } - const resources = options && options.groups || []; - const config = { onContentReady: e => { e.component.onDataSourceChanged(rows); @@ -48,11 +45,6 @@ module('Agenda', {}, () => { } } }, - getAppointmentDataProvider: () => new AppointmentDataProvider({ - getIsVirtualScrolling: () => false, - dataAccessors: {}, - resources, - }), getResourceManager: getEmptyResourceManager, }; diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.tests.js index 785fd2027ac3..d83c82850b17 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.tests.js @@ -21,7 +21,6 @@ import Resizable from 'ui/resizable'; import fx from 'common/core/animation/fx'; import { DataSource } from 'common/data/data_source/data_source'; import { Deferred } from 'core/utils/deferred'; -import { AppointmentDataProvider } from '__internal/scheduler/view_model/generate_view_model/data_provider/m_appointment_data_provider'; import { createTimeZoneCalculator } from '__internal/scheduler/r1/timezone_calculator/index.js'; QUnit.testStart(function() { @@ -101,8 +100,9 @@ const createInstance = (options, subscribesConfig) => { getResourceManager: getEmptyResourceManager, getAppointmentColor: () => new Deferred(), dataAccessors, - getAppointmentDataProvider: () => new AppointmentDataProvider({ - getIsVirtualScrolling: () => false + getAppointmentDataSource: () => ({ + getUpdatedAppointment: () => false, + getUpdatedAppointmentKeys: () => [], }) }).dxSchedulerAppointments('instance'); @@ -467,9 +467,6 @@ QUnit.module('Appointments', moduleOptions, () => { QUnit.test('Delta time for resizable appointment should decreased correctly in vertical strategy', async function(assert) { const strategy = new VerticalAppointmentsStrategy({ - appointmentDataProvider: { - appointmentTakesAllDay: commonUtils.noop, - }, dataAccessors: mockDataAccessor, allDayPanelMode: 'all', cellDurationInMinutes: 30, diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.verticalStrategy.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.verticalStrategy.tests.js index 3095dac93ee7..42fd97433035 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.verticalStrategy.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointments.verticalStrategy.tests.js @@ -40,7 +40,7 @@ const createInstance = (options) => { getLoadedResources: () => [], getResourceManager: getEmptyResourceManager, getAppointmentColor: () => new Deferred(), - getAppointmentDataProvider: () => ({ + getAppointmentDataSource: () => ({ getUpdatedAppointment: () => false, getUpdatedAppointmentKeys: () => [], }), diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/common.initialization.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/common.initialization.tests.js index 7963b6b9b478..3b88ee13e200 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/common.initialization.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/common.initialization.tests.js @@ -4,10 +4,10 @@ import { CustomStore } from 'common/data/custom_store'; import { triggerHidingEvent, triggerShownEvent } from 'common/core/events/visibility_change'; import { isFunction } from 'core/utils/type'; import $ from 'jquery'; -import { AppointmentDataProvider } from '__internal/scheduler/view_model/generate_view_model/data_provider/m_appointment_data_provider'; +import { AppointmentDataSource } from '__internal/scheduler/view_model/generate_view_model/data_provider/m_appointment_data_source'; import { createWrapper, initTestMarkup, SchedulerTestWrapper } from '../../helpers/scheduler/helpers.js'; -import { waitAsync, waitForAsync, waitGlobalFailure } from '../../helpers/scheduler/waitForAsync.js'; +import { waitForAsync, waitGlobalFailure } from '../../helpers/scheduler/waitForAsync.js'; QUnit.testStart(() => initTestMarkup()); @@ -38,8 +38,8 @@ QUnit.module('Initialization', { const { instance } = await createWrapper({ dataSource: data }); - assert.ok(instance.appointmentDataProvider instanceof AppointmentDataProvider, 'Task model is initialized on scheduler init'); - assert.ok(instance.appointmentDataProvider.dataSource instanceof DataSource, 'Task model has data source instance'); + assert.ok(instance.appointmentDataSource instanceof AppointmentDataSource, 'Task model is initialized on scheduler init'); + assert.ok(instance.appointmentDataSource.dataSource instanceof DataSource, 'Task model has data source instance'); }); QUnit.test('Scheduler should work correctly when wrong timeZone was set', async function(assert) { @@ -50,7 +50,7 @@ QUnit.module('Initialization', { QUnit.test('Scheduler shouldn\'t have paginate in default DataSource', async function(assert) { const { instance } = await createWrapper({ dataSource: this.tasks }); - assert.notOk(instance.appointmentDataProvider.dataSource.paginate(), 'Paginate is false'); + assert.notOk(instance.appointmentDataSource.dataSource.paginate(), 'Paginate is false'); }); QUnit.test('Rendering inside invisible element', async function(assert) { diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/common.markup.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/common.markup.tests.js index 44f03178df0f..ca0f8d2b66cf 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/common.markup.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/common.markup.tests.js @@ -2,7 +2,7 @@ import fx from 'common/core/animation/fx'; import dxScheduler from '__internal/scheduler/m_scheduler'; import { DataSource } from 'common/data/data_source/data_source'; import dateUtils from 'core/utils/date'; -import { AppointmentDataProvider } from '__internal/scheduler/view_model/generate_view_model/data_provider/m_appointment_data_provider'; +import { AppointmentDataSource } from '__internal/scheduler/view_model/generate_view_model/data_provider/m_appointment_data_source'; import { createWrapper, initTestMarkup } from '../../helpers/scheduler/helpers.js'; import { waitAsync } from '../../helpers/scheduler/waitForAsync.js'; @@ -66,8 +66,8 @@ QUnit.module('Scheduler markup', moduleConfig, () => { currentDate: new Date(2015, 1, 9) }); - assert.ok(instance.appointmentDataProvider instanceof AppointmentDataProvider, 'Task model is initialized on scheduler init'); - assert.ok(instance.appointmentDataProvider.dataSource instanceof DataSource, 'Task model has data source instance'); + assert.ok(instance.appointmentDataSource instanceof AppointmentDataSource, 'Task model is initialized on scheduler init'); + assert.ok(instance.appointmentDataSource.dataSource instanceof DataSource, 'Task model has data source instance'); }); QUnit.test('Scheduler should not fail when dataSource is set, timelineView', async function(assert) { @@ -82,8 +82,8 @@ QUnit.module('Scheduler markup', moduleConfig, () => { currentDate: new Date(2015, 1, 9) }); - assert.ok(instance.appointmentDataProvider instanceof AppointmentDataProvider, 'Task model is initialized on scheduler init'); - assert.ok(instance.appointmentDataProvider.dataSource instanceof DataSource, 'Task model has data source instance'); + assert.ok(instance.appointmentDataSource instanceof AppointmentDataSource, 'Task model is initialized on scheduler init'); + assert.ok(instance.appointmentDataSource.dataSource instanceof DataSource, 'Task model has data source instance'); }); QUnit.test('Scheduler should not fail when dataSource is set, timelineWeek', async function(assert) { @@ -98,8 +98,8 @@ QUnit.module('Scheduler markup', moduleConfig, () => { currentDate: new Date(2015, 1, 9) }); - assert.ok(instance.appointmentDataProvider instanceof AppointmentDataProvider, 'Task model is initialized on scheduler init'); - assert.ok(instance.appointmentDataProvider.dataSource instanceof DataSource, 'Task model has data source instance'); + assert.ok(instance.appointmentDataSource instanceof AppointmentDataSource, 'Task model is initialized on scheduler init'); + assert.ok(instance.appointmentDataSource.dataSource instanceof DataSource, 'Task model has data source instance'); }); QUnit.test('Scheduler should not fail when dataSource is set, agenda', async function(assert) { @@ -114,8 +114,8 @@ QUnit.module('Scheduler markup', moduleConfig, () => { currentDate: new Date(2015, 1, 9) }); - assert.ok(instance.appointmentDataProvider instanceof AppointmentDataProvider, 'Task model is initialized on scheduler init'); - assert.ok(instance.appointmentDataProvider.dataSource instanceof DataSource, 'Task model has data source instance'); + assert.ok(instance.appointmentDataSource instanceof AppointmentDataSource, 'Task model is initialized on scheduler init'); + assert.ok(instance.appointmentDataSource.dataSource instanceof DataSource, 'Task model has data source instance'); }); QUnit.test('Header & work space currentDate should not contain information about hours, minutes, seconds', async function(assert) { diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/common.options.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/common.options.tests.js index cced300c92fa..9fe6bc112639 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/common.options.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/common.options.tests.js @@ -91,36 +91,6 @@ QUnit.module('Options', () => { } }); - QUnit.test('Data expressions should be recompiled on optionChanged and passed to appointmentDataProvider', async function(assert) { - const { instance } = await createWrapper(); - const repaintStub = sinon.stub(instance, 'repaint'); - - try { - const { appointmentDataProvider } = instance; - - instance.option({ - 'startDateExpr': '_startDate', - 'endDateExpr': '_endDate', - 'startDateTimeZoneExpr': '_startDateTimeZone', - 'endDateTimeZoneExpr': '_endDateTimeZone', - 'textExpr': '_text', - 'descriptionExpr': '_description', - 'allDayExpr': '_allDay', - 'recurrenceRuleExpr': '_recurrenceRule', - 'recurrenceExceptionExpr': '_recurrenceException' - }); - - const dataAccessors = instance._dataAccessors; - - assert.deepEqual(dataAccessors.getter, appointmentDataProvider.dataAccessors.getter, 'dataAccessors getters were passed to appointmentDataProvider'); - assert.deepEqual(dataAccessors.setter, appointmentDataProvider.dataAccessors.setter, 'dataAccessors setters were passed to appointmentDataProvider'); - assert.deepEqual(dataAccessors.expr, appointmentDataProvider.dataAccessors.expr, 'dataExpressions were passed to appointmentDataProvider'); - assert.deepEqual(dataAccessors.resources, appointmentDataProvider.dataAccessors.resources, 'resources were passed to appointmentDataProvider'); - } finally { - repaintStub.restore(); - } - }); - QUnit.test('Appointment should be rendered correctly after expression changing', async function(assert) { const scheduler = await createWrapper({ dataSource: [{ diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.dateNavigator.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.dateNavigator.tests.js index 115bf5836c53..a3ea621c8c21 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.dateNavigator.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.dateNavigator.tests.js @@ -381,13 +381,13 @@ QUnit.module('Integration: Date navigator', moduleConfig, function() { QUnit.test('Tasks should be rerendered after click on next/prev button', async function(assert) { await this.createInstance({ currentDate: new Date(2015, 1, 24) }); - const spy = sinon.spy(this.instance.appointmentDataProvider, 'filterByDate'); + const spy = sinon.spy(this.instance, '_filterAppointmentsByDate'); try { $(this.instance.$element()).find('.dx-scheduler-navigator-previous').trigger('dxclick'); assert.ok(spy.calledOnce, 'filterByDate is called'); } finally { - this.instance.appointmentDataProvider.filterByDate.restore(); + this.instance._filterAppointmentsByDate.restore(); } }); diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.workSpace.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.workSpace.tests.js index 8fa618099c01..b8a630674775 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.workSpace.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/integration.workSpace.tests.js @@ -1231,52 +1231,6 @@ module('Integration: Work space', { ...moduleConfig }, () => { }); }); - test('"onOptionChanged" should not be called on scroll when virtual scrolling is enabled', async function(assert) { - const done = assert.async(); - let onOptionChangedCalls = 0; - const scheduler = await createWrapper({ - dataSource: [], - views: ['week'], - currentView: 'week', - showAllDayPanel: true, - currentDate: new Date(2020, 8, 21), - height: 300, - scrolling: { mode: 'virtual', orientation: 'both' }, - onOptionChanged: ({ name }) => { - if(name !== 'loadedResources') { - onOptionChangedCalls += 1; - } - }, - }); - scheduler.instance.getWorkSpace().renderer.getRenderTimeout = () => -1; - - const $cells = scheduler.workSpace.getCells(); - const $table = scheduler.workSpace.getDateTable(); - - const onOptionChangedSpy = sinon.spy(); - - scheduler.onOptionChanged = onOptionChangedSpy; - - $($table).trigger( - $.Event('dxpointerdown', { target: $cells.eq(0).get(0), which: 1, pointerType: 'mouse' }), - ); - - assert.equal(onOptionChangedCalls, 1, '"onOptionChanged" was triggered because selected cells have been changed'); - - const dateTableScrollable = scheduler.workSpace.getDateTableScrollable().dxScrollable('instance'); - - dateTableScrollable.scrollTo({ y: 400 }); - - setTimeout(() => { - assert.equal( - onOptionChangedCalls, 1, - '"onOptionChanged" was not triggered again because selected cells have not been changed', - ); - done(); - }); - - }); - isDesktopEnvironment() && test('Appointment popup should be opened with correct parameters if virtual scrolling is enabled', async function(assert) { const done = assert.async(); const scheduler = await createWrapper({ From 729923afa029039dbf7b043c4b9b5e552607a9cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marker=20dao=20=C2=AE?= Date: Tue, 19 Aug 2025 09:48:22 +0200 Subject: [PATCH 019/101] DropDownEditor: Add fieldAddons to .d.ts (#30723) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: marker dao ® --- .../src/ui/color-box/index.ts | 29 ++++++- .../src/ui/color-box/nested/field-addons.ts | 83 +++++++++++++++++++ .../src/ui/color-box/nested/index.ts | 1 + .../src/ui/drop-down-box/index.ts | 29 ++++++- .../ui/drop-down-box/nested/field-addons.ts | 83 +++++++++++++++++++ .../src/ui/drop-down-box/nested/index.ts | 1 + .../src/ui/nested/base/field-addons.ts | 26 ++++++ .../src/ui/nested/base/index.ts | 1 + .../src/ui/nested/field-addons.ts | 71 ++++++++++++++++ .../devextreme-angular/src/ui/nested/index.ts | 1 + .../src/ui/select-box/index.ts | 29 ++++++- .../src/ui/select-box/nested/field-addons.ts | 83 +++++++++++++++++++ .../src/ui/select-box/nested/index.ts | 1 + .../src/ui/tag-box/index.ts | 29 ++++++- .../src/ui/tag-box/nested/field-addons.ts | 83 +++++++++++++++++++ .../src/ui/tag-box/nested/index.ts | 1 + packages/devextreme-react/src/color-box.ts | 37 ++++++++- .../devextreme-react/src/drop-down-box.ts | 37 ++++++++- packages/devextreme-react/src/select-box.ts | 35 ++++++++ packages/devextreme-react/src/tag-box.ts | 35 ++++++++ packages/devextreme-vue/src/color-box.ts | 27 +++++- packages/devextreme-vue/src/drop-down-box.ts | 27 +++++- packages/devextreme-vue/src/select-box.ts | 25 ++++++ packages/devextreme-vue/src/tag-box.ts | 25 ++++++ .../ui/drop_down_editor/m_drop_down_editor.ts | 22 ++++- .../devextreme/js/__internal/ui/m_lookup.ts | 1 - packages/devextreme/js/ui/date_box.d.ts | 5 +- packages/devextreme/js/ui/date_box.js | 5 ++ packages/devextreme/js/ui/date_range_box.js | 4 + .../drop_down_editor/ui.drop_down_editor.d.ts | 27 ++++++ .../drop_down_editor/ui.drop_down_list.d.ts | 5 +- .../ui/drop_down_editor/ui.drop_down_list.js | 5 ++ packages/devextreme/js/ui/select_box.d.ts | 7 ++ packages/devextreme/ts/dx.all.d.ts | 36 +++++++- 34 files changed, 900 insertions(+), 16 deletions(-) create mode 100644 packages/devextreme-angular/src/ui/color-box/nested/field-addons.ts create mode 100644 packages/devextreme-angular/src/ui/drop-down-box/nested/field-addons.ts create mode 100644 packages/devextreme-angular/src/ui/nested/base/field-addons.ts create mode 100644 packages/devextreme-angular/src/ui/nested/field-addons.ts create mode 100644 packages/devextreme-angular/src/ui/select-box/nested/field-addons.ts create mode 100644 packages/devextreme-angular/src/ui/tag-box/nested/field-addons.ts diff --git a/packages/devextreme-angular/src/ui/color-box/index.ts b/packages/devextreme-angular/src/ui/color-box/index.ts index e101e12ffd25..50e6b603b932 100644 --- a/packages/devextreme-angular/src/ui/color-box/index.ts +++ b/packages/devextreme-angular/src/ui/color-box/index.ts @@ -25,7 +25,7 @@ import { import { ApplyValueMode, TextEditorButton, LabelMode, EditorStyle, ValidationMessageMode, Mode, Position, ValidationStatus } from 'devextreme/common'; -import { DropDownPredefinedButton } from 'devextreme/ui/drop_down_editor/ui.drop_down_editor'; +import { DropDownPredefinedButton, FieldAddons } from 'devextreme/ui/drop_down_editor/ui.drop_down_editor'; import { dxPopupOptions } from 'devextreme/ui/popup'; import { ChangeEvent, ClosedEvent, CopyEvent, CutEvent, DisposingEvent, EnterKeyEvent, FocusInEvent, FocusOutEvent, InitializedEvent, InputEvent, KeyDownEvent, KeyUpEvent, OpenedEvent, OptionChangedEvent, PasteEvent, ValueChangedEvent } from 'devextreme/ui/color_box'; @@ -60,6 +60,7 @@ import { DxoMyModule } from 'devextreme-angular/ui/nested'; import { DxoOffsetModule } from 'devextreme-angular/ui/nested'; import { DxoToModule } from 'devextreme-angular/ui/nested'; import { DxoShowModule } from 'devextreme-angular/ui/nested'; +import { DxoFieldAddonsModule } from 'devextreme-angular/ui/nested'; import { DxoColorBoxAnimationModule } from 'devextreme-angular/ui/color-box/nested'; import { DxoColorBoxAtModule } from 'devextreme-angular/ui/color-box/nested'; @@ -67,6 +68,7 @@ import { DxoColorBoxBoundaryOffsetModule } from 'devextreme-angular/ui/color-box import { DxiColorBoxButtonModule } from 'devextreme-angular/ui/color-box/nested'; import { DxoColorBoxCollisionModule } from 'devextreme-angular/ui/color-box/nested'; import { DxoColorBoxDropDownOptionsModule } from 'devextreme-angular/ui/color-box/nested'; +import { DxoColorBoxFieldAddonsModule } from 'devextreme-angular/ui/color-box/nested'; import { DxoColorBoxFromModule } from 'devextreme-angular/ui/color-box/nested'; import { DxoColorBoxHideModule } from 'devextreme-angular/ui/color-box/nested'; import { DxoColorBoxMyModule } from 'devextreme-angular/ui/color-box/nested'; @@ -278,6 +280,19 @@ export class DxColorBoxComponent extends DxComponent implements OnDestroy, Contr } + /** + * [descr:dxDropDownEditorOptions.fieldAddons] + + */ + @Input() + get fieldAddons(): FieldAddons { + return this._getOption('fieldAddons'); + } + set fieldAddons(value: FieldAddons) { + this._setOption('fieldAddons', value); + } + + /** * [descr:dxColorBoxOptions.fieldTemplate] @@ -886,6 +901,13 @@ export class DxColorBoxComponent extends DxComponent implements OnDestroy, Contr */ @Output() elementAttrChange: EventEmitter>; + /** + + * This member supports the internal infrastructure and is not intended to be used directly from your code. + + */ + @Output() fieldAddonsChange: EventEmitter; + /** * This member supports the internal infrastructure and is not intended to be used directly from your code. @@ -1168,6 +1190,7 @@ export class DxColorBoxComponent extends DxComponent implements OnDestroy, Contr { emit: 'dropDownOptionsChange' }, { emit: 'editAlphaChannelChange' }, { emit: 'elementAttrChange' }, + { emit: 'fieldAddonsChange' }, { emit: 'fieldTemplateChange' }, { emit: 'focusStateEnabledChange' }, { emit: 'heightChange' }, @@ -1282,12 +1305,14 @@ export class DxColorBoxComponent extends DxComponent implements OnDestroy, Contr DxoOffsetModule, DxoToModule, DxoShowModule, + DxoFieldAddonsModule, DxoColorBoxAnimationModule, DxoColorBoxAtModule, DxoColorBoxBoundaryOffsetModule, DxiColorBoxButtonModule, DxoColorBoxCollisionModule, DxoColorBoxDropDownOptionsModule, + DxoColorBoxFieldAddonsModule, DxoColorBoxFromModule, DxoColorBoxHideModule, DxoColorBoxMyModule, @@ -1316,12 +1341,14 @@ export class DxColorBoxComponent extends DxComponent implements OnDestroy, Contr DxoOffsetModule, DxoToModule, DxoShowModule, + DxoFieldAddonsModule, DxoColorBoxAnimationModule, DxoColorBoxAtModule, DxoColorBoxBoundaryOffsetModule, DxiColorBoxButtonModule, DxoColorBoxCollisionModule, DxoColorBoxDropDownOptionsModule, + DxoColorBoxFieldAddonsModule, DxoColorBoxFromModule, DxoColorBoxHideModule, DxoColorBoxMyModule, diff --git a/packages/devextreme-angular/src/ui/color-box/nested/field-addons.ts b/packages/devextreme-angular/src/ui/color-box/nested/field-addons.ts new file mode 100644 index 000000000000..071c3d1b076f --- /dev/null +++ b/packages/devextreme-angular/src/ui/color-box/nested/field-addons.ts @@ -0,0 +1,83 @@ +/* tslint:disable:max-line-length */ + + +import { + Component, + OnInit, + OnDestroy, + NgModule, + Host, + SkipSelf, + Input +} from '@angular/core'; + + + + + +import { + DxIntegrationModule, + NestedOptionHost, +} from 'devextreme-angular/core'; +import { NestedOption } from 'devextreme-angular/core'; + + +@Component({ + selector: 'dxo-color-box-field-addons', + standalone: true, + template: '', + styles: [''], + imports: [ DxIntegrationModule ], + providers: [NestedOptionHost] +}) +export class DxoColorBoxFieldAddonsComponent extends NestedOption implements OnDestroy, OnInit { + @Input() + get afterTemplate(): any { + return this._getOption('afterTemplate'); + } + set afterTemplate(value: any) { + this._setOption('afterTemplate', value); + } + + @Input() + get beforeTemplate(): any { + return this._getOption('beforeTemplate'); + } + set beforeTemplate(value: any) { + this._setOption('beforeTemplate', value); + } + + + protected get _optionPath() { + return 'fieldAddons'; + } + + + constructor(@SkipSelf() @Host() parentOptionHost: NestedOptionHost, + @Host() optionHost: NestedOptionHost) { + super(); + parentOptionHost.setNestedOption(this); + optionHost.setHost(this, this._fullOptionPath.bind(this)); + } + + + ngOnInit() { + this._addRecreatedComponent(); + } + + ngOnDestroy() { + this._addRemovedOption(this._getOptionPath()); + } + + +} + +@NgModule({ + imports: [ + DxoColorBoxFieldAddonsComponent + ], + exports: [ + DxoColorBoxFieldAddonsComponent + ], +}) +export class DxoColorBoxFieldAddonsModule { } diff --git a/packages/devextreme-angular/src/ui/color-box/nested/index.ts b/packages/devextreme-angular/src/ui/color-box/nested/index.ts index a5926253bf21..d0d98e2b17e0 100644 --- a/packages/devextreme-angular/src/ui/color-box/nested/index.ts +++ b/packages/devextreme-angular/src/ui/color-box/nested/index.ts @@ -4,6 +4,7 @@ export * from './boundary-offset'; export * from './button-dxi'; export * from './collision'; export * from './drop-down-options'; +export * from './field-addons'; export * from './from'; export * from './hide'; export * from './my'; diff --git a/packages/devextreme-angular/src/ui/drop-down-box/index.ts b/packages/devextreme-angular/src/ui/drop-down-box/index.ts index 670f36ad5c0b..23f33b4dd9ed 100644 --- a/packages/devextreme-angular/src/ui/drop-down-box/index.ts +++ b/packages/devextreme-angular/src/ui/drop-down-box/index.ts @@ -25,7 +25,7 @@ import { import DataSource from 'devextreme/data/data_source'; -import { DropDownPredefinedButton } from 'devextreme/ui/drop_down_editor/ui.drop_down_editor'; +import { DropDownPredefinedButton, FieldAddons } from 'devextreme/ui/drop_down_editor/ui.drop_down_editor'; import { TextEditorButton, LabelMode, EditorStyle, ValidationMessageMode, Mode, Position, ValidationStatus } from 'devextreme/common'; import { DataSourceOptions } from 'devextreme/data/data_source'; import { Store } from 'devextreme/data/store'; @@ -63,6 +63,7 @@ import { DxoMyModule } from 'devextreme-angular/ui/nested'; import { DxoOffsetModule } from 'devextreme-angular/ui/nested'; import { DxoToModule } from 'devextreme-angular/ui/nested'; import { DxoShowModule } from 'devextreme-angular/ui/nested'; +import { DxoFieldAddonsModule } from 'devextreme-angular/ui/nested'; import { DxiItemModule } from 'devextreme-angular/ui/nested'; import { DxoDropDownBoxAnimationModule } from 'devextreme-angular/ui/drop-down-box/nested'; @@ -71,6 +72,7 @@ import { DxoDropDownBoxBoundaryOffsetModule } from 'devextreme-angular/ui/drop-d import { DxiDropDownBoxButtonModule } from 'devextreme-angular/ui/drop-down-box/nested'; import { DxoDropDownBoxCollisionModule } from 'devextreme-angular/ui/drop-down-box/nested'; import { DxoDropDownBoxDropDownOptionsModule } from 'devextreme-angular/ui/drop-down-box/nested'; +import { DxoDropDownBoxFieldAddonsModule } from 'devextreme-angular/ui/drop-down-box/nested'; import { DxoDropDownBoxFromModule } from 'devextreme-angular/ui/drop-down-box/nested'; import { DxoDropDownBoxHideModule } from 'devextreme-angular/ui/drop-down-box/nested'; import { DxoDropDownBoxMyModule } from 'devextreme-angular/ui/drop-down-box/nested'; @@ -283,6 +285,19 @@ export class DxDropDownBoxComponent extends DxComponent implements OnDestroy, Co } + /** + * [descr:dxDropDownEditorOptions.fieldAddons] + + */ + @Input() + get fieldAddons(): FieldAddons { + return this._getOption('fieldAddons'); + } + set fieldAddons(value: FieldAddons) { + this._setOption('fieldAddons', value); + } + + /** * [descr:dxDropDownBoxOptions.fieldTemplate] @@ -930,6 +945,13 @@ export class DxDropDownBoxComponent extends DxComponent implements OnDestroy, Co */ @Output() elementAttrChange: EventEmitter>; + /** + + * This member supports the internal infrastructure and is not intended to be used directly from your code. + + */ + @Output() fieldAddonsChange: EventEmitter; + /** * This member supports the internal infrastructure and is not intended to be used directly from your code. @@ -1241,6 +1263,7 @@ export class DxDropDownBoxComponent extends DxComponent implements OnDestroy, Co { emit: 'dropDownButtonTemplateChange' }, { emit: 'dropDownOptionsChange' }, { emit: 'elementAttrChange' }, + { emit: 'fieldAddonsChange' }, { emit: 'fieldTemplateChange' }, { emit: 'focusStateEnabledChange' }, { emit: 'heightChange' }, @@ -1362,6 +1385,7 @@ export class DxDropDownBoxComponent extends DxComponent implements OnDestroy, Co DxoOffsetModule, DxoToModule, DxoShowModule, + DxoFieldAddonsModule, DxiItemModule, DxoDropDownBoxAnimationModule, DxoDropDownBoxAtModule, @@ -1369,6 +1393,7 @@ export class DxDropDownBoxComponent extends DxComponent implements OnDestroy, Co DxiDropDownBoxButtonModule, DxoDropDownBoxCollisionModule, DxoDropDownBoxDropDownOptionsModule, + DxoDropDownBoxFieldAddonsModule, DxoDropDownBoxFromModule, DxoDropDownBoxHideModule, DxoDropDownBoxMyModule, @@ -1397,6 +1422,7 @@ export class DxDropDownBoxComponent extends DxComponent implements OnDestroy, Co DxoOffsetModule, DxoToModule, DxoShowModule, + DxoFieldAddonsModule, DxiItemModule, DxoDropDownBoxAnimationModule, DxoDropDownBoxAtModule, @@ -1404,6 +1430,7 @@ export class DxDropDownBoxComponent extends DxComponent implements OnDestroy, Co DxiDropDownBoxButtonModule, DxoDropDownBoxCollisionModule, DxoDropDownBoxDropDownOptionsModule, + DxoDropDownBoxFieldAddonsModule, DxoDropDownBoxFromModule, DxoDropDownBoxHideModule, DxoDropDownBoxMyModule, diff --git a/packages/devextreme-angular/src/ui/drop-down-box/nested/field-addons.ts b/packages/devextreme-angular/src/ui/drop-down-box/nested/field-addons.ts new file mode 100644 index 000000000000..99de2830e90f --- /dev/null +++ b/packages/devextreme-angular/src/ui/drop-down-box/nested/field-addons.ts @@ -0,0 +1,83 @@ +/* tslint:disable:max-line-length */ + + +import { + Component, + OnInit, + OnDestroy, + NgModule, + Host, + SkipSelf, + Input +} from '@angular/core'; + + + + + +import { + DxIntegrationModule, + NestedOptionHost, +} from 'devextreme-angular/core'; +import { NestedOption } from 'devextreme-angular/core'; + + +@Component({ + selector: 'dxo-drop-down-box-field-addons', + standalone: true, + template: '', + styles: [''], + imports: [ DxIntegrationModule ], + providers: [NestedOptionHost] +}) +export class DxoDropDownBoxFieldAddonsComponent extends NestedOption implements OnDestroy, OnInit { + @Input() + get afterTemplate(): any { + return this._getOption('afterTemplate'); + } + set afterTemplate(value: any) { + this._setOption('afterTemplate', value); + } + + @Input() + get beforeTemplate(): any { + return this._getOption('beforeTemplate'); + } + set beforeTemplate(value: any) { + this._setOption('beforeTemplate', value); + } + + + protected get _optionPath() { + return 'fieldAddons'; + } + + + constructor(@SkipSelf() @Host() parentOptionHost: NestedOptionHost, + @Host() optionHost: NestedOptionHost) { + super(); + parentOptionHost.setNestedOption(this); + optionHost.setHost(this, this._fullOptionPath.bind(this)); + } + + + ngOnInit() { + this._addRecreatedComponent(); + } + + ngOnDestroy() { + this._addRemovedOption(this._getOptionPath()); + } + + +} + +@NgModule({ + imports: [ + DxoDropDownBoxFieldAddonsComponent + ], + exports: [ + DxoDropDownBoxFieldAddonsComponent + ], +}) +export class DxoDropDownBoxFieldAddonsModule { } diff --git a/packages/devextreme-angular/src/ui/drop-down-box/nested/index.ts b/packages/devextreme-angular/src/ui/drop-down-box/nested/index.ts index a5926253bf21..d0d98e2b17e0 100644 --- a/packages/devextreme-angular/src/ui/drop-down-box/nested/index.ts +++ b/packages/devextreme-angular/src/ui/drop-down-box/nested/index.ts @@ -4,6 +4,7 @@ export * from './boundary-offset'; export * from './button-dxi'; export * from './collision'; export * from './drop-down-options'; +export * from './field-addons'; export * from './from'; export * from './hide'; export * from './my'; diff --git a/packages/devextreme-angular/src/ui/nested/base/field-addons.ts b/packages/devextreme-angular/src/ui/nested/base/field-addons.ts new file mode 100644 index 000000000000..f3560350c254 --- /dev/null +++ b/packages/devextreme-angular/src/ui/nested/base/field-addons.ts @@ -0,0 +1,26 @@ +/* tslint:disable:max-line-length */ + +import { NestedOption } from 'devextreme-angular/core'; +import { + Component, +} from '@angular/core'; + + +@Component({ + template: '' +}) +export abstract class DxoFieldAddons extends NestedOption { + get afterTemplate(): any { + return this._getOption('afterTemplate'); + } + set afterTemplate(value: any) { + this._setOption('afterTemplate', value); + } + + get beforeTemplate(): any { + return this._getOption('beforeTemplate'); + } + set beforeTemplate(value: any) { + this._setOption('beforeTemplate', value); + } +} diff --git a/packages/devextreme-angular/src/ui/nested/base/index.ts b/packages/devextreme-angular/src/ui/nested/base/index.ts index de74c6df0cfc..628dcbf286ed 100644 --- a/packages/devextreme-angular/src/ui/nested/base/index.ts +++ b/packages/devextreme-angular/src/ui/nested/base/index.ts @@ -19,6 +19,7 @@ export * from './data-change-dxi'; export * from './data-grid-column-dxi'; export * from './data-grid-toolbar'; export * from './diagram-custom-command-dxi'; +export * from './field-addons'; export * from './file-manager-context-menu'; export * from './file-manager-toolbar-item-dxi'; export * from './file-uploader-options'; diff --git a/packages/devextreme-angular/src/ui/nested/field-addons.ts b/packages/devextreme-angular/src/ui/nested/field-addons.ts new file mode 100644 index 000000000000..bea687b90fee --- /dev/null +++ b/packages/devextreme-angular/src/ui/nested/field-addons.ts @@ -0,0 +1,71 @@ +/* tslint:disable:max-line-length */ + +/* tslint:disable:use-input-property-decorator */ + +import { + Component, + OnInit, + OnDestroy, + NgModule, + Host, + SkipSelf +} from '@angular/core'; + + + + + +import { + DxIntegrationModule, + NestedOptionHost, +} from 'devextreme-angular/core'; +import { DxoFieldAddons } from './base/field-addons'; + + +@Component({ + selector: 'dxo-field-addons', + standalone: true, + template: '', + styles: [''], + imports: [ DxIntegrationModule ], + providers: [NestedOptionHost], + inputs: [ + 'afterTemplate', + 'beforeTemplate' + ] +}) +export class DxoFieldAddonsComponent extends DxoFieldAddons implements OnDestroy, OnInit { + + protected get _optionPath() { + return 'fieldAddons'; + } + + + constructor(@SkipSelf() @Host() parentOptionHost: NestedOptionHost, + @Host() optionHost: NestedOptionHost) { + super(); + parentOptionHost.setNestedOption(this); + optionHost.setHost(this, this._fullOptionPath.bind(this)); + } + + + ngOnInit() { + this._addRecreatedComponent(); + } + + ngOnDestroy() { + this._addRemovedOption(this._getOptionPath()); + } + + +} + +@NgModule({ + imports: [ + DxoFieldAddonsComponent + ], + exports: [ + DxoFieldAddonsComponent + ], +}) +export class DxoFieldAddonsModule { } diff --git a/packages/devextreme-angular/src/ui/nested/index.ts b/packages/devextreme-angular/src/ui/nested/index.ts index 7c291f7dc04e..d664eefc2787 100644 --- a/packages/devextreme-angular/src/ui/nested/index.ts +++ b/packages/devextreme-angular/src/ui/nested/index.ts @@ -67,6 +67,7 @@ export * from './drop-down-options'; export * from './edges'; export * from './editing'; export * from './export'; +export * from './field-addons'; export * from './field-chooser'; export * from './field-dxi'; export * from './field-panel'; diff --git a/packages/devextreme-angular/src/ui/select-box/index.ts b/packages/devextreme-angular/src/ui/select-box/index.ts index 0597a971b979..8ed4c28a9d56 100644 --- a/packages/devextreme-angular/src/ui/select-box/index.ts +++ b/packages/devextreme-angular/src/ui/select-box/index.ts @@ -25,7 +25,7 @@ import { import DataSource from 'devextreme/data/data_source'; -import { DropDownPredefinedButton } from 'devextreme/ui/drop_down_editor/ui.drop_down_editor'; +import { DropDownPredefinedButton, FieldAddons } from 'devextreme/ui/drop_down_editor/ui.drop_down_editor'; import { TextEditorButton, LabelMode, SimplifiedSearchMode, EditorStyle, ValidationMessageMode, Mode, Position, ValidationStatus } from 'devextreme/common'; import { CollectionWidgetItem } from 'devextreme/ui/collection/ui.collection_widget.base'; import { DataSourceOptions } from 'devextreme/data/data_source'; @@ -64,6 +64,7 @@ import { DxoMyModule } from 'devextreme-angular/ui/nested'; import { DxoOffsetModule } from 'devextreme-angular/ui/nested'; import { DxoToModule } from 'devextreme-angular/ui/nested'; import { DxoShowModule } from 'devextreme-angular/ui/nested'; +import { DxoFieldAddonsModule } from 'devextreme-angular/ui/nested'; import { DxiItemModule } from 'devextreme-angular/ui/nested'; import { DxoSelectBoxAnimationModule } from 'devextreme-angular/ui/select-box/nested'; @@ -72,6 +73,7 @@ import { DxoSelectBoxBoundaryOffsetModule } from 'devextreme-angular/ui/select-b import { DxiSelectBoxButtonModule } from 'devextreme-angular/ui/select-box/nested'; import { DxoSelectBoxCollisionModule } from 'devextreme-angular/ui/select-box/nested'; import { DxoSelectBoxDropDownOptionsModule } from 'devextreme-angular/ui/select-box/nested'; +import { DxoSelectBoxFieldAddonsModule } from 'devextreme-angular/ui/select-box/nested'; import { DxoSelectBoxFromModule } from 'devextreme-angular/ui/select-box/nested'; import { DxoSelectBoxHideModule } from 'devextreme-angular/ui/select-box/nested'; import { DxiSelectBoxItemModule } from 'devextreme-angular/ui/select-box/nested'; @@ -286,6 +288,19 @@ export class DxSelectBoxComponent extends DxComponent implements OnDestroy, Cont } + /** + * [descr:dxSelectBoxOptions.fieldAddons] + + */ + @Input() + get fieldAddons(): FieldAddons { + return this._getOption('fieldAddons'); + } + set fieldAddons(value: FieldAddons) { + this._setOption('fieldAddons', value); + } + + /** * [descr:dxSelectBoxOptions.fieldTemplate] @@ -1160,6 +1175,13 @@ export class DxSelectBoxComponent extends DxComponent implements OnDestroy, Cont */ @Output() elementAttrChange: EventEmitter>; + /** + + * This member supports the internal infrastructure and is not intended to be used directly from your code. + + */ + @Output() fieldAddonsChange: EventEmitter; + /** * This member supports the internal infrastructure and is not intended to be used directly from your code. @@ -1588,6 +1610,7 @@ export class DxSelectBoxComponent extends DxComponent implements OnDestroy, Cont { emit: 'dropDownButtonTemplateChange' }, { emit: 'dropDownOptionsChange' }, { emit: 'elementAttrChange' }, + { emit: 'fieldAddonsChange' }, { emit: 'fieldTemplateChange' }, { emit: 'focusStateEnabledChange' }, { emit: 'groupedChange' }, @@ -1726,6 +1749,7 @@ export class DxSelectBoxComponent extends DxComponent implements OnDestroy, Cont DxoOffsetModule, DxoToModule, DxoShowModule, + DxoFieldAddonsModule, DxiItemModule, DxoSelectBoxAnimationModule, DxoSelectBoxAtModule, @@ -1733,6 +1757,7 @@ export class DxSelectBoxComponent extends DxComponent implements OnDestroy, Cont DxiSelectBoxButtonModule, DxoSelectBoxCollisionModule, DxoSelectBoxDropDownOptionsModule, + DxoSelectBoxFieldAddonsModule, DxoSelectBoxFromModule, DxoSelectBoxHideModule, DxiSelectBoxItemModule, @@ -1762,6 +1787,7 @@ export class DxSelectBoxComponent extends DxComponent implements OnDestroy, Cont DxoOffsetModule, DxoToModule, DxoShowModule, + DxoFieldAddonsModule, DxiItemModule, DxoSelectBoxAnimationModule, DxoSelectBoxAtModule, @@ -1769,6 +1795,7 @@ export class DxSelectBoxComponent extends DxComponent implements OnDestroy, Cont DxiSelectBoxButtonModule, DxoSelectBoxCollisionModule, DxoSelectBoxDropDownOptionsModule, + DxoSelectBoxFieldAddonsModule, DxoSelectBoxFromModule, DxoSelectBoxHideModule, DxiSelectBoxItemModule, diff --git a/packages/devextreme-angular/src/ui/select-box/nested/field-addons.ts b/packages/devextreme-angular/src/ui/select-box/nested/field-addons.ts new file mode 100644 index 000000000000..ad9677aa6ea4 --- /dev/null +++ b/packages/devextreme-angular/src/ui/select-box/nested/field-addons.ts @@ -0,0 +1,83 @@ +/* tslint:disable:max-line-length */ + + +import { + Component, + OnInit, + OnDestroy, + NgModule, + Host, + SkipSelf, + Input +} from '@angular/core'; + + + + + +import { + DxIntegrationModule, + NestedOptionHost, +} from 'devextreme-angular/core'; +import { NestedOption } from 'devextreme-angular/core'; + + +@Component({ + selector: 'dxo-select-box-field-addons', + standalone: true, + template: '', + styles: [''], + imports: [ DxIntegrationModule ], + providers: [NestedOptionHost] +}) +export class DxoSelectBoxFieldAddonsComponent extends NestedOption implements OnDestroy, OnInit { + @Input() + get afterTemplate(): any { + return this._getOption('afterTemplate'); + } + set afterTemplate(value: any) { + this._setOption('afterTemplate', value); + } + + @Input() + get beforeTemplate(): any { + return this._getOption('beforeTemplate'); + } + set beforeTemplate(value: any) { + this._setOption('beforeTemplate', value); + } + + + protected get _optionPath() { + return 'fieldAddons'; + } + + + constructor(@SkipSelf() @Host() parentOptionHost: NestedOptionHost, + @Host() optionHost: NestedOptionHost) { + super(); + parentOptionHost.setNestedOption(this); + optionHost.setHost(this, this._fullOptionPath.bind(this)); + } + + + ngOnInit() { + this._addRecreatedComponent(); + } + + ngOnDestroy() { + this._addRemovedOption(this._getOptionPath()); + } + + +} + +@NgModule({ + imports: [ + DxoSelectBoxFieldAddonsComponent + ], + exports: [ + DxoSelectBoxFieldAddonsComponent + ], +}) +export class DxoSelectBoxFieldAddonsModule { } diff --git a/packages/devextreme-angular/src/ui/select-box/nested/index.ts b/packages/devextreme-angular/src/ui/select-box/nested/index.ts index 5d8a4c3bbef5..3871a35503c4 100644 --- a/packages/devextreme-angular/src/ui/select-box/nested/index.ts +++ b/packages/devextreme-angular/src/ui/select-box/nested/index.ts @@ -4,6 +4,7 @@ export * from './boundary-offset'; export * from './button-dxi'; export * from './collision'; export * from './drop-down-options'; +export * from './field-addons'; export * from './from'; export * from './hide'; export * from './item-dxi'; diff --git a/packages/devextreme-angular/src/ui/tag-box/index.ts b/packages/devextreme-angular/src/ui/tag-box/index.ts index a12f0c5d29e0..4512fc8685a2 100644 --- a/packages/devextreme-angular/src/ui/tag-box/index.ts +++ b/packages/devextreme-angular/src/ui/tag-box/index.ts @@ -26,7 +26,7 @@ import { import DataSource from 'devextreme/data/data_source'; import { ApplyValueMode, TextEditorButton, LabelMode, SimplifiedSearchMode, SelectAllMode, EditorStyle, ValidationMessageMode, Mode, Position, ValidationStatus } from 'devextreme/common'; -import { DropDownPredefinedButton } from 'devextreme/ui/drop_down_editor/ui.drop_down_editor'; +import { DropDownPredefinedButton, FieldAddons } from 'devextreme/ui/drop_down_editor/ui.drop_down_editor'; import { CollectionWidgetItem } from 'devextreme/ui/collection/ui.collection_widget.base'; import { DataSourceOptions } from 'devextreme/data/data_source'; import { Store } from 'devextreme/data/store'; @@ -64,6 +64,7 @@ import { DxoMyModule } from 'devextreme-angular/ui/nested'; import { DxoOffsetModule } from 'devextreme-angular/ui/nested'; import { DxoToModule } from 'devextreme-angular/ui/nested'; import { DxoShowModule } from 'devextreme-angular/ui/nested'; +import { DxoFieldAddonsModule } from 'devextreme-angular/ui/nested'; import { DxiItemModule } from 'devextreme-angular/ui/nested'; import { DxoTagBoxAnimationModule } from 'devextreme-angular/ui/tag-box/nested'; @@ -72,6 +73,7 @@ import { DxoTagBoxBoundaryOffsetModule } from 'devextreme-angular/ui/tag-box/nes import { DxiTagBoxButtonModule } from 'devextreme-angular/ui/tag-box/nested'; import { DxoTagBoxCollisionModule } from 'devextreme-angular/ui/tag-box/nested'; import { DxoTagBoxDropDownOptionsModule } from 'devextreme-angular/ui/tag-box/nested'; +import { DxoTagBoxFieldAddonsModule } from 'devextreme-angular/ui/tag-box/nested'; import { DxoTagBoxFromModule } from 'devextreme-angular/ui/tag-box/nested'; import { DxoTagBoxHideModule } from 'devextreme-angular/ui/tag-box/nested'; import { DxiTagBoxItemModule } from 'devextreme-angular/ui/tag-box/nested'; @@ -286,6 +288,19 @@ export class DxTagBoxComponent extends DxComponent implements OnDestroy, Control } + /** + * [descr:dxSelectBoxOptions.fieldAddons] + + */ + @Input() + get fieldAddons(): FieldAddons { + return this._getOption('fieldAddons'); + } + set fieldAddons(value: FieldAddons) { + this._setOption('fieldAddons', value); + } + + /** * [descr:dxSelectBoxOptions.fieldTemplate] @@ -1243,6 +1258,13 @@ export class DxTagBoxComponent extends DxComponent implements OnDestroy, Control */ @Output() elementAttrChange: EventEmitter>; + /** + + * This member supports the internal infrastructure and is not intended to be used directly from your code. + + */ + @Output() fieldAddonsChange: EventEmitter; + /** * This member supports the internal infrastructure and is not intended to be used directly from your code. @@ -1719,6 +1741,7 @@ export class DxTagBoxComponent extends DxComponent implements OnDestroy, Control { emit: 'dropDownButtonTemplateChange' }, { emit: 'dropDownOptionsChange' }, { emit: 'elementAttrChange' }, + { emit: 'fieldAddonsChange' }, { emit: 'fieldTemplateChange' }, { emit: 'focusStateEnabledChange' }, { emit: 'groupedChange' }, @@ -1868,6 +1891,7 @@ export class DxTagBoxComponent extends DxComponent implements OnDestroy, Control DxoOffsetModule, DxoToModule, DxoShowModule, + DxoFieldAddonsModule, DxiItemModule, DxoTagBoxAnimationModule, DxoTagBoxAtModule, @@ -1875,6 +1899,7 @@ export class DxTagBoxComponent extends DxComponent implements OnDestroy, Control DxiTagBoxButtonModule, DxoTagBoxCollisionModule, DxoTagBoxDropDownOptionsModule, + DxoTagBoxFieldAddonsModule, DxoTagBoxFromModule, DxoTagBoxHideModule, DxiTagBoxItemModule, @@ -1904,6 +1929,7 @@ export class DxTagBoxComponent extends DxComponent implements OnDestroy, Control DxoOffsetModule, DxoToModule, DxoShowModule, + DxoFieldAddonsModule, DxiItemModule, DxoTagBoxAnimationModule, DxoTagBoxAtModule, @@ -1911,6 +1937,7 @@ export class DxTagBoxComponent extends DxComponent implements OnDestroy, Control DxiTagBoxButtonModule, DxoTagBoxCollisionModule, DxoTagBoxDropDownOptionsModule, + DxoTagBoxFieldAddonsModule, DxoTagBoxFromModule, DxoTagBoxHideModule, DxiTagBoxItemModule, diff --git a/packages/devextreme-angular/src/ui/tag-box/nested/field-addons.ts b/packages/devextreme-angular/src/ui/tag-box/nested/field-addons.ts new file mode 100644 index 000000000000..79f86d2c70bc --- /dev/null +++ b/packages/devextreme-angular/src/ui/tag-box/nested/field-addons.ts @@ -0,0 +1,83 @@ +/* tslint:disable:max-line-length */ + + +import { + Component, + OnInit, + OnDestroy, + NgModule, + Host, + SkipSelf, + Input +} from '@angular/core'; + + + + + +import { + DxIntegrationModule, + NestedOptionHost, +} from 'devextreme-angular/core'; +import { NestedOption } from 'devextreme-angular/core'; + + +@Component({ + selector: 'dxo-tag-box-field-addons', + standalone: true, + template: '', + styles: [''], + imports: [ DxIntegrationModule ], + providers: [NestedOptionHost] +}) +export class DxoTagBoxFieldAddonsComponent extends NestedOption implements OnDestroy, OnInit { + @Input() + get afterTemplate(): any { + return this._getOption('afterTemplate'); + } + set afterTemplate(value: any) { + this._setOption('afterTemplate', value); + } + + @Input() + get beforeTemplate(): any { + return this._getOption('beforeTemplate'); + } + set beforeTemplate(value: any) { + this._setOption('beforeTemplate', value); + } + + + protected get _optionPath() { + return 'fieldAddons'; + } + + + constructor(@SkipSelf() @Host() parentOptionHost: NestedOptionHost, + @Host() optionHost: NestedOptionHost) { + super(); + parentOptionHost.setNestedOption(this); + optionHost.setHost(this, this._fullOptionPath.bind(this)); + } + + + ngOnInit() { + this._addRecreatedComponent(); + } + + ngOnDestroy() { + this._addRemovedOption(this._getOptionPath()); + } + + +} + +@NgModule({ + imports: [ + DxoTagBoxFieldAddonsComponent + ], + exports: [ + DxoTagBoxFieldAddonsComponent + ], +}) +export class DxoTagBoxFieldAddonsModule { } diff --git a/packages/devextreme-angular/src/ui/tag-box/nested/index.ts b/packages/devextreme-angular/src/ui/tag-box/nested/index.ts index 5d8a4c3bbef5..3871a35503c4 100644 --- a/packages/devextreme-angular/src/ui/tag-box/nested/index.ts +++ b/packages/devextreme-angular/src/ui/tag-box/nested/index.ts @@ -4,6 +4,7 @@ export * from './boundary-offset'; export * from './button-dxi'; export * from './collision'; export * from './drop-down-options'; +export * from './field-addons'; export * from './from'; export * from './hide'; export * from './item-dxi'; diff --git a/packages/devextreme-react/src/color-box.ts b/packages/devextreme-react/src/color-box.ts index 80daac8ac3dd..010bf01430c9 100644 --- a/packages/devextreme-react/src/color-box.ts +++ b/packages/devextreme-react/src/color-box.ts @@ -83,7 +83,8 @@ const ColorBox = memo( const expectedChildren = useMemo(() => ({ button: { optionName: "buttons", isCollectionItem: true }, - dropDownOptions: { optionName: "dropDownOptions", isCollectionItem: false } + dropDownOptions: { optionName: "dropDownOptions", isCollectionItem: false }, + fieldAddons: { optionName: "fieldAddons", isCollectionItem: false } }), []); const templateProps = useMemo(() => ([ @@ -320,6 +321,38 @@ const DropDownOptions = Object.assign string | any) | template; + beforeTemplate?: ((data: any, element: any) => string | any) | template; + afterRender?: (...params: any) => React.ReactNode; + afterComponent?: React.ComponentType; + beforeRender?: (...params: any) => React.ReactNode; + beforeComponent?: React.ComponentType; +}> +const _componentFieldAddons = (props: IFieldAddonsProps) => { + return React.createElement(NestedOption, { + ...props, + elementDescriptor: { + OptionName: "fieldAddons", + TemplateProps: [{ + tmplOption: "afterTemplate", + render: "afterRender", + component: "afterComponent" + }, { + tmplOption: "beforeTemplate", + render: "beforeRender", + component: "beforeComponent" + }], + }, + }); +}; + +const FieldAddons = Object.assign(_componentFieldAddons, { + componentType: "option", +}); + // owners: // Hide // Show @@ -629,6 +662,8 @@ export { ICollisionProps, DropDownOptions, IDropDownOptionsProps, + FieldAddons, + IFieldAddonsProps, From, IFromProps, Hide, diff --git a/packages/devextreme-react/src/drop-down-box.ts b/packages/devextreme-react/src/drop-down-box.ts index 64dd507db116..ce01022a167d 100644 --- a/packages/devextreme-react/src/drop-down-box.ts +++ b/packages/devextreme-react/src/drop-down-box.ts @@ -82,7 +82,8 @@ const DropDownBox = memo( const expectedChildren = useMemo(() => ({ button: { optionName: "buttons", isCollectionItem: true }, - dropDownOptions: { optionName: "dropDownOptions", isCollectionItem: false } + dropDownOptions: { optionName: "dropDownOptions", isCollectionItem: false }, + fieldAddons: { optionName: "fieldAddons", isCollectionItem: false } }), []); const templateProps = useMemo(() => ([ @@ -324,6 +325,38 @@ const DropDownOptions = Object.assign string | any) | template; + beforeTemplate?: ((data: any, element: any) => string | any) | template; + afterRender?: (...params: any) => React.ReactNode; + afterComponent?: React.ComponentType; + beforeRender?: (...params: any) => React.ReactNode; + beforeComponent?: React.ComponentType; +}> +const _componentFieldAddons = (props: IFieldAddonsProps) => { + return React.createElement(NestedOption, { + ...props, + elementDescriptor: { + OptionName: "fieldAddons", + TemplateProps: [{ + tmplOption: "afterTemplate", + render: "afterRender", + component: "afterComponent" + }, { + tmplOption: "beforeTemplate", + render: "beforeRender", + component: "beforeComponent" + }], + }, + }); +}; + +const FieldAddons = Object.assign(_componentFieldAddons, { + componentType: "option", +}); + // owners: // Hide // Show @@ -633,6 +666,8 @@ export { ICollisionProps, DropDownOptions, IDropDownOptionsProps, + FieldAddons, + IFieldAddonsProps, From, IFromProps, Hide, diff --git a/packages/devextreme-react/src/select-box.ts b/packages/devextreme-react/src/select-box.ts index 40a3601c49f1..bff5f49f379e 100644 --- a/packages/devextreme-react/src/select-box.ts +++ b/packages/devextreme-react/src/select-box.ts @@ -91,6 +91,7 @@ const SelectBox = memo( const expectedChildren = useMemo(() => ({ button: { optionName: "buttons", isCollectionItem: true }, dropDownOptions: { optionName: "dropDownOptions", isCollectionItem: false }, + fieldAddons: { optionName: "fieldAddons", isCollectionItem: false }, item: { optionName: "items", isCollectionItem: true } }), []); @@ -338,6 +339,38 @@ const DropDownOptions = Object.assign string | any) | template; + beforeTemplate?: ((data: any, element: any) => string | any) | template; + afterRender?: (...params: any) => React.ReactNode; + afterComponent?: React.ComponentType; + beforeRender?: (...params: any) => React.ReactNode; + beforeComponent?: React.ComponentType; +}> +const _componentFieldAddons = (props: IFieldAddonsProps) => { + return React.createElement(NestedOption, { + ...props, + elementDescriptor: { + OptionName: "fieldAddons", + TemplateProps: [{ + tmplOption: "afterTemplate", + render: "afterRender", + component: "afterComponent" + }, { + tmplOption: "beforeTemplate", + render: "beforeRender", + component: "beforeComponent" + }], + }, + }); +}; + +const FieldAddons = Object.assign(_componentFieldAddons, { + componentType: "option", +}); + // owners: // Hide // Show @@ -677,6 +710,8 @@ export { ICollisionProps, DropDownOptions, IDropDownOptionsProps, + FieldAddons, + IFieldAddonsProps, From, IFromProps, Hide, diff --git a/packages/devextreme-react/src/tag-box.ts b/packages/devextreme-react/src/tag-box.ts index 19af6e94ac26..b58a368edac7 100644 --- a/packages/devextreme-react/src/tag-box.ts +++ b/packages/devextreme-react/src/tag-box.ts @@ -92,6 +92,7 @@ const TagBox = memo( const expectedChildren = useMemo(() => ({ button: { optionName: "buttons", isCollectionItem: true }, dropDownOptions: { optionName: "dropDownOptions", isCollectionItem: false }, + fieldAddons: { optionName: "fieldAddons", isCollectionItem: false }, item: { optionName: "items", isCollectionItem: true } }), []); @@ -344,6 +345,38 @@ const DropDownOptions = Object.assign string | any) | template; + beforeTemplate?: ((data: any, element: any) => string | any) | template; + afterRender?: (...params: any) => React.ReactNode; + afterComponent?: React.ComponentType; + beforeRender?: (...params: any) => React.ReactNode; + beforeComponent?: React.ComponentType; +}> +const _componentFieldAddons = (props: IFieldAddonsProps) => { + return React.createElement(NestedOption, { + ...props, + elementDescriptor: { + OptionName: "fieldAddons", + TemplateProps: [{ + tmplOption: "afterTemplate", + render: "afterRender", + component: "afterComponent" + }, { + tmplOption: "beforeTemplate", + render: "beforeRender", + component: "beforeComponent" + }], + }, + }); +}; + +const FieldAddons = Object.assign(_componentFieldAddons, { + componentType: "option", +}); + // owners: // Hide // Show @@ -683,6 +716,8 @@ export { ICollisionProps, DropDownOptions, IDropDownOptionsProps, + FieldAddons, + IFieldAddonsProps, From, IFromProps, Hide, diff --git a/packages/devextreme-vue/src/color-box.ts b/packages/devextreme-vue/src/color-box.ts index 74da06fadbe1..9a44e881453e 100644 --- a/packages/devextreme-vue/src/color-box.ts +++ b/packages/devextreme-vue/src/color-box.ts @@ -26,6 +26,7 @@ import { } from "devextreme/common"; import { DropDownPredefinedButton, + FieldAddons, } from "devextreme/ui/drop_down_editor/ui.drop_down_editor"; import { dxPopupOptions, @@ -95,6 +96,7 @@ type AccessibleOptions = Pick | Record>, editAlphaChannel: Boolean, elementAttr: Object as PropType>, + fieldAddons: Object as PropType>, fieldTemplate: {}, focusStateEnabled: Boolean, height: [Number, String], @@ -225,6 +228,7 @@ const componentConfig = { "update:dropDownOptions": null, "update:editAlphaChannel": null, "update:elementAttr": null, + "update:fieldAddons": null, "update:fieldTemplate": null, "update:focusStateEnabled": null, "update:height": null, @@ -283,7 +287,8 @@ const componentConfig = { (this as any).$_hasAsyncTemplate = true; (this as any).$_expectedChildren = { button: { isCollectionItem: true, optionName: "buttons" }, - dropDownOptions: { isCollectionItem: false, optionName: "dropDownOptions" } + dropDownOptions: { isCollectionItem: false, optionName: "dropDownOptions" }, + fieldAddons: { isCollectionItem: false, optionName: "fieldAddons" } }; } }; @@ -514,6 +519,25 @@ const DxDropDownOptions = defineComponent(DxDropDownOptionsConfig); toolbarItem: { isCollectionItem: true, optionName: "toolbarItems" } }; +const DxFieldAddonsConfig = { + emits: { + "update:isActive": null, + "update:hoveredElement": null, + "update:afterTemplate": null, + "update:beforeTemplate": null, + }, + props: { + afterTemplate: {}, + beforeTemplate: {} + } +}; + +prepareConfigurationComponentConfig(DxFieldAddonsConfig); + +const DxFieldAddons = defineComponent(DxFieldAddonsConfig); + +(DxFieldAddons as any).$_optionName = "fieldAddons"; + const DxFromConfig = { emits: { "update:isActive": null, @@ -836,6 +860,7 @@ export { DxButton, DxCollision, DxDropDownOptions, + DxFieldAddons, DxFrom, DxHide, DxMy, diff --git a/packages/devextreme-vue/src/drop-down-box.ts b/packages/devextreme-vue/src/drop-down-box.ts index d134464f505d..9fcc93346eb6 100644 --- a/packages/devextreme-vue/src/drop-down-box.ts +++ b/packages/devextreme-vue/src/drop-down-box.ts @@ -8,6 +8,7 @@ import DOMComponent from "devextreme/core/dom_component"; import dxPopup from "devextreme/ui/popup"; import { DropDownPredefinedButton, + FieldAddons, } from "devextreme/ui/drop_down_editor/ui.drop_down_editor"; import { TextEditorButton, @@ -101,6 +102,7 @@ type AccessibleOptions = Pick | Record>, elementAttr: Object as PropType>, + fieldAddons: Object as PropType>, fieldTemplate: {}, focusStateEnabled: Boolean, height: [Number, String], @@ -237,6 +240,7 @@ const componentConfig = { "update:dropDownButtonTemplate": null, "update:dropDownOptions": null, "update:elementAttr": null, + "update:fieldAddons": null, "update:fieldTemplate": null, "update:focusStateEnabled": null, "update:height": null, @@ -298,7 +302,8 @@ const componentConfig = { (this as any).$_hasAsyncTemplate = true; (this as any).$_expectedChildren = { button: { isCollectionItem: true, optionName: "buttons" }, - dropDownOptions: { isCollectionItem: false, optionName: "dropDownOptions" } + dropDownOptions: { isCollectionItem: false, optionName: "dropDownOptions" }, + fieldAddons: { isCollectionItem: false, optionName: "fieldAddons" } }; } }; @@ -529,6 +534,25 @@ const DxDropDownOptions = defineComponent(DxDropDownOptionsConfig); toolbarItem: { isCollectionItem: true, optionName: "toolbarItems" } }; +const DxFieldAddonsConfig = { + emits: { + "update:isActive": null, + "update:hoveredElement": null, + "update:afterTemplate": null, + "update:beforeTemplate": null, + }, + props: { + afterTemplate: {}, + beforeTemplate: {} + } +}; + +prepareConfigurationComponentConfig(DxFieldAddonsConfig); + +const DxFieldAddons = defineComponent(DxFieldAddonsConfig); + +(DxFieldAddons as any).$_optionName = "fieldAddons"; + const DxFromConfig = { emits: { "update:isActive": null, @@ -851,6 +875,7 @@ export { DxButton, DxCollision, DxDropDownOptions, + DxFieldAddons, DxFrom, DxHide, DxMy, diff --git a/packages/devextreme-vue/src/select-box.ts b/packages/devextreme-vue/src/select-box.ts index 60a6b00fcd86..66a6820b291d 100644 --- a/packages/devextreme-vue/src/select-box.ts +++ b/packages/devextreme-vue/src/select-box.ts @@ -8,6 +8,7 @@ import DOMComponent from "devextreme/core/dom_component"; import dxPopup from "devextreme/ui/popup"; import { DropDownPredefinedButton, + FieldAddons, } from "devextreme/ui/drop_down_editor/ui.drop_down_editor"; import { TextEditorButton, @@ -109,6 +110,7 @@ type AccessibleOptions = Pick | Record>, elementAttr: Object as PropType>, + fieldAddons: Object as PropType>, fieldTemplate: {}, focusStateEnabled: Boolean, grouped: Boolean, @@ -283,6 +286,7 @@ const componentConfig = { "update:dropDownButtonTemplate": null, "update:dropDownOptions": null, "update:elementAttr": null, + "update:fieldAddons": null, "update:fieldTemplate": null, "update:focusStateEnabled": null, "update:grouped": null, @@ -364,6 +368,7 @@ const componentConfig = { (this as any).$_expectedChildren = { button: { isCollectionItem: true, optionName: "buttons" }, dropDownOptions: { isCollectionItem: false, optionName: "dropDownOptions" }, + fieldAddons: { isCollectionItem: false, optionName: "fieldAddons" }, item: { isCollectionItem: true, optionName: "items" } }; } @@ -595,6 +600,25 @@ const DxDropDownOptions = defineComponent(DxDropDownOptionsConfig); toolbarItem: { isCollectionItem: true, optionName: "toolbarItems" } }; +const DxFieldAddonsConfig = { + emits: { + "update:isActive": null, + "update:hoveredElement": null, + "update:afterTemplate": null, + "update:beforeTemplate": null, + }, + props: { + afterTemplate: {}, + beforeTemplate: {} + } +}; + +prepareConfigurationComponentConfig(DxFieldAddonsConfig); + +const DxFieldAddons = defineComponent(DxFieldAddonsConfig); + +(DxFieldAddons as any).$_optionName = "fieldAddons"; + const DxFromConfig = { emits: { "update:isActive": null, @@ -943,6 +967,7 @@ export { DxButton, DxCollision, DxDropDownOptions, + DxFieldAddons, DxFrom, DxHide, DxItem, diff --git a/packages/devextreme-vue/src/tag-box.ts b/packages/devextreme-vue/src/tag-box.ts index 46fd6851c3e0..81684434bd34 100644 --- a/packages/devextreme-vue/src/tag-box.ts +++ b/packages/devextreme-vue/src/tag-box.ts @@ -29,6 +29,7 @@ import { } from "devextreme/common"; import { DropDownPredefinedButton, + FieldAddons, } from "devextreme/ui/drop_down_editor/ui.drop_down_editor"; import { CollectionWidgetItem, @@ -110,6 +111,7 @@ type AccessibleOptions = Pick | Record>, elementAttr: Object as PropType>, + fieldAddons: Object as PropType>, fieldTemplate: {}, focusStateEnabled: Boolean, grouped: Boolean, @@ -296,6 +299,7 @@ const componentConfig = { "update:dropDownButtonTemplate": null, "update:dropDownOptions": null, "update:elementAttr": null, + "update:fieldAddons": null, "update:fieldTemplate": null, "update:focusStateEnabled": null, "update:grouped": null, @@ -383,6 +387,7 @@ const componentConfig = { (this as any).$_expectedChildren = { button: { isCollectionItem: true, optionName: "buttons" }, dropDownOptions: { isCollectionItem: false, optionName: "dropDownOptions" }, + fieldAddons: { isCollectionItem: false, optionName: "fieldAddons" }, item: { isCollectionItem: true, optionName: "items" } }; } @@ -614,6 +619,25 @@ const DxDropDownOptions = defineComponent(DxDropDownOptionsConfig); toolbarItem: { isCollectionItem: true, optionName: "toolbarItems" } }; +const DxFieldAddonsConfig = { + emits: { + "update:isActive": null, + "update:hoveredElement": null, + "update:afterTemplate": null, + "update:beforeTemplate": null, + }, + props: { + afterTemplate: {}, + beforeTemplate: {} + } +}; + +prepareConfigurationComponentConfig(DxFieldAddonsConfig); + +const DxFieldAddons = defineComponent(DxFieldAddonsConfig); + +(DxFieldAddons as any).$_optionName = "fieldAddons"; + const DxFromConfig = { emits: { "update:isActive": null, @@ -962,6 +986,7 @@ export { DxButton, DxCollision, DxDropDownOptions, + DxFieldAddons, DxFrom, DxHide, DxItem, diff --git a/packages/devextreme/js/__internal/ui/drop_down_editor/m_drop_down_editor.ts b/packages/devextreme/js/__internal/ui/drop_down_editor/m_drop_down_editor.ts index 83465ddca614..526c67d27ca7 100644 --- a/packages/devextreme/js/__internal/ui/drop_down_editor/m_drop_down_editor.ts +++ b/packages/devextreme/js/__internal/ui/drop_down_editor/m_drop_down_editor.ts @@ -54,9 +54,25 @@ const isIOs = devices.current().platform === 'ios'; type HideOnOutsideClickEvent = DxEvent; -export interface DropDownEditorProperties extends Omit { +export interface DropDownEditorProperties extends Omit< + Properties, + | 'onChange' + | 'onCopy' + | 'onCut' + | 'onEnterKey' + | 'onFocusIn' + | 'onFocusOut' + | 'onInput' + | 'onKeyDown' + | 'onKeyUp' + | 'onPaste' + | 'onValueChanged' + | 'validationMessagePosition' + | 'onContentReady' + | 'onDisposing' + | 'onOptionChanged' + | 'onInitialized' +> { buttonsLocation?: string; _onMarkupRendered?: () => void; diff --git a/packages/devextreme/js/__internal/ui/m_lookup.ts b/packages/devextreme/js/__internal/ui/m_lookup.ts index 8bafbc2d973f..c09ba947b231 100644 --- a/packages/devextreme/js/__internal/ui/m_lookup.ts +++ b/packages/devextreme/js/__internal/ui/m_lookup.ts @@ -148,7 +148,6 @@ class Lookup extends DropDownList { fullScreen: false, }, dropDownCentered: false, - _scrollToSelectedItemEnabled: false, useHiddenSubmitElement: true, }; diff --git a/packages/devextreme/js/ui/date_box.d.ts b/packages/devextreme/js/ui/date_box.d.ts index 8670e765003d..cf861571af1c 100644 --- a/packages/devextreme/js/ui/date_box.d.ts +++ b/packages/devextreme/js/ui/date_box.d.ts @@ -294,7 +294,10 @@ export interface dxDateBoxOptions extends DateBoxBaseOptions { * @docid * @namespace DevExpress.ui */ -export interface DateBoxBaseOptions extends dxDropDownEditorOptions { +export interface DateBoxBaseOptions extends Omit< + dxDropDownEditorOptions, + 'fieldAddons' +> { /** * @docid * @default "OK" diff --git a/packages/devextreme/js/ui/date_box.js b/packages/devextreme/js/ui/date_box.js index f3b9f7c8aff4..325842a65de7 100644 --- a/packages/devextreme/js/ui/date_box.js +++ b/packages/devextreme/js/ui/date_box.js @@ -2,3 +2,8 @@ import DateBox from '../__internal/ui/date_box/m_date_box'; export default DateBox; // STYLE dateBox + +/** + * @name dxDateBoxOptions.fieldAddons + * @hidden + */ diff --git a/packages/devextreme/js/ui/date_range_box.js b/packages/devextreme/js/ui/date_range_box.js index 4231fd3251e6..8d4a39093ef4 100644 --- a/packages/devextreme/js/ui/date_range_box.js +++ b/packages/devextreme/js/ui/date_range_box.js @@ -3,6 +3,10 @@ export default DateRangeBox; // STYLE dateRangeBox +/** + * @name dxDateRangeBoxOptions.fieldAddons + * @hidden + */ /** * @name dxDateRangeBoxOptions.inputAttr * @hidden diff --git a/packages/devextreme/js/ui/drop_down_editor/ui.drop_down_editor.d.ts b/packages/devextreme/js/ui/drop_down_editor/ui.drop_down_editor.d.ts index 698bec39036e..6705c8c8058d 100644 --- a/packages/devextreme/js/ui/drop_down_editor/ui.drop_down_editor.d.ts +++ b/packages/devextreme/js/ui/drop_down_editor/ui.drop_down_editor.d.ts @@ -35,6 +35,27 @@ export interface DropDownButtonTemplateDataModel { readonly icon?: string; } +/** + * @namespace DevExpress.ui + * @docid + */ +export type FieldAddons = { + /** + * @namespace DevExpress.ui + * @docid + * @type_function_param1 data:object + * @type_function_return string|Element|jQuery + */ + beforeTemplate?: template | ((data: any, element: DxElement) => string | UserDefinedElement); + /** + * @namespace DevExpress.ui + * @docid + * @type_function_param1 data:object + * @type_function_return string|Element|jQuery + */ + afterTemplate?: template | ((data: any, element: DxElement) => string | UserDefinedElement); +}; + /** * @namespace DevExpress.ui * @docid @@ -86,6 +107,12 @@ export interface dxDropDownEditorOptions extends Omit string | UserDefinedElement); + /** + * @docid + * @default null + * @public + */ + fieldAddons?: FieldAddons; /** * @docid * @default null diff --git a/packages/devextreme/js/ui/drop_down_editor/ui.drop_down_list.d.ts b/packages/devextreme/js/ui/drop_down_editor/ui.drop_down_list.d.ts index 194d825e4613..751cb611fcc1 100644 --- a/packages/devextreme/js/ui/drop_down_editor/ui.drop_down_list.d.ts +++ b/packages/devextreme/js/ui/drop_down_editor/ui.drop_down_list.d.ts @@ -45,7 +45,10 @@ export interface SelectionChangedInfo { * @docid * @hidden */ -export interface dxDropDownListOptions extends DataExpressionMixinOptions, dxDropDownEditorOptions { +export interface dxDropDownListOptions extends DataExpressionMixinOptions, Omit< + dxDropDownEditorOptions, + 'fieldAddons' +> { /** * @docid * @readonly diff --git a/packages/devextreme/js/ui/drop_down_editor/ui.drop_down_list.js b/packages/devextreme/js/ui/drop_down_editor/ui.drop_down_list.js index 80d5eef1dc20..796e99ab15e5 100644 --- a/packages/devextreme/js/ui/drop_down_editor/ui.drop_down_list.js +++ b/packages/devextreme/js/ui/drop_down_editor/ui.drop_down_list.js @@ -7,6 +7,11 @@ export default DropDownList; * @hidden */ +/** + * @name dxDropDownListOptions.fieldAddons + * @hidden + */ + /** * @name dxDropDownListOptions.applyValueMode * @hidden diff --git a/packages/devextreme/js/ui/select_box.d.ts b/packages/devextreme/js/ui/select_box.d.ts index 4ecb21a512ce..bfb33c908dc6 100644 --- a/packages/devextreme/js/ui/select_box.d.ts +++ b/packages/devextreme/js/ui/select_box.d.ts @@ -17,6 +17,7 @@ import { import { DropDownButtonTemplateDataModel, + FieldAddons, } from './drop_down_editor/ui.drop_down_editor'; import dxDropDownList, { @@ -232,6 +233,12 @@ export interface dxSelectBoxOptions extends dxDropDownListOptions string | UserDefinedElement); + /** + * @docid + * @default null + * @public + */ + fieldAddons?: FieldAddons; /** * @section Utils * @type function diff --git a/packages/devextreme/ts/dx.all.d.ts b/packages/devextreme/ts/dx.all.d.ts index 298a46802f8a..e9a62df8966c 100644 --- a/packages/devextreme/ts/dx.all.d.ts +++ b/packages/devextreme/ts/dx.all.d.ts @@ -8683,7 +8683,7 @@ declare module DevExpress.ui { * @deprecated Attention! This type is for internal purposes only. If you used it previously, please submit a ticket to our {@link https://supportcenter.devexpress.com/ticket/create Support Center}. We will check if there is an alternative solution. */ export interface DateBoxBaseOptions - extends dxDropDownEditorOptions { + extends Omit, 'fieldAddons'> { /** * [descr:DateBoxBaseOptions.applyButtonText] */ @@ -16608,6 +16608,10 @@ declare module DevExpress.ui { buttonData: DevExpress.ui.dxDropDownEditor.DropDownButtonTemplateDataModel, contentElement: DevExpress.core.DxElement ) => string | DevExpress.core.UserDefinedElement); + /** + * [descr:dxDropDownEditorOptions.fieldAddons] + */ + fieldAddons?: FieldAddons; /** * [descr:dxDropDownEditorOptions.onClosed] */ @@ -16666,7 +16670,7 @@ declare module DevExpress.ui { */ export interface dxDropDownListOptions extends DataExpressionMixinOptions, - dxDropDownEditorOptions { + Omit, 'fieldAddons'> { /** * [descr:dxDropDownListOptions.displayValue] */ @@ -27039,6 +27043,10 @@ declare module DevExpress.ui { selectedItem: any, fieldElement: DevExpress.core.DxElement ) => string | DevExpress.core.UserDefinedElement); + /** + * [descr:dxSelectBoxOptions.fieldAddons] + */ + fieldAddons?: FieldAddons; /** * [descr:dxSelectBoxOptions.onCustomItemCreating] */ @@ -32628,6 +32636,30 @@ declare module DevExpress.ui { * [descr:dxFilterBuilderField] */ export type Field = dxFilterBuilderField; + /** + * [descr:FieldAddons] + * @deprecated Attention! This type is for internal purposes only. If you used it previously, please submit a ticket to our {@link https://supportcenter.devexpress.com/ticket/create Support Center}. We will check if there is an alternative solution. + */ + export type FieldAddons = { + /** + * [descr:FieldAddons.beforeTemplate] + */ + beforeTemplate?: + | template + | (( + data: any, + element: DevExpress.core.DxElement + ) => string | DevExpress.core.UserDefinedElement); + /** + * [descr:FieldAddons.afterTemplate] + */ + afterTemplate?: + | template + | (( + data: any, + element: DevExpress.core.DxElement + ) => string | DevExpress.core.UserDefinedElement); + }; /** * [descr:ui.hideToasts()] */ From d850d901136e8881872dec38f626d0084b439017 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marker=20dao=20=C2=AE?= Date: Tue, 19 Aug 2025 10:55:55 +0200 Subject: [PATCH 020/101] Toast: Improve typing (#30779) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: marker dao ® --- .../core/utils/m_public_component.ts | 2 +- .../__internal/core/widget/dom_component.ts | 8 +- .../js/__internal/core/widget/widget.ts | 27 ++-- .../js/__internal/ui/chat/messagelist.ts | 2 +- .../devextreme/js/__internal/ui/menu/menu.ts | 2 +- .../js/__internal/ui/overlay/overlay.ts | 27 ++-- .../js/__internal/ui/toast/m_hide_toasts.ts | 35 ++-- .../js/__internal/ui/toast/m_toast.ts | 150 +++++++++++------- .../tests/DevExpress.ui/hideToasts.tests.js | 18 ++- 9 files changed, 174 insertions(+), 97 deletions(-) diff --git a/packages/devextreme/js/__internal/core/utils/m_public_component.ts b/packages/devextreme/js/__internal/core/utils/m_public_component.ts index 3501b55626e0..a43883b6796d 100644 --- a/packages/devextreme/js/__internal/core/utils/m_public_component.ts +++ b/packages/devextreme/js/__internal/core/utils/m_public_component.ts @@ -43,7 +43,7 @@ export function attachInstanceToElement($element, componentInstance, disposeFn) data[COMPONENT_NAMES_DATA_KEY].push(name); } -export function getInstanceByElement($element, componentClass) { +export function getInstanceByElement($element, componentClass): T { const name = getName(componentClass); return elementData($element.get(0), name); diff --git a/packages/devextreme/js/__internal/core/widget/dom_component.ts b/packages/devextreme/js/__internal/core/widget/dom_component.ts index 165499881a86..72c3779dd090 100644 --- a/packages/devextreme/js/__internal/core/widget/dom_component.ts +++ b/packages/devextreme/js/__internal/core/widget/dom_component.ts @@ -60,11 +60,9 @@ class DOMComponent< // eslint-disable-next-line @typescript-eslint/no-explicit-any _templateManager!: any; - // eslint-disable-next-line @stylistic/max-len - // eslint-disable-next-line @typescript-eslint/explicit-function-return-type, @typescript-eslint/explicit-module-boundary-types - static getInstance(element: Element | dxElementWrapper) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-return - return getInstanceByElement($(element), this); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + static getInstance(element: Element | dxElementWrapper): T { + return getInstanceByElement($(element), this); } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types diff --git a/packages/devextreme/js/__internal/core/widget/widget.ts b/packages/devextreme/js/__internal/core/widget/widget.ts index 4d3511dc3f9a..34ea6437b89c 100644 --- a/packages/devextreme/js/__internal/core/widget/widget.ts +++ b/packages/devextreme/js/__internal/core/widget/widget.ts @@ -5,6 +5,7 @@ import '@js/common/core/events/hover'; import { active, focus, hover, keyboard, } from '@js/common/core/events/short'; +import type { DeepPartial } from '@js/core'; import Action from '@js/core/action'; import devices from '@js/core/devices'; import type { DefaultOptionsRule } from '@js/core/options/utils'; @@ -124,18 +125,22 @@ class Widget< } _defaultOptionsRules(): DefaultOptionsRule[] { - return super._defaultOptionsRules().concat([{ - device(): boolean { - const device = devices.real(); - const { platform } = device; - const { version } = device; - return platform === 'ios' && compareVersions(version, '13.3') <= 0; - }, - // @ts-expect-error - options: { - useResizeObserver: false, + const rules = [ + ...super._defaultOptionsRules(), + { + device(): boolean { + const device = devices.real(); + const { platform } = device; + const { version } = device; + return platform === 'ios' && compareVersions(version, '13.3') <= 0; + }, + options: { + useResizeObserver: false, + } as DeepPartial, }, - }]); + ]; + + return rules; } _init(): void { diff --git a/packages/devextreme/js/__internal/ui/chat/messagelist.ts b/packages/devextreme/js/__internal/ui/chat/messagelist.ts index 5692e4186a3c..dcd407ae2852 100644 --- a/packages/devextreme/js/__internal/ui/chat/messagelist.ts +++ b/packages/devextreme/js/__internal/ui/chat/messagelist.ts @@ -527,7 +527,7 @@ class MessageList extends Widget { const $lastMessageGroup = this._$content.find(`.${CHAT_MESSAGEGROUP_CLASS}`).last(); if ($lastMessageGroup.length) { - return MessageGroup.getInstance($lastMessageGroup) as MessageGroup; + return MessageGroup.getInstance($lastMessageGroup); } return undefined; diff --git a/packages/devextreme/js/__internal/ui/menu/menu.ts b/packages/devextreme/js/__internal/ui/menu/menu.ts index 332187b47954..915d86c10a17 100644 --- a/packages/devextreme/js/__internal/ui/menu/menu.ts +++ b/packages/devextreme/js/__internal/ui/menu/menu.ts @@ -956,7 +956,7 @@ class Menu extends MenuBase { return undefined; } - return Submenu.getInstance($submenu) as Submenu; + return Submenu.getInstance($submenu); } getSubmenuPosition($rootItem: dxElementWrapper): PositionConfig { diff --git a/packages/devextreme/js/__internal/ui/overlay/overlay.ts b/packages/devextreme/js/__internal/ui/overlay/overlay.ts index 9453ede821e5..7d610484fe34 100644 --- a/packages/devextreme/js/__internal/ui/overlay/overlay.ts +++ b/packages/devextreme/js/__internal/ui/overlay/overlay.ts @@ -10,6 +10,7 @@ import pointerEvents from '@js/common/core/events/pointer'; import { keyboard } from '@js/common/core/events/short'; import { addNamespace, isCommandKeyPressed, normalizeKeyName } from '@js/common/core/events/utils'; import { triggerHidingEvent, triggerResizeEvent, triggerShownEvent } from '@js/common/core/events/visibility_change'; +import type { DeepPartial } from '@js/core'; import registerComponent from '@js/core/component_registrator'; import devices from '@js/core/devices'; import domAdapter from '@js/core/dom_adapter'; @@ -301,18 +302,22 @@ class Overlay< } _defaultOptionsRules(): DefaultOptionsRule[] { - return super._defaultOptionsRules().concat([{ - device(): boolean { - return !windowUtils.hasWindow(); - }, - // @ts-expect-error overload - options: { - width: null, - height: null, - animation: null, - _checkParentVisibility: false, + const rules = [ + ...super._defaultOptionsRules(), + { + device(): boolean { + return !windowUtils.hasWindow(); + }, + options: { + width: null, + height: null, + animation: null, + _checkParentVisibility: false, + } as DeepPartial, }, - }]); + ]; + + return rules; } _setOptionsByReference(): void { diff --git a/packages/devextreme/js/__internal/ui/toast/m_hide_toasts.ts b/packages/devextreme/js/__internal/ui/toast/m_hide_toasts.ts index 338a6112d5bd..00b70b1813fa 100644 --- a/packages/devextreme/js/__internal/ui/toast/m_hide_toasts.ts +++ b/packages/devextreme/js/__internal/ui/toast/m_hide_toasts.ts @@ -1,27 +1,42 @@ +import type { dxElementWrapper } from '@js/core/renderer'; import $ from '@js/core/renderer'; +import Toast, { TOAST_CLASS } from '@ts/ui/toast/m_toast'; -const TOAST_CLASS = 'dx-toast'; - -function hideAllToasts(container): void { +function hideToasts(container?: Element | dxElementWrapper): void { const toasts = $(`.${TOAST_CLASS}`).toArray(); - if (!arguments.length) { - // @ts-expect-error - toasts.forEach((toast) => { $(toast).dxToast('hide'); }); + + if (arguments.length === 0) { + toasts.forEach((toast) => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + Toast.getInstance(toast).hide(); + }); + + return; + } + + if (!container) { return; } const containerElement = $(container).get(0); toasts - // @ts-expect-error - .map((toast) => $(toast).dxToast('instance')) + .map((toast): Toast => { + const instance = Toast.getInstance(toast); + + return instance; + }) .filter((instance) => { - const toastContainerElement = $(instance.option('container')).get(0); + const { container: toastContainer } = instance.option(); + + const toastContainerElement = $(toastContainer).get(0); + return containerElement === toastContainerElement && containerElement; }) .forEach((instance) => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises instance.hide(); }); } -export default hideAllToasts; +export default hideToasts; diff --git a/packages/devextreme/js/__internal/ui/toast/m_toast.ts b/packages/devextreme/js/__internal/ui/toast/m_toast.ts index c4756176bf36..58da41491adc 100644 --- a/packages/devextreme/js/__internal/ui/toast/m_toast.ts +++ b/packages/devextreme/js/__internal/ui/toast/m_toast.ts @@ -1,32 +1,33 @@ +import type { PositionAlignment } from '@js/common'; import eventsEngine from '@js/common/core/events/core/events_engine'; import pointerEvents from '@js/common/core/events/pointer'; +import type { DeepPartial } from '@js/core'; import registerComponent from '@js/core/component_registrator'; import domAdapter from '@js/core/dom_adapter'; import type { DefaultOptionsRule } from '@js/core/options/utils'; import type { dxElementWrapper } from '@js/core/renderer'; import $ from '@js/core/renderer'; import type { DeferredObj } from '@js/core/utils/deferred'; -import { extend } from '@js/core/utils/extend'; import readyCallbacks from '@js/core/utils/ready_callbacks'; import { isString } from '@js/core/utils/type'; import Overlay from '@js/ui/overlay/ui.overlay'; -import { isMaterialBased } from '@js/ui/themes'; +import { current, isMaterialBased } from '@js/ui/themes'; import type { Properties } from '@js/ui/toast'; import type { OptionChanged } from '@ts/core/widget/types'; +import type { OverlayProperties, PointerLikeEvent } from '@ts/ui/overlay/overlay'; const ready = readyCallbacks.add; -const TOAST_CLASS = 'dx-toast'; -const TOAST_CLASS_PREFIX = `${TOAST_CLASS}-`; -const TOAST_WRAPPER_CLASS = `${TOAST_CLASS_PREFIX}wrapper`; -const TOAST_CONTENT_CLASS = `${TOAST_CLASS_PREFIX}content`; -const TOAST_MESSAGE_CLASS = `${TOAST_CLASS_PREFIX}message`; -const TOAST_ICON_CLASS = `${TOAST_CLASS_PREFIX}icon`; +export const TOAST_CLASS = 'dx-toast'; +const TOAST_WRAPPER_CLASS = 'dx-toast-wrapper'; +const TOAST_CONTENT_CLASS = 'dx-toast-content'; +const TOAST_MESSAGE_CLASS = 'dx-toast-message'; +const TOAST_ICON_CLASS = 'dx-toast-icon'; const WIDGET_NAME = 'dxToast'; const toastTypes = ['info', 'warning', 'error', 'success']; -const TOAST_STACK = []; +const TOAST_STACK: Toast[] = []; const FIRST_Z_INDEX_OFFSET = 8000; const POSITION_ALIASES = { @@ -51,24 +52,34 @@ const DEFAULT_BOUNDARY_OFFSET = { h: 0, v: 0 }; const DEFAULT_MARGIN = 20; ready(() => { - // @ts-expect-error ts-error - eventsEngine.subscribeGlobal(domAdapter.getDocument(), pointerEvents.down, (e) => { - for (let i = TOAST_STACK.length - 1; i >= 0; i--) { - // @ts-expect-error ts-error - if (!TOAST_STACK[i]._proxiedDocumentDownHandler(e)) { + const element = domAdapter.getDocument(); + + const callback = (e: PointerLikeEvent): void => { + for (let i = TOAST_STACK.length - 1; i >= 0; i -= 1) { + if (!TOAST_STACK[i]._proxiedDocumentDownHandler?.(e)) { return; } } - }); + }; + + // @ts-expect-error subscribeGlobal should be described in .d.ts + eventsEngine.subscribeGlobal( + element, + pointerEvents.down, + callback, + ); }); -interface ToastProperties extends Properties {} +interface ToastProperties extends Properties { + container: OverlayProperties['container']; +} class Toast< -TProperties extends ToastProperties = ToastProperties, + TProperties extends ToastProperties = ToastProperties, > extends Overlay { _message?: dxElementWrapper; + // eslint-disable-next-line no-restricted-globals _hideTimeout?: ReturnType; _getDefaultOptions(): TProperties { @@ -118,13 +129,12 @@ TProperties extends ToastProperties = ToastProperties, }; const tabletAndMobileCommonOptions = { - // @ts-expect-error ts-error - displayTime: isMaterialBased() ? 4000 : 2000, + displayTime: isMaterialBased(current()) ? 4000 : 2000, hideOnOutsideClick: true, animation: tabletAndMobileAnimation, }; - // @ts-expect-error ts-error - return super._defaultOptionsRules().concat([ + + const toastRules: DefaultOptionsRule[] = [ { device(device): boolean { return device.deviceType === 'phone'; @@ -132,7 +142,7 @@ TProperties extends ToastProperties = ToastProperties, options: { width: `calc(100vw - ${DEFAULT_MARGIN * 2}px)`, ...tabletAndMobileCommonOptions, - }, + } as DeepPartial, }, { device(device): boolean { @@ -142,20 +152,26 @@ TProperties extends ToastProperties = ToastProperties, width: 'auto', maxWidth: '80vw', ...tabletAndMobileCommonOptions, - }, + } as DeepPartial, }, { device(device): boolean { - // @ts-expect-error ts-error - return isMaterialBased() && device.deviceType === 'desktop'; + return isMaterialBased(current()) && device.deviceType === 'desktop'; }, options: { minWidth: 344, maxWidth: 568, displayTime: 4000, - }, + } as DeepPartial, }, - ]); + ]; + + const rules = [ + ...super._defaultOptionsRules(), + ...toastRules, + ]; + + return rules; } _init(): void { @@ -164,23 +180,21 @@ TProperties extends ToastProperties = ToastProperties, this._posStringToObject(); } - // @ts-expect-error ts-error - _renderContentImpl() { + _renderContentImpl(): Promise { const { message, type } = this.option(); this._message = $('

') .addClass(TOAST_MESSAGE_CLASS) - // @ts-expect-error ts-error - .text(message) + .text(message ?? '') .appendTo(this.$content()); this.setAria('role', 'alert', this._message); - // @ts-expect-error ts-error - if (toastTypes.includes(type.toLowerCase())) { + + if (type && toastTypes.includes(type.toLowerCase())) { this.$content().prepend($('
').addClass(TOAST_ICON_CLASS)); } - super._renderContentImpl(); + return super._renderContentImpl(); } _render(): void { @@ -190,56 +204,83 @@ TProperties extends ToastProperties = ToastProperties, this.$wrapper().addClass(TOAST_WRAPPER_CLASS); const { type } = this.option(); - this.$content().addClass(TOAST_CLASS_PREFIX + String(type).toLowerCase()); + + if (type) { + this.$content().addClass(`${TOAST_CLASS}-${type.toLowerCase()}`); + } + this.$content().addClass(TOAST_CONTENT_CLASS); this._toggleCloseEvents('Swipe'); this._toggleCloseEvents('Click'); } - _toggleCloseEvents(event): void { + _toggleCloseEvents(event: 'Swipe' | 'Click'): void { const dxEvent = `dx${event.toLowerCase()}`; eventsEngine.off(this.$content(), dxEvent); - this.option(`closeOn${event}`) && eventsEngine.on(this.$content(), dxEvent, this.hide.bind(this)); + + const optionName = `closeOn${event}`; + const optionValue = this.option(optionName); + + if (optionValue) { + eventsEngine.on(this.$content(), dxEvent, this.hide.bind(this)); + } } _posStringToObject(): void { const { position } = this.option(); - if (!isString(position)) return; + if (!isString(position)) { + return; + } const verticalPosition = position.split(' ')[0]; const horizontalPosition = position.split(' ')[1]; - this.option('position', extend({ boundaryOffset: DEFAULT_BOUNDARY_OFFSET }, POSITION_ALIASES[verticalPosition])); + const newPosition = { + boundaryOffset: DEFAULT_BOUNDARY_OFFSET, + ...POSITION_ALIASES[verticalPosition], + }; + + this.option('position', newPosition); - // eslint-disable-next-line default-case switch (horizontalPosition) { case 'center': case 'left': - case 'right': - // @ts-expect-error ts-error - this.option('position').at += ` ${horizontalPosition}`; - // @ts-expect-error ts-error - this.option('position').my += ` ${horizontalPosition}`; + case 'right': { + if (newPosition && typeof newPosition === 'object') { + const at = `${newPosition.at as PositionAlignment} ${horizontalPosition}`; + const my = `${newPosition.my as PositionAlignment} ${horizontalPosition}`; + + this.option('position.at', at); + this.option('position.my', my); + } + break; + } + default: break; } } - _show(): DeferredObj { - // @ts-expect-error ts-error - return super._show.apply(this, arguments).always(() => { + _show(): DeferredObj | Promise { + const callback = (): void => { clearTimeout(this._hideTimeout); const { displayTime } = this.option(); - // eslint-disable-next-line @typescript-eslint/no-misused-promises + // eslint-disable-next-line @typescript-eslint/no-misused-promises, no-restricted-globals this._hideTimeout = setTimeout(this.hide.bind(this), displayTime); - }); + }; + + const promise = super._show() as DeferredObj; + + promise.always(callback); + + return promise; } - // @ts-expect-error ts-error + // @ts-expect-error Violation of the Principle of Liskov Substitutability // eslint-disable-next-line class-methods-use-this _overlayStack(): Toast[] { return TOAST_STACK; @@ -259,8 +300,11 @@ TProperties extends ToastProperties = ToastProperties, switch (name) { case 'type': - this.$content().removeClass(TOAST_CLASS_PREFIX + previousValue); - this.$content().addClass(TOAST_CLASS_PREFIX + String(value).toLowerCase()); + this.$content().removeClass(`${TOAST_CLASS}-${previousValue}`); + + if (value) { + this.$content().addClass(`${TOAST_CLASS}-${String(value).toLowerCase()}`); + } break; case 'message': if (this._message) { diff --git a/packages/devextreme/testing/tests/DevExpress.ui/hideToasts.tests.js b/packages/devextreme/testing/tests/DevExpress.ui/hideToasts.tests.js index 86cb76ca9d2b..879cd96ba151 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui/hideToasts.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui/hideToasts.tests.js @@ -68,11 +68,21 @@ QUnit.module('hideToasts', { assert.equal(this.getToastCount(), 1); }); - QUnit.test('with unexisted element parameter hides nothing', function(assert) { - assert.equal(this.getToastCount(), 2); + QUnit.test('with non-existent element parameter hides nothing', function(assert) { + assert.strictEqual(this.getToastCount(), 2); - hideToasts($('#containerr').get(0)); + const undefinedElement = $('#containerr').get(0); - assert.equal(this.getToastCount(), 2); + hideToasts(undefinedElement); + + assert.strictEqual(this.getToastCount(), 2, 'nothing has been hidden'); + }); + + QUnit.test('with empty jquery element parameter hides nothing', function(assert) { + assert.strictEqual(this.getToastCount(), 2); + + hideToasts($()); + + assert.strictEqual(this.getToastCount(), 2, 'nothing has been hidden'); }); }); From 76681c4c3085ae8d440ab912c6c6572185299a60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marker=20dao=20=C2=AE?= Date: Tue, 19 Aug 2025 13:05:46 +0200 Subject: [PATCH 021/101] Overlays: Remove m_ prefix (#30797) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: marker dao ® --- .github/CODEOWNERS | 2 +- .../{m_swatch_container.ts => swatch_container.ts} | 2 +- .../js/__internal/filter_builder/m_filter_builder.ts | 2 +- .../m_columns_resizing_reordering.ts | 2 +- .../__internal/grids/pivot_grid/sortable/m_sortable.ts | 2 +- .../js/__internal/ui/{m_dialog.ts => dialog.ts} | 0 .../__internal/ui/{m_load_panel.ts => load_panel.ts} | 0 .../devextreme/js/__internal/ui/m_drop_down_box.ts | 2 +- packages/devextreme/js/__internal/ui/menu/menu.ts | 2 +- .../js/__internal/ui/{m_notify.ts => notify.ts} | 0 .../devextreme/js/__internal/ui/overlay/overlay.ts | 4 ++-- ...on_controller.ts => overlay_position_controller.ts} | 3 +-- .../js/__internal/ui/overlay/{m_utils.ts => utils.ts} | 0 .../devextreme/js/__internal/ui/popover/m_popover.ts | 4 ++-- ...on_controller.ts => popover_position_controller.ts} | 9 +++------ packages/devextreme/js/__internal/ui/popup/m_popup.ts | 10 +++++----- ...tion_controller.ts => popup_position_controller.ts} | 4 ++-- .../js/__internal/ui/scroll_view/scroll_view.ts | 2 +- .../js/__internal/ui/slider/m_slider_tooltip.ts | 3 +-- ...roller.ts => slider_tooltip_position_controller.ts} | 5 ++--- .../ui/speed_dial_action/m_speed_dial_action.ts | 2 +- .../ui/speed_dial_action/m_speed_dial_main_item.ts | 2 +- .../ui/toast/{m_hide_toasts.ts => hide_toasts.ts} | 2 +- .../js/__internal/ui/toast/{m_toast.ts => toast.ts} | 0 packages/devextreme/js/ui/dialog.js | 2 +- packages/devextreme/js/ui/load_panel.js | 2 +- packages/devextreme/js/ui/notify.js | 2 +- packages/devextreme/js/ui/toast.js | 2 +- packages/devextreme/js/ui/toast/hide_toasts.js | 2 +- .../tests/DevExpress.ui.widgets/overlay.tests.js | 2 +- .../tests/DevExpress.ui.widgets/popupDrag.tests.js | 2 +- 31 files changed, 36 insertions(+), 42 deletions(-) rename packages/devextreme/js/__internal/core/utils/{m_swatch_container.ts => swatch_container.ts} (94%) rename packages/devextreme/js/__internal/ui/{m_dialog.ts => dialog.ts} (100%) rename packages/devextreme/js/__internal/ui/{m_load_panel.ts => load_panel.ts} (100%) rename packages/devextreme/js/__internal/ui/{m_notify.ts => notify.ts} (100%) rename packages/devextreme/js/__internal/ui/overlay/{m_overlay_position_controller.ts => overlay_position_controller.ts} (98%) rename packages/devextreme/js/__internal/ui/overlay/{m_utils.ts => utils.ts} (100%) rename packages/devextreme/js/__internal/ui/popover/{m_popover_position_controller.ts => popover_position_controller.ts} (94%) rename packages/devextreme/js/__internal/ui/popup/{m_popup_position_controller.ts => popup_position_controller.ts} (97%) rename packages/devextreme/js/__internal/ui/slider/{m_slider_tooltip_position_controller.ts => slider_tooltip_position_controller.ts} (94%) rename packages/devextreme/js/__internal/ui/toast/{m_hide_toasts.ts => hide_toasts.ts} (94%) rename packages/devextreme/js/__internal/ui/toast/{m_toast.ts => toast.ts} (100%) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 6f9ad4bfd6f6..d41b13a735b9 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -786,7 +786,7 @@ /packages/devextreme/js/ui/load_panel.d.ts @DevExpress/devextreme-editors @DevExpress/devextreme-apireviewers /packages/devextreme/js/ui/load_panel_types.d.ts @DevExpress/devextreme-editors @DevExpress/devextreme-apireviewers -/packages/devextreme/js/__internal/ui/m_load_panel.ts @DevExpress/devextreme-editors +/packages/devextreme/js/__internal/ui/load_panel.ts @DevExpress/devextreme-editors /packages/devextreme-scss/scss/widgets/base/_loadPanel.scss @DevExpress/devextreme-editors /packages/devextreme-scss/scss/widgets/**/loadPanel/** @DevExpress/devextreme-editors diff --git a/packages/devextreme/js/__internal/core/utils/m_swatch_container.ts b/packages/devextreme/js/__internal/core/utils/swatch_container.ts similarity index 94% rename from packages/devextreme/js/__internal/core/utils/m_swatch_container.ts rename to packages/devextreme/js/__internal/core/utils/swatch_container.ts index 2c7ff8b3c7b5..c426d0b9050d 100644 --- a/packages/devextreme/js/__internal/core/utils/m_swatch_container.ts +++ b/packages/devextreme/js/__internal/core/utils/swatch_container.ts @@ -26,4 +26,4 @@ const getSwatchContainer = ( return viewportSwatchContainer; }; -export default { getSwatchContainer: getSwatchContainer }; +export default { getSwatchContainer }; diff --git a/packages/devextreme/js/__internal/filter_builder/m_filter_builder.ts b/packages/devextreme/js/__internal/filter_builder/m_filter_builder.ts index dba4b049c603..7b004e4b7663 100644 --- a/packages/devextreme/js/__internal/filter_builder/m_filter_builder.ts +++ b/packages/devextreme/js/__internal/filter_builder/m_filter_builder.ts @@ -13,7 +13,7 @@ import Popup from '@js/ui/popup/ui.popup'; import EditorFactoryMixin from '@js/ui/shared/ui.editor_factory_mixin'; import TreeView from '@js/ui/tree_view'; import Widget from '@js/ui/widget/ui.widget'; -import { getElementMaxHeightByWindow } from '@ts/ui/overlay/m_utils'; +import { getElementMaxHeightByWindow } from '@ts/ui/overlay/utils'; import { addItem, convertToInnerStructure, diff --git a/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.ts b/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.ts index 7dbc2e46eec1..0648dd29b8b5 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.ts @@ -20,7 +20,7 @@ import { setHeight, setWidth, } from '@js/core/utils/size'; import { isDefined, isObject, isString } from '@js/core/utils/type'; -import swatchContainer from '@ts/core/utils/m_swatch_container'; +import swatchContainer from '@ts/core/utils/swatch_container'; import type { EditorFactory } from '@ts/grids/grid_core/editor_factory/m_editor_factory'; import type { ColumnPoint, ModuleType } from '@ts/grids/grid_core/m_types'; import type { RowsView } from '@ts/grids/grid_core/views/m_rows_view'; diff --git a/packages/devextreme/js/__internal/grids/pivot_grid/sortable/m_sortable.ts b/packages/devextreme/js/__internal/grids/pivot_grid/sortable/m_sortable.ts index 7971e5e23826..2f50197ca186 100644 --- a/packages/devextreme/js/__internal/grids/pivot_grid/sortable/m_sortable.ts +++ b/packages/devextreme/js/__internal/grids/pivot_grid/sortable/m_sortable.ts @@ -19,7 +19,7 @@ import { setWidth, } from '@js/core/utils/size'; import { isDefined } from '@js/core/utils/type'; -import swatchContainer from '@ts/core/utils/m_swatch_container'; +import swatchContainer from '@ts/core/utils/swatch_container'; const { getSwatchContainer } = swatchContainer; diff --git a/packages/devextreme/js/__internal/ui/m_dialog.ts b/packages/devextreme/js/__internal/ui/dialog.ts similarity index 100% rename from packages/devextreme/js/__internal/ui/m_dialog.ts rename to packages/devextreme/js/__internal/ui/dialog.ts diff --git a/packages/devextreme/js/__internal/ui/m_load_panel.ts b/packages/devextreme/js/__internal/ui/load_panel.ts similarity index 100% rename from packages/devextreme/js/__internal/ui/m_load_panel.ts rename to packages/devextreme/js/__internal/ui/load_panel.ts diff --git a/packages/devextreme/js/__internal/ui/m_drop_down_box.ts b/packages/devextreme/js/__internal/ui/m_drop_down_box.ts index a6386a34a722..b43c87c2c14c 100644 --- a/packages/devextreme/js/__internal/ui/m_drop_down_box.ts +++ b/packages/devextreme/js/__internal/ui/m_drop_down_box.ts @@ -19,7 +19,7 @@ import DataExpressionMixin from '@js/ui/editor/ui.data_expression'; import type { Properties as PopupProperties } from '@js/ui/popup'; import { tabbable } from '@ts/core/utils/m_selectors'; import DropDownEditor from '@ts/ui/drop_down_editor/m_drop_down_editor'; -import { getElementMaxHeightByWindow } from '@ts/ui/overlay/m_utils'; +import { getElementMaxHeightByWindow } from '@ts/ui/overlay/utils'; const { getActiveElement } = domAdapter; diff --git a/packages/devextreme/js/__internal/ui/menu/menu.ts b/packages/devextreme/js/__internal/ui/menu/menu.ts index 915d86c10a17..b96330148809 100644 --- a/packages/devextreme/js/__internal/ui/menu/menu.ts +++ b/packages/devextreme/js/__internal/ui/menu/menu.ts @@ -46,7 +46,7 @@ import type { } from '@ts/ui/context_menu/menu_base'; import MenuBase from '@ts/ui/context_menu/menu_base'; import type { InternalNode } from '@ts/ui/hierarchical_collection/data_converter'; -import { getElementMaxHeightByWindow } from '@ts/ui/overlay/m_utils'; +import { getElementMaxHeightByWindow } from '@ts/ui/overlay/utils'; import type { TreeViewBaseProperties } from '@ts/ui/tree_view/tree_view.base'; import type { SubmenuProperties } from './submenu'; diff --git a/packages/devextreme/js/__internal/ui/m_notify.ts b/packages/devextreme/js/__internal/ui/notify.ts similarity index 100% rename from packages/devextreme/js/__internal/ui/m_notify.ts rename to packages/devextreme/js/__internal/ui/notify.ts diff --git a/packages/devextreme/js/__internal/ui/overlay/overlay.ts b/packages/devextreme/js/__internal/ui/overlay/overlay.ts index 7d610484fe34..d775d8403233 100644 --- a/packages/devextreme/js/__internal/ui/overlay/overlay.ts +++ b/packages/devextreme/js/__internal/ui/overlay/overlay.ts @@ -46,11 +46,11 @@ import type { ControllerOverlayElements, ControllerProperties, PositionControllerConstructor, -} from '@ts/ui/overlay/m_overlay_position_controller'; +} from '@ts/ui/overlay/overlay_position_controller'; import { OVERLAY_POSITION_ALIASES, OverlayPositionController, -} from '@ts/ui/overlay/m_overlay_position_controller'; +} from '@ts/ui/overlay/overlay_position_controller'; import * as zIndexPool from '@ts/ui/overlay/z_index'; const ready = readyCallbacks.add; diff --git a/packages/devextreme/js/__internal/ui/overlay/m_overlay_position_controller.ts b/packages/devextreme/js/__internal/ui/overlay/overlay_position_controller.ts similarity index 98% rename from packages/devextreme/js/__internal/ui/overlay/m_overlay_position_controller.ts rename to packages/devextreme/js/__internal/ui/overlay/overlay_position_controller.ts index 2b3452758090..d103cfb4d87c 100644 --- a/packages/devextreme/js/__internal/ui/overlay/m_overlay_position_controller.ts +++ b/packages/devextreme/js/__internal/ui/overlay/overlay_position_controller.ts @@ -10,7 +10,7 @@ import { isString, isWindow, } from '@js/core/utils/type'; -import swatch from '@ts/core/utils/m_swatch_container'; +import swatch from '@ts/core/utils/swatch_container'; import type { OverlayActions, OverlayProperties, @@ -374,7 +374,6 @@ export class OverlayPositionController< return defaultConfiguration; } - // eslint-disable-next-line class-methods-use-this _positionToObject(position: TPosition): OverlayPosition { if (isPositionAlignment(position)) { const configuration: OverlayPosition = { diff --git a/packages/devextreme/js/__internal/ui/overlay/m_utils.ts b/packages/devextreme/js/__internal/ui/overlay/utils.ts similarity index 100% rename from packages/devextreme/js/__internal/ui/overlay/m_utils.ts rename to packages/devextreme/js/__internal/ui/overlay/utils.ts diff --git a/packages/devextreme/js/__internal/ui/popover/m_popover.ts b/packages/devextreme/js/__internal/ui/popover/m_popover.ts index e3d847c2d0dd..0b683bb5b9bc 100644 --- a/packages/devextreme/js/__internal/ui/popover/m_popover.ts +++ b/packages/devextreme/js/__internal/ui/popover/m_popover.ts @@ -26,11 +26,11 @@ import type { PopoverControllerElements, PopoverControllerProperties, PopoverPositionControllerConstructor, -} from './m_popover_position_controller'; +} from './popover_position_controller'; import { POPOVER_POSITION_ALIASES, PopoverPositionController, -} from './m_popover_position_controller'; +} from './popover_position_controller'; // STYLE popover diff --git a/packages/devextreme/js/__internal/ui/popover/m_popover_position_controller.ts b/packages/devextreme/js/__internal/ui/popover/popover_position_controller.ts similarity index 94% rename from packages/devextreme/js/__internal/ui/popover/m_popover_position_controller.ts rename to packages/devextreme/js/__internal/ui/popover/popover_position_controller.ts index 2b3cbcdbaf8e..db8f2ab3d4c8 100644 --- a/packages/devextreme/js/__internal/ui/popover/m_popover_position_controller.ts +++ b/packages/devextreme/js/__internal/ui/popover/popover_position_controller.ts @@ -9,13 +9,13 @@ import { isDefined, isString } from '@js/core/utils/type'; import type { ControllerOverlayElements, OverlayPosition, -} from '@ts/ui/overlay/m_overlay_position_controller'; -import { OverlayPositionController } from '@ts/ui/overlay/m_overlay_position_controller'; +} from '@ts/ui/overlay/overlay_position_controller'; +import { OverlayPositionController } from '@ts/ui/overlay/overlay_position_controller'; import type { PopoverProperties } from '@ts/ui/popover/m_popover'; import type { PopupControllerProperties, PopupPositionControllerConstructor, -} from '@ts/ui/popup/m_popup_position_controller'; +} from '@ts/ui/popup/popup_position_controller'; import { borderWidthStyles } from '@ts/ui/resizable/utils'; export interface PopoverControllerElements extends ControllerOverlayElements { @@ -124,7 +124,6 @@ export class PopoverPositionController< this.updatePosition(this._properties.position); } - // eslint-disable-next-line class-methods-use-this _renderBoundaryOffset(): void {} _getContainerPosition(): PopoverPosition { @@ -184,7 +183,6 @@ export class PopoverPositionController< return side === 'left' || side === 'right'; } - // eslint-disable-next-line class-methods-use-this _getDisplaySide(position: PopoverPosition): CommonPosition { const my = positionUtils.setup.normalizeAlign(position.my); const at = positionUtils.setup.normalizeAlign(position.at); @@ -220,7 +218,6 @@ export class PopoverPositionController< return resultPosition; } - // eslint-disable-next-line class-methods-use-this _positionToObject(position: TPosition): PopoverPosition { if (isCommonPosition(position)) { const configuration = { diff --git a/packages/devextreme/js/__internal/ui/popup/m_popup.ts b/packages/devextreme/js/__internal/ui/popup/m_popup.ts index bb90b9dc3314..d61702a5a0d2 100644 --- a/packages/devextreme/js/__internal/ui/popup/m_popup.ts +++ b/packages/devextreme/js/__internal/ui/popup/m_popup.ts @@ -44,12 +44,12 @@ import type Toolbar from '@js/ui/toolbar'; import windowUtils from '@ts/core/utils/m_window'; import type { OptionChanged } from '@ts/core/widget/types'; import type { SupportedKeys } from '@ts/core/widget/widget'; +import type { GeometryOptions, OverlayActions } from '@ts/ui/overlay/overlay'; +import Overlay from '@ts/ui/overlay/overlay'; import type { ControllerOverlayElements, ControllerProperties, -} from '@ts/ui/overlay/m_overlay_position_controller'; -import type { GeometryOptions, OverlayActions } from '@ts/ui/overlay/overlay'; -import Overlay from '@ts/ui/overlay/overlay'; +} from '@ts/ui/overlay/overlay_position_controller'; import * as zIndexPool from '@ts/ui/overlay/z_index'; import { TOOLBAR_CLASS } from '@ts/ui/toolbar/constants'; import type { ToolbarBaseProperties } from '@ts/ui/toolbar/toolbar.base'; @@ -60,8 +60,8 @@ import { createBodyOverflowManager } from './m_popup_overflow_manager'; import type { PopupControllerProperties, PopupPositionControllerConstructor, -} from './m_popup_position_controller'; -import { PopupPositionController } from './m_popup_position_controller'; +} from './popup_position_controller'; +import { PopupPositionController } from './popup_position_controller'; // STYLE popup diff --git a/packages/devextreme/js/__internal/ui/popup/m_popup_position_controller.ts b/packages/devextreme/js/__internal/ui/popup/popup_position_controller.ts similarity index 97% rename from packages/devextreme/js/__internal/ui/popup/m_popup_position_controller.ts rename to packages/devextreme/js/__internal/ui/popup/popup_position_controller.ts index 875caf072a74..a1cd2b5eae4b 100644 --- a/packages/devextreme/js/__internal/ui/popup/m_popup_position_controller.ts +++ b/packages/devextreme/js/__internal/ui/popup/popup_position_controller.ts @@ -8,8 +8,8 @@ import type { OverlayPosition, Position, PositionControllerConstructor, -} from '@ts/ui/overlay/m_overlay_position_controller'; -import { OverlayPositionController } from '@ts/ui/overlay/m_overlay_position_controller'; +} from '@ts/ui/overlay/overlay_position_controller'; +import { OverlayPositionController } from '@ts/ui/overlay/overlay_position_controller'; import type { PopupProperties } from '@ts/ui/popup/m_popup'; import windowUtils from '../../core/utils/m_window'; diff --git a/packages/devextreme/js/__internal/ui/scroll_view/scroll_view.ts b/packages/devextreme/js/__internal/ui/scroll_view/scroll_view.ts index 61f5db8f13c9..96937d0cf73e 100644 --- a/packages/devextreme/js/__internal/ui/scroll_view/scroll_view.ts +++ b/packages/devextreme/js/__internal/ui/scroll_view/scroll_view.ts @@ -11,7 +11,7 @@ import LoadIndicator from '@js/ui/load_indicator'; import type { Properties } from '@js/ui/scroll_view'; import { current, isMaterialBased } from '@js/ui/themes'; import type { OptionChanged } from '@ts/core/widget/types'; -import LoadPanel from '@ts/ui/m_load_panel'; +import LoadPanel from '@ts/ui/load_panel'; import PullDownStrategy from '@ts/ui/scroll_view/scroll_view.native.pull_down'; import SwipeDownStrategy from '@ts/ui/scroll_view/scroll_view.native.swipe_down'; import SimulatedStrategy from '@ts/ui/scroll_view/scroll_view.simulated'; diff --git a/packages/devextreme/js/__internal/ui/slider/m_slider_tooltip.ts b/packages/devextreme/js/__internal/ui/slider/m_slider_tooltip.ts index 680de861a0fa..065a652dbd91 100644 --- a/packages/devextreme/js/__internal/ui/slider/m_slider_tooltip.ts +++ b/packages/devextreme/js/__internal/ui/slider/m_slider_tooltip.ts @@ -5,8 +5,7 @@ import type { Format } from '@js/localization'; import type { OptionChanged } from '@ts/core/widget/types'; import type { TooltipProperties } from '@ts/ui/m_tooltip'; import Tooltip from '@ts/ui/m_tooltip'; - -import { SliderTooltipPositionController } from './m_slider_tooltip_position_controller'; +import { SliderTooltipPositionController } from '@ts/ui/slider/slider_tooltip_position_controller'; // NOTE: Visibility is contolled by the 'visible' option // and 'dx-slider-tooltip-visible-on-hover' class diff --git a/packages/devextreme/js/__internal/ui/slider/m_slider_tooltip_position_controller.ts b/packages/devextreme/js/__internal/ui/slider/slider_tooltip_position_controller.ts similarity index 94% rename from packages/devextreme/js/__internal/ui/slider/m_slider_tooltip_position_controller.ts rename to packages/devextreme/js/__internal/ui/slider/slider_tooltip_position_controller.ts index dccf7f4929eb..a0e0a21ba818 100644 --- a/packages/devextreme/js/__internal/ui/slider/m_slider_tooltip_position_controller.ts +++ b/packages/devextreme/js/__internal/ui/slider/slider_tooltip_position_controller.ts @@ -9,11 +9,11 @@ import type { PopoverControllerElements, PopoverControllerProperties, PopoverPosition, -} from '@ts/ui/popover/m_popover_position_controller'; +} from '@ts/ui/popover/popover_position_controller'; import { isCommonPosition, PopoverPositionController, -} from '@ts/ui/popover/m_popover_position_controller'; +} from '@ts/ui/popover/popover_position_controller'; const SLIDER_CLASS = 'dx-slider'; @@ -92,7 +92,6 @@ export class SliderTooltipPositionController< this._updateVisualPositionValue(); } - // eslint-disable-next-line class-methods-use-this _positionToObject(position: TPosition): PopoverPosition { if (isCommonPosition(position)) { const configuration: PopoverPosition = { diff --git a/packages/devextreme/js/__internal/ui/speed_dial_action/m_speed_dial_action.ts b/packages/devextreme/js/__internal/ui/speed_dial_action/m_speed_dial_action.ts index ba28e08c7929..db190fcc6b08 100644 --- a/packages/devextreme/js/__internal/ui/speed_dial_action/m_speed_dial_action.ts +++ b/packages/devextreme/js/__internal/ui/speed_dial_action/m_speed_dial_action.ts @@ -3,7 +3,7 @@ import Guid from '@js/core/guid'; import { extend } from '@js/core/utils/extend'; import readyCallbacks from '@js/core/utils/ready_callbacks'; import type { Properties } from '@js/ui/speed_dial_action'; -import swatchContainer from '@ts/core/utils/m_swatch_container'; +import swatchContainer from '@ts/core/utils/swatch_container'; import Widget from '@ts/core/widget/widget'; import { disposeAction, initAction } from './m_speed_dial_main_item'; diff --git a/packages/devextreme/js/__internal/ui/speed_dial_action/m_speed_dial_main_item.ts b/packages/devextreme/js/__internal/ui/speed_dial_action/m_speed_dial_main_item.ts index 6da4d66d31ef..5a928c32ad17 100644 --- a/packages/devextreme/js/__internal/ui/speed_dial_action/m_speed_dial_main_item.ts +++ b/packages/devextreme/js/__internal/ui/speed_dial_action/m_speed_dial_main_item.ts @@ -7,7 +7,7 @@ import { extend } from '@js/core/utils/extend'; import { getHeight } from '@js/core/utils/size'; import { isCompact, isFluent, isMaterial } from '@js/ui/themes'; import errors from '@js/ui/widget/ui.errors'; -import swatchContainer from '@ts/core/utils/m_swatch_container'; +import swatchContainer from '@ts/core/utils/swatch_container'; import type { SpeedDialItemProperties } from './m_speed_dial_item'; import SpeedDialItem from './m_speed_dial_item'; diff --git a/packages/devextreme/js/__internal/ui/toast/m_hide_toasts.ts b/packages/devextreme/js/__internal/ui/toast/hide_toasts.ts similarity index 94% rename from packages/devextreme/js/__internal/ui/toast/m_hide_toasts.ts rename to packages/devextreme/js/__internal/ui/toast/hide_toasts.ts index 00b70b1813fa..4ab007d740a5 100644 --- a/packages/devextreme/js/__internal/ui/toast/m_hide_toasts.ts +++ b/packages/devextreme/js/__internal/ui/toast/hide_toasts.ts @@ -1,6 +1,6 @@ import type { dxElementWrapper } from '@js/core/renderer'; import $ from '@js/core/renderer'; -import Toast, { TOAST_CLASS } from '@ts/ui/toast/m_toast'; +import Toast, { TOAST_CLASS } from '@ts/ui/toast/toast'; function hideToasts(container?: Element | dxElementWrapper): void { const toasts = $(`.${TOAST_CLASS}`).toArray(); diff --git a/packages/devextreme/js/__internal/ui/toast/m_toast.ts b/packages/devextreme/js/__internal/ui/toast/toast.ts similarity index 100% rename from packages/devextreme/js/__internal/ui/toast/m_toast.ts rename to packages/devextreme/js/__internal/ui/toast/toast.ts diff --git a/packages/devextreme/js/ui/dialog.js b/packages/devextreme/js/ui/dialog.js index 6599629338aa..a74489f9dd0b 100644 --- a/packages/devextreme/js/ui/dialog.js +++ b/packages/devextreme/js/ui/dialog.js @@ -2,7 +2,7 @@ export { confirm, alert, custom -} from '../__internal/ui/m_dialog'; +} from '../__internal/ui/dialog'; /** * @name ui.dialog diff --git a/packages/devextreme/js/ui/load_panel.js b/packages/devextreme/js/ui/load_panel.js index c8b9e12219d5..92e3fd542f2c 100644 --- a/packages/devextreme/js/ui/load_panel.js +++ b/packages/devextreme/js/ui/load_panel.js @@ -1,4 +1,4 @@ -import LoadPanel from '../__internal/ui/m_load_panel'; +import LoadPanel from '../__internal/ui/load_panel'; export default LoadPanel; diff --git a/packages/devextreme/js/ui/notify.js b/packages/devextreme/js/ui/notify.js index c70b923b4799..103b1a5dfbab 100644 --- a/packages/devextreme/js/ui/notify.js +++ b/packages/devextreme/js/ui/notify.js @@ -1,3 +1,3 @@ -import notify from '../__internal/ui/m_notify'; +import notify from '../__internal/ui/notify'; export default notify; diff --git a/packages/devextreme/js/ui/toast.js b/packages/devextreme/js/ui/toast.js index a9656bfcca4f..4997c07cf1d0 100644 --- a/packages/devextreme/js/ui/toast.js +++ b/packages/devextreme/js/ui/toast.js @@ -1,4 +1,4 @@ -import Toast from '../__internal/ui/toast/m_toast'; +import Toast from '../__internal/ui/toast/toast'; export default Toast; diff --git a/packages/devextreme/js/ui/toast/hide_toasts.js b/packages/devextreme/js/ui/toast/hide_toasts.js index 8f938da87113..b42ca7327a4a 100644 --- a/packages/devextreme/js/ui/toast/hide_toasts.js +++ b/packages/devextreme/js/ui/toast/hide_toasts.js @@ -1,3 +1,3 @@ -import hideToasts from '../../__internal/ui/toast/m_hide_toasts'; +import hideToasts from '../../__internal/ui/toast/hide_toasts'; export default hideToasts; diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/overlay.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/overlay.tests.js index 9201afb19b93..0a48d6381815 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/overlay.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/overlay.tests.js @@ -19,7 +19,7 @@ import Overlay from 'ui/overlay/ui.overlay'; import * as zIndex from '__internal/ui/overlay/z_index'; import 'ui/scroll_view/ui.scrollable'; import selectors from '__internal/core/utils/m_selectors'; -import swatch from '__internal/core/utils/m_swatch_container'; +import swatch from '__internal/core/utils/swatch_container'; import keyboardMock from '../../helpers/keyboardMock.js'; import pointerMock from '../../helpers/pointerMock.js'; import nativePointerMock from '../../helpers/nativePointerMock.js'; diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/popupDrag.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/popupDrag.tests.js index a84def398214..7bb0c754944d 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/popupDrag.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/popupDrag.tests.js @@ -1,7 +1,7 @@ import $ from 'jquery'; import PopupDrag from '__internal/ui/popup/m_popup_drag'; -import { PopupPositionController } from '__internal/ui/popup/m_popup_position_controller'; +import { PopupPositionController } from '__internal/ui/popup/popup_position_controller'; const KEYBOARD_DRAG_STEP = 5; From ba105c5d8e4646e20bff8393fca4f4f056b11d7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marker=20dao=20=C2=AE?= Date: Tue, 19 Aug 2025 14:50:25 +0200 Subject: [PATCH 022/101] DropDownEditor: Deprecate fieldTemplate option in .d.ts (#30727) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: marker dao ® --- packages/devextreme-angular/src/ui/color-box/index.ts | 2 ++ packages/devextreme-angular/src/ui/drop-down-box/index.ts | 2 ++ packages/devextreme-angular/src/ui/select-box/index.ts | 2 ++ packages/devextreme-angular/src/ui/tag-box/index.ts | 2 ++ packages/devextreme/js/ui/color_box.d.ts | 1 + packages/devextreme/js/ui/drop_down_box.d.ts | 1 + packages/devextreme/js/ui/select_box.d.ts | 1 + packages/devextreme/ts/dx.all.d.ts | 3 +++ 8 files changed, 14 insertions(+) diff --git a/packages/devextreme-angular/src/ui/color-box/index.ts b/packages/devextreme-angular/src/ui/color-box/index.ts index 50e6b603b932..cbe35f18c4f3 100644 --- a/packages/devextreme-angular/src/ui/color-box/index.ts +++ b/packages/devextreme-angular/src/ui/color-box/index.ts @@ -296,6 +296,8 @@ export class DxColorBoxComponent extends DxComponent implements OnDestroy, Contr /** * [descr:dxColorBoxOptions.fieldTemplate] + * @deprecated [depNote:dxColorBoxOptions.fieldTemplate] + */ @Input() get fieldTemplate(): any { diff --git a/packages/devextreme-angular/src/ui/drop-down-box/index.ts b/packages/devextreme-angular/src/ui/drop-down-box/index.ts index 23f33b4dd9ed..19b6116e8652 100644 --- a/packages/devextreme-angular/src/ui/drop-down-box/index.ts +++ b/packages/devextreme-angular/src/ui/drop-down-box/index.ts @@ -301,6 +301,8 @@ export class DxDropDownBoxComponent extends DxComponent implements OnDestroy, Co /** * [descr:dxDropDownBoxOptions.fieldTemplate] + * @deprecated [depNote:dxDropDownBoxOptions.fieldTemplate] + */ @Input() get fieldTemplate(): any { diff --git a/packages/devextreme-angular/src/ui/select-box/index.ts b/packages/devextreme-angular/src/ui/select-box/index.ts index 8ed4c28a9d56..290a31047bdd 100644 --- a/packages/devextreme-angular/src/ui/select-box/index.ts +++ b/packages/devextreme-angular/src/ui/select-box/index.ts @@ -304,6 +304,8 @@ export class DxSelectBoxComponent extends DxComponent implements OnDestroy, Cont /** * [descr:dxSelectBoxOptions.fieldTemplate] + * @deprecated [depNote:dxSelectBoxOptions.fieldTemplate] + */ @Input() get fieldTemplate(): any { diff --git a/packages/devextreme-angular/src/ui/tag-box/index.ts b/packages/devextreme-angular/src/ui/tag-box/index.ts index 4512fc8685a2..eecd70d2c548 100644 --- a/packages/devextreme-angular/src/ui/tag-box/index.ts +++ b/packages/devextreme-angular/src/ui/tag-box/index.ts @@ -304,6 +304,8 @@ export class DxTagBoxComponent extends DxComponent implements OnDestroy, Control /** * [descr:dxSelectBoxOptions.fieldTemplate] + * @deprecated [depNote:dxSelectBoxOptions.fieldTemplate] + */ @Input() get fieldTemplate(): any { diff --git a/packages/devextreme/js/ui/color_box.d.ts b/packages/devextreme/js/ui/color_box.d.ts index 41551725a010..db4af74e31d4 100644 --- a/packages/devextreme/js/ui/color_box.d.ts +++ b/packages/devextreme/js/ui/color_box.d.ts @@ -197,6 +197,7 @@ export interface dxColorBoxOptions extends dxDropDownEditorOptions { * @default null * @type_function_return string|Element|jQuery * @public + * @deprecated dxDropDownEditorOptions.fieldAddons */ fieldTemplate?: template | ((value: string, fieldElement: DxElement) => string | UserDefinedElement); /** diff --git a/packages/devextreme/js/ui/drop_down_box.d.ts b/packages/devextreme/js/ui/drop_down_box.d.ts index 913dc80298a1..4e82376db99f 100644 --- a/packages/devextreme/js/ui/drop_down_box.d.ts +++ b/packages/devextreme/js/ui/drop_down_box.d.ts @@ -211,6 +211,7 @@ export interface dxDropDownBoxOptions extends DataExpressionMixinOptions string | UserDefinedElement); /** diff --git a/packages/devextreme/js/ui/select_box.d.ts b/packages/devextreme/js/ui/select_box.d.ts index bfb33c908dc6..454619effee6 100644 --- a/packages/devextreme/js/ui/select_box.d.ts +++ b/packages/devextreme/js/ui/select_box.d.ts @@ -231,6 +231,7 @@ export interface dxSelectBoxOptions extends dxDropDownListOptions string | UserDefinedElement); /** diff --git a/packages/devextreme/ts/dx.all.d.ts b/packages/devextreme/ts/dx.all.d.ts index e9a62df8966c..11df21af664b 100644 --- a/packages/devextreme/ts/dx.all.d.ts +++ b/packages/devextreme/ts/dx.all.d.ts @@ -11457,6 +11457,7 @@ declare module DevExpress.ui { editAlphaChannel?: boolean; /** * [descr:dxColorBoxOptions.fieldTemplate] + * @deprecated [depNote:dxColorBoxOptions.fieldTemplate] */ fieldTemplate?: | template @@ -16264,6 +16265,7 @@ declare module DevExpress.ui { displayValueFormatter?: (value: string | Array) => string; /** * [descr:dxDropDownBoxOptions.fieldTemplate] + * @deprecated [depNote:dxDropDownBoxOptions.fieldTemplate] */ fieldTemplate?: | template @@ -27036,6 +27038,7 @@ declare module DevExpress.ui { acceptCustomValue?: boolean; /** * [descr:dxSelectBoxOptions.fieldTemplate] + * @deprecated [depNote:dxSelectBoxOptions.fieldTemplate] */ fieldTemplate?: | template From 515f476c78d797317914d42c4e52c3cfa4973509 Mon Sep 17 00:00:00 2001 From: Vasily Strelyaev Date: Tue, 19 Aug 2025 15:57:14 +0200 Subject: [PATCH 023/101] fix: Multiple root elements are not supported in React elements (T1300588) (#30790) --- .../integration/integration.test.tsx | 135 +++++++++++++++++- .../core/__tests__/template-wrapper.test.tsx | 80 +++++++++-- .../src/core/template-wrapper.tsx | 61 +++++--- 3 files changed, 237 insertions(+), 39 deletions(-) diff --git a/packages/devextreme-react/src/core/__tests__/integration/integration.test.tsx b/packages/devextreme-react/src/core/__tests__/integration/integration.test.tsx index f9957aa0369a..5ab45d396785 100644 --- a/packages/devextreme-react/src/core/__tests__/integration/integration.test.tsx +++ b/packages/devextreme-react/src/core/__tests__/integration/integration.test.tsx @@ -13,14 +13,13 @@ import { import Validator from '../../../validator'; import ValidationSummary from '../../../validation-summary'; import DataGrid from '../../../data-grid'; +import Scheduler, { View, Resource } from '../../../scheduler'; import { ContextMenu, Item as ContextMenuItem } from '../../../context-menu'; import Button from '../../../button'; jest.useFakeTimers(); describe('integration tests', () => { - let consoleWarnSpy; - afterEach(() => { jest.clearAllMocks(); testingLib.cleanup(); @@ -155,7 +154,7 @@ describe('integration tests', () => { it('ref callback is not triggered when not needed', async () => { const user = userEvent.setup({ delay: null }); - consoleWarnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + const consoleWarnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); const DataGridWithSelectButton = () => { const [selectedRowKeys, setSelectedRowKeys] = React.useState([] as any); @@ -226,4 +225,134 @@ describe('integration tests', () => { expect(consoleWarnSpy).toHaveBeenCalledTimes(1); consoleWarnSpy.mockRestore(); }); + + it('must not fail if a template with two root elements is unmounted (T1300588)', async () => { + try { + jest.useRealTimers(); + expect.assertions(1); + + const user = userEvent.setup({ delay: null }); + + const currentDate = new Date(2021, 3, 27); + const dayOfWeekNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; + const typeGroups = ['typeId']; + const priorityGroups = ['priorityId']; + + const data = [ + { + text: 'Walking a dog', + priorityId: 1, + typeId: 1, + startDate: new Date('2021-04-26T15:00:00.000Z'), + endDate: new Date('2021-04-26T15:30:00.000Z'), + recurrenceRule: 'FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR;UNTIL=20210502', + }, + { + text: 'Website Re-Design Plan', + priorityId: 2, + typeId: 2, + startDate: new Date('2021-04-26T16:00:00.000Z'), + endDate: new Date('2021-04-26T18:30:00.000Z'), + }, + { + text: 'Book Flights to San Fran for Sales Trip', + priorityId: 2, + typeId: 2, + startDate: new Date('2021-04-26T19:00:00.000Z'), + endDate: new Date('2021-04-26T20:00:00.000Z'), + } + ]; + + const priorityData = [{ + text: 'Low Priority', + id: 1, + color: '#fcb65e', + }, { + text: 'High Priority', + id: 2, + color: '#e18e92', + }]; + + const typeData = [{ + text: 'Home', + id: 1, + color: '#b6d623', + }, { + text: 'Work', + id: 2, + color: '#679ec5', + }]; + + const DateCell = ({ data: cellData }) => ( + +
{dayOfWeekNames[cellData.date.getDay()]}
+
{cellData.date.getDate()}
+
+ ); + + let clicked = false; + let resolve = () => {}; + + const onContentReady = async () => { + if (clicked) + return; + + clicked = true; + await expect(user.click(document.querySelector('.dx-icon-chevronnext')!)).resolves.toBe(void 0); + resolve(); + } + + const SchedulerWithTemplates = () => ( + + + + + + + + + ); + + testingLib.render( + + + + ); + + await testingLib.act(async () => { + return new Promise((r) => { + resolve = r; + }); + }); + } + finally { + jest.useFakeTimers(); + } + }); }); \ No newline at end of file diff --git a/packages/devextreme-react/src/core/__tests__/template-wrapper.test.tsx b/packages/devextreme-react/src/core/__tests__/template-wrapper.test.tsx index 202f130b605d..fbcf3ee985d8 100644 --- a/packages/devextreme-react/src/core/__tests__/template-wrapper.test.tsx +++ b/packages/devextreme-react/src/core/__tests__/template-wrapper.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react'; +import { default as dxRender } from 'devextreme/core/renderer'; import { useEffect, useContext } from 'react'; import { TemplateWrapper } from '../template-wrapper'; import { cleanup, render } from '@testing-library/react'; @@ -6,8 +7,8 @@ import * as events from 'devextreme/events'; import { RemovalLockerContext, UpdateLocker } from '../contexts'; import { TemplateFunc } from '../types'; -function TemplateComponent(args: { data, index, onRendered?, effect? }) { - const { data, index, onRendered, effect } = args; +function TemplateComponent(args: { data, index, onRendered?, effect?, multipleRoots }) { + const { data, index, onRendered, effect, multipleRoots } = args; effect?.(); @@ -15,12 +16,19 @@ function TemplateComponent(args: { data, index, onRendered?, effect? }) { onRendered?.(); }, [onRendered]); - return ( -
{`${data.text} - ${index}`}
- ); + return multipleRoots + ? ( + <> +
{`${data.text} - ${index}`}
+
{`${data.text} - ${index}`}
+ + ) + : ( +
{`${data.text} - ${index}`}
+ ); } -function getComponentTemplateFunction(effect?) { +function getComponentTemplateFunction(effect?, multipleRoots = false) { return ({ data, index, onRendered }) => { return ( ); }; @@ -43,7 +52,7 @@ describe('Template Wrapper', () => { cleanup(); }); - it('works with locker in the context correctly', () => { + it('works with locker in the context correctly', async () => { let onRemovedFired = false; let removalLocker: UpdateLocker | undefined = undefined; @@ -86,6 +95,7 @@ describe('Template Wrapper', () => { events.triggerHandler(document.querySelector('.template-element')!, 'dxremove'); + await Promise.resolve(); expect(onRemovedFired).toBeTruthy(); onRemovedFired = false; @@ -107,6 +117,7 @@ describe('Template Wrapper', () => { removalLocker.lock(); events.triggerHandler(document.querySelector('.template-element')!, 'dxremove'); + await Promise.resolve(); expect(onRemovedFired).toBeFalsy(); rerender( @@ -127,6 +138,7 @@ describe('Template Wrapper', () => { removalLocker.lock(); events.triggerHandler(document.querySelector('.template-element')!, 'dxremove'); + await Promise.resolve(); expect(onRemovedFired).toBeFalsy(); rerender( @@ -147,10 +159,11 @@ describe('Template Wrapper', () => { removalLocker.unlock(); events.triggerHandler(document.querySelector('.template-element')!, 'dxremove'); + await Promise.resolve(); expect(onRemovedFired).toBeTruthy(); }); - it('does not fire onRemove when the event comes from wrappers', () => { + it('does not fire onRemove when the event comes from wrappers', async () => { let onRemovedFired = false; const onRemoved = () => { @@ -182,6 +195,7 @@ describe('Template Wrapper', () => { events.triggerHandler(document.querySelector('.template-element')!, 'dxremove', { isUnmounting: true }); + await Promise.resolve(); expect(onRemovedFired).toBeFalsy(); rerender( @@ -201,6 +215,7 @@ describe('Template Wrapper', () => { events.triggerHandler(document.querySelector('.template-element')!, 'dxremove'); + await Promise.resolve(); expect(onRemovedFired).toBeTruthy(); }); @@ -355,7 +370,7 @@ describe('Template Wrapper', () => { .toBe('
My template - 1
'); }); - it('triggers onRemove when the element is removed', () => { + it('triggers onRemove when the element is removed', async () => { let onRemovedFired = false; const onRemoved = () => { @@ -383,15 +398,17 @@ describe('Template Wrapper', () => { /> ); - + + await Promise.resolve(); expect(onRemovedFired).toBeFalsy(); events.triggerHandler(document.querySelector('.template-element')!, 'dxremove'); + await Promise.resolve(); expect(onRemovedFired).toBeTruthy(); }); - it('removes text templates when the removal listener is removed', () => { + it('removes text templates when the removal listener is removed', async () => { let onRemovedFired = false; const onRemoved = () => { @@ -420,6 +437,7 @@ describe('Template Wrapper', () => { ); + await Promise.resolve(); expect(onRemovedFired).toBeFalsy(); const containerChildren = document.querySelector('.template-container')?.children!; @@ -428,10 +446,11 @@ describe('Template Wrapper', () => { events.triggerHandler(containerChildren[i], 'dxremove'); } + await Promise.resolve(); expect(onRemovedFired).toBeTruthy(); }); - it('returns all the elements to DOM on unmount to avoid upsetting React', () => { + it('returns the element and hidden nodes to DOM on unmount to avoid upsetting React', () => { const templateFunction: TemplateFunc = getComponentTemplateFunction(); const { rerender, unmount } = render( @@ -458,10 +477,45 @@ describe('Template Wrapper', () => { const children = container.children; for(var i = 0; i < children.length; i++) { - container.removeChild(children[i]); + dxRender(children[i]).remove(); + } + + expect(() => unmount()).not.toThrow(); + expect(container.children.length).toBe(0); + }); + + it('returns multiple template root elements to DOM on unmount to avoid upsetting React', () => { + const templateFunction: TemplateFunc = getComponentTemplateFunction(void 0, true); + + const { rerender, unmount } = render( + <> +
+ + ); + + rerender( + <> +
+ undefined} + container={document.querySelector('.template-container')!} + onRemoved={() => undefined} + /> + + ); + + const container = document.querySelector('.template-container')!; + const children = container.children; + + for(var i = 0; i < children.length; i++) { + dxRender(children[i]).remove(); } expect(() => unmount()).not.toThrow(); + expect(container.children.length).toBe(0); }); it('portals its component to the specified container', () => { diff --git a/packages/devextreme-react/src/core/template-wrapper.tsx b/packages/devextreme-react/src/core/template-wrapper.tsx index 1a3736cc337e..860227f50c22 100644 --- a/packages/devextreme-react/src/core/template-wrapper.tsx +++ b/packages/devextreme-react/src/core/template-wrapper.tsx @@ -10,7 +10,6 @@ import { useMemo, memo, FC, - MutableRefObject, } from 'react'; import { createPortal } from 'react-dom'; @@ -49,7 +48,7 @@ const TemplateWrapperComponent: FC = ({ unlock(): void { isRemovalLocked.current = false; }, }), []); - const element = useRef(); + const elements = useRef([]); const hiddenNodeElement = useRef(); const removalListenerElement = useRef(); @@ -58,23 +57,25 @@ const TemplateWrapperComponent: FC = ({ return; } - if (element.current) { - events.off(element.current, DX_REMOVE_EVENT, onTemplateRemoved); - } - - if (removalListenerElement.current) { - events.off(removalListenerElement.current, DX_REMOVE_EVENT, onTemplateRemoved); - } + [ + ...elements.current, + removalListenerElement.current, + ].forEach((el) => el && events.off(el, DX_REMOVE_EVENT, onTemplateRemoved)); - onRemoved(); + // In case of multiple root elements, letting the widget remove them all sync + Promise.resolve().then(() => { + onRemoved(); + }); }, [onRemoved]); useLayoutEffect(() => { - const el = element.current; + const elementNodes = elements.current.filter((el) => el.nodeType === Node.ELEMENT_NODE); - if (el && el.nodeType === Node.ELEMENT_NODE) { - events.off(el, DX_REMOVE_EVENT, onTemplateRemoved); - events.on(el, DX_REMOVE_EVENT, onTemplateRemoved); + if (elementNodes.length) { + elementNodes.forEach((el) => { + events.off(el, DX_REMOVE_EVENT, onTemplateRemoved); + events.on(el, DX_REMOVE_EVENT, onTemplateRemoved); + }); } else if (!removalListenerRequired) { setRemovalListenerRequired(true); } else if (removalListenerElement.current) { @@ -83,18 +84,20 @@ const TemplateWrapperComponent: FC = ({ } return () => { - const safeAppend = (child?: MutableRefObject) => { - if (child?.current && container && !container.contains(child.current)) { - container.appendChild(child.current); + const safeAppend = (child: HTMLElement | undefined) => { + if (child && container && !container.contains(child)) { + container.appendChild(child); } }; - safeAppend(element); - safeAppend(hiddenNodeElement); - safeAppend(removalListenerElement); + [ + ...elements.current, + hiddenNodeElement.current, + removalListenerElement.current, + ].forEach((el) => safeAppend(el)); - if (el) { - events.off(el, DX_REMOVE_EVENT, onTemplateRemoved); + if (elementNodes.length) { + elementNodes.forEach((el) => events.off(el, DX_REMOVE_EVENT, onTemplateRemoved)); } }; }, [onTemplateRemoved, removalListenerRequired, container]); @@ -103,9 +106,21 @@ const TemplateWrapperComponent: FC = ({ onRendered(); }, [onRendered]); + const containerContent = Array.from(container.childNodes); + const hiddenNode = createHiddenNode(container?.nodeName, (node: HTMLElement) => { hiddenNodeElement.current = node; - element.current = node?.previousSibling as HTMLElement; + elements.current = []; + + let currentNode = node?.previousSibling as HTMLElement; + + while (currentNode) { + if (!containerContent.includes(currentNode)) { + elements.current.push(currentNode); + } + + currentNode = currentNode?.previousSibling as HTMLElement; + } }, 'div'); const removalListener = removalListenerRequired From 82949c2ca85f3abe079c58246e8c691ae32d14a8 Mon Sep 17 00:00:00 2001 From: Ruslan Farkhutdinov Date: Tue, 19 Aug 2025 17:20:55 +0300 Subject: [PATCH 024/101] Icons: Add ratingfilled, ratingoutline, chatadd, colordismiss icons (#30799) Co-authored-by: Ruslan Farkhutdinov --- .../etalons/Icon set (fluent-blue-light).png | Bin 393799 -> 400431 bytes .../etalons/Icon set (generic-light).png | Bin 364818 -> 371055 bytes .../Icon set (material-blue-light).png | Bin 398163 -> 404541 bytes .../SVG icon set (fluent-blue-light).png | Bin 288966 -> 294368 bytes .../etalons/SVG icon set (generic-light).png | Bin 273613 -> 279124 bytes .../SVG icon set (material-blue-light).png | Bin 291408 -> 296704 bytes e2e/testcafe-devextreme/tests/common/icons.ts | 4 ++++ packages/devextreme-scss/icons/dxicons.ttf | Bin 41060 -> 41564 bytes packages/devextreme-scss/icons/dxicons.woff | Bin 41136 -> 41640 bytes packages/devextreme-scss/icons/dxicons.woff2 | Bin 16980 -> 17132 bytes .../devextreme-scss/icons/dxiconsfluent.ttf | Bin 71300 -> 72128 bytes .../devextreme-scss/icons/dxiconsfluent.woff | Bin 71376 -> 72204 bytes .../devextreme-scss/icons/dxiconsfluent.woff2 | Bin 24868 -> 25172 bytes .../devextreme-scss/icons/dxiconsmaterial.ttf | Bin 40056 -> 40676 bytes .../icons/dxiconsmaterial.woff | Bin 40132 -> 40752 bytes .../icons/dxiconsmaterial.woff2 | Bin 15360 -> 15592 bytes .../images/icons/fluent/chatadd.svg | 4 ++++ .../images/icons/fluent/colordismiss.svg | 4 ++++ .../images/icons/fluent/ratingfilled.svg | 4 ++++ .../images/icons/fluent/ratingoutline.svg | 4 ++++ .../images/icons/generic/chatadd.svg | 4 ++++ .../images/icons/generic/colordismiss.svg | 4 ++++ .../images/icons/generic/ratingfilled.svg | 4 ++++ .../images/icons/generic/ratingoutline.svg | 4 ++++ .../images/icons/material/chatadd.svg | 4 ++++ .../images/icons/material/colordismiss.svg | 4 ++++ .../images/icons/material/ratingfilled.svg | 4 ++++ .../images/icons/material/ratingoutline.svg | 4 ++++ .../scss/widgets/base/_icons.scss | 10 +++++++++- 29 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 packages/devextreme-scss/images/icons/fluent/chatadd.svg create mode 100644 packages/devextreme-scss/images/icons/fluent/colordismiss.svg create mode 100644 packages/devextreme-scss/images/icons/fluent/ratingfilled.svg create mode 100644 packages/devextreme-scss/images/icons/fluent/ratingoutline.svg create mode 100644 packages/devextreme-scss/images/icons/generic/chatadd.svg create mode 100644 packages/devextreme-scss/images/icons/generic/colordismiss.svg create mode 100644 packages/devextreme-scss/images/icons/generic/ratingfilled.svg create mode 100644 packages/devextreme-scss/images/icons/generic/ratingoutline.svg create mode 100644 packages/devextreme-scss/images/icons/material/chatadd.svg create mode 100644 packages/devextreme-scss/images/icons/material/colordismiss.svg create mode 100644 packages/devextreme-scss/images/icons/material/ratingfilled.svg create mode 100644 packages/devextreme-scss/images/icons/material/ratingoutline.svg diff --git a/e2e/testcafe-devextreme/tests/common/etalons/Icon set (fluent-blue-light).png b/e2e/testcafe-devextreme/tests/common/etalons/Icon set (fluent-blue-light).png index 82cb24db8086c624f602f35c184d36f4e91a5109..c632cbc5458e7cf1125fdb4af35a6364eb78f195 100644 GIT binary patch delta 57662 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

uc{*ziI?57r#0ia6;iO>f{Bck({H-A|`kuR&O z5?+jm`VE6X2+@=a1_%VcL4W{=IqJ-rrGSwXe^5k^GESZhZ~_9okjSWLryUqgeYX}E z2pkyGGzCFriCdaadt$i~Tc+co6@+mEnh#CVPN<+6RUESj=&87EVxvGI3<$P>mSIUW z{G3KRDos(8C}Py~ySHJ32Ay0D*Ot^5$+0QdCT#9e3lK!f6fFws5ySS>Hu5He-$1kW zMEi~{uf$A}^BgPeXiR?+I3M009TW<)5UvM6pzr!~AO?Dug?kRaxM#V93(2HGMHXU2 zp*Sd~CxtPX5MXKPNq00Aict{rRKrlsmN;MNBVVC#moyJ$nS<)yU^(z^-%~@&y*(27 z3ft*~5Yiu#Ol2oHe}CtBRvM&>Mc&lqmP{0H3abWNMU9y{c}IdLop=xw{HqlS2Zi8v zz&vbfj$0T+aTjtsnyW=v#FJ*%dHzmdx{0by0XpV1V86O#SaLO58!X`mh*@_uRCut80f8`cE z#QI6Zxn2b@rrD*RJ=nA`loxA7S1<}L^K3^#k%k1d2$=ue3W|PUWWUFSOP3Bvp2rNE zg1=Ae-N5HP24`eU z;y3fx_x{)4{?}j5`u|6Z|Nr%3ltKJy^U43<#o&LQCvz3-Mg8M{@nVdEgY&0n?*Hqx zKY8os^Ix>*=YR0ppS<N@{nO_Meo}0z$D8_(@?YqmDLsqp|6<z=>PuKXa1WX zG5-A4{+pNi)2kT8{wJ6D)2kT&W^MjI?yOv5y7idQ5e;r@)!Ve_@M`ld&D_5FKL*?# AmH+?% delta 51069 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ξ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

uHJ)^Q7|w6` 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 z

4M~JI2A+|L3ebPockC4DRFP9Y9cqsW`0Hx=hWD^Ep?Ifu1TVC0X4>Vqflz1&aVS&B;Q=QL%oU?ksq|^^29AU zi()WttS(_pN@{Ek=1n}IlJtJ}Z)M-#_~f@iumHY@jD#BloohgA*z4+tz?mU?=;7A; zR^w;?_P2k&)y>Cn;QsAVHxJws@OfKIHO1s)a=93S!C?dl2%o-nV#cY`8j6K4S`b}| zld=64-vB3;=7rECaVHQls#)f0p6253b{}2~R&#|$Z9dIje33DZ zmz=7YXgZl)Yutd~7p~Yl3T-u!6tf?XP=t(R3;|spPDcYg@gP4<_00-zH1dua za}+j8RWsH)-iaFb6UU@@;s{9KO><|J!!mGv<-|nM!K@v`+Ctgjl`A` zQ4(`wZhiz0TTd5fP_%yythqZjKuTCu`cL@rVB@j1mHS7{5?Ne)j=b=>bE_m>Q%B;< z2Xk^(QiJY29Z^a@#;B5$g8>b4a%%QL-J-S_i70CyTEWyQkG)2C`R>E52Xh2Ga$bZb zZjnHq$=6)4LHI&|j5JuWM0nmz%B0_-mkIed2t4&N#xv?3UJv3^EKj3&r%`yM2i;AS zjxwCP75+8w*%a5wDEsIKC~HGtM9l_1o)aJ=rjK0$EIM-Mg>(v9IgD&tQ=41zEZ z?HbYpS>}f%u=|v_kl+P689FfFj%Eook6lj(JWx6p3eE@a#o~j1KJqO=NgF1g;*pQpJQr;dQwcSszjOyWG^Q;5+}Th{zM>i*{Paehs&M5i{_mgHa$U; zBeBm?7fY(vI~2u#n`QUAr+!I-|HBV!=ot_MmLjpIPfv!hFd*VkddYCn!h)v}a&_nXx0mIvQENGMUAXYcp(+1lR=`RSALjMl55`1D6+Rt! zWi6Q)75^W#eTE(jl8-1btiH8kU^lm8VSPhzjB^!pXo9qlukVn*KgD}UNrqhkhv3{+ zRaIU1^obvL|EFy=S9h)%AZ}lBDTaxw_tJ?R96eyZ_wu@HqQs1AlG@yujAjSY?``Yr z7Vy{0e((}$kKyZIMo6KO=q>-^@-!N1Gn_HoSz~IL=lKHTq?s|_>PPj+$Dom#I`x$x;n&nx)jov*)pw?POL2AP%tu!N4?!+p zKq!R+4uUBRKuT}!hM-S*P&}QmhTfLfK_JA_Oicp%n@7v#N8aC#%nEP5id`2N`sA00 zeI%no(Aoxg?C$PgpNbg@i*+*2Pc>*@4~sdx&C(&vO#~~^j4(p~(D38ywr%9g;Z=T9 z40htn)Rc~9O>7f-Pz;ZEqSxrVEDxJ}go=h?azW|HY6K#qN^4PuPa8s-OhuW7RXQ2g zZRxi-2y_d}09^MKF$)Pg;Y$nO$0bND|MPc8{83n>G2cF{-oJn$Vd=qV)IJ5Vd7ps$ zy(vJY^PPrT%gi%u`%6HGmdQ`hYPB2#Ee~|NlXhTSF&b=Qf|3eH;eG3Q|a_ zT?G8scZqkRQyf^81RiW~TWH)7&~B=^>D6mz(T$Z1JY^ zvzsv$gtOR(X((NVDHVF&?al*I-&hbG5+wDGqh3Po`r(}!b2bg7m=w0?1ZM7F$8YEgUT{09HhUO9HqKB8Sha_$PI6e>4Sb0p-5=S@%(xsu zA4nk4^Bew~D^YhbSf+K_mjpWVXfOQJ{GWdLB^pr?9RztM6f&~D^Wmu2;;e~UI5T6V z=i6WZi^U~r*FY+ah^BL>F6REtg<0QRPoA0gGA4tghEB5$to~Kt3_eFQ2SCnwo5Z&u zOv*Po8cG}3*<1pe$y{3UwHQO5qY2hXW{_eDQAY!(j>)98uyA{51kY%q?5+LZK?V^G zRw`yGasTax>h00ll@=7>O{fpSOV_x@PbU>B zTrfXM0tgxdHqODHFTT9Id5bRp+hNVl&aMaB_+XI8mMt&Ui6W@FCwdpxznjLbr;3V( zlRJTEaL`F70Xko2po69pFj^V$C2eR0tw_kr3_)|$Ikdd|JtDirx zqU|$us(JWN)w1vY`RtMtPiNQE{PN3B#i5PPf4SWy-L|rmezur0p0I zF()q~uiN~|2}9f>eP4|HcER}4?b#_o$6hgrd#Cs8(IYAUmu1UZGt+P2!i622 zPj$-NI`)2(71`kzH?KD`+V{~*&#f@x&!r{3OPzgszf>u`w0WPGo~z26-E*_eb1Mel z$@=w&i*-NjL-|*nS=`Q^Fs4Rt^194PxsA3`!mhlcrXaTUya;aAVhG@^iN?MmV052 z2GJxSC@CpPpZ7&WK8+bUza%67+vJ^I+7YGH7-~8k=FQt+83aBDwPikLU65qZ;Q&G_<> zs5Ht>$8W{~6vnyqaLFV8NaO&9t?^3CbfWS43%a85@2&4DJnC*`<cC{qL47HdQ z1X1A!%@d0+289F{T~SW+x*Pb3LY%SsFuTxA=mV3A@6S6U;tR>h$T;rg<`xIyvlJzO zIWuIQ(N)ELX`Ph>=V~B>nYVCZQ5th5#skAuz5+R01`@wQeEjNGeVq`d7XkEa$JEWl zX{JN(S73*B@y5y?w8n}D94z-jqBIM+r)P0`N_9hQot_}yRZ>*)b!G;zV0czKh+6!_ zOjqQm1*>~~y=y+BGM7V5vI>mhI~lc zQ|<+PtWRuyo@J98>yNzMHQhJHgbv@$+!vgkwr3B{XcM`7GzqI4G)6u>jmsJLmwV{Y&>8pOy_&Rcoxp3V9Eo_2 z1g~2c4l0$&oKhBRjRgZP!{Vc&hNTuS*gW9QrFw5NIAColQhH_@t*-_^^uoi1_L%W$ zz-)eiZMA1Nc72)yxz#(XYQf@n-q8&aI9V;awH>KgIJv}lV63w9sfnB;KV-`}o*WPv z7R0z~i@l3z&Rv0oe>ASkVdBKCa2Ey++9b*yUepsFzk2<43QL_3`9-3)FSjS~*#&Ho zd-ckd9iUOOAR_iy!LlNvx9ONs+?5}zHX00u>R3k2cI0oAU0*1l8sffS({~FpZe>}{ zIp@%G^XQH+XH`x3kNZfZaDL1P%2lY#2!_}^?GxHfP@0o-{`>^u)II6chLv)qeB@^~ z+B-M1Y65B>mSdmN=YuzIHW2NC{*C2cSFKs&%m@JA-MS*;9_OV?Gx_F#*+e~zYAYbJ z-ocu$Zqa>^)ASaBHfTTd_*{>3d!~JiVGa0na*IksH{-!kKtF~&zasbOZTS(_jo-vT zMv=e9j{`}=mRmWuziUaO_UujDE&n8{JV#NyZRZF_#G-_!+ zr1^PPr2=TCl>QP$?EbiIx8XKNIlKF9fRLZ&r-M%mKZu;DNnQ{el?KWQ-sdaAC*@we zIBBhn^`XOu4Rrp^3Z&gP^uM3!KJ=C;Y+YSZI-GvFJ<&4f{bj}^96gHZ@y#FItCamv z1is))@Lmi@sS|`=wX?QI?WNNJW*0}QESghbM|oI2g>_L3=o-Zswa;kSU|_$P_3k~s zc`p6d3TV&Az8S4Oo3Q`(NK5*`1S68ZcJpQefNhnFa5<|GyaXDy1E-*v;7HzZuxYIg zFVp?L)pSf{7=swy(UCeZ1uNhv1$!0vha3wY6l2SdbTf9>WoX_eY+)2v?!^&d4C8tm zpiO5`rDV9DK7IS%uoKGGsFjri=hd?)AuJ)Q+W&Hm=1y3G5gyyveK7q|ljWpvZVj{I zA|i&!TcE})r&XI54e!z+So};WTv=DUE7-+XOG{&TRGu^wO}~BAECmF!*eAQuo|ji- zx63EJcXW5x&^J@;^lIdpJJCaq-q`I;*@B$QKEL{|<`fTPZVjlMRZ*Hh9BqJhIGX{u zD3W$Lvj9QM&L%~p=?GU%wLej=N77l}?tVXf?M_8n8Uesgwqpt3$Dz@Npq!ygMsdQZ z95AzXa0T4HS^xg-(7BnnY9JlVhzl_CBW-Mg6B84Cym6HyM~pa0v7d#X_4A+G}D>I5>)Oc%h6i=RnN{a z_ta2Y>TO3GRRZEp2bhhNh3-PkP)ta}3@jNQc>&lX#vISFns@ah;6dNrPe1ik35l>H zi=wCDzWCY(MF){HX#fgSx1Oc30J6Wl>>j7S98I6som-bf2QE7x&rDu?IizXx=9n25 z6LXJ`l8Fb%7@k8dGG&mSTR~X&jJiy%B=ih%bF3Sg-mXN;kWhljOAu4MqxmG z4>fiE_330KA#XrQQ#urZvRKg*Qmd z?Ul)SFT0qPrAG&EfB8b!to!p65T#z2_c8HVBrOk~S+*as97Btr)uL6$ZSnXE+b$$0 zJ9{urHpOQyy{sMY%mP`_C)v;#^u>V83EpW#qbTDVqxTrOJrh_x7@gxu9$Yl*`%e>a z8Q=4BQcEw^RHt_R5KA+L?kkQwty@`yo23jnI!%C8;e49s0|LU!M^eb|y3Z#Z*In*~ zuT*qI+!EwS&FGEy8nix1Z}0GDRces_ZK#*;UXq@&P_Kl%<$A<*A94K~wxH}<@Rluc z#4TR59IYJN@75RfDj8W+8!Bh@8eG$kO!Dda^~>xW?Cf^%*0L#d+gJl=;@b}BE4Qe~ zIdF2xppui}A20~0gW(=#gd(_zk7Ec`bg<(Rh*lYhe)5My-Hew91|Icj5r}!M@M;+t z&QiL-;f!w5qDAM;$D-z=Yz{o$p>yXE7?c^$Hf$JlYeNae4~CC>!tvzQC%L zpj0f7NzCnZE`D#s@*Kz$UW*15O7_AFw$yyXSj-{ty;x%YAk1+8lu221lS<=>{%B^On;z| zhDy}Vm<9l`>r(Pfq)If zyCe;ZVyNW=^v&sPwPb3c^dQnVjz6x!^}v!e{C)wmHWARwBx}KB zjN6Hd#gLrrfF`4W3c3nv@k$w#cAEbsfN+<}hXMC&*t#`=DYA2l(;c;7A$?zZk@|%sF$X-S2ydY%AbB z)FsWt((`;!xtozuhke#V-gF3tQw-j;DTc(XOjZt@tODaT3xTf;wS%i`ECOFoTKD?H zDkW1}yOi=z*>m8Ka!`e%M5@|jry@TdaPPYwbIyGJCTvP9TZOueNbra<_P_H^pezc^ z9r0(UKsv5ny&6G_o6=AF-aLt(tsFf{3E7x~i_503m(?s?itY9%L8_p2ax8L9^%_k9 zjw4{b5kd!w@gRVqedb3|AYwS&`W+jjt0@{d=2v=Zs5}Z|GpRf20!-|TP{AK6DH%Wh z$lgb~W!kHkGgn!5F2z8T@VLL!t3MO{ekGMx@zm19Ps*BzH?sHeh#~%E>q4SN~#bq^_++yoZ2ku;Xb}1ETM~@vV)b%O9B`H0ZwJZw)HWpb>hfbXoS;5&9 zfc*jQb;SJlCxUWK^$t@SR2#&Sp!jmkQ{KKfG3zwC*BFdtEI6KWLAgtman@{p`#0Z2 z<`(3;7x~s7R+0fYJ4g=|L;*74mu-E0lbOJjz!s?Z?yNnSq<=~H3gq+&2v=j%(_LAU zQ(TThqDC+Ewk2|Nr21bzjKQa)D{0^zgOb^cN(7T$-dix0gzB#{xX?xEC#UXryHOTv zNT|(2?l%iOo)3aqNE)Zm2+q?S<$DaC-jz(3Zfg{7M8Ox-o9fJt8b#$2giM|M-W2m~-gx;X1s&s3i#8`oR^NY7%85Y`<*+yaFCMqChcj-y{eRpPDV&>1G2WqO{K?G*nzWoqPSs}TwBM1q5wdzH(LA@#p zHPw;)e0y9Vk5Q4h;xOnIM`vd*7EowV1))^zjva$Y=+eoj6!B#e(7Gl~U#%TWN^YQ~ zt^UfOns$(D(VV1dY>*KCuAExfmX?(^43Pqi*m(Ku$pWGS+%^p!#&GbpGw4EUQc;pO zcs0-7qv3PUea2^PUHom!*WC8ml7gc1MSinUD~vDaWQ-<~8^@vM0Pmb%nzwU>4SM*7 z#>TVr0UTVPZ-Y}~ku5XivA znJ@qF!z1!D#QkOKhPTecDe9l)&0F>uMoIQMqGa^n<@O{_G-4S$3w4J-#E8C^mS2Ys z9_(yo<%&@SrVcSl+qX|+5zU3eaIJgJe@{ovLR{Jg!Xh|ae7&{eSlS*W;ON~16GC#v zVwAj4Mw3_-5JyuT@_Z?TczzoEz04g>LIFE_(gunwj6n(UxHyhsEHe#Ptz4N$)E`Sj zh7p+T+dux8hm7bN=?R7yfnjM@^^GhCd;6Uz5IT47K2A54ec2XI2Su;^eDo&sp`aAk zX{V5=!-qDisPWi-;aDP)(=Hu54&(bdM@$yZD4=V^n1`2=$DVWe@Ni7>DaO#q!wViD z&#@gb;v*Y``<{vk5tGZH6EQJuZkw`tB2iD`BcPRhIERYME81XuM}s(hW=g_BWZ+2p z@15~|PeodCCR3*Dp#4ZK8kV&o{HNfsu-6oUHzD02M9Brf=m^V+Zz`P)BXsn{31<}T z<#=S%S6&&61b&??E%}c5-8**>509O}q%4$xVJP``#7{^S(B(kmH{StDaKZ*Gb)`Cf z3$D5#*3nE3SV<-OlWpp|7Z3!GntSz|Z+1f6TM~4w*2mOT|4?(9&LYuDqxbBwyKWA; z1r~6F0B&VU!3oEUlm->a2Ip>|CAg%8wxN(Ln^~SY|j#$LL-s_iX5hVlr`Rvnwn|@>E+Kd?nE_xtA?-2HX$g%0` zV+dFtxxl+K&n3s8X2jt}aS>th;8VCDdy2e#$=?+-$TS`Az%fCHZO#cSA-E_wTX(gr zqJo!6OMYC=3HIAd{}VY6%D5SLnaSvuSm^1J*;rdgfF<7nJY9v&!2FvS2(aUk=M4U` z5j|w#k>X-^N^tCVl00YEPKw*K1b@r-f^_E zd)a>Sx0nk$%L7EeAZ?sn_5va;|<5yLp2T}(~a#gM>oPga}j-u(8040raeRS4w=W93GG z&f~zi%ML$$pB|~_1+Q!)eM@9*=zDvEV9gUXT_kc_!#J{CV)KF{tTz6%GLy^*hj+sb zp*4YJgrF3LGp+)IJpS#&@A>tUulV$);#Hq!)~An)vN|4j#e6}c8)o(tP<-;Tnt<0_ z_6(s66=XpD z=u9-hegZI9yCp2lkN%wooKk4-xjVE|!@}YL3S4pFl{~eS87ErfByLc_pw|l#B7nvR zmJ#0w^Z>+B3Q-kA%p@EOd6(0eF`t6h$P%z~X{hKxt#B{^KUrEl&!Lnee#*i>W`3Js z0X{62Q^tcUeE1p#Z>7-W{OpqcLFl*P25rF}>fBxBt07>T`53d8E)Dm;0mBkI05+6DM zF0tOe*^PSb!b?(9Ca{P{BsPmEp73!j0gY9_{e6l)fNu;qGLvp^y(@afn&`^!+6HG& zik8YQq$No@Ten&C5Y8bAS=tJCb+ae>dZilru-=JICd z=5|>10?Q(|ov3{T3yYKE@%SCHEZRj1K}`c@vFHS)NT-PDxbKCfq?M;Y?wdYzqDV%R z7-EkdCr(Td>qnwbwj{=fRZ|*+R;GCF;a1{`VGl@;BB@bg2PvK5F06bmy{kAFj>!%j zLQ${CUF?q@Iy>m-@#9V~@p3m@KJUn(XgvbH#0e*(+c^JrR{Zalq>0SneW#v>Yfiq7 zFaXr9GM>>7k)&NWewqG&{jc1qumDoe1kCn^(gkQIvwXCiepH~$WM+ibB$8mIM#|*3 zeS;Gr?&i8%4GeJO@di7JBIN^)GZg9*^3-dWFNd@Lg<~oGJzfNt8OKvKBTjdk^59#o zCW+9(V(%ol(l&sMO%+U2bMW22)Jvup2+Ll2;`sEWoU1;)Jw&r~#OsU-BcRH@{CC~g zmghUUKZO>a77A1!f2P1D%RIXq!(t69kF&HyU)?Z#nepOL}?DD${iEY zC7Enc;MAQg@$Evn*jZmDE(EiYeZ#I-no(`@>wBtPTJ`pMgGzKdD~9TNFP%7I-TVwi z0gPZb%Lm>ohdc8GFelaP^6IN}0t*(N)Tqq>Hv$>KPWT3agmkB~!^}7W5*89)ZbI)U z+vVO_PzMMHw2p^TA#~j&Ht}p(rEY+td1Q|Yc8Ds?h^*x`sd_3TXJsABs09~&$ue0? zJKCgbozna5+iMYmC<+p#5@3IAD8=TVBx-}de>tCrQ9*n0T#`0wU{%ViBH$9j_mEN+ zSNSCV($|z4kpt|}X-t#*Wa82aN2TeU9h&ByrWH{#j~Aa&#xZgvGt+Hy-MCSOT!g-% z@?zK!PjC>Sev#hLXe8{PVVaP2&pr3~Bps3sM z$M4;xSg03!LMM{7Ohzmq0Za_RY9v7ePsB!1kVqInO%c((F8I`TcaitTZipKa z?(c5%_;X0c{|E&jm{Bwb=X~|X4a1DBi-(c@$p7%YzR>A{;epT7X<%ltks|{E{*OPMGT+kCn9)DB2jI*b00H zl@({C%DD_<`0!_wTa=yIjqP0}fbYm%;Y%fK0f4cDu+zPZLaT1b++y;t1u?2C zn${vvgf=Oe``klKF}db|tOgErsFhzVTH<&i7KGoVAg3|1mVkgdq|55Ftx!*76o@Q< z_r!S?z|~8#)Ss479HaFD?a5b@MmAelF`Ls?JVFM?Fp{S z%-+Z6bJ775rR8|VC@2=4)n9tP^@Y(=4zD?Xi)H-@$ca8|pZMx7U?6xg1&E4O2ob9C zlu%*;j|LMV;8Y|fV7%R0U?I{zzrD~$T-TsSfmuDczGl%KxVrl8PtiIM1 z1NgE%JS+JwX>9}nM8(bG2~lKNx$vDFMV5jjGKAoaO)2t(myoy#QezRRF+6?9;_-`M z*NB6#;om>Q5GwY&e!Y`DaNvf}&@OdPLYDiBhQ{u15jGc4MmWvHV&+=Z5D@^rRl%?+ zQaaSxBz)vFg`2c=hy~z-ZYdeWK95aI42dCcBThO+s3;9Z8*02ak`YqRA5GQuF7O`0 z3|$R9*up`(m4)xo6k@{6E^XVsL9vl2(t`L2y{dwjRo$564_TwdAXF8YCvl7g{RZ4e z%63-W`z5y)?JX-%T2^VwL$qT7=`<7^8XAiVO~5NWfuek|<&8`%Ml5?83ys9iT)H`k zK8As&7Exy^`8H7`3i=2;=##LWkE?2V=KBRiHn|1N8bX;o3(Oozo%2qK z2L%DX{<@xywsjdn-@LhV$Gw8Ah{*89lqarGSK^P8$f6~(;8hZ4NsPpgwS;%vSJqke z5X}{yK3(R9#0T`ygXtXGNF}HFqo13`<~~{P`F`7V4x8H%Ec0}mn3%*)n$jW=C)O#S z#!Rw+lBDe4?x;I99mNMPEX0(;0_$bN^3cB)ODmiN128O0(Xl&_aon@~ea0j723yL5rATqXH+( zzg*kff5GiUA! zm`y6i7;=^>L=LdljetjRrwz54_z3-T1M;{ zNCcpmEiylZmhJGI$F}sb=P5b>I&y$LnvwwuzvBcdCIiP7R3Vg@$xVAHI4T1zA*$!U2cDt;FEr)PH^AWU2pri`L@L6=M2DKsET!(+-23KbdyWG$AA;MUo0hq7W&S z3>lgXMe_e$*rxry`}@BCK90TH)bl*|eckI?>s;q~uB)wv24k8v?$Eeaty;~-jny`; zRjcmFTD9tQZCIbb8T{C!`iGmg*z-{PHA@!n%AYieq;0TEw$9Xe3(&^ z_3r%#CG+HAUMt_Ek1?##l-jB-=P|Z>%fG)^_ipstpS9(T`YDY1`TegyeI%*7>+dhq zKC`dxuW!S5!`gaw{qeTnemZMz%RgQgXgXoTFP|>HE7@*U(X;NTk$-&VM=8DF-SOl7 zJ_JY$Vw(A3p#0*G9kpS>^kME$-Q{wjwuBEcg3Y->%>O z>@4@~4JGaV_}cT^pEK)z`)bJx!g_h>9r673)q30aKX32a(5d17>d~E+-l`qweD3AF z6P_L(2^Us>ICD;#ejIsV|4*N!|R+-dq#<^W4p$5{jvJ+GH z_LKgc_a^s3YQn|_9@i}17H4hOb?eZr<(j4!ztpUL|K`#58T~_7Ry?i#`0~V!gPI4W z<#lfzoiaeVhoGvxgF z^I;Ephiq25?!}`&@d~tXXj_R;*Z|pzo{g(5ruc1vNF_Xb-*My7lV^ z1_ftInO%9*zw*u3e{2Mn=XVmG;AybPo>?&xu*uz$neJrg~T_g$b9^(wa@2 zI8kGHqehL6nV#9Ue}AVLGiQb$2@7-Of4gX|y>TaWq6{zeH8wIzh+A24|D3%%0c@VK z(`eH2z3i^GiQvV`%OQ4a_#3;xhZ>ko3tM|yOykV;+AIO(M#r8SX|+8guAuvXL`ktsIzx) z2v%8DT{&psz2oyfzI_q*;+kjA8L`Wo@n|z&-|!i{C^t@Kz<>c8Hg3$mxMujMQKKAJ zujaPh!ozznesFr!Bc4usRhv%p=FMAHoY^R5#?8VM_pRHu1s* zASEMn?aab^`-a-fJv#4D_&g&>-MMCe&F4=+jY19lFX!bQB+8AwB#KGt>F!0T-a!!& zZXr*KiXs=@>;Lqo|Mn2Cy?amD7wUFVcf1sguT%orbX-mcA+-3}?+Uu(np@1A`PCi0QSTKV}4vZ-nHBAz94=5#Yp-jQFLpI9x!71pj@dsk{vnAX^_4O_@+X!jU0#49?+u}qG2vv_jV z!%}bZz~@IE$dZ$(&~ zzNKX^TO}2hrw`67eE$5o;lmv=gSR}2T~Se*ueG=Dw9&x@1#`DF?|i+ws)ChBzI3UU zgWB>}?LB)=3>o9zB`0pBr>kqj^A0bQZynOgxO?~MlWU%*t?tx!co4U8u!e?)L~Zr^ zz8)SPPG3HMXxe^YttL&HoL~N0&(yTTmMvSt{6a%}_U_#~Ok{77+_M)P%s4h}aP!V; z+6Oh(7>0g}1H(p5nk1&Bxsd{Q`}*q5n9=EHKq%}Vv3l?NIt|JnC)8Q8WXagEV*?EQ z)hw^?>ZUbz+_?Po!@C&Kise5_CB6^oCQ=WKGL+6lT zfYpQQjW3=*FU^`_HfZ79zB!K`i3;;(i&*8)U$ODF1`v#edWc}A) ze|1+-2<$&@+_7br#+| zHiz1DY(~s(QgVd~t3b$9OnhHiW-f9xJ89U8H=Uk7ed-hzI`Lq^>(^;yyDB1btGj#X z$&v z@EPKy)#i$N5RvG{UbYQ@Zds9L(X}JCW8kL){u-F*QlhB zbZdD#YC*cA8P6^FY{Mo^3dshWHgAq3-5t5ZtqoiDT&nTr+Gb{EiuD>aFfldNBgTWq zxF_Gdxzl+A!DUxdy;7p6s0h3WUi0aF+_eV}d?_u~4>H3|w(i)W9UKs_PG#|ffTKrK z{m786Zf?N}?65=Sk5=S$Ygn7-3C>X;F~UdFS%X?!NP(zZuil*5voE=4+v2Y2n?KY_oH|?mh zgIXJKJ5Z;|?c2Ba4PMaP-rhd!4);nZA2O!;yEN}Cr>xwX#du$m$L+5%^d@a?Y1UCB z-s^|7Tn4JDK70TAA%$R&#Z{@exVU}8SM=w4DK%Tm3R8j%hOc;Ikr`&R$II)`?mc_1 z*v5ZO{*dSFPHOSp<>{ID>1t}KmcO2!UVD{A?GLW~*qcwhoRhP^qpFSFyW&aQb6I)$ z+&4Kf;FG_@Pr<69g|V^m%vulE^Kpg6;-Zu2wx37KQzJ0@*yUS{ZfQc+vR4xIKXXKK! zy`86@U+RK`Yjh0_r4n6Qq-14zO^>!2wEF#`CrgI0!ZYF=JwQm@+n|91A8U0|cia^* zJzCB?^~J;J0gCPV&j?_pt4kAGynXY?kML^Mwrw((BcRKgk8ks}hzyTCdp1cFdw?v+ zgs0{vHMYr(+q!*wlcJ)c!-o%(85<}ku!<`{H2Kt{34SVW1d36s{slz2C4r7+O$@yNID-h~^09R*GUhRU*pxu-2NB3AiJl$%8n{4E9)jNzcIS( z!-oZB1xZftvZlm2meqEUp*FCQ<5EcnV+{;K)cTs9b_MX2_FubpZD#!eW*46TK^8qY z-N;MdPi2r(rQNFcueM4QgVn@x@#K{NvAL}~b-HnRbCc|NXU*lymxq~vKgAZl8!^4w zgZ*@i+@L&4&O@qItHg|;G2zztj?av9s@nY^gok`=dh|{Zv`H4JHmn(?oVzY$KlYt= zs&2o2{VpdaW}jW$@yn<9FXN4jq^qj={;L7Ys^9C0$ zUZjlG_wpaUBCxzTs}CTr$`EKhYGeJ#6(zHPaaOr;qE3p~X1lg*)k=$!q$n^QQP{p? z$Dsb;TxFY_eGOW4F$|v;H9v0cXJ3~VvbWDWEX*9&-`msMJLScl&_V1sZg1I(+x7bN z>0|TgypFMP%Ox@U$9wme?$l|Aw|Bc{9h66QmXnwF8Dw6+O`A3nFDe+fmK|*?o1C0% zd0mte0hZ?97yoc=0Okk(Loe zZS~-EZ}zptjeUcbmE?BL__PwJr3iY?zv(}`+N0foSpm((n}TUYz^V>e{9q5cMIfyQ z(YEd(q})MPx4X;9$%R=>o;=xdgMe61Z^+o>U33#5Fe@LZC=l3<8x!I#T*wBcx7=FS zfm}AK2MCbbWdHnDx1F7bC-bg8!zQgzp}YR0o>-Sm(jLsHi)K`{oqAEnPjSr}=+(2r~ zdcmXa-lK>8o19_0Jw3w}2M*jt%2~8%(aGrOF^6Tu_C0?5_>7n(n@R1vcI_HT_ABn* zur{5lysE1Ao;|Ha`>?G|pRi1@CJA3$6G^E0?VX8XCQBfB)WM-n>C;s~yiSewh4_-Y(LqY6-okZ^4r%n>;;RO)7fwL?qe8PknnHei!G|okxqlA%ffWqY*=}cN7Xb3ma%t|dZ{O9Fz9UBXU%fh(9+@bg z*eam;PCRUQFvhB20%+;QPJk}FeuGsHEsY2sVwH83jr_RzFkHS;-fUL zaq+SzSEWUR$rUMrf-Mp@)Z5W{c-waE+EG%T-;b1ML7#w_MKrT}%eqmv8#Zn%M{Bv_ z+Kn4mu3g*8b!D7gJY9Lz`0?9WiJ;)%&DRf)^SpZV=6u%Q@-i{;JTtr%xgg{=yUotQ zK}XTc_!>dQb1~RIbbV~>aNj_;4m6D3bs97;4dEUlZ62u|xt^Ambp3i`eHnGffks9~ z$IRjnsJ?riu~CoB`Z%`aqLySeg*M~jn$@PKEfdJ{;bCEq_4}Ego_%e14c?;2hO|Rdak*7_L+t4>eO%g*jye; z;lqcXii(ZHCELKgtXZZ?y?XV|ojX^0@Jn?AFEF0bj2SyZj?IkSOMpbpOKtn{{p-{) zqo9*#&x(g7x&#;zLsQdjut%2Hd2~ZT!-@yjyq5|5;?9Fg^&aqyk{*|~z1@IwOP@98 zfob1477-!xX|!!#^8Ne!j@&$`Ig$KB5!d~i_{g0yH1+G(uUB`fl=5QRh-UxehZ6UY z`}gm&36f+X)hMm-LE|s1dKcFFLrI<>f8tiX+qQx_F5kcZ&H?e&Ul|4yL3b=!qD1NM z#zrVDwUdawP5ux)<@D)(?$hX>U)&CEB5GACyI3@iJU#7s4^CULC&@6Qf-helotXw4 zrS~^^LDn9srdII$xvO!wwtwTsjqO&f2;EJ27n^v&f~B;r7eBojE}@3I=#3inmn?f= zTTaf59Xoc2B`6Vqk<>U1FfJflaa&p0bb^3(P1np!R#Q{+R8&;M)3l$AZEr+K#ZURj);vlF21_F ziN3FLx2|1l!TFJXMWvvtTL-2N5P2o+{fnHK!GsV^`0m^bt4$_F+dLY&y>LGJeP8P~&SLbA*5YZj0O z#*^H;jA+=fVb@;0T#1J}5z|#AdgI53PdU-0crU=0NHbhnR!~pu^O>=2M@ii}EEeTiE z22m&HELbpR@zT#99cIj!aWy?X)EMprxE1CHKWl7b)4%iZRh zHAyeHrT(y0Z+qpf`OsOBPP%=E4ssuz&sb(`0L0#bmU)vGpYA8fKUUHzBe0&Y3N7B` z<1?k*ge>&n@hoLd;-oKhQ`NS-@>-^aBym-xGg@&~^bQPrl zzM;hY>aK2?N2j>^!Uj{Iis)nFTEHDy`>tRA7nQ{#&3A~%#l(HxQM2=;0bSX&J}QelY;W5S zKBz&PI(6z~T7kX5m|M9@!)TkCN`nWFn>g_qJdOZg)UhSh-y3OZMxx6qBY2OHj=Ib| zzpR^vMwivAS4$3PI`7nD16LYC^UkBYg?bZk<<;xg;-bD5n4;@mVc)?(kj;j!hP_o( z_R_2i>I=?K>{}HT74aY(?%cUkNUEv!0gp&TqXhJmwxM2=fhsBry?Zwzsc4@$*tKDt8|loL;HNqS&^?Du@KM@) z<%+iQ9EcpJ_t^`orMZF3LzG!KNlD*+{TelHJo*kz%}}Sxf#jMwP`qLXHI-4?BvKJ5 zPIP#G?}7OQ7@48v)=ir>)z#hEN$^^NY9JOnjaan@`txhg3vNqy0d{w0@9x)hJ^=VK ze&Jm6%-In_liL?iea87^TVq$0+@`E$z9=tB6`@jG>Ytlr*x}<6oZ@# ztG)FE-39!RxWHM6?ge&ARGgD1rHo$Bv9c0?VV}ktHCtZ*^xnODB`&Zk0*3$!GP1IQ z!619Qy*>Bt-LmcY@&4e|LxQz8;c=8*6bqsMkk2pCnmDlqq^$J=^0XlBE1sswLy`Se zr~XO0DG4fps~V5Rjm1~2SHJ%4Xj?PzO)8yr*xMp+v$=EUZcuA4BV!KFfX~nJ7Z_#A} zgrXNLVte*h@m-!5O9#)TrQliCpGyj(xCM-BSu={=Kat?z9VHJ~3=l|Pvx}k|w?-=p z%RD}FI6F-wZZ8;#_$2a}SXiD<+zZ$|*!uZ5_it4YVB;(KC2lW-l-g2C>Jkqj#`%i| zfVHctYCBlY5Ci{hUS4egsZKX)-koq3iULh+qoz%-z(;+LS^)UAvu9O&9~TyG)T0Y4 zg;QWj&c(z;uKr+CziIn*AQnL7=%kxBo3k%8c*5=I$0qozd6kzhQEaqfB$UDG4{wM< zp(JEw&3k_9P+02bChhF(?ep1{-Fx;dgeHcPrj{=F{PCUB=XdwWA|3SYmn)VLZAj4kml`I;{rA<4(toMqN+~C_+wzir^W9EzQ=jbOtW~brQsaGEY zXO)A=@Iac!1qBS)mLw)7ZWO$L=kk(VH@bJTHSgM>6VUOUq-%vY zy$%}Rr)t|pb~q70k1WDve!-QkVf)n_wy}Q#my{LgNa#x{@5R?_K2PZ+tQ`Hw32@z8 z{roy|sn712IqP(Wqf1~F1cT+(xJi>n&6)+n(0I`g(p*CJAy(~m-Y`+4Y7>o)1mysU zf|Q4X1fZZO=R-v;pbknV&6>3{WdHCLJ72w8B-z<%*k!== zFvrraEb=ot6xt!NLp7Fz>7PDM*!cGKLvK=+((FsMP*(&9Fi}@mhv$_aHp~YYvJ@4I zc5}19lOjN2y&!1anCIA@gHEBDL#3Q5uCnt4ER~V9*Ic+tM0NlKQ3?>v52Re!n zb_JI%m{xipL-e%f!h>bsdTI{gd4wnw=)_5Wo!D zIy&9{#@X8*Ske**iBF$m*UEXbkByQ$Fs_gont=qOWencCs13_-9#@Z7t3)p3g9-eK6 z#-}kE#SMD?dTQ!QSu^L)Lnx)5Yb)~`;yw27-vI>yr)yvOc$DC{ z3zD|mFJGRVoh{?AYixJPnI%Pf0=D>dZ`r80pr|N`hb`bLm_LM18c&JD#Var}W z5HJD62wZodwQpV`ct`etC9RKOE)uR>+0>#aKYu;(2hN7&jI_AcQh*ZTu+y+5o8Ukz zXo`>{t9stLeOvTO;HvU5;-jDZ`MS0PX5HXgjfMeW0qW1_#I(nZ2@*O1yRr;&{G{`j zwbrpdgBP@vmR^tCO|FDvztPUji9c1V3Ib8Qa4|@;QHvI1TFr`c90eDhHSf~8zuvyQ z=gzXjFB?+p3jp`07v9_1WyGq|i9&P}?X^VGS~L!dUV&B=Y)3~&(SqeJgJS`04r-wvd&bX#0VfY1|Zj{ zVZ+Df-|2kCZ|uI&*WJyBg2!msaVsca%g**;IhGz-YQCP~_=b zQ41yt!3rg1(2yZT=H!x_pUU683l8z}_O8&lapQ*F^5r24pOI8f+vXjhfrR%MGilYT zRj=~m50dTn`}-StgN)|d*xUqaU5<4sOKK--sR8Wix%20jh<>cHpb72$M6mBlR7#<^ z(IWzX%9Gle8Tzv;!VgOnjl6+)WFnaBIUtUq!-tz&TVLPWs^`_~*GI$DkeB!G-(T6Y z{WpT4+6RW?kj=M8ElAR*X?|j(WM=LWw33(CW)=;SZ0N9IhpZl0t^<*?34QM#9@pyT z{$U#c2`b-{uKN5(@K(DuxGcy=)xVJVG-q-oQpBBLX7 z@7uR8z+gkylh9`94z3VaL<+4!ZJIf_bszPWN~o7%Cb%)~3+q5&M1($Msqes5Z!Mu2 z=vJT31fNa>OokgE3sAi3jtWqLK-LPE82j_w*um} znS|k>vA*fqMKaLoaV^3ndLZcVaY(7p*1&(ZW+#k8kC_h|S6*~~SG3iwfWM&cM*BBy z*6dnZS`liM=v7p+!c7`rJ~(~)v|%V9QZz1SZS!uz0G?a@p+CegOvEl^%O#}54l0XW z&o9n7=RsvCA2VUX1d*&vep_ljvWr;ihRvHR^y<~HRjXE+i*w^v!s-dF#PAwvkBt>{ z`_#Pg%5##o35IE}Kqcan=uiV}*eh~FhIp}yq;X&Xiww~^x(*$>k4B773~NqK8?x~3 z4#LLh;fvzp@-dW0Wq`{} z6;PirUp+4gXQgdT;@7UR?kF!WuP|ZXrIZ`V$y?mV(S%pt7b{mhIn>z?)wjgH_y(_*4EWsl7G40 z5lH1mM<++jN$jK86qJr2qb;v2P<&Z{Ac;Qrg|5U4O%w z-7UwiU90i>!I_|Q=l1Eryo)@JYOawTl!S0O`D{=cdw)KT6XEO^Z9F7ZL(&8`H~NBW>UXI)MVw;jS8t3Vyk>g z>vrv+&}93YUA*B!c}WCa7cYTfARG7Y*RN=e5KXBE8sLR`BEfFjWO!$CgsBc4NMv;M zGe~{)wblCwLAj6dn17^Ox7K!;c5?P#hzjl7x1Vipo(RJ>_Ujw}<* zn0R8FdhsY$RS{G?bm-91yf@Ha$QVm#6!1#zg#Hc=4vupNlu4nWkmHJX@g^m?7cvgh zDwd*?*KgkGDz&R&ix$t)fr3zwiFuK;6KYfHi0VrO8rsD!I>L<`>-dU?Mt$4?on|Xc zO5ZR4$hQR!JdY=5E7-GU+s_ZQJ-_y|+TFW%1#KkUJ)(C&J8R%D?TmFBAZK!J?t#B= zKhrAboIU8fvDc)dlQUwLE`Vz=3O#*VnTO`+hd7IkVBGleh34vw@fzA>YktNx_a>0OSlOXi zqLC?VI+QNyy6fZTf*h+mvvc?P`5_`WZ)U~6vWSnLKOgIG>g35ww{GqFfK0uG;v+j+ z&I5GTzC@c@3}`_~p|n(m`q042UKSs-=iotiZMj2$O$-=^f`T>%1~4*DS`;f`-|sOPLI!wHMC#0?686eageuzA6H>}C(KBmYcfJ;`FaChKQ1V2 zBTg)0a&!@$1f?LrX64G2&x-{>x^{9-A`Y?qbnp-Sm-86*HA~7P6Z``APXUvt5!dwX zVdH1b>OxP-<&}qE9TZfBA9XCeKTS$cIl0$k*DhbKt)-=P#G0}p z`V5nw?=dC&>t`0*(ZK=NU2%kgYQhj0Xe+h{2lr^uyi-?Fcnh2nx@0siC2l;8?I0Bu zT{(|{{vd%JJDMKxZ z?G|g?0{rvJu7d}A0#A^DwHGbwE7EURSVJ$aNV;Rk@kA6hu7VR>=ji_4@}AcQ4jD3! zPNeeVN1+2#P=wbAo|nsjO%Pfu%Lo`n`3koNvmuUv+{aFsV1d_>_Eum#NM7M!7&~#| zm_vqLz4Yu?tVjVcYA!9w9RWXc6}-Q1$ilWX7MQ4HAY(i{JvYJ%H*ek?1+xxy2LDfK zMTN+OdSpC)0^DXc5S9!^;gY*%jVs*^1*qVvhrHmYv7mK^;hvz7n3>tSMT-_lqGj*i z^&p<Wnh>ChvhP# zH!q3C@;-bjW$W8g-A6p7YX+gpvj2tQ11v677$Mh|DB>l>iZ~VC4Qvfjs%v4b&8AcpInbA$$0YQEfglMUO`qzKqiW zZ72w@P+*`O{sb!wv(AVA@eILk$ycum>ng3D0NXJ!G1y|197|^#98e!OZJKD=13~^j zZj(Ntm6X&v)|oodQ$e9V;)d)$?oJS+T(}_5kqjW?1q?=a5CDT{1~y$0^4ZGr?gS1G zLL?{_L4-KFAAEw64ZZ$zvr%WdX>EC&pPzuBFfDR!J(|K_p0e4X#SfHyRTf{T0)`1q z1o`RewQC9K=`9*GXn_8daqph+9??(cKY4N`&w+k!+qP{YkwKaWr-_AyMLA}f4bpU{(Wm!Uc`LXi_>VW_H z7GX-58=wFn9UTPxns`8c&eIz{G+%<#d~kMgD!W@)n0gxQ5BL@Y7eBwB4p%yk(n>Qh z4}|`G{isAfbW<`iGBYl$^16S2svuStUy-H2q`x=kDDE?sWI zxu7VC=9j-XB#cEc&%&g9KW1r9lo)fYgqac3y+2^B7W_Xz4vZCr2blK#Mkk50fXm-%KW>`rf`B~HsBq8w#QOw{}%*nk@RYl%n_YvD@ ze1fCxsIsW*@ZlZl)oONv)J^a@!{@+;6dXNqk@lnxwOE2B9d}_8{o8kQ>(7S>Xl`MljWZnk7%1ORXxtMHYWNEgkCsd5P|$XQ#R04U00u63GWO># ztgLjbxj{F4H7!lJr;#6p2N%CJ>P8~CnKz5V>?J;v^hq$$B>Fb%sItr7-)-yGMzV8} zTm-=jC(Q0@1=~l~o5vamrHwkc8~KQM`?>Oh>iKj%J^dN^CJA)U4iyH=NrFb})@{9z zJ*G|_%i~i7G>jmhif)iAV13+29~!CX1-ZX7Dr&IvVMuhc@vB#_gl^ZROBWcypH&{! zK$wGIgL~oW#zA6E<0~X(k`z%xyI6l?{bqp(ScD!N5|-a*Yy2@dqnz4TJcTYX{u3VQ z0m+K!(FK(SCMT~#(8sw`0LjSN7gno|+1cq3+mU|H1q+^CRr$QV1I%v1ERECCyL|ih zZtzRt%a`LJpa?^L+`xI&`aGszfMSJk&K>|2>)l8nx88MP@}*5(zF$ zOmc`0x_x_BDu<%rXLuu~PUc!zTrrzBd-h02$D!T2b$j(Nx&>Baw3n}z2f#b8?1)X6 zp6vxnID%hjn^kh$^y-4IMAsQ?UvP1O~Xsi5UVsai$?rYI1Wgj*L#ZDMq*t82jF!<*>q za1)H1KVPAK{rYSqk;{Z`^u%+b7|B60Sb*#3d|X&_oQFnGH*DHe8^G@|wiF*JE)c3Qpqmy>WH1_F;o9Z`g8VS}h! zw=OQp38WTGN)&L>-{Tb2hJ|ZCXl`BSr@*pm?4TmsAP(PVoInCgC6F5Q3>`P4E0=gK z_{OooEF~Fd3>qICUu7Rx6E*vK(86Q~tj4gP`C@Ugb~yZ1F<3#aN+%O~7OKIA?`Kgr^^Lccn9-8oXfBpp( zgNwzRE~*&3+4rd|YO>s_k_#UkUj%zY^e5Rw2N{QpArAq55FxLmq=07<`<#dyO?t-G zKL=h;z4TI@>L)!l^WWVw>q)uZJURi_n?T%Cp*OgqI944Rs2c^gCl8ZOeBbn6tI+%wf57)JP|;o>p(!8HfVwc6s>hdMWOCW^)9nk7PXl999)JW*6DD`|xHy z>pS)2Ivk05iMaB{yaN*kn`pEKQ_r~_tdWJVIKO5uy9iodCFzF2bAqr;o zQ`LCk5aX(k2j6*d%Tk$ybo8#0`I+q)X85( z>cKX`tE-wdY1@~9r|qn9EkF{vWTNJ0Wi|iiZn|0|AAg0 zb5ZHHO`jK)Jrp#9ADOy)aXdEBd-!DV9Qsg(1|B)pY-IK#(ZyZ5G?EQ-kLRPc3^Ic#NZ0(L9xdJ&%MSzn!ipxxII@;j zoj_b3NG#JZ{za$SM7ILWY0HgLW*noqxLDkWzP>)xyB%e2pp943+&S1~T)E7^;$rJJ zG0(d6ZQG=adjlNdS06s~qmU-=?40`g)YQJ{_D$KAqa`zErj7WJvoUFILSflJTKT4- zcdkWHQ@{T}!S^N5&dSQlS(-j#YTve8JA9%CIwZ_O$9a)cU0q#AK6&;mg%0Z6-uQS; zn`poH@0U+dXvL3t>1}4+A>`rVWnpHtB-5sm%UZxNW}y0=i@no0loF;kv>Dg z_sk=wPDP29^U_P2ZhJuoj#NC7g$w)Sgg8M(Oz3l{YJZbRxg=i6$C z=aakYWk0$=>E5jyn@*n|Ga2Y@6W!6{+xjg09v9avlvvK!uV3$*pa9FN=(X+pcVZ^B z-M$$HXh{SF$j`SCg;86(D=MBj%2)OM-y$=0Zsb7Nf#X@XZ;$?Yxq&IN&ijEDVwe?< zuM&Q_>cvFo>u2yT+QmMaarC#?{rKtA%0f5Q_KbHkBrSLqLD~3~VZ&5{CHT5uxH5bj zqTx#^9Cey<2`CUW_pxJ5Jxn9!qs0=D!r4h=(_9I9gUEw?V#Y^{lC$N`izjB^??gPB z&!0cXl_hr+vnh=G*mx!8&;IRE@OiXlYsWTs*@!&0{MG$YD^{q|QO@W?6BPZ>ZLET4 zewkzCtElu}HpJ0imnQJpfz>-j&I4UR$0bniU%Yx{L94~QgIxq{O^%JKYS4uX{_Jc% zU_CCXK(m^1Z^F6)83R^Q`b>1RxsneQU6@4icpDhvhp(TSs`$D6Sc-g?TX}iu9c|+h zNOj^?-=>;_ngj7e<^{Ow7~v}GZ93p1- zSKf%K|fo*w7_0fvI!iJ0LdJZ`UrVKced%xkSCXG;zjJ77sm36j`u_y_$bh zXqCeG4h|08Jg>EHOFs;L`hJ1?(&l3hzSd$6a+2U$rKCo}Bx!!F4J4Ve2MbROLM%Z& zDRoqDy3oq18)LT~qYnj~Ipehu%#e|tJ#O{t;R>FONNjq+1*=d1lTgk??Gvs|K_!@C zgu(y&Rc-ii zF(*ksT`lz=cj4N;vvRgDl#6f(Z47{|Z3HTZmYvZ@U41|1U7JZOS3SF)ur7|DUPrHFlZe`U4}BE4x>Oudk=LVl@2!X^Yd^&1*$-!H#eAvx#5p(j zUoY35eAEkIsXb}Zq*pmH0>ImN&*+~*oGL3{ImsV0t%rcD3tX^dS=rdk->*j!b-F_KR^HU*|SSx!Nh54X-%U{BZLzy^uVfZ@PHTfN#6}?tBwzs+|J3l@ged* zes}b@@4ox>hFfy#&(fuX^Y%j7;y7}ysW=!T4V6ti-?}CBMUTIONes)fR_xQKH#9qU ziZ6Tr^x&^o`PA&UoBMWcGg4DhT%z;V`U#xKnlBykG)2G<8J-?H_s3u$V3L=BgR^3tqMv? z+)X2NL+^O(-J5&{ZgNA{(#7cMPoK`;@*2f;loTV;^C72lj{Nb{y5IJMQ@d|>zT=N? zC%*%RlgvbkkCvB{+kk>fEP8o)xvqV8)U530@Dfo-#diQtdO;uQ;XPb`fA~0(Id{tF*N~L{3=JzvDYU7(tT?4a#jn{Ysmej)y0=7a zS{ zXe+=I)gzH^9c>syhv#H@*1daCOaRifV-GC+1li8t&IhHF?;XLcf@GKTuhHeTX*h!Y6?cmasKl8*Db#LrA((z7JL%kxn17gV`xe9LVk^929PSCMJi^J_9xKB zMJxUq1y0`I^JWD2|7RjQj(y~3s8sKw&1dt{88yjx{J1NNObfmRvLD_C&bTXxneBwl z3*!4}3TKf0+)C9`59e$d=cxdZvi{-gcyMl`^y zJVX$#a))N5WJE7>6~7lRUlxXHe(p_wg@;1=!mNpiW-w!YIgAT1SiT0O09x4sF2D(T zuo?%SV6a!@t??%4`BbW{;85Z|y@{1bB(qigg!P0|z(P-)XyKQZ4Amqu+q+d$(mHyt_F<=E|Sx-A{DUAo|sV-<)So6^c2l=H{ z=eKaCw0hz|1Kr@AGsnj(NEV@Ti31t@4N?x)yzO~l?MEvcaT?R?fu&bkO&o}H+-1#M zBg(fP+BHdfd(vfLy0Wz$ASMb(Z8?fOG`{EN<|c~Jjlt=+va&Yo1|_iEDChVpm}hPR zP&)Ye)dJBO3!xixJS+a9q(s?s8Xt5jZzP0P+V*oZ#K{NW--ec+{Ay`s zMSew(-udHg%GaRNC(v#=KJ{6!Z{VETw2j^8NBMxBk(OK@**uF%*U&m~55J5KiZ(t; z3-}UYUR-csn-Km)!ukqg-eIY9eS!Wi+O_D$8xuC$uqtGpGip!HVm z(JUM*#bZ8o>J*#S90^23u)o0=Y8Ju9C)lB>fJ&1K-8FBz_3G0{o}=2}N`%-4;DRU< zXA{MhUTy-UzLS-eMD*RqyUH0N90hdy{{68Kh*+k7iz|`)D4!R%|MqBw^PA3?t^itG zZ~#;n5`lJ5#^W+aM9XtDGJkVB zagYd!A4p0UBc4V?L_{YICm?*X*sk;iiX%aV|c$(%y#jng!oyo*{ zKorz|5`)FOdALR29qMjxX`TMyVuS=C6R3+e9yWBsb(R^4D}c>qBG18 z2b)}FwZ$oIKW@#jG@*eEC!eLOS2X3Ax7oO@g^TB~aio-QHFs=g~`IiaABcu5#J6%vQH1R2^soUAKN-N7P#H=4VkQhXj&?eaB8SE6y zCZh%U@E`Bqz7+wYQT3!1%`CLI@MfwiNuCqQgt5+e7o@Br;} zjZZsZ<0zuSbb^xwrlnr6@wFA0M2MT+KoG_$; z!bL=);StkC3*=wDqfqr>N8Y`AM@dJn9|^@m zIw8*pck4y>KcAxzZ$(|;@#!jmJG4dzb%`RaUiHLN9Hk+K&!Dtcty=Z`)vG7@F0u*) z0xCbPa8-X~OAF*p3Kxb%acT|i|6`1fBBlio#*M;TLE25lp##7d(RBOvW%fMG5~O{> zw`CQ_u7LaKQL?OyNLfKKF*590<~?~{B41P&w2OcINsOXFAc(qvCon85jG9nb<~Wq0 zJv1owFVz)9QY#ugzU7KH1deMw{6~usZ>0cx%T}xq7C|uymYDyTy(ID)(h;KL&fk`W zT(>E;NEEkco7>HLtQ+&l2GMQ%!`JgMGzdM6N7bQY$C&RKn^Wk%IX1>nM?kkYmAsIw zxX%s7;ZJlSt-oKiKpx9u{Xc$O1@H9yTNVIcfeOSl(r=IX9Hx1Wg8(SuXp1?3K}j^O z7{VyBg7e4yGkEAwSKXj|3h%e=qeap=aq*)fdkXKDJ!(kE1fLBYhr|GqC``^ZD=Fg; z$YSagbHv4TcoqZ<;Uzd@3Rr31wEh9df<}nwSAyI%#MvGAN**6_=~94)M|sE);a1{& zJ~z{dS5kABj4qknx48^yIJ~dRefSoLwLfUZ(CZd4(=Z``~3(T-Q2bD7w zd5_bI7TDQI!H>fbvH{p-gE223pLGE>vI+fzUlt5JhdL3OBf}-9IC)QiD6E~gzb&Z@ zbGz(oSnv&mELh>X+Y&W@fK&w=qY*2`{3uP}w?sIWyu{R*nCuWgj9$$fq31j;asDz~ zoQH=B_m3h`!n3++_T}T0E{>1?qPZ4kg!B;~I6Q*pgsAFqnvGPSD^|j`>0* z6M~;0G7xfItrsp72L}-@NK1Ajgc<7JOFfmDm|t4{WE@#Un90RS0+eNOlueE+rJB*Z z4UcR>BO|48Ul6b2Oa!zC#F|KCOJTi%>U6VFe#ZxIGD)K;3S>?0-!S6@c4xD=RPgeOKZV?P^I0G zw}fMk%Yd_(hYx|QYbVb>BQ!Jb-4n-eK=q0vrmU>3=h6luXl3wZg-a69SaR`G{~tB3 zGIH#uFS2=BU;DQe+aSt01t=Q1c^69?-hj(~{aVxc+Y2gfzyILhw-!&b#h>@Y-MLym5R-Zr z=W2UUVoJnr#u8{H?+bRDJ{M@6XcJw5(WRVhU#|82+fyM?ICUSeBh#NQu4mktl;R5O&OL?V(ILlBF$l#^ zjKWD2i~jz}&~LrqTgU~2k&G+7EG8u@bNOW7!zx2>w)c? zA_BhI!-hY}w#F%O&IDIyB6i<%o}|g^xB(sMqhjv-_}gDzMI}3hY@F*F7poLj80+gdtH1Ft zlqP@4k2@(j%a|P|xhu}6e!gAZAD_44IzwTiV<0EySp8TDaV{b^lI&-D@tX7bA1@pp z{Ntkyj{I1bA9woWe`J2Vzv@EH%M-_+IJ^9Om&M=z?n`T98)H1Y2(rkWfk%#P!^*@F z<4C#ae+w5TS}HTKLY(1VrLP*;!41rxj~xM=UPY)b@L`1Wo3|B4>GD86~-h&6GP$l$~urVeapXK&{zZEgzE^rcNPbXPz(@ve zLr~KkCSv|reW?rY?oJohB~Z=Mqq!@eb%vUvJn3+Hs|r{}8!Zp0oq6}}Z4@8TJafSL zKmGz)k?qp$W6=QTt+P%%TlLHPEF*=2tc5=YS`RA%OeWe0+4+yK5TuM`^5mABB%GKp z{E08cxl+Fc0!Q1NF~u&0IzY%UqB#s#0{6w$F?)aGB%}ZVHI<11_Yv>g=RNaZk&801 z9&9LP)66-gfQoBqW;Sv0;(jP`!brjh2{rxqzgT*dgLhyXg~AHe&vc#;6luTFZMjX3 zTM{{taU1#~xL+AzpmlY9oMJp<#twr}ttU%j!j2pXJbk+Lw<7@m_EqP)RV3aBAUf@+Lhb z-3mQE@U!BoynDdpqqHOmi&Q-6Oy%9xFUODn_p~8utr$aQcp{Mm=lJ@}JsfiXVZ$9_ z*p^XDX2nMRTNFaWVipDI(vhf_UzHbRC2>xYxB?k3j#Rm4^5+xbxGn25KQdQlR+iC} zDdMKFtVVfJvD{C~R@e_?(z`&>LFXLZR1SLEGzDaJe^{*jP=-%{L7*wLfHu1Y^6 z=E$**i>HdYzTt+E@M|aHYt-^W&z)-z9eI+hle_lQVw&+k)ALsXqJDijjt}gPn#LS) z!SYx@t-z;v>X(iviK`F?3<#Hx+S=-&91+xa=K0nrDjAmD)zulo(8VW?bqVYPAxFZ0 ziZuNMH&-zF9ugdE1~$&>slOze|4XREk@Q4gf>Q~MknA~8<64V|pS6qqW;AJ%4oCZO z#&DK3o-59Eouk|#{OHl33%J+itH%Mq``?hE5!}!t?(hs>MHcv^eV= zzY1NtjqbniALA)g#*h!b9r_x%=F@VJX>{PvtN!m5mt;wILoX)A7lg%iIx-MMpT z+)#MEc;?~&FNRj2G(;Obz`3dkRfT!*mSU9MVF)yspd(`O=$|x=Xgb(04Pb*Wi6$B< z7H=r7PJ9YtoEBoNgIj&iYua%9e|)>loD`f`w4__{^XHI091XA)pvwd)hOa2B=M)*~ z>_sXh&y8Ih3T?h5{)+}ut~ggh&)A>u>5wR8#itggcRKVNd$NC+XL8S zOe%?tGs7Lz5@s%=F=HCgYH;i-xd6Sh8{@h39Y>BHh03@B6$|IO1#`Jj2-3t5?Em(P z>9x~2e^Vqn{E__b3ZIwah!}nYg~e2|Ddac~>!lphikDlAzoXu{f)E(N9YwPxx;Du7 zIrF1r7|_xS#w#XD*{IEaU~?8-p8bB+TFHa>Lc1q}jK97;v% z#WFSUJ=7|$R&9hMaXtZ^Q+-TqZo=&gV4Axxdyy_D7#W8PZlBZk+;lfyvj~JXfN&F* zSW9IrOlTL5Scb%S3kPXz%{cq{+;xo}qWK_JZxOJ&z(YMtwETn`B6W}_4Te1AF><`adJ=E$U@%+RHz zq%=UQz%@>1Vovu~y^l`LE{0?0)YM>aIf|lSnVL9g2q(BWa{~EVn`J`-z5N)sEDNM_4N)5gP;OQuX2%-FR!hcGoYh(bwXR)VBsw3z3Y)9cR{)08m@^p`(fq z#^#;@g*x8ApgB!2F01kqloprNqS2Wd8OV>~zzj+=E-Z0eBIj^o5EQIEJ`#Rj2x>4A zUuNUX5YB5x7I{u$H)(ExO1Fbd+TxQopB<*?)!5&_C1G{|P>vXQ&M%D+_!>bJm?S*{ zR|i2vLqVwKH2m}4|L28UL>EnOZ6EaK0}_cI6&!#mP9nm!$iC^-yLYz%1KewB)^c*w zw(LbuSpae3Gc@%;OrthQ*r10ldoGm-9#ZmY>ZPXx*#<1<3UMc*iNb#b!2caO)Jp5f|uowfS)5S%2544#MsGL|z%o4+JR z%3;|uT%i1NgTu#F@cEZEFwS=2Nv0;~<)U3;k!h!eCANIq1eB6)=@yxP)8u*u8rLVyA@? zhxa8R>s*5Y#Jb>ZwpPYFHHo9OZm@9}FV2UB;IOMwa{(NG%L2dc#y`T40eRso28%$6 zu5F4D3sH2-|6vU{@Rd!Rx>w!CBn;kTsvk2KDKJ%O}GgdzA)9NhZ707dft+Z4M(KaQU=g@={!g#a`B6~VQF%S_5MbTW4ivI{r!5RM=#{Wz*|JZ1l zIVhH5?ggeKU-nC7gP(;j?SHy_%7HK-Q=H@8KUgTZJ0=^b%=o6BVGKf)9y_0e=jF-Z_eFAKd@Ip`l3 zppQ-rxvum50;KpI5u$57iPM`=&~=t*Sn8kO-l;YeV?II*1cl(-W4h((-=E76D4PI? zpd{1<2hIa7V?MH#5xn7tM=NCS4QAQ_rbOCjf`YHFuNb;uBE2ie1{mR-hu%x%Xalr@ z^2G?0;@6j zvOXrqAv^<$t{zr)<#5-97Y(f&0lK~o^#)()dBAaln3$kTyDfdHuNdfK z6@UolFlUVE&OT!*j+`LCgwDc&uTsFn)sSxLHI;<|#Gx6f1+p}PDM2t08XwIE1n%K) z@&uIx=YeQTknEWZVwi?26<$F14313W!=(QE2i88CC4TwLXmAo5!PQd}c(xmG;)o$4 zek+yWkHj5F;d)j~x>s}XZW&P>%+OGt-2j;`PWI&4f5N!DjtqL_Y<1H>h2;wC6@xV;y- z7lxBg3tS*{n9!>$4g>Z}(`5{WMFfw^f#b^EeS zN$1eR7}XxVcb<6uZ2evHd~Vu7(L^zyQkNWpI3&)nMExaL1hiyE5AOx{Ct8KS7ZwAJ zlu)P`Mt|ZUDQXBvFr)rB(~TohF`tr=6;@(>PW@J2isWQCSA5n$FeIR%5| zF;_Jx1Vb9)<}90j&vz*QI+Snezs~p~RxOkfcS87lyB> zxeBDaxl6|u?upia0n!{|(I)?oCxJ5FnwBt;U`p{MznQIpYQgK8) zz2F&cRYKJsOJ%k9pYC+tPA*?DypCoo{rjrZltjf!9C!HMxr>FSbwxos!QXbP&=FB0 z$VyAC;aGH(sW-H^&GZ`KGR+_}Ktm%BN_I`|Ev86Ey3v=879(0@2np;pYFz)hAj-6i z4LdcXLRHEaDwaYV&|u|&n^k8`>AI;UX(+#0TNMbr5TCiWs%9O4LewGszvdDDndcu; zS}@N;!3x433zN`+b^NOq0kLcr7{hO7tp&_7p#bAI`TpAX>$iMhsF$EXVoyR$V9|@G z3F}BEnu2J6TLS#f$#*@y&H{6uLYa)2UjUrcqEknost(wKZx-nUY<{;v9-o2!kDqZ&61g?PLJ_m-hWwox1k{;XfSN zp^5AMr22UEAYO~pu#`>bE3w{-w~Vuq#kN}haFTOBYPj?@2&*J*K&#rX&WaAjKZMCa ze%hhK@mu;uVw4rnHp@@E;abna!=@hD!LsNBZsn52zs^OC%~7>c@PBjMKsM$ zm|#Ww;JN_nPO>@Kn!oXbK5W?$4B7~Otz}1rM)V?aG-#{Ii5lXNBgH5C~vL;OqKqfE54Xu}0XD}a29rHMucvHyA>KDzg{5xpKub=b$hG?>khF7ja z+q(m)ycjckFqTd~{4lp~ofQdbZXB#K*8=_2jFFe|2xU$cl1=zm z>XCebA+jT|r5H!DLp5=t(<0#Hi-NYRBuXXv5Hw*)@j9ue9V>$yWZ%w3Fm2qud+9r# z*_8Qo$4xEz-AURs&e85^?<~g%i0wCTJ&~TjZ){Bs#+|^z{?}5yJtmV*pjNnE<-gre z_2hyhi*cZJuGx#*^Nw|rLW|g_dz<&{pnlLe6~1$M9D?iO;gE2CQz>e`K^Q9$GxP7Q zvzS%VOTs}q1Ev+lkw{U54(kK>bUR>p?4kP8t%yMIWBNPuMe!i{VRGouE%@@nR?J&& zxHXR$vPN|)F({}~zDH&T0B4DZ3pQqR@}Di`-xdLy39w>STX5D^Y(72Zd$q|xg#7Dz zHl`3?0sqW1Uw<%f30z!Q)CP>lpO(2N2)8&_kAO;t*O_q8l$OaGql3wrpJ>P%AtZe} zFuuI%x<%i6OoCYmw6;b#ftQ?Y3JBuTLHXaow_QLKvc%RC^S@R0U`P#h3iN`{XeN`c z>WTSYzeQBlK$35v@?zhp{bEcw+vz{L9Fy-uC#}YdPm|uPY~S!Hn@F_OKZ7Jf=|0`i zt?Y>!9gtEMxSCC)f_oiEi)gF?VUdwd?STwO0by?W?czP?Y9kAnsqL42kH}{AcNE|j;2*qD?llb$(DL=ya><^Nijnh z8bTqsrNkS4$Q$uFxaD6Udp2}Rytc4L&>KMOP8Dn|B8n5}sA+S*=?K8{9W~7HOxEyD zKFS3Ox-G{GXwIz(F+=Ji^^ErGz4ZiLl+a8Ad)SpGVU+5V5$#f&ik$<6X6e*)QwOiF zZ#!pbc7GrR!`jZhNhVO!SU?RxogJi@E^(lGlN4af`$r9tLb1ug-ac27>;V5y?wErT zQYgMu*B%HXWLjf0{SDvE7D*|{GupBDs8)z602-PKp4t5kt3c_9ymh**!~p{mSf~$8 z!jWajYNg>0%(n`l&q-tEiBrIQ zMAJ~tixX^Zd)}EuBMfO$nK#81BkEpK^c{HLcr)WXHM&hr^-=)T;K|_b{r2x%T|-{T z!J<08A$a6}=iJQ=!9UN!!M!s?6Rg^;*7;&q8J&kx1aQ`RvlKOA1~rLVEdt(n-FY`C zO%sP-izp`21*3=oO}~p9SpN9w`KG<^4fwB7hYS-sLkmL2*Khn(_&8_w0%yq>%p#Q9 ze3z9z0C95gg-Piq(9sY8L68O8t|S=&tRc_sm;Vn@*LXU@X>3}eT0%Vc;%7mkHaWC}%XG_@Yz6cQkzZ zsCvL6Etd|`v(;1ytI#2JJ23@%B8tELSLb#3{`=-=Ca&Kl4#;(W9&!(8$mrhm(r|-w zzrv_`a4m>>%K9VemuB09tD(Q}wI4(O_4~%tYAOXPD^FW~Qy|}@GM|1#H{F!8gVlzz zsSJS>UZlcCrskkajPz?C7{G7o*zNK2WL523h1?xvD)UY;Wz}CuwQYeIT4>4 zX~IX#=%;%AH!g|nk_JVjdMGwV6XOY73CtWp_qN{rP0wXiJs9S@NB}cCP~)3 zYoH<#caxTXT-?i{@F3#w2LYcr2$)VvX-1Kp?w|X%rLciUu4RjklHMjG@L6>qApG&> zhdXz<&8RZo2Hjn*3xV`lQF#t3XDliz{VaW2B#7&^c0UYpMSxzjlbWJGp=?gKRRm23oHwFhTs zRh#=zp@~Us&mt}q$Y9&0ONkLAVE}ZQopT?9W$91pTJ=V)N-Kt&m9Gwu64kp#GMC`8 zrtQ!OJ0E^IXI5D7$LAnB#OFCaj}nAk_%>g0R` zP2K8r)%z!3BfL_>a7Ph;6zu;?Mo#MgqhRaSV)!;CWgKD`-Tl_Do036 zKa5P1nbjB98Um&-)}HQ*qlU;3`iUXNA6S6s^3V0H z)t5GR06;^(GIB4bp;V?WTax zmTCN^#|mcp;-~KhVl=UaAe8%ka$|PBy;9%-U36;T>5V81AsV3+Y6Z0~Iz`HOY}Mw* zBwFCh)ujuCvw7pjJlTZSeq4ojxt=yafv;cj(pY45afZ zlw(GW6{entz?H{DR2e=QiQnP)RDfWVqoGJDNfOA40J-QG0{oSQ2K6U7{(|}Q4`T|N z9$aZjBJvqRqi5<0%4Bt51GCT8pkgX#uV@;v$r~S0R zrsN4>bl0JCXYct77lv{R&T5v@)~!{j=hz24$Bge@c?**gC2;Vts9yaORxN5a{PM(K z;#^X$A5*rfbb6tfrDL{3moC$Y8nhzfoJr(G-71wSklPF#@<|25h}-IJ z^LiGuT5LaQvp%nf4lY(Ak?Y^qEAJ+EL6!pO5h4#b=XhxmXy7Lm19J36yZ71#rih^f zmj??CLpvP`llI^~m>d`hHGTfTEAT9yoZS&SytY8z`cfgubUqUq_!e|w`>tk@mge?z zcHzH9`J{4=dO6{Sht zSdBj*TK_m8>Lg`#!Y^+>Jtq@!fE%k~=1w1MMS?z?iUpv7+a%=fo!=4c3Ve8qQgK=a zBz_^$mrK9M(9V1TDje(^r*Adv~n20a7+3_`?!f{N0PlKjba%{BOTNqT@o zDXTab*9b?_z{t;e23ZF^wU#uz=lf0^9Cw`-{Fyx?+jgNv=Pv6uwOZ)Sqi#^iVWBaV z(%sezEedt%l2~n_MMaS8ZVN0v=Ahp<%fi8E%K7-5Z@+P4X7}$9XTS36>fuRD0)FM!zR4LkP;wUh_2UO=v|zsS>)uCq zrY?K+*Tv7;cFL}h^@+p6*Wdct*WCUSe@}n)HOns6Tf4Cu>8n-K*B?ZsoCo1v&u}yC zzRLMytWkllp3%tg1YC>f-hzVn_{CkUoAa-y=W;h$02z%8Pu{gqfxk{1YWU-03&RJO zFnsU?!(DxKndDww?ho0S8(#Ba-mTZdd%wV2cz$lU_CCc7e|@*@LJO;@MNtmF@~c6u z3dlcS`Q_U8YRbcBAMS(wgB~SJR6+n`iPle);5Cj&&9Y^G$twr>aLt-qv)iF_qBM&g zb)tM`Crq7XSf^9~Y`!@qJe5xF(s=H1HRV}HS&7hJd1=qc3SgK=hu62nMdiSj5ILLS zxrq$UaU!zWcq(pZoXg!y01weaAtOf8@Ee@xnmr>vQmQNU@;=TEKXs}fBJ5a1$FkND zf0DhKidyFp#L`Oa{@|J~X}bBRrq;{1 zbig_vuYhz%vbDuDv2584H~OMc^x8UKfu&M| zt;S2q0GV3+d~eT;L0pA2a6crHcpad3N;-^efaDYH* zrV4Gw;E9e~j9hTV3|@nu(p=50h4=KiUVVjSgtrjBKn z8(2&H1PUB|X9SQ@l@Ze87jaQN>awtgMZJ(9Wyn^_!nqdU(5!VPVN8&n^6$J+k>;`t1+$2hrw6Dw(-Z3s$)!5>r>E)&ttcv=WLu&)s-la{5iP?JhQYo@xI^%PNd+hEzJh|sh}fmtbxR7D zzmq`#TRJ;Ao#xJ)$mR-2J~(Ilkb;`%#_^<&fwCvIrjnO>7c_G_ay0qNR-=l(&9+)= z4w2GEnZQuV_o~ihkwHXC0oU?kAr_)RKEl-igD3}Q5|i(+K^PLK zscfD&cgyEg6?Z|~h<|j!9P_ed5Yuq10MtdtqG$k(WI~4`D)TQ)S%Vr8> z)(zaIa}<%JzN!4V7F|PH#LkVm2&kNa96aDcwGlF+fyy{xlhq9QD(j!7wyE5o=oQj^ z(ijh}oH)kx8hUw{DAn9qL-|4hF;Hme@Tmu?c*ChDeGq$MM}I=b%!oOo8K43|9{LTWd-HR`FesIVAoph1ji z;ru2hH_~5n@01k(fOf5&RzSxer|HC1eij$kUP9c=T5Q`c3uqxKjd16>{7K(s>g=9|BwHktoz{ zVIf<73gLDyj+H8kfiJC6cE(A zg3Un}(%OTvm8^b{^InEcQ0lu%ae*PeM z0nEA%PEIK02ud!7W~I!q>ASsq`qc-X_V6V?sE}R*A}t$-Rj&JHQpjA`+Q$*G6@rRe zJe<1-+hrvxNDHtcssybnauIEyp;nfR!gjTQgB0YzNdbeT%m&6?_>y${wMr)pmk$A8 zN`1A-amEg2t`!KPreG-GChv{^{Bkd*RZ@N)*cVYDE2Xf$o;T5Ek%m1Wh?dKT_CBeR zOmu@6Xe^ejXX{hxf%3&%Be0tYu0nMiY%1$YG(yNBl`|=6sgHfz4WN!Y6B?6E;E+~> zBSejy^&4Du{{lI`erQWc=H5_Tp%GGP&ta?4u2j;xdE^K35&$gN*LsiZRT_;X>z4mE zLQ@cXf|-^br&x3kdHQ8%p36?5MIxG0U1=GiyAeSM;*r%iqt8O_gDv|3u2;3#?2MTxSMQ#dE&t?4yu3(`u7+ zotm8!-~v!Ta}` z3o{5G9bl;maZkW$IS#ilp!hf^V>&%=CuQKEB}E*b*EsnG;f^@?eoaYI8NNrR@eoVj zxF6$XjI1MKV4aTW7hpte3SZs(5tIDRaEcB|V+*EvWu43RwQ?fonJf6(| z;$Ac+jZkLw_#vB%WNti1fEp4;kX|%qyu>Ny1s#68l!FqyNN8`8MgpO#C1&n5CD_Z{ z5127Cd0a?*@Lj(Fkag5V7;P!xseb;#h5mI`2tWal4U%k-jWif~-I`nHzBD%qcq1D5 z8D5qR7zP$4w^Fqu;X~lQRDSN9ru$AexISsBS$LgpEdC16U9;AvZ0hrT);+lLr7-R= z-luW88s@nXAwL!o%9-@6$wt;yCqS6QX-OnKPP$TxWBwEOC3MPba0<+uWNLdsNfT=T z81j&6b8EdRT#y7A^8{zs2v=_|=BsO(O-*R4K!`=l&7rP`G6q|YpZ{0?J=LE#}A5Pl=%j1_6F9e&A|%D zrJm+{$K&tb)tE~eg0ThYT4W0}*yq~o1DThihh-S*45R__SrPcZWcsINrf^z0af04d zy!r?39;LkV}La?%6LoMz%beVUsx- z^CmZTM$BNC7P_c3Gm!@H;H4-rnCfz?H6_MCZhO!;OzX73cS)&9ReRl;WJF`E?j;h$ zB*E{;L|m?X6;y;;Er_P102a7_GqZY>`K29$KEcT;NHQYjLbl}1l$~qN(%dSm#l5Ck zSVLEeop5h+&_&vmh)qoj5oVF-BgMI=0U&}?s{>}zO4e^n6}q^!qR6%7D`++LV#Fhw8@%9F;Aya8q;)-dXu5Yo5qeWwq+hw7We3zSLgrG^ zz>M0Qv+@|xz`Gkm2v3xuAxCy*$o(UqbpLF6{Nd*h5);Noe^}-3hE@?@n|#s8rQNr| z$2@(=l`hSV(#+2UC+hAL1)(a&z#e)M~@AwPcIzk?9jN; zgE4+j6UR?{+IM*9lcyPd`}I2_uYAIbiz7aZ8fAzA?sH!VjnR1BxvMpwG#JunFt`R7 zaTNPJYlOFLMZj?)N1yrnE+k|1zi(7y7CxBAKA` zZH;>L_l-?D9WxYV33Gr;_;Nb=mErbE*fYBpnf5*% z`j@R}Mk3S4_M#BO&P@Xe$U0QoBL)X#b7o6he}kMzyw{mCb52NYz{@}Oh2CC)^MV^& z@iJAVF$&h$aBABOu#fSJ8PO}LAoY&UYxY7^HQb5m2~(3MW1Sp7V4CMX_r%bE8w_GZ zhEMOvK$;?cIoAL3s;N^yARCG&J+6ru4zNWXFA|3VIr#98J~Ukw;e6;z)uaARqQKfO z@M|T7u3fL5vRFlX=gZxYYO+}e!VNZT*f8?aB_V#@F;^6pl(d05hbJ|hL(OPR$KeCaKI3?#(<^4=0MVxiI?+8TQK~8SxXxD9vA^?q8}+ zffW`LaqQSM+DVgdQ(I7Y@fI_Eeak!U|J?e0X+P1gs|HlkmW?er!#mt@9vL-u?0S0W zIR}>7e@zzwOIG%|S5X%Dcdj;mv1})zH74Xu>rZIx!$rqq+|@JUtng36 zWSLRkGuu{X#0hBR2>i^!drSMQAKoMdCmlE&&e01lyiq!Y=Ku zm-jL6d*s2#C51MUZCJ}b5GJSJuwmgp4=sZC@5h{cS}Tj2 z9dWP^J$rU8K}$7+d`6Y;t6*j1bP~}@j#BakMAs0R`tV_Yw6fN%*)b^E7Lvtd^`c?~ zo?LE8mX?-0zS*l*m2(W`YuJLkSPxuS|QSVaPhW(GjfcC2|WTcO@# z{Bb{(+i7l?lY-hJPE|&UZMl6<+QO*!<*kCb$@pkcbq>s+XGl56qfNxAKrQ6f?In7j z+u+(^RxSC+N~A~p>vhd`quh|ADA?Xzhicz^^A%MglDt}6_vJ8&iUJjx-HL#sg z=cuGYCb-DUoYA?Tn_8bFP315yOkBq^R)qW9xt}TbfP3MvBW({|q={OZL(a+T6Rok; zK0eO)K@%wZ4jycWn-JeIj>_%WUw^HzZ^t9z_FrDrp{fOO98ux60Vh8H_19n1$$yP! zwtzpcP1~FwXH%)Ht(+C8l*`AS1?RM+lt74;K`wao zVH*dkbt(7MoXG~W+uU^w(Ue#-9k-dDyN5TcTKu8oQZ^R$i#(43yq<-f^|4h-(Ypx= zCt*j~KsVW2_Ej)Dr!I`?EyGc24-XJz=2GBn^aV|(gh{p0_(TIzlL6hqD`5Nrh6zkm z>#~P>mRtCDNNFg_mfy>3MR*OpXP_rJi-2xwXlzZYB*a_Z^86GiZ;_K>CH1?mFy z^GCzOXLBoYd7T|WRkW9>_spJSys=-#FaZ`~u^@Cfnhu{m`$%%3N^5wF=EX6Uj%8|Z=vF>Zv zs@0d%!rGN!GKtikQkMmC99?l@r2hv={TNDs3N|YNzkL-0w8lmI&6ztFjhh*bQnIsa zYEdl8w9xzSDecyOUca3mDzrw6anPWs?E~yhOR!r!pCwjF)-8mWDNQPJxj9+I*s){P zO-!V8SE32xfhKHi6QbBu#`Z>SJaovEaa^YL{5zb~APk}+V5s~3OA8RBSWZfJGu?wU zlqeRwjFUa3Au)P%O$J3<4<*~urk;p`;I}55`-J!*Zgu($_?wU7=UwWtJ&1xXj?9rE zt6G9bR`NQm@XB*#euXACJdR`17+IOEb%Wl3lRWlahD@AQ3?M%#l2bN1%hpbQcDN z@i%XVPVIyKkRdl!{BBh?O_lHCYXtkm0Jn>0R#~| zT=P)+6dqEHX^ToG0HhY?<{$V1g2^E)<|Lb(l*MXX@|hUf@URx0Hq!^F6^r^J1qdkq z@4s75G@02VXcr<2d7vC*6x@IzLrz-yT%?{zr>B1V&Yc5T(9Dr@7pk$PPsltRhz1WH zY@K#d&xF*H`nD`vrIAO9nH8r87=pUoX3qTBu{AN6v%Psh)HcSD66iUVar^h7cFeu6 z9=~cF8u_tM`os&H%Z=#Kv!_-nq_8@%9W@K(G;v*mS`>|s?*FyuL=wfs2{ILq^(a3! z^9g}t90S42$QmE=o3yWwCEBA!Myj{wZC$iL+dr}qU$q;I3zimcQO+cbjbm)2E!Ua01 z(|)H6Nft@GnX$D%1AxHT5S`8Z5YjH(S_L|9qhIE-hrr|TSshJt`7H}Gnc&yWg z-r0V+=;7KeFLMwYb8hr_wG-b4@VRb(4ndaV1&dvxG)C=!r_iex?ImQJ+APt zzP^c?)84=u4K>(W>RzJS%wCU5a>^N=Hk~2ea6wP);<==aPG%N53JoRi=krhFlv3Kkv z8?!~HNI!2l2x>u)6x)WUAx|ddm5S#tT)SCV(2b~VXsYq zk#eY~pNHmN`tqWBlPt;BkXao#&XHLrojQE@XO4iB-w08uL0VD3Lvf?VLlKi^SbuHv z{LvSVQ>B5&f&QVRnX!?sX?5EgCCOW7Pn-7P`;&k6A~b!HHPb4kCTr$&yhZUMYPURR z{e!9_oQwf);~h+9A0rb_I}^Yfh~Qxl8Oesp`5Vh~nO^tr-}hKa)QVopsR^86J!T}9 zkX1&&%Uh>qBb>gG{XWNmY2j(MlWqNPtN_$p--PMkGoAfDpJ1JK#xgtb>VfeR7Ly<{ zRVOft-aUqBn;~6v_H)^#+eB6m#IKj$xjuwcPY!{ZeSS>4(~jH)ZYzF;vr}Sf1G&cl z6_^IX34i(JmmM~pSE4RkFIqgHgeU;{K$}ynC(J)@I<#)pN{13xr)|f~@$``Um^(CE z*D2Kk-A&y6`)A^x0EQMTQQ}xkWmMY@8Z@AI&$i1gm|5^Czo~xW2XT+nYy_d*o8jpN zq{iIj;Dez^qs=O{76N}aDkwG`U&9HOR&y2!G#Pt>IWskqS)}Sv-dY*3^=HucWg5Df z`Sk4F+mz}(mU~2mSOEMQgKNo5n13|G5g~E~{rvOK35TX#SuH|-nu$dr;TATJsEAL! zbG>rSnnhXH$zQ$v7LKbhz=$U`Aq7d_vw{H$Ebe$$ln!q0?zbGG<44L$1m9EZ_8f8U ziP0aHH`t)s`WsUj`(-#|EOQHX^i~;6@WM!cmN`qp1$yA6wcJ(ZEvD?Ay0*Pd4RO z5{-Q6a^(h$9Cv~-n7ufQ|nKPf_zN>wvU>K+p9Pq93MT|Ueh`7pA_CpPRC`kl<6@^NloqVTZ=>^W`6%4CUeZ|p9T07?X zvmfa)kS1o&$m<$Ew4jxD+sf+tR5GJc15A1+shUbHTl6N(g-9XBR|%=aZB6D zTmV=ruJH8C6)RP02G9YxOkV(fvKfHD$pC^+B|qXj17&_5lAYDK!N_YzV`3H|!NxdX zHnM0y0(JWyIAD#=Q!YE82^1aC_zqGi$tMMnF+l_!flLG-{}~sV7V8L}gb5r#g&a$@R^7Vl%O|NHgUB5GM%~b=fw>V!{`_;X1UnF*AX2v2LKUrs z8Uv{1qfbjWrBMNvcKNDR0b~AoG9tGm-9{qF^5n!Qu%yz~eD^HDoYtdx>}J5%V<_ij zg&e#02%k*y7Y}B@(-8$hS=f{bK%$2sH8>B)Agv+ZGPv_5$OuVN-(kbr0I!1k$BGFD zJsH4HPNLqEMuq!YhZJ4{dMH1NB3W}7ZdMEGZ!nww6p?cLAd{x=VZ+9am2hm3j{W5g zSLYp3nKJ;+rY}e+n=lH8Hj0?jV9RKfDnOf3F{*b$1=q_JyaTZhf7rfjm(2YH2C_Xw zgJ=T%q3o=QGFb*bFT;`qJ|M;gblM=N8`k^{@^xvHP@bW85K&5lQS70gR*~7(;Z!3f z&=hNq&`h!+*d<0a>_sR^exfRu>5}Z7r(e*ijx;2<^#?N+amrNnJa>VAKuU{=lcO7` zJpjb^(xpq0)ezf2dEgy2%FV4WH7s|15muG#2Mt<~Bm~Et11v)n%zXzA)EtwLtY_6V zAH)-gSX^`e?aOHwU_}`*p}g`U20EyJlHiI>naMQUBfzF74Lb+bi&`h&9Ek#U0x!T+ z_z)o3{ITZJu?BIYLIMN)q7+1@J?Vj7lYEYmK4p2XI;2xfTe;uR92!`89UnlBoJt9QZup|Wo|bk-gWnCe6>Ll(@XH(SVGMLg;v@c& z0D_F>mll=4f?Av*tdnmbDX}sdlhTdGS1zM4P0+^ zv_cSta{=i2{iG!9((Y0x48R`&jYxT(AT7=ma!6OPTx&svMU1lkgA#}x#ccu)S8H5e zsD`b<>p7=}-M-zwOa9~FFzDlWW56)O<~qf|lK@{#?) z&w8rm;L4tncM&uKJgNns^ehqaQ@1U>Dw3oiIMP5Wx|rw(kt&wKddYWRe&OKpX_Y}T zaM4unJ*O=p6)WWV1Y!nk=AF_3W6*;N=j6Mn)<@&tB`!HRf@MkGXih`}BiE=-9whe| zmP+I84V#XlK(@X|``4yV2=BWTGa!{?a0VJ|CJ$$D1(4nBejq`@%2|xtDc@lPhEy-G ztKcpML-t?#>o2Bd=zFU7huoEWF}-jqrS<4X2^|S5SnI1c?h0?wk2*u31PrAy%#B() zNKz(Dn1D+M&u9gR6``06wJ4|^q@moyU(W~BqsVj9{5=ii1K3e?QcoYi9EUXSx&dU( zRMB}izaLnsev06RYlj`%k;F~q5FU9v*C9&^9Kg9SKVVPkCKKw4W~j7aTi+w^0}}_Y zmMquVS+)>>xr2$SuvfYLyf2?!do1`~rWS|cirvPItHLx(iXG{D)q=OS55BNmJmD?r@Fbbi z?G=E`VWlb@Fk1#Nwb6;f$(;k5lnw+2p<(03WA0t}Mu#D9A*M*F#mi$UshyAg4bq-V zSFR`t=YVIf2i8qY4QL203Qmf8&ELG_>{K%Fj&7qz-}F&{rl&{c5+{N5WHdi26Ym2r zww;SOd;;r2N*H-jB>S(7) zt_t2jJozFsTiCL0qS)(p_Q3N{B_JyD++$ldtx+;S`exZ80@@-ZfU6s2!wHMC2KSpb z--WgqxbOBP9Xp}Tg zE_G!FAcr+lPafigC--N<1;FtMbOv8DFJ46QFLelbl1z7~wge7Iod>d9M&idyopoCn z8^aL~{w0xxzkge}R_r>k92wKXnP*s1n6Ug+&XA!*iho0Wq7GKx{cR8O+0zF;^QfsvF=N}1=2n=L@*ejE z5i&Eqp?j!UWpPPr%in@Cf5Gr47Fr{ib4oTl_(>F{6o2fN<4`zCxHLi)L+s~ppI??Q zFY6X~=>i*)%?8MR8V11t?tWaZTscera8Bv zJHwI~2-#PQp|{kl>Uz{V%k3@QHLM#6E^4s**F#nVps^==&~bwqELR}7LadWCbR?q! z%Or6DRiNr9$2Su*!?;qm3v({rXk1MWMAS?mq}+38(V~z}KiJURZgmnkCA%Cg$B!PB zSx!G^XZ3XCE))iN)EOy;l%Eawh~hLC}}UXP#OwJby;na&N=Thb75-WnR`@23V!|WYQo}}#*l5kk$I%pMHWcR>yLf&pi-f)V_GvyV z1@2_0&3Br8{o>np@7~=Q7ywzNCq#F7eiEBK|SHCeiTh~6iPxhc5%Wx0RiT} zt4!g1aUd6rYZ!cRQsr(OR!T!Ft2zTu8pC*w??BuRT*47<_3gLc3NAO?3=WCF%?M#( zt|B<`B`YKkwsj_`$XW=j1|cFAY_nyjLXXTzewTf3QWwzOuS2xu>CL+t!J0GouPt36FI z3H4CJDaZ(sTGkmVKa>?WsbC5OsJz8ZeWO9*d8>x%hhi0n({mJjI^=Bq=aVkiQNr>^ z_hzJ(@S32l0XwluwQb&<;{d~vdB6i`NRS8wa18KdnJ+)xY4c!^1$C?et1QGv0P%wM zfY`;+_dB}xY67l__2S+FChN;e z2g+BnyGvxEzjOyT7vOgv{!a)&kZG~8F#w*F)xo$MMZh2S`CwEt}C$?zTw_rSMO{+=^WWt8l z4NhBd(AKR!?aB85BtgkA_HLX14`)EyXbQT`xvxYX@}whm0E(h1`}a472zc$&3J>bv zAHU6J_7=r(8pMqvj03nl*&v0@h!xA1GxCatf;BKN2=x$yMU|n8lg2lY-uD1rOqUWz z(L8{F+XckAT8+Jbk~KDJ%oy^anY;1nV3>SMq+6yC1kZczANv{Ewi6k$2uDOo6}&QQ zlenq_QwcH0&VuF3TLC(P_WLjCP_;#kl4BYmTn=N8bcHzM9p-|^qYrCFapCIf3L;+m z`|rOuUCO`}{MK>#mT-u22~H%aSdnRH7XVXDj0z>F<)h#~8@_qm)`j7>St8L(4UdfV zx^CT9Vz2SFxD0fd?}m6yGklDVCVG+FgFj;pmDUYeEcYq0cK!P6IbQaYH1K@g8gR@G zq(0dj9K3)<9~K!C6M#?&QY(gbT`I}^*ZL!;G&x;MtP!9;V2q}9Wy5jw63?3Rm(QL( z%Or-fsNCRTnHFay48Fi3wJ25_po5fD!u5Wn=us$ENn2bfP&Gkl>C&YMEOt0t^X0fzMFW{) z^#Uuuz?DZy&7y<^khkrMI@7p`aD#$r`}A2o18o>s$A=P58cJ=_)Q%fEtJ6aO2!Ues z>$e#+EVBf>9K`!`!-E`R*u(|)oMTUZ&iZ$BBFGWc6&D=5f&jB{<;v55o*3}?vv?mR zT~Q;d^t(Q$P1rX#$Ya^F(d6<3?4ok%CH|_8V)>$~Lg zU02`^Nh&I-LV=KRU7Hb2kINvCE%qL@^xDnzi}f2mylr)aiNI6G!wPN$Ruo0VS_GyV zqksqEa4gOI|M=rmw2AJVVxZRva_pvVWg^3oK71FnCF;ASvlhd$$byR@_lq?y7(NPI z`R+gd_`{>~tiHbP0zf`hzGoji~M10I}Qf4myiK zJ}Aq7rj96jlRQtIXw)(?G}NOG(uywdg%qT~LS+;vn{g`kkmpazfkXs#DR=~IB;gW* zitiT$#t5*YsMb}BujOQVc{>S4j0sgrORgoQCK?JWsm6iSb`u=71qHQWYcZ}Q0w?xX z01mKig8<=h8Iph>B&Au;+;gHW>P){8tAhnmZhf#=kCy zBTYI+H6*l|wA-Hns;KsC*L6~vemM*PH=K-ex%K!uUY&6SL(b5V3Am~P7;pw8d*{xb z*ts35il4V{S#3%GL4&5XURR0MO46iC%fcH$w{imDa#)0!oycx$TUri46A$uI2j&!? z>1mqe38>URIX0M54rLa~%mVM9sezkN>F$`yb*NfAc5dft$4;Lv!spWx1RUCuk$*n2 z6M~C*Se2bhx4@9|lyzt_8I{l%Due^Y>D2AfNYp(#a8udzQLQ(31=504VXpQ=AWMNP zu*=>=YrZ_$5lG5-qZoJY=3HX$pb&#&EMw(f zb)5OKa40DMCHZeO#h*eq)S$RRq>{}LOtFa*VMIo7Z*g>tg0HhBnH@3WER8)bZK${b z`g`*9fN`BZF7!U5BwpMu!?&@K0-nIAnGVHfAB)}h3Spv91%2vf;?#xp!jdiGPC4uYa|qwJhPPEty4yd*cb?dfxW$`|&#fNF`&$><;U>6+R2+awPPUI{ex@`e?(b#g+ z=m49E1ad^~_v2fShIGv;f|i0!%|~N*smTR>D!$wf>W@G`k86HQMuiMn*J*>Q8pAa-s1ZW=fW(W)vU~88+ZMLgXGR-Xa?F-y}Rx%#E3DEcckfqBw zI8ZR5;?1`qNXAKoAz*ZJ7PZaU9~lAMIz9rC<>A=aFUuFarXR?^nEIl|o!WR2(A;;4 zQwG`s5o=z^xV=>h1L#{xO>=e^X%xQ0zO?Hx-JDdHCygJ(WFEVcT4WTIl>ugy0-HCt z48-116R3%+8f3jO=PlNNou3%C_26;t%y?s98I}fFUAkp~;Du_ej@yl$3oGI|>Y z`-$l2g`hVitqS>6`_h2(T~*L>f(I|-DKfC6ISs4XMJJ}1mN@@YRnLDcKOMM#>RQXb zl?vUi)Vx?=*WYK^jhJ1wVejr=)@wIw{pF><-uTL-V#oP69cOe69^Wo%(fYX;oXUN% zXjioN?7{QO-X8ensv|#sTB6L18?EN7Sr9(Gi;VCf*xz5~%xTf3i_{GQ9CH33FbJZ8Do&*kGGR+L z3&*3NuZ0$=u~ zEsrFP)qH65-)LAh30FNcbWii#pv-SovB~)O^BEsZJ#zS>I1=)If9f#W@!f8pE}>g3 z&1zB-7ic-)_@|r!P02T?$nj=?|1SgeNAbZ2=^^l(;aDotPe&F_(>1PvH}FBeHBv}6 zgIc73rx^fr5(v+TAN427gxmup-gqDbz16>VuILSvxPeHiE`6Fj_>{q^=5!Q@v zF>CGoB}aUBxbtzOyMc(wHUpr(H3Bq-0PqIl&*&S+Y*qXU{SX?8 z07^{ygg$a|PkE=4!8Sx*M{=Y&m{n)Vby*rZK=M04V!{EKb|)7ikl&77)cHAPXV$Ze zA!=cjvlsoxKmGKRoE@G#87qnq=ZSd?gaBKRDiv9@H(6nHRFo7ank4|MW`@26cM?4G z*qG7?QCQ(q-XQ*INOlv=Lo5}N{voS?Hz-3F`uC1aj=^7QmI_k?`$K}uheUopNUXLo z_(-S}!A8<^adw#LG6fpD4oBdE&{<}S30q2ZkDYTJX@!JyeKK#B3fi-03~D1xZ!{H3Zdv&3A~2HG z1dyv54EbDnD)4+X=*|**3>j|2kqh0z29Z`Qgj62)x1SK*rAr4fLJPQq?xsT#l=@%e zSi#XU{OZ0Xa_|Lel#wpw0e-`WnVZ(KBhclEI5)Mwu-fsYRTnLs2$p7hnb}4`BTf=| zCqf`Xggtmee>IXa8xu-e*vJict6&85Ht9!-YIp_uN+NFB9x$Hrcs4U4oVa)!*OR_^ zTUl-XYV?_KP=X4~kFO*NOwpvyyqia?9n6_RBQaik6hSW*1I-Wbx9mt;mBu=Rtm7#F z{xh%Cj93;)85GZrC% z6b&NwISk2Sr&7@HCFBmAw=Dg5B8Nnl3IvnzPRsC7@CRc9o9c1^eD%#DSX%)6nokHNth{)TChD`@Un4y>wC zFfK0r5HZNk0e|bo_7#3wjCT7YJkO=EZQE9TD}q1J*^aV=m`J4Egy62F4MfjJ@HDjm zm>(_ka()7asXrS)Ymb1jX!-JA+6Ts0&@igJV3zlYJf0;6N@+xU9XLb~T~PCNn>Wt|X-T=Y$WeNfZQNm&D*ve24d5zk7ISUz0&57z@}FfR zq=q`w9C!{ZzJW@!X){RI7%?Pxj50UN57GL31XE;7ke?7B0ac60I;Zxkvw2UR$IXEj z#bhnw640!jmP7XAKG`jKcV#8WG+S_@*mo?hBfeP4lG9@nTL=dd?SB1v@;KmBGw|B% zbf0YQ9gCL$DpL!xA{OqYy`#*b>29uCpY}W?y)j4ncdLD_+)m2?;r8cg&YSnSoK~&} z#3UL|`mVyb*^HP>$(R(&ef?O-Z)Ow5`yIKPHfm3zyH%mp=T2OefU^$rZ4Thz(YK47 zvrhX|o)%uYubdRa+d#Jps3*hVsLZIwY{(mF8GB3d=~K?#jbA<4@F9F2EtuT3tT`_*hnB=n~H+vWblSGgD5Gxvgf=YDEW zv012p6wHMbD9a!KOe+7%&v(V!9dUv*zk6PMSjpU0$*i83l!Rvd zJ<0%rBR}dpS{9^Nu3+pQyLH0Ei5yvnNxiOInazKB*W^vMC2uvz8zs`b@ZtiCnOv77 zp1WPIp7zQ-;iW_F;GJ^~@Z!BT{%-lKJ<9)a^Z1(Eu!<*1cjiq`9DyGkNc;Tyvpdj- zDSjoY)Yhg4h*LNY#kS`LFlWUUfY zZQ1f|@=`e_jJ$^b`VCj8j{&%Z;IfvyKJTwRW#=iIrN95a>4~?v5E|UdeoJ_TH55{cv&Y#BAMe-AawSf{aunx3fQ$mYOo^haY~(w8URk zTm@azqioXhejft9_~N2U2@JS)pbT})!LfN4)tiIr#Y<~S9}UX6Z{NPXS16f4Bb))O zV@2F3i;Zpf@;CW!Lf+LqjV6^sQ?O>!rr8r+KnG+HxPKiiJ4r*lTf@Dj^1bV@eD7hO z`^K3&AHKYt)UEw<-@&UyR_t2LZi(zZYh21|&h78N8xa^OVm@Z#J=idaiZq_;9W)(( z%Y-9HgEi>^Eod>(#it|tQD$`^^cPeDhvwr4JSQA1R2~yV+#pqUyNRu zw1n8Y6$LUbS5*b7ZtGq{)(=0@@<+|pocKrRlH{M9m`W$?-eYXL_#tcBDNvurJ)Xd5 zM1I87GreE(Z|}Sfh_8>5c;WCXdHrpCRE|+1p~EIR=Jd#g!n>g^Ju$FOMLl>xG_*sl zKoPobDnYVMYasY&KlKfN*{B#ss?@(~6(>JCfM=zYyST^8RJIFUC}M<~#nil?Jk_uz*7>GM!HY{JhJe=gs#}kB}QE{mSffI@rLa|Lx}Cxi)w*SUJnBQ1q$F(18o(eBB#$R5i2rchD8PyO|ea zpt;Y&fHD+;?<%`%d7l2a-7S0gMQh2AcxKftB?ioT-aD#BcOaja`Jir#r-lE0HPXDXN55wYy_n?FgnHTG=d3Q zz6FC;K)afYoym+V>ZNfAMiSkSy%_O;ZSJt~2Ne+GQaUFV@$wbxZOq+|Lw}>fLAEdJ6nSgIPX4ciR(|O9L7_8e`?l#2@q(Xo9e7 zW)7nRxB!GFEDtO4gfhT0ZFF;yx8b)XV0$UkfCH=pj)}65quY75>&tY2t6H6&5 z+cA`l1(w_3oobwNJrCF_%yBj7#L__s7zBJBnerh(sRng3o{2**fIEXMlwOLXK3UiJT9)`kyG-YuCd45Lk83?{kAYBV;8QpC`qi)ApmWB#(Iu}WkwA2js@Xb z9O%qf&g$53HVYyBLhpk+cfntp&W;xP=xDLsm|AOTF2W44$oU7db_NNB?Ld z!&O8Oj0=71w@DZW7s3W;9>NJk*;ln%HJSDHtoW`q`TWJyi)Xt~!OD3b@TLSX;d+iC z&-Q^|^jJD`?p#f{ranW7iN8#&8%Deg5ds zzgFq0Uw>VZAs1kzX)-VT5qs*Gy56uMB<5wX6U7cd(*-%f@Cire^BWGthIw~1#H>Xa z>#6QOQP6|m6%#^<1_jr|Hi#>3gNBwuvGuG6az@sZIPTw{@2lScJF=M!Rb%gPyVZ-b zx$LVq0nSc584DdbDA0HgI|QE2E!KpPm@8MpH?Mq0=myXbT8SDPNbA6p%fn*j7t*sH znKgM?!d-VO4mLD2NLW=>GX{{4^UlAt3hOQ}>pfv69vE_%OJZOWNuIpPF5VlY;j91* zSfU~_#)LZn1GpYb$K$RHgA~UhNtw&Ma(Muv8<1K5edd-l9`w#-Lj|bJloR|pG+a)y zqxp-aP`S1P8hlRHxub@>7LY55>0}R}aRGdCVHPMF1nK@9w_a2xPxd0f>}m8nquFbB z-1F{ysJDEC?y+?yUeJS+-tI5oL z+&IlW@uq-NGbN?TxYqoSudlBW%w+)RGbU1UItGYgL_71sJgoH^N+EBEEBFd|`bld^ z!lec(=6|}{zxv5c(9FAN&Rq*gC4Wc~S|g+nBkK%hS@gi!cAV{7Ut8b{dt}^R28k2L zd479U-@0YRckSG{h$0lX<0Q9F zeq)Z~NZWTU4Ye=ef4Rde+fz-yq`EMqUl{YY>Z%y$^#57?w)vlL`&JODtbHS9DHBWt zaD{p^N>QJHfl}}MJ(o-C)vvUO=Ia#GRU_G1*gQ{kH0j*sSbQpR zlF4-pj2}0yL4)e_m~A>gi!^I8v)1YN0QRNJ(HNGp{;JRN1&e2MS*IAoZ!SW)vUBGb zaiD3?G#u=vtRJQf=l_Npg%x@A>RCLFOrUy9Wb%y`H)ppf8V_`mGU86U43k zSJm!0<6yjvV#?61H<~C+T zb2M^;yc_wipP(X>ulBPW%#`eWlbC3a_$219zZ}3W@xy=@XO2bQeNbm1Xffz?Wol*d zD1t=DICNVtiqJ2({updQuXIzUe_k41AHw`7!lrpI9*3s8anxvJM{pN}6z*fkR)X=H zhjxZ^FHAa+e_gxK@T0hB>hW`=RU|vN#!~XZ@tBY~KwfH00Q5@Up+Nu#l{CSQ<`iBG zrBN`VF*AagMz1%j3S;J>UlQ-%{|yTtsLH;(oVMql1Z^ubf0cR{EMQCk9e^6lmApiA zS{gStAtKu&&YJk-ejMd)QTQbwgA{tU0L>hO@q>vn5VgjvqqZ>U=z}2GG<&p0c-2`` z)>b9uWa7xIwTwi^_D-5JVFV>h9=GXF3j&(5O1bW2Xewr{eepuu5UF~I@7RwTYvzKi zD11xec6=oX)3ucv*+JX5;0lYGo;zy5O^2d;%eYlE5Ipbia)P}c@N`m!mL1J35M zcq>6K8=+TGr3J{AcYS76XW4QD@mQD^7Wn{q9_x}Z(Pw<++YCNzvT)HN)eQhIEjwyj z=h8vNTQ^&l3c zJ@Uib`Iq>uv2VSrYpNDOQNprggu_&xrsRHlzXrqJa!d0)3p3y!nPh_5XpmTN4-Ntm zs4Q^|B2EUm#I$PPp6C8zy(K(l{KZm;zCa@ie*b`gsU*^eTyobL@=qn!2qQZd*WA#Y zCF8BO0-Ox`)>%QeW{bQgkdzw}dCz~YTpzs$q#wlr=1YTbom@bp>Mwxv77lAy=Pa6S zI9GZyC~gOeN0ycvi2)RHBz%O!N#CQ6LH)>EXlkgO4G?N9w1{$CItU%^QTQSc1ixfI z{U8Q(zIl#hCV*4~?PKmehMBD>DjAT0E+4pP&7SSCluPGX>M>kNVoMh$Aal@DIrE1Z zjX7Bg?v9(l7K}r&>9I5eE}7v>hBauDamrC2t||1qFm?;GsXAcrObss-1i>eJf-${@ z1*_?Zhzt{-;)L<=;Devk6Ai)j3!>3I)o>O>?FH9GKp02|t*||ZV$XAK?u)}r`b_rb z%a4Ei^G{iIJ##uZ)R@4x-F@2-`8UwUJt{!n?oe8ztHYsuU9+Y$E&6SLZMc9@6U<;D zl)Tv5EXNnoC1-?@rUa3XO9FfT{IQF)q^_eR1rye}gUr@neC=-nzHb(^hAn;kdzu+z$3pe&PstWuSDCp;rI80;hSR;?NME)z9xc zv%9HuK*(er5IYZJ6SOh#G&0&^ww?(ntA)d(MT1r_Ozl&Lg$Y%{>j293e?96Y$x-g# zqF%m0Hz$8o3G-cSxF@iz{juKCh+0k}0$%QJnf6Z?)+V$c7bfFM9j*ut@*Znw_S~o; zw=RZc)eCucertNtNU!jNOW*#UALfNefO;7v6VmOWr_c(xHplE26-eyKzO~3iV3Clz zd869Y1Oz%7ksG&UG^xDl(Lu=~*wyY$uVAtvy&&E&(=^nKijDk( zZOBRyRdBr7G2Y4?N>uhES7Z?I>U;M)IlrPNCT#C6f2Ze4fM|3KUZj_USlWFw^*z9i zoOcIfimdw?v^JCOP{2`+rnD z187kWkSS{H+Ld~)vE-zM3w+6f7qW5V!{g;fZe#Xo&WX&ti8XunEGx$V%DU~Ecj!_g zAnKQVpBOs??-BWKtSVt@8iCLM7%mw(==zU=Meoa(B z#^X9L-*?goUPwfF*5k1@Isi?e`lyqaB6A~c+`Ay>6Q6C!dFUD)ps^7w4_Jx?L@j^x zNTw6-*FMCN^0j*C&2z5d(f3`J@O-J?Oh837Q4~9JdwFGXq%%Zu#-uO6b&yrx$bYXZ ziLU^zg@pya*BX(7WDq7p=>GDqq&4Ah<@zYcoM!@Fo|)?7r5{EtoMl4i`J*RKMjI}} za4W{g&ut((XFHxB8LK(z4Kk{|U0%Cl_@Mqf|B~YOdCpqR{fIr4-f-XGrojii@w7(&b-Pn3^~s(FWqZ4JwL~BJ`q; z%U2g048hA4f$1sxx-t9c|2RAMfS&KZjqhMii*gt-LUI^G5o0okN^%ajISmnN=9rPg zYBZ#fxE*pv z^}a4QIKZh(X(NX%6>XR|!`dwMvoq|y|HZvdvanv&V$aQWkU>&=|Xlc@Ik=lbu znsy4hZ=^Qa*%F+UbkFc(%e?>dA4IelhI_npx!sxh1~L%9qovQS?P&sxwCSanL#+rB z09$8zlZB)*h*%swUFrzU`p~dMjHWBsM_RVD{^xftx>Gb28UDhju|*r^zVni|E`4~& zIg+F68_d*LfYV81+DSNoir2JIarwy{zM$Wv4OC(om5N$TkVVMt&5wu~yuk+kf><}p z)QEQdL3goiaO*mLdwMddtu-yjT#6E~S3R2U7O65*J5)2sm0*;yMdf_2HqBL&550X; z;>+u8E37@^NYZ|sI)ul>i5Y?H|dL*N8< z^q}@%=lvOeZ+D_2fQIw>qRGjA;PPch?kN^$LjRrYxG zfliLEe>Z4B&MV`GzFx6RH~%-S7KYqj*|F*P#3AoiY;wW2=EY-S-%X7h(Z%fUI|E$I z9pr{k989s!kSj9NRAvJ_Gr=;48~UjWOALl+)#E5Mcf zorogA9&=AZLx&ap3rYV})FYs>rd~nln4C)XN=HEz((m0%dKi}MPL>(k2oVTy?>Xf4 zh-bKvL(#u-;XcX+1TiA^_*()R&^Vag6or(Qf){b|`6_4&(K43(n+ zAAac63#oAq@vR?@9J!pX(kWzSlK#3vzY8Ya3*qjw-lRV-#5Q&%!X|(}`)}cpL4#k( zLkWV&DtV&)GuTpeoO+F*F&N@vXd{q#{wJhdb~Ng+K%O^2NA3orm;v&=bx^bDX&GhV zJrrF2>)(jO9|5rT7pZ~(iOEg|iBCn}vHsZMQMX-#rUXouc6L`jve1deGtu{IA{=} zl+l9KD!0wIP!!r)55pb*1kUDEk@YN|Y3hP6hQsnqj>?^UZ@ zr+pVlxU?2*4K=VH7T6ph?gfjOKo+KV3jl#Xf8RJ>vNdQ4E8p`fTY^f@ha5x9D{GGqh>8(|y7h zfQ_Bt>K4Dx6nhr11gBoe5YfL}vRmz^P&1(m7N>@#n^6FS0 zgsU!z2M^AXz><|YZtLIQ;3lgUh|Elcx>ct|v0^bjzYf63GP&l&qAYmh_U(miS{fv& z0MT+z{T=i%8LL&eRPyGcX@#II^gRmgLUfQIigm=+5A6xk?=K@G8#QeBdaG8g7(8+n zC?oW9gV;1c0T_>L1jf2cdUR7|ddmqx&jZAxvU$UmK7I(2TG=mu43r_I$Xm6lq#<@* zzDPT@^jdK8TexXcU9Ou5YQ_as5RRfWhW)dA|EL=>ULeq2DObQbMI~&XSI!tUqC;0s z-q2=3Whp^ExqAKjBYI$#K)Swy86)!`qElG5oLtuj}pw0uN?EYy{ za4m^2RlwCRIWMC3?79CmA1^M81O(CyZLF~cxo?t)vNUt7kvH{2*N^%si;1Quij@uM z590?>d%|>~dv!;uCzOP?)9an^9`vF1*VTxg1>-lT03tR3&v&DYc_`_clV2k_)BP_ikEjXGveO zVG92B51(PYkdU+oon`?78L-S`NSC+of1QyD6>94{Wi~HvASni2$%xV14{WwC;;|pi*gjG=LcBbGHu?YN^^v$ zLZg*jw((B{p2mBM^&r*3Ohli zH+Jo+Rn-Wg)%yW`4-O2@sHLy1kV6nfq>J#GpsUi?>YekMsB%+Q;-q1GbO%x6LB zlgK0rH6W&rwlK?l1R|MSTeCBN0U!(aDXY5WLQhDZ3zCp3Jhd2PdYC3G!$lq$uKVpGQGLwig#yuigZC66+GLH+vv zmOkxjArXyguGO>uyt=AE=|A$1=GOnuAF6h;D4?8KnO9%HOe1C-rG@o#F zNYC}^)mmIg!y0x73~K5RAfyoQ+My|dnxU#LYCUx&>PDXGQVQurPEwOCdw`wFbUk(f z6+(aY8bcf%>nG<_%54dhQr*u8kclmP+)Dfohl~9BzD2;f2;T;bB$t(2@e+s!E!Q^8 zf2b-Mto>XBK2fV;_S1VpM(IcZX#iQ$*-DaTc>I$Emx zzl-(p;VVu69obZuWfI_31V_V~rOTE{ZjmU+MQ@=%6vOb_j0 zN)u$T``ePe8;k+uXSC=m#081X)GzCuf4inh9~f-J!0~uI5v5&=q7h!rbbCGT^tD=f zP)ayd!hDfW{Dqc9C+Zr6$n>){n7xON0yWohfPXQP7HkcG>~c9hdsxIGd4Zz`tJC@Z zbWjSa<+2>&?&k6vE;NeX>7K;RBDoXH?;osgH9~S>)arXc8WQal$t8bD_uqjlBQppz z%oi{Ua)`j6;<(S(vmRPdS{*|_(EfImk0Z+7 z1uSb6c}^%A$BLJo(6yV{k8M=2~1-Z_-nK_)I87sm#)67w*dx6@AAhG~~( zu{_)`FX%ndGQ$Sa&1fu#=V4!Ump0KrittK=STu_pM5Ep!D7F6&F>}|l7f2Uu1~KcP zU(=stePr?josPVpQ|^;B1W6S4C^ibcJ?Ic|$p*VEX^xZUEym?w(a%KYUS3`ZnI(Pu zZ8(^dIjLB4h_MLg@%K|%TGuRtd&f)Pse7m^3KEL&_P1r$zxm~2FL~l{bneclJh%{S zj`ou97P2%$BriBPDeWAaFBrZrKq*Y@S6!;BL`SvZlj{d7;X`K?dk#rp@-e(3{ZQ9Z zYSg~{3VxH-Cpk*l%jSA17?Q~?<|x5U?(xJbVj@B<8CX=TIEo8aljfo11Y#y93Mnwr zOkv~3s36?Nnd8J(MsLCmQkw$h{f?-xVQnBeI7IlxbwSCTDT5MiGefqa^oJ#&-$-i7 zr#Hb(fx?OOQz$FjITL!YX>+VIzuk0(+3{#`tKbxjR*9v5PaCqhl$5AY)t5i8RO^8a z_1q^dd1``=TypF&i7Z8Df?C!xh}!5xiM9~hNo93~3_>N* zM*Df%ep~PbacNAF^v@Jap%oPWhV*A3A^w+7s z0NDQsIs0zghsy>=ddzVZCI#w*)MqCx8_{wCy~b>t*Kjh>xx|8*ge>J~lsQGbVEszv ziIIN-x_I;U?Nj^Ce{e?U=EOsgL}9({-M`-rT8KJoWr;kCxc>x0L2}!;ZQHk4R-8gt z5vu|N!E>l$(g|*vv2bjqHNugQi-$5=^OS+hT3A@%7&HyjElzBYNcC-sfj*^J=bftT z?q7-bqR@LPe4Cr|snp;3+i7xWLOW$FwhQF8{V@yxatKst4EhNsB>5SZExW6crR8hj zsSUuY#PlwBnpQNPCjn?H>?@CmS+nl&b`4RD*I?4*$ZIcZ2G1O|9&3Pl3pY|(ewwWV zx9GMr)`RJ;ZBeqt)efbDeiQ58X_dm#q>rEroikwKsZY49_CO-l30tP?4d;sM1P`(A34jd+qILWlX)}XQOb@}H-~owtWkm99APHf z=m;`$5@Xl79Z*{F^q^)Q=d{!z+VXMy$TChbF1iH5Zq<=nG)HxVahpKP8l}D0`7(Bw zsNbAq-#ktkPTVwL$1N^%bYcB?Fd5x&KWZx@%p`>Z^*E$7V-r&1HgV+c=7QR9OY;<& z(HQ|3sW3+bQE@qZQ~29`iZQiU_dK;K9XD87f!d>`NPDTQmB_|7(AqPW9H4=26WNE5 z8js__lpa&dzmb*Iclaz$UNIP8p5P1Ai26S(-t}(FQAd~lC@gQv?85vzSLsphcM*JK zc6IgL9axc5^UAb56mcE!;@wy4N4IuY8NtZwRm7o-EG zgN<8A(~v9t6pW1}+wLR$4ULSDVgsKo^}dGXUt5&UwF#<6tJac{XoWD+so%`5W^YU5 z2ghv>?o4*={bWXjEyCclE4m>#)fTxKa>oZ1GH?@x^+k-kb=1OlmZaO z={~#~#t$G&5*OoYP(h8^xWqCihsRT4|9Hs_t4_>liP6damh=#3fP}8}kCTSteOf~E zLVxs?7)rtfq9-|?B(0hIln8GzQ*q<|{QyFT_ctv^bD%nv8LhKhyLr1Lc&3O-b;~W{ z36B>al-wQzXm6)^LXTYI zaLzb;_S)=~2+z;14zjVo#&oNq^ISg3&GFnagTlNXPXSv{GW$%eov#>88g*5t$v4}r22h>YX;R6c^eGMg|vIWF&7kx~mOGKk<4QC|fGmAb!vQw&=R0y~`J$ADB7E$SJ74u8gQQrBD2r%}K z6VDJ4dSz5BmeC)7+;gH%C-KACv}R@IuPM_NnZ-9Kwh?yr86MuhsfzIU@^a?_{hat5 zp^md>Z=sSgj@w)9Q2m>(C^*PlXG?Pl^)ha;&wsp?w2Fh#RGt}U&IF{iG(K(beumI*3y!`R4l)>$Y+rwhRExf3 zvLLidB#r8=rh%kKWkemzd^6C(Bu9`oxgp96fx;|NbS~|6^nL^m-idRyIcD(<2JXBJ zaHp?FBGR{KSo#$(M3q8Vr~NL{zM&B?%~)7-E`{m&pHZasl}-5jIim>N=d7gxal0aI6TsfZt7qa`)g8>x%Xw{p?lj zW#+CF6Kb)z2$Ano)nO}%^^Md=P2#b_%66SP<+EY&8VqY8?IuzXC$lo%#JO^Zro@+= zLLV$QTATtd#$^YcIXpItR{h6B2_$GqzMmoXf(%?)>J9;o{Vlq!Kd7T zgh@0iEoXu%+LO_ofG*vEFqe{&&TE(I`OVwD_Z|kb-=dpxj_DrCEzCfhM{z)-5$Q}R z36l=(QSKG7Zujrs9*G^8j8(!$#d=E_LBS$?j`>h(-o%M-q6mTB*j34(4B7nNy{K-= zT$>!nr#O@cwfg#OXeZZRC<0yB zY1VGgi*X+aD27GK0?AY(EIqhJ{_v29Ym_%V% zVa=*0{bUzTxFyN6Z?|;rN0&JlS~}+l?mBPT??KR2u^xh@R}i5l5%9wjIC9CxgfGdy zk#^%aTP(b0JxVu^ID1EP{|v8=K^6{uvOg#*7Z;q+yEk6t>dsn`5D^P%|EC0NvxUQTML|2F%=c&9?b3^%?qRhuZ8y`s-x2ymM5I0$j0>=M%w0wX(h8~e z#leXy3N!^{$kP?(@_o?{87Ps2StP|!W|D6z67~{W2irD4adzvL#_knf1y5x+UEc{; zuLc*5=QF@+%HXe7_z6s1q?4-HAL6J0WS?ygCAJZDwNZ~~zDfW2=d;4XMtMNuhLP@OkwNdM|92Bf1o&hwMJrS~p8s`Xm?wpUp4nm;Q@Lx+kRK`Jw{$w8~ zR!MahT^GsbME<}juiHBCI=VKs5OEfiZ+cnwHmA7GQ+cX&OZ+ zzNCLAA6|a`VS&Rb956uXt{f4N5q)L9YtR2R;lgdh z7=%h;mNSnApTfR`03^^5a82yjqND}>=`(@8ZfX}*Xl*$mIS}E6MIOXll-Di|fa8bt zf!!{{FwGuhn604BKQZ-)CCQxQvr->$Ix!J7-Yrd>5-5j#}DD(Tfc#u9dtC?3-Y9%zRrFTY7eF^lP3ZNnUd>AT6o^(-r2Xdm2a74x-pOV)}HgCmGntiy# z`|sy&=P<%-uu7TvDPOUp0NgUd2kcNHHG2qOHsirH;Q*hpI}Z#y=kxNRaSH3-6ccQ) zaEtdSVUjDmeu{%M)#PDxexyg=*_`3Z+=ljV>W&2Pd<7haM{2=Qu#A;up%`=X+^i0T zpP>GbaXyn72wj=vM!s%wh^$9u?-rK@3u12{X!wU=uh*suZTKMW8|9WCYqMKaX zOeeyoQCCty1Tas7RY~qir%o+&LebU~zktAID1eb2Kl~KnmDCk;(g*?>el=^A;adfk z^;^HuX$I2f+!<8wAp3w>e!h5dIrt?TJI!6gbKz3<4yiDp=PkS*PCz9CslZz+5rx0@ zv$Bc}ND+czgA1tBS@HD2p`pmW5@cqe@#fTWEku_-!xkeixb3AwMTrhZbRpCCB`XRz4P}?z;V!dDDjn#z8 z9R&eH7y}L-a!LRLD56GQiDc_I4-W4s6-+qISa4!d(6t%9&+Ip87}SrJ-{5UO^il-L46)`InLl59dPx?Z2b9y zU=Cn~34EW#l4+N+Miakx@7{S+sM!pm$$aL_nKQCdYn3Zk4j>LjU?v)KR8@)bd|6{? zw4t|$fb61}m`?IdZ`I0_3y_9K6&6s|8BOL@05?JL8=m3Qe){em*m*lmLrYD+bPbH=6r?$rG*4efj>bOd_!u*$YYAv**ka z)Q}1sOc7!Z*}<^1W)l)4j)+Te)s7uIqD|w+QH9>pJi6?S-&8g*JW1LvMh<@uxU4tPIsJ%TxAmX; z@W)Q7i*S~+e&erQThC~7SZdL*ex=JPb}Q~B>SC4BBA`wqAX!L{uwW$v$oEDN{>r4f z{{Qf}%=k&1*SO#=;rXV-nPgg!1V=ODY6Iv)C*3{rKk(MZfT(l_a$_E*ghm9NNjXS) z7Z(7v)We@WZ3kfjVV&nIX9l+yi4Gfzc zqvRrTEg)5BKjW?$=O7dewd4|DoFGn(o&p;D{rBI?G@@92_V(R-R zUzC%O4WR&c;^JPVvMu2|pg)v$jzKTNw|on!b`G({rI@+1vaVC@;yYkh-nen&nB-(o1cE$= z4e}P!zN3Y|P5gz+0N1r+ghz19E?lG-7wwf}sdSg;hyP_pR!jt;_S=$Z02U8WsXw~` zh(+#ja%Q3+w+|ppI#R%M2`1nOAQ%K`Jn;RD>gu+uxGKl1U8j2faIJ8G+-rpVD*ywNths_8aMgokon`{)wE(X#g!Q!-T-Fggs zKy4Au($Q{iCy6k`m^8hwBNq6NJds6{01T?C2>Bb)qYZfj+Yh3kT44!hRq}(@FW#`E zOQA>c#FgQrs~-C7URY#W?^_l#F;5(B+i$#CBYRKE?osE#Ii;#j!3FqD${b6VE?vhp z!#*bKgoWRg5Ri(h71q80*VB;r5_1gfxa8y^1*QwDByb@%$0diki9mJ4OqXVt!+zP_#u1wKopMN@PYBO=<=9*fFST-MSM0 z9QE1bw`4d#GnQ}589@FUk8wPU#KRgvGtTksGssp6&XGUkI-5s$%f_UQld}}O+_G_)PwRk;k4X@xrf;Rh`uMcY2DhA&^8Ulif;i7Wm`l}!fqC)krgZE zK|)}?gyiHZF>-3;j1|X#J42#~;B$Scyyvx{pv#6gy)Vi*PWZ8OLbo1dej1 zT}Eb{OP^eg!oTN*cLS1;AtN~|lm~dz$tx*hz)mJ}7q(2cLpU#)1mZSkEST~Dvc-0Z zWbS!sMZb??$uXr7Y{a|KhYw3IW%7^Th*ZKhDLP^Cjg#Zh`pb)aOdCdZdF}L#T34&o zu4;8`aLa8Q8f6{a=r}HaduF8rE!x)Z-Dptv^6gqSc;`l=L0e}+cE1#P;I+1q?K*@^ zOR89{Z27Vc%Ej0Es_J_a=6T273G6W8=%%*&&ZW$p8$(QsOhh9r)|m9E=Q}-_nh{?K z>jf`7JZ4h_+&*rDUK&Ij|>5sFST{w7`IX$dS=cu;rLk58Z7&6}<&z*51bpMm@w zHi(!QR0Ii;loo%9t0Ua(>}dkDBhg+8a?7nGR@=lgI?|c*OCN3?{#zfrLi!h7?ms zLD~>Sp*?Ov2`KKu1v9z0NKcvYo!pB4(tfChEFBg}nQ%Tj=9~ktpc;@4k!B#EC3##^ zyX;qF(ZIfKVr^{}Ku4H`Pr)>rx^S8}1ss!10e<%F)gK}lkV!}b1FM$FV%vzmY} z^DAt0mz|gC??4@}E95qULQ;z92xKAn4Z4pCk&3rmEf?-THmO{BCE~I453y$$LmOC0 zgs|wSodobv$&cPW()Xc!-yvBw7>%|&w?F~e1=eWh3^v#jH7z9;s_a3A>`(o!N3+%P zTa!A9#hkkhB;L$Jq1r{H0Cfk)vWkQQ?K^f{Mb%QZ0xnb)`0LiKOR+5|!D6n7%ZtB& zG~IDxQP>$GXGu3%(NE>djj0p@dNJf8gp$N$4o0|)H&bY?rgEqP4g>&9!pLn$j%=WT zpJ=7d>XX|qa|c2>eE9Ha zn1yKFQs4u%M|p)AeB)3Q7mQdifT;gxyEbQBSse@_c9= zyp#x4x#}!zi1?W(T8$*e!TD9C54Aw?{m{3gl^QjKhLC=V(Lp8TX$5#~N{j4hcXvN* zkv3vtU=Bb@nxRG=VqxN+AVj3e5@-=rLt`4DWL&!qh_N;#f8mBzDk9CfTR~3B;dcy@sHM(z&?&PHfP$x5U(r`Zg{v-KvKU)dbJ_%TMLJ zFd9gmDi8*FF{7C#86}z;O*gn`%mALNI7L~l+=Pd}{yH6S06>+iM(dbEj%$ddOF13; zf$LRQzLq~3;ty}nO>8IzCmclZ$)4QPA)LfZ$>(hB>=X^97>#f?)Sq;?;yZUA?MYTj zf$5zZ>beAE7b#%N`bvjjf-NII$|eVwUSi|5XZGR?4YQZ(xLNd(BbQQBm%>{EMP|)E zLWVsDo{AV?sJE1x?6_ml#cS72M-qTDa8R=_6mPJoqENDz^3*S~ zVFIEQ>cL5nmY^Gna>!8F3pzapLWnzfFn2c>FXoeb^cKI$RM$XZQw1djmN|Nrsmr-* za2sc4c%QL`?>l|2xl8RLK{t@+ExWa`voZmp*^ zFB#4-3fBv}%}=~?rRGG+N}R7;1L#{|4rIpGaq#)=(iVBDfrf}^(5K~EkeF$np7ys` z_ViAqkVD~0IAkJDF90*7z-nwar2_2NZCe+@zyu0m0d1*jAkxTvL!{`5h6Ay?StRUx z@@n<`k~0MyP&dhxDS-=tkx*!Qlfogtl0yD087&N=hLE-MaPmSWO;IW9%9R9g7)e>6 zwmS}pI<+NOH&e+^OMMWoE+ug8D-aOc#Le>a^6Cfm;I_AffdM4-yoQN$G=-L!%+D4C9K6vLTBt(J;+Np<^tRh$sez31ofJ?}L{5W=@sCTy| zfY!XR<|Rvj=$e{5o-I6#BM8?ZRG8)e_S=|q0F%hdA+rtrkDha+?dv(f5Z%rlB8EIb z@?XAcs=r|?569gIoA>&;j~|~}Zx~Y!0I`P+{{I*ZR&zOOrVEwaEIB7Ft? zyOzPmC)jzHj1;NYA%-JC{-0tTtxtA8iS)vo;0XwTr73TKZiPWw4MJuU6B8X4ARm`6 zzx5{5bAamr<(7ODAqjcfls7RsSuzyYjh4b<+yaO;53epP^#0K+qY_mu2V_V)|C`_v z9~C+zAR1W`UqYqWt2acWhYdx|N|;Eb|hyweRp8>cx{;0 z7_g&y5Y^ZkbQ~jzr|oaFdaw*4IQAWW@8LtGv^N+dIUw3EG`iMUiwFRZjWnqALlg@{ zig>+Ys=ztTNN7L~CSSpJNChCp;wWiNgoMReZS>litZAy@8;)I}*6Rs3=j@nc4*WLif60Foejjlt0K+bwZeP``Yt|H$1F z!12XqAeP;A;NU^J7EV3DY~U3AIuoI@u(ko=(XF(jqh2g1CJvnP921!T0a_~5P#|#P zA+qEE5daPTdE2Nz%)Ys>CXFAj<3y9X)WMRL*2#D%?L#Y2mKhYTQ&8#`QFSqOA3#pd zhwl$fsRtK`175NE2fzO^Q0lVIR#joB3?^Yls_q6k05s{*kp~XEh49DZap1=~Jh;=* z+cLv4lkYccfp7!Dt76dk_;khyQw2+Vlw;{Ah$Eg;$M-O-OCXA-`VVS0ZtBz(8$60% zIAAydIpvq^j~J`z(RJuy02cQGXsLw)ygHmo?0Ns(Nu}rHR3wqUOxt%1BEx(%i3_W% z+2OZnBZ0toh^q}&s9LxnM7gsm>U5Z1hK#Ci3RmIlufIM-x|gex@@QYakd~%?y}eL~ z%U7&OhxlIf05@*hq)sC^M)Hs?F8V)Fa>e1&?Qr1YNR5?F$ zanzLaiUfi(KO(qGrdj822xa}rwr(}4N^>b76%ohsWWG00^h<%k`hHwl{ovEbY@Q zKs8zfK&XIF^f})T8-&d>S(rP0MDRwF!1!1K10W1j}bL;(F{6d6(d!tk}E8p zu`Crl{H8H1X>h!e3G{=cz*eJon#PFjaNp0|<_uzA#gjy1z`)S$at<3na=VvWGwo1I z$DLVo6K+PJ8YGF2P#QpYxpBL8HIfnGIfcNv8ZSa91qDct7o*Y166|7IsAZJ0d&8g} zd)PzIzesj>B<{>OBE1b(YCV76Ofk3OQjt%hSA{@7@5xmJGiC8(>KKxjgn`XRat9V%sOS*#J! zOJNbfGqoqWW)yL{gLIoQOrORIL_}7?>&pcPSII}w%HW;ScuXt&^$@WsETaHciu|{UBJ7}k ziw*#p;)x{GN!NODr%8&Bv5_n^)qMhsymM2$?P*J+OoC*fO`EZ~Du8Y95i0GL!E{^0mzQE)%1cqs-Nz!?-;3Y=AI)^q}E<0#o6q8_Ak(s*>L zmVOB$gl&-;R*}Qx-%gCS?$7?f+hXVC>98m1qUH!7DcyGYW0_j(c zQPPSEpQuwqxfquq@?s~bCMJQ+i$mP7;p-&P=XjmH)K$r4py+h}&S<*%H&=Y1TC^av zAn|?vJ&$lb*@L1y%uZ0lS9Z2F_&0SZ z<24HG;~*~-Zd$vdf=5^k5W{N8Vs@$y22KZ*Gx1||BjPFbEt3;oH?`{mp3Hs*ttFxY zoH#Iy3V0}emE6!=PFkHbhX4Z2nKK8krLlmyoYtZ%!qQ6{hm72qmmPq<-EdgO#mVH-4uEsHsG-iO1}1V#g$Ux8@wv2eI-*%CIW|8s3a*)?Gyli{gP%YnNOZx;uK$Kb8W z(h~+O(`;lU_+%&=s*hZ{bb^xwRcl&j=)b}Uz!mU-42ob}rAQcy7z08B5HuqO5VeJy zNMNWbTzwl9pNQ@$$<3>2H2mNQOsS3~<=1%M$bo?CdoSlS;3vg~Oq3KdXxtA+JPcq! za);eRWvW0DWDPm3u<%K&8b4Ts9QC~Mr5}D+#@UGi5lspfSXT>v1 zIEd|XazJ8`@m^l$pgxQ`F$Ec!`ctXgl&@6jwyc=*TE2M564C4-`=_g@%GGPvEZ3f) z$Q4JwBAWn-l<%>t21nX=^(=nguOw*fOQxOl@k zGVB%Hmy~!YjgnsKHqDk7DsM!?-||7t9IK;rNm&Ir0dE(Z_U)N;hseR9h_Ze8WtZ;^ z(@n?ot*26XVMTMDvIx!*y318ZyT-{$L@FCwTL;!X3Lp~4CWW9oULv7~LP2(=_Jhsg zSh8MHkXjZN-J#Z`q{L70c{&`%fZwuZYWkb7dG;d6hWohgIsV!EeDo?B9w1>hAH1tR zl4M-@g=H+qeM;4$GfHg!*1-lX-pxeyfqe}NN1OTC{<}dXsGDKnm<+kPdx6cEGn%lGI6+75j-WdO(udqWN*`(6 ziK{^mSNXg&z8#0ck}Mjwx5Lg1vsllz=$11jhC4rP~O90=EV0jaZn?dB5nO{L_<^e$LQ7W3^9U3+&mtHDoQ2$ls@VSc<4D6Gjl;e}wO6PG8Mkjc z(&j6gB&Zw;A+?u593rnl(m_d~Q4mky1rssRZZmB|!#~o7x6uJ^$XC z7^<)?8I-7}1i%hVg)7kz!I$qtds0JipogM(!)7RYM>UfA<>#$6eDUE8e|(m@P+`C| zL664A2?hZVqI$TGqu~RJY8ZYowU3&pQQHK3xsjl^sIcHzzmgx?@;cQ`cnd_4QVY?^ zisIJMRzNqrZQ*bbI-WZ_mUdV@)RB+={5_*mKQR2XcTUm!l%!cp>g=#K7Xd-qT=_>! zhU$Y4(EcJ*B^c_Mx6SaEhgWHZDBg}OdGRg&U?NuKUsGih;&~gIbvRww4>z_H6*TGm zhT+Sy$|_odWqc=1)edA{7E&ySut7%rL$Q7dn+wd)rB$4o?2d5k?a3}&ON4W^mzCw3J{m~W#{W_BAr8zL zD8oy7PM8%iXNsG*7f0>gi^n7Fje)r9ad->ttv8U6nwy*Ok0d&JI5_-;t5?OYM95$Z zEZ9;XX)ii6U=$-nAyEKlK+#fe6YM_-n;T+CFsi^-t=|x!X#|TPC#8Jd$~(tXX$>Dl z?MZ|>7@Yj&z-iN`r;~RPJ*rqi$~Q~8Dio9AKWRsj8$J9pT6)08vCL$f7NioSs)tFE z;2s_g8aDJTa+F{Kp)Qdk$8hIxMP85#xTV;^_K|}<4}A?!oqU>_1<71&URs+4M>f() zCbDahV#=ex{nR|G9e2Y#3gM~C6&s?N;@y)AOwB3vd>t&e(cIRN&?OKGvHy`xCBNO- zNw+TgYy}<3*E)a=#pa!VnOeUGqY5^1TTTZo^3Dk;`hw8ih8^bJOxp@3 zV(J5e{|g@4BWF?_){H78;_V2E>z9Ji!{&zRZ-y4>G=0hL>V za#-s0Fj)}uA+^{KOplxFCYe+`RDvciJR+F(Uk^L@GP8G;HgjATZxW+sPR3tEO%!|7 z9!jLEp2ya~;_1Nw1&bcrZbOxS4H_hc7;fzlb+kZkQ-lkRWm%G2dSA$E#;*|%VoG%GEb&8Xd@H^Ms_WGWLRBXgbe){`Bg*cT;gc7hO)+!{_*?e zB*P%@5{jj`h=?A!Y127Y&|dMWSY;>Wa|g{%*kGB4XgT_8^`1T}@{3Y7|b-FVZ>|G0ei-hKEG7~_=y zkt;|&ve(8IEM$zQc6@OYswq_BcjT$ymnjnUfRM{jq!OQtOG}*xeEs~U88B?Q;!3UA zL71gdA^YN|`7cjLl;I54U( z-0FRUe+WDH4iUMO-3@<1A?!|H8Sehw>E-}pMhoi~{EAqCq-GTLnh@rzT?>0eYisLc zKb&4vZwWai2jCDILTW*_fmJH%K4iNIoTD)0-*92UYoO5<4jR;~5my`J;Oxbn3+B_j zl{2_U#)>#V{Gd53H`G^*V26jlY5c2B!1@6lS>Qhmac!rtvvW z$sv#QYmXWp5!fMP$c8^m|I2yGgKEYFS<_bHz*p-K^%*lDqZ}wIs4yR{Mllc~Qa9-d zP-#Uv;*PKB2gk5GVN0c>p-2rMXw(9xjKTYhrp+S zCn^ZEGm*IHP} zER^vaEjd#48q);z`|rO43oq(84guPEsEGZsB7nc>8ETBr0TjjxAf;dK*inJtOVu~^ z21@oJDa@I@tXuHDBy;1-GWHsz-={1764o3Pz&li^w@D&|@WUB-5xBzE} zxI{r$cH=dK7|W?w28Wyt1wVZln?6}AXyY-jH!u5D>IqSUH4VbL z5UEzn;YgR>4Ep;d*YNAFnUnv#MqYT{S+B&6dgYbRUvYNmI;dyQJ#b>S;z2yIVPPw(>nqc9*5Jq;1rP- zI8huyjq!%sBOZYOUo*L$1o{;C(&-`g2l&pci(IoE=s&DM!UO{gGMsdoXh$LOhB*rU zOrks*)(Lq|-DD&?HM&Xz@S_*7V}^ph>1k^C@2N4GjSp4 zbZ*{k;XqIE1lqbFCqt%-C%Vq>C*>Wf7}lWW9O;d+^yV7PcSEjY_2P1)<){Esp;}|b zINUe`sD}0K@mir3@Vr+oBLy>N0r~Z3K1boDI0m0?sJp+wJ|h zdDh@|1wF_LJK$3sg2*+fgU}JKC&+@9xo{lO#CD-P1fMBjZdUYS9>3vFckg!DF(`NJ z^cgd5fob}IRB?<*HC!;Cm89h)4<^BgMI$Iu=6&7tdQ6t zlz|CjYe)!pRT((%Q`n}4PBNN{F!*4rBy56M`z?hqv$ty295`welBjbf5Q>0mms>C` z=@tzk)rHFlLD<2~wzee8D63kLOLd$CXN_~MEOetnFc zl)y!amq<5Qe(!bGuLd1D^rR@kBK6p1FYDz+MI-*5;nm~Lce{ppetFV%Os8GBg9e2E zEA{QcM;}>d#eWjoXJv!Qr%wzy6Z0Vc_|gkmHo=L_`t@0w_1)J`!>`=DZhLO*w6HqM zD_?myE9U6#kwxBxKi}LuBYjS+WWZpxvTkc%hX%*mEv7qC#ap+5qAEA!ig9jkfOuCq zPbguXICbicU@BmwQM7L@k`(rCk`&nE?rBFmwQ!*cM&hZ1X(wmdN|KthSNIF*VCaAy z0(a2hayZDrL$68~UnxIduk*HRg9QS_oL%BgbpmYI&Svu^cemUy-lU5=<0>Il!Lw3PXSP^dH z#x*#TnAip09r9vqmPLgAt*QTzpsrZGW=%Q@LcE(t#S$_E$SdeVxyp4A?vrEi&GhsI zXORRzRntu@zxM4f&?D-GPNZm55~CDQ4r-C(1m9cYRc;KSb{0X5Brf_!*q6LwlzwWr z&+l)tO5D_Vi@1Q{D@8Lm zYG;TBx_$+zP095d{F0zDo>)`~28{_F)ozrn7|I5SAD^O)gY3E??YO#4g4td?r)^Et zV)T^nlF73FS8d#QR&DwWI@++^!v;(PD5KkR2@L^J%$xPp8(l2I_?&?lm+!*3o9?x} zXXhnYW{17{>k6o!H?$7dpqKiH4Mh?PAuk{5a61w)6onGosKgR_k|sC!DRj}L&A zco-5>S()@WEg#-7B0D}@vU?9c%U(vvx4jOE*$R%47_%-!U6dbX1>GrNgg}-z3 zAc|KTVXyT)$)c&&R*r&N3qIJ3IuCvLj$s3myF?DgWs(IVIU}}8*{kHzd1!n01#^%) z4(3T)cc3<+NbOxZ0C^&6CSNr5fA(@gN(mhD*#k#7niW(Bs7uXHD6Tv z0Y-T~|JaLPe>#!&2H#yiMTH=-BFFN(ut9D6>uC~qqb6cdfhJLqQYYaFw88PjEM!WY zAnsd>Uuy0Wy^G}Bo^_#n2P#uI8&P_o^!!u&t>Rc^bz}_L7=k%k<^WAMM^d~{fuYGq|MWOfYA*49I!Sv5VH)Xi80K7NR~^(vLq0H+xQED{ zN`3{G>U?1$T5%ywEql?!2r(7W030oN$wqx_fGhKv0w2n%5Z z3E5%<63qx0N-dses}*Fus=0X&%44m*$$pKx;*CJ}AHHtOvhDg8yErHk!C+Bnc9Tx^ z=g1(p?Q@PiSdN{4xg{0ak}u!HR@GOBE3x$>3{Py32BYkddHQcx{ktS>kP2&yPRE%| zPOIC6I+^WSZYm(Hx^8q1S?u1UYTUk7qY^Tnq2-;=fs` zc>sy*1?DN(E9!V0BROb)yd%Y;Fw)_}PCox6o7(GI{g{PoQ*w zojLR>(=n4KodahaitQ9_X&J6>qR&MQVXlX5Z3=a*A-fOWISxS=3H&%Ep&HM#PisXM zO7=G%1M`m$2zYj}v!}f6g0KdTf}7)+9+f{~ zJ@33sO^BySq$CB6=qk6#5D47DCS9cG`{GaMPL%zidY29yIJFUympVJMaQ%Ju8EeW# ze|o>Ts}$tZwk>Q#82lw;>OmEa0kP{rVVYA%QWUlaC<8*Vb~lWA$xo#ADxQOqKdoy> zcm$%EAnVa*4?ev!=@?e?XK})YPBZ}qq6mXV6LZ^}DP$AgN1Fp}qPSF)FQl+Fw)C$? zZ{e-6?e5yECRr2pq>>S@#F*55e})7E06?==!^(tISPQlBe(%5Rfh_MMWg&7W?T)vR zMhy>p*$75aQGt=<{)u5Gv#p1|FyW2~z7Y zX(1GXgpGgq$SKjD6JRLF6p%23E9T-xqlLMBe(|!iY~HNdaeBnMnyom;5x^#w<%uYj z1Xv!;0G~6VwKrhMI)-2VnCoRI^8w+?B=huw#p-mWD+EoWzVcZWwQ3h0 zyud|SPP?xV8w4OGvm;`&OyCxuJAK-pye;eY{rhL270GgQ_mxXX4vJq1l+WHIsg#=) zjAw^|`%qLPSB;^svEhlKrns};EEB-Zj zungq6*$|dc=P;ptZd2%1D^Ul6)?JBCk|8m3+D3s}LS*9mrA%D%oEa`q5y89`BbAeU zjPA^sk%51V41oZ}tib~YEFd}K@D<#L#L6q^a#<|oW$<#ii`3ly#mAuA6A>7)k}b6O zPQ9PfLQQ5CZxGlKlDZQ)=zeAV=)6Va2R_9}f=>Pwm=oF%4@tb0d76(`x%m;5ZP; zRN8h+w9aHTM7}F>s#Dy5y&=_5%b^}6kr8Ukn3&q?@R1p~R3)T5?@aUT(nJAI7 zNfwzv)_0;v*K}BUC<%LEO*Mbh!V;ws>QNF?7quK(E3r&9bMr)sG_+t(po1t8W^O)g z8zHdVYRdB^qXd)>lB7-5r)$I|z|Lc!J9wlBV9Ux8b&$)car~Ra8j{60A^fn{e#&S25GJWUO;Zm6eEQql~3Tta{u^c zPr-gAIFWV@&2J}(9F6|M0h5U&$)^)cPo=G$9Bc78xa|}ok6Onfj-tW=uWy4}LIZiWK z%z#SrIj3m>RDmqZuW!Uydi^BVg-q-E^$^klqhTVf#6SqmT{Jw%v5A|`vmJuO1R-MP zT#_d>9ATp`NZ80QB52wdLLNJX;7$&T)ct8Aod8i8qCd#nRoW-Taicf~)%{ODarPtD zAJuXyWR#*PHjd-OrF0(UQ{)Ywd_F{K4m_YEJju@)v;ZeSsZ|@4za=uP;{o5-$(e&a z5e-@8_U+rW#=p48j{|$jnhjKaJm5Xky@vvHZP}J{nGb7*)*mkc0Nbcdn`-<4+<^HH zBP1r%kpMCT0D0$DcB!tOZ`M1oGYxJ%xz|;tb*}kOlPYy@tYY?0y1s^+8_uA*@EI3q z*sU?FI=dR-DaZ!&Yb-Hr-WQjJ_HkM6PWH{h_>%qVv*v&KEx8X7aS1yC0i|YAFjQJ8 z5fK9s22OIbWPX`L)Q5WX>=^>-m!dAZv+nZZfEcmj!4F5)Qqs+aKw(3ZdSO#E*vO$k zjKYbtVCgDM;B+Pn-3kn)x&r8sdM@0wc{rWOP^6!Uw(;>$ST!7h5qLqt72!l+2{uOB zMiM(vg26b|6Bb2iYX)qAh(Z9BJ}Pz+Unc3z#cs&;+yCWcK~FW9Jj4^7GHzJ8cYE~x zFSZZ@x!gdc=w($drqIfNY%qcYI(HffA%wIo;XtneO)t zzvbV#Z}E?B^EzDeG5*CrcRUp$BEN3&R`I8P(SZjGwsN*>Y51vr_!RSHUql=JdcPZA z;#{@Qj<+f1Y3`HSvYN=;j(f%;+ch`E`2-m-?0B4;a7e&mUE7dr`nBTtuFI zxZ$f#`Sw`pFfgji3!m!lu+r-6k~d;~t(8hvYm+lgW9c24}MPekP8lU9m#?v=rL;NWWd#ng85Za z0{5vf6RBDS!ScXpt*q8IK)84S8i*W`$=qJjGcLig5(sb zYG%;1kxlI@XSfUnD0{e$Bo$Hn(6WV#7t?i_0D$OzmOU@myzpNi`V?&tk8JK|*jkA4 z#F2GzE9U`fQ^L2=-!}Ek@#71i5nn*b^lVqcILf?EE3L9F1FOrEB^s{SO-TKv ze{NV5Qf?aRthQV>(mzf28G50NKv~GLeTcTAAg)qx=tnxyzhD}Kp+xyCBWt!CGE5XF zn;OO3L=0yJxY|jVTF7}WNs4t(r=2@SlDgb3of=yu~z5bBl#Ml9E>t8GsYp!7u}mcd11D=;T?| zF$g?2YaC|LC<54&TU@zr`V*8<6Gou9yoL$P9ggU5PhQVvR!CFn_0%i*S(k!X(tGs# zx7k2Y29ff(@>Sg^KyS6~kfQeSBw)7WE`AEqrp6+~;YWX^HLi~r*sqo8f z_KQ~{OqX8tDX#}9O7c$2E|aUE21dlDnDgN`k1A6|%n%OLfs42%C1y$gjD=4{HA;@y zt{xsqT8?Lv**`&YvJ;=PELkvZ>9o1XPlGb}kRd}Z45(ybw~mocmW(?o4*}6}vI_}1 zK=78*G6CUchZ;@K{>YpWKv|OQ0jK94{+_Zt!$F*Pk*ZDgqG&S8Y#RHdunBOT|LgTB zHZ|cMn~)z6JkZVvzhFDj=ei?TM$WB7!s-ThVICWfo1xoED*#1_GmgjTtHT^@AVGk- z=?@DRipH5pv_e8J@eO!sq0yhwIzVaCyfwT&|RJ_2A6XFm>ctH8bm? zJC~a%lharG^&%}BG2A&S#jxd@7Jeg5K%zsOtenOY6^j1nsj&eXMyR83K5x<@iIV3% zYA-74k%ckhbQbQx251^t0vq@a<;K*B;HoMrGzog6;=Z*gb5P{u2uM^5E!EK$AJH8G z3J)-8*%9_V_0OgjouP~II&d=Lm0ea~d9Ld;w_Owf`=x`EhS#PrFqRA?QLP=^V%G1e zaztF0HkSKy7p~)(`$2Wjo`b;ZF3Lnd=$rmUkHw*&rPxi>{z^pm$G3L%wQeG%8-$~s zT7WAvM78fzd9V2BQz{;$RCj+k^4?0T2F_Ju!||x6Xnd2b-}5JqG2rWM#NVSHai>k? zQ;Bok`_g!-{>PCqbNCh0F&ImO!g1y7ug-_;+p}jYw!0hcW>9qp0A{x-GKV)_& znW&&#>{M8Ccno|BF2ASJE_bbs;tTE&uF= zc7l5a5?QE2V<`Vh9+|4-qxSi5jb*^h5hhDzl0FE`N#t9q758iQX7%x{AU7wta2NS6 zp2&s1t~qO3xDg@I*7^0z+Y%CWHFJLlqQ06MW5a3tf=hXE1g;O~_=@~ao4tSYuvkdg zkq(CYuy~j_ZEA6RXFicLOh13&DzNo`=FpcE&>9D`GFb=c(x5Hy+Y@3-QqK;ijhx#W zf2phk2qvol95P!Xq}&jcU1ctt3G;xPiL|mYM$trw-~4)QB2>9-(v2Vl7(ERpVoP-v zQtbdG8VaG_evyeQ=b;MxLs@ake?HtjQhR0u&Ed+{1x?bs5fbmEx zCbkQ=X#B=v5D1|rk~uM0)j}n8(_UOC{&Iq+zs3`b?P~`ooykz!8eJ@Aw2b=l^YS@b zb@sJ|-EzLqgWO7U%_w>w;!{C|2BM@yz~JvRfm0P^@6kkF&Z93{39)o3+~`WnKrM)* zYD48Ui+bLW2l7k3!Ev__*CsGBcEWZ!TK(_asfknTk z6%kC^M$qrb%$-!DCI=9~kR5s09f}XGwA;(b2sTAw{&}D2m`f|E^P~f+0cSUh3mpCw z+jxb14*AJFtS7)2a}GuUa|%EY!j&Dil7*RzCi6Zfjhj|p+7hM~?|{2pWN3B~W+2Ny z;euPYll#kCih#2rfz_eh9v%lxLZ%;7vDdv_;!8=W-J?ejiGS^{4hJ_@mQ-r(Q|~Io zPsQ@m6;C)t7a7X=VSD*hAc|VH?q=F@EsnDhq|U@ia&uY~4<<1lHe~;T*;+ely@OTZ zIUTZqMAtcN^HDOvnB!P#3`-tat_EBm8KnA-q)jWWBs+roM{DlTvo5p~6OmV@U!zhv8ZCwWR)n~A6^W6yc7>-U5m;Am85qD&!@~0hQw4n4pd*H`#DT=9 z`>@_ra>A=d>w3Rk$T}m14?q3m@AX)97`M16YzZt~dbx3H`_xxM)Yj%y|o`2;ewc z$+jt;*r)C^niSl8e!o9Ts5eQcS(#E7pvLg*IebwaNxq^)$Di@jcT2bj$`1vkd%dj5 z=u$VMdtcEf6)Zl)$O6C8KR#96 zg7@#MTHb-kD1hGlo5-cJ|J=92WBN2Jm0k1gh44Oamo+gz#-w{VbL2X3=`-#Uu`fVp zpqR$T#EJ(7IjPO0YqrFP=3HiC#Yg=StX}yP4#1l9dPRBVSXy_aMM$UDJfJ9b7RuBq z%gT8SbU>LiaD^jLGds0_lSODSWkAc}FaV~+Jgz~ZfcD?@WDXVg&4P+VSbL0c^(yAZ zS^|N-95|lTPH0w@sf0A|`WH;#HEWUF%I7jlO6PFLE>OT-zX8iLEfK1oq!7f5X6n9R1(GzQ`*ZihC*4&mXsw~+FVMdx=fn1SSQjZR8+>2Wm0JyhBl)(>UV#f zbI{?sX8Hba|LbSlOg;w_Da6ww14#c;$aD zSz?FPB<3sMrQdmBtj3OQ70SMvdBOmtU4K4Xyi9%@Oe<>@@w#r^)bA zEEhf8*D$DOV|izMP?(T}B;#I~zIjQr@Ph)83Z?D^Me6O3cZ)=?c*`f9okFlT*BYBDVtB^gP5h zM*AJiMuv&r*zj43KrqC8M=S01zLIljd0+bR^j`Zpm-W4FgP6U%?VBqa-&bMon9EdE zDxaa!5up`wpQ#Hg>L1y(?A{6(iqpCRUEiurt5+PM8}qayv?7+%ZcFQ%zzFf5IcCv} zK7A6qzl<4B_w0OK=CqP!Au%8@k$fvb%-Kj-VAKvhK)~Hc&C2ZRT$)R#)U<<|q23}zsef6 zdm5uE(K+(VKXBvw;~)1>=(m0`Of-F8`zsPDngZWeiwALfsDhqr)Jw#6TdiZCAz4<4 zy^@k4Xh3!61P7WokSMdY3h}#XNglqhM=d=(+=|1@W5izx=~fakbj%Kgu3|gGFPpn* zJb>byW4H+LyC48Fs;MO$=27@o>}$Sq&8~|owH^Qmx~4wOz3C1^eMM$uiCb?z^n~7) zFjH>z>!cJ-AAEkKl6}b`-+cY$z^Y9@dP~Vy^GNCESr6WM@_ofD=}(Fe_jTF7WutPQsL*h7ATrJ;Hw+N%s`B90+gt9hFKsb$6dT z@;xI~U+l52K?h93I`8_!f{Q(cwWh({XXeYIi~OPM?lxLu=e~K{Y3?9z`JfyNKpBYMqHzZ4)dZ;0MC!lu(OnzJQs-ToLTFwiTWH`I{w9~bsi26F z^<=E`Xf?~V9Ov1c_nY4|qLNvCrK8?s;EZ<13m?jqtP@N4?S~T%VH(+F;Mz}GZT)il zwyX1((&#W{euY<>I<3KmlagTN*XGPAytKJ}F8}c}PyU<5V~zRIxKvqb*p7H`W|iOH*^qpGS5Gt@c!x;vdGn7Z3j>UHB~D-EbTV{X?v584>`&s)?~nVLr9ADIf?XnrOxJ7pT8;SIc}=%4TTobOKprdDz5+x5IN7>0dH&!IXP zYr+1btGEB6^@dUz$5!XLpz*JY{HcIfA6>25FOjVd+rU6_Qxoe7P}Fq~@mjK1K~z4h z^!Xl-KJ~Jra5~Y)hR06=7pq`6TPqCqdr#KF!o!z}bAUq@y762%mSXTiSG9g^3IpL&{W&iJQ4 zT5(3f#ywqOTsSM9dSfX1Ul8U0!mk%XN1RRy#(NN5-}&SI$sn!E^pkHg|IA_j!f$8v z{_gpadgP|Z-&?8Fv|VLOv*ypgXWU-^TP~Cfz+i_(OzRe$p@{Qr>NSVrr#+H9VJ0SO zz(B4TxcXs7=IM;LXEUYf=Y{>ia;0`|VLqhV8q?p_)` zbh%s#p18hCxX6I*jg?pr2mG$nkKKh7_|}s%%FszM_Jz5HZ~u7?-uF1gj>%k>+{)k# z@h-Kqb2!7j6IRC;ecP5}iXT<|%0;VaQqfXaRQ96vyNP6X(-VYE?@*tU5vmL`PajzE zRK;#(O68PQUI&qJSS+{<#-jXzR0ci*FX}+i7{gx~bVdtAV*zhfon+)>+aUHNcTMf) z@cv`38K~sc8#iYT8%{{vM~Y_WjX_Tk1P#5L30lp3kVr`kyZ_>gHwCOM)Q>h#I<e zvea6U`r_kMKlaY!GJQzb4X6g--4a_$8ZXbiPc*M0V`Lu|QL zpudPHGzg1gF$uBstd=Yy{WZyyvfu<|Aof*8eTE*3sT*JLNFwd)Fu5G(cgbfLq2JkS zTaQ=ln`<{rb1J!0iEBs&;#Eb_fvFFS?ftkL4JTAslD^NAAtcUP+_8>}GHTPNSQUJ^uE(p`c$& z_!R@fVg!J>F1|L0{bIN*e=beZ3}ZCGR-XM@gn%VB)b41X(NTexLWLy`<6*O^&$cyv z4pa-kjl#?EzBfUh&E!2p4_T?0A)4A`w9;=XR3lWU+0sNL6(IeOLsWsHVTDsR6?ces z5`$XO#|n^=M{hkm(^X zU0w|HX0P1-^lo3aYIQ)VmD`scw&C_W?yf$j#`0J8YEx?T{%3x=d#k_HIKR#TQ}6tr za(muZZqA+0A9_%aGiM*zqQz~Ss=wH&=T#HePx(j3n|fZjUzu_j960luGVh*o$e$YD zebVNw->okF=8(6S*7@-I30-b_sah?iCxnR$6Is^=J+f8^d;FtVj7xL*p7jE0Wb?fI zaz%QG))S-g-;Cx}<&;wnR*Sp+`Y~uzwdS#bfO-F=J0~oWz175%%m_6bZtXi9os<-w zcM$eiJp^$ofW^M5fi3|ECAQ*fALA`58{e?QfJdt#4n3~BuGld|<18ER~`b*z?&h3(Mh z>o1obiCh&HkV1RC)@qCf7%6(aD|I+R6AJ52=UOO^k*nM?)3S9Y(gu)roy_1R#+|TL zJn9br&}mKnh=z*XoQ{cfxfVfxAW~oJi0ObW7?em~CeBXSzHD-!A%@&H(Q&0TOykae zO}N)!&AdQ_C=H?Y9oP=v5Ua_0#v11MMbUzPh|zrL25Drats>q#|5n6|Uv@d~n(fD~Zw0U>Yf~0H#jx|5V3z%l9Pu~?vcwE#4Itc;JEHobwzU`CovX{Q z<4V_S?tQAzj9*F$d|RH_6C1RztmFNO$f zK3lbi7**eM>9I{lo%_j(6|+irW8s6fVx7G)e|{cURB4eImApwur? z3;o%QL|mf~AQgLXhd1YoF2a(rsM+xZiTeYbhL&K^{8h@gbVSaq9P{yT_q9Zqy#M}L zZq=ghqBzX}8B0rS1a}7<+H`Q3HPSW3LF7|~*&K%jk1nimCUt>b6_bpS`!}yv1*u-KZi~*-(Y)rm z>sA4s0uHk`uh?1fdNY2Lz#O6or%_QF9esHH@7A?U2h4hpnW?Qd+o66k{^a&e^|#+) zDopxS1g=)dARnz;a4~;FwzZ$M!lJ&7)`V+M7at!T4nRC5FeoV{dR}CvIRdI@cdTUx zHA86PAlFISrHZ=;J2)f`6pWa6Fm;K@F4m`ok+DS3zxC2%vrLgd9hy(mlo1W0nC91Y z!_9x3P3tH_mBOJNbp-1rKzaF-InP3h=ND}yO%;=;?~@gfzJ9)JMkduSo**tsgI*nY z*g!l{__&`c_TEw}$8otIyYtEhU)u=YY{FDJGIj|rNcx6xTFn7dy7YMDRiM9GZf1!k zQ%fR>I+{7BX>vN#IWkiQ6wk*i`D-zg=3+AS>X*0PrL<*QV1i2!=KnukhhYzdvkKQm zjIH$Hc08iTP5NQ$kv`nD&!J}v8mgZH=*)58?{HiM(^LjIMkP$avw>SH)CADr^e)X# zdhYSV2CkDn(bQ82^fzqe#1jvox$@)!n8~(cJuzf{M*O4=A;^F|e<1}}5aiJd>x_G$ zHhMtT8Q*mZ`d$xfIjlrzq7pPbME>OX%xDWiUw~V|0^F)ma_2O1jp+;7wg@0yGzOrG z9R>^P1WgjvS)#cQFc$iGs>C$qrQq=xa?a%UeDc$iC&%(90Z7m2_9ib#Ow{(yyr;Ry z+fi|i)Um|Faps2P76~Bs4!Sx2o+fHq1<(^iz>>Ka6>NsbkY$WLuO{1RfiJa8sQOa; zC%Ca_v+J)m(B)4j*70QZXOSvqRNsXs!vDiHV101M56GX(UhvcFws`jmznEBxr+3c9 z)QgG@*M8=)L-sr1fO#?Akfm9nni%kv*gPJ3=%G1;WoVXmCQg*?e<$MLRP41_z$>I} zxENN|@RO>kw8uZZdPWP!wFy?d`-{g|hMb2A#2LK*iGS_63-Fmh+|Y%PIjukHk@+Z6 z7U)bbOrpIqBULg>A=(jNi}Hin`?R^DPQG-s)kc|B2X7G4hYcG>w7&p1Pkp+|0!4cE zIvmBZkK{G|;)^eaepNIsMl9J<^RKhK*M6+xF_m;%DucV^N>7)#OnyiG`lke);RyWnwbY)Qu#F$y$3FQS%e)dD_hAqRMren1VT z0(BAg-!!?3|NCrCuF|#|YD<7!&Cj^&mv~!iY0&yp0(y*vR=g#iaE(X##E=sNJ69#w z_;Dv#g}@}tmkOE4;dtEe)mNQTE2(OO&GMU%FF1O=^mht7%x|0oJHEQk3y06up%9hl z!64gUIog^!)(+su6V*K7yjFCCp@(t=^BgcqOfjrCKumx!85FaJ^4alJBbJ2%LKVqs zI-jz*NpiU14A8SaLb;8eQG-K%>qFSd4mF1m_|=f5mldz$7x!_YGs9Pu%JLzxhIym8 zn!_xf?&j&}+NFNzyyJzw!rcCaOW*XW(nQwMxzh~$vgdJJFL`{vvf{J+S^uH<^`tZ$xbmDM1( zZXzq;&cx%ECRD9?Yoykzj@Pb;MO<}Pv%^7Sx>p^o;2JP&$A#AO$7mQIgm{l7Wh^7FqHLg7nTu+VdEI3DLu} zZ{fGmjc8|O6vO(+S$KnpJz>Kgi0$-J2v#{XIW}lWZ@v-zBMG)kwTUe|M(ynuJ$^>L z=090mC03J=WUf>TI0k-l1_*hyv0BjJl%PmuCNqaXPd)pj_0eWTD2bjIp& zne!u0$6#9lLtEX-3~$3{j-XW5Fic|n<8dQNvWFv-;?LBe+C%&(-;gd0bviiELVxw1 z_BA&`5t%wJ)C#XQkWKay$q(#lm~Lub&+9wh;?S4$&^1)<)NrdfR%8S-jk<8cuv2b0 zR;}r%-jAz4SdC5l6B8!f<3iHQfiZgi=I?#~r7YVH=Rs*(3gq!8P(`{uuSe*c)4cMa zPkwkXCBKnpyJXbPy;yryo1oUP*eTkGx?TSEg+AL)6VimE+Qdsy^~%w8xbnsgK>OJd zf~6Nnq#$5!n%ve_(6HxjV*-BjI~GgP{uYcoXN$B+Nwn3I`vo zEDM^I3E}qIHCjM`*?uLq?85*Ai$RR)!WkzFDD%}>bK{3}0oYlhaqYD3*xO|GG1(>J z3g%f@t6qU{WeXZ`a){zp(gc4f$BOO~a6JcG%7-ppYKvXq{sBY@y6R5q#N#I~ z_}QWR<5mjH3@6kU2!2x{Q*xy*1=vRe6d{S#Z%tl~Hyu7IWG4@MU`*(L%p5KQkO+2h zUju*N(Rj=mPhJr6iOfwCKO}4wk}})CL4OGTNvWkkrv`nHRZ~%tQ}AA&?+z#tWk4rf zs|@RUUH_gJ4V;HgJRoB%xmy9~7eW-zYSChq;tCLSXMkMryXyr$no?%>N;eKyxLS@c z{`t>AJ$_i5p}oqM@h=_dy75BOPc(_sTAC%POIIfc_%3Id$_>Ustfv4Sk zl6o)$qhgz`C+&K}@<#H>64&rDQ=hGq6*vSSo4IK>QGueZuyZnG zZKl^}rtK4sU}Tp~Cn?Y-KmGJ8x?Yw(bd0rJZPO+>c-_M7@$F`Yl|r`L?)U}er$(v> z#{vMI0rL)}1_yWSaYgO}w}3LQ0q-Ok)dqVhnHk_Y_~F0~RvWmWoGQrP=NF+)$6q@L zrDJoatFLZ3DYNK4{&N#;b@pJ!$H2yU)~vWj-?bH2Kz|SZG?$`GnKHK;>q}Vw<@wdi zWrh&T>$GM7(u{;}9(iWvnH_75dV8INwI23VKSh0KC0vO&(EF@TosLM^22md;0KZ)H z%yu71^0HlFWgmU!@szF!f# zw2WRB{BrLK=_cP|x`M7|iDgpa*$B0PdYn|Iw3K`#-|w0K@X5~VS|^N`N~MOr@ZyV0 zh7`SU9u8-Z9csEFQc#KIl@eB#Mhy-_%hW%oZm6r0<+by5?fTr+VASK~P& zVp6gDVDUp6*w7|3y?&{(2frEdjNyIpswlp%#qUM=;zZGAjmz!8B9oB#nWflccA=23 z*r~+sT9?tzNS{O1w4ls&xyzT?+O))xg7E-MGcHM1e6|4MOfL9pQlGg>;KR)3Kn3Wj zVlBBB7ZpF_!cDa~k^tE|w);4lMEH@JhzOmSN*EIx{cx{zFng9Wh{HZ;6=yYOoVNfe zYf1`l-22eF4@*6}msp%7!sX^83U^Y8J$vIp_cc}*(TvtsD3=Ua03FUEYbVgZlag%! z`DY4R>7o~~p+ix;4d3R+Cs}+?lT}<{w<+X%>1)=UU|5Yb(TlEa=xfEX){7J%=J5mx zYxf5T#Bp3pa_ecvdg2r9xbO$J(LJqqzkxWaix|zz9A+QQ8J!`MK)-DKxz)j_jCXc? z%~>58w8I=h0u?3CEx*_?4h=Q7{91X8YIAGN?4KVxNb;31XPpNyj<-<(zxi9y8eL-* z?nQ;wM$s_V9Ku{yK^4Gchb`-uYiz{lsQwtYroAsb=$B>ylAv2gCZ^aSEgwHAMGLw8 zpW4oN6H>hH_#SJ|DGtU~zZp>`UTj;H;4;bn- zs?_I}W&qnH-noaIdgH_R=on=K;n{)$9^<*ceq=NCv8*-%{%IxrEy8=Q{uLk(X5ZI9uLo-U#Bh^ zna3P18a7x(=4C-FXmwo5;>G*wu~Oo43E;2x3oR!JZ(198bwdjuRlT$I1Yl5MGQ>&4 zxSSuJ!Ruca{zy0_gU({U7ncMKgJ8+Hk=Jn2DtS{H##8i0XpT}C+(J4y=7L|xFLQKt zIr{BP@#@cEt>U?DJjpR?lW#UH+7OuqI-HuJv21VY83{Bux3yvX73?WpO3-^oElMA$ zC|F9q4n&4KE^j9X0xvGt?<@IHFFPU4d|T0WE=M`)NY7xYg8G(|PdbUvWq!-CJ1&~e zS`Cb3_JgXX{h`4SDMlICm}D6xU0qpb|NR@arStq~dasA(E&t?`S7P~kl!P8Nz}l{{ z->y5gDp&I+Ek5PX8vfT+O2;zm%*u!JE(B_5sjQt}eDB>gw^Nq;)v#3ZvCj65xBR%I zH=X~p1=FVJrrSvIi9!CBEtPl?Xs%Y(dSm zMa_0xx!=&jKCXW3bC>)U?pUwq`dj<`zkI`6PikS0J@56m7TN{6y%n1jy~dIER3D&8 z)Lt|hxXLjmZ}MC-og5A88(M!(sE3TMzGUgr{=$F#-=M-1J#;dwCnJ>_(o~ddRM8;v z%mZv|PQ54@_dQ#CVBrSS%ns@&A9@4dsn^548a^5nI8uhu)i>5qY-mb^z@MR0gbLXp zpZejuM=Q-r0VQr8S*aA)&tV=g(zA3jHnjF+a@ll3I=!5s>zDCRzbOlam>JMRc;+6);w*?weKumd>dRJ zP;7y?hPww0m=y+Ju@-CFzB|5cXI!gtlmCy`y3Keqb=6b_w~I9IZsnTrw{6HMOuz%H z`V|;zcK8V=3{L0LHd&ygBDtw-(E^P&R=458E;X#Y@tAfRQBZ$O3n;{|@f1#q-{2QZ~&wKLB9hYEn@O;YbD%%k7 z5;yfpCAWX)NNsV>)c%_~{4DzH7*Yqkd}gaeZOniqwl`kaqesf9qKmtw|L9`&g_&9w z!FbNjQZeH=9`MCKt{l%vwV54zC^#<{u1Ro8F?-_Xf(`S6!u3D1 zfd~c=#PnG_AKPxnzu>LG@@mv^g|9_stO)CW@4aV^S)7rl!s_!RpEHj5u2=K8)gw5p zaSU>+w5#djM?0Q1HPv<*cA@KRU>kk$Mo3-_AqOk#&h(^I1ZG7VqX6YO zef--SKADN+c;G9g<3S%Pp27y#KQb&+ac&1F@X^#S_6-JPurI*J%S3KPoHAh?d)O=M&fXJm;5z#>ULuC;ZN&c^q*P_w(93_S}> zb{Che-02MIt7Ft*n>J=?j#UywxJcWDyymbU(`WlOD<#7`+T8T_<4^egM~O!1^wg+P z2K*X9t6f9FyJ>-$+Tu>m4&s6|_bds+ew$={{~;f&(1Bidg7b8aB(vs52*(dJBL_F!@;k zKkzyusW4$U z4Cs`4G@dCxy!S|udJPq2GFAo!CxcEh2-6)_g3`E1WM9&zxYS#t*Zlp1<1uf}A?YIq z|3vR?EN&9=YlR9GhGIja%pnhu-+(ChWXe(ERnFM{-Iq!ru&7JOn5Y!e2-un_LEuo) zz)Bq;AjS9e)4inmwY~-#IzvK(zF)!E$ZVkRU+Aj~P#y90YMFQ_Qq<(F2SE}V{V!Ni zKdd+YT`gqcN;TUlQ;oZJt!}hX@qOho1`LRbd4 zH{T2dLbeuI3_kA#K4h{g9Fqu(xyApl-`gE|H?k}*u-nyFkC%oJ#s})O5rDg~1IXkI zuQ}pQy*pB8^W~$C(8&P)d^Dp^#9d`j2*!jLF9^6sDYlz~p@(^ZSLk0pS-0+Wh#sm_ zJ63v5aCOsT5kzeuZ$+6YND*-_|Qksll%wf$`mekf+IoB69d6 zXA^-Qj?OGiMn7O%R!N%@?*`f&#{(-_&6c6KE)XX~ zs#rRz4U2XpakbJ!cf+jSsnkap2>4bSv4}ZKjWqx;0oE9v>!!@K(2Q|Vk!1JcrivCx zbZ{8DU2(-qFGHAHfBt{t#Te`I>9r^K*)sdEBJEgr`)9|?c|&)5@^jCvxhA%h`ignw zs(ki5yF=?#QRB{eESD^F4t?xD_`FuJ0G%}HNG<4h-@VW+c1CRw?o{`*QhY*$o~}jB zwhSu}?rn434Sl&gMJa(;IudVjvFn0gcM@IdolW!){?svi`-2Y#TsUEF^HJw&=-ow5 zBoulpaLeNOKdkv({{8b8){Gbf6on4NShc~Z%kUnG0s>Ir2IJ;uUsi+UuQ;~PmL?ol z%NeJ^5yOIm^tOah!;MP3k0>c&FL6>Za64pV-3vk2OEnB}&;t+LiYFpi$)C?-*XPJe zw`cnFL!P|g>?^J~O0E(&CnpplnSr$ZQhQmY-dF(8N~PGAMmnmTy%(FgW39#TjzWcA zhbqdzPFU9UzWU4g@&-#i|Ii;)XE13FHm0+MG;Vwk`|PAsPTBPF4a=@Uxr$4{l~>Nu z;I{VlzWl)z>4kie2PiYI_RxlgBw;O)=Cphy@p@t&@z|GMdJM3&1f9^~$^|56pC=@L zM11D^W@k3XjHO#2dJHNk?5DQ0!kHBQMdv=>ez+{<9v)TEt8BP^+jsx#ck^6m&XwMG zn?!OO@<`klGm#oq(8O@7A|ZXpt9wKB{HF6Yf^~5uv*${zRxAtBzB_?4;BQR0fQMb{ z*g`+q;eJ=h$!KfK2ig<|3sN=fgI%fVLwA|Q)nCWR&P!F0fv!uJ0-@2ffT`zU1{LCw1I@OyX_TBy<(q~&kB3Hdy%O6G4??!QU`UFIN@R5I{Vx7`y42%S&e1!y}^`{2in zGIQTHTBC;ggaXj#o3}^yWara!D4PVomQI8otK=*i_>DwOx*bvN#BLy?L7a0MsA=j% zmrT130euKT!TIe?goY;$X8?u$X&Fq#VO9fau<@!Mfb}XF$x98LUXlJo+)=A+tnqJT zrx*Vak-``XdyWPU7F|u(RIC$cPd3a!KGJc?6HT$6knRfAfC6`^Ql&0)+9?wE1GRYe zA`J^1J~T~Se2D}>l_8mupch!ES!-V1l# zuzg;`!m7JqLh#^K*e=?Bg_Za)+Pw??TmJi~ty{KOp9|hS6{n~NN zV)Ex}e)8{a@savzmiA_fSYy9NgSOwJf6|;TaAEO(|GntHw>?(;-;>}5wOf_j`tkNE zrFQPD$Zv?sq?MZ7Xe7mFzHH@rPhOCT8fb6e#6RI;_B#KHeBM+x^-*GPQe#9 z%=q@>K7X|81E@HfOINJ-$&k&eH1vGdw!za14gtnDbW%GcRt@RFUP;u+ERpR`!FzLv zIP;bw8bOZdBAqS!&Ziy=5}_^VM?t;qAJ5I0j8e00|BCf`o^GBTJA&X!Z8IAg#w7Lc zJ%5L<82`L6G!DRQvOdq{B>Br<=18BnemtXbpWf}PU~7BRpXaS4=)fJ>`f;BVWGTU% zua@5(Ec05EyZUn5Lwl3n3FMour~xyMeaTzh=qaLbYx{wWCW5y5yPZ*n{mJV5#-vNw z6>r}sP8?2?f+bS9P&H>i4e3LZvc|u|{z3t7wH9 z-FRc&GT5r1KT7+fi+PbxC zKiNKdhac*+!#(e=a5;kM66f8D^S-~z8=k-E>thMHVr;hTk2=1wG8VJ99}qVZZ~H1lEoe2i3sJer~*(Pl)7rG;?WKa6Z$3GBdO%0L!$ zePGMIBj+P6oYl1H%+J+(8EnU5??+`_M4p9IRt_619Wkzkpp3)tVjivE+GiSThN%|R!^_5Lr z3R7Xo^}58Dv@)IX1p=Y3 zl$v4y_gk6*L8h_&9CB32Q(~Q{>FY>(svmvyr(U=0x9lN@EHL|y#%HWIJGIxQ)tT>b z+b+93FUrb#!sknJHS$9>NSOL^tD*9)`xOjv=3MGWqb~%+&UtFos3`VfZn2&c=jVKm zWCD;Ls4(96)*G}4jO~Tw^PjvRR$h)#m~>=8P(_@js5jNxaIT>`0U0CUju>Q&mJ@m3 zwRtpd`%OGOFh`xHbFZ|s>TNIBq$f-K^%~C`@|mhADJ;t}Ym$XX=ZG*o)@6SbQJ1S> zfzvfJ(=Ogc2-Q&i_-R=tEEGEfV>f>Tx_bVGFDu4q<~?wD%8sP)eBFOS-= zQ~M{Y4_Hy<#AXdYp0#p9sdLYt-1LCoom=M6n$P^E$_=&Oe&(y&el_~;ou9q+sLG8F z`RexDpXy)w=DqHCv&Mo?zWnR57y5NS`Qz)KJE7P6+fF+yLn)vKgIdVMgEPxaBVg`5 zfQssx@H=PE9>ifhAYn#Ud7c-uzW?~e>+s4panPC)i(GCm3&39KACJ^`VJ10n!R60{ zrxayc)uzacpDbT~hO;H88VDz5vBZ!aBWU(T8Pe8MdnO83uXyzu{H?TCr?#FL>nQ0U z)_Fk0>;L?iyiHBR(S6U9>{!2NmS=$Dbua7&Va;SqHpF_Z#X^{PfZ@)*a^(rN!MMmW zaqg2Wj|M*~=O)XmqQKH}`_(bWtTHGw&I@&hge)&?k+t7(rQ9$84hhx2{;UdDef;A7 z_spH;U}@6*o}b=D<)&qk;1zG@UVL#Ncbu$1(=ZYxaK=X(-TIS9Gi`qhsGWRIN^`Vc zfPEbo0Zte9e*F9KOoP;T@ytNW!=-*)P}eh&HsWMQvE=AGd_ZN{^|WcQVfA>e3Gck& z7>X*3$r(Efa3tg`NUm^gmVc(ql z?D@U+`qaFS$EQszw-jErh0?2~Tv^(3*@`*+>-777eU|8CaZ2bsby)VHqM;d*UCCwf zuO8?MinG<=COG{A$Zk@Rt1^V@B1o%Nh)H0b*qcQSYh8DE?n6u92+x?P`2nbuL~kuy z4*gNZ$rxPlOwy#u+J4L-TT7b|_s->w$~6L^+~!3%Xu`&qb?L`slDWEWwk;6}*)F?u zyFgDx<*rRwubZCsGp$X|ix<*!AFeaJNubKmS9K?)2jbqG%W6dCfa=oi0`tn+Oe)k6 z8oCs*c){}0eI9=yPB_q>3crJY8zE?p0a!PDcBKir`D{ViNfgrdIE-;Ka?bq6qsHB; zw893v;%{7dfIM|x6r7>-JRY>vA|F?Npmq)rGJ`kioS|rb`R&TXwmTvBKBkj{Rti`i z^D}c&=+>j)P0qp|gE2NpNwb&+zLM_$I1KaC74h|lR3C8B#0wP_8Yb`m{rVTpnG;cy ztYD_24VK++KN`8$9LzH*0~&V!*~K+c_0Vo*)*%_~UE*^DI#ru$EM9rS!AN1kY1;2s zM7ts*mhm2Tv0&qI12;11m9~ZL!{Ie+?t90~SBP3edTHg3!anY^eH)vlh@V@3fFY40 zjuz)NS-aHY6=jdo5xZjYhkpUudr&dsFv^?Da*x_z_Wal7G(pS_qd zI0V>odhA^ve&B)VfMaGC{wT>S-djAXXfayO`j5W5hg2oPZ#j78=%Ut!@O~*8cT1%; z(Z_3%{o9<2icI?D{GVTcihgDWesK|+OnT6J_kZihOD}a|hoBaU;FE%)g6^2B;!ji9 zdGGr<1Tr|NMWnjm#Qf^-pUXr8m|*O^V%YpEOrPF=w0!~?kI_Ohe;g4i00;OyLSw}L zG%h6;(T7+4k9ODAmqoe7EEz}a+N#{-))NhSl&?Ph;oo~06~^~4=|7c?rV0KoTd|8s z0aYy19#%+oC;GHO1{p$S1>K6oD=z_H2nHd%;Bg1A3>`l9(Ce2s?1)!a)uxb@MC=Nr z?shEB)R9H(i;mICJN-ePnfrn5=)^+EiM~-I=OT7l5&D)s?6fBq@9iRaUXgV^Shd~ci(u6AmM%R=LjS?&pTB&kLy4f& zw0ZNYupI?vrJJ^_KfJ|PUoIOdYuK=C&TZQl>G_)~cl!0@%F?IMSFo*FJnlJ67t`Te zP(~L*)2T`K1Mz01&aZ{2haMkn&I}Ok!;X=utX{pbVLTy#bGI&NKY0;{oz}3}RrVR) z$+cMBLHZnn-+#O%iu76VfL=n!3nx6{EhnO1VoG4JWvv*Zr@Qnk;uE0)HJ7NtYN)sT zV0)(O>WaJ~%NU#yEKZvTR&n;WDIII}M_f=%8q0j-)hE!_#~0yH>?}D~$S`M|u~Qo( zptLrLyc%6-UVv;mdbRuhddt_pi?>=v+&%QfKf4r5#K%m@fB_z8_l;9OC0#)(=k(or z3C?9)_GuhbbNHXa8j5t^1<-5^$=+vqLu+yCrnEe5>zynt7B9&R799F1{xuCwZkZTh zYB4E)p(f(#i;gaMz*A~>!lS*sMcu4A2bcs6gD^^Z6*wwcH&YzvU8H7DD$Z~G>Ti8n zA@##BE&AI}n;wMA?E$@p^sEt1u(k4=H$VEX|GM?Rnx1*a1;eDUc#E<*``ARc_LJA& z!t=!@<>{__BL*E^e$RzK^uB209i`Lh`C~Y$HvD`8({cw?HuFv1SUTA?+ktj6Ck(&! z(+rp%m5Iy*_^OBYny*R?JbE#t@z_+ zzgDAFKSkHpQ>4>>!w!Pq%4FPkGV6(v$v_w?oq|1plKDAnl<${h(H=q;N;EvYgb8{f_2DicJf7AUbYUS){shxVvnCpb$$btWAiUB2~_e-#oX$fb}R z9Ya9!Cvb_1BjhE=|BF~8B|ulOgrxE5;CBR{XLOQMe8aL=Z`*#ZBtB!j%bOW26Rub9 z5EL|1wVgM({u;*m^jTB#wR$&hzI*jwp1ZoOj(dhJv#?5ky=xutR%UUVYa8n`O|nVv zo!_R-IaQiI7&-z4;uB+Iy5ule#JE2e($Gq^zCQhrzsg7=J&riLM2=crek(@B-tL0| zs)=jyR}$;NQ3o1Ig4n6@!*(-P(HhXh0u(lecf#~m+flD=+c;!K4HhA-A2c5r4{fQM z8OfKC^>DqAAAZpVzG0>(mNj1wt(ZqR;bS0~J-2CO%=N{c*I)_~u5dQ$RKO82t|S*u z9(FKbW6YB#NW^E96Uf4c>X10<`7{8E9E6_kjzJ*@?(jqhiDzKrTTwrr)Z~w@R-Yw) zGsiT=z|mii?>Du|euo~KK`utr8V2rG!KR(8bXBMjSck>czK$!#YQqMPGkUvg*V9iZ zYA43;5M-v1ty1_(=Cq$oX?$;+Nk<-a)SefkB*?)!%AN~7@rL}b54NDpju(7ni=STC zLOGintg+(956*3W_{k?9WGKvq7nT>2Izty?j6%;x6>`tgE61JO>!zE|Z`CS};0BU) z#G2t-JU3Xb(X)*lop^nJp57ICi_uMa;6>O=Q-jnZ$SBk=7Q-}X_!B)zQ z0dYNag|J`F|B5Yh@oaY)ZQ$1m_c`J+yR=RPOrI!cfr_yQ6Gq>647vUei$^yi2j5UN zrq2K8ZxntxGtbXc zQae(GjwyCXzPL#6UgtzUt6>=Y;~(RcgE66SXgFi<6A@S-jdt_~5s(uT+G08<1!y<> zu2^<8Tldd)%(W0(@?WfsE9~8d{G1x3|+hLQafaqC_OVT^QO6ir(~> zURuZ5FB2T(HbomTR#9Dz1hTf(Q6@>6T(Y5b(Hjv=mORMpvY8gZ6bLMESsk@wbPGWU zhZVZtlgUsRlM|u0CExJ*P?GP%c5ZUhtUZr=np<+*6mcxf|6b!*PeCT^Y!dlL&eZaL zbYbK3v9cz-Gho4$C!j(`aUUe`;wifp*>f#4?EPmyH3(2w=(9ulD`W1eb8}~#N%J_g z4CcY{dYV|LVWX(ZI-l?;;Z+t94r*p_YJNm9mjNnMx$VTOs?WB1SKS6pPNVBv?PrC_ zu%%Zvp72iQcLZ>9Xj;XBUv#*-{9X6Pqn8madKm5F@@Fd7esrOpTSpJOlkIb7-@Y*c z{K+4C@53@*<<`Q?^rtR7s@Bw{p%=)apiTghbE<&j;1coTvZm`b)l9#1M(@YIe7kEM z_)EvmQxB5&BGC>z@#>1(7fkB&-4%94qh^~nZHiQ8+>V!BImXcUls~4j4v)aTXzfES zPitqG(X{fQ45FB>XB%PuOzUnP3!e?p^}h)?z_QUk^T3Qvshad!#Zl~b-no42$q9!B zPxRhv$A?;Hw}1U{NI)J(=7VSx#OdF}tT%fQ6im5Ygg+ zt@4y~f&%bq7LBN8Tu{U&MYsA$W5}XpDo`IyW!H33J%fqIFfJ3#mK432C9f4Os&F%5 z20HPzh^ZZS-97~u@NPkpY_+Z~&XbW{)eq+_Dxeu-WUw-(tXfK43QVhc6as@!TjB1K%);bw} z2R{gfVjcPH)2%1gsrBeWub}5!3O_tS7Ze{(Q4t}{OQsc!p;wLEvc3Ybf|G)*BHeSQa)bdmWzI8N?S8OEY?Gj zWu;*M;9EExz3A=MGTEn>URiuWuPx|Y8~L~BXI8IVIa|B;d2qgx`cs9YV6uLs+2ud3 z=Dgx8dI(jRwxHdZ&biZO@uK@DcRJGoD1K@#u=Q}nq7xpyuf!G^{m$i1!`Co{p4YQ( zxl4(aJg8_vx>(u8=kLwf78>muonsaDhGlQuHu7*?K`pM~8#zut_0(Q5;=m_}X#6ZY zYw|^1e~(xc@%CSIzQWVK@VxUHm^c9{&SM&8p|zh}so6Q_gg)%6Thp8!Y}eOW#af75 zc#4uexSA57>l0SMMMtMFTRW`Fi16g6?XL`0UM_l=jgh46HH}{!l^C!#7E14#+kh3k z?H}|1O!^9GV{lnVj{K-a#`-!UI-(5VUZ6oO6f6gcNow2@m$$w<={^N{)AQMnJb|@W ze3yq1tj4KA11#8vJrb9*2dievC~xCA53RLg~--!E`ts7}zx24%Yt#Z)RK$r~Qtl&4&93WS(q^zfq;y}q$d zzv8byyU<8@fQEqb1_lT8W~=v_RZJHO7c~s}?xS_zciQEbF*xXcEhBndqJ3kkGVedx4-S@x@euFPE+eV$d(5*s6+p$-j>OsSNvPw10cQ+ zU;(`d*4e>MZ-szze#u*n6s>rT4CDvQ*mq4Sk5Yt7qk#)!!{U|da_S^HA6;If>s2kh zo=ap-tfQWI^0r-eJ5MtG6f6O^N7MWTl#W^g;oSB!nck?;lLWySfSdKYWg~RzwD{p7 zJL*4wd=A;O_C6&^Zn+|L@%Uh+qDD zcPzgMg@4;6CvU7B&uuNp-!FT)1uVzzXN}k^Iw$pnoiMxI{CsaIri9n;9>sB zGv6ovdt9XxJ)ij52W^JS+JA&E<|}95ur;Dc#NJtruYs~~O~ICHtR_U$#>U>)h>oLK zW`|*A1x$PH!`%(x=1*aJb=NG4tb+np{cAs!y%-vlDKa_7*}qMA=j`IYxGIyGG`_|@ z{d5`Mr~@s%hzom-1A77*V-Jil0B4k&y$N|uodR5`b7Lm9a?9=Zs|dKRJOL8%0-gXy zu`Y9#9t1#r90RuJKFsj2%#Fg2QfS$sR5zQy`1n!n2ON|+Z`H)2LJfYwfMvgv^8>Bj zJ_C1*2Idqshi3uC9$1K1DM?da;qK4-{d0KmnHm~@^QQmeVQ3LU_8MM~7m#7>4ut4E zC077@US=&uo_0&uZvXMkbj(ZDE16b}*h*RprugX3Hw+ZhN5?0WM`{(r4h=M|#7TCbi zxqjwuhgB-IbNzRJy1GM=rK!~g39EnAbjd?&=Ir%A5`v_!`-57i8D?a~51+ zdBs@=(fpMrn6M`m}PYV^^Y5UF@J$^M&SD9;4$EzwnXL=@JuG!x2k+1*D_xr)L{+8B~F-=OxH9iT6Lo~Ig z|I)Es{PHa~4S&>YMc9eb$$B-8spNX4=s3A0a`C=P4^dnH{&12i53iG7#drpGtG(CC5+Dh?6E6Qo${GZ zY)k~Z%3}6o+8`@Dk$AX|ob@js>W-Ucj+O{B9Kp$d16V^#a&A-zFpQ2(dkT^~(&R%VhiFf4-`3;T-hQ6Vawk;VdYN$!s+J2epc3s$arl zAXC$uVyzh5)3$gt{fg~Hqt~aED;~XG^xM-;DE=*-`ux`X;!D`C@UQ2*-JtNRNBvjH zU#eF8uSK)qH%u$~=zv~v%^UG0Vgcjsl;FG(RcLT-C0}i zIDCCn*V+HeN1gFa{VfN$%#uI5VOc}Zplp+$eowVs&-kS216BJUIdjlqXFOPSMB}2z z^6c3~H@0O)(G4Gi%${dFyy%ZJsuum&yIxEl%Y@>`a!T=Y_{p;@`eVHo#h=x*#QPd> zWRs#lpI7wHR}CtfW8aNwh0pF;0bR@cYi;nBA;v3)G%oSe6S3}H*oJ0BSMtM8KU)0L z*2ai(|HsqqI!2|k;}e}VsQhIoJh~KPxBgr@q6OTk?_BYEGiq*_S;0k-8aSn@mqY75 zM)&^r#xOU%!Wf~#e?CRkDU2?@Fx@##o^51b-{>Xt7uciGXAf5GpKy;0Hln;iL*wXC-TGy?+OS9I5(ngR1D<`O@X9ZK;o2kW&jph8%p}QXPAw4#RcDZv-k|aCfcM|0h^zlD+D_MH zFP}PK`xLQ6YFB~iBGRR~k+Vb=gU^&%6{|Nx zwe{g+0CS(16C|-k#8q&*P18>CCk^~r3m5JUPVB5QsIv-PNStr^sBJ z)LokjS7DK%P(8#asY25S=Xhel|fx#Cf*9>>dS?hm8&>!wXpk|TelaCD13)-Cx3xF~R)7uT&BmefgR{PB>EIendX za71&4gOgGTL_OT?ijqGw?TB>CAS;;{UgtV2aSlmuLA9YfyA3#U_Mr09f~c8|HY0=K z!!ZBAvxz4mFVNU?OS|?tqfF1%+WW2O&}Kwx<2~NBV*3I5S0JzLZ^p1z9j{Cnd;IS} zs*s!B_oBTmX&s-W7+ZXOi@XU#V6iKXyXx?7{x)G!Y}$Nk;m5w+S=;Za-~D-TpRsbS zY0uh;(L!yw<##Xkn92U>$iK&WI)INGRVu8^L{$RtI^)rY)~7!bXC*={Akf57FTOb3 zHGn6&y`eY8q>qN6+c8=jvwW0d&cWP-FIvQ9&MDN0XotF^L?u&{x=t}@2|?+;&x?0O zAy-dQ*lYM>6dv-9ppNkEUeME;k1h7? zGiA${Z#<^{_N{M$o2q=9nT0wT2WfUr{5yV|`>QN#JdplduOQbIuv(mJRWZy=jG8BvrW)BJ*2KjeX#;$6EO1ZhIPc z30@Dp)VLVDn)a-Y3gBvvw1w1WOjh8->;(&Nam|{3)d!@7#XYSR3`Le0O9Cx%>z~`LmfXe>0!;o0n;oKsr9v z#H~K!kS68o!`Jq(+?rgk{crVWTFij$=g`I$TqIi^^^DX0Xrwarv3>O_GU}kOkQYLd z5j7vxL^F5lnT1feu$*wF(nT;`Z@$;3`~Fm$mntlkFvliwp`*p=D9RojAYmDs|5xRV z?^Y|dvl$?VcAWh@$tp&Uc^TxkVSW_5GHB|}jA4~m( zbGgew-Ikztw7GHJ5#_eeU|aDAk?zeAr_T3w2Q_NaDeBcgS3FFN5xZbTt6*SR1ZIVC)K`{8OMh(y`lWU=Nf0I^zD__*Et*1sYh$F z_GcIAQUV&G%5PVI`B`|YU;6s59r$7yR%qe&{e0qce+};jA9lSl^@}I9t^dL8FvuDj zT?r-dr@UnR^e;AKjJ=}5nR<~~v!MlEy==s@uW}!AZ z$k~mqNWV6#?GHVAe9G6LlcMxy2A@*&MIWU{Xu&4K_E>Q+fRr|8RVLZ!Fh| z$9P26XrNTJ>^V5EYR6#xIi|l|w!I>8=m*2G!BF`Q6_4j@tH)D!{`@`Xw!8ryA?+D; zr66G=A@uEnh7t*zV}EYpn22r@4(av_wd`2qOW+ev>%+i#r&ww$bxSYN2afV}?0cU@ zA`O zo5tv=VOK&yw zrWa0uOOFxAr3hddM(pv7=j$mA(A-%_nLiNbSg!u(PM_C+3ipMO0os$&KmLO9PFrTq zDPK;Xog+^}Z;G9q@t_@}HuM(j{oP3y(8t;iW`!bf_@Ak&;uJJ!VQ1*UptcX%uW=^) z8Yb>>c0E?z)g)=set#|SCo;B|?kE{_q-T6NHnE3bO2xic3q7#n6xrjX?csSYi zEvh$iTl(2jxoP`nS)pJmjP@;Cws1L{<}z`e2dJudhAa8wII3S+v3~D3YT|vivt&c2 zgRNf@=qUFLuAXXAPV0xNHbo67bbQvUc*N!v+h++bal8mTaI*Wn&q6L70M1(gmb!uX zV`Jt?E0)rzJR;)%ye~sGUpL^3Dr%(*N(gTZ+(?mzm82`b<>N1VH@PI^I(3zFD2R2!rd3e3~E${nSjRVZ=-gUTB(ETjFbZRaJIuw&jyufXYtmRX93H1a)&Zf;FDTR2k73r?>Dt1Ij~ns`ozGjNZW*WZCS_rpSmq zWIb=#ik&>|_zd>69Z~B0y^H%QZ-2{4KUwQH;w=%N+fj;uGP_ndM#~xK|MHhAOK9aC zgRi&iZv6U-`<7n0df8SJ-q^#8e?gGiDC!)3FkYxvyBbUR)R(ueJ~%+dihf~l5e*dj z&0PK0^eP5kna1l~3CK?5Dw{TLTruP+i#(t>h5LqPn^;mz;o11|mqra$;uGy3?2)O?>Z~^vW!Jka7GHm{-2jm>&>{es)*6rp;$77*WW3zv;B`If##>4IY7h!hywoF>ddkU@OZTG7ZT~H5F6Iu~ zsMF5)hpaK~BA3+Zyx_nOD&sGt3jkb5hfGxXR7qF8_jJKX$+xwpw4&=iiA;olb#CNY zO|dcR1wioOdzLD7`i9vNcR3+rNtODAPfDD7VrF0Gxg-|(|8Z#}%R0LLk#5fyj=28B ztN;4Mlco)Y!Hs^@iU-H0W*pKROM|Ze^P!r{$ss)8Zs!Q(pMo-{XE;^9EK)-WQn(|w zPQj$@U(I;nchCP}CoCDwnkHA&WlNvo-MA3b3pUO-X=|XBxn2r5xG@ZG8ou73IFMfT z;RzkpN|~tP(90paQeKV5+)m}C{%s)>2 zJI&0vU+uQrZn5Q6)pc!=P%Kw`>Y~ZFTkQNmTZ}P28Kq@rSQ^rwg{!QQN{BY2FcYKl*aX zOP8NI=WJ2OcaiMB`Q-}T%HLRx5c!souv zcb~Q8&T-}ydc1t77Y#f5(&r!GV^Hx4E??@!Yn{W}{wLmWmj2?HKch4|sedWLNpjXL zplhmm;)zYVXz(k-4|t5WsNGdpEo`z8cT7kvanxQC;)@4E~$UlSCD%1f-F9N6LX$@Mo(OOZqO5E2!Xe{lsj zH*Vax9#zZVv$ggXMavs9y#t}Pt=mr?YB|3>h<59^?@n_<=MbQBnnrHF=Np_cKq%MAa%bNPzn-Vs))+Rio z$fLhalE?)M7Hkm(7LiF+Z0#UtjQI9TH{Fmjxb7X|M%**V0ip{=@926&wQ9BKS=&r& z`cSph<*GEcQY(7fVbNU2p}K7Up5>c2Z|<*yhkWZeE5$}?nmF2XaptKQGAz?*U?lYJ z6I}o(W!>kX2uj6h{3a?Vr^&$@YH&R^_ozwJ8(el-r9*#53WCR7_o2WIK&4FXjf{8j zph5cz{S0d|dbD|q7V8$gxPE8sz1mm*wO)j2nGUWk+giAv%ee8)_73)pFMG^(Ptobz zUwkqMz+cZ+%hn$)d5y*4{ZBrbewn1ZtY{!Jdu*w$*4nP9nmwk`C${-!M!GN|WY?)P z2k12UqUL(IWGwgscZgt8phRHnwYpPnTd>A7woqyObmVXn;x%g}>j zPas=Z|5TI|s&O7s&pfkukTB4!QknJBwYwezqihOWa`|z6w(bdLzY>kUOGcNuzD&*X z^6tM7r$fcsC-q#s2du$SW7U*|39^woV)8$Fis_QRSd4b=b<{4H}xvQya+iD%8@gaVs^#F z(MO<&wC&KoeYhyz^YpWTimLi>YKp%m%Vz;Ai`2h9AXO5|W;Gk-%~^l>%fs=rzF!mU z9BcTog@P9D(LTD>YeRIGVTLo@<-NWKe1gb$#v1?LBT~1zcWB;v@#i%0quERzp&Fy_ zIch9m!mRh-A6kF7PMz1g7J+8{l93NVCaP7dmK+^wIqEAu4yovb8|mxx&D+bC+O^cK zJMX&lPOb4+rkgC4kP`2i%r5hf(>HfDP-{69NzA(o#y(x+WU0e!P7rruG) z!dM(xHrz1L^MlDEIcKtI<*)&)vgC1&qJ zFyZ`%1ZSvL%s7Ba+PlmPTL0Boc_u8myIjYk zAoe}1lo)kBCR|U|1lq>aCd0E8CBcn(AKqL9ylq%=2aneCxpIg|cbvmk$Ahj?t5#Xl zbgZW#6}!SN)33YV-Vv5ZBNg3`Y0_9XOy*H=(A{TNrqCL|hvB&IUWma|2#mmu9&vbR zFzOR&L67pHYLD^+0{0$r@`K`j56NGj8U}#y#CZL?c(m`OiInW8u5X|H$}6{i`v?cZ z%PxCmQ|I>WXJHwh)x7zqAd&PD7bnzR%aKyqU2jj3;z-e15D17acdT*z@gd`OSw%g= z7d*}?_pHVwARgeB__*VY7l#O@1j-omX!j53M3tHOoK7fZs)>U~NT8Go8w$f2GqhNN zKK=~fNcHKxgL$NheO+Vz!8!W0g7ppOw6EFcg5;UOk1{M4dPlAvTdUTWToMsfUB`lo z0epR6n{Tel@u7~eBzx4M>btYS;r3}YCCHm$*667}t#3ybnYT7x|*513< zUVEi|5B3PxHNyv!iM!vF+6J@D5yZ2qq~-Nm#70JD0nB+wrqkoh%KJXn)U{;PBm3w3 zGX&|}>K$Xfb>^9iF7DK^;x4YBjFttweoQt>KZW z(C^|0aol&?dHEsd)!QfAAxrU#8~jJzI}|KayuuMMo?pDR#A*thAQOLLOwhSux8PTI zWq>exf1^q#(J+6~=tUAqo3h^3I9(Knqk#ul(v60a_hww1{Fv~D&fH__YySB>fXT;*_qeRC4KGAPKkC#N~)BuOQKLM%>qf` zzWvYa5eZW2E4DAH z+uNS{;DZk^P(JM~bCo6-64caTi1Y1myF~WQYm4FO`Wha&RD0v-zQ{#o%Qon8qHsmQ zerA_C(9n!j8#8q1&_%;6rj&SH9x+T8+3>CN{RiB$-qrdSJx*W=%y4$Y?9%leLIeBv zCw$sxdRKW1Mp1SHh=~~^ue`;7zTxT-&&a|y0wtET!YyE%Q?OK@r!RU}-3QOA%FJ_9 zm%#W~d1A>KO{$i?29uj5e9w$*4#z<_+l_lcNKf2hvP)-XFdQYwc~3t4ZN^T7pX~|O z9plkTGJ9ocDjv)kdhk8lNIsIXgxPe)%Uf3LNoIHUO*fsg^KG{t@T3Gf2mR3D!)qxu zwpI7bHIF~O(UCM`-~f*_AOR!5dPjM89j(0tO}CvHTwO*j?wSu~M_%u4ya?p7qV#(0 zmHA3hDF5En8DmOJ0oB_SPjHY3W*W^tg96Yx&y)M(o0W+Lax5-9Da@ zI%!i4ZoShtf0p_>|KH}Dx7rn*8=#l^$zo}5dp&G=9f$to28RLFVT`VD($%Mn$)aaTVmO7NSkkJOEV6JG{k17%R0UzpF(B!I_$JVOsLzoU*JZ; zET%$-&7{amMdU#26w%k_dC_@u7uaH)%DQ(a9(>$)Yi{HtSeVz1Jma<63?SbUd3&7~ zLv4tDL40RxkTbV=Sd0i!tnN4F8D$ngI~i2$81P~0?Ws)}KV<3b#u~W=rrm4C&SPCL zFW!bi$Z@Bh!q79SGuYdPn;v=i;n;2HdS<-6>bPD@xnxH8D)o9#ay+aEM1IM^@(Wem zrfJ2OF=AY@wYWqz;jz^&d%sSd$3tz3WI)l5zmE?a_FH8;cN?nW2@x1oGMK?P>nkeyL(X8@;Qve!H0F z9KT%#K3k5DwHW=yZd+5(uX*f-=UMz88Xs9|MQ7_hw|qhQO3p{Puc1 zzg+Y~Hq8ixGqSerZjM}$9DZ}_s$_D9`S4Z;htAY;hmM2DK`dw+NWL%WQHTd0DR zIa^z<2WY;{qHbysSUBPDC`=yr)Ha1J)Gtq;2njbE(fA!ZqKAGMxYK2}b zB|lAdRWIgLVn5h+&A{fb)h79PA+W(EQuHK%CP^bvRAfpUYeq^>Y6No zZ}+ZP@4(wme`U6vlK6C?T;=I!pIzNbR$eB>#g=ey*@qr?>ifhAy($#{ao_~43O7+P z_WPG#KHy!OqSs&TH9@}KpZJ?Wf_gn5ypBGi+#Yy^%ezgPHjRhyrYnlSy{Q;{c)2}# zl{1IH34G|Vp+heN$~;up3jO6Te~EbT62urHgXE>Wxn? z7UnsE{$Yj#Z{I@>X^tFGqjv3;Ul;#cbtj}iy775^X!NL6*BHmmg1lENX`q^TZ2}sc zZsT;`k%j-Gy66^?rd);v2QfbNOij9 z_zW`@E_Pd|wcojO=Z_{m|NMcdZKh!MycBwrWA2H7FOJA9FQL`egakNC=Iu`x+<46L zZe{l9tG~8>TJbX~TX|3^6D}%-C7jBj3qkH}%i{0Hy)zUQaWA7}Jh#0Lty}JxQRm{F z?fKS&=T_Ie>f84GOD>6*aBB-CE)GphS#K&E?fHOKQ*gEl0Rfs0I|ept|?pe}Db+mU*5{i{g*2cir;cWg`2b zMFOU>s}#ydV)MXGIpw}iPnL5j^b{+x;gQ_wjr0`Sf|kKm8do0l2ea87)H9`9(vP6u z6S*6JfRH{9OWp4#wSY3nhyLLeP)e96atOSjWOU_^y)-vpT3@IETqCR)A#$FHRC|LcbKt!pInoL6_`D~ zYMTF7UUk(v0#i=oD*ak8D2PRk6HgouR-w3keA1-1c=jM4HLP0J$=`sqU#A;!R&)H- z=ng$H<>C8o96X!;Sc=Df-3YK%1j-gi0OrV;F{s8&Y@IW^6XU~z6#~Jn_GPt!oZ}?vW|GiI1$aOIAX*dN3d=!4nAw+gg{vM_Ash{ujS7Nqk_^Pir1=6DM>O?m0O*FV2>{eoM8 zg5a1Z_uRhBP%HU#PRY*-UWRC}N=(T#jyhewgl~U zL1%K#o6i-O8y^g?2n|aFn4**JFnXQ?SGuPz6kamg0>HcO`Pszh7R9LU?6GATGKwk& znN(A%Nb3^d2z?QA?cSY@x@|qNanYkhEU8he){5s?ov%cQ7<2Wqmqk=LHD(xPp)pYz zdM@WC+cHZyE3HP28jmwYRJ04+QtqN{HrYvaO?Xb>x}eLU)4zc)>tkkq^if#CX;p&6 z>$-c}#F(epn?Cbio0Zq-^e%_uYQTlWfvStUcAt*-ev}>;9sTN(B@fEfM?J(vLj*wi z8pGDW`ymim3w;`v!j6bOyWwek~*ySmczFjW5Sko-n;J(4w*r{U=w&a(prw6 zy<~sU0sio`g2Vr~)kT3}9hOtcu^K=U|gxCyIuu})40sL|TbK1<`fcfp1xAm7Q)Jd+kjU}>zN zs8i^4)~{dxNjo37d#O^fa^;S9*=3iV4qgj*i!oC0<@RmI`C#Kbli>IWjd+K1EmfC@ zmq{)#K&9I>-S#r~%*{VVST}1{n2Ao-WbQj|{+%9EH!WYYCI(-|GseqPLe+iC`gXWJ z*>{9mKEwhP&URMI1Qiu5e7p(ZT~MS7%ZcS- z6B(chEdaoW+X`GT4maRLs1;-f*Ia-7>T9x>!dgUj1=-tCdi4(mD_F=%Zq?C^wh7hH~mu0)Gy5wXDbO zr$2o0(aB^td49rR7oEB^n@T*xQRlukTaT@b4V@fbnz1-Az6|gA7hf!E8URf}MBxV< zkkJ&8EuQyeD$qdK)2G)9U4&6mT@Ah}+SIyjku{-e^aB=2w@RMgF{IKwQpd%XG-bY& zK7ADw9f02Y8o^$nK`=ybEzZ#pz0->h>@<5o38|lv9y51SLglAsd9ZW&)ntMMVBV>e zzyMiGb%yhsS-&EkOPXiBMJANaWZ+@J&2-(pLGQ*LBR7Th$o}q#|}Ruki__sqNmqyGCTJ z;v}s{Bjg6Ahc;LSvyeeDh}m(rT3F102Q;g|r)_$z+TVS>dbO7H+!@=xIu2ozerFb@ zn-jYo9Qf@&Fq|{e=6-=q0)&WCR)Ohkx);O@j?enNpUmjTJsJcfhmFpIEv?Rn3VLy@ zeN-wf_$$Ih`h~b+ivk>$<2`6)52f)pgTqtb065*C`>_~aA~DA}A!txN|9JfGx< zI!H(Ew>MG?v&$jJ$Y>aS%e&P2sH)40BFRQA@C{O&?v_0((giY{`BzN(|2Vr7IIrjR zef-Bk!cZz&q;*uX6*sU zC{q9DJu|B5;GEz8_jr6CKWCcxeBR6Jb-(WWy081XK8Ud?f%_rU&FJYxr#LC8^J%fv z5feQY#VVqI9#eI=3MoP7403c3IZS#9Ddip1p`<4q{x4VHMTK}^$fPa9h@a`ggfAS}abt5G`)lOjhwC(h1xmFna67 zY-QB#QnaPWq<(+_06z&&v)EWLn*y?==S1E0)9=4InDEBo2C}6S2=nC48^|Jnm!@}l zd2RdlgJn+AO2t?-PkeaH%z>UUHQv&a1Eo;DaSRlQ(PwLcqF_Ygh5a6JE4SPv(_MTb7#-a+VQ^rFjXXX~+0?L|vutUk1$!CwBP50u`kerh z(Ew9c2eN_N8j`=b3}z`~2dkGd{|z^!7$vm@qvwYHCLL#n5>gTFAm!1`v(D9E#Q+S_ zsAD3eC{&Kozz6ybZr-llAo-=-I+SB&uCoa(Mw>s16E9}Uv}r92rN&^G0VA+Y@7}$k zw2``I{@QAxx#_j2Ys3aHsP08})CN*O-_m)7>s4bYxz<42TalnTqVtek-`e%3D>U`; z1fIgN?OT>#OSW<;(jxBpHaGIQC6B2TR6M zbo-$PHMKz`#G370LSU6&TKL9UWUatZPO)&C@`9r+&d@#%Ts$=C1s9rTj-6l~qz`s? zF_jQhLG7`SGf)69iyDP9Id~YiTiC33Zf9kFy|E-RU5B#hUOh*m7KOpZN|G4sH-V2| zaPwE4dul%i$Q8_w_Uq<6d=DsNuohd4W9synyFK{te?xw6k3N-VfL^~usW7$d>A^s9 zk~*afUW}U%D{uSu3J!aD`EJ-Fnde*+>s2=tr}gMak9k)0Z2Y-WU#)Dea={3&1l0nQ z=>l?1n4MR^9#Y>hN@;j~%K2wp#T5VziFZuCs@{qRbT4AvN23&_EYX>*%u&gQZJAxt z=>>zM9+h&6hUTc^2OauKinT&2=eSF)bOU-7YzDPc&^e<4y*9eHD6z%~7xo7PEXZ~yhskcw9)wP%OUy4!smusz1(AvG4Qd&^DPuO3lqFXG|3E*6f z?@Brm_CH6^5LZ#VWNaoWiR;|6$9zs8Q)rEaFY6zAp|bZFGR7tIumK!8AIutmafjDz8pE%`^)To!7IWSzO9 z>XrHzySH+&;dQYS<@i3$eFw`O@Df??e|-KpzSQb)`PLHr_SLGFE)Qs|K+;|axFIl+ zORv6LOR7h`sXJxX-`D$3N0DM3&L7SdIQh5@X+Kq;WT;1`*5d$T~ot0IrG*+ z6-t#ywIowy4B~`5;0CR0h*K0#XFh_!K*rKSQm;ii*C~21GFAe6;|=Yo=Ax{ZxW^lu z<|oSKV5Gu(s%a09p53xtArV^YzCNH^b$ryKKkiiQ$~j^sw=Z`ab`BQ+)b8cnA~1uvkAb$R6ku zSS}%J2}wEP)DO3(1)o}dVbmo7-}UJ|O@NXI%FKQ5z4ZoFcsRwRF|FW=SK}CnQn1hR z)!2&!pG$ol6Kue>^p|sk4pPQ~3=8(m2h0nu-Pvz&tHr`+&Z0s6F*X(QbJ_aDl)7A0a5Qu-1z zBWhYOFRY%=UK~M|%tfMFlvyWp$mYsWq4O=D9psh}R~8l=TOne_uuqnkbg^I+FJGs& zEO{Q}xJ3>|71RIi|Ed-%JgZE^c+AjIFc005A<}*2EIu5Wi zTL2WocEB_?!Yek&&;Q8Ur6M8*!s+GLN?uHz+^Y4h&}r7DP4#MOJyI)U z>rJ&)CltN$#v21^)auoW*KS!q)Lz3DqZSkg>|2(6)I1L7kYIQAbj}a^Z2ZCBhmIT> zDn8f*F^{Tndkm<-R5hf_V?IAV`BuS*aqNMIktq~%T6UPH0kj1@ymm>jfHXe%>$b46 z25%yCW^frAl{}n{3g}y6W0%mqPLek;qr4WYkNl^dJtslYWU~QA{}SWxnf9ug#cI`}7a$ z@&XRj@YK|PAS4Z(V?S)D9TiVf4GB$*v*KUc1-Dwt6ZmFne+44OSw1AUhpudyviY;m zG=|oiXmYDrj1!F>U7(Tr3t-!UayD+ww<|`sJv%9ptGb)$@11ChW}FVrYF{mE|wl!rtj;LBeZF6y6IAg zfVNm%8F?62_UfxwXfp3H{6VFpXN`#!Yu6s^t>uO21_@Djq?7h=9Id=H#?6^CqIH#P zh=-+M?S3dpjse~+TWT8c(i2h>`?E^1@=m?NDO0kB5vHB;Ek@QA$Z)4_FzMRI=f2`F zP9qoJ)O;pk#>Ht}CwH8AVP6q^H7%tLj)I$@7n@n~ctXcgQPE}TjkKjCv)!&QTC}J& zWZ!}P*4K4eMu82gfr2A%U;gpO1FDryTdQ?Wf35|>$w9OUs=2*fV2R)RDD;OLmQIpu=!6%;dRa@a|5DAm-4(#Yp~pDi)djz&&c*LoHhLEMI6_1<4rqq5-QaGE6UsTE`Lf5KNXy3uMI8yU@1XSPQ9N{WAx3|F_Al20cL@~7 z{7EBF6&>zQ@r&ce6}}a{D@0Xd`yJ#Zb`AUW?SMrgH*_^mJ=jkpa{u^UpMQFVdN${U z2Xp4wcZIf2-AoVnaEYo_tEMlFnQy(db8zMBM%HiGa4FpOGgcOuO10>)L;9N!bKb2-9*Gn_8)1e$uMt-|{DmoD`*yF?C_ZMr_6 zD&u0iyHUAcf5;hN?BIHt{$c{bxy%pg?)MHn2YL{~QySiL5BuFJ)oA!B$JP$5S#0sg zA18G0-o2AilIqnoKCK>R0xNa0BXGA2`U?kk>*a2cn*ulGdlq?ije|Mb%!6C(-8eN6 zb{xup{xN^~8-_9yuosg0$>cHJKHAVhF9K9SWpDRm>ReRZ7|SKDCNGmQtkpRt?H(iN z(ZKO&FaO&k;q4OSSin(&L_~w}07}p%hhVdZ9$MNHH2(4G)dvqBUd&F0IGy&D|9CYB z>=yB@!&bI@>E)NXxAdW*D8Y%M-6|~<+%FbV#yvXO{w)*IfsQqj=0~k%TB-l z$rIc}bQK=BuG%%1eSPK^S=K?|dl!XLrh>Dd)8_y^H7>Z1Y&iA0-?D%p0Vs%L`NO|h zzR=hYKDgrA({Hic)kBjj1NR0O8M!K^taa`~G~ncYZ>e2ucof#UZLZQa2QRZ47M}~$ zF9YxeDY@vnHFh-0kXr?(d^O(Kd4@M=2;FZNEid;g|F!+a;e(1ovKsR`JV^ z|Js~0{SR-24TeyKKU}|l{kw)dAU{%0X4b0|e;U`ZLSLowP@vDL?It-p^;9Qp`0A@r zI&;7#p4t?{PTg)<6|rfsmJ}zBHI^(0Vy+SQAbNeC*uLV~v!=9f|IIu8CK$vGxfJR< zWh;{Q<7(BW-yIJSiV|q++FN)RAb7`E1^!4Ok1p*R$1LZ(yu?^>C=i24gA`Xr;vQyZ zji$HKZ|jsea@Ex7)2mD~i>P~9pmL$?YhC%*At^%IO2K!yQ2N!qWeLojHLK#ozZV@Q z6m?z+YUB=K63=h;9dR@Q zRA`F?wZdN*NOb`+-45kIZPD<#?c4NcAy$Bpr1 zd#XdhOP_eQ#PJii4=6im&%y!8AMVIm>fW(ey+5`{qt~WYnf2ECo*%yP*~H6+PJ8~* z99gq;zBGHU4!as`dT{kW9<0CWUl%m^$Ee5iHGTD9tE@NlID1%=^ERGU?#4X}`}EoU z(=W#s-SWyOn+yD{^cP=zxAdKZ^oX(MZYy^sb%{m79DsUzhq4OgX6Ww;ltW{l57?Ms zl`P)gp^#*{Z2pUFYV@3NR@ff|f@n>Khj5kaMs9#YltB-mY?>eQr>W?+@z1j)w|6-3pgzF}ds0=`v+;~-86O#%u7`f1Qvly^ zDN%b`H|!+WZ`#zygWUQlCaucK)Wt)yP`)%tHmNCXg-sb z#+@QL;8%j&D`qOY?7T!*b+P0oWOr0s@`W1^b>nF;`^nb*$k`@enbijB6a1qpQS16Z zlAM7Bpg%S(laI&6qy-DcIMqooIBX^VX^l9r#!Lhsl~-BwwNRd?qdk1kio1e}oc`ZH z-Ns>H^!h4{?wHYMpG}y7RPz;AToG#OU_b=s2rSMqFjOF9oGhUgj4_zib=fnn4+UW? z)wN%IaiXeoHxx{ik<4*%tA)%ShbIFeFC`Mv5x|Q`LFWa}jUgt@H7%xdrDqshVW*raY+g{}K zyfF*o&>F(EvIwRlzUK;FqoZmPdPLZHiGzc?Tcq(fOf`s7#^B6>=@cDq4{UPfCO!w-`u zpGOxO7(q2%eROK|K(frVhsr(o>X4!d26tX+E)Yp-0ZI5Xp}3prkyk#n?DF;<#FG#b z^6~+sMT!;c4R^(y%yhlcB(`25F+DNn4%LbotrGokXrf+ml$=^J$ig+G6V4UI;hUPh z>6_~zZEP#^0Bqq#0@DS${!mx05U`g9WAME}UtuS>vSnaEojP^my1iIwEJ z?JK1@76+Jxc4WqhpRYI29i$E7njfZ=nMD_bVUp;6o=h_Oruf)ix)b$>fB*YXOziKE z2NpUP!un~C6aec5AYcl!GP8c78g_UHoW1($tLl&8Mgc8y8o!mNeLBorL~B1<%)I2z zu+)&9hFU~W9Ee!1R?2q!b4#0R zuRaUKvgj7WwgQX_BUObOB3Vw>@+}76Ue!lu4sK)}6mTt_A4vz7 zb&#?<{s>_p4q`#29J5hjiP4jT!GcOuF40tUScIf?%NvlwKR)%_*n+baSi!mavR!M# z-pSE!4!&a0{y?Fe1H?b-ByFn$!50Hk38eUMh|7_`xcf?qf(c#gY58vTa zOWs<$(O0$>+!|# zQO?>)i*Ek*`|qzTS@Hsz4@zOcDkn3Ls$vvomJ`rZ2!wZ*3p*}@oltLTXQ^<^4u(2$ zi0M=MNtTK^Q_}=J{{3&@S&e({$(?bFO~son6e87Zfq=PTl!gmq0O>}PM1{-(Dc@6L zoL=1!F(-JEsF_Fw#kDsT`+}ZOY_m6JNBsAvo`TX^f_fUg2@F{`JHH6=4@85|v=gAH zwB{!kL!2P!H!rV_0!FU-CUQk+tM$9|Y7dBUuMH9McxF|<`l_*(C{pD@*j9R`CHH9R zLIYHbNyC$e{ZgIpP@F?e#w29cZW^voR&gra(^j@@PGc$h!%n^(Oc~Ra=;LJVs$5%( z2w~9V6X7nBNuVFVl&+in!HJS)8@SDU?@ynuTek?8YFYfQzUX6R^M|bW)~#z6F8m8o z+_c}N;F@Vep9;SrMdosYbboph)L#a;b*HbUYb3&0Eb&%AF~Pkj9`1vy8we6a;(1BH zGAA6eXHumY|E(2ir`GZyo5Flx(yu>k2t7XX*DuJ(ga;I4I?e%3$?Bulz!VOejV9c| zkFK84!FmSj2VcK-(!q1ih`)RG?JH)u!7+d*Ik54J)}O!C25uQXzEHBxhI^~ubyv8o zI&NV;dfD4y@~zBGd2f z=D_^3bQEY*T~9*b!Nm>=UpyW$GKNb1eKaZ}uFq%^wC2IL|2vNiIctxF$dbWW*}B_2 z^3K}bf6ghg<0CwtzMX+p%oBTNT41}V*j!nEQq5+x#$t9~i#(QAiGDg-#$T)IcAJYU zhL2yZK$qu4vBXFwh529=n;>&=y1OeeF%ficG?E?L9WElm#nJCmqG#_S;mA1QH{@?Q z=tRM-<UfJ@7#Ebj%++R}0300^%xWMXc zSEm2vzJ_3^zKgeSn|xRL_auxU%4Iioq0KRO!x`VR?=lF?5_M($j4$3-EaL|))Ut6C zC*IKgBli~G$Xl)g<%pWcvV~#Dx8HqNRJ#{wWJK~=oQAloEr5WuuWt4E);S)_<^AgE-}`hyfL!pc zjX=J#{r{}-VE>gUvF!`^V?3*Z8$5$Z1GiSqc>bUL_AJz4!8~VM^7UO_or~UgPVsJk z`-eJSng4anFRGMVNSwAj9Gz|1@y+eFY-_#s4OpB6J*c}+LcIHY+IA_|j~4H%059tw zM$T)F-~PjoKSFDGVof&UJ?7VcwLTGSyg^HwS71b3{Hk0RIFODYnx|nPqX~b-yy=?b z`ys9W`r@6z_yu#_Iam(48OI&r;c0~UzX?j)?k5m6~r@SzZ>=~On zUQf*&F|-3Ajcy4ceB~F9HK7fc@z=+0<2X23d-8+EYX+}uHJhm9hbXB>uj07$+u!vI z!5FaK+>xOsq>k$F-9N9LKMj#ucbM|ymWv8@{oxX4Ku}Ddx=+3*%FV!Zb@j_FL8^}F878TeE&rzJDoi<`gYm1&jZ|x#??b<2RLZ|V zPC`Oj!9%08zve%)xgo1|B~1R^H|s{iqxtsR>y{i5Lqphl^5-F)o_JztYU)Q}4-_NN zVM^^Kt$4N5?>%GiobMoQRC#KHkbc(mR_j$<|LLc}ya3ZU@#Q|Mgo4-4JMh=7uYK^r ztBx+n%TS%7nEjJH%6BGMS?VlZtKcGG13O<5AAImZb$qC<)M?nT*K5>(rAmZ^+ zzk5SxEY)WaecrSpF?TFOQ7I;vL*H6r8jV_6ci06V%l=>AmJ=?9KC#adLyem#M{!V< zJkRucz;UqCV|C0!6+_D5ua;r+Y#8{=#Y2oGp>D3I8)bHyV_!E}_tjT-$p#=y$sT^p zVWDFF@Y7GjX>%B9!5+{9=#W0@*Sq4lh1)x1H|(OT14p+n_dW6d_O&4&9I%&Bwx7cE z8zm%8d@C}fw76(|f;5;T680C}hERUaw86d%#8}dqd7u9I8d`JvPx*&g%H0mXyww-8VkCD8GU%;nxslPK;VVR@4x>tQS5z_erF~1Jv02q(u17V zh9ToaCLR9xMvOIKx6is1|IyoI<735jN9&t!25=1%05Baw<4?G^2e$EktT(l#8Pbr? zMV}5{GO*6(4R~|kzIH58h~N~4foZ*pFK`JF;r zkaw=REFc=y&C00EjVVm1I&eq3RJ=(jZw1hm*-WiV;#92xeTW$l0Mh-7Q_6(lm@$ME z8Wu>X!9&MA+}H4eUVjxGVq^t6Q|zu+R%l9xlA=Lu)h-@LseA(?qf?ood0ytY8KP&S zSmwC3tKI$By_&5FH{=`WIM*S?Yo>|nisp`rcPw58&2*ZKuY3pdrRD?$k9a`b8 zyDoN2iQ7fG5WMZYy;trS64R-w8kcNHpdz&-G^~V?((*uyi@)>Pxqtb~Gk>XGxk7`n zHhOTq<>cX+8Z22nLpa6;DK4sFhz1Vseyph6_!^^pi*Y1FOZWY)zYdZCbt_@pmgtup zk~JDNsQEi#+%W;@XhTUt)(V^w2C%4UJQyv2VB$a$N#s{WNxS>*WgT8V^Ywwp=pY0z zgYO1}6WjD=*g~M-az+@m`H`TK3u61;QW6-?|D+Jx%6e0mY~4D><^ah9T^P;g(g2V` zWa)WU&qd`CXT$9Y@KOvH!wt^n8gDDVY@qxsG5CM}2$rq+(%woToKmsjaIF}&Vs|lw z6X?_iJNEBi0|E;ZrIU*&bg3W~uEM+0#tadE`j;~u-?8S5OsvUv6Y06Yoi~2|c|Tgi z<{qDBEfDHxYU=10+7F@g;W0#qO?M{BRue&v@2{U+@XHkv*)8YG_0gYRIkgo8ELm`j z8Q4O@L}O;_%-2zRFJQxYykUB7cH@eaGV;`rm@zE)r|%E8Z0YTo+|&q}toPJk7KaU} zAh1`o)T+#q2Bg00%*o$ne*Eo3K5iOI7p=uKltDS_+<|JGRwJH zve;uwvd!uAZ9NHc-j?jUOOC+U7@ldpZx)f$-tIz8iLgLv7mCK2cjTHiEcOB*K)RcG z?=>=0<`13#X8BBUKTCL`0Dc~O=l^vbv@UB5kE#9RKkjWP$_4S?OnB4N<4y~pkK)2} zaE=SPMG#%N5}dEk)j|HqntZ2zm)zq<6EZPToM~eym18u?`)y%vEM$CwX&XwC%;jrL z9RH7h4A@>O^QwV?+ZNpp_HVMSL)jtG>!^Ll(dVcPhb9IU%TMZHB|P2a%&3QT61rs} zG_b-3ceX?*65WZ5?>=)uoD3rwp+jnsIgE)o9}2UP+SBZ;4!+X{)R*q?&VRiAD>JW| zOyMf|_}Ar*_Y6~=@U3!Y?|UJ={y1$lAm@`b5j$T%1D$zq6dU?d+vKm6RsCL!zHAqv zH0;m<>sExFdHMet`8xW$5K1(lm<4|TE3?&FXvfDPl=Z=qzRkw3O9|S5%b)rUGw$ zb&!z-g?Cla7wb!UbKXk!1ySkiEkrT&)JkxBnC#YT)Tjp92=HVA0*d{dXt156e$0XJ z?-NHOejph$4sbx?Y5D1sFKZ$B_T-?@=mnaP)t$KP<<-4WsL1%t-uy0rl@!8`7#7wC zz^qIRy$*6Vs5D$C+ReXO&-A_b-WvkNLp|{c=fz0&-(J4RB&L)ZlnUDeyDg1rcuia9 zKr(o1=qnVd>4ubg#s9da>(6C!yn0t3T{r6F$_v-__}u&s6q4uq%O-OB#Vk9|66f#` zMH_#~xr_&d#)OezJL6IVz2;^rQt258MNcJf`XjtpfG(634jo2pDnZku?r+JaO}T+Z z+2$Z0c<4hcn)T`GeVLy>HHaIGwI+H7VJMDngKIY=I&~YqefM%iF})Nu8&c~^sHGP% zHsk5b%{kv``{dy6zIc06v%@i$V3?wV37T=!rlsu$pmj*Xf|HmL4^&v>P{A~w5t?p& zAzRx!l)`6l(l2&m7S|v@`ZxS`kdg8Ae4pT>jMX9MGUL9t0=JUf2 zB~c3H?eSw3Qj&Gl?{vaudd{x~lAyIR3^E>~W4Ioeg-ct_242v4<4>vM$K118Y=V&J zc+DsiZzlEWn~kPFUGR_ZdYBnZOBzJ`5M}PF&lNZA-Q0J}6dlvkBsam2!Xzgi=KK*6p zec8R&f7@BnD)5?P+1zJTe^}JZ6i1CnM>4y3B@E?_H?B+6xJO>;K*=#+(2SSG!4e{8 z-6!5X?NSi7!IdLhPyE_Mfe>-e{(isugmnYll7P3$$k*LY{j-b(Dh!C%ky=~HxO zqv=lD(6-JTn6{iB)@y*5>as5V(?CTtE&b>-%eN~&4)iq=15A;rBXff768a#2*H^N> zMy57hR5AwAPpz>`iz*{no^L>J@`lp+&x{3mUS7Q{`oTCIJwa^VPSwymxodKzL(9t@ zA1ZY_OnCBe*RUOPgNX_QO_W(E*i{GRUx`POrzBJWr7IDSO4z8EzRNNe&EgPjGiX@U z%1^)kHtpN<89jYbru$TP1RZKM4ngJ(>Or@JGnYh7l+4p&p5+u?*NSm1jj(QRiCU0s zjr+J=ckz}Eo*0-0xEAWC~wTz?N)vXy?j|9USxDfaq8lh`(^K^Lj2?2!@|KvTW&^wo_SjRsGe62%E$x z17ivZkt9HQS2_DRqC@y*G0EEjgb-W8pbC8?UCrx;E&t001cMiXeT@A{Ncty7pKH~s z7;y{g;q@`Qj8c^x!>sBv*bBeGisQ=5Ikm6Fwvf5-l?#sTx_-0Pt}ui)Vj!dk-OA-y zd6j5b8^q88VkO!KP)97Hf}uRe2BDFqh-#ZT#|6D<_Uz$WTL8Lc+NbwYn%x>kSsGbK zjvT>2jVJ{?lDcK#YlJZsUdg!R4>?2wpT&I`n~hJGL9pJ#rA1Af{-wIuq5~XN9OhaG zLA=(Wq(#$O>&q?f#af)2QN0;`r@|z`)e!HdlVvbJw&;APKBm* z>@lR}WOgp&>J*Y8>*0Nw{nAU9Mgc;xHUcD-EtBTwRLCyjO#kLmDW-;Nj;ad$&^u z!Gz2(twVi~aG>gg)cD6wvD6-!g0r|ZedWNbbfoV}#~*g+MQ^#vn$af>TBn9GreWam z=`YZ_t5ERi17`u!lDnPwWoxK)Gx(WHt!`_K{RD;p=7_^lduLY5l{qp!8C#cfV_q;x zWz{ z-;VLS;|>3(`|&YD2)ft(40SWN#}Q1pxq^B`oK-hP)-IJFYMM^Zw*VJBj300zUrr&;DzWSL*tWB z!kUVa7ltKJs$Qmp^p@vXGXH`Gg@QuSI8d1xjBGZg|bE_ACZPTWE>7u)E+ls zVusY9_SuW8UpMl`Ql*|Tm6QN84`TE8-&gr9COm_zjwm0>NZ=7_C;fNowYE;{v%Zq2 z7@BZM7tg3qt#JJF?8uGr83+@h5#Amr#2E6Us^>7*g2*M@j7T0VsZC58)W5QFlamg3 z`$Luyz-OgeNEt%&zMHTcHD*h{;BtA=aN}`4F{a3VPNGs3Sn=5P;Yu!P7^eyB=v&e5 zop5M>^2wV62hha|qN=0IyjtP8D&V7cV9A(Yd#D6)tP=eaW_|HJ>6Hym-Vl=jDj(l^ z;+O8pI)K&E6;`%i=569+{L$|#4nlMW(?m5etIOe5mFu>A7tw#hrtk8y8!OtcNRIcv zG(TQp!a8T>FsRLAXrK_Y5TO+Boy^#npS(&Pp=OgN1uLEYOcHL@E3JL|kGTl1y4Yj| zwL|{>MP%~Pcn>_$c1}Lvqb{37J4fAISgTR!Z@CE1&BYx0gMUwGt5b~Ot>`}Rpqmex z`~163zf`>|2yV?+$_}l70>+XCCU^9@2yV1rn@qlY+9g#k>HB57Y7^F#+M_F*^y9|* z$$Cni_fDN0!g!-vj~++g@wURmC$(DZoPL=-gF0*KI#+u+|w6#PixW)MJu&^X!d!3(FiTk@7QNfHw8n?ULf~ZkksOZ%~q=* zGzToJ%N;v9#18G`=qcZ}^7qzt;KpHk6}=FP5;~H&;MeclNAD}(j|DWvojm zbtO+7Pk0A#0df{~I&jQk@lE5emy~kEEN(mJh6d*FF=djmATh+6iE+ATSUm#v`up|86nltn($-HcPu zX~SyD)P-6;Lv$i!P4DK`B#`%2l1e(Q(XGH-;fLUGKms$HmACKeRxL2S(nmy=FQ`bY zYfhuQH7Etuo4RNJ{>gH6vm~OtH}JLeI~fWhASX*}mfL4@FAqVI7#XbNpk~AgWjDm4 z*CY=O8n*GPs$tO#ZjOi<456CECg>7v4?Vd%e*K|-?+ea9f84~0=T?_cnH~EYw<}bQ z`Yf)XPK?-(w~63V1ox;ocHwQ!){U=X>ZHdw*jbylZ7U+&EGG>*1fMq4E@-b0q4BgH z*XA{pl+f{h$K}Lbm1LTO)1Rn#WW8Ca3u{?v?e=yd)H(g``PcpKKR2rb!2&PQcgf}k z=3nh`#3RK4Px}reW~v8?oH7jhlur1OLNhRJ@lR1;ecJY+Gu}@kQfM&A%&H_>Zn57{ z+oHddc3&|Vm2fFdVCBTHbl>4VuPsIlDkX?6W!dEu6;jMpm&e&^8- ziR##_PjDFm&G(Es%<8^kM!eVwtHPm-$6hG&uDa_Fw#jL) zVc(?aGir+VzJMLIg_p4oC*XNY2A05^t-c(TaS*C9-pTR~@wqYVxHb5pN|eNmC+QZ0 z#hY!WrxAepI{^r4NRow#5+D&{-Rx-LskF#UASO)q-3PT8Z+PL*i5A%!FMRxtJj+ik zDEGvSFRPr_cj@{MDwphYq~A?R*IYZa$eo>wB@Qn2_%)NSnU$l+=2uehd-S1%TE*H; z{%6%epN_9})8Fegc>MY5jW+IEv;V0kYd-yP|JGicZ~XMt{onk!{?nz5b96PZ3Fz6{ z;o~M5%0aWseonU&zdo6os-1)RuyG>9SRQFSAx3r$?^9K%Wg#NJ6v}!Gq!GGmAZ5F( zW~ETZbr^2^@sr#3cK}FllyOxYb4S zZ(da8ieG)KXw1-X2zDlIfus80oe%9ipNwaoeEGsOiO@_~F7Ut|KW?td-OL2SzFV~+ z?9^od>%LA`=o0xz_GGtU9ob(%Qq2n>RCXd|LJ zgP07-1=`Mm2ZJT_ToK~m{lD+?fgr5_-NfD+))L|}mr}EF0mwosWzp5TFv4Qm#304P zb-n;e19QkB1+dfTop!ZMgt6qIOLS380|EaJ++!PIRuQ-fS+_bRvR-si3~neRVov9C z$wMSQEa9|inx~{BqZxQFd-m>Kp9jYP#FgoSLKRP`s9q<>R^d@%JQBwi&6+JjWCsa^ z$`oV|Ru|iE#fs;9qlt!mw^1{vnkF05;=ioIYN z%}Yohutk_g9H6j$10@#eK89Op7wg52eOu!=IxKBTQ-**zN9K6@QAV73!^Tr;sNk)J z7;l?{{54?Uz;!Ud>6+*v1`JwItl3hzLzJw0FR82}GoBgM6~r4CA8(j5vW5kIbCpN6 z10Ak)rqMmHw5|W>vzd#iHMvd+#5HnYe^D=199PI`Yin6jF&xv@iiqbuZQ7mF!^GSm zLI)EO+H_)1N)eiTmL|XtZ+%>Yl6h%o0@s2#x@TQc4v%~2GKTxDtOO76LVNi0ciIoG zH#Jehpj!wfIC7g^W~oSB$2KTwNoQX1(_NPM5nU6K0B#^moah*7i)=4=;>dXy)f!i4 zi1+0=%5!>ET=XYv?ct+`c7-ZyNU|ZAcEIfDoshR;i~pC^GDquIi=`)Jg^)v~Z8k5# zym>M09w4H`yLPKq#s2W&8}&Z5Ehmf%XU{j^EQLE;Mb8fN=s(sQdjoLPazWX|Z3s#E zL5$&;g9+vkd9OOZ6EwWvp!LenV;-HVn*1nU_?k7Xm-f4qi$d>UEPK7uyDFFkKz~{* z2glPvsU>WCyhSWo1SEnVx9GlvNUk{-Ul)@rQGsaB)eT!(@u-DhLTxU1XF%+W(7i>= zT1Er)?pz2-wh&hIf+$c22+?Rx+ocAs1wjUV`5YExWI}7GENR~bOm&ddJce~I{my-5 zS{mbkN14K3CFFj1ofWK8BG(N|*Ht_JTP*q*JQTxnbUe1a|K#9sbPBy+pn2FLD~4hU z_xJ9qx6|246iU2$SO#krBsDuO_DsR%s);}>^`DIKk+xy zFDEAsJ8@;dBB{yCF3eu#l3I!BPwD~4Ufj%+8IRzuw0qonqGa05U2=ZCNeXwHhcF@4i^} zw0~aLApOU+s;7V0RT&?aFa3EhE0*=IsWtwmr<3=$XFjlazanz4W0keL9TZRLIv#GbE!cGm@wQL3Nh-_g)bymTKjR3s|QVxTFhMZyU zax!<1(%|DU<;F~U+Z?96rpqO!Qx`5-a!#$7{HHZ|{fE3X<@{wHgn=mk=4GYMKrO9@BjdV~_OF&l1qD7lcS7qYeBDXuMSgY9Z znOXy7mg)p^ADVOrNnwX%pGlzz$xZ|_AoXVwbTKJfYrBL#M3trgb;p>6(yy+1&pjiT zy^Y-kU!7X}&O7@97n-+hS-FK%{ULIf(5J36Q(N=gEb}(_m-cgZ%R2qoWl(8TY-FQ42R{}=Z- z>3)#2yRUk!BsVBqWhAO$(UOwGBX@Ok|Ndi1y@Oz7Ouhx#gF0!M+z7Mbd7hgpXfLXk zGb92ghOsee%j_9hxITi*hBbEAFERlcOW+iwx*P@)K zeK+_;`5X{{6^-!VKS- zB6i#MmRoNP3lizTQql7>n?xVb~#cG+&qDpD+YGb$K zM_Y$O`-3sTjq8_CAn7F^#doSr0^n*+c(a=7eNbWYA;Bfm)7m0^1h9*$gMt`&37k{E z6O%&MKC~4WOoeMl3;tD8UZp!D-Q4>#HyNLLvFVxX!U39QLzzT@@bl2#<6<%O;jrB8 z(xo(a&fq++Y+0uD4f%!?%Bsm277oz|v{c@F^Ud-(`;K3+fXRfX5F=VqWX#dFvr?N= z$Bi7&!zRl8Y_VVjx20mM$*}H$prADpdFIv7qtL|G<2IKU&epX_1omY9FynPrT=E!Z zHB+v=_swT?+V>u&`okIE{I?$2JWOpo;omAAe54+qLkDBPw=EIofIsHF9+@plMs1vs zg6KBSOo9iPs{Yru`$E{_?YFDe@71SIc&^Mgf}FE{{ragrHSzLaaYb5`i`(3&!vVjL zB}e8xUBeYIuOAKH?)P9`Ya4ES0{#_GBAS=4;^jD&;(t~G&2ATf9|8^@^Dsl)CMM)x zZ+LaI&U>7DA)#V0-qrWsci+0t)B=^&7eT@K9-fk6a!XdNtt7#eNC>zW^R=Pl(z*+H zCd85Gy3vYDeHprdlTqgv;|?#Ww1@THwQXB@LhC<%@bAwbP8mk2a29*Z0us_uq=!HGDu7VToP727@2(9S z7s@0lZQavu?Sr7dqsB*mQa|2-4ku;$SL|dZX38fm%e<)`4I|bV6*;`7`|;suyLMk{ zE2Ub9J><^4T%emW!y@#sxxy|XCtMb7%`jutoMA#Mkg0K3X%(d0wQuW!HD zC#pS)FNp~Cs|qx1kRxR7VH>5jkQO6!hs-EqbQ(afmY#wWCg(-sXlJ=}<> zQ9vA{fu&9j2?4fM1~FF%&=IMzabnfH6rI|bCQ~i1ihX0h{P?A8j@R@H%D>r~cwX|_ zMDLXL$cS=>RXiO}9PjEj+O&(Tq@k3f<=B!yC0!4q8XOFAXfty*r`{6oAk?%YIu;-H6aUe0Oke5!L`BG}C zINjsbSFdPGVg>);3b?%?9y@Q+%%ENgvwLgQsukM+{b&97Di`J(PR7>%3#s2tco*S# z6%_mZ^A2D9>a9;JF6BWpQjKZ^0d-7i4wu$vnVW#OZn|>}x7wT&+6b{}YHIjFPsCoT|=^vh2QBoL|v&Km$zW#dHdO2~zW16hBd%yLGy-O@9q8vN+mqf5_ z6T^Hsiw!7}7c3a+EWZL-% zpVKh6h?z;{92~`H8#Y+9?mVZlZ<9fax$M!mKeY#pnYvBF8ltpzXS|Zp_(>tzJ4lY{ zq>0!rliTo$ee-;|4RbrTCTTxl=M2DL=;)fwU~1l9qV4qfZN?kXbzLs)LwW)grh|T1 zonJD?z^pk8u;j(MaGbAu2WgEMM0lQ6`cB>&-Ag1f#-Qh^fN*j{s?bNM64vJNOhWWg zxm1)9lXTKL0E@J?|1IwIpE=Uf1Tr+2-0C7Oc({pS3JIej?py>(4lP5oHYFLAF&u0h z%;A!NEmx6t`5p$0GQ^z?i%hsgzflLiKcb*(ud+b~_a^u$3pOfySq5=46j_T(% zjP2`5g)txTlBlZ;tZfJt$6D&FJc4bPG?-@FUWytTA$!#fx4S?t?lc$arEHuyd2+Q%Vq?WxJS9viZ3In%mUm0Q z=Sh3jRNl1mqfBTpSRMvOrab7x^A-$=s;$44YDM?Od`k=Yvgn4GjzU-_EZ-vQ3C|pZ z2IVK#D{XRPw6J`O%y4b~FNu^G4`puNw~@;h-zPdclaIImj=Opk3E9uF3YLTJ-qp8i zi(^*pQKe^@UKC%#FZ6y-n(NTmf2#TDQSXrYd%BMsXU<2YRkz`$;Kp49_--g%lMSXI`CBOnLei9c6+bkg=%Zh%^7Zgg(s;wky8eNDG#1rZU^DY$mlLwD}|Vs`6n z0Q^8?aoWaCjTtqRxMIbMMLWfDmf9cDqTVV?=blA|N$TDPU^Ax>OCS<|{N6)lh8L@~ zqv0;zFBpz0OTCwk^N;SnJd~*SZXl0x=)`7JHtZvnU3fFrEcUhdhT@!K4%l_3NsY!0 zje#U}IrQ9Q`pMx%l`_mTs{gQU8Dlf8!vQTdl!Zg-09xDa$oBI_?=ow>h(YG=v4*DN zLW*Durd;4z?Fb)GbwXNy1mH2mfVSf@e1pSk_@TXg1!{+es07D^$fWCp&wRru)FPRw zMGi9@8}~LkkrTA;`#duhZ=LpS$*T;?S0Al`{9jY-!k}cyJL8TDWxb}!{8yy%(T^~x z_`I&C#~NezM)k*@AJblqw5hyVZQIXLdZs?C&TxjUdw_go_+HlE9p zYh{p1%6GrzODHh(wlIhe8$L3Jy)v``LS)IpultL1do$L5&>~WsD;6Rn^iAGK-xB?h zkaGxEZo97HFJGjZa~T2V@EmXd@%t@vhwDPF%^&5DOyO`+h`mN`wzdI)pz>;@;Gh`% z92;3PcHs9U(~QzEd?3+YEHqIfp`Y~65G{E`8Wk2*27}hCpFnd{$>0q9+zGaB)28BL z5(GcrVk;=rFk=q;$$e`Z=-0uwCjR3e2~Nws`HXAV+AhKIkD(ncmzwefQrpI`omA*V zSrIAS4G(>k%eX;+PcxL{QxNDewf}OHUdkObZTHT4`|V}a@@q*%vOx_{4b)x zpf}F#WxyhRO}T{gY528>@WhoyspS+#VK-Ad+8VKbivcN(kG_DHu;aV$R*~22oa&Bu zsF*s2BsZjT>ci@Qq=EVhGhT;zsq?3-5=XSw>y43N4?7VuZGgo|Hgr(#g`x@nl*^HL zPM%JZI}cD(n$YD_u28`p7`@BXO4aFS;Gt7*f`*K)g4R(>k`;hxTW@IReZkRk;0FG6 ztEAM2u9z*Hf@*T7uD8AisXFF3ST&O;bU$%CYSipnZxIRNz?>7(-l^o>4ydy>tkqIt zfYVgE!Uyn~2#<}NCq&Cqhxwc!8z5(Yy=PA{3>NaWaW6;0)Mc_*$!a8P;^q;!YE+z_ z7}cN0LOh|}m--cD?qP%FyzMyBT#jWtATxX#Ce|yve?z(CAt$J0KhUYJ%7E9d!bZzg zuwX$~szrOzj}NkAR?EF;z*IAAYg^{4kEW)| zkEt*R*IpoWE54lctinqtU%m8y1&98Xhs)kOjn_3SoQ9mjTF>5yQ&G9AY-n+;C~tmY z)K9X}NZdd9WKb};3s>s>CfYPM!@5p^n3=~!m?+ixKvSqj?G5}~$_$j=WA?uF@TQC1 zjJ&Z+J{eBxa7ev!U`cVx=3vY3q=0aaxy|sA?O7KA@g< zM8%kbK5$$=tDAp>-=K5cDW2lhDukdg`|EGKobmb;2PQRYjUeH zZ>1T5%eMmSmNVpwa$5-}_vqbP{P||!&0mcjm-q6^Hz-!;|FZA4_`lK1B*H#5^|rhh ztpLR$-nR2*=Aw}>Sqsdwr@U-}n9*^q!zls+X!}b}+V~f{ZI&KsXjDnX!Sm-Z#8Jnr zY_f@sBz*Ha+uBU|i5|3+*S(TIsq>KCpYTPC=8^J7!!Y#`tm`RVX%kJUrP>bKSR|`2 zL)gTtfVz}@-LQr>I!MU-N7h?rlEs*v5qS*Ne*7^W#afXhvHKWg0RU^X>|r=F4wn23 zB0Qsq*`fp2zzxUV5+o|w{l=e=x7IfZYG8?eDXA5DW-07KmZ;C2P~*?{smlljtjz^J zLrKV8%O+fCfgW8@zW2_l%#Ego;u%~ow^;AID4N#Jd#ww{xx&b~Ixnd`EK&axP(I-* z+d;stcIfdZ_J8&2J-yVb1WDEeC`2lR zxk5wd)s)54$GNyK9b&mth|`h`slNEMUt0Hc#_!Z>i1woG6EkqN3LEvdNXGr22t=!4 ziqXugu5dCUxZqE$Eh7(UMR|g?!n(EEXpvLKk$Y|WpB;RC-Hrt@DGl4~1A4#y3;9SM zHU@gxW!{1@mXhovNKM^uk#^dX~`hm|5|<>lig9EFR&fH4tBY0VJ#QvR)WqYsZYByo9>XjDBgC zoNEsBx&!Db4wbFpFO})`XS*n!h|Z%_r5`zyr-*R2_wxZH&6u5p48&=;i zMb-5bf!uHqZrmG|_^=S5laFujXm+ zG~4Dd`Fej0=lIRZI9h?cfniSF^SnpUNHl$Op8iZuzKM~Tf8qn29*c|+Z}}EoPF_5Q z-vDE%ZB;}18XGp={f~PWq3_}oj)(04V@OTK61e^gn`Y0}1?4P0ncj_&2GcIjUa(+o zJdaavdEF~*4mQ#KtgJaH^E^CDI1R^?7NyFRS;AFovPRl+vE)6>CI$yPs>B$Bf3H+J z{ofbJ2^vp%!fsJJPncAvgwkhQ8%I~!$9A04UDBUl26KFXz|BkLx8FN_jinbFq_zh* zeqbs#hz9cHXbq}-<~?t*XGzFYzCK`(-2dSuk(;yAp?l;Ip>Wb<9owVS^x#zs08y!^D{>f>VSpOa< zg77m5y(lzvGcM&sRqHh6%lB?-YoL*)$6kv%zI`5r-s-`^9*H3u-&iMB`&nmasWY-f zKLehJuR)m}2V0o;yo{Pm@1W1qZ?-(0qui$ZUCEK#KzNlMs&(s^$VJZlz%_#Kyhnti zNIKv9`;U8jP0DznQzR*+n=brIY9otXmj1J|zjUcmW3NlUr_T2|=Z@SK5_;>`kJsFs z_elEn=daa?!Lb2ezpPJ{py0`&=}4}++BsNDPqin3iXVj= zmJ?lQA%BN|Ht(9>USC*sV9Bb4q+Ue}6$;K++{yc1k`LLv|06CHXzPGO4YPGmC-D>FSj9kS*bK65aQ-T;f2jk64x7drEeAdCgw@xHTvGzL_|N8n{$s2^A zUOL8XO9eitS1O%VkMyK8=4iGOlvF|^T50H<-0^f-?;RY+B6=~C;ydxLT%#y*XmPf3 zbw&dD+;9ET3sgG_ZYhC*8~OL%0$H^HXwKK0Xeeqf)t zA@@@LQKV8jdIf+IadJGU9U5sB_~J$~@`5EsLsbx(G%cJZr=tmn%2t5h_qYFG>EZCd zBh<6rCh#o7h&R+^PA|AaxMX~u+$y+l^p^C ziIav#7n4LpKn$Tq)zx1Iv_v^7sHv~Nz5~4e2n#lAKiqaSNnU*M#bcvDPoaG74aR{T z-AZgm?+&s2BYHUtHw4>~Y``_wUaNf_heGgL=68K6S}M~$pb)}G0X2IiMuv2VBI{!h zH(Ye!Zi>v&43Kh2<9V-ChKe#RY3W>5sJ!6Iqtl9h1`bs!mo~v21(3WE8XpkO$!`{* z-ZW_{>kX*FM5=luFimL_nd)6?R~hbD3xu+duGTW+JZ@cm`PutVUM~Sd^60I<>DP_V zzXp?*%dmf6E@ATn0Xc^X8q(gOQ>P`SvMlDq_$+}^>Ks&a*)fV8HT;^{Bo9cMt%|S) z54gq_bLN?W9-$<5<5h7sD07CfNQhYI@7uXHD)hD|l?Kd>y7#M^p|3LUP{uW+9A@&eTg~xxhk#pM|9` zwqzjN>gf<*$84APcfjbAeMS4I^Jo(SeXWCVuhucDbDLQ~lnw3wZEzNSuv6>TV!Mwt zkS!MyCPtc1E=9-ZGnuy4sb%I(#G3N(*V4EKl16!dwINrf^N<%`>}?N=m62~B*j@?Z zKySLZ-U$sxd5Uq{<|mH-il_cH3;}dV|7DrVQSk7Ak!%3mxGH8tc6I!2_Ie%pS{mVV zFRKcG7%$PIr%VvFHC`5Zspzc+1`BD7#bXArb@bDnK6=X1K|QhH?q;G2oZj3XdVDK0QDgI#R=LZI%)z87pL6RhJ+JMTf?=R8?*>%>@Z;14uaRl%jcX_Fh>tuq45E5Lb= zWRNy0^-gG}fIQal)Fb-O_wrtNNePHBplwxR5SYi?P`ye_sH2+}9A9c%WBs?FJRG#< zKMWe`)?m@ga%34Xiulb@kk%2ft27m7xV|!tppb+kMiiY>IZp2N?S3&@C^!tGle&Be zxCVYUwICSQwO}I&_4XV;L`n=?Qq0r%1jJtii~<4~Q}~2>br%HRd*6N}@0ys04G_UX zc9`uVqMRGnx)Z+(IXb#pUQbxI013434$z8<*f~|XTNC2Ir;aCN9|yLvn%BhNJ>Pw2 z;+T?zJV!qS01#eDn$$4>4butBzbRdrhClu5kDFX$SY+vgRHw^z#jTyjl6I1-J1n9F zVM7IY<+N$qs@1Z?YRDL-o_}P=g-Du%L}4BK7JLjyiAUM8A^7NYkp(w}bTi)`;GLcm zmbUgUcqO~wDesN5QA|={J9TRy*_=EDo>j(!NuzbH{WeRV$SlW^8yB27ejBa*ozrH_ zFM?%$`Q?{8ASi5wSLVs1It1Y~L%fC{W11=oR*YrP*KI zP#YdR`puY*p%!-a)iL3NgAfWAP?ACKg%gwli95W2Fn;31^vo=TQ|(A^s>kQZ9+fk_ zkZ7!(I^zi^7DOL#@_{$g2>BZ7k;MJH_iAzKz7PI>Q^p2tq*%Su^t5!yArkn&8u`Of zx;)Pk*lQ#)Y;fr@B-?Dbc^?Oz70!IKzUQFOliu#bZ33%2aqUZ^Y z5{q@uhRNBqu@VhV^*J&4_RfR*y;nZZi4z5`EAr+AA2ogE>>Em~=rO+N^ZQMdS^VuIjX!_m{rQcb+!q;b##}h8Cl1l!m>S1Nczqs@s&{uY z<7nqQS!E1CxAr*XJbmQNr4ZI-rpujrXzy?gs1rz|+}>;5kKeFT@oULF>v!p)mM ze@p#SC7kJicbO@uS7Th+{8)pM)I)~I0t8cq6qZ_%%lem&+Cd5(TpAqgm`(aG&&~v! zEH(P?QmP#$w%s}W6*29xauET%3~Dn68M!qNf!?soaq=&D{t^dChz(dhwgU5@U}~rNd(S07gT0zf?fUk>t+UCl(&xV`tSQfK8^aZb0=u;q<3{ciiL#> z%3Qn;;W@^OIMoO#a$%_fjTY<8TMF}8SZH`9NOl3Gi;*Ow#p0yYmCczaPqNXzY{LvA z0&EnOQsEW`MS;OZ(uHt@Y7z~Q7aWRF_-Xb=^!SZ4VzOqv;DRDI-84e3o8`PPh^czr z$d0O@no&t(fqOR>haXtHaOYZ!rJS^UXWKnAM7u$vW|!X9>NgCZkp zC7zh>Urty#yZ)Z;Zt}QdFcb90*fQNuYXA$sA^KNESg6W35Bwp=E~-L!#>?GZ57z zC#_Mw6gQWk$~gEvnt(6P(>f^bEIo3hb4+)4kl}G6t_jXqVUFd<;V~yZ)+eS*A@N7a zEf_Vew8ps;R0Z@A#FG$Q;V3>F4flpN>l2S3`=;ED_6dcx80b?mWjFZQu;Hchbq%cG z()0wB#)SdDL-L`lS&AWwo#So^P+v`rX2j;q=dLI79H}2Tm9|I6OpEtv!6DPHn{EgZ zNSQPNi`MB)$N(me|N4u^F0BsW*ZCQXX@Gjgsg%�IYj09i|mZxpF6tu8H<6kmNr% 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

b0Svn&?a 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 UZjWVWbmVD$X|1=m>tfB*mh literal 398163 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

x8tbH`L<^IMCwje0 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 diff --git a/packages/devextreme-scss/icons/dxiconsfluent.ttf b/packages/devextreme-scss/icons/dxiconsfluent.ttf index 28c6e64d6848384b51576db4388b6d5f8435f1c8..af928ba2267377328954cc9b2bec815d1759bd85 100644 GIT binary patch delta 1082 zcmaJ=O>7%g5Pq}!cAxEScfDT!lEks&)VpaNZ~eQfKuwcFDP0PcP^DCWsFnWY(8Q5i zp%C2K4rwbm6^v9RL8z!)kZ7qIq=L%9&80r1hzsI^#HFebDyoPCc7<3NyMkU&wR(E< z&71jV=G*s{uF~cjtr8%FNTf!1vh(Fv%&g*5M$q#Ot|L=3rMWxB)p0_gAMvLrN~h*< z_abiM?mBVut>crK!+#=f5m4y#vC`4h<@Y`!;N8IU;xszgI{krwN)ZoF&zzor2@S*s zA$0O&d1_Z_bpGdy1Ohcexb#eEehx+;LLhVzrU_vMgjJLW$e6lzO+tOeH+))pz74RG3{+7wc6YX|loSCiu zumS$ct_q8Iod+$+!<%h6Cbv!ABek3d-UzGkpAA=sJBDcYtve6(w69+GrFBr(`)twZ z^mk;9Gj2;!#d%m~tPZLYm2MlHCU?4jN2@4^5cd zc1W->$R{zW00$&Rk(L!nQkI`s+<|zkZ0|pGXun;K#Q|u*$D_X5mRsVE*E5aJN1vH6 zCk=t}0=KFI#|1-hU-3Ml@F*)?vXw}WAQtP9`83@g5^qtuMdnQ!2sN&agsb5o2l^_d zj5iLOcwLCloAo%(s*wSrlMHzl=gkHKs$Wzf-W{}{=8L&F4w;K*iGpEP(Qj{V+qqO&O z@veNW9sT|d<+1U B_vrut delta 340 zcmX@GnWbedOFaW40|Ns$LjwadgMojrz7f9=-$9_r9w1Ig&P^;hUOg*`fq_v5$X}A4 zSX=<41%UhmK$;^xr!uYK?wR*M{s{&~?gtsEi7DD$BG(ugc~=1C%`$)j?1xw`1Njet ze3gvck_tN@gMpEcg@J*^BPT!EGEvp^p%4S3kPia`lUimDHC_NF@2mli7}eB?qlc2nUfP3Wtkg4PMF-lD9v2Q zU$J=}Bm1|_dw;NqDT90n#4}${ogL3_^Ob=cXgLr(G0jke(bGQ&Fq$(8ZPyTF^kCWE zAj-(dq*EMD2yTfVxNZlj`3!s5QhjylVW_w4k}I`CCgxt6J*^paDRmfjYN| IGjcHj0L49FC;$Ke diff --git a/packages/devextreme-scss/icons/dxiconsfluent.woff b/packages/devextreme-scss/icons/dxiconsfluent.woff index 032b92ad8bdcb3c0b627e29a971cfffb8a4cc4a5..f208a071da4737be2a955d585eeceeebba1db8fa 100644 GIT binary patch delta 1179 zcmaJ>OKcle6n$rAJY##pOvazF-8haNr?x{JoA@hKXzCz^V$+gMq?C`4m9)*Gi6b?F z5ZpQr{RqUOm61vk7D%u`0twnm5$Yz*rdgzj4Pt}Df~p{tsA{Fkt|$X{45b^?8J+jJ z_r7!QJ@fhgE8)Ydg8ud^qoWLrG3@DJvN`)U7#eq>UyM6yYX9U+d5(FUnI z#H9Su&vTWN^VG=B#fOKvduY6j*DUYfU7^*N=;klnV~uTeNsFqB@$FXqSM1!c_iG$u ze{Jx){08%}G*RVJJ+K6z!l{c%NMa=Kj7D<#y?KwMK(crOkodeA#7A<&*qcBSxS@?{ zRk&ha|5j2egqzK9K}v4olc)r<-h2w^|fMR zscX}?6HPekbw?r!ZL_N+##;WC;^bo2<$!A3sY_BFni`O=$2h0bG9TT4ML(hBCl*G@ zDYyRr$*=4-t@^8cJIyL-6J#&4SyHE0bi4F@pdp>gJr5ePnaBWW2=|KJ2wO7I1fsMt z#S+~;2%v|wbO$gDk}jRf??*nD4K)gy{z4?lJ&mw5j7)@1WpPMWRe42~Wp(B8iaQhv zR!YV3@nWeG3;}}M!IR|9j%(t;8$*q6`uEh56ETaxTe!6-I8OKAwrYP&VOLj8vQ=N3 zAQ)_uIh@f_uXs%mIut%BxIMv8rC1s-7Dmc`y2>MkVsWHU_IG=A4$(D1koee2A#>stB3gXSGZ&9iq>*{1vFNZK@5A;krO_$7h9TC|sIT(7FDx1K@@azPnf*t6n`7KXvQ$>!*LJ z%`OF&7MCtB{a$}-`P_T)GmbOMXN9wu&sEQR&o2`j<$(?lbC}GGqkoQb{TCN@@i*=Q B2sZ!# delta 399 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 T@ii*tbo&6jH$MxYpaK8@BQf2l literal 24868 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 bze#`=*jxx!eHJRKi?*qi?d=(Wi7x;EzAH%l diff --git a/packages/devextreme-scss/icons/dxiconsmaterial.ttf b/packages/devextreme-scss/icons/dxiconsmaterial.ttf index 43e0dc06bf9745f204e2a152d2d358d1becee72a..9f8ea82e71bcef64f3c8ec1ffb3539503f85afae 100644 GIT binary patch delta 987 zcmYjQT}V@J7=NDg;a1x^J07q_{ea4I51L;; zBl#7;gnjT>{AlZ)i)5dCPxj71QkZ7BcK}yO2cE&<(`Wys3&|Y-T>sFiBirJ)SI)fw zxN!-9@ejw(j$jiG0!)<%G@OhNAB#SILKLUwsmRBXQ=_MeD6Lzwm!F226}*B6_zPdI zuVCgdy4dszWKy_^9TRGDx6on1J-J6#+qonIu$Je5&BHp70KBFywHw`NlF@5H8?s)W zWnf0nF822?W_9c?rqk(S8s!)UF}UyRnT1JdZcdt9z?>WR7azD+i<2`mc%sz1-+6(O z_^_Og0gA%f-&r?>v)C^Yx~_{;T4dd6CwohD8i9D*SLS@NUm$3RDC*AA>e z*PL=aR^X_qGHt*Ll%{6#RQYb)f%-28T`L6!I!Y#`spRaa`58{J0($j;9#8^`LviSi zmSk+bP{s42DEeHkkgCR7TVtvka=Cn@`b%5eCd)oY@x%FXvtS~Ko@%LCij1{u?S!#N z`NnaaZ5_uk%w}xuOQi@cSnu@7a$9XBYn@*d?RHW0*HvoyVo6oq<#PE+$Md{k*>`>m zgUE7b8^`gQ)}Dw)5?VW5v_z!FD@jUqm0+gw7apd1Q-snC@Z}DssDn<}2=&ki9vTwO z=@84UQX0!$3Wyz@dLuTfCbdfyy)vPTZBde%&1!Xvg{$w43WMnIW27J5$VWt;gDtbUH$T7EG%?kw)oPs@`tz8?Tyg=PEDW0u9$}EAI7fuygiObuq)c=7+LCK3QwZ>uYqYW z$HXL4X`{^8=Y8N#z7j^vgqhG1noskYzVS-FPwEjxS(amgKw8)H(P&=R(}6&YsQaNIGB&Q+@<<2bCw{QeVz-Kaxx zS@w8jIX=|Q70Xw2{Zt?jCr%VassG&d;~XL{INgFE8pcF9mn|C;bTGDNB3&Q?k2yMSnSuu2_N;ZYcd5c`5?s6N?ll@_wQl#nN<%n*ijhd!;#5kJW^Kdw~_ zx62ij+f6y>a=8tSn`__2JC^mt!2vEDwC`FLKW>EE8@AduI{QTd3e?vejlg$_XM|;(K8>6VUqK%wTf2QGSEx&Z4QJX(PRwwr1vL8Z&#DOs16iK65AYM|LFpY_^&0$o&KO6ZuI1 delta 391 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

N9q< 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 C69y#! literal 15360 zcmV+bJpaRYPew8T0RR9106YKy3jhEB0Gwn106VP!0RR9100000000000000000000 z00006U;u$65eN!`qbPyz5dk&=Bm;;@3xp;B1Rw>2W(Ob}WPeo#2Im2gclvVAh|1Y& zi6YoI00`>)Xa9dW;D!wBLwzNb&TMqK8l~7MQ^dAt+X@Xus+Z`N%mL~xzhgZAu-EZ7 z_WL;M*)s?pUV_@F$9d34dZ?g+Y2b#fi^I|z?XNcXI-6gOK;JDaT06NU`_p{rW3ix~%QmMO*r8syxa$W5b9Wkynrv@gSId=4B5$%c_d|-JI2)u4~f* zT=4={fI+V{qpFFTffmsrCPvYo%(k%5OA6&#sKib?uR1{?Qr-v7r!002s_M5aQf zqbymmVIQY{yYl#d(nMC7=}&t4O8Qc|H)ZM5sjr|S4orG!38ZwfWbrzMdv$BP^XrAu z7sI~pYf7af)8G~_Q{-Jy5JA}*b{AVgz|V)R;4lZaKmd*53X;OHupAF3GWBQ*r!vih zwHBa=0JdlV@GF2ax@6_)oLVoR8U z)Wb$EQ1~F2Em2M#O*O#hX>xR@34mc24i7jqt4rfZMU>KzN?}SWI~z?wRYj^mX$;}P zOgq$sN~ytI$%jt>uMO@?6#*bYoc5Ch)7+H1XtA{k|=ebF8>ZbC&L zTHqa73b>aOC#RMjN0YTp;8xg1YCf(($--Os@k2AxZ~u}sVObihwVX+?2WAj&Zx{)N z=jo$|JV->@fo+vv8cuw0q*tQ@SlM&{r|VRe?G(vY{r6mtH*XH?pXUe1g0K67S&XVb zl<#NxWy-<(00k1I6s#c_8E7IzeWyLlE;vPdzelZnuhl$YZQCb5;c6M~QjBs42TczeY| z0KGGch%KI3)mqw@k|ijsuw2)T^15CXlCM4;S|yzWtdt3@uOCRjp4=Fbr8?)dLvDOn z2)!pPmQDyT=@L+u9LXZLNE5=gNwqZSs7Nsb$aEM%oUWEA8e5f3M#V}~O>ixUc$iYd zWIogsX`UQni|^!#hzyVj4W{;u@LIgw$LypqLAg|^+AX)NcbDbvx@?yefytb^q|vbk zIO`e*HTPh6x1Xn-7Ebkf{uXin=JeCHw~^H(6mS=l^Pbs7?cse*E{oG7$A=A(U*9~pBO$Wm9iYJ7 z0~)Z0)s*!(pbI$|@D?2w))(FuZ{16vlFUp`?J6K{+x2|A&>IzW?YY(hZ7O zs14;`mV;>g?2ooGWCF^N`LRJZqX}(d!Yb!;Le=9e9zW3vAtNC>Aas{lf04=EoGlh| zEqU1IEQKTtpSj?|@#O7jO2OIuOK#koXYDAKxD{b!R4BdJ+~GYv&GnA!56z%&i-8}; zQ5kaDj6C0de8{8@L|8Cx&YF2|7hO<-q(UuOXg`ZBq%zRVQ4>=Yq0uhG-CAXzTez;v zS7j4O&3sXKw`fgB{6c@Q=u+HpU2S7K^FHF(E)M%eHg}K-3nr$>%?*l?_4CGUI1_7B zwIRI{QNA8m5rUgBt_X>*ZcMV$T1+f<{Zvlfh{cn&hz*gUFn_M~5~9Xb5pK}!=uV6j zO3CI~0fizIB$($tz6!jQHcYCbswJG@bu*gGv-3pdF>&;8%&X;Ehg5Zc$VBNTH$E_h zM~-xx^%T`ie&!^~@nD+YYHgF8BriF6$To@7D3;MFbHdf_I}VzcL3yAZdKouI-yI2J z^$Oh~G*kch;&3`kS5Iu+^q*LTz@QYA4U!M#G0TOp5v`*#(V^m8<&O zcll>4H{rUJ1^MGsQes1)?$CTs`57Z4+e4MGy4^hc6Jpd*lxU~>bnRfVOhJlOO2Pd* z8i$mZV$BbGqG`G|BqM_KyxXIf5bRCN-}-8utyi@!+Ns{&HL9V3_2ar^!N$iBp_!ep z@Y(X?-X;!*K!tVd+o2bS zJrP(HbK63cVvX-qhS3W10ueIBL~fRHw%bzH*y@VZJ7PAn2dAUm@Jo##M5%RKhtXFC z)gP#8#hVk8YTcj{wsnA305zheGWfgpjUn$J6DqN&rJzGtX>GKqz5-``7Q?SZ5%LI) z#fFhlEJ2m|q1uq{A*xdfjwk7=G|{{X4Qjq<;2rofWL<{SCD9h$PPY=Iqi$W17x$JP z8q406{u!PB3NhCBa{Bm?YJm(e`plX2&^b+X%T{{2jzS$4j9ql@QgP@3w9pOR9RaCB znF4JTaK;^t%Ina}-R1+{=RNvPiybxSQLQv1jM)ngTYUk^DxKaZO0a8ehjAa@ku6 ztal+r<(*z*Ac2C^G3Olaf>>&mBZ@sRJWgnH4}u=hO(DTh3=i?YKnZS%N4_Ed^ymKY}rj2dU%T|!QGuSke5q9}>ey*g5CPd8s%P?Dk)`fWT-9rHTy zk^==Ad|w!q0g+>=#sze{yS+T1;kqYdyWSca@mRn(&anvig}m%8+N{|4xYs@Oa+g$d zGEqH8atVPGsg<|@$vxqT+{7f?q(!pVN4s0UQ!}+9b7o}8l({?v61i(L1f7`CgG)v# zc5oi73?(SlGKeOUh#((#R_`24wtIQ%8&jDHCy0#0B_Bf$D=|4)79ZE} z!5GnQ-Z4ikF|}-ClBENWN3wcWZ=$7w4J7E1NkwoeWdGcm> zlg%fr6izv@;WMKe)6$Gz91l^ly$roIdTf%|5PBM;9qD+vE1G_%^Z-==lHrNtj*ku! zd9QPU;f~FbyR1TQ?`f~}5~uuVJI)F)65?TWnUJH~il4@hXXgg~s(Lyf?e}+l$^f%w zA9%67QVtq9NHU;Pu1_vx=LP@!>Q z;6TN8?JxzOE}4)U(BAf*{>r+SMhz&d30WNF%&5m!$)S@=|F2h6UgbF!bgYOwv!o@Xr^vIjCm10L^S?(pnIm?B^hEvOP&MZjR zwf(%YBMsg`BABIJePc0|1OXBx!I%O|x@7jhe?yN@(&0Tz(w$`#l@>Y6h+gdW^+BU2 zyW0KazmW!oZ30HCQ2_?r?DCu_`^fd6v{yBNRefQDO0F@?df8`jyUZkTNHN#OmSqz!RL%0DdZ|T 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 diff --git a/packages/devextreme-scss/images/icons/fluent/chatadd.svg b/packages/devextreme-scss/images/icons/fluent/chatadd.svg new file mode 100644 index 000000000000..574d811dd9b9 --- /dev/null +++ b/packages/devextreme-scss/images/icons/fluent/chatadd.svg @@ -0,0 +1,4 @@ + +chatadd + + diff --git a/packages/devextreme-scss/images/icons/fluent/colordismiss.svg b/packages/devextreme-scss/images/icons/fluent/colordismiss.svg new file mode 100644 index 000000000000..065b76d2b153 --- /dev/null +++ b/packages/devextreme-scss/images/icons/fluent/colordismiss.svg @@ -0,0 +1,4 @@ + +colordismiss + + diff --git a/packages/devextreme-scss/images/icons/fluent/ratingfilled.svg b/packages/devextreme-scss/images/icons/fluent/ratingfilled.svg new file mode 100644 index 000000000000..1b1e74c76955 --- /dev/null +++ b/packages/devextreme-scss/images/icons/fluent/ratingfilled.svg @@ -0,0 +1,4 @@ + +ratingfilled + + diff --git a/packages/devextreme-scss/images/icons/fluent/ratingoutline.svg b/packages/devextreme-scss/images/icons/fluent/ratingoutline.svg new file mode 100644 index 000000000000..dc65c40ac03f --- /dev/null +++ b/packages/devextreme-scss/images/icons/fluent/ratingoutline.svg @@ -0,0 +1,4 @@ + +ratingoutline + + diff --git a/packages/devextreme-scss/images/icons/generic/chatadd.svg b/packages/devextreme-scss/images/icons/generic/chatadd.svg new file mode 100644 index 000000000000..3f5e15c7852d --- /dev/null +++ b/packages/devextreme-scss/images/icons/generic/chatadd.svg @@ -0,0 +1,4 @@ + +chatadd + + diff --git a/packages/devextreme-scss/images/icons/generic/colordismiss.svg b/packages/devextreme-scss/images/icons/generic/colordismiss.svg new file mode 100644 index 000000000000..4de4527bf74c --- /dev/null +++ b/packages/devextreme-scss/images/icons/generic/colordismiss.svg @@ -0,0 +1,4 @@ + +colordismiss + + diff --git a/packages/devextreme-scss/images/icons/generic/ratingfilled.svg b/packages/devextreme-scss/images/icons/generic/ratingfilled.svg new file mode 100644 index 000000000000..b54fbdd51b3c --- /dev/null +++ b/packages/devextreme-scss/images/icons/generic/ratingfilled.svg @@ -0,0 +1,4 @@ + +ratingfilled + + diff --git a/packages/devextreme-scss/images/icons/generic/ratingoutline.svg b/packages/devextreme-scss/images/icons/generic/ratingoutline.svg new file mode 100644 index 000000000000..636c0332c968 --- /dev/null +++ b/packages/devextreme-scss/images/icons/generic/ratingoutline.svg @@ -0,0 +1,4 @@ + +ratingoutline + + diff --git a/packages/devextreme-scss/images/icons/material/chatadd.svg b/packages/devextreme-scss/images/icons/material/chatadd.svg new file mode 100644 index 000000000000..e3fdd69f971a --- /dev/null +++ b/packages/devextreme-scss/images/icons/material/chatadd.svg @@ -0,0 +1,4 @@ + +chatadd + + diff --git a/packages/devextreme-scss/images/icons/material/colordismiss.svg b/packages/devextreme-scss/images/icons/material/colordismiss.svg new file mode 100644 index 000000000000..2e9bac3d0b26 --- /dev/null +++ b/packages/devextreme-scss/images/icons/material/colordismiss.svg @@ -0,0 +1,4 @@ + +colordismiss + + diff --git a/packages/devextreme-scss/images/icons/material/ratingfilled.svg b/packages/devextreme-scss/images/icons/material/ratingfilled.svg new file mode 100644 index 000000000000..2329ef433a90 --- /dev/null +++ b/packages/devextreme-scss/images/icons/material/ratingfilled.svg @@ -0,0 +1,4 @@ + +ratingfilled + + diff --git a/packages/devextreme-scss/images/icons/material/ratingoutline.svg b/packages/devextreme-scss/images/icons/material/ratingoutline.svg new file mode 100644 index 000000000000..29d571faae07 --- /dev/null +++ b/packages/devextreme-scss/images/icons/material/ratingoutline.svg @@ -0,0 +1,4 @@ + +ratingoutline + + diff --git a/packages/devextreme-scss/scss/widgets/base/_icons.scss b/packages/devextreme-scss/scss/widgets/base/_icons.scss index 18d557b78bdc..3bc47f400bc8 100644 --- a/packages/devextreme-scss/scss/widgets/base/_icons.scss +++ b/packages/devextreme-scss/scss/widgets/base/_icons.scss @@ -153,7 +153,11 @@ .dx-icon-restore .dx-icon-groupbycolumn, .dx-icon-ungroupcolumn, -.dx-icon-ungroupallcolumns { +.dx-icon-ungroupallcolumns, +.dx-icon-ratingoutline, +.dx-icon-ratingfilled, +.dx-icon-chatadd, +.dx-icon-colordismiss { background-position: 0 0; background-repeat: no-repeat; } @@ -499,6 +503,8 @@ $icons: ( "datausage": "\f177", "datapie": "\f178", "pinmap": "\f179", + "ratingoutline": "\f17f", + "ratingfilled": "\f180", "csv": "\f181", "packagebox": "\f182", "checkmarkcircle": "\f183", @@ -522,6 +528,8 @@ $icons: ( "groupbycolumn":"\f197", "ungroupcolumn":"\f198", "ungroupallcolumns":"\f199", + "chatadd":"\f200", + "colordismiss":"\f201", ); // stylelint-enable From 7aa3c29c9c06dc484d04ea3f43678af690b16b05 Mon Sep 17 00:00:00 2001 From: Vladimir Bushmanov Date: Wed, 20 Aug 2025 17:43:12 +0500 Subject: [PATCH 025/101] Scheduler: add jest object model (#30820) Co-authored-by: Vladimir Bushmanov --- .../__tests__/__mock__/create_scheduler.ts | 8 +++ .../__tests__/__mock__/model/scheduler.ts | 51 +++++++++++++++++++ .../scheduler/__tests__/appointments.test.ts | 4 +- .../scheduler/__tests__/resources.test.ts | 24 +++------ .../__tests__/santiago_timezone.test.ts | 18 ++----- .../scheduler/__tests__/views.test.ts | 4 +- .../appointments/m_appointment_collection.ts | 7 +-- 7 files changed, 75 insertions(+), 41 deletions(-) create mode 100644 packages/devextreme/js/__internal/scheduler/__tests__/__mock__/model/scheduler.ts diff --git a/packages/devextreme/js/__internal/scheduler/__tests__/__mock__/create_scheduler.ts b/packages/devextreme/js/__internal/scheduler/__tests__/__mock__/create_scheduler.ts index cdc4903b5aaa..7fdc73e2a96a 100644 --- a/packages/devextreme/js/__internal/scheduler/__tests__/__mock__/create_scheduler.ts +++ b/packages/devextreme/js/__internal/scheduler/__tests__/__mock__/create_scheduler.ts @@ -1,11 +1,15 @@ import Scheduler from '@ts/scheduler/m_scheduler'; +import { createSchedulerModel, type SchedulerModel } from './model/scheduler'; + // eslint-disable-next-line @typescript-eslint/no-explicit-any type Config = any; export const createScheduler = async (config: Config): Promise<{ container: HTMLDivElement; scheduler: Scheduler; + POM: SchedulerModel; + keydown: (element: Element, key: string) => void; }> => { const container = document.createElement('div'); const scheduler = new Scheduler(container, config); @@ -14,5 +18,9 @@ export const createScheduler = async (config: Config): Promise<{ return { container, scheduler, + POM: createSchedulerModel(container), + keydown: (element: Element, key: string): void => { + element.dispatchEvent(new KeyboardEvent('keydown', { key, bubbles: true })); + }, }; }; diff --git a/packages/devextreme/js/__internal/scheduler/__tests__/__mock__/model/scheduler.ts b/packages/devextreme/js/__internal/scheduler/__tests__/__mock__/model/scheduler.ts new file mode 100644 index 000000000000..fae9b5c8203f --- /dev/null +++ b/packages/devextreme/js/__internal/scheduler/__tests__/__mock__/model/scheduler.ts @@ -0,0 +1,51 @@ +const getAppointmentColor = (container: HTMLDivElement): string => { + const appointment = container.querySelector('.dx-scheduler-appointment') as HTMLDivElement; + return appointment.style.backgroundColor; +}; +const getAgendaAppointmentColor = (container: HTMLDivElement): string => { + const appointment = container.querySelector('.dx-scheduler-agenda-appointment-marker') as HTMLDivElement; + return appointment.style.backgroundColor; +}; +const getTexts = ( + cells: NodeListOf, +): string[] => Array.from(cells).map((cell) => cell.textContent?.trim() ?? ''); + +export interface SchedulerModel { + getAppointment: () => HTMLDivElement | null; + getAppointments: () => NodeListOf; + getAppointmentColor: (view: string) => string; + getDateTableContent: () => string[]; + getHeaderPanelContent: () => string[]; + getTimePanelContent: () => string[]; + getGroupTableContent: () => string[]; +} + +export const createSchedulerModel = (container: HTMLDivElement): SchedulerModel => ({ + getAppointment(): HTMLDivElement | null { + return container.querySelector('.dx-scheduler-appointment'); + }, + getAppointments(): NodeListOf { + return container.querySelectorAll('.dx-scheduler-appointment'); + }, + getAppointmentColor(view: string): string { + return view === 'agenda' + ? getAgendaAppointmentColor(container) + : getAppointmentColor(container); + }, + getDateTableContent(): string[] { + const cells = container.querySelectorAll('.dx-scheduler-date-table-cell'); + return getTexts(cells); + }, + getHeaderPanelContent(): string[] { + const cells = container.querySelectorAll('.dx-scheduler-header-panel-cell'); + return getTexts(cells); + }, + getTimePanelContent(): string[] { + const cells = container.querySelectorAll('.dx-scheduler-time-panel-cell'); + return getTexts(cells); + }, + getGroupTableContent(): string[] { + const cells = container.querySelectorAll('.dx-scheduler-group-header'); + return getTexts(cells); + }, +}); diff --git a/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts b/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts index 7aef71a8911b..73b9551aa348 100644 --- a/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts +++ b/packages/devextreme/js/__internal/scheduler/__tests__/appointments.test.ts @@ -8,7 +8,7 @@ import { setupSchedulerTestEnvironment } from './__mock__/m_mock_scheduler'; describe('Appointments', () => { it('All-day appointment should not be resizable if current view is "day"', async () => { setupSchedulerTestEnvironment(); - const { container } = await createScheduler({ + const { POM } = await createScheduler({ dataSource: [{ text: 'Appointment 1', startDate: new Date(2015, 1, 9, 8), @@ -19,7 +19,7 @@ describe('Appointments', () => { currentDate: new Date(2015, 1, 9, 8), }); - const appointment = container.querySelector('.dx-scheduler-appointment'); + const appointment = POM.getAppointment(); expect(appointment && !appointment.classList.contains('dx-resizable')).toBe(true); }); }); diff --git a/packages/devextreme/js/__internal/scheduler/__tests__/resources.test.ts b/packages/devextreme/js/__internal/scheduler/__tests__/resources.test.ts index 6b3b3a71217d..7b7dbba973b1 100644 --- a/packages/devextreme/js/__internal/scheduler/__tests__/resources.test.ts +++ b/packages/devextreme/js/__internal/scheduler/__tests__/resources.test.ts @@ -22,31 +22,19 @@ const rooms = [ const rooms2 = [ { id: 1, text: 'Room 2', color: 'rgb(60, 154, 205)' }, ]; -const getAppointmentColor = (container: HTMLDivElement): string => { - const appointment = container.querySelector('.dx-scheduler-appointment') as HTMLDivElement; - return appointment.style.backgroundColor; -}; -const getAgendaAppointmentColor = (container: HTMLDivElement): string => { - const appointment = container.querySelector('.dx-scheduler-agenda-appointment-marker') as HTMLDivElement; - return appointment.style.backgroundColor; -}; describe('Resources', () => { describe.each([ 'month', 'agenda', ])('%s view', (view) => { - const getColor = view === 'agenda' - ? getAgendaAppointmentColor - : getAppointmentColor; - it('should render correct appointment color for remote datasource (T1300252)', async () => { setupSchedulerTestEnvironment(); const dataPromise = new Promise((resolve) => { setTimeout(resolve, 100, rooms); }); - const { container } = await createScheduler({ + const { POM } = await createScheduler({ views: [view], currentView: view, currentDate: new Date(2024, 8, 7), @@ -65,13 +53,13 @@ describe('Resources', () => { await dataPromise; await new Promise(process.nextTick); - expect(getColor(container)).toBe(rooms[0].color); + expect(POM.getAppointmentColor(view)).toBe(rooms[0].color); }); it('should render correct appointment color for local datasource (T1300252)', async () => { setupSchedulerTestEnvironment(); - const { container } = await createScheduler({ + const { POM } = await createScheduler({ views: [view], currentView: view, currentDate: new Date(2024, 8, 7), @@ -83,13 +71,13 @@ describe('Resources', () => { }], }); - expect(getColor(container)).toBe(rooms[0].color); + expect(POM.getAppointmentColor(view)).toBe(rooms[0].color); }); it('should render appointments after resources update (T1301345)', async () => { setupSchedulerTestEnvironment(); - const { container, scheduler } = await createScheduler({ + const { POM, scheduler } = await createScheduler({ views: [view], currentView: view, currentDate: new Date(2024, 8, 7), @@ -107,7 +95,7 @@ describe('Resources', () => { }]); await new Promise(process.nextTick); - expect(getColor(container)).toBe(rooms2[0].color); + expect(POM.getAppointmentColor(view)).toBe(rooms2[0].color); }); }); }); diff --git a/packages/devextreme/js/__internal/scheduler/__tests__/santiago_timezone.test.ts b/packages/devextreme/js/__internal/scheduler/__tests__/santiago_timezone.test.ts index 92f28f5f30bd..f31c46e78e62 100644 --- a/packages/devextreme/js/__internal/scheduler/__tests__/santiago_timezone.test.ts +++ b/packages/devextreme/js/__internal/scheduler/__tests__/santiago_timezone.test.ts @@ -96,16 +96,11 @@ const views = [ }, ]; -const getAppointments = (container: HTMLElement) => container.querySelectorAll('.dx-scheduler-appointment'); -const getTexts = ( - cells: NodeListOf, -) => Array.from(cells).map((cell) => cell.textContent?.trim()); - describe('scheduler', () => { it.each(views)('should render correct workspace in Santiago DST for view: $view.name', async ({ view, result }) => { setupSchedulerTestEnvironment(true); - const { container } = await createScheduler({ + const { POM } = await createScheduler({ views: [view], currentView: view.name, currentDate: new Date(2024, 8, 8), @@ -116,18 +111,15 @@ describe('scheduler', () => { }); if (result.hasCellContent) { - const cells = container.querySelectorAll('.dx-scheduler-date-table-cell'); - expect(getTexts(cells)).toMatchSnapshot(); + expect(POM.getDateTableContent()).toMatchSnapshot(); } if (result.hasHeaderPanel) { - const cells = container.querySelectorAll('.dx-scheduler-header-panel-cell'); - expect(getTexts(cells)).toMatchSnapshot(); + expect(POM.getHeaderPanelContent()).toMatchSnapshot(); } if (result.hasTimePanel) { - const cells = container.querySelectorAll('.dx-scheduler-time-panel-cell'); - expect(getTexts(cells)).toMatchSnapshot(); + expect(POM.getTimePanelContent()).toMatchSnapshot(); } - expect(getAppointments(container)).toHaveLength(result.appointmentAmount); + expect(POM.getAppointments()).toHaveLength(result.appointmentAmount); }); }); diff --git a/packages/devextreme/js/__internal/scheduler/__tests__/views.test.ts b/packages/devextreme/js/__internal/scheduler/__tests__/views.test.ts index 50ff97a5865d..52796ec0604b 100644 --- a/packages/devextreme/js/__internal/scheduler/__tests__/views.test.ts +++ b/packages/devextreme/js/__internal/scheduler/__tests__/views.test.ts @@ -8,7 +8,7 @@ import { setupSchedulerTestEnvironment } from './__mock__/m_mock_scheduler'; describe('views', () => { it('should render appointment after view change (T1297019)', async () => { setupSchedulerTestEnvironment(); - const { container, scheduler } = await createScheduler({ + const { POM, scheduler } = await createScheduler({ timeZone: 'Etc/UTC', dataSource: [{ text: 'Appointment', @@ -34,7 +34,7 @@ describe('views', () => { scheduler.option('currentView', 'day'); await new Promise(process.nextTick); - const appointment = container.querySelector('.dx-scheduler-appointment'); + const appointment = POM.getAppointment(); expect(appointment !== null).toBe(true); }); }); diff --git a/packages/devextreme/js/__internal/scheduler/appointments/m_appointment_collection.ts b/packages/devextreme/js/__internal/scheduler/appointments/m_appointment_collection.ts index 992f154c5514..71065ec54d05 100644 --- a/packages/devextreme/js/__internal/scheduler/appointments/m_appointment_collection.ts +++ b/packages/devextreme/js/__internal/scheduler/appointments/m_appointment_collection.ts @@ -183,7 +183,7 @@ class SchedulerAppointments extends CollectionWidget { private _getNavigatableItems(): dxElementWrapper { // @ts-expect-error - const appts = this._itemElements().filter(':visible').not('.dx-state-disabled'); + const appts = this._itemElements().not('.dx-state-disabled'); // @ts-expect-error const apptCollectors = this.$element().find('.dx-scheduler-appointment-collector'); return appts.add(apptCollectors); @@ -638,7 +638,6 @@ class SchedulerAppointments extends CollectionWidget { element: dxElementWrapper, settings: AppointmentAgendaViewModel, ): void { - const { allDay } = settings; const { groups, groupsLeafs, resourceById } = this.option('getResourceManager')(); const config: any = { data: settings.itemData, @@ -646,12 +645,8 @@ class SchedulerAppointments extends CollectionWidget { groupTexts: getGroupTexts(groups, groupsLeafs, resourceById, settings.groupIndex), notifyScheduler: this.option('notifyScheduler'), geometry: settings, - direction: settings.direction || 'vertical', allowResize: false, allowDrag: false, - allDay, - cellWidth: this.invoke('getCellWidth'), - cellHeight: this.invoke('getCellHeight'), groups: this.option('groups'), dataAccessors: this.option('dataAccessors'), From fa2dc3aef8b4a4a6829b626ccc28a1b052a8f23c Mon Sep 17 00:00:00 2001 From: Sergio Bur Date: Wed, 20 Aug 2025 15:49:08 +0200 Subject: [PATCH 026/101] Scheduler: remove exceptionDate from appointment settings (#30804) --- .../view_model/generate_view_model/m_settings_generator.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/m_settings_generator.ts b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/m_settings_generator.ts index f0464202955d..07fece3e29e4 100644 --- a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/m_settings_generator.ts +++ b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/m_settings_generator.ts @@ -170,8 +170,6 @@ export class DateGeneratorBaseStrategy { return { ...item, - // TODO: Check usages & delete this field. - exceptionDate: new Date(item.startDate), }; }); @@ -238,8 +236,6 @@ export class DateGeneratorBaseStrategy { ...item, startDate: newStartDate, endDate: newEndDate, - // TODO: Check usages & delete this field. - exceptionDate: new Date(newStartDate), }; }); } @@ -321,7 +317,6 @@ export class DateGeneratorBaseStrategy { if (offsetDifference !== 0 && this._canProcessNotNativeTimezoneDates(appointmentAdapter)) { source.startDate = dateUtilsTs.addOffsets(source.startDate, [offsetDifference * toMs('minute')]); source.endDate = dateUtilsTs.addOffsets(source.endDate, [offsetDifference * toMs('minute')]); - source.exceptionDate = new Date(source.startDate); } const duration = source.endDate.getTime() - source.startDate.getTime(); From 4df08144c69015efbf633351fafeafdeebe66598 Mon Sep 17 00:00:00 2001 From: Vasily Strelyaev Date: Wed, 20 Aug 2025 15:50:08 +0200 Subject: [PATCH 027/101] fix: mitigate WebUtils side effect impact on DevExtreme components in Next.js (#30793) --- packages/devextreme-react/package.json | 1 + packages/devextreme-vue/package.json | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/devextreme-react/package.json b/packages/devextreme-react/package.json index 6f0e57ca97b2..614fc9744498 100644 --- a/packages/devextreme-react/package.json +++ b/packages/devextreme-react/package.json @@ -7,6 +7,7 @@ "type": "git", "url": "https://github.com/DevExpress/devextreme-react.git" }, + "sideEffects": false, "main": "./cjs/index.js", "module": "./esm/index.js", "types": "./cjs/index.d.ts", diff --git a/packages/devextreme-vue/package.json b/packages/devextreme-vue/package.json index c297d468af6d..9a5115ed1096 100644 --- a/packages/devextreme-vue/package.json +++ b/packages/devextreme-vue/package.json @@ -6,6 +6,7 @@ "type": "git", "url": "https://github.com/DevExpress/devextreme-vue.git" }, + "sideEffects": false, "main": "./cjs/index.js", "module": "./esm/index.js", "types": "./cjs/index.d.ts", From bb56e42a8381d7c5f687003efca5c48635798dc7 Mon Sep 17 00:00:00 2001 From: Alyar Date: Wed, 20 Aug 2025 21:40:56 +0400 Subject: [PATCH 028/101] CardView: Fix the getSelectedCardsData method when the selected data is on multiple pages (T1300933) (#30805) Co-authored-by: Alyar <> --- .../grid_core/selection/controller.test.ts | 32 +++++++++++++++++++ .../new/grid_core/selection/controller.ts | 7 +--- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/selection/controller.test.ts b/packages/devextreme/js/__internal/grids/new/grid_core/selection/controller.test.ts index 1d7b3bf82f83..5f47fca4b12d 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/selection/controller.test.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/selection/controller.test.ts @@ -200,6 +200,38 @@ describe('SelectionController', () => { expect(selectionController.getSelectedCardsData()) .toEqual(dataController.items.peek()); }); + + describe('when the selected cards are on different pages', () => { + it('should return data for all selected cards', () => { + const { + selectionController, + dataController, + } = setup({ + keyExpr: 'id', + dataSource: [ + { id: 1, value: 'test1' }, + { id: 2, value: 'test2' }, + { id: 3, value: 'test3' }, + ], + selectedCardKeys: [1, 3], + paging: { + enabled: true, + pageSize: 2, + }, + }); + + expect(dataController.items.peek()) + .toEqual([ + { id: 1, value: 'test1' }, + { id: 2, value: 'test2' }, + ]); + expect(selectionController.getSelectedCardsData()) + .toEqual([ + { id: 1, value: 'test1' }, + { id: 3, value: 'test3' }, + ]); + }); + }); }); describe('clearSelection', () => { diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/selection/controller.ts b/packages/devextreme/js/__internal/grids/new/grid_core/selection/controller.ts index 82fb19a190d4..936b6101f597 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/selection/controller.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/selection/controller.ts @@ -365,12 +365,7 @@ export class SelectionController { } public getSelectedCardsData(): DataObject[] { - const selectedCardKey = this.getSelectedCardKeys(); - - return selectedCardKey - .map((key) => this.itemsController.getCardByKey(key)) - .filter((item): item is CardInfo => !!item) - .map((item) => item.data); + return this.selectionHelper?.peek()?.getSelectedItems(); } public getSelectedCardKeys(): Key[] { From 849ddb66f625d850123beb9b52991468135c1d3b Mon Sep 17 00:00:00 2001 From: Andrey Dolzhikov <16618553+Raushen@users.noreply.github.com> Date: Wed, 20 Aug 2025 21:19:21 +0300 Subject: [PATCH 029/101] DataGrid - The filterType property is reset if client state storing contains no filtering settings (#30826) --- .../common/stateStoring/stateStoring.ts | 50 +++++++++++++++++++ .../state_storing/m_state_storing.ts | 22 ++++---- 2 files changed, 62 insertions(+), 10 deletions(-) diff --git a/e2e/testcafe-devextreme/tests/dataGrid/common/stateStoring/stateStoring.ts b/e2e/testcafe-devextreme/tests/dataGrid/common/stateStoring/stateStoring.ts index 0934476e8aab..10f81f11ea5a 100644 --- a/e2e/testcafe-devextreme/tests/dataGrid/common/stateStoring/stateStoring.ts +++ b/e2e/testcafe-devextreme/tests/dataGrid/common/stateStoring/stateStoring.ts @@ -142,3 +142,53 @@ test('DataGrid - Cannot read properties of undefined (reading \'done\') error oc }).before(async () => { await createWidget('dxDataGrid', { ...dataGridConfig }); }); + +test('DataGrid - The filterType property is reset if client state storing contains no filtering settings (T1296608)', async (t) => { + const dataGrid = new DataGrid('#container'); + + // assert + await t + .expect(dataGrid.isReady()) + .ok() + .expect(dataGrid.getDataCell(0, 0).element().innerText) + .eql('1'); +}).before(async () => { + await createWidget('dxDataGrid', { + dataSource: [ + { id: 0, textID: '0', text: 'item 0' }, + { id: 1, textID: '1', text: 'item 1' }, + ], + keyExpr: 'id', + filterSyncEnabled: true, + columns: [ + { + dataField: 'id', + caption: 'ID', + dataType: 'string', + }, + { + dataField: 'textID', + filterType: 'exclude', + name: 'textID', + dataType: 'string', + filterValues: ['0'], + }, + ], + stateStoring: { + enabled: true, + type: 'custom', + customLoad() { + return Promise.resolve({ + columns: [ + { + dataField: 'id', + }, + { + dataField: 'textID', + }, + ], + }); + }, + }, + }); +}); diff --git a/packages/devextreme/js/__internal/grids/grid_core/state_storing/m_state_storing.ts b/packages/devextreme/js/__internal/grids/grid_core/state_storing/m_state_storing.ts index 8d7494a6f535..052c59ec6cd2 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/state_storing/m_state_storing.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/state_storing/m_state_storing.ts @@ -71,22 +71,24 @@ const processLoadState = (that) => { } }; -const DEFAULT_FILTER_VALUE = null; - const getFilterValue = (that, state) => { // TODO: getController const filterSyncController = that.getController('filterSync'); - const columnsController = that.getController('columns'); - const hasFilterState = state.columns || state.filterValue !== undefined; + if (!filterSyncController) { + return null; + } - if (filterSyncController) { - if (hasFilterState) { - return state.filterValue || filterSyncController.getFilterValueFromColumns(state.columns); - } - return that._initialFilterValue || filterSyncController.getFilterValueFromColumns(columnsController.getColumns()); + if (state.filterValue !== undefined) { + return state.filterValue; + } + + const filterValueFromColumns = filterSyncController.getFilterValueFromColumns?.(state.columns); + if (filterValueFromColumns?.length > 0) { + return filterValueFromColumns; } - return DEFAULT_FILTER_VALUE; + const columns = that.getController('columns').getColumns(); + return that._initialFilterValue ?? filterSyncController.getFilterValueFromColumns(columns); }; const rowsView = (Base: ModuleType) => class StateStoringRowsViewExtender extends Base { From 96894c61064171bfbee217b59e2e474de5445f98 Mon Sep 17 00:00:00 2001 From: Alexander Kozlovskiy Date: Thu, 21 Aug 2025 09:59:23 +0300 Subject: [PATCH 030/101] Chat: support emptyViewTemplate option --- .../devextreme-angular/src/ui/chat/index.ts | 21 +++++ packages/devextreme-react/src/chat.ts | 7 ++ packages/devextreme-vue/src/chat.ts | 3 + .../devextreme/js/__internal/ui/chat/chat.ts | 32 ++++++-- .../js/__internal/ui/chat/messagelist.ts | 27 ++++++- packages/devextreme/js/ui/chat.d.ts | 16 ++++ packages/devextreme/js/ui/chat_types.d.ts | 1 + .../chatParts/chat.tests.js | 77 +++++++++++++++++++ packages/devextreme/ts/dx.all.d.ts | 17 ++++ 9 files changed, 191 insertions(+), 10 deletions(-) diff --git a/packages/devextreme-angular/src/ui/chat/index.ts b/packages/devextreme-angular/src/ui/chat/index.ts index 0fc0985c7af7..c254bbb187f7 100644 --- a/packages/devextreme-angular/src/ui/chat/index.ts +++ b/packages/devextreme-angular/src/ui/chat/index.ts @@ -193,6 +193,19 @@ export class DxChatComponent extends DxComponent implements OnDestroy, OnChanges } + /** + * [descr:dxChatOptions.emptyViewTemplate] + + */ + @Input() + get emptyViewTemplate(): any { + return this._getOption('emptyViewTemplate'); + } + set emptyViewTemplate(value: any) { + this._setOption('emptyViewTemplate', value); + } + + /** * [descr:dxChatOptions.focusStateEnabled] @@ -565,6 +578,13 @@ export class DxChatComponent extends DxComponent implements OnDestroy, OnChanges */ @Output() elementAttrChange: EventEmitter>; + /** + + * This member supports the internal infrastructure and is not intended to be used directly from your code. + + */ + @Output() emptyViewTemplateChange: EventEmitter; + /** * This member supports the internal infrastructure and is not intended to be used directly from your code. @@ -769,6 +789,7 @@ export class DxChatComponent extends DxComponent implements OnDestroy, OnChanges { emit: 'disabledChange' }, { emit: 'editingChange' }, { emit: 'elementAttrChange' }, + { emit: 'emptyViewTemplateChange' }, { emit: 'focusStateEnabledChange' }, { emit: 'heightChange' }, { emit: 'hintChange' }, diff --git a/packages/devextreme-react/src/chat.ts b/packages/devextreme-react/src/chat.ts index be01f2a3e96d..13aae683df8e 100644 --- a/packages/devextreme-react/src/chat.ts +++ b/packages/devextreme-react/src/chat.ts @@ -31,6 +31,8 @@ type IChatOptionsNarrowedEvents = { } type IChatOptions = React.PropsWithChildren & IHtmlOptions & { + emptyViewRender?: (...params: any) => React.ReactNode; + emptyViewComponent?: React.ComponentType; messageRender?: (...params: any) => React.ReactNode; messageComponent?: React.ComponentType; defaultItems?: Array; @@ -72,6 +74,11 @@ const Chat = memo( }), []); const templateProps = useMemo(() => ([ + { + tmplOption: "emptyViewTemplate", + render: "emptyViewRender", + component: "emptyViewComponent" + }, { tmplOption: "messageTemplate", render: "messageRender", diff --git a/packages/devextreme-vue/src/chat.ts b/packages/devextreme-vue/src/chat.ts index f71ee209f1eb..04d3b76b1062 100644 --- a/packages/devextreme-vue/src/chat.ts +++ b/packages/devextreme-vue/src/chat.ts @@ -44,6 +44,7 @@ type AccessibleOptions = Pick>, elementAttr: Object as PropType>, + emptyViewTemplate: {}, focusStateEnabled: Boolean, height: [Number, String], hint: String, @@ -130,6 +132,7 @@ const componentConfig = { "update:disabled": null, "update:editing": null, "update:elementAttr": null, + "update:emptyViewTemplate": null, "update:focusStateEnabled": null, "update:height": null, "update:hint": null, diff --git a/packages/devextreme/js/__internal/ui/chat/chat.ts b/packages/devextreme/js/__internal/ui/chat/chat.ts index 49f11f1c2c4d..3f00df9c0763 100644 --- a/packages/devextreme/js/__internal/ui/chat/chat.ts +++ b/packages/devextreme/js/__internal/ui/chat/chat.ts @@ -31,6 +31,7 @@ import type { } from '@ts/ui/chat/messagebox'; import MessageBox from '@ts/ui/chat/messagebox'; import type { + EmptyViewTemplate, MessageEditingEvent, MessageTemplate, Properties as MessageListProperties, @@ -89,6 +90,7 @@ class Chat extends Widget { dayHeaderFormat: 'shortdate', messageTemplate: null, messageTimestampFormat: 'shorttime', + emptyViewTemplate: null, alerts: [], showAvatar: true, showUserName: true, @@ -201,6 +203,7 @@ class Chat extends Widget { allowDeleting: (message: Message): boolean => this._allowDeleteAction(message), isEditActionDisabled: (message) => this._messageToEdit === message, messageTemplate: this._getMessageTemplate(), + emptyViewTemplate: this._getEmptyViewTemplate(), showDayHeaders, showAvatar, showUserName, @@ -259,17 +262,23 @@ class Chat extends Widget { return allowDeleting ?? false; } - _getMessageTemplate(): MessageTemplate { - const { messageTemplate } = this.option(); - if (messageTemplate) { - return (message, $container): void => { - const template = this._getTemplateByOption('messageTemplate'); + _getRenderTemplateFunction(optionName: 'messageTemplate'): MessageTemplate; + _getRenderTemplateFunction(optionName: 'emptyViewTemplate'): EmptyViewTemplate; + _getRenderTemplateFunction( + optionName: 'messageTemplate' | 'emptyViewTemplate', + ): MessageTemplate | EmptyViewTemplate { + const { [optionName]: templateOption } = this.option(); + + if (templateOption) { + return (data, $container): void => { + const template = this._getTemplateByOption(optionName); + const dataFieldName = optionName === 'messageTemplate' ? 'message' : 'data'; template.render({ container: $container, model: { component: this, - message, + [dataFieldName]: data, }, }); }; @@ -278,6 +287,14 @@ class Chat extends Widget { return null; } + _getMessageTemplate(): MessageTemplate { + return this._getRenderTemplateFunction('messageTemplate'); + } + + _getEmptyViewTemplate(): EmptyViewTemplate { + return this._getRenderTemplateFunction('emptyViewTemplate'); + } + _messageEditingStartHandler(e: MessageEditingEvent): void { if (this._messageToEdit) { this._messageEditCanceledAction?.({ message: this._messageToEdit }); @@ -615,6 +632,9 @@ class Chat extends Widget { case 'messageTemplate': this._messageList.option(name, this._getMessageTemplate()); break; + case 'emptyViewTemplate': + this._messageList.option(name, this._getEmptyViewTemplate()); + break; case 'reloadOnChange': break; default: diff --git a/packages/devextreme/js/__internal/ui/chat/messagelist.ts b/packages/devextreme/js/__internal/ui/chat/messagelist.ts index dcd407ae2852..38954b19b20d 100644 --- a/packages/devextreme/js/__internal/ui/chat/messagelist.ts +++ b/packages/devextreme/js/__internal/ui/chat/messagelist.ts @@ -17,6 +17,7 @@ import type { Message, TextMessage, User } from '@js/ui/chat'; import type { Item as ContextMenuItem } from '@js/ui/context_menu'; import type dxContextMenu from '@js/ui/context_menu'; import type { WidgetOptions } from '@js/ui/widget/ui.widget'; +import { getPublicElement } from '@ts/core/m_element'; import type { OptionChanged } from '@ts/core/widget/types'; import Widget from '@ts/core/widget/widget'; import ContextMenu from '@ts/ui/context_menu/context_menu'; @@ -64,6 +65,10 @@ const ESCAPE_KEY = 'escape'; export const MESSAGEGROUP_TIMEOUT = 5 * 1000 * 60; export type MessageTemplate = ((data: Message, messageBubbleContainer: Element) => void) | null; +export type EmptyViewTemplate = (( + data: { message: string; prompt: string }, + emptyViewContainer: Element) => void +) | null; export type ItemClick = NativeEventInfo & { readonly itemData?: ContextMenuItem; @@ -88,6 +93,7 @@ export interface Properties extends WidgetOptions { currentUserId: number | string | undefined; showDayHeaders: boolean; messageTemplate?: MessageTemplate; + emptyViewTemplate?: EmptyViewTemplate; dayHeaderFormat?: Format; messageTimestampFormat?: Format; typingUsers: User[]; @@ -131,6 +137,7 @@ class MessageList extends Widget { showAvatar: true, showUserName: true, showMessageTimestamp: true, + emptyViewTemplate: null, messageTemplate: null, }; } @@ -198,23 +205,34 @@ class MessageList extends Widget { } _renderEmptyViewContent(): void { + const messageText = messageLocalization.format('dxChat-emptyListMessage'); + const promptText = messageLocalization.format('dxChat-emptyListPrompt'); + const { emptyViewTemplate } = this.option(); + const $emptyView = $('

') .addClass(CHAT_MESSAGELIST_EMPTY_VIEW_CLASS) .attr('id', `dx-${new Guid()}`); + if (emptyViewTemplate) { + const data = { + message: messageText, + prompt: promptText, + }; + emptyViewTemplate(data, getPublicElement($emptyView)); + $emptyView.appendTo(this._$content); + + return; + } + $('
') .appendTo($emptyView) .addClass(CHAT_MESSAGELIST_EMPTY_IMAGE_CLASS); - const messageText = messageLocalization.format('dxChat-emptyListMessage'); - $('
') .appendTo($emptyView) .addClass(CHAT_MESSAGELIST_EMPTY_MESSAGE_CLASS) .text(messageText); - const promptText = messageLocalization.format('dxChat-emptyListPrompt'); - $('
') .appendTo($emptyView) .addClass(CHAT_MESSAGELIST_EMPTY_PROMPT_CLASS) @@ -809,6 +827,7 @@ class MessageList extends Widget { case 'showUserName': case 'showMessageTimestamp': case 'messageTemplate': + case 'emptyViewTemplate': case 'dayHeaderFormat': case 'messageTimestampFormat': this._invalidate(); diff --git a/packages/devextreme/js/ui/chat.d.ts b/packages/devextreme/js/ui/chat.d.ts index 81d032620264..a136bd76b0c2 100644 --- a/packages/devextreme/js/ui/chat.d.ts +++ b/packages/devextreme/js/ui/chat.d.ts @@ -284,6 +284,15 @@ export type MessageTemplateData = { readonly message?: Message; }; +/** @public */ +export type EmptyViewTemplateData = { + readonly component: dxChat; + readonly data: { + readonly message: string; + readonly prompt: string; + }; +}; + /** * @deprecated use Properties instead * @namespace DevExpress.ui @@ -339,6 +348,13 @@ export interface dxChatOptions extends WidgetOptions { */ allowDeleting?: boolean | ((options: { component?: dxChat; message?: Message }) => boolean); }; + /** + * @docid + * @default null + * @type_function_return string|Element|jQuery + * @public + */ + emptyViewTemplate?: template | null | ((data: EmptyViewTemplateData, itemElement: DxElement) => string | UserDefinedElement); /** * @docid * @type string | Array | Store | DataSource | DataSourceOptions | null diff --git a/packages/devextreme/js/ui/chat_types.d.ts b/packages/devextreme/js/ui/chat_types.d.ts index 2f45a3579e02..d0aa33d1040c 100644 --- a/packages/devextreme/js/ui/chat_types.d.ts +++ b/packages/devextreme/js/ui/chat_types.d.ts @@ -17,6 +17,7 @@ export { ImageMessage, Message, MessageTemplateData, + EmptyViewTemplateData, dxChatOptions, Properties, } from './chat'; diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/chatParts/chat.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/chatParts/chat.tests.js index 019d876f1a0a..d3b17b01e22c 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/chatParts/chat.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/chatParts/chat.tests.js @@ -28,6 +28,7 @@ import fx from 'common/core/animation/fx'; import { isRenderer } from 'core/utils/type'; import config from 'core/config'; +import localization from 'localization'; import ArrayStore from 'common/data/array_store'; import { CHAT_EDITING_PREVIEW_CLASS, @@ -122,6 +123,7 @@ const moduleConfig = { this.getContextMenuItems = () => $(this.getContextMenu().itemsContainer()).find(`.${DX_MENU_ITEM_CLASS}`); this.getEditingPreview = () => this.$element.find(`.${CHAT_EDITING_PREVIEW_CLASS}`); this.getCancelEditingButton = () => this.$element.find(`.${CHAT_EDITING_PREVIEW_CANCEL_BUTTON_CLASS}`); + this.getMessageListEmptyView = () => this.$element.find(`.${CHAT_MESSAGELIST_EMPTY_VIEW_CLASS}`); init(); }, @@ -758,6 +760,81 @@ QUnit.module('Chat', () => { }); }); + QUnit.module('emptyViewTemplate', () => { + QUnit.test('emptyViewTemplate should set empty view content on init', function(assert) { + this.reinit({ + emptyViewTemplate: () => $('

').text('This is empty'), + }); + + const $emptyView = this.getMessageListEmptyView(); + + assert.strictEqual($emptyView.text(), 'This is empty'); + }); + + QUnit.test('emptyViewTemplate should set empty view content at runtime', function(assert) { + this.reinit({ }); + this.instance.option('emptyViewTemplate', () => $('

').text('This is empty')); + + const $emptyView = this.getMessageListEmptyView(); + + assert.strictEqual($emptyView.text(), 'This is empty'); + }); + + QUnit.test('emptyViewTemplate specified as a string text should set empty view content', function(assert) { + this.reinit({ emptyViewTemplate: 'empty' }); + + const $emptyView = this.getMessageListEmptyView(); + + assert.strictEqual($emptyView.text(), 'empty'); + }); + + QUnit.test('emptyViewTemplate specified as a string with a html element should set empty view content', function(assert) { + this.reinit({ emptyViewTemplate: '

p text

' }); + + const $emptyViewChild = this.getMessageListEmptyView().children(); + + assert.strictEqual($emptyViewChild.text(), 'p text', 'template text is correct'); + assert.strictEqual($emptyViewChild.prop('tagName'), 'P', 'templte tag element is correct'); + }); + + QUnit.test('emptyViewTemplate function argument should include Chat instance', function(assert) { + assert.expect(1); + + const emptyViewTemplate = (data) => { + assert.strictEqual(data.component instanceof Chat, true, 'chat instance is passed'); + }; + + this.reinit({ emptyViewTemplate }); + }); + + QUnit.test('emptyViewTemplate function argument should include data with localized message and prompt', function(assert) { + assert.expect(2); + + const defaultLocale = localization.locale(); + const localizedEmptyListMessage = 'Lista wiadomości jest pusta'; + const localizedEmptyListPrompt = 'Napisz swoją pierwszą wiadomość'; + + const emptyViewTemplate = ({ data }) => { + assert.strictEqual(data.message, localizedEmptyListMessage, 'localized message is passed'); + assert.strictEqual(data.prompt, localizedEmptyListPrompt, 'localized prompt is passed'); + }; + + try { + localization.loadMessages({ + 'pl': { + 'dxChat-emptyListMessage': localizedEmptyListMessage, + 'dxChat-emptyListPrompt': localizedEmptyListPrompt, + } + }); + localization.locale('pl'); + + this.reinit({ emptyViewTemplate }); + } finally { + localization.locale(defaultLocale); + } + }); + }); + QUnit.test('dayHeaderFormat option value should be passed to messageList on init', function(assert) { const dayHeaderFormat = 'dd of MMMM, yyyy'; diff --git a/packages/devextreme/ts/dx.all.d.ts b/packages/devextreme/ts/dx.all.d.ts index 11df21af664b..283432ccb7c2 100644 --- a/packages/devextreme/ts/dx.all.d.ts +++ b/packages/devextreme/ts/dx.all.d.ts @@ -10941,6 +10941,13 @@ declare module DevExpress.ui { */ export type DisposingEvent = DevExpress.common.core.events.EventInfo; + export type EmptyViewTemplateData = { + readonly component: dxChat; + readonly data: { + readonly message: string; + readonly prompt: string; + }; + }; export type ExplicitTypes = { Properties: Properties; DisposingEvent: DisposingEvent; @@ -11119,6 +11126,16 @@ declare module DevExpress.ui { message?: DevExpress.ui.dxChat.Message; }) => boolean); }; + /** + * [descr:dxChatOptions.emptyViewTemplate] + */ + emptyViewTemplate?: + | template + | null + | (( + data: DevExpress.ui.dxChat.EmptyViewTemplateData, + itemElement: DevExpress.core.DxElement + ) => string | DevExpress.core.UserDefinedElement); /** * [descr:dxChatOptions.dataSource] */ From a3fcede4bc327426a6949aca090f28f3fe481b95 Mon Sep 17 00:00:00 2001 From: Arman Boyakhchyan Date: Thu, 21 Aug 2025 11:25:18 +0400 Subject: [PATCH 031/101] Chart: Update demo descriptions (#30833) --- .../Demos/Charts/Crosshair/description.md | 17 +++++++++++-- .../Demos/Charts/ErrorBars/description.md | 8 +++--- .../Demos/Charts/FunnelChart/description.md | 10 ++++---- .../Demos/Charts/HoverMode/description.md | 25 +++++++++++++++++-- .../Demos/Charts/MultiplePanes/description.md | 4 +-- .../Demos/Charts/ParetoChart/description.md | 8 ++++-- .../PieResolveLabelOverlap/description.md | 4 +-- .../Demos/Charts/PointImage/description.md | 6 +++-- .../Demos/Charts/PyramidChart/description.md | 8 +++--- .../Charts/SmallValueGroups/description.md | 6 +++-- .../Demos/Charts/StepLine/description.md | 2 +- .../Demos/Charts/TooltipAPI/description.md | 2 +- 12 files changed, 71 insertions(+), 29 deletions(-) diff --git a/apps/demos/Demos/Charts/Crosshair/description.md b/apps/demos/Demos/Charts/Crosshair/description.md index cd4141231a7f..13a2b24e1e7c 100644 --- a/apps/demos/Demos/Charts/Crosshair/description.md +++ b/apps/demos/Demos/Charts/Crosshair/description.md @@ -1,2 +1,15 @@ -In this example, the crosshair pointer is enabled and a custom style is applied to it. The crosshair pointer allows a user to determine the argument and the value of a specific point more precisely. - \ No newline at end of file +The DevExtreme Chart component supports crosshairs (vertical and horizontal lines centered on a data point). When enabled, the crosshair follows the cursor and snaps to the nearest series point. To configure crosshair settings, specify the [crosshair](/Documentation/ApiReference/UI_Components/dxChart/Configuration/crosshair/) object. + + +This demo configures the following **crosshair** properties: + +- [color](/Documentation/ApiReference/UI_Components/dxChart/Configuration/crosshair/#color) +Specifies the line color. +- [width](/Documentation/ApiReference/UI_Components/dxChart/Configuration/crosshair/#width) +Configures the line width. +- [dashStyle](/Documentation/ApiReference/UI_Components/dxChart/Configuration/crosshair/#dashStyle) +Specifies the line style. +- [label](/Documentation/ApiReference/UI_Components/dxChart/Configuration/crosshair/label/) +Configures labels (text and appearance). + +You can configure **crosshair**.[horizontalLine](/Documentation/ApiReference/UI_Components/dxChart/Configuration/crosshair/horizontalLine/) and **crosshair**.[verticalLine](/Documentation/ApiReference/UI_Components/dxChart/Configuration/crosshair/verticalLine/) objects to override settings for each line individually. \ No newline at end of file diff --git a/apps/demos/Demos/Charts/ErrorBars/description.md b/apps/demos/Demos/Charts/ErrorBars/description.md index 41799b5ec3a0..e8c0933954c5 100644 --- a/apps/demos/Demos/Charts/ErrorBars/description.md +++ b/apps/demos/Demos/Charts/ErrorBars/description.md @@ -1,13 +1,13 @@ -DevExtreme Chart supports value error bars. Implement these bars to indicate data measurement tolerances and [confidence intervals](https://en.wikipedia.org/wiki/Confidence_interval). Configure error bar settings and appearance in the **series**.[valueErrorBar](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/valueErrorBar/) object. +DevExtreme Chart supports value error bars. These bars indicate data measurement tolerances and [confidence intervals](https://en.wikipedia.org/wiki/Confidence_interval). Use the **series**.[valueErrorBar](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/valueErrorBar/) object to configure error bar settings and appearance. -To enable error bars, specify one of the following pairs of **valueErrorBar** properties: +To display error bars, specify one of the following pairs of **valueErrorBar** properties: - [lowValueField](Documentation/ApiReference/UI_Components/dxChart/Configuration/series/valueErrorBar/#lowValueField) and [highValueField](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/valueErrorBar/#highValueField) -Specify predefined error bars for each series point. +Bind fields that contain error values for each series point. - [value](Documentation/ApiReference/UI_Components/dxChart/Configuration/series/valueErrorBar/#value) and [type](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/valueErrorBar/#type) -Configure dynamically calculated error bars. +Calculate error bar values based on series data points. This demo implements predefined error bars specified in the Chart data source. \ No newline at end of file diff --git a/apps/demos/Demos/Charts/FunnelChart/description.md b/apps/demos/Demos/Charts/FunnelChart/description.md index 2d1d4747f273..77371670dc54 100644 --- a/apps/demos/Demos/Charts/FunnelChart/description.md +++ b/apps/demos/Demos/Charts/FunnelChart/description.md @@ -1,19 +1,19 @@ -DevExtreme Funnel displays data in a funnel chart. You can implement funnel charts to display the flow of data over different stages. This demo displays conversion rates from website visits to product renewals. +DevExtreme Funnel displays the flow of data over different stages. This demo displays conversion rates from website visits to product renewals. -This demo specifies multiple Funnel configuration objects: +This demo configures the following objects: - [title](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/title/) -Specifies a title for the Funnel component. +Specifies the component title. - [export](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/export/) -Configures export settings. Funnel supports multiple export [formats](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/export/#formats). +Configures export settings. Funnel supports the following export [formats](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/export/#formats): PNG, PDF, JPEG, SVG, and GIF. - [tooltip](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/tooltip/) Specifies item tooltips. - [label](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/label/) Configures item labels. - [item](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/item/) -Customizes the visual appearance of items. +Customizes item appearance. [note] diff --git a/apps/demos/Demos/Charts/HoverMode/description.md b/apps/demos/Demos/Charts/HoverMode/description.md index ae908b88756b..577bfff6e9b9 100644 --- a/apps/demos/Demos/Charts/HoverMode/description.md +++ b/apps/demos/Demos/Charts/HoverMode/description.md @@ -1,2 +1,23 @@ -The Chart and PieChart components support different modes of series hovering. This demo shows the _«includePoints»_ mode, when all the points of a hovered series change their display style. In addition, you can specify a custom hover mode for legend items. Here, the _«excludePoints»_ mode is used, when only the series line changes its display style leaving the points as they were. - \ No newline at end of file +DevExtreme Chart supports configurable hover modes for series and points. This demo specifies properties that set common **hoverMode** for all series/points and a custom mode for the component legend. + + +You can specify **hoverMode** for the following Chart elements: + +- [series](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#hoverMode) +A specific series. +- [commonSeriesSettings](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/#hoverMode) +All series. +- **commonSeriesSettings**.[spline](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/#spline) (or other [Series Type](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/) objects) +All series of a specific type. +- [legend](/Documentation/ApiReference/UI_Components/dxChart/Configuration/legend/#hoverMode) +Series hovered in the Chart legend. +- **series**.[point](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/point/#hoverMode) +Points in a specific series. +- **commonSeriesSettings**.[point](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/point/#hoverMode) (or other Series Type objects) +All points. +- **commonSeriesSettings**.**spline**.**point** +All points in series of a specific type. +- [argumentAxis](/Documentation/ApiReference/UI_Components/dxChart/Configuration/argumentAxis/#hoverMode) +All points at common argument values. + +To further customize Chart behavior, define the [stickyHovering](/Documentation/ApiReference/UI_Components/dxChart/Configuration/#stickyHovering) property. When enabled (default), points remain in the hover state until users hover the mouse pointer over other points or move it outside the component. \ No newline at end of file diff --git a/apps/demos/Demos/Charts/MultiplePanes/description.md b/apps/demos/Demos/Charts/MultiplePanes/description.md index 79e9a4ac03f8..5926ca1920b5 100644 --- a/apps/demos/Demos/Charts/MultiplePanes/description.md +++ b/apps/demos/Demos/Charts/MultiplePanes/description.md @@ -1,7 +1,7 @@ -The DevExtreme Chart component allows you to display data in multiple panes. To configure a multi-pane chart, specify the [panes[]](/Documentation/ApiReference/UI_Components/dxChart/Configuration/panes/) array. The component stacks panes vertically (or horizontally when [rotated](/Documentation/ApiReference/UI_Components/dxChart/Configuration/#rotated) is `true`). +The DevExtreme Chart component allows you to display data in multiple panes. The component stacks panes vertically (or horizontally when Chart axes are [rotated](/Documentation/ApiReference/UI_Components/dxChart/Configuration/#rotated)). To create a multi-pane chart, add items to the [panes[]](/Documentation/ApiReference/UI_Components/dxChart/Configuration/panes/) array. -Chart assigns unique [value axes](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/) and a shared [argument axis](/Documentation/ApiReference/UI_Components/dxChart/Configuration/argumentAxis/) to all panes. To configure the value axis of a specific pane, define **valueAxis** properties and assign the **pane**.[name](/Documentation/ApiReference/UI_Components/dxChart/Configuration/panes/#name) value to **valueAxis**.[pane](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/#pane). +The Chart renders multiple [value axes](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/) and a shared [argument axis](/Documentation/ApiReference/UI_Components/dxChart/Configuration/argumentAxis/). To create multiple value axes, add a **valueAxis[]** object for each value axis. To assign a value axis to a pane, pass the pane [name](/Documentation/ApiReference/UI_Components/dxChart/Configuration/panes/#name) to the **valueAxis**.[pane](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/#pane) property. DevExtreme Chart can display multiple [series](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/) in a single pane. Specify the **series**.[pane](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#pane) property to display a series in a specific pane. \ No newline at end of file diff --git a/apps/demos/Demos/Charts/ParetoChart/description.md b/apps/demos/Demos/Charts/ParetoChart/description.md index d8d76941cec9..6b4922311a3e 100644 --- a/apps/demos/Demos/Charts/ParetoChart/description.md +++ b/apps/demos/Demos/Charts/ParetoChart/description.md @@ -1,5 +1,9 @@ -You can utilize the DevExtreme Chart component to display data in a [Pareto chart](https://en.wikipedia.org/wiki/Pareto_chart). A Pareto chart displays individual values along with their cumulative totals. In this demo, individual values are numbers of complaints and cumulative totals are represented as percentages. +You can use the DevExtreme Chart component to visualize data as a [Pareto chart](https://en.wikipedia.org/wiki/Pareto_chart). Such charts display individual values along with their cumulative totals. In this demo, individual values are numbers of complaints and cumulative totals are given in percentages. -To create a Pareto chart, configure two [series](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/) objects. Assign the [Bar](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/BarSeries/) and [Line](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/LineSeries/)/[Spline](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/SplineSeries/) series types to **series**.[type](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#type). To represent the numbers of the [Pareto principle](https://en.wikipedia.org/wiki/Pareto_principle) (80/20), you can specify constant lines. This demo configures a **valueAxis**.[constantLines](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/constantLines/) object to display a constant line at 80% of the cumulative total axis. \ No newline at end of file +Follow the steps below to create a Pareto chart: + +1. Configure a [Bar](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/BarSeries/) series and assign your primary data to this series (specify **series**.[valueField](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#valueField) property). +2. Add a [Line](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/LineSeries/) or [Spline](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/SplineSeries/) series and assign your cumulative total values to this series. +3. Specify **valueAxis**.[constantLines](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/constantLines/) to illustrate [Pareto principle](https://en.wikipedia.org/wiki/Pareto_principle) correlation (80/20). diff --git a/apps/demos/Demos/Charts/PieResolveLabelOverlap/description.md b/apps/demos/Demos/Charts/PieResolveLabelOverlap/description.md index 8779b76d6d46..16249085cec4 100644 --- a/apps/demos/Demos/Charts/PieResolveLabelOverlap/description.md +++ b/apps/demos/Demos/Charts/PieResolveLabelOverlap/description.md @@ -1,2 +1,2 @@ -In the PieChart, series may include a large number of points, which may result in point label overlapping. This demo illustrates the **resolveLabelOverlapping** property that allows you to specify how the component must behave when point labels overlap. - \ No newline at end of file +When a DevExtreme Pie Chart contains a lot of data points or they are crowded, point labels may overlap. Use the [resolveLabelOverlapping](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/#resolveLabelOverlapping) property to resolve overlapping labels. In this demo, you can hide or shift overlapping labels. + diff --git a/apps/demos/Demos/Charts/PointImage/description.md b/apps/demos/Demos/Charts/PointImage/description.md index d9537732899e..fef150832cf8 100644 --- a/apps/demos/Demos/Charts/PointImage/description.md +++ b/apps/demos/Demos/Charts/PointImage/description.md @@ -1,2 +1,4 @@ -This demo shows that the Chart can display custom images instead of standard point symbols. - \ No newline at end of file +DevExtreme Chart can display custom images for series points. Specify the **point**.**image** object in [common series](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/point/image/) or [series](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/point/image/) settings to display these images. + + +This demo [hides](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/point/#visible) default point [symbols](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/point/#symbol) and calls the [customizePoint](/Documentation/ApiReference/UI_Components/dxChart/Configuration/#customizePoint) function to display images based on point values. diff --git a/apps/demos/Demos/Charts/PyramidChart/description.md b/apps/demos/Demos/Charts/PyramidChart/description.md index 6079ff415dde..b269071893f6 100644 --- a/apps/demos/Demos/Charts/PyramidChart/description.md +++ b/apps/demos/Demos/Charts/PyramidChart/description.md @@ -1,14 +1,14 @@ -DevExtreme Funnel can display data in a pyramid chart. To configure the component as a pyramid chart, assign *"dynamicHeight"* to the [algorithm](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/#algorithm) property and enable [inverted](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/#inverted). +DevExtreme Funnel can display data as a pyramid chart. To create such visualization, set the [algorithm](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/#algorithm) property to *"dynamicHeight"* and [invert the Funnel](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/#inverted). -This demo specifies multiple Funnel configuration objects: +This demo configures the following objects: - [title](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/title/) -Specifies a title for the Funnel component. +Specifies the component title. - [tooltip](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/tooltip/) Specifies item tooltips. - [item](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/item/) -Customizes the appearance of items. +Customizes item appearance. - [legend](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/legend/) Configures the component legend. - [label](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/label/) diff --git a/apps/demos/Demos/Charts/SmallValueGroups/description.md b/apps/demos/Demos/Charts/SmallValueGroups/description.md index 9808e2659cfa..7c010c99baac 100644 --- a/apps/demos/Demos/Charts/SmallValueGroups/description.md +++ b/apps/demos/Demos/Charts/SmallValueGroups/description.md @@ -1,2 +1,4 @@ -In this example, the PieChart component combines all values below the **threshold** property in one category called _«others»_. - \ No newline at end of file +DevExtreme PieChart supports small value grouping. To enable this functionality, configure the [smallValuesGrouping](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/series/smallValuesGrouping/) object in [series](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/series/) or [commonSeriesSettings](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/commonSeriesSettings/). This demo sets **smallValuesGrouping**.[mode](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/series/smallValuesGrouping/) to *"smallValueThreshold"* and specifies the [threshold](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/series/smallValuesGrouping/#threshold) property. + + +You can also set **smallValuesGrouping**.**mode** to *"topN"*. In this mode, PieChart displays a predefined number of the largest data points (specified with [topCount](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/series/smallValuesGrouping/#topCount)) and groups the rest. \ No newline at end of file diff --git a/apps/demos/Demos/Charts/StepLine/description.md b/apps/demos/Demos/Charts/StepLine/description.md index 13c2014f444e..16d39a87e1e8 100644 --- a/apps/demos/Demos/Charts/StepLine/description.md +++ b/apps/demos/Demos/Charts/StepLine/description.md @@ -1,2 +1,2 @@ -_Step line_ series are much like traditional line series. The primary difference is that in _step line_ series, data points are connected by vertical and horizontal lines --- resulting in a «stair step» effect. +Step line charts display data as points joined by horizontal and vertical line segments that form a step-like pattern. To create a step line chart, set the **series**.[type](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#type) property to *"stepline"*. \ No newline at end of file diff --git a/apps/demos/Demos/Charts/TooltipAPI/description.md b/apps/demos/Demos/Charts/TooltipAPI/description.md index 0d385739e2bb..849570844af8 100644 --- a/apps/demos/Demos/Charts/TooltipAPI/description.md +++ b/apps/demos/Demos/Charts/TooltipAPI/description.md @@ -1,2 +1,2 @@ -This demo illustrates how to show and hide the point’s tooltip with the API. To test this feature, select a continent from the drop-down menu under the PieChart or click a point directly in the PieChart. +You can use tooltip API members to manage its visibility in code. This demo creates a [DevExtreme PieChart](/Documentation/Guide/UI_Components/PieChart/Getting_Started_with_PieChart/) and disables its default tooltip. When you click a pie segment or select an item in the **Choose Region** [box], the [showTooltip()](/Documentation/ApiReference/UI_Components/dxChart/Chart_Elements/Point/Methods/#showTooltip) method call displays a tooltip. \ No newline at end of file From eec840331fe8bb07a639cfb5efd408a1809bf144 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov <84278206+Tucchhaa@users.noreply.github.com> Date: Thu, 21 Aug 2025 15:28:37 +0800 Subject: [PATCH 032/101] DataGrid - Refresh selectedItems on dataSource change when repaintChangesOnly=true (T1279797) (#30661) --- .../data_controller/m_data_controller.ts | 6 +- .../selection/m_selection.integration.test.ts | 176 ++++++++++++++++++ .../grids/grid_core/selection/m_selection.ts | 18 +- .../selection.tests.js | 8 +- 4 files changed, 192 insertions(+), 16 deletions(-) create mode 100644 packages/devextreme/js/__internal/grids/grid_core/selection/m_selection.integration.test.ts diff --git a/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts index 7f809b58c5a4..508293d40e94 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/method-signature-style */ import ArrayStore from '@js/common/data/array_store'; import { CustomStore } from '@js/common/data/custom_store'; import $ from '@js/core/renderer'; @@ -609,7 +608,6 @@ export class DataController extends DataHelperMixin(modules.Controller) { this.pushed.fire(changes); } - // eslint-disable-next-line @typescript-eslint/no-unused-vars public fireError(...args: any[]) { this.dataErrorOccurred.fire(errors.Error.apply(errors, args)); } @@ -1642,7 +1640,7 @@ export class DataController extends DataHelperMixin(modules.Controller) { if (options === true) { options = { reload: true, changesOnly: true }; } else if (!options) { - options = { lookup: true, selection: true, reload: true }; + options = { reload: true, lookup: true }; } const that = this; @@ -1734,7 +1732,7 @@ export class DataController extends DataHelperMixin(modules.Controller) { /** * @extended: editing, virtual_scrolling */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars + public reload(reload?, changesOnly?): any { return this._dataSource?.reload(reload, changesOnly); } diff --git a/packages/devextreme/js/__internal/grids/grid_core/selection/m_selection.integration.test.ts b/packages/devextreme/js/__internal/grids/grid_core/selection/m_selection.integration.test.ts new file mode 100644 index 000000000000..e7acc82162aa --- /dev/null +++ b/packages/devextreme/js/__internal/grids/grid_core/selection/m_selection.integration.test.ts @@ -0,0 +1,176 @@ +import { + afterEach, describe, expect, it, +} from '@jest/globals'; +import { CustomStore } from '@js/common/data'; +import type { dxElementWrapper } from '@js/core/renderer'; +import $ from '@js/core/renderer'; + +import type { GridsEditRefreshMode, Properties as DataGridProperties } from '../../../../ui/data_grid'; +import DataGrid from '../../../../ui/data_grid'; + +const SELECTORS = { + gridContainer: '#gridContainer', + detailCell: 'dx-master-detail-cell', + detailContainer: 'dx-datagrid-master-detail-container', +}; + +const GRID_CONTAINER_ID = 'gridContainer'; + +const createDataGrid = async ( + options: DataGridProperties = {}, +): Promise<{ $container: dxElementWrapper; instance: DataGrid }> => new Promise((resolve) => { + const $container = $('
') + .attr('id', GRID_CONTAINER_ID) + .appendTo(document.body); + + const instance = new DataGrid($container.get(0) as HTMLDivElement, options); + + const contentReadyHandler = (): void => { + resolve({ $container, instance }); + instance.off('contentReady', contentReadyHandler); + }; + + instance.on('contentReady', contentReadyHandler); +}); + +describe('GridCore selection', () => { + afterEach(() => { + const $container = $(SELECTORS.gridContainer); + + const dataGrid = ($container as any).dxDataGrid('instance') as DataGrid; + + dataGrid.dispose(); + $container.remove(); + }); + + describe('selectionChanged handler', () => { + [true, false].forEach((repaintChangesOnly) => { + it(`selectRowKeys are updated after refresh if selectedItem is not in dataSource anymore with repaintChangesOnly=${repaintChangesOnly}`, async () => { + const dataSource = [ + { id: 1, name: 'Item 1' }, + { id: 2, name: 'Item 2' }, + ]; + + const { instance } = await createDataGrid({ + dataSource, + columns: ['id', 'name'], + keyExpr: 'id', + selection: { + mode: 'single', + }, + repaintChangesOnly, + }); + + await instance.selectRows([2], false); + expect(instance.getSelectedRowKeys()).toEqual([2]); + + dataSource.splice(1, 1); // Remove the item with id 2 + + await instance.refresh(repaintChangesOnly); + + expect(instance.getSelectedRowKeys()).toEqual([]); + }); + + it(`selectionChanged handler is not called after refresh if selectedItem still present in dataSource with repaintChangesOnly=${repaintChangesOnly}`, async () => { + const dataSource = [ + { id: 1, name: 'Item 1' }, + { id: 2, name: 'Item 2' }, + ]; + + let selectionChangedCount = 0; + + const { instance } = await createDataGrid({ + dataSource, + columns: ['id', 'name'], + keyExpr: 'id', + selection: { + mode: 'single', + }, + repaintChangesOnly, + onSelectionChanged: () => { + selectionChangedCount += 1; + }, + }); + + await instance.selectRows([1], false); + expect(instance.getSelectedRowKeys()).toEqual([1]); + expect(selectionChangedCount).toBe(1); + + dataSource.splice(1, 1); // Remove the item with id 2 + await instance.refresh(repaintChangesOnly); + + expect(instance.getSelectedRowKeys()).toEqual([1]); + expect(selectionChangedCount).toBe(1); + }); + }); + }); + + describe('remote dataSource', () => { + ([ + { refreshMode: 'full', expectedCallCount: 2 }, + { refreshMode: 'reshape', expectedCallCount: 1 }, + { refreshMode: 'repaint', expectedCallCount: 0 }, + ] as { refreshMode: GridsEditRefreshMode; expectedCallCount: number }[]) + .forEach(({ refreshMode, expectedCallCount }) => { + it(`dataSource.load is not called to load selectedRow after data save with editing.refreshMode=${refreshMode}`, async () => { + let data = [ + { id: 1, name: 'Item 1' }, + { id: 2, name: 'Item 2' }, + { id: 3, name: 'Item 3' }, + { id: 4, name: 'Item 4' }, + ]; + + const store = new CustomStore({ + key: 'id', + load: (e) => { + const skip = e.skip ?? 0; + const take = e.take ?? data.length; + const pageData = data.slice(skip, skip + take); + return Promise.resolve({ + data: pageData, + totalCount: data.length, + }); + }, + remove(key) { + data = data.filter((item) => item.id !== key); + return Promise.resolve(); + }, + }); + + const { instance } = await createDataGrid({ + dataSource: store, + editing: { + mode: 'batch', + refreshMode, + allowDeleting: true, + }, + remoteOperations: true, + paging: { + pageSize: 2, + }, + columns: ['id', 'name'], + keyExpr: 'id', + selection: { + mode: 'multiple', + showCheckBoxesMode: 'always', + }, + }); + + await instance.selectRows([4], false); + + let callCount = 0; + store.on('loading', () => { + callCount += 1; + }); + + instance.option('editing.changes', [{ + type: 'remove', + key: 1, + }]); + await instance.saveEditData(); + + expect(callCount).toBe(expectedCallCount); + }); + }); + }); +}); diff --git a/packages/devextreme/js/__internal/grids/grid_core/selection/m_selection.ts b/packages/devextreme/js/__internal/grids/grid_core/selection/m_selection.ts index 1fd3d633204f..08839e1948d8 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/selection/m_selection.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/selection/m_selection.ts @@ -12,7 +12,7 @@ import type { DeferredObj } from '@js/core/utils/deferred'; import { Deferred } from '@js/core/utils/deferred'; import { extend } from '@js/core/utils/extend'; import { each } from '@js/core/utils/iterator'; -import { isDefined } from '@js/core/utils/type'; +import { isDefined, isObject } from '@js/core/utils/type'; import errors from '@js/ui/widget/ui.errors'; import supportUtils from '@ts/core/utils/m_support'; import type { ColumnHeadersView } from '@ts/grids/grid_core/column_headers/m_column_headers'; @@ -650,17 +650,19 @@ export const dataSelectionExtenderMixin = (Base: ModuleType) => return dataItem; } - public refresh(options) { - const that = this; + public refresh(options): any { // @ts-expect-error - const d = new Deferred(); + const d: DeferredObj = new Deferred(); + + super.refresh(options).done(() => { + const skipSelectionRefresh = isObject(options) && !(options as any).selection; - super.refresh.apply(this, arguments as any).done(() => { - if (!options || options.selection) { - that._selectionController.refresh().done(d.resolve).fail(d.reject); - } else { + if (skipSelectionRefresh) { d.resolve(); + return; } + + this._selectionController.refresh().done(d.resolve).fail(d.reject); }).fail(d.reject); return d.promise(); diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/selection.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/selection.tests.js index b876d65a43fe..353e367060d9 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/selection.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/selection.tests.js @@ -1119,7 +1119,7 @@ QUnit.module('Selection', { beforeEach: setupSelectionModule, afterEach: teardow assert.strictEqual(selectionChangedCount, 2, 'selection changed raised'); }); - QUnit.test('Not rise selectionChanged event on refresh with changesOnly', function(assert) { + QUnit.test('Rise selectionChanged event on refresh with changesOnly', function(assert) { let selectionChangedCount = 0; this.applyOptions({ @@ -1137,8 +1137,8 @@ QUnit.module('Selection', { beforeEach: setupSelectionModule, afterEach: teardow this.dataController.refresh(true); // assert - assert.deepEqual(this.selectionController.getSelectedRowKeys(), [{ name: 'Dan', age: 16 }, { name: 'Dmitry', age: 18 }]); - assert.strictEqual(selectionChangedCount, 1, 'selection changed is not raised'); + assert.deepEqual(this.selectionController.getSelectedRowKeys(), [{ name: 'Dan', age: 16 }]); + assert.strictEqual(selectionChangedCount, 2, 'selection changed is raised'); }); QUnit.test('Not rise selectionChanged event on apply filter when selectedRows count not changed', function(assert) { @@ -2052,7 +2052,7 @@ QUnit.module('ChangeRowSelection for multiple selection. DataSource with key', { this.selectionController.changeItemSelection(3, { shift: true }); // assert - assert.deepEqual(this.selectionController.getSelectedRowKeys(), [2, 4, 3], 'selectedRowKeys'); + assert.deepEqual(this.selectionController.getSelectedRowKeys(), [2, 3, 4], 'selectedRowKeys'); }); // T547950 From 6ad41069e7660d5e2969278dc21518c85364a367 Mon Sep 17 00:00:00 2001 From: Alyar Date: Thu, 21 Aug 2025 11:40:15 +0400 Subject: [PATCH 033/101] DataGrid: Fix incorrect display of headers and filter row when there are fixed, banded, and grouped columns (T1276277) (#30778) Co-authored-by: Alyar <> --- ...ter_row_and_grouped_column_(rtl=false).png | Bin 0 -> 8305 bytes ...lter_row_and_grouped_column_(rtl=true).png | Bin 0 -> 7804 bytes .../dataGrid/sticky/common/withBandColumns.ts | 52 ++++++++++++++++++ .../m_columns_controller.ts | 31 +++++++---- .../m_columns_controller_utils.ts | 2 +- 5 files changed, 73 insertions(+), 12 deletions(-) create mode 100644 e2e/testcafe-devextreme/tests/dataGrid/sticky/common/etalons/T1279722_band_sticky_columns-headers_with_filter_row_and_grouped_column_(rtl=false).png create mode 100644 e2e/testcafe-devextreme/tests/dataGrid/sticky/common/etalons/T1279722_band_sticky_columns-headers_with_filter_row_and_grouped_column_(rtl=true).png create mode 100644 e2e/testcafe-devextreme/tests/dataGrid/sticky/common/withBandColumns.ts diff --git a/e2e/testcafe-devextreme/tests/dataGrid/sticky/common/etalons/T1279722_band_sticky_columns-headers_with_filter_row_and_grouped_column_(rtl=false).png b/e2e/testcafe-devextreme/tests/dataGrid/sticky/common/etalons/T1279722_band_sticky_columns-headers_with_filter_row_and_grouped_column_(rtl=false).png new file mode 100644 index 0000000000000000000000000000000000000000..b632279ea2d370b77f2f8a53fd3dd2e5a2d62e47 GIT binary patch literal 8305 zcmb_i1z1(t+BOjtX(^E|MFgZ<0SPGq1ySG-Qqph)4mpaHGzc8xfJ!(j0)mv(&`3&1 zc<2Bk05WXE!RlIV;w4(Sk5E=nybb*Jqa=;jCE9&zc$xbDPwtb zd8{c^K|DY^o?7rqVV&U7P&0Enm4*`yHd(biZxm*uGDOc2?eWxh9xSsMR}#58QNnex zE|g7$o~nuZ7zIb&)XP`P&qtq7Tv*JfBt~bi&)`M`hOHl!KKfX*jxn@qPYGdzKgZi9 zh2kw(&G4e|H8S2FUw11$z`MQ3{z8kq=P`WI+Y2XW&)VS|E-NZ3Ql>r#4i4s!K1@MD zq3S^dcgHM}z~>xe^zgY#jSx8nMf4*p7G&6t-)>mNnh2<1FcR+UbR;^)#_e<2MrHAz zKi^J0q8!0!y1TX3RC}6)=o~-)jKdNCE6pt}rMN=dKAk&vLIWP;ER5)sCdpbL-M|OusI^$?j-qC}DhLyn~=+`wh@?088iqZ)!SJf>oxn#y_$>cI} zaw6aw3Yc!L?;0;G*yiwhrLsF#)Se-hTZ@Y!ysM|DE>*^Bqu6g-Z10C7fo68-#L1J1 z!Zwskh8JlC6B83xADt0%5V-&K#)%UrO6mnjQWXON0@Ra)Lp)&Fu&u4?o;BQQ-Zc?t zrLba-OtpchCMG|`!tPWOb{D!|Xfda9{L}SJqTRxnwNLsX?wiXNMfUgxSjiG9s#!gz z$RHT*JtYaz@u1o#Po9wLqEH>f6<(!IV~5V2J4a1Tef|3N%U01Uk6^Fu?fD#vlj(&l zM_o!wa3gy^id%6~3C|RQC|3quJC?S-<#zY?tGKy|lAY(|3#y{Y zO7q=17iju%aIlr%cj;t%ii83OrD=bjY58K!$&Fp#+js65l)7*tgKoAt`YO1(3VrzS z!Fwfnd?tjfyN3a@pS zv6`bgIyyW&JWroK{iz-53+fOmdeA{k$g=g9DHmrcF^9ol7S>~|x$Pzy%KiToecnqIqhE%;?_uGPYDg<*-)gC|d@VK8K7 z1u7i!0(2QgMKs0uwlI1jr&7Z~O(i9wrC~pU&*R6Bo0^(NHPt7hOI)T-;EU|d_jWeb zu>udEbqoyXVb?CRTrRH-B6HnZwYjFIwzTQ}eYheSYPUPiNxT&rlwrTgCh*59biZE3lMA1NTSSFc`e z%)3{G;^(HVCiPc*3{9V>~hU9EUkgE!pix{ zQgNxXP@mA&(+g~zU?nFeUsxQgO_B9U>gv*gYAADGn1(40wuhe)v$nP#?SE@7EFvO! zw~0K}=ZC@8`a&dnt~rj^4qp_$xiTYUT60AH8M%dp1-!|j2M3l&nPppNyI-8+64#}^6u?Rj&lV=wbi zKhMr4fh}SoXBi%=4U+KL63)!b-0+rlTNrLz`_@-_hS_gNke1(gGBd$=+<~r%U0YXI zK~s~Iid(ZzfP{#YQN`C+RymR>vjDm|CLuvtPme}bRkbxqBoww(|MuKYXu(xhl<`(|^Ih%U--7g=Xg)z%9%^HY^h)hmS3OJ7|lGK_& zi%ibUxUPQDmXyLQb6_x-yA~GFPoC6e8x#a9vJFPy=eQ_C1l;EhD|hD{y8+C!e3z*{ z7k3r5xWKZFjWXn8oVD;Z zU0tfG?V$w(d2%a$Fen6)jLj8~WW9NFYWB8<#wiI23H20lidq3WaVM6|%}qub&nNAg zsnV*(#!LnV1{|E6g0{UEpefzWM=E`&PoM6DdYcafG;MCacAl3vBmswO%eQC=Mxcs; zf#KF$v!hE;IkZ{U-m{+1VNS`7s^? z0|OWC6oq*t@T0PxJ$rDPSC717W~I|WoUvhH-8HmvqWasKi#x1O@3hV|hjT=>ZCk6%*L5p3HPU}#%8grtn8tLF;iaZAFK>MMi zgPWT>2y2z*6F;&$@17##6%Um0T3QvB;bnFqX!wm=acDI9 zqk)%~l+luBMIBO307VX^ZgULAxe4=8NlA}K7P#RBW1$oXdkX}Y$tDUwp^aHBzviE{ z(~(U8I7a$-eb_4!p`jcY5qKcDue0+3I`XCN3rgZ6!B$CJxY8kqhKRE*7${rZT}w+H6iTandfHM)R~L%S14 z8e7>6F2$^H0qgkgZY^aXuL{LCs0#B~TU)EMb#UMk5jov09FmZl8ZjY0*flt)Zfnb1 zjO-Co*U+*dHnz6xjHDCm+nBD^IefzR?{@PXLPD`nkmDj^VzIEVHc54AT3U_Hj1D#q z4p}g3e#&qq1olqSTo^S5e2WGQgPz`AUwBbbakkN!hnIKamj{Q@qW5}u?%lg*ZD*H} znHeDC^<&hntQ5Diw*!MgzwgN}G4&$_oFM~H%ckq&$IBd)V*n~hnHLp_!t#E=kub|LLJb5l`>Md371`_R>j$l7mzPT? zB_;J&`N=^&h({;@;~gVqd|IHLu7rTGxj8!@A0LRfW5sw4ePH^HTIRi9Kn#_5EU_hA zG#am1A5KSA`639a(zm?4Y<=&Z8DVetU2*Y*I4O_`qqx&g?MmScR{^fV!^7XbdzWX` z!36T4SP1keP@gzpD74g+Kbb5G)Ca%cX3O6j2vz6I2$=L`q)KkRMv*Dx-8 z8LJ6ECy>eQL?M5%85tb;1qGPd%mg|~G>>4196=fwI`jGShk)D#z$w1Vv1yBBghjHQ zFUoS`p&Z=Y`=2g_q83qvH54p+irj9u+!PeLN{6bNn)!zq&KoywK` zYRVchk$3-_9`Ftb#-{;M;x#T*njx?MwLnd#!a-`*t?*kxSbBxLm zS-KHgwQ+K5b=DsZn;g!m7Jpq^yBhinpbqFr`^F7LD-gHPQ@wBQK!YU;S-H#)N<8o6 zDei{;PzO#arOgqtYFFfIk+0i#NlbkBq7bl2n<@5q@J_3wAg2syx}^Gx!vDTq`WJtt zt~d?@f$L(TiWdLPq6G&J^8OtU_J={W{=$$cDl&;sMK`vBd^#Q=kDhiZy;baRRyRwX zl`>>8uduKX;XA-#YkT`CHPjZR-`qovQD8_g(oC0xgl4Y^&~Y%5>gwpos{_|SrA^fYoXp6`K&$~s zUffkS3Q*55gOVW!%U0}zmZ@i$X3C~p?98MY&1GSf*pRaQ5 znptnQ0f^W6hPGs}fl^m)(726rZtQGeNfntC;^N|N=;=}NOGzbLw8T>^EKju{e#5N( z#Q3JStmMg{S}-UMpz1s-jOQnT5T3-v37XXrLtT?oVCaw`bYEx!0h4zKYe>454TYVR zimwl)b>%*L_AI)0c(|R`#?Ef?h1@Qf1@&h?|4d8~9aOJ4DcDo&h=N8gjRg+|t|O!m zD)`>L^I0~O{4z2C#U+_QTfMz{4glYKQ>eWFg91wm;v?`-EQw;O3G^w*oVR`iUr=(+ zj6wPNmq;1KFI%N6g+I^A3T$Xl0u1Ueup$H3h94-jrA6(2)!%H^uap;OH>`-iKN!^Seo`KG*oFX`gy3XYg0(3B-oQ(5^~ zVw>BWZr;2Jq8-^h2YOj=aogT()73AXDjlz1 zy)tV{5)l>^b!h>_g-SRD*r_zB4Se-yzwp$%dGj>f{p{`A=sSUA%p3q=SDH`4oW+~e=ecnm}_uBWFb4?U~X z5Xs!}xzN_2(pv(|!wr4?0-tTSEUh%e8!wwMHda4Pz?V3)D+G~RK<*KCMl1qk9dLYq zzQswvGP}?3j?WqZcOpi~u0QXA^F%{*Qqnaj<~v1ptl;N0l0{jUf3_PeiH6`J-?Wwp zOtCUF9W;~OKz;zoVp03gk5*H_pk6|Mxh`tg|4WJUgo=g+CqI8A-<_hUn3$R@jpV3# z(~qG>VCkU*XfE8k?Ba3>aVf6Ttz$r{?+Oc9WhMY6dp>=7Yf^nECN?%?W@QsAWJMZ8 zdiFVZrRY>Qh$+5){dz0UKPkZxj>xcfOiG31zc3=aAFL?f|z|j4$@L79k7A5tNULrYpR_Q zClv%;iUto&5w2u&@18tU$`yW5u+Zw=lN(DD=*;);lR&Z{XuTT7st{VkP50$yEbSg7z8ybe0(y4R+zyIZLgI9&YFg-kavLCP; z8l(0yY+?racHO@$zhBWSB0UC%{g#+ zPvYYdnLb+WFX8p$Lc|2QIbIZ&6Fe!aO!~WbPhc-0O!?5>Zn-#G4LX&k(K-07eKM%k zn3x#ySsM^Hu%X(wZ(jpv=6{TA8bm1Q(=dBHY&h8MN7CN^`4X&bE;Qizsu3+mizF_1 z0}?ucpFk?RjMp89RpdE$?pa9*)_oWgWZoDd=(B|eVd_GF$_M+&on@nAXxRGG!NZ8w z<emgL4;m`%d>8wXHWeGnzr)E=x2zFM?SNu}Pw)r4@px6C6uZ2o<-A znp%2B#-s6Zvti84Sy0an;GH0NK$>{JA%SL{odpjQk&J?sOA&W|2o(Ww7SF|t(>V9x zG4O5bX|iXF@!^Bajm}QLp?=6K5TQ3;>qRFgwRRb-?8pcKAncBPp&H+y+|m*Z75yK)SKc_1N)1LUPwT7~}c7XAzpE*t<&-#-_I zUgxP3>X7yyl!09Z|J*dQzosisl_D5b0bR=6=GdrDEVT-Cu&n=zUu5?to1y^&^KAPr zLJZX*y+Y!$05?qv<~fbYL(_FOO*)uE?Y$#^n8d?x_YwcDazaySCqT##!NX4hmo4*hJAR`H45E|tvZ)s`ikwXXH zgN&sFe#qbjyE^@*c-U;JISzIv7@J1enc4YnC6^AV&lP{7rHTcg$bkZ@?l{6`8e#01 z+{VFEr}ha4gmfj6g>!OpdhdQi%}9-GlHzu^s|ZpE-9k?>?=1$Qdq01EJRx4bJzusn zA-BgKM8>S7sF)#z9ZZLGrWG16I03vd3;C$_))c?rhgUaWH+6Ja&30uXQ7oiRi#@tp zf-aLPf=$5p_*>UP>jc1|Jga$|7}i6nP+X5?l*>7zJ@ zLDPX^<$!+cGxiFn1LFn>esL@WinNK4`xRJqaGg6Bk^|Ta3MV)iEf%{?O?;#TB=BM$ z=xj&`)XI@H{Q5e#%RoWlupopDEUET*wA$+ZPjuv^>MKq}WY0Kgvd z^7ZS9c#z{uERYSA`0h#qz{3<*Ibs`|$}ubAE|bK$ReO>nTfN2NPNN5^AP*hLGd&Ek zW!?7YzDgxXUyuY?Zf_}a7VJCt^@&hW#F3G5dsq-;HP}-z4|{?KJY=PbR7n6lekuA0HIjN5~ze86fU?4#W*D z1$ug!VDugx0tXEcFM{Z9O20qb#R-HC2Nn=kvPAa&{^shTOHqyO;Fp1LS$TO+V$hm6 z$*ZcW$05sVn)%(&>F!^9&H?c?H8;yMRX}BFgAs<%f4%uKlT=@hk@?DW8=QmDV$eu} z0i}^B<$iIw6h!h{%!=i7J1$h(^Y@pn{_e8*knEf-V|a+h?E4MT_>&;fI}oW!a6!j4`EhjVc}^Y zK8OzJ0rFV3138bq&hyBW4oDDm z@59yX*ZR3#`@mKQAs^5#m;Gcm`M;Cdn-LvdSZJPtq`|bJUU37jpmr literal 0 HcmV?d00001 diff --git a/e2e/testcafe-devextreme/tests/dataGrid/sticky/common/etalons/T1279722_band_sticky_columns-headers_with_filter_row_and_grouped_column_(rtl=true).png b/e2e/testcafe-devextreme/tests/dataGrid/sticky/common/etalons/T1279722_band_sticky_columns-headers_with_filter_row_and_grouped_column_(rtl=true).png new file mode 100644 index 0000000000000000000000000000000000000000..e38e7b2e3b0fb5a3dc269ae81fa9bf7cd243b6b1 GIT binary patch literal 7804 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 a9rzE6VcGXEt#F)7qoJasT%dUM?*9OgI~`X5 literal 0 HcmV?d00001 diff --git a/e2e/testcafe-devextreme/tests/dataGrid/sticky/common/withBandColumns.ts b/e2e/testcafe-devextreme/tests/dataGrid/sticky/common/withBandColumns.ts new file mode 100644 index 000000000000..aecf662d300e --- /dev/null +++ b/e2e/testcafe-devextreme/tests/dataGrid/sticky/common/withBandColumns.ts @@ -0,0 +1,52 @@ +import { createScreenshotsComparer } from 'devextreme-screenshot-comparer'; +import DataGrid from 'devextreme-testcafe-models/dataGrid'; +import { safeSizeTest } from '../../../../helpers/safeSizeTest'; +import { createWidget } from '../../../../helpers/createWidget'; +import url from '../../../../helpers/getPageUrl'; + +const DATA_GRID_SELECTOR = '#container'; + +fixture.disablePageReloads`Band sticky columns` + .page(url(__dirname, '../../../container.html')); + +[false, true].forEach((rtlEnabled) => { + // T1279722 + safeSizeTest(`Headers and filter row should display correctly after scrolling to the max right position when there is a grouped column (rtl=${rtlEnabled})`, async (t) => { + const { takeScreenshot, compareResults } = createScreenshotsComparer(t); + const dataGrid = new DataGrid(DATA_GRID_SELECTOR); + + await t.expect(dataGrid.isReady()).ok(); + + await dataGrid.scrollTo(t, { x: rtlEnabled ? 0 : 10000 }); + await takeScreenshot(`T1279722_band_sticky_columns-headers_with_filter_row_and_grouped_column_(rtl=${rtlEnabled}).png`, dataGrid.element); + + await t + .expect(compareResults.isValid()) + .ok(compareResults.errorMessages()); + }, [900, 800]).before(async () => createWidget('dxDataGrid', { + dataSource: [ + { + field0: 1, field1: 1, field2: 1, field3: 1, field4: 1, field5: 1, field6: 1, field7: 1, + }, + ], + keyExpr: 'field0', + width: 500, + columnWidth: 100, + columns: [{ + dataField: 'field0', + fixed: true, + fixedPosition: rtlEnabled ? 'right' : 'left', + }, { + caption: 'Band', + fixed: true, + fixedPosition: rtlEnabled ? 'right' : 'left', + columns: [{ + dataField: 'field1', + groupIndex: 0, + }, 'field2'], + }, 'field3', 'field4', 'field5', 'field6', 'field7'], + showBorders: true, + filterRow: { visible: true }, + rtlEnabled, + })); +}); diff --git a/packages/devextreme/js/__internal/grids/grid_core/columns_controller/m_columns_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/columns_controller/m_columns_controller.ts index 68a489e4222e..7d144de1e3af 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/columns_controller/m_columns_controller.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/columns_controller/m_columns_controller.ts @@ -613,17 +613,26 @@ export class ColumnsController extends modules.Controller { expandColumn = this.columnOption('command:expand'); } - expandColumns = map(expandColumns, (column) => extend({}, column, { - visibleWidth: null, - minWidth: null, - cellTemplate: !isDefined(column.groupIndex) ? column.cellTemplate : null, - headerCellTemplate: null, - fixed: !isDefined(column.groupIndex) || !isFixedFirstGroupColumn ? isColumnFixing : true, - fixedPosition: rtlEnabled ? 'right' : 'left', - }, expandColumn, { - index: column.index, - type: column.type || GROUP_COMMAND_COLUMN_NAME, - })); + expandColumns = map(expandColumns, (column) => extend( + {}, + { + ...column, + ownerBand: undefined, + }, + { + visibleWidth: null, + minWidth: null, + cellTemplate: !isDefined(column.groupIndex) ? column.cellTemplate : null, + headerCellTemplate: null, + fixed: !isDefined(column.groupIndex) || !isFixedFirstGroupColumn ? isColumnFixing : true, + fixedPosition: rtlEnabled ? 'right' : 'left', + }, + expandColumn, + { + index: column.index, + type: column.type || GROUP_COMMAND_COLUMN_NAME, + }, + )); return expandColumns; } diff --git a/packages/devextreme/js/__internal/grids/grid_core/columns_controller/m_columns_controller_utils.ts b/packages/devextreme/js/__internal/grids/grid_core/columns_controller/m_columns_controller_utils.ts index d45f21c8a25b..c477899f9e21 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/columns_controller/m_columns_controller_utils.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/columns_controller/m_columns_controller_utils.ts @@ -991,7 +991,7 @@ export const isFirstOrLastColumn = function ( ): boolean { const targetColumnIndex = targetColumn.index; const bandColumnsCache = that.getBandColumnsCache(); - const parentBandColumns = getParentBandColumns(targetColumnIndex, bandColumnsCache.columnParentByIndex); + const parentBandColumns = !isDefined(targetColumn.type) && getParentBandColumns(targetColumnIndex, bandColumnsCache.columnParentByIndex); if (parentBandColumns?.length) { return isFirstOrLastBandColumn(that, parentBandColumns.concat([targetColumn]), onlyWithinBandColumn, isLast, fixedPosition); From 0d5e55b1e932f854a9abc3592dbc953b177cedca Mon Sep 17 00:00:00 2001 From: Arman Boyakhchyan Date: Thu, 21 Aug 2025 12:38:51 +0400 Subject: [PATCH 034/101] Chart: Add minor fix to Tooltip API demo desc. (#30834) --- apps/demos/Demos/Charts/TooltipAPI/description.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/demos/Demos/Charts/TooltipAPI/description.md b/apps/demos/Demos/Charts/TooltipAPI/description.md index 849570844af8..b3d853e9cae8 100644 --- a/apps/demos/Demos/Charts/TooltipAPI/description.md +++ b/apps/demos/Demos/Charts/TooltipAPI/description.md @@ -1,2 +1,2 @@ -You can use tooltip API members to manage its visibility in code. This demo creates a [DevExtreme PieChart](/Documentation/Guide/UI_Components/PieChart/Getting_Started_with_PieChart/) and disables its default tooltip. When you click a pie segment or select an item in the **Choose Region** [box], the [showTooltip()](/Documentation/ApiReference/UI_Components/dxChart/Chart_Elements/Point/Methods/#showTooltip) method call displays a tooltip. +You can use tooltip API members to manage its visibility in code. This demo creates a [DevExtreme PieChart](/Documentation/Guide/UI_Components/PieChart/Getting_Started_with_PieChart/) and disables its default tooltip. When you click a pie segment or select an item in the "Choose Region" box, a [showTooltip()](/Documentation/ApiReference/UI_Components/dxChart/Chart_Elements/Point/Methods/#showTooltip) method call displays the corresponding tooltip. \ No newline at end of file From 6e1c6c0b14798e39e0fc786620c4675f99491170 Mon Sep 17 00:00:00 2001 From: Alexander Kozlovskiy Date: Thu, 21 Aug 2025 13:34:34 +0300 Subject: [PATCH 035/101] Chat - group content and bubble elements should be attached to DOM before template render (T1304688) (#30803) --- .../js/__internal/ui/chat/messagegroup.ts | 11 +++++------ .../chatParts/messageGroup.tests.js | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/packages/devextreme/js/__internal/ui/chat/messagegroup.ts b/packages/devextreme/js/__internal/ui/chat/messagegroup.ts index dccf56e4b2e1..a31a9dd8af7c 100644 --- a/packages/devextreme/js/__internal/ui/chat/messagegroup.ts +++ b/packages/devextreme/js/__internal/ui/chat/messagegroup.ts @@ -113,11 +113,10 @@ class MessageGroup extends Widget { _renderMessageBubble(message: Message): void { const $bubble = $('
') - .data(MESSAGE_DATA_KEY, message); + .data(MESSAGE_DATA_KEY, message) + .appendTo(this._$messageBubbleContainer); this._createComponent($bubble, MessageBubble, this._getMessageBubbleOptions(message)); - - this._$messageBubbleContainer.append($bubble); } _getMessageBubbleOptions(message: Message): MessageBubbleProperties { @@ -145,7 +144,9 @@ class MessageGroup extends Widget { } _renderMessageBubbles(items: Message[]): void { - this._$messageBubbleContainer = $('
').addClass(CHAT_MESSAGEGROUP_CONTENT_CLASS); + this._$messageBubbleContainer = $('
') + .addClass(CHAT_MESSAGEGROUP_CONTENT_CLASS) + .appendTo(this.element()); items.forEach((message, index) => { const shouldCreateEditedElement = index !== 0 && message.type !== 'image' && (message as TextMessage).isEdited === true && !message.isDeleted; @@ -158,8 +159,6 @@ class MessageGroup extends Widget { this._renderMessageBubble(message); }); - - this._$messageBubbleContainer.appendTo(this.element()); } _renderMessageGroupInformation(message: Message, shouldRenderEditedMessage?: boolean): void { diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/chatParts/messageGroup.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/chatParts/messageGroup.tests.js index 57c0dd780dff..3264dcc252fd 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/chatParts/messageGroup.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/chatParts/messageGroup.tests.js @@ -8,6 +8,7 @@ import localization from 'localization'; const AVATAR_CLASS = 'dx-avatar'; const CHAT_MESSAGEGROUP_TIME_CLASS = 'dx-chat-messagegroup-time'; const CHAT_MESSAGEBUBBLE_CLASS = 'dx-chat-messagebubble'; +const CHAT_MESSAGEGROUP_CONTENT_CLASS = 'dx-chat-messagegroup-content'; const CHAT_MESSAGEGROUP_AUTHOR_NAME_CLASS = 'dx-chat-messagegroup-author-name'; const CHAT_MESSAGE_EDITED_TEXT_CLASS = 'dx-chat-message-edited-text'; @@ -310,6 +311,21 @@ QUnit.module('MessageGroup', moduleConfig, () => { assert.strictEqual(messageTemplate.callCount, 1, 'messageTemplate function was called on bubble template render'); assert.deepEqual(messageTemplate.lastCall.args[0], message, 'messageTemplate function was called with correct data'); }); + + QUnit.test('Group content and bubble elements should be attached to DOM before template is rendrered (T1304688)', function(assert) { + assert.expect(2); + + this.reinit({ + items: [{ text: 'some text' }], + messageTemplate: () => { + const $groupContent = this.$element.find(`.${CHAT_MESSAGEGROUP_CONTENT_CLASS}`); + const $bubble = this.$element.find(`.${CHAT_MESSAGEBUBBLE_CLASS}`); + + assert.strictEqual($groupContent.length, 1, 'group content element exists'); + assert.strictEqual($bubble.length, 1, 'bubble element exists'); + }, + }); + }); }); QUnit.module('localization', moduleConfig, () => { From fd856d7f97b986f694027d342c454c483e66e690 Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Thu, 21 Aug 2025 14:06:48 +0300 Subject: [PATCH 036/101] feat(StateManager): create the first version (#30472) --- .gitignore | 4 +- apps/react-storybook/.storybook/main.ts | 1 + apps/react-storybook/package.json | 4 +- packages/devextreme/build/gulp/context.js | 3 +- packages/devextreme/build/gulp/js-bundles.js | 22 +- .../__tests__/build_state_manager.test.js | 172 ++++++++++++ .../build/gulp/state_manager/constants.js | 11 + .../build/gulp/state_manager/index.js | 2 + ...emove_development_state_manager_modules.js | 44 +++ ...ce_state_manager_modules_for_production.js | 42 +++ packages/devextreme/build/gulp/transpile.js | 2 +- packages/devextreme/eslint.config.mjs | 4 + packages/devextreme/eslint_plugins/index.js | 7 + .../no_direct_preact_signals_core_import.js | 65 +++++ ..._direct_preact_signals_core_import.test.js | 82 ++++++ packages/devextreme/gulpfile.js | 14 +- packages/devextreme/jest.config.js | 80 ++++-- .../js/__internal/core/di/index.test.ts | 124 ++++++++- .../devextreme/js/__internal/core/di/index.ts | 38 ++- .../core/state_manager/dev/event_emitter.ts | 32 +++ .../core/state_manager/dev/index.ts | 13 + .../core/state_manager/dev/logger.ts | 62 +++++ .../preact_signal_value_container_manager.ts | 96 +++++++ .../dev/reactive_primitives/index.ts | 63 +++++ .../dev/redux_dev_tools_connector.ts | 152 +++++++++++ .../state_manager/dev/setup_state_manager.ts | 73 +++++ .../core/state_manager/dev/state_manager.ts | 201 ++++++++++++++ .../core/state_manager/dev/types.ts | 148 ++++++++++ .../core/state_manager/dev/utils.ts | 65 +++++ .../js/__internal/core/state_manager/index.ts | 1 + .../core/state_manager/prod/index.ts | 14 + .../prod/reactive_primitives/index.ts | 39 +++ .../prod/reactive_primitives/types.ts | 16 ++ .../state_manager/reactive_primitives.test.ts | 81 ++++++ .../core/state_manager/state_manager.test.ts | 256 ++++++++++++++++++ .../core/state_manager/utils.test.ts | 155 +++++++++++ .../grids/new/card_view/content_view/view.tsx | 2 +- .../js/__internal/grids/new/card_view/di.ts | 3 + .../grids/new/card_view/header_panel/view.tsx | 2 +- .../grids/new/card_view/main_view.tsx | 2 +- .../new/grid_core/accessibility/controller.ts | 2 +- .../column_chooser/controller.mock.ts | 2 +- .../grid_core/column_chooser/controller.ts | 2 +- .../new/grid_core/column_chooser/view.tsx | 4 +- .../columns_controller/columns_controller.ts | 4 +- .../grids/new/grid_core/content_view/view.tsx | 2 +- .../grids/new/grid_core/context_menu/view.ts | 4 +- .../grids/new/grid_core/core/view.tsx | 4 +- .../data_controller/compatibility.ts | 2 +- .../data_controller/data_controller.ts | 4 +- .../store_load_adapter.test.ts | 2 +- .../store_load_adapter/store_load_adapter.ts | 2 +- .../grids/new/grid_core/editing/controller.ts | 2 +- .../grids/new/grid_core/editing/popup/view.ts | 4 +- .../error_controller/error_controller.ts | 4 +- .../grid_core/filtering/filter_controller.ts | 2 +- .../grid_core/filtering/filter_panel/view.tsx | 2 +- .../filtering/filter_sync/controller.ts | 6 +- .../filtering/header_filter/controller.ts | 4 +- .../filtering/header_filter/view.test.tsx | 2 +- .../filtering/header_filter/view.tsx | 2 +- .../header_filter/view_controller.ts | 4 +- .../items_controller/items_controller.ts | 2 +- .../options_controller/component.mock.ts | 2 +- .../options_controller_base.ts | 4 +- .../grids/new/grid_core/pager/view.tsx | 4 +- .../grids/new/grid_core/search/controller.ts | 4 +- .../grids/new/grid_core/search/view.tsx | 4 +- .../new/grid_core/selection/controller.ts | 4 +- .../sorting_controller/controller.ts | 4 +- .../new/grid_core/toolbar/controller.test.ts | 2 +- .../grids/new/grid_core/toolbar/controller.ts | 4 +- .../grids/new/grid_core/toolbar/view.tsx | 4 +- .../__internal/grids/new/grid_core/widget.ts | 4 +- .../devextreme/js/__internal/tsconfig.json | 6 + packages/devextreme/package.json | 4 +- packages/devextreme/project.json | 3 +- .../testing/runner/Views/Main/RunSuite.cshtml | 4 + pnpm-lock.yaml | 178 ++++++------ 79 files changed, 2283 insertions(+), 217 deletions(-) create mode 100644 packages/devextreme/build/gulp/state_manager/__tests__/build_state_manager.test.js create mode 100644 packages/devextreme/build/gulp/state_manager/constants.js create mode 100644 packages/devextreme/build/gulp/state_manager/index.js create mode 100644 packages/devextreme/build/gulp/state_manager/remove_development_state_manager_modules.js create mode 100644 packages/devextreme/build/gulp/state_manager/replace_state_manager_modules_for_production.js create mode 100644 packages/devextreme/eslint_plugins/index.js create mode 100644 packages/devextreme/eslint_plugins/no_direct_preact_signals_core_import.js create mode 100644 packages/devextreme/eslint_plugins/no_direct_preact_signals_core_import.test.js create mode 100644 packages/devextreme/js/__internal/core/state_manager/dev/event_emitter.ts create mode 100644 packages/devextreme/js/__internal/core/state_manager/dev/index.ts create mode 100644 packages/devextreme/js/__internal/core/state_manager/dev/logger.ts create mode 100644 packages/devextreme/js/__internal/core/state_manager/dev/preact_signal_value_container_manager.ts create mode 100644 packages/devextreme/js/__internal/core/state_manager/dev/reactive_primitives/index.ts create mode 100644 packages/devextreme/js/__internal/core/state_manager/dev/redux_dev_tools_connector.ts create mode 100644 packages/devextreme/js/__internal/core/state_manager/dev/setup_state_manager.ts create mode 100644 packages/devextreme/js/__internal/core/state_manager/dev/state_manager.ts create mode 100644 packages/devextreme/js/__internal/core/state_manager/dev/types.ts create mode 100644 packages/devextreme/js/__internal/core/state_manager/dev/utils.ts create mode 100644 packages/devextreme/js/__internal/core/state_manager/index.ts create mode 100644 packages/devextreme/js/__internal/core/state_manager/prod/index.ts create mode 100644 packages/devextreme/js/__internal/core/state_manager/prod/reactive_primitives/index.ts create mode 100644 packages/devextreme/js/__internal/core/state_manager/prod/reactive_primitives/types.ts create mode 100644 packages/devextreme/js/__internal/core/state_manager/reactive_primitives.test.ts create mode 100644 packages/devextreme/js/__internal/core/state_manager/state_manager.test.ts create mode 100644 packages/devextreme/js/__internal/core/state_manager/utils.test.ts diff --git a/.gitignore b/.gitignore index 80a08884b786..5764ac370ff3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ # See http://help.github.com/ignore-files/ for more about ignoring files. +# tests +__test-artifacts__ + # compiled output npm dist @@ -26,7 +29,6 @@ node_modules !.vscode/launch.json !.vscode/extensions.json - # System Files .DS_Store Thumbs.db diff --git a/apps/react-storybook/.storybook/main.ts b/apps/react-storybook/.storybook/main.ts index 6e4d7008e0d9..c274ca873d04 100644 --- a/apps/react-storybook/.storybook/main.ts +++ b/apps/react-storybook/.storybook/main.ts @@ -1,5 +1,6 @@ import type { StorybookConfig } from "@storybook/react-webpack5"; import path from 'path'; + const getAbsolutePath = (packageName: string): any => path.dirname(require.resolve(path.join(packageName, 'package.json'))); diff --git a/apps/react-storybook/package.json b/apps/react-storybook/package.json index 8a96c86a288a..480ecf1b84c1 100644 --- a/apps/react-storybook/package.json +++ b/apps/react-storybook/package.json @@ -6,7 +6,8 @@ "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "storybook dev -p 6006", - "build": "storybook build" + "build": "storybook build", + "serve": "http-server storybook-static -p 6006 -c-1" }, "author": "", "license": "ISC", @@ -26,6 +27,7 @@ "@storybook/react": "7.6.19", "@storybook/react-webpack5": "7.6.19", "@storybook/test": "7.6.19", + "http-server": "14.1.1", "prop-types": "15.8.1", "react": "18.0.0", "react-dom": "18.0.0", diff --git a/packages/devextreme/build/gulp/context.js b/packages/devextreme/build/gulp/context.js index 26f4662b67fb..101751f6fe7b 100644 --- a/packages/devextreme/build/gulp/context.js +++ b/packages/devextreme/build/gulp/context.js @@ -19,5 +19,6 @@ module.exports = { TRANSPILED_RENOVATION_PATH: 'artifacts/transpiled-renovation', TRANSPILED_PROD_ESM_PATH: 'artifacts/transpiled-esm-npm', SCSS_PACKAGE_PATH: '../devextreme-scss', - EULA_URL: 'https://js.devexpress.com/Licensing/' + EULA_URL: 'https://js.devexpress.com/Licensing/', + REMOVE_NON_PRODUCTION_MODULE: argv.uglify, }; diff --git a/packages/devextreme/build/gulp/js-bundles.js b/packages/devextreme/build/gulp/js-bundles.js index b8a7792a1497..875f779191c1 100644 --- a/packages/devextreme/build/gulp/js-bundles.js +++ b/packages/devextreme/build/gulp/js-bundles.js @@ -15,7 +15,6 @@ const ctx = require('./context.js'); const headerPipes = require('./header-pipes.js'); const webpackConfig = require('../../webpack.config.js'); const env = require('./env-variables.js'); - const namedDebug = lazyPipe() .pipe(named, (file) => path.basename(file.path, path.extname(file.path)) + '.debug'); @@ -30,15 +29,18 @@ const DEBUG_BUNDLES = BUNDLES.concat([ '/bundles/dx.custom.js' ]); const processBundles = (bundles, pathPrefix) => bundles.map((bundle) => pathPrefix + bundle); const muteWebPack = () => undefined; -const getWebpackConfig = () => env.BUILD_INTERNAL_PACKAGE || env.BUILD_TEST_INTERNAL_PACKAGE ? - Object.assign({ - plugins: [ - new webpack.NormalModuleReplacementPlugin(/(.*)\/license_validation/, resource => { - resource.request = resource.request.replace('license_validation', 'license_validation_internal'); - }) - ] - }, webpackConfig) : - webpackConfig; +const getWebpackConfig = () => { + const plugins = []; + const isInternalBuild = env.BUILD_INTERNAL_PACKAGE || env.BUILD_TEST_INTERNAL_PACKAGE; + + if (isInternalBuild) { + plugins.push(new webpack.NormalModuleReplacementPlugin(/(.*)\/license_validation/, resource => { + resource.request = resource.request.replace('license_validation', 'license_validation_internal'); + })); + } + + return Object.assign(webpackConfig, { plugins }); +}; const bundleProdPipe = lazyPipe() .pipe(named) diff --git a/packages/devextreme/build/gulp/state_manager/__tests__/build_state_manager.test.js b/packages/devextreme/build/gulp/state_manager/__tests__/build_state_manager.test.js new file mode 100644 index 000000000000..bc92bbb1d7d4 --- /dev/null +++ b/packages/devextreme/build/gulp/state_manager/__tests__/build_state_manager.test.js @@ -0,0 +1,172 @@ +const fs = require('fs'); +const path = require('path'); +const through2 = require('through2'); +const Vinyl = require('vinyl'); +const replaceStateManagerModulesForProduction = require('../replace_state_manager_modules_for_production'); +const { removeDevelopmentStateManagerModules } = require('../remove_development_state_manager_modules'); + +const createEnvContent = (env) => ({ + index: [ + `export { setupStateManager } from './setup_state_manager';`, + `export { signal } from './reactive_primitives/index';` + ].join('\n'), + setupStateManager: `export const setupStateManager = () => { + // this setupStateManager function body is for ${env} build + }`, + reactivePrimitivesIndex: `export const signal = () => { + // this signal function body is for ${env} build + }`, +}); + +const PROD_DIR_CONTENT = createEnvContent('prod'); +const DEV_DIR_CONTENT = createEnvContent('dev'); + +const INDEX_DEV_CONTENT = `export { setupStateManager, signal } from './dev/index';`; +const INDEX_PROD_CONTENT = `export * from './prod/index';`; + +const FILE_OUTSIDE_OF_ENV_SPECIFIC_FOLDER_CONTENT = 'test content'; +const FILE_OUTSIDE_STATE_MANGER_CONTENT = 'console.log("file outside of state manager");'; + +describe('Build the state manager', () => { + let testsContext; + let originalConsoleError; + let consoleErrorSpy; + + const createEnvPaths = (baseDir, env) => ({ + reactivePrimitivesDir: path.join(baseDir, env, 'reactive_primitives'), + reactivePrimitivesIndex: path.join(baseDir, env, 'reactive_primitives', 'index.js'), + setupStateManager: path.join(baseDir, env, 'setup_state_manager.js'), + index: path.join(baseDir, env, 'index.js'), + }); + + const createEnvFiles = (paths, content) => { + Object.entries(paths).forEach(([key, filePath]) => { + if (filePath.endsWith('.js') && content[key]) { + fs.writeFileSync(filePath, content[key]); + } + }); + }; + + const createEnvSpecificStreamFileObjects = (paths, content) => { + return Object.entries(paths) + .filter(([key, filePath]) => filePath.endsWith('.js') && content[key]) + .map(([key, filePath]) => new Vinyl({ + path: filePath, + contents: Buffer.from(content[key]) + })); + }; + + beforeEach(() => { + const stream = replaceStateManagerModulesForProduction(); + const tempDir = path.join(__dirname, '__test-artifacts__'); + + if (fs.existsSync(tempDir)) { + fs.rmSync(tempDir, { recursive: true, force: true }); + } + + const devextremeDir = path.join(tempDir, 'devextreme'); + const stateManagerDir = path.join(devextremeDir, 'esm', '__internal', 'core', 'state_manager'); + const devDir = path.join(stateManagerDir, 'dev'); + const prodDir = path.join(stateManagerDir, 'prod'); + + const devPaths = createEnvPaths(stateManagerDir, 'dev'); + const prodPaths = createEnvPaths(stateManagerDir, 'prod'); + + const indexFilePath = path.join(stateManagerDir, 'index.js'); + const fileOutsideOfEnvSpecificFolderFilePath = path.join(stateManagerDir, 'state_manager.test.js'); + const fileOutsideStateMangerPath = path.join(tempDir, 'other_file.js'); + + fs.mkdirSync(stateManagerDir, { recursive: true }); + fs.mkdirSync(devDir, { recursive: true }); + fs.mkdirSync(prodDir, { recursive: true }); + fs.mkdirSync(devPaths.reactivePrimitivesDir, { recursive: true }); + fs.mkdirSync(prodPaths.reactivePrimitivesDir, { recursive: true }); + + fs.writeFileSync(indexFilePath, INDEX_DEV_CONTENT); + fs.writeFileSync(fileOutsideOfEnvSpecificFolderFilePath, FILE_OUTSIDE_OF_ENV_SPECIFIC_FOLDER_CONTENT); + fs.writeFileSync(fileOutsideStateMangerPath, FILE_OUTSIDE_STATE_MANGER_CONTENT); + + createEnvFiles(devPaths, DEV_DIR_CONTENT); + createEnvFiles(prodPaths, PROD_DIR_CONTENT); + + originalConsoleError = console.error; + consoleErrorSpy = jest.fn(); + console.error = consoleErrorSpy; + + const files = [ + ...createEnvSpecificStreamFileObjects(prodPaths, PROD_DIR_CONTENT), + ...createEnvSpecificStreamFileObjects(devPaths, DEV_DIR_CONTENT), + new Vinyl({ + path: fileOutsideStateMangerPath, + contents: Buffer.from(FILE_OUTSIDE_STATE_MANGER_CONTENT) + }), + new Vinyl({ + path: fileOutsideOfEnvSpecificFolderFilePath, + contents: Buffer.from(FILE_OUTSIDE_OF_ENV_SPECIFIC_FOLDER_CONTENT) + }), + new Vinyl({ + path: indexFilePath, + contents: Buffer.from(INDEX_DEV_CONTENT) + }), + ]; + + stream.on('data', (file) => { + fs.writeFileSync(file.path, file.contents.toString()); + }); + + files.forEach(file => stream.write(file)); + stream.end(); + + testsContext = { + stream, + devextremeDir, + devDir, + prodPaths, + indexFilePath, + fileOutsideOfEnvSpecificFolderFilePath, + fileOutsideStateMangerPath + }; + }); + + afterEach(() => { + console.error = originalConsoleError; + }); + + const runTestWithStream = (testFn) => { + return (done) => { + testsContext.stream.on('end', () => { + try { + testFn(); + done(); + } catch (error) { + done(error); + } + }); + testsContext.stream.on('error', done); + }; + }; + + it('should remove development modules', runTestWithStream(() => { + removeDevelopmentStateManagerModules(testsContext.devextremeDir); + + expect(fs.existsSync(testsContext.devDir)).toBe(false); + expect(fs.existsSync(testsContext.fileOutsideOfEnvSpecificFolderFilePath)).toBe(false); + expect(consoleErrorSpy).not.toHaveBeenCalled(); + })); + + it('should not remove modules that are unrelated to the state manager', runTestWithStream(() => { + removeDevelopmentStateManagerModules(testsContext.devextremeDir); + + const fileOutsideStateMangerPathContent = fs.readFileSync(testsContext.fileOutsideStateMangerPath, 'utf8'); + expect(fileOutsideStateMangerPathContent).toBe(FILE_OUTSIDE_STATE_MANGER_CONTENT); + })); + + it('should replace `index.js` content by `prod/index.js` content', runTestWithStream(() => { + removeDevelopmentStateManagerModules(testsContext.devextremeDir); + + const indexFileContent = fs.readFileSync(testsContext.indexFilePath, 'utf8'); + expect(indexFileContent).toBe(INDEX_PROD_CONTENT); + expect(fs.existsSync(testsContext.prodPaths.index)).toBe(true); + expect(consoleErrorSpy).not.toHaveBeenCalled(); + })); +}); diff --git a/packages/devextreme/build/gulp/state_manager/constants.js b/packages/devextreme/build/gulp/state_manager/constants.js new file mode 100644 index 000000000000..b962f97ebd6f --- /dev/null +++ b/packages/devextreme/build/gulp/state_manager/constants.js @@ -0,0 +1,11 @@ +const path = require('path'); + +const STATE_MANAGER_FOLDER_PATH = path.join('__internal', 'core', 'state_manager'); +const STATE_MANAGER_INDEX_MODULE_PATH = path.join(STATE_MANAGER_FOLDER_PATH, 'index.js'); +const STATE_MANAGER_PROD_FOLDER_PATH = path.join(STATE_MANAGER_FOLDER_PATH, 'prod'); + +module.exports = { + STATE_MANAGER_FOLDER_PATH, + STATE_MANAGER_INDEX_MODULE_PATH, + STATE_MANAGER_PROD_FOLDER_PATH +}; diff --git a/packages/devextreme/build/gulp/state_manager/index.js b/packages/devextreme/build/gulp/state_manager/index.js new file mode 100644 index 000000000000..40a8f4119714 --- /dev/null +++ b/packages/devextreme/build/gulp/state_manager/index.js @@ -0,0 +1,2 @@ +require('./remove_development_state_manager_modules'); +require('./replace_state_manager_modules_for_production') diff --git a/packages/devextreme/build/gulp/state_manager/remove_development_state_manager_modules.js b/packages/devextreme/build/gulp/state_manager/remove_development_state_manager_modules.js new file mode 100644 index 000000000000..0e59fab38ecc --- /dev/null +++ b/packages/devextreme/build/gulp/state_manager/remove_development_state_manager_modules.js @@ -0,0 +1,44 @@ +'use strict'; + +const path = require('path'); +const gulp = require('gulp'); +const del = require('del'); +const { + STATE_MANAGER_FOLDER_PATH, + STATE_MANAGER_INDEX_MODULE_PATH, + STATE_MANAGER_PROD_FOLDER_PATH +} = require('./constants'); +const ctx = require('../context'); + +const MODULE_TYPES = ['esm', 'cjs']; + +const removeDevelopmentStateManagerModules = (targetPath) => { + const patterns = []; + + MODULE_TYPES.forEach(type => { + patterns.push(`${path.join(targetPath, type, STATE_MANAGER_FOLDER_PATH)}/**`); + }); + + MODULE_TYPES.forEach(type => { + patterns.push(`!${path.join(targetPath, type, STATE_MANAGER_FOLDER_PATH)}`); + patterns.push(`!${path.join(targetPath, type, STATE_MANAGER_INDEX_MODULE_PATH)}`); + patterns.push(`!${path.join(targetPath, type, STATE_MANAGER_PROD_FOLDER_PATH)}`); + patterns.push(`!${path.join(targetPath, type, STATE_MANAGER_PROD_FOLDER_PATH)}/**`); + }); + + del.sync(patterns); +} + +const createRemoveDevelopmentStateManagerModulesTask = (targetPath) => (done) => { + removeDevelopmentStateManagerModules(targetPath); + done(); +}; + +gulp.task('state-manager-remove-development-only-modules-transpiled-prod-esm', createRemoveDevelopmentStateManagerModulesTask(ctx.TRANSPILED_PROD_ESM_PATH)); + +gulp.task('state-manager-remove-development-only-modules-transpiled-prod-renovation', createRemoveDevelopmentStateManagerModulesTask(ctx.TRANSPILED_PROD_RENOVATION_PATH)); + +module.exports = { + removeDevelopmentStateManagerModules, + createRemoveDevelopmentStateManagerModulesTask +}; diff --git a/packages/devextreme/build/gulp/state_manager/replace_state_manager_modules_for_production.js b/packages/devextreme/build/gulp/state_manager/replace_state_manager_modules_for_production.js new file mode 100644 index 000000000000..c4d2904f8f86 --- /dev/null +++ b/packages/devextreme/build/gulp/state_manager/replace_state_manager_modules_for_production.js @@ -0,0 +1,42 @@ +'use strict'; + +const gulp = require('gulp'); +const through2 = require('through2'); +const path = require('path'); +const fs = require('fs'); +const babel = require('@babel/core'); +const transpileConfig = require('../transpile-config'); +const { + STATE_MANAGER_FOLDER_PATH, + STATE_MANAGER_INDEX_MODULE_PATH, +} = require('./constants'); +const ctx = require('../context'); + +const ERROR_PREFIX = 'Error during replacing the state manager modules:'; + +function replaceStateManagerModulesForProduction() { + return through2.obj(function(file, enc, callback) { + if (file.path.includes(STATE_MANAGER_INDEX_MODULE_PATH)) { + try { + file.contents = Buffer.from(`export * from './prod/index';`); + } catch (error) { + console.error(ERROR_PREFIX, error); + } + } + + callback(null, file); + }); +} + +const prepareStateManager = (dist) => gulp.series.apply(gulp, [ + () => gulp + .src(`${dist}/**/${STATE_MANAGER_FOLDER_PATH}/**`) + .pipe(replaceStateManagerModulesForProduction()) + .pipe(gulp.dest(dist)), +]); + +gulp.task('state-manager-replace-production-modules-transpiled-prod-esm', prepareStateManager(ctx.TRANSPILED_PROD_ESM_PATH)); + +gulp.task('state-manager-replace-production-modules-transpiled-prod-renovation', prepareStateManager(ctx.TRANSPILED_PROD_RENOVATION_PATH)); + +module.exports = replaceStateManagerModulesForProduction; diff --git a/packages/devextreme/build/gulp/transpile.js b/packages/devextreme/build/gulp/transpile.js index f394c310bcea..dc80cf0ef746 100644 --- a/packages/devextreme/build/gulp/transpile.js +++ b/packages/devextreme/build/gulp/transpile.js @@ -196,7 +196,7 @@ const transpileProd = (dist, isEsm) => transpile( ], tsPipes: [ removeDebug(), - isEsm ? babel(transpileConfig.esm) : babel(transpileConfig.tsCjs) + isEsm ? babel(transpileConfig.esm) : babel(transpileConfig.tsCjs), ] }, ); diff --git a/packages/devextreme/eslint.config.mjs b/packages/devextreme/eslint.config.mjs index 6a7bfc4d2bb2..3cbb13251ca5 100644 --- a/packages/devextreme/eslint.config.mjs +++ b/packages/devextreme/eslint.config.mjs @@ -12,6 +12,7 @@ import importPlugin from 'eslint-plugin-import'; import globals from 'globals'; import simpleImportSort from 'eslint-plugin-simple-import-sort'; import { changeRulesToStylistic } from 'eslint-migration-utils'; +import customRules from './eslint_plugins/index.js'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -47,6 +48,7 @@ export default [ plugins: { 'no-only-tests': noOnlyTests, i18n: i18N, + 'devextreme-custom': customRules, }, settings: { 'import/resolver': { @@ -164,6 +166,7 @@ export default [ 'import/named': 2, 'import/default': 2, 'import/no-duplicates': 2, + 'devextreme-custom/no-direct-preact-signals-core-import': 'error', }, plugins: { '@stylistic': stylistic, @@ -214,6 +217,7 @@ export default [ '@typescript-eslint/switch-exhaustiveness-check': ['error', { considerDefaultExhaustiveForUnions: true, }], + 'devextreme-custom/no-direct-preact-signals-core-import': 'error', }, }, ...compat.extends('devextreme/typescript').map(config => { diff --git a/packages/devextreme/eslint_plugins/index.js b/packages/devextreme/eslint_plugins/index.js new file mode 100644 index 000000000000..fd8fc155fdba --- /dev/null +++ b/packages/devextreme/eslint_plugins/index.js @@ -0,0 +1,7 @@ +const noDirectPreactSignalsCoreImport = require('./no_direct_preact_signals_core_import'); + +module.exports = { + rules: { + 'no-direct-preact-signals-core-import': noDirectPreactSignalsCoreImport, + }, +}; diff --git a/packages/devextreme/eslint_plugins/no_direct_preact_signals_core_import.js b/packages/devextreme/eslint_plugins/no_direct_preact_signals_core_import.js new file mode 100644 index 000000000000..9f6c848e400f --- /dev/null +++ b/packages/devextreme/eslint_plugins/no_direct_preact_signals_core_import.js @@ -0,0 +1,65 @@ +/* eslint-disable spellcheck/spell-checker */ + +const INVALID_IMPORT = '@preact/signals-core'; +const STATE_MANAGER_PATH = '/core/state_manager/'; +const VALID_IMPORT = '"@ts/core/state_manager/index"'; + +function validate(context, node, sourceNode) { + const filename = context.getFilename(); + const isStateManagerModule = filename.includes(STATE_MANAGER_PATH); + + if(!isStateManagerModule) { + context.report({ + node: sourceNode, + messageId: 'noDirectImport', + fix(fixer) { + return fixer.replaceText(sourceNode, VALID_IMPORT); + }, + }); + } +} + +module.exports = { + meta: { + type: 'problem', + docs: { + description: 'Prevent direct imports from @preact/signals-core and enforce usage of the state manager.', + }, + fixable: 'code', + schema: [], + messages: { + noDirectImport: 'Direct imports from "@preact/signals-core" are not allowed. Use "@ts/core/state_manager/index" instead.', + }, + }, + + create(context) { + return { + ImportDeclaration(node) { + if(node.source.value === INVALID_IMPORT) { + validate(context, node, node.source); + } + }, + + ImportExpression(node) { + if( + node.source.type === 'Literal' && + node.source.value === INVALID_IMPORT + ) { + validate(context, node, node.source); + } + }, + + CallExpression(node) { + if( + node.callee.type === 'Identifier' && + node.callee.name === 'require' && + node.arguments.length === 1 && + node.arguments[0].type === 'Literal' && + node.arguments[0].value === INVALID_IMPORT + ) { + validate(context, node, node.arguments[0]); + } + }, + }; + }, +}; diff --git a/packages/devextreme/eslint_plugins/no_direct_preact_signals_core_import.test.js b/packages/devextreme/eslint_plugins/no_direct_preact_signals_core_import.test.js new file mode 100644 index 000000000000..e6ef640c379e --- /dev/null +++ b/packages/devextreme/eslint_plugins/no_direct_preact_signals_core_import.test.js @@ -0,0 +1,82 @@ +/* eslint-disable spellcheck/spell-checker */ +const { RuleTester } = require('eslint'); +const rule = require('./no_direct_preact_signals_core_import'); + +const ruleTester = new RuleTester({ + languageOptions: { + ecmaVersion: 2020, + sourceType: 'module', + }, +}); + +ruleTester.run('no-direct-preact-signals-core-import', rule, { + valid: [ + { + code: 'import { signal } from \'@preact/signals-core\';', + filename: '/path/to/core/state_manager/file.ts', + }, + { + code: 'import * as SignalsCore from \'@preact/signals-core\';', + filename: '/path/to/core/state_manager/reactive_primitives/index.ts', + }, + { + code: 'import { signal } from \'@ts/core/state_manager/index\';', + filename: '/path/to/some/component.ts', + }, + { + code: 'const signals = import(\'@preact/signals-core\');', + filename: '/path/to/core/state_manager/file.ts', + }, + { + code: 'const signals = require(\'@preact/signals-core\');', + filename: '/path/to/core/state_manager/file.ts', + }, + ], + + invalid: [ + { + code: 'import { signal } from \'@preact/signals-core\';', + filename: '/path/to/some/component.ts', + errors: [ + { + messageId: 'noDirectImport', + type: 'Literal', + }, + ], + output: 'import { signal } from "@ts/core/state_manager/index";', + }, + { + code: 'import * as SignalsCore from \'@preact/signals-core\';', + filename: '/path/to/some/component.ts', + errors: [ + { + messageId: 'noDirectImport', + type: 'Literal', + }, + ], + output: 'import * as SignalsCore from "@ts/core/state_manager/index";', + }, + { + code: 'const signals = import(\'@preact/signals-core\');', + filename: '/path/to/some/component.ts', + errors: [ + { + messageId: 'noDirectImport', + type: 'Literal', + }, + ], + output: 'const signals = import("@ts/core/state_manager/index");', + }, + { + code: 'const signals = require(\'@preact/signals-core\');', + filename: '/path/to/some/component.ts', + errors: [ + { + messageId: 'noDirectImport', + type: 'Literal', + }, + ], + output: 'const signals = require("@ts/core/state_manager/index");', + }, + ], +}); diff --git a/packages/devextreme/gulpfile.js b/packages/devextreme/gulpfile.js index a24b2c4333b7..e6fb12991b30 100644 --- a/packages/devextreme/gulpfile.js +++ b/packages/devextreme/gulpfile.js @@ -6,6 +6,7 @@ const multiProcess = require('gulp-multi-process'); const env = require('./build/gulp/env-variables'); const cache = require('gulp-cache'); const shell = require('gulp-shell'); +const { REMOVE_NON_PRODUCTION_MODULE } = require('./build/gulp/context'); gulp.task('clean', function(callback) { require('del').sync([ @@ -40,6 +41,7 @@ require('./build/gulp/generator/gulpfile'); require('./build/gulp/check_licenses'); require('./build/gulp/qunit-in-docker'); require('./build/gulp/systemjs'); +require('./build/gulp/state_manager'); if(env.TEST_CI) { console.warn('Using test CI mode!'); @@ -70,12 +72,20 @@ function createDefaultBatch(dev) { tasks.push('localization'); tasks.push(dev ? 'generate-components-dev' : 'generate-components'); tasks.push('transpile'); + + if(REMOVE_NON_PRODUCTION_MODULE) { + tasks.push('state-manager-replace-production-modules-transpiled-prod-renovation'); + tasks.push('state-manager-replace-production-modules-transpiled-prod-esm'); + + tasks.push('state-manager-remove-development-only-modules-transpiled-prod-renovation'); + tasks.push('state-manager-remove-development-only-modules-transpiled-prod-esm'); + } + tasks.push(dev && !env.BUILD_TESTCAFE ? 'main-batch-dev' : 'main-batch'); if(!env.TEST_CI && !dev && !env.BUILD_TESTCAFE) { tasks.push('npm'); tasks.push('check-license-notices'); } - return gulp.series(tasks); } @@ -102,5 +112,3 @@ gulp.task('dev', gulp.series( 'default-dev', 'dev-watch' )); - - diff --git a/packages/devextreme/jest.config.js b/packages/devextreme/jest.config.js index c29fb303d561..8d6bed5febf2 100644 --- a/packages/devextreme/jest.config.js +++ b/packages/devextreme/jest.config.js @@ -1,33 +1,53 @@ /** @type {import('ts-jest').JestConfigWithTsJest} **/ module.exports = { - testEnvironment: '/jsdom-with-timezone.js', - roots: ['/js'], - moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], - moduleNameMapper: { - '@js/(.*)': '/js/$1', - '@ts/(.*)': '/js/__internal/$1', - '@preact/signals-core': '/node_modules/@preact/signals-core/dist/signals-core.js' - }, - modulePathIgnorePatterns: [ - 'node_modules' - ], - preset: 'ts-jest', - testMatch: [ - // TODO: change to '/**/*.test.(ts|tsx)' after removing renovation - '/js/__internal/**/*.test.(ts|tsx)', - ], - transform: { - '\\.[jt]sx?$': ['ts-jest', { - // eslint-disable-next-line spellcheck/spell-checker - tsconfig: '/js/__internal/tsconfig.json', - diagnostics: false, // set to true to enable type checking - isolatedModules: true, // performance optimization https://kulshekhar.github.io/ts-jest/user/config/isolatedModules - babelConfig: { - presets: ['@babel/preset-env'], - plugins: [ - ['babel-plugin-inferno', { 'imports': true }] - ] - } - }], - } + projects: [ + { + displayName: 'jsdom-tests', + testEnvironment: '/jsdom-with-timezone.js', + roots: ['/js'], + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], + moduleNameMapper: { + '@js/(.*)': '/js/$1', + '@ts/(.*)': '/js/__internal/$1', + '@preact/signals-core': '/node_modules/@preact/signals-core/dist/signals-core.js' + }, + modulePathIgnorePatterns: [ + 'node_modules', + '__test-artifacts__' + ], + preset: 'ts-jest', + testMatch: [ + // TODO: change to '/**/*.test.(ts|tsx)' after removing renovation + '/js/__internal/**/*.test.(ts|tsx)', + ], + transform: { + '\\.[jt]sx?$': ['ts-jest', { + // eslint-disable-next-line spellcheck/spell-checker + tsconfig: '/js/__internal/tsconfig.json', + diagnostics: false, // set to true to enable type checking + isolatedModules: true, // performance optimization https://kulshekhar.github.io/ts-jest/user/config/isolatedModules + babelConfig: { + presets: ['@babel/preset-env'], + plugins: [ + ['babel-plugin-inferno', { 'imports': true }] + ] + } + }], + }, + }, + { + displayName: 'node-tests', + testEnvironment: 'node', + modulePathIgnorePatterns: [ + '__test-artifacts__' + ], + roots: ['/build', '/eslint_plugins'], + moduleFileExtensions: ['js'], + testMatch: [ + '/build/**/*.test.js', + '/eslint_plugins/**/*.test.js', + ], + } + ] }; + diff --git a/packages/devextreme/js/__internal/core/di/index.test.ts b/packages/devextreme/js/__internal/core/di/index.test.ts index 4e5ece50a074..2adb5fe1f6af 100644 --- a/packages/devextreme/js/__internal/core/di/index.test.ts +++ b/packages/devextreme/js/__internal/core/di/index.test.ts @@ -1,8 +1,4 @@ -/* eslint-disable @typescript-eslint/no-extraneous-class */ -/* eslint-disable prefer-const */ -/* eslint-disable @typescript-eslint/init-declarations */ /* eslint-disable max-classes-per-file */ -/* eslint-disable class-methods-use-this */ import { describe, expect, it } from '@jest/globals'; import { DIContext } from './index'; @@ -184,3 +180,123 @@ describe('dependency cycle', () => { expect(() => ctx.get(MyClass2)).toThrow(); }); }); + +describe('decorators', () => { + class MyClass { + static dependencies = [] as const; + + value = 1; + + tag = ''; + } + + class AnotherClass { + static dependencies = [] as const; + + counter = 0; + } + + it('should apply global decorators to created instances', () => { + const ctx = new DIContext(); + ctx.register(MyClass); + + ctx.registerDecorator((instance) => { + if (instance instanceof MyClass) { + instance.value = 2; + } + return instance; + }); + + expect(ctx.get(MyClass).value).toBe(2); + }); + + it('should apply global decorators to registered instances', () => { + const ctx = new DIContext(); + const instance = new MyClass(); + + ctx.registerDecorator((obj) => { + if (obj instanceof MyClass) { + obj.value = 3; + } + return obj; + }); + + ctx.registerInstance(MyClass, instance); + + expect(ctx.get(MyClass).value).toBe(3); + expect(instance.value).toBe(3); + }); + + it('should apply multiple global decorators in the correct order', () => { + const ctx = new DIContext(); + ctx.register(MyClass); + + ctx.registerDecorator((instance) => { + if (instance instanceof MyClass) { + instance.value += 1; + instance.tag += 'A'; + } + return instance; + }); + + ctx.registerDecorator((instance) => { + if (instance instanceof MyClass) { + instance.value += 2; + instance.tag += 'B'; + } + return instance; + }); + + const result = ctx.get(MyClass); + expect(result.value).toBe(4); + expect(result.tag).toBe('AB'); + }); + + it('should apply global decorators to instances created from fabrics', () => { + const ctx = new DIContext(); + + class BaseClass { + static dependencies = [] as const; + + value = 1; + } + + class ExtendedClass extends BaseClass { + static dependencies = [] as const; + + extraValue = 10; + } + + ctx.register(BaseClass, ExtendedClass); + + ctx.registerDecorator((instance) => { + if (instance instanceof ExtendedClass) { + instance.extraValue = 20; + } + return instance; + }); + + const result = ctx.get(BaseClass); + + expect(result).toBeInstanceOf(ExtendedClass); + expect((result as ExtendedClass).extraValue).toBe(20); + }); + + it('should prevent adding decorators after instance creation', () => { + const ctx = new DIContext(); + ctx.register(MyClass); + ctx.register(AnotherClass); + + const myClassInstance = ctx.get(MyClass); + + expect(() => ctx.registerDecorator((obj) => { + if (obj instanceof MyClass) { + obj.value = 42; + obj.tag = 'decorated'; + } + })).toThrowError(); + + expect(myClassInstance.value).toBe(1); + expect(myClassInstance.tag).toBe(''); + }); +}); diff --git a/packages/devextreme/js/__internal/core/di/index.ts b/packages/devextreme/js/__internal/core/di/index.ts index 11a7f79d43db..ebbb00556f2c 100644 --- a/packages/devextreme/js/__internal/core/di/index.ts +++ b/packages/devextreme/js/__internal/core/di/index.ts @@ -11,6 +11,8 @@ interface DIItem extends Constructor dependencies: readonly [...{ [P in keyof TDeps]: AbstractType }]; } +export type DecoratorFunction = (instance: T) => T; + export class DIContext { private readonly instances: Map = new Map(); @@ -20,6 +22,8 @@ export class DIContext { private readonly antiRecursionSet = new Set(); + private readonly globalDecorators: DecoratorFunction[] = []; + public register( id: AbstractType, fabric: DIItem, @@ -40,7 +44,9 @@ export class DIContext { id: AbstractType, instance: T, ): void { - this.instances.set(id, instance); + const decoratedInstance = this.applyGlobalDecorators(instance); + + this.instances.set(id, decoratedInstance); } public get( @@ -67,15 +73,37 @@ export class DIContext { const fabric = this.fabrics.get(id); if (fabric) { - const res: T = this.create(fabric as any); - this.instances.set(id, res); - this.instances.set(fabric, res); - return res; + const instance: T = this.create(fabric as any); + + const decoratedInstance = this.applyGlobalDecorators(instance); + + this.instances.set(id, decoratedInstance); + this.instances.set(fabric, decoratedInstance); + return decoratedInstance; } return null; } + public registerDecorator(decoratorFn: DecoratorFunction): void { + if (this.hasInitiatedInstances) { + throw new Error('Cannot register decorator: decorators must be registered before any instances are created or retrieved from the DI container.'); + } + + this.globalDecorators.push(decoratorFn); + } + + private get hasInitiatedInstances(): boolean { + return this.instances.size > 0; + } + + private applyGlobalDecorators(instance: T): T { + return this.globalDecorators.reduce( + (currentInstance, currentDecorator) => currentDecorator(currentInstance), + instance, + ); + } + private create(fabric: DIItem): T { if (this.antiRecursionSet.has(fabric)) { throw new Error('dependency cycle in DI'); diff --git a/packages/devextreme/js/__internal/core/state_manager/dev/event_emitter.ts b/packages/devextreme/js/__internal/core/state_manager/dev/event_emitter.ts new file mode 100644 index 000000000000..4c6bc5977fa4 --- /dev/null +++ b/packages/devextreme/js/__internal/core/state_manager/dev/event_emitter.ts @@ -0,0 +1,32 @@ +import type * as StateManagementTypes from './types'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export class EventEmitter void> { + private readonly listeners: T[] = []; + + constructor( + private readonly eventName: string, + private readonly logger: StateManagementTypes.Logger, + ) { + + } + + addListener(callback: T): void { + if (!callback || typeof callback !== 'function') { + this.logger.error(`Callback for ${this.eventName} must be a function`); + return; + } + + this.listeners.push(callback); + } + + emit(...args: Parameters): void { + this.listeners.forEach((listener) => { + try { + listener(...args); + } catch (error) { + this.logger.error(`Error in ${this.eventName} listener`, error); + } + }); + } +} diff --git a/packages/devextreme/js/__internal/core/state_manager/dev/index.ts b/packages/devextreme/js/__internal/core/state_manager/dev/index.ts new file mode 100644 index 000000000000..b4d5f7de788b --- /dev/null +++ b/packages/devextreme/js/__internal/core/state_manager/dev/index.ts @@ -0,0 +1,13 @@ +export type { + ReadonlySignal, + Signal, +} from './reactive_primitives/index'; +export { + batch, + computed, + effect, + signal, + // eslint-disable-next-line spellcheck/spell-checker + untracked, +} from './reactive_primitives/index'; +export { setupStateManager } from './setup_state_manager'; diff --git a/packages/devextreme/js/__internal/core/state_manager/dev/logger.ts b/packages/devextreme/js/__internal/core/state_manager/dev/logger.ts new file mode 100644 index 000000000000..3f3558df9cfe --- /dev/null +++ b/packages/devextreme/js/__internal/core/state_manager/dev/logger.ts @@ -0,0 +1,62 @@ +/* eslint-disable no-console */ +import type * as StateManagementTypes from './types'; + +const LOG_TYPE_TO_LEVEL: Record = { + debug: 0, info: 1, warn: 2, error: 3, +}; + +export interface ConsoleLoggerOptions { + logLevel?: StateManagementTypes.LogLevel; + prefix: string; +} + +export class Logger implements StateManagementTypes.Logger { + private logLevel: StateManagementTypes.LogLevel; + + private prefix: string; + + constructor(options?: ConsoleLoggerOptions) { + this.logLevel = options?.logLevel ?? 'info'; + this.prefix = options?.prefix ?? ''; + } + + setLevel(level: StateManagementTypes.LogLevel): void { + this.logLevel = level; + } + + setPrefix(prefix: string): void { + this.prefix = prefix; + } + + debug(message: string, ...args: unknown[]): void { + if (this.shouldLog('debug')) { + console.debug(this.formatMessage(message), ...args); + } + } + + info(message: string, ...args: unknown[]): void { + if (this.shouldLog('info')) { + console.info(this.formatMessage(message), ...args); + } + } + + warn(message: string, ...args: unknown[]): void { + if (this.shouldLog('warn')) { + console.warn(this.formatMessage(message), ...args); + } + } + + error(message: string, ...args: unknown[]): void { + if (this.shouldLog('error')) { + console.error(this.formatMessage(message), ...args); + } + } + + private formatMessage(message: string): string { + return this.prefix ? `${this.prefix} ${message}` : message; + } + + private shouldLog(level: StateManagementTypes.LogLevel): boolean { + return LOG_TYPE_TO_LEVEL[level] >= LOG_TYPE_TO_LEVEL[this.logLevel]; + } +} diff --git a/packages/devextreme/js/__internal/core/state_manager/dev/preact_signal_value_container_manager.ts b/packages/devextreme/js/__internal/core/state_manager/dev/preact_signal_value_container_manager.ts new file mode 100644 index 000000000000..f5f6d1f47bba --- /dev/null +++ b/packages/devextreme/js/__internal/core/state_manager/dev/preact_signal_value_container_manager.ts @@ -0,0 +1,96 @@ +import type * as StateManagementTypes from './types'; +import { isObject } from './utils'; + +function isSignal(value: { brand?: symbol } | unknown): + value is StateManagementTypes.ObservableValueContainer { + if (isObject(value) && 'brand' in value) { + return value.brand === Symbol.for('preact-signals'); + } + + return false; +} + +export class PreactSignalValueContainerManager +implements StateManagementTypes.ValueContainerManager { + constructor( + private readonly logger: StateManagementTypes.Logger, + private readonly stateSourceSign: RegExp, + private readonly valueContainer: StateManagementTypes.ObservableValueContainer, + ) { + + } + + trackChanges( + onChange: StateManagementTypes.ValueContainerChangeCallback, + ): void { + if (!onChange || typeof onChange !== 'function') { + this.logger.error('onChange callback is required'); + return; + } + + const previousValue = this.getValue(); + + this.valueContainer.subscribe((newValue) => { + try { + const payload: StateManagementTypes.ValueContainerChange['payload'] = { + previousValue, + newValue, + timestamp: Date.now(), + source: this.captureSource(this.valueContainer), + }; + + const change: StateManagementTypes.ValueContainerChange = { + payload, + }; + + onChange(change); + } catch (error) { + this.logger.error('Error in Preact Signal subscription', error); + } + }); + } + + getValue(): StateManagementTypes.ObservableValueContainer['value'] { + return this.valueContainer.peek(); + } + + private captureSource(valueContainer: StateManagementTypes.ObservableValueContainer): string { + if (valueContainer.stack) { + const { stack } = valueContainer; + + return this.findStateSourceLine(stack).trim(); + } + + return 'The source is not tracked'; + } + + private findStateSourceLine(stack: string): string { + const lines = stack.split('\n'); + + const stateSourceLine = lines + .find((line) => line && this.stateSourceSign.test(line)); + + return stateSourceLine ?? (lines.length > 1 ? lines[1] : ''); + } +} + +export const PreactSignalValueContainerManagerFactory: +StateManagementTypes.ValueContainerManagerConstructor = { + canHandle( + valueContainer: StateManagementTypes.MaybeValueContainer, + ): valueContainer is StateManagementTypes.ObservableValueContainer { + return isSignal(valueContainer); + }, + + create( + logger: StateManagementTypes.Logger, + stateSourceSign: RegExp, + valueContainer: StateManagementTypes.MaybeValueContainer, + ): StateManagementTypes.ValueContainerManager { + if (!isSignal(valueContainer)) { + throw new Error('Invalid value container for PreactSignalValueContainerManager'); + } + + return new PreactSignalValueContainerManager(logger, stateSourceSign, valueContainer); + }, +}; diff --git a/packages/devextreme/js/__internal/core/state_manager/dev/reactive_primitives/index.ts b/packages/devextreme/js/__internal/core/state_manager/dev/reactive_primitives/index.ts new file mode 100644 index 000000000000..54c83a6de24c --- /dev/null +++ b/packages/devextreme/js/__internal/core/state_manager/dev/reactive_primitives/index.ts @@ -0,0 +1,63 @@ +import * as Reactive from '../../prod/reactive_primitives/index'; +import type { + BatchFunction, + ComputedFunction, + EffectCleanup, + EffectFn, + ReadonlySignal, + Signal, + // eslint-disable-next-line spellcheck/spell-checker + UntrackedFunction, +} from '../../prod/reactive_primitives/types'; + +export type { + ReadonlySignal, + Signal, +} from '../../prod/reactive_primitives/types'; + +export function signal(initialValue: T): Signal { + const signalInstance = Reactive.signal(initialValue); + + const trace = new Error().stack; + if (trace) { + Object.defineProperty(signalInstance, 'stack', { + value: trace, + writable: false, + enumerable: false, + configurable: false, + }); + } + + return signalInstance; +} + +export function computed(fn: ComputedFunction): ReadonlySignal { + const computedInstance = Reactive.computed(fn); + + const trace = new Error().stack; + + if (trace) { + Object.defineProperty(computedInstance, 'stack', { + value: trace, + writable: false, + enumerable: false, + configurable: false, + }); + } + + return computedInstance; +} + +export function effect(fn: EffectFn): EffectCleanup { + return Reactive.effect(fn); +} + +export function batch(fn: BatchFunction): void { + Reactive.batch(fn); +} + +// eslint-disable-next-line spellcheck/spell-checker +export function untracked(fn: UntrackedFunction): T { + // eslint-disable-next-line spellcheck/spell-checker + return Reactive.untracked(fn); +} diff --git a/packages/devextreme/js/__internal/core/state_manager/dev/redux_dev_tools_connector.ts b/packages/devextreme/js/__internal/core/state_manager/dev/redux_dev_tools_connector.ts new file mode 100644 index 000000000000..a949ad99a00d --- /dev/null +++ b/packages/devextreme/js/__internal/core/state_manager/dev/redux_dev_tools_connector.ts @@ -0,0 +1,152 @@ +/* eslint-disable spellcheck/spell-checker */ +import { EventEmitter } from './event_emitter'; +import type * as StateManagementTypes from './types'; +import { isObject } from './utils'; + +export class ReduxDevToolsConnector implements StateManagementTypes.DevToolsConnector { + private devTools: StateManagementTypes.ReduxDevToolsInstance | null = null; + + private _isConnected = false; + + private readonly externalActionEmitter: + EventEmitter; + + constructor( + private readonly componentName: string, + private readonly logger: StateManagementTypes.Logger, + ) { + this.externalActionEmitter = new EventEmitter( + 'externalAction', + logger, + ); + } + + connect(): void { + if (!this.hasReduxDevTools(window)) { + this.logger.warn('Redux DevTools extension not found. Install the extension and serve your app via web server (not file://)'); + return; + } + + try { + this.devTools = window.__REDUX_DEVTOOLS_EXTENSION__.connect({ + name: `${this.componentName} ${new Date().valueOf()}`, + trace: true, + traceLimit: 25, + features: { + jump: true, + skip: false, + dispatch: true, + }, + shouldCatchErrors: true, + serialize: { + options: { + circular: '[CIRCULAR]', + date: true, + }, + replacer: (key, value) => { + // replaced because this property contains a reference to the component instance + // which causes "heap out of memory" + if (key === 'changes' && isObject(value) && 'component' in value && 'element' in value) { + return '[REPLACED]'; + } + + return value; + }, + }, + }); + + this.devTools.subscribe( + (message) => { + if (message.type !== 'DISPATCH') { + return; + } + + if (message.payload.type === 'JUMP_TO_STATE' || message.payload.type === 'JUMP_TO_ACTION') { + if (message.state) { + this.handleJumpToAction(message.state); + } + } else if (message.payload.type === 'COMMIT') { + this.externalActionEmitter.emit('COMMIT', null); + } else if (message.payload.type === 'RESET') { + this.externalActionEmitter.emit('RESET', null); + } else { + this.logger.error(`Unknown ${message.payload.type} message payload type`); + } + }, + ); + + this._isConnected = true; + this.logger.info('Connected to Redux DevTools'); + } catch (error) { + this.logger.error('Failed to connect to Redux DevTools', error); + } + } + + disconnect(): void { + if (!this.isConnected || this.devTools === null) { + return; + } + + try { + this.devTools.unsubscribe(); + this._isConnected = false; + this.logger.info('Disconnected from Redux DevTools'); + } catch (error) { + this.logger.error('Failed to disconnect from Redux DevTools', error); + } + } + + sendAction(...args: Parameters): ReturnType { + const [action, payload, state] = args; + + if (!action) { + this.logger.error('Action name is required'); + return; + } + + if (!this.isConnected || this.devTools === null) { + this.logger.warn('Cannot send action: Not connected to Redux DevTools'); + return; + } + + try { + const preparedAction = `${action}: ${payload.path}`; + + const currentState = state ?? {}; + + const actionObject = { + type: preparedAction, + payload: payload || {}, + }; + + this.devTools.send(actionObject, currentState); + } catch (error) { + this.logger.error(`Failed to send action to DevTools: ${action}`, error); + this.logger.debug(`Action details - Type: ${action}, Payload:`, payload); + } + } + + public get isConnected(): boolean { + return this._isConnected; + } + + onExternalAction(callback: StateManagementTypes.DevToolsExternalActionCallback): void { + this.externalActionEmitter.addListener(callback); + } + + private handleJumpToAction(state: string): void { + try { + const parsedState = JSON.parse(state); + this.externalActionEmitter.emit('JUMP_TO_STATE', parsedState); + } catch (error) { + this.logger.error('Failed to handle jump to action', error); + } + } + + private hasReduxDevTools(globalEnv: Window): globalEnv is + Window & { __REDUX_DEVTOOLS_EXTENSION__: StateManagementTypes.ReduxDevToolsExtension } { + return typeof globalEnv !== 'undefined' + && '__REDUX_DEVTOOLS_EXTENSION__' in globalEnv + && globalEnv.__REDUX_DEVTOOLS_EXTENSION__ !== undefined; + } +} diff --git a/packages/devextreme/js/__internal/core/state_manager/dev/setup_state_manager.ts b/packages/devextreme/js/__internal/core/state_manager/dev/setup_state_manager.ts new file mode 100644 index 000000000000..fcffb9f06a67 --- /dev/null +++ b/packages/devextreme/js/__internal/core/state_manager/dev/setup_state_manager.ts @@ -0,0 +1,73 @@ +/* eslint-disable spellcheck/spell-checker */ +import type { DIContext } from '../../di'; +import { Logger } from './logger'; +import { StateManagerFactory } from './state_manager'; +import type * as StateManagementTypes from './types'; +import { isObject } from './utils'; + +export type DecoratorFunction = (instance: T) => T; + +export interface StateManagerInitializerOptions { + logLevel?: StateManagementTypes.LogLevel; + componentName: string; + diContext: DIContext; + stateSourceSign?: RegExp; +} + +const DEFAULT_STATE_SOURCE_SIGN = /Controller/; + +function isStateSource( + instance: unknown, + stateSourceSign: RegExp, +): instance is StateManagementTypes.StateSource { + return isObject(instance) + && 'constructor' in instance + && 'name' in instance.constructor + && stateSourceSign.test(instance.constructor.name); +} + +export const setupStateManager = ( + options: StateManagerInitializerOptions, +): StateManagementTypes.StateManager | undefined => { + const { + diContext, + componentName, + logLevel = 'warn', + stateSourceSign = DEFAULT_STATE_SOURCE_SIGN, + } = options; + if (!diContext) { + throw new Error('DI context is not provided'); + } + + if (!componentName) { + throw new Error('Component name is not provided'); + } + + const logger = new Logger({ logLevel, prefix: '[StateManager]' }); + + const isDevelopmentMode = process.env.NODE_ENV === 'development'; + + if (!isDevelopmentMode) { + return undefined; + } + + const stateManager = StateManagerFactory.create({ + componentName, + stateSourceSign, + logger, + }); + + const trackStateSource: DecoratorFunction = (instance) => { + if (isStateSource(instance, stateSourceSign)) { + stateManager.trackStateOf(instance); + } else { + logger.debug(`The '${instance?.constructor?.name}' state source isn't tracked by the state manager because it doesn't match the "${stateSourceSign}" sign pattern.`); + } + + return instance; + }; + + diContext.registerDecorator(trackStateSource); + + return stateManager; +}; diff --git a/packages/devextreme/js/__internal/core/state_manager/dev/state_manager.ts b/packages/devextreme/js/__internal/core/state_manager/dev/state_manager.ts new file mode 100644 index 000000000000..d7f7ac31949d --- /dev/null +++ b/packages/devextreme/js/__internal/core/state_manager/dev/state_manager.ts @@ -0,0 +1,201 @@ +import { Logger } from './logger'; +import { PreactSignalValueContainerManagerFactory } from './preact_signal_value_container_manager'; +// eslint-disable-next-line spellcheck/spell-checker +import { ReduxDevToolsConnector } from './redux_dev_tools_connector'; +import type * as StateManagementTypes from './types'; +import { deepCopy, isObject, joinStatePath } from './utils'; + +class StateManager implements StateManagementTypes.StateManager { + private readonly devToolsConnector: StateManagementTypes.DevToolsConnector; + + private readonly logger: StateManagementTypes.Logger; + + readonly componentState: StateManagementTypes.ComponentState; + + private readonly stateSourceSign: RegExp; + + private readonly valueContainerManagers: StateManagementTypes.ValueContainerManagerConstructor[]; + + constructor( + config: StateManagementTypes.StateManagerConfig, + ) { + this.componentState = {}; + + this.valueContainerManagers = config.valueContainerManagers; + this.devToolsConnector = config.devToolsConnector; + this.logger = config.logger; + this.stateSourceSign = config.stateSourceSign; + + this.init(); + } + + private init(): void { + this.devToolsConnector.onExternalAction((action) => { + this.logger.warn(`Handler for the '${action}' action is not implemented`); + }); + + this.devToolsConnector.connect(); + + this.logger.info('StateManager initialized'); + } + + trackStateOf(sourceData: StateManagementTypes.StateSource, sourceDataId?: string): void { + const preparedSourceDataId = sourceDataId ?? sourceData?.constructor?.name; + + if (!sourceData) { + this.logger.error('State source cannot be null or undefined'); + return; + } + + if (this.componentState[preparedSourceDataId]) { + this.logger.debug(`State source with ID '${preparedSourceDataId}' is already tracked. Overwriting.`); + } + + Object.entries(sourceData).forEach(([propertyName, propertyValue]) => { + if (!this.hasValueContainerManagerFor(propertyValue)) { + this.logger.debug(`No value container manager found for the '${propertyName}' property of the '${preparedSourceDataId}' state source`); + return; + } + + if (!this.componentState[preparedSourceDataId]) { + this.componentState[preparedSourceDataId] = {}; + } + + this.componentState[preparedSourceDataId][propertyName] = isObject(propertyValue) + ? new WeakRef(propertyValue) : propertyValue; + + this.trackStateSourceChanges( + preparedSourceDataId, + propertyName, + propertyValue, + ); + }); + } + + private trackStateSourceChanges( + stateId: string, + propertyName: string, + propertyValue: StateManagementTypes.MaybeValueContainer, + ): void { + const valueContainerManager = this.createValueContainerManagerFor(propertyValue); + + if (!valueContainerManager) { + this.logger.debug(`No value container manager found for the '${propertyName}' property of the '${stateId}' state`); + return; + } + + const fullPathToProperty = joinStatePath(stateId, propertyName); + + try { + valueContainerManager.trackChanges( + (valueContainerChange: StateManagementTypes.ValueContainerChange) => { + const valueContainerChangeCopy = { + ...valueContainerChange, + payload: { ...valueContainerChange.payload, path: fullPathToProperty }, + }; + + const { previousValue, newValue } = valueContainerChange.payload; + + if (typeof previousValue === 'object' && previousValue !== null) { + valueContainerChangeCopy.payload.previousValue = deepCopy(previousValue); + } + + if (typeof newValue === 'object' && newValue !== null) { + valueContainerChangeCopy.payload.newValue = deepCopy(newValue); + } + + const updatedComponentState = this.getComponentState(); + + if (this.devToolsConnector.isConnected) { + this.devToolsConnector + .sendAction( + 'UPDATE', + valueContainerChangeCopy.payload, + updatedComponentState, + ); + } + }, + ); + } catch (error) { + this.logger.error(`Failed to track state for ${fullPathToProperty}`, error); + } + } + + private hasValueContainerManagerFor( + valueContainer: StateManagementTypes.MaybeValueContainer, + ): boolean { + return this.valueContainerManagers + .some(( + currentStateContainerManager, + ) => currentStateContainerManager.canHandle(valueContainer)); + } + + private createValueContainerManagerFor( + valueContainer: StateManagementTypes.MaybeValueContainer, + ): StateManagementTypes.ValueContainerManager | undefined { + const valueContainerManagerFactory = this.valueContainerManagers + .find(( + currentStateContainerManager, + ) => currentStateContainerManager.canHandle(valueContainer)); + + if (!valueContainerManagerFactory) { + return undefined; + } + + return valueContainerManagerFactory.create(this.logger, this.stateSourceSign, valueContainer); + } + + getComponentState(): StateManagementTypes.ComponentState { + const result = Object.entries(this.componentState) + .reduce((acc, [stateId, stateValue]) => { + Object.entries(stateValue).forEach(([propertyName, propertyValue]) => { + const preparedPropertyValue = propertyValue instanceof WeakRef + // eslint-disable-next-line spellcheck/spell-checker + ? propertyValue.deref() : propertyValue; + + if (!preparedPropertyValue) { + return acc; + } + + const valueContainerManager = this.createValueContainerManagerFor(preparedPropertyValue); + + if (!valueContainerManager) { + return acc; + } + + const value = valueContainerManager.getValue(); + + if (!acc[stateId]) { + acc[stateId] = {}; + } + + acc[stateId][propertyName] = isObject(value) ? deepCopy(value) : value; + + return acc; + }); + + return acc; + }, {}); + + return result; + } +} + +export const StateManagerFactory = { + create: (options: StateManagementTypes.StateManagerFactoryOptions): StateManager => { + const logger = options.logger ?? new Logger({ logLevel: options.logLevel, prefix: '[StateManager]' }); + + const stateContainerManagers: StateManagementTypes.StateManagerConfig['valueContainerManagers'] = options.valueContainerManagers ?? [PreactSignalValueContainerManagerFactory]; + + const preparedConfig: StateManagementTypes.StateManagerConfig = { + valueContainerManagers: stateContainerManagers, + devToolsConnector: options.devToolsConnector + // eslint-disable-next-line spellcheck/spell-checker + ?? new ReduxDevToolsConnector(options.componentName, logger), + logger, + stateSourceSign: options.stateSourceSign, + }; + + return new StateManager(preparedConfig); + }, +}; diff --git a/packages/devextreme/js/__internal/core/state_manager/dev/types.ts b/packages/devextreme/js/__internal/core/state_manager/dev/types.ts new file mode 100644 index 000000000000..b852ff4d782c --- /dev/null +++ b/packages/devextreme/js/__internal/core/state_manager/dev/types.ts @@ -0,0 +1,148 @@ +/* eslint-disable @typescript-eslint/consistent-type-definitions */ + +import type { Signal } from '@preact/signals-core'; + +export type StateManagerCommands = { + trackStateOf: (sourceData: StateSource, id?: string) => void; +}; + +export type StateManagerQueries = { + getComponentState: () => ComponentState; +}; + +export interface StateManager extends StateManagerCommands, StateManagerQueries { } + +export type StateSource = Record; + +export interface StateManagerConfig { + devToolsConnector: DevToolsConnector; + logger: Logger; + valueContainerManagers: ValueContainerManagerConstructor[]; + stateSourceSign: RegExp; +} + +export interface ObservableValueContainer extends ValueContainer, Signal { + stack?: string; +} + +export type MaybeObservableValueContainer = ObservableValueContainer | T; + +export interface ValueContainerManagerConstructor { + canHandle: (valueContainer: MaybeValueContainer) => valueContainer is ValueContainer; + create: ( + logger: Logger, + stateSourceSign: RegExp, + valueContainer: MaybeValueContainer + ) => ValueContainerManager; +} + +export type ValueContainerChangeCallback = (change: ValueContainerChange) => void; + +export interface ValueContainerManager { + trackChanges: ( + onChange: ValueContainerChangeCallback + ) => void; + getValue: () => unknown; +} + +export interface StateManagerFactoryOptions extends Partial { + componentName: string; + valueContainerManagers?: ValueContainerManagerConstructor[]; + logLevel?: LogLevel; + stateSourceSign: RegExp; +} + +export type ValueContainerPayload = { + previousValue: unknown; + newValue: unknown; + timestamp: number; + source: string; +}; + +export type ValueContainerChange = { + payload: ValueContainerPayload; +}; + +export type StateChangeActionType = 'UPDATE'; + +export type StateChangePayload = { + path: string; + previousValue: unknown; + newValue: unknown; + timestamp: number; + source: string; +}; + +export type ComponentState = Record>; + +export interface EventEmitter void> { + addListener: (callback: T) => void; + emit: (...args: Parameters) => void; +} + +export type ValueContainer = { [key: string]: unknown }; +export type MaybeValueContainer = ValueContainer | T; + +export type LogLevel = 'debug' | 'info' | 'warn' | 'error'; +export type LogMethod = (message: string, ...args: unknown[]) => void; + +export interface Logger { + debug: LogMethod; + info: LogMethod; + warn: LogMethod; + error: LogMethod; +} + +export type DevToolsActions = 'DISPATCH' | 'JUMP_TO_STATE' | 'JUMP_TO_ACTION' | 'COMMIT' | 'RESET'; + +export type DevToolsExternalActionCallback = +(action: DevToolsActions, payload: ComponentState | null) => void; + +export interface DevToolsConnector { + connect: (options?: Record) => void; + disconnect: () => void; + sendAction: ( + action: StateChangeActionType, payload: StateChangePayload, state?: ComponentState + ) => void; + onExternalAction: (callback: DevToolsExternalActionCallback) => void; + isConnected: boolean; +} + +// eslint-disable-next-line spellcheck/spell-checker +type ReduxDevToolsActions = DevToolsActions; + +// eslint-disable-next-line spellcheck/spell-checker +export type ReduxDevToolsInstance = { + subscribe: + (callback: ( + // eslint-disable-next-line spellcheck/spell-checker + message: { type: ReduxDevToolsActions; payload: { type: string }; state?: string } + ) => void) => void; + send: (action: { type: string; payload: unknown }, state: unknown) => void; + unsubscribe: () => void; +}; + +// eslint-disable-next-line spellcheck/spell-checker +export type ReduxDevToolsExtension = { + connect: (options?: { + name?: string; + trace?: boolean; + traceLimit?: number; + features?: { + jump?: boolean; + skip?: boolean; + dispatch?: boolean; + }; + shouldCatchErrors?: boolean; + serialize?: boolean | { + options?: boolean | { + undefined?: boolean; + date?: boolean; + circular?: string; + }; + // eslint-disable-next-line spellcheck/spell-checker + replacer?: (key: string, value: unknown) => unknown; + }; + // eslint-disable-next-line spellcheck/spell-checker + }) => ReduxDevToolsInstance; +}; diff --git a/packages/devextreme/js/__internal/core/state_manager/dev/utils.ts b/packages/devextreme/js/__internal/core/state_manager/dev/utils.ts new file mode 100644 index 000000000000..0bb1b7799895 --- /dev/null +++ b/packages/devextreme/js/__internal/core/state_manager/dev/utils.ts @@ -0,0 +1,65 @@ +export function joinStatePath(stateId: string, propertyName: string, separator = '.'): string { + return [stateId, propertyName].join(separator); +} + +export function splitStatePath(statePath: string, separator = '.'): string[] { + return statePath.split(separator).filter(Boolean); +} + +export function isValidStatePath(statePath: string): boolean { + const parts = splitStatePath(statePath); + return parts.length >= 2; +} + +export function isObject(input: unknown): input is object { + return input !== undefined && input !== null && typeof input === 'object'; +} + +export function deepCopy(inputObject: T): T { + function iter(value: unknown, visited: Map): unknown { + if (value === null || typeof value !== 'object') { + return value; + } + + if (visited.has(value)) { + return visited.get(value); + } + + if (value instanceof Date) { + const dateCopy = new Date(value.getTime()); + visited.set(value, dateCopy); + return dateCopy; + } + + if (value instanceof RegExp) { + const regExpCopy = new RegExp(value.source, value.flags); + visited.set(value, regExpCopy); + return regExpCopy; + } + + if (Array.isArray(value)) { + const arrayCopy: unknown[] = []; + + visited.set(value, arrayCopy); + + value.forEach((item, index) => { + arrayCopy[index] = iter(item, visited); + }); + return arrayCopy; + } + + const objectCopy: Record = {}; + visited.set(value, objectCopy); + + Object.keys(value).forEach((key) => { + const propertyValue = value[key]; + objectCopy[key] = iter(propertyValue, visited); + }); + + return objectCopy; + } + + const result = iter(inputObject, new Map()); + + return result as T; +} diff --git a/packages/devextreme/js/__internal/core/state_manager/index.ts b/packages/devextreme/js/__internal/core/state_manager/index.ts new file mode 100644 index 000000000000..9c87c6c76b84 --- /dev/null +++ b/packages/devextreme/js/__internal/core/state_manager/index.ts @@ -0,0 +1 @@ +export * from './dev/index'; diff --git a/packages/devextreme/js/__internal/core/state_manager/prod/index.ts b/packages/devextreme/js/__internal/core/state_manager/prod/index.ts new file mode 100644 index 000000000000..d9a8adf6df33 --- /dev/null +++ b/packages/devextreme/js/__internal/core/state_manager/prod/index.ts @@ -0,0 +1,14 @@ +export const setupStateManager = (): void => {}; + +export type { + ReadonlySignal, + Signal, +} from './reactive_primitives/index'; +export { + batch, + computed, + effect, + signal, + // eslint-disable-next-line spellcheck/spell-checker + untracked, +} from './reactive_primitives/index'; diff --git a/packages/devextreme/js/__internal/core/state_manager/prod/reactive_primitives/index.ts b/packages/devextreme/js/__internal/core/state_manager/prod/reactive_primitives/index.ts new file mode 100644 index 000000000000..718195a9c3e9 --- /dev/null +++ b/packages/devextreme/js/__internal/core/state_manager/prod/reactive_primitives/index.ts @@ -0,0 +1,39 @@ +import * as SignalsCore from '@preact/signals-core'; + +import type { + BatchFunction, + ComputedFunction, + EffectCleanup, + EffectFn, + ReadonlySignal, + Signal, + // eslint-disable-next-line spellcheck/spell-checker + UntrackedFunction, +} from './types'; + +export type { + ReadonlySignal, + Signal, +} from './types'; + +export function signal(initialValue: T): Signal { + return SignalsCore.signal(initialValue); +} + +export function computed(fn: ComputedFunction): ReadonlySignal { + return SignalsCore.computed(fn); +} + +export function effect(fn: EffectFn): EffectCleanup { + return SignalsCore.effect(fn); +} + +export function batch(fn: BatchFunction): void { + SignalsCore.batch(fn); +} + +// eslint-disable-next-line spellcheck/spell-checker +export function untracked(fn: UntrackedFunction): T { + // eslint-disable-next-line spellcheck/spell-checker + return SignalsCore.untracked(fn); +} diff --git a/packages/devextreme/js/__internal/core/state_manager/prod/reactive_primitives/types.ts b/packages/devextreme/js/__internal/core/state_manager/prod/reactive_primitives/types.ts new file mode 100644 index 000000000000..6252595b9185 --- /dev/null +++ b/packages/devextreme/js/__internal/core/state_manager/prod/reactive_primitives/types.ts @@ -0,0 +1,16 @@ +import type * as SignalsCore from '@preact/signals-core'; + +export type Signal = SignalsCore.Signal; +export type ReadonlySignal = SignalsCore.ReadonlySignal; + +export type EffectCleanup = () => void; + +// eslint-disable-next-line @typescript-eslint/no-invalid-void-type +export type EffectFn = () => void | EffectCleanup; + +export type ComputedFunction = () => T; + +export type BatchFunction = () => void; + +// eslint-disable-next-line spellcheck/spell-checker +export type UntrackedFunction = () => T; diff --git a/packages/devextreme/js/__internal/core/state_manager/reactive_primitives.test.ts b/packages/devextreme/js/__internal/core/state_manager/reactive_primitives.test.ts new file mode 100644 index 000000000000..214542800ca3 --- /dev/null +++ b/packages/devextreme/js/__internal/core/state_manager/reactive_primitives.test.ts @@ -0,0 +1,81 @@ +/* eslint-disable spellcheck/spell-checker */ +import { + describe, + expect, + it, +} from '@jest/globals'; + +import * as ReactiveDev from './dev/reactive_primitives/index'; +import type { + ReadonlySignal, + Signal, +} from './prod/reactive_primitives/index'; +import * as Reactive from './prod/reactive_primitives/index'; + +describe('Reactive wrapper', () => { + describe.each([ + ['Prod', Reactive], + ['Dev', ReactiveDev], + ])('%s version', (name, ReactiveModule) => { + it('signal correctly wrapped', () => { + const testSignal: Signal = ReactiveModule.signal(42); + expect(testSignal.value).toBe(42); + + if (name === 'Dev') { + expect('stack' in testSignal).toBeTruthy(); + } + }); + + it('computed correctly wrapped', () => { + const testSignal: Signal = ReactiveModule.signal(42); + expect(testSignal.value).toBe(42); + // eslint-disable-next-line @stylistic/max-len + const testComputed: ReadonlySignal = ReactiveModule.computed(() => testSignal.value * 2); + expect(testComputed.value).toBe(84); + + if (name === 'Dev') { + expect('stack' in testComputed).toBeTruthy(); + } + }); + + it('batch correctly wrapped', () => { + const testSignal: Signal = ReactiveModule.signal(42); + expect(testSignal.value).toBe(42); + + let batchRan = false; + ReactiveModule.batch(() => { + batchRan = true; + testSignal.value = 50; + }); + expect(batchRan).toBe(true); + }); + + it('effect and untracked correctly wrapped', () => { + const untrackedSignal = ReactiveModule.signal('Jane'); + const trackedSignal = ReactiveModule.signal('tracked'); + + let untrackedEffectRunCount = 0; + + const untrackedDispose = ReactiveModule.effect(() => { + untrackedEffectRunCount += 1; + ReactiveModule.untracked(() => { + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + untrackedSignal.value; + }); + + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + trackedSignal.value; + }); + + expect(untrackedEffectRunCount).toBe(1); + + untrackedSignal.value = 'Doe'; + expect(untrackedEffectRunCount).toBe(1); + + trackedSignal.value = 'updated'; + expect(untrackedEffectRunCount).toBe(2); + + untrackedDispose(); + }); + }); +}); diff --git a/packages/devextreme/js/__internal/core/state_manager/state_manager.test.ts b/packages/devextreme/js/__internal/core/state_manager/state_manager.test.ts new file mode 100644 index 000000000000..68bf946e332e --- /dev/null +++ b/packages/devextreme/js/__internal/core/state_manager/state_manager.test.ts @@ -0,0 +1,256 @@ +/* eslint-disable @typescript-eslint/init-declarations */ +/* eslint-disable max-classes-per-file */ +/* eslint-disable spellcheck/spell-checker */ +import { + afterAll, + beforeAll, + describe, + expect, + it, + jest, +} from '@jest/globals'; +import type { Signal } from '@ts/core/state_manager/index'; +import { signal } from '@ts/core/state_manager/index'; + +import { DIContext } from '../di'; +import { setupStateManager } from './dev/setup_state_manager'; +import type { StateManager } from './dev/types'; + +const waitGarbageCollection = async (): Promise => { + if (!global.gc) { + throw new Error('Global gc is not defined. Did you use the `--expose-gc` flag?'); + } + + global.gc(); + await new Promise((resolve) => { + // eslint-disable-next-line no-restricted-globals + setTimeout(resolve, 0); + }); + global.gc(); +}; + +type TrackedSignal = Signal; + +describe('StateManager', () => { + const originalEnv = { ...process.env }; + + beforeAll(() => { + jest.resetModules(); + process.env = { ...originalEnv, NODE_ENV: 'development' }; + }); + + afterAll(() => { + process.env = originalEnv; + }); + + describe('Component state sources tracking', () => { + let diContext: DIContext; + let testComponentStateTracker: StateManager; + let initialPagerConfig: { infinityScrollingEnabled: boolean }; + let nonPreactSignalProperty: { text: string }; + let NoSignForIncludingItByStateManager: new () => { + someField: TrackedSignal; + }; + let DataController: new () => { + pagesCount: TrackedSignal; + pagerConfig: TrackedSignal<{ infinityScrollingEnabled: boolean }>; + nonPreactSignalProperty: { text: string }; + }; + let ColumnsController: new () => { + columnsCount: TrackedSignal; + text: TrackedSignal; + nonPreactSignalProperty: { text: string }; + }; + let ignoredInstance: InstanceType; + let columnsControllerInstance: InstanceType; + let dataControllerInstance: InstanceType; + + const updatedPagerConfig = { infinityScrollingEnabled: false }; + + beforeAll(() => { + diContext = new DIContext(); + + const stateManager = setupStateManager({ + diContext, + componentName: 'TestComponent', + logLevel: 'error', + }); + + if (!stateManager) { + throw Error('StateManager not initialized'); + } + + testComponentStateTracker = stateManager; + + initialPagerConfig = { + infinityScrollingEnabled: true, + }; + + nonPreactSignalProperty = { + text: 'non-preact-signal-property', + }; + + NoSignForIncludingItByStateManager = class { + someField = signal(true); + }; + + DataController = class { + pagesCount = signal(10); + + pagerConfig = signal(initialPagerConfig); + + nonPreactSignalProperty = nonPreactSignalProperty; + }; + + ColumnsController = class { + columnsCount = signal(5); + + text = signal('initial'); + + nonPreactSignalProperty = nonPreactSignalProperty; + }; + + ignoredInstance = new NoSignForIncludingItByStateManager(); + columnsControllerInstance = new ColumnsController(); + dataControllerInstance = new DataController(); + + diContext.registerInstance(ColumnsController, columnsControllerInstance); + diContext.registerInstance(DataController, dataControllerInstance); + diContext.registerInstance(NoSignForIncludingItByStateManager, ignoredInstance); + }); + + it('should ignore non-controllers', () => { + expect(testComponentStateTracker.getComponentState()).not.toMatchObject({ + NoSignForIncludingItByStateManagerController: expect.anything(), + }); + }); + + it('should get component signal after controllers registration', () => { + expect(testComponentStateTracker.getComponentState().ColumnsController).toEqual({ + columnsCount: 5, + text: 'initial', + }); + + expect(testComponentStateTracker.getComponentState().DataController).toEqual({ + pagesCount: 10, + pagerConfig: initialPagerConfig, + }); + }); + + it('should get deep copies of signal values', () => { + expect(testComponentStateTracker.getComponentState().DataController.pagerConfig) + .not.toBe(initialPagerConfig); + }); + + it('should preserve original controller signal values after signal tracker initialization', () => { + expect(columnsControllerInstance.columnsCount.peek()).toBe(5); + expect(columnsControllerInstance.text.peek()).toBe('initial'); + expect(dataControllerInstance.pagesCount.peek()).toBe(10); + expect(dataControllerInstance.pagerConfig.peek()) + .toBe(initialPagerConfig); + expect(dataControllerInstance.nonPreactSignalProperty).toEqual(nonPreactSignalProperty); + }); + + it('should track controllers signal updates', () => { + columnsControllerInstance.columnsCount.value = 10; + dataControllerInstance.pagesCount.value = 15; + dataControllerInstance.pagerConfig.value = updatedPagerConfig; + + expect(testComponentStateTracker.getComponentState().ColumnsController).toEqual({ + columnsCount: 10, + text: 'initial', + }); + + expect(testComponentStateTracker.getComponentState().DataController).toEqual({ + pagesCount: 15, + pagerConfig: updatedPagerConfig, + }); + }); + + it('should preserve original controller signal values after tracking controllers signal updates', () => { + expect(testComponentStateTracker.getComponentState().DataController.pagerConfig) + .not.toBe(updatedPagerConfig); + expect(columnsControllerInstance.text.peek()).toBe('initial'); + expect(columnsControllerInstance.columnsCount.peek()).toBe(10); + expect(dataControllerInstance.pagesCount.peek()).toBe(15); + expect(dataControllerInstance.pagerConfig.peek()) + .toBe(updatedPagerConfig); + expect(dataControllerInstance.nonPreactSignalProperty).toEqual(nonPreactSignalProperty); + }); + }); + + it('should allow garbage collection of a state source when a component is destroyed', async () => { + let diContext: DIContext | null = new DIContext(); + + const testComponentStateTracker = setupStateManager({ + diContext, + componentName: 'TestComponent', + logLevel: 'error', + stateSourceSign: /Test/, + }); + + if (!testComponentStateTracker) { + throw Error('StateManager not initialized'); + } + + class TestController { + testValue = signal(42); + } + + let controllerInstance: TestController | null = new TestController(); + const controllerInstanceWeakRef = new WeakRef(controllerInstance); + + diContext.registerInstance(TestController, controllerInstance); + + expect(testComponentStateTracker.getComponentState().TestController).toEqual({ + testValue: 42, + }); + + controllerInstance = null; + diContext = null; + + await waitGarbageCollection(); + + const isGarbageCollected = controllerInstanceWeakRef.deref() === undefined; + + expect(isGarbageCollected).toBe(true); + }); + + it('should allow garbage collection of a tracked state source properties when they are destroyed', async () => { + const diContext: DIContext | null = new DIContext(); + + const testComponentStateTracker = setupStateManager({ + diContext, + componentName: 'TestComponent', + logLevel: 'error', + stateSourceSign: /Test/, + }); + + if (!testComponentStateTracker) { + throw Error('StateManager not initialized'); + } + + class TestController { + testValue: Signal | null = signal(42); + } + + const controllerInstance: TestController | null = new TestController(); + + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const controllerInstanceTestValuePropertyWeakRef = new WeakRef(controllerInstance.testValue!); + + diContext.registerInstance(TestController, controllerInstance); + + expect(testComponentStateTracker.getComponentState().TestController).toEqual({ + testValue: 42, + }); + + controllerInstance.testValue = null; + + await waitGarbageCollection(); + + const isGarbageCollected = controllerInstanceTestValuePropertyWeakRef.deref() === undefined; + + expect(isGarbageCollected).toBe(true); + }); +}); diff --git a/packages/devextreme/js/__internal/core/state_manager/utils.test.ts b/packages/devextreme/js/__internal/core/state_manager/utils.test.ts new file mode 100644 index 000000000000..26cb8d455f20 --- /dev/null +++ b/packages/devextreme/js/__internal/core/state_manager/utils.test.ts @@ -0,0 +1,155 @@ +import { + describe, + expect, + it, +} from '@jest/globals'; + +import { + deepCopy, +} from './dev/utils'; + +describe('deepCopy', () => { + it('should create a deep copy of an object', () => { + const original = { a: 1, b: { c: 2 } }; + const copy = deepCopy(original); + + expect(copy).toEqual(original); + expect(copy).not.toBe(original); + expect(copy.b).not.toBe(original.b); + }); + + it('should create a deep copy of an array', () => { + const original = [1, 2, [3, 4]]; + const copy = deepCopy(original); + + expect(copy).toEqual(original); + expect(copy).not.toBe(original); + expect(copy[2]).not.toBe(original[2]); + }); + + it('should handle Date objects', () => { + const original = new Date('2023-01-01'); + const copy = deepCopy(original); + + expect(copy).toEqual(original); + expect(copy).not.toBe(original); + expect(copy.getTime()).toBe(original.getTime()); + }); + + it('should handle RegExp objects', () => { + const original = /test/gi; + const copy = deepCopy(original); + + expect(copy).toEqual(original); + expect(copy).not.toBe(original); + expect(copy.source).toBe(original.source); + expect(copy.flags).toBe(original.flags); + }); + + it('should handle nested objects and arrays', () => { + const original = { + a: [1, 2, { b: 3 }], + c: { d: [4, 5], e: { f: 6 } }, + }; + const copy = deepCopy(original); + + expect(copy).toEqual(original); + expect(copy).not.toBe(original); + expect(copy.a).not.toBe(original.a); + expect(copy.a[2]).not.toBe(original.a[2]); + expect(copy.c).not.toBe(original.c); + expect(copy.c.d).not.toBe(original.c.d); + expect(copy.c.e).not.toBe(original.c.e); + }); + + it('should handle circular references', () => { + interface ComplexCircularObj { + a: number; + self?: ComplexCircularObj; + b?: { + c: ComplexCircularObj; + }; + d?: ComplexCircularObj[]; + } + + const original: ComplexCircularObj = { a: 1 }; + original.self = original; + original.b = { c: original }; + original.d = [original]; + + const copy = deepCopy(original); + + expect(copy).not.toBe(original); + expect(copy.a).toBe(1); + expect(copy.self).toBe(copy); + expect(copy.b?.c).toBe(copy); + expect(copy.d?.[0]).toBe(copy); + }); + + it('should handle circular references in arrays', () => { + interface CircularArrayObj { + id: number; + items?: CircularArrayObj[]; + } + + const original: CircularArrayObj = { id: 1 }; + const child: CircularArrayObj = { id: 2 }; + + // Create circular reference: parent -> child -> parent + original.items = [child]; + child.items = [original]; + + const copy = deepCopy(original); + + expect(copy).not.toBe(original); + expect(copy.id).toBe(1); + expect(copy.items).not.toBe(original.items); + expect(copy.items?.[0]).not.toBe(original.items[0]); + expect(copy.items?.[0].id).toBe(2); + expect(copy.items?.[0].items?.[0]).toBe(copy); // Circular reference preserved + }); + + it('should handle complex nested circular references with arrays and objects', () => { + const original = { + name: 'root', + children: [] as any[], + parent: null as any, + }; + + const child1 = { + name: 'child1', + parent: original, + siblings: [] as any[], + }; + + const child2 = { + name: 'child2', + parent: original, + siblings: [child1] as any[], + }; + + child1.siblings = [child2]; + original.children = [child1, child2]; + + const copy = deepCopy(original); + + expect(copy).not.toBe(original); + expect(copy.name).toBe('root'); + expect(copy.children).not.toBe(original.children); + expect(copy.children.length).toBe(2); + + // Check first child + expect(copy.children[0]).not.toBe(original.children[0]); + expect(copy.children[0].name).toBe('child1'); + expect(copy.children[0].parent).toBe(copy); + + // Check second child + expect(copy.children[1]).not.toBe(original.children[1]); + expect(copy.children[1].name).toBe('child2'); + expect(copy.children[1].parent).toBe(copy); + + // Check sibling references + expect(copy.children[0].siblings[0]).toBe(copy.children[1]); + expect(copy.children[1].siblings[0]).toBe(copy.children[0]); + }); +}); diff --git a/packages/devextreme/js/__internal/grids/new/card_view/content_view/view.tsx b/packages/devextreme/js/__internal/grids/new/card_view/content_view/view.tsx index dbf5cee1bfb7..6b3bcfc48b5c 100644 --- a/packages/devextreme/js/__internal/grids/new/card_view/content_view/view.tsx +++ b/packages/devextreme/js/__internal/grids/new/card_view/content_view/view.tsx @@ -6,7 +6,7 @@ */ import { compileGetter } from '@js/core/utils/data'; import { isDefined } from '@js/core/utils/type'; -import { computed, effect, signal } from '@preact/signals-core'; +import { computed, effect, signal } from '@ts/core/state_manager/index'; import type { OptionsController } from '@ts/grids/new/card_view/options_controller'; import type { CardInfo } from '@ts/grids/new/grid_core/columns_controller/types'; import { diff --git a/packages/devextreme/js/__internal/grids/new/card_view/di.ts b/packages/devextreme/js/__internal/grids/new/card_view/di.ts index d3f75da3ba95..cf1d5be55902 100644 --- a/packages/devextreme/js/__internal/grids/new/card_view/di.ts +++ b/packages/devextreme/js/__internal/grids/new/card_view/di.ts @@ -1,5 +1,6 @@ /* eslint-disable spellcheck/spell-checker */ import type { DIContext } from '@ts/core/di'; +import { setupStateManager } from '@ts/core/state_manager/index'; import * as BaseContentViewModule from '../grid_core/content_view/index'; import { BaseContextMenuController } from '../grid_core/context_menu/controller'; @@ -11,6 +12,8 @@ import { HeaderPanelController } from './header_panel/controller'; import { HeaderPanelView } from './header_panel/view'; export function register(diContext: DIContext): void { + setupStateManager({ diContext, componentName: 'CardView' }); + gridCoreDIRegister(diContext); diContext.register(ContentViewModule.View); diff --git a/packages/devextreme/js/__internal/grids/new/card_view/header_panel/view.tsx b/packages/devextreme/js/__internal/grids/new/card_view/header_panel/view.tsx index 7383382eb241..3d3501f982cb 100644 --- a/packages/devextreme/js/__internal/grids/new/card_view/header_panel/view.tsx +++ b/packages/devextreme/js/__internal/grids/new/card_view/header_panel/view.tsx @@ -1,5 +1,5 @@ /* eslint-disable spellcheck/spell-checker */ -import { computed, type ReadonlySignal } from '@preact/signals-core'; +import { computed, type ReadonlySignal } from '@ts/core/state_manager/index'; import { ColumnsController } from '@ts/grids/new/grid_core/columns_controller/columns_controller'; import { View } from '@ts/grids/new/grid_core/core/view'; import { KeyboardNavigationController, NavigationStrategyHorizontalList } from '@ts/grids/new/grid_core/keyboard_navigation/index'; diff --git a/packages/devextreme/js/__internal/grids/new/card_view/main_view.tsx b/packages/devextreme/js/__internal/grids/new/card_view/main_view.tsx index ef691e88589e..f6523bc68c08 100644 --- a/packages/devextreme/js/__internal/grids/new/card_view/main_view.tsx +++ b/packages/devextreme/js/__internal/grids/new/card_view/main_view.tsx @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ -import { computed } from '@preact/signals-core'; +import { computed } from '@ts/core/state_manager/index'; import { ColumnChooserView } from '@ts/grids/new/grid_core/column_chooser/index'; import { View } from '@ts/grids/new/grid_core/core/view'; import { FilterPanelView } from '@ts/grids/new/grid_core/filtering/filter_panel/view'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/accessibility/controller.ts b/packages/devextreme/js/__internal/grids/new/grid_core/accessibility/controller.ts index 630504dadff0..7d71a505890a 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/accessibility/controller.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/accessibility/controller.ts @@ -1,5 +1,5 @@ import messageLocalization from '@js/localization/message'; -import { computed, effect, signal } from '@preact/signals-core'; +import { computed, effect, signal } from '@ts/core/state_manager/index'; import { ColumnsController } from '../columns_controller/columns_controller'; import { DataController } from '../data_controller/index'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/column_chooser/controller.mock.ts b/packages/devextreme/js/__internal/grids/new/grid_core/column_chooser/controller.mock.ts index 5e3a2ea22612..a4153ff9076f 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/column_chooser/controller.mock.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/column_chooser/controller.mock.ts @@ -1,5 +1,5 @@ import dxTreeView from '@js/ui/tree_view'; -import { effect } from '@preact/signals-core'; +import { effect } from '@ts/core/state_manager/index'; import type { ColumnsController } from '../columns_controller/index'; import type { OptionsController } from '../options_controller/options_controller'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/column_chooser/controller.ts b/packages/devextreme/js/__internal/grids/new/grid_core/column_chooser/controller.ts index 7097199af1e8..b6d43f4fad5c 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/column_chooser/controller.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/column_chooser/controller.ts @@ -1,7 +1,7 @@ import $ from '@js/core/renderer'; import type * as SortableTypes from '@js/ui/sortable_types'; import type { Item as TreeViewItemProperties, SelectionChangedEvent } from '@js/ui/tree_view'; -import { computed, type ReadonlySignal, signal } from '@preact/signals-core'; +import { computed, type ReadonlySignal, signal } from '@ts/core/state_manager/index'; import { sortColumns } from '@ts/grids/grid_core/columns_controller/m_columns_controller_utils'; import type { DraggingColumnData } from '../../card_view/header_panel/column_sortable'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/column_chooser/view.tsx b/packages/devextreme/js/__internal/grids/new/grid_core/column_chooser/view.tsx index 34c05398fa1e..8996f744b62f 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/column_chooser/view.tsx +++ b/packages/devextreme/js/__internal/grids/new/grid_core/column_chooser/view.tsx @@ -5,8 +5,8 @@ import type { Properties as PopupProperties, ToolbarItem } from '@js/ui/popup'; import type dxPopup from '@js/ui/popup'; import type { Properties as TreeViewProperties } from '@js/ui/tree_view'; import type dxTreeView from '@js/ui/tree_view'; -import type { ReadonlySignal } from '@preact/signals-core'; -import { computed, signal } from '@preact/signals-core'; +import type { ReadonlySignal } from '@ts/core/state_manager/index'; +import { computed, signal } from '@ts/core/state_manager/index'; import { createRef } from 'inferno'; import type { Props as ColumnSortableProps } from '../../card_view/header_panel/column_sortable'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/columns_controller/columns_controller.ts b/packages/devextreme/js/__internal/grids/new/grid_core/columns_controller/columns_controller.ts index f6315693d5fa..6f6876098824 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/columns_controller/columns_controller.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/columns_controller/columns_controller.ts @@ -1,5 +1,5 @@ -import type { ReadonlySignal, Signal } from '@preact/signals-core'; -import { computed, effect, signal } from '@preact/signals-core'; +import type { ReadonlySignal, Signal } from '@ts/core/state_manager/index'; +import { computed, effect, signal } from '@ts/core/state_manager/index'; import type { DataObject } from '@ts/grids/new/grid_core/data_controller/types'; import type { HeaderFilterRootOptions } from '@ts/grids/new/grid_core/filtering/header_filter/index'; import { isColumnFilterable, mergeColumnHeaderFilterOptions } from '@ts/grids/new/grid_core/filtering/header_filter/utils'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/content_view/view.tsx b/packages/devextreme/js/__internal/grids/new/grid_core/content_view/view.tsx index 44a4784dda4b..bd4218ca18c2 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/content_view/view.tsx +++ b/packages/devextreme/js/__internal/grids/new/grid_core/content_view/view.tsx @@ -5,7 +5,7 @@ import $ from '@js/core/renderer'; import type dxScrollable from '@js/ui/scroll_view/ui.scrollable'; import type { ScrollEventInfo } from '@js/ui/scroll_view/ui.scrollable'; -import { computed, signal } from '@preact/signals-core'; +import { computed, signal } from '@ts/core/state_manager/index'; import { ColumnsController } from '@ts/grids/new/grid_core/columns_controller/columns_controller'; import { BaseContextMenuController } from '@ts/grids/new/grid_core/context_menu/controller'; import { View } from '@ts/grids/new/grid_core/core/view'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/context_menu/view.ts b/packages/devextreme/js/__internal/grids/new/grid_core/context_menu/view.ts index cd86c87224c5..b15c39afc281 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/context_menu/view.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/context_menu/view.ts @@ -1,8 +1,8 @@ import type { InitializedEvent, ItemClickEvent, } from '@js/ui/context_menu'; -import type { ReadonlySignal } from '@preact/signals-core'; -import { computed } from '@preact/signals-core'; +import type { ReadonlySignal } from '@ts/core/state_manager/index'; +import { computed } from '@ts/core/state_manager/index'; import { View } from '../core/view'; import type { ContextMenuProps } from './context_menu'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/core/view.tsx b/packages/devextreme/js/__internal/grids/new/grid_core/core/view.tsx index 5ac1341580aa..9b78492c5c7a 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/core/view.tsx +++ b/packages/devextreme/js/__internal/grids/new/grid_core/core/view.tsx @@ -3,10 +3,10 @@ /* eslint-disable @typescript-eslint/explicit-function-return-type */ /* eslint-disable max-classes-per-file */ -import type { ReadonlySignal } from '@preact/signals-core'; -import { effect } from '@preact/signals-core'; import { infernoRenderer } from '@ts/core/m_inferno_renderer'; import { BaseInfernoComponent } from '@ts/core/r1/runtime/inferno/base_component'; +import type { ReadonlySignal } from '@ts/core/state_manager/index'; +import { effect } from '@ts/core/state_manager/index'; import { hasWindow } from '@ts/core/utils/m_window'; import { type ComponentType } from 'inferno'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/data_controller/compatibility.ts b/packages/devextreme/js/__internal/grids/new/grid_core/data_controller/compatibility.ts index 5a8d45303865..7c43c541af09 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/data_controller/compatibility.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/data_controller/compatibility.ts @@ -1,6 +1,6 @@ import createCallback from '@js/core/utils/callbacks'; import type DataSource from '@js/data/data_source'; -import { effect } from '@preact/signals-core'; +import { effect } from '@ts/core/state_manager/index'; import { DataController } from './data_controller'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/data_controller/data_controller.ts b/packages/devextreme/js/__internal/grids/new/grid_core/data_controller/data_controller.ts index 02875f1389db..56213109e9ed 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/data_controller/data_controller.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/data_controller/data_controller.ts @@ -3,8 +3,8 @@ import type { FilterDescriptor } from '@js/common/data.types'; import ArrayStore from '@js/common/data/array_store'; import { Deferred } from '@js/core/utils/deferred'; import { isDefined, isPlainObject } from '@js/core/utils/type'; -import type { ReadonlySignal } from '@preact/signals-core'; -import { computed, effect, signal } from '@preact/signals-core'; +import type { ReadonlySignal } from '@ts/core/state_manager/index'; +import { computed, effect, signal } from '@ts/core/state_manager/index'; import { equalByValue } from '@ts/core/utils/m_common'; import type { PromiseWithResolvers } from '@ts/core/utils/promise'; import { createPromise } from '@ts/core/utils/promise'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/data_controller/store_load_adapter/store_load_adapter.test.ts b/packages/devextreme/js/__internal/grids/new/grid_core/data_controller/store_load_adapter/store_load_adapter.test.ts index 70220ffb16f9..24fa16e84a68 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/data_controller/store_load_adapter/store_load_adapter.test.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/data_controller/store_load_adapter/store_load_adapter.test.ts @@ -3,7 +3,7 @@ import { } from '@jest/globals'; import type { DataSource } from '@js/common/data'; import { Deferred } from '@js/core/utils/deferred'; -import { signal } from '@preact/signals-core'; +import { signal } from '@ts/core/state_manager/index'; import type { InternalLoadOptions, OperationOptions } from '@ts/grids/new/grid_core/data_controller/types'; import { StoreLoadAdapter } from './store_load_adapter'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/data_controller/store_load_adapter/store_load_adapter.ts b/packages/devextreme/js/__internal/grids/new/grid_core/data_controller/store_load_adapter/store_load_adapter.ts index e355e7d6c467..f414af5d0c81 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/data_controller/store_load_adapter/store_load_adapter.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/data_controller/store_load_adapter/store_load_adapter.ts @@ -1,7 +1,7 @@ import type { DataSource, LoadResult } from '@js/common/data'; import type { DeferredObj } from '@js/core/utils/deferred'; import { Deferred } from '@js/core/utils/deferred'; -import type { ReadonlySignal } from '@preact/signals-core'; +import type { ReadonlySignal } from '@ts/core/state_manager/index'; import { deferredCache } from '../deferred_cache'; import type { InternalLoadOptions, OperationOptions } from '../types'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/editing/controller.ts b/packages/devextreme/js/__internal/grids/new/grid_core/editing/controller.ts index 65d4888361ba..a63bf8b75ff0 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/editing/controller.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/editing/controller.ts @@ -2,7 +2,7 @@ /* eslint-disable spellcheck/spell-checker */ import { applyChanges } from '@js/common/data'; import { isDefined } from '@js/core/utils/type'; -import { computed, type Signal } from '@preact/signals-core'; +import { computed, type Signal } from '@ts/core/state_manager/index'; import { generateNewRowTempKey } from '@ts/grids/grid_core/editing/m_editing_utils'; import { OptionsValidationController } from '@ts/grids/new/grid_core/options_validation/index'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/editing/popup/view.ts b/packages/devextreme/js/__internal/grids/new/grid_core/editing/popup/view.ts index 69cb87f73b1a..99120b3276af 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/editing/popup/view.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/editing/popup/view.ts @@ -4,8 +4,8 @@ import type { DataType } from '@js/common'; import $ from '@js/core/renderer'; import type * as dxForm from '@js/ui/form'; -import type { ReadonlySignal } from '@preact/signals-core'; -import { computed, signal } from '@preact/signals-core'; +import type { ReadonlySignal } from '@ts/core/state_manager/index'; +import { computed, signal } from '@ts/core/state_manager/index'; import { extend } from '@ts/core/utils/m_extend'; import { forEachFormItems } from '@ts/grids/grid_core/editing/m_editing_utils'; import { createRef } from 'inferno'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/error_controller/error_controller.ts b/packages/devextreme/js/__internal/grids/new/grid_core/error_controller/error_controller.ts index e29a304f14a5..72aa7864f465 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/error_controller/error_controller.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/error_controller/error_controller.ts @@ -1,5 +1,5 @@ -import type { ReadonlySignal } from '@preact/signals-core'; -import { signal } from '@preact/signals-core'; +import type { ReadonlySignal } from '@ts/core/state_manager/index'; +import { signal } from '@ts/core/state_manager/index'; export interface GridError { text: string; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/filtering/filter_controller.ts b/packages/devextreme/js/__internal/grids/new/grid_core/filtering/filter_controller.ts index 204985195e9a..32cf8bb068d3 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/filtering/filter_controller.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/filtering/filter_controller.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-unsafe-return */ -import { computed } from '@preact/signals-core'; +import { computed } from '@ts/core/state_manager/index'; import gridCoreUtils from '@ts/grids/grid_core/m_utils'; import type { Column } from '@ts/grids/new/grid_core/columns_controller/types'; import { getColumnByIndexOrName } from '@ts/grids/new/grid_core/columns_controller/utils'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/filtering/filter_panel/view.tsx b/packages/devextreme/js/__internal/grids/new/grid_core/filtering/filter_panel/view.tsx index 304adb0660a4..b1cf094ca83f 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/filtering/filter_panel/view.tsx +++ b/packages/devextreme/js/__internal/grids/new/grid_core/filtering/filter_panel/view.tsx @@ -1,4 +1,4 @@ -import { computed, type ReadonlySignal } from '@preact/signals-core'; +import { computed, type ReadonlySignal } from '@ts/core/state_manager/index'; import { FilterBuilderView as OldFilterBuilderView } from '@ts/grids/grid_core/filter/m_filter_builder'; import { FilterPanelView as OldFilterPanelView } from '@ts/grids/grid_core/filter/m_filter_panel'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/filtering/filter_sync/controller.ts b/packages/devextreme/js/__internal/grids/new/grid_core/filtering/filter_sync/controller.ts index ed815ca6e8e8..a3918ce0979a 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/filtering/filter_sync/controller.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/filtering/filter_sync/controller.ts @@ -1,7 +1,7 @@ -// import type { ReadonlySignal } from '@preact/signals-core'; -// import { computed } from '@preact/signals-core'; +// import type { ReadonlySignal } from '@ts/core/state_manager/index'; +// import { computed } from '@ts/core/state_manager/index'; import { equalByValue } from '@js/core/utils/common'; -import { batch, effect } from '@preact/signals-core'; +import { batch, effect } from '@ts/core/state_manager/index'; import { getMatchedConditions } from '@ts/filter_builder/m_utils'; import type { HeaderFilterInfo } from '@ts/grids/new/grid_core/filtering/header_filter/types'; import { SearchController } from '@ts/grids/new/grid_core/search/index'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/filtering/header_filter/controller.ts b/packages/devextreme/js/__internal/grids/new/grid_core/filtering/header_filter/controller.ts index 5c2923d584f0..50fff68b5afe 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/filtering/header_filter/controller.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/filtering/header_filter/controller.ts @@ -1,5 +1,5 @@ -import type { ReadonlySignal } from '@preact/signals-core'; -import { computed } from '@preact/signals-core'; +import type { ReadonlySignal } from '@ts/core/state_manager/index'; +import { computed } from '@ts/core/state_manager/index'; import { ColumnsController } from '@ts/grids/new/grid_core/columns_controller/index'; import type { HeaderFilterInfo } from '@ts/grids/new/grid_core/filtering/header_filter/types'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/filtering/header_filter/view.test.tsx b/packages/devextreme/js/__internal/grids/new/grid_core/filtering/header_filter/view.test.tsx index 34a7f3fdae7d..41d9e8608690 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/filtering/header_filter/view.test.tsx +++ b/packages/devextreme/js/__internal/grids/new/grid_core/filtering/header_filter/view.test.tsx @@ -11,7 +11,7 @@ import { it, jest, } from '@jest/globals'; -import { signal } from '@preact/signals-core'; +import { signal } from '@ts/core/state_manager/index'; import { render, rerender } from 'inferno'; import type { PopupState } from './types'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/filtering/header_filter/view.tsx b/packages/devextreme/js/__internal/grids/new/grid_core/filtering/header_filter/view.tsx index 05e44f058508..5d7b0ef9c6aa 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/filtering/header_filter/view.tsx +++ b/packages/devextreme/js/__internal/grids/new/grid_core/filtering/header_filter/view.tsx @@ -1,7 +1,7 @@ /* eslint-disable max-classes-per-file */ import type { dxElementWrapper } from '@js/core/renderer'; import $ from '@js/core/renderer'; -import { computed, effect, type ReadonlySignal } from '@preact/signals-core'; +import { computed, effect, type ReadonlySignal } from '@ts/core/state_manager/index'; import { HeaderFilterView as OldHeaderFilterPopup } from '@ts/grids/grid_core/header_filter/m_header_filter_core'; import { View } from '@ts/grids/new/grid_core/core/view'; import { WidgetMock } from '@ts/grids/new/grid_core/widget_mock'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/filtering/header_filter/view_controller.ts b/packages/devextreme/js/__internal/grids/new/grid_core/filtering/header_filter/view_controller.ts index 6c3348ac019f..a02f1154ca37 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/filtering/header_filter/view_controller.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/filtering/header_filter/view_controller.ts @@ -1,6 +1,6 @@ /* eslint-disable spellcheck/spell-checker */ -import type { ReadonlySignal } from '@preact/signals-core'; -import { signal } from '@preact/signals-core'; +import type { ReadonlySignal } from '@ts/core/state_manager/index'; +import { signal } from '@ts/core/state_manager/index'; import { removeFieldConditionsFromFilter } from '@ts/filter_builder/m_utils'; import gridCoreUtils from '@ts/grids/grid_core/m_utils'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/items_controller/items_controller.ts b/packages/devextreme/js/__internal/grids/new/grid_core/items_controller/items_controller.ts index 2442478265c2..a164b21bae27 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/items_controller/items_controller.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/items_controller/items_controller.ts @@ -1,6 +1,6 @@ import { equalByValue } from '@js/core/utils/common'; import formatHelper from '@js/format_helper'; -import { computed, signal } from '@preact/signals-core'; +import { computed, signal } from '@ts/core/state_manager/index'; import { ColumnsController } from '@ts/grids/new/grid_core/columns_controller/columns_controller'; import { DataController } from '@ts/grids/new/grid_core/data_controller/data_controller'; import { SearchController } from '@ts/grids/new/grid_core/search/index'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/options_controller/component.mock.ts b/packages/devextreme/js/__internal/grids/new/grid_core/options_controller/component.mock.ts index 76fc80d2e249..74e6f67a2962 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/options_controller/component.mock.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/options_controller/component.mock.ts @@ -1,5 +1,5 @@ import { Component } from '@js/core/component'; -import { signal } from '@preact/signals-core'; +import { signal } from '@ts/core/state_manager/index'; import { extend } from '@ts/core/utils/m_extend'; // NOTE: We cannot modify the base "_getDefaultOptions" method with Component base class params diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/options_controller/options_controller_base.ts b/packages/devextreme/js/__internal/grids/new/grid_core/options_controller/options_controller_base.ts index ff4100ca85ee..0b41813464a1 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/options_controller/options_controller_base.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/options_controller/options_controller_base.ts @@ -4,8 +4,8 @@ import { Component } from '@js/core/component'; import { getPathParts } from '@js/core/utils/data'; import type { ChangedOptionInfo } from '@js/events'; -import type { ReadonlySignal, Signal } from '@preact/signals-core'; -import { computed, effect, signal } from '@preact/signals-core'; +import type { ReadonlySignal, Signal } from '@ts/core/state_manager/index'; +import { computed, effect, signal } from '@ts/core/state_manager/index'; import { extend } from '@ts/core/utils/m_extend'; import type { ComponentType } from 'inferno'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/pager/view.tsx b/packages/devextreme/js/__internal/grids/new/grid_core/pager/view.tsx index e9e0557ad048..060e2010b518 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/pager/view.tsx +++ b/packages/devextreme/js/__internal/grids/new/grid_core/pager/view.tsx @@ -1,5 +1,5 @@ -import type { ReadonlySignal, Signal } from '@preact/signals-core'; -import { computed, effect, signal } from '@preact/signals-core'; +import type { ReadonlySignal, Signal } from '@ts/core/state_manager/index'; +import { computed, effect, signal } from '@ts/core/state_manager/index'; import { MAX_PAGES_COUNT } from '@ts/grids/grid_core/pager/m_pager'; import { View } from '../core/view'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/search/controller.ts b/packages/devextreme/js/__internal/grids/new/grid_core/search/controller.ts index 5d9511246ca4..02b3d706d5ce 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/search/controller.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/search/controller.ts @@ -1,5 +1,5 @@ -import type { ReadonlySignal } from '@preact/signals-core'; -import { computed } from '@preact/signals-core'; +import type { ReadonlySignal } from '@ts/core/state_manager/index'; +import { computed } from '@ts/core/state_manager/index'; import type { Options as SearchOptions } from '@ts/grids/new/grid_core/search/options'; import type { HighlightedTextItem, HighlightTextOptions } from '@ts/grids/new/grid_core/search/types'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/search/view.tsx b/packages/devextreme/js/__internal/grids/new/grid_core/search/view.tsx index 6d385be9636b..bc83582fe722 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/search/view.tsx +++ b/packages/devextreme/js/__internal/grids/new/grid_core/search/view.tsx @@ -1,6 +1,6 @@ import type { TextBoxInstance } from '@js/ui/text_box'; -import type { Signal } from '@preact/signals-core'; -import { effect, signal } from '@preact/signals-core'; +import type { Signal } from '@ts/core/state_manager/index'; +import { effect, signal } from '@ts/core/state_manager/index'; import { ToolbarController } from '@ts/grids/new/grid_core/toolbar/controller'; import { OptionsController } from '../options_controller/options_controller'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/selection/controller.ts b/packages/devextreme/js/__internal/grids/new/grid_core/selection/controller.ts index 936b6101f597..74071d3d17a8 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/selection/controller.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/selection/controller.ts @@ -3,8 +3,8 @@ import type { DeferredObj } from '@js/core/utils/deferred'; import messageLocalization from '@js/localization/message'; -import type { ReadonlySignal } from '@preact/signals-core'; -import { computed, effect, signal } from '@preact/signals-core'; +import type { ReadonlySignal } from '@ts/core/state_manager/index'; +import { computed, effect, signal } from '@ts/core/state_manager/index'; import { DataController } from '@ts/grids/new/grid_core/data_controller/index'; import { OptionsValidationController } from '@ts/grids/new/grid_core/options_validation/index'; import { ShowCheckBoxesMode } from '@ts/grids/new/grid_core/selection/const'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/sorting_controller/controller.ts b/packages/devextreme/js/__internal/grids/new/grid_core/sorting_controller/controller.ts index fe9633b6ad00..0bb0af2c3563 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/sorting_controller/controller.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/sorting_controller/controller.ts @@ -1,6 +1,6 @@ import type { SortOrder } from '@js/common'; -import type { ReadonlySignal } from '@preact/signals-core'; -import { batch, computed } from '@preact/signals-core'; +import type { ReadonlySignal } from '@ts/core/state_manager/index'; +import { batch, computed } from '@ts/core/state_manager/index'; import { ColumnsController } from '../columns_controller/index'; import type { Column } from '../columns_controller/types'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/toolbar/controller.test.ts b/packages/devextreme/js/__internal/grids/new/grid_core/toolbar/controller.test.ts index 21c621a7248d..c25eec1b729c 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/toolbar/controller.test.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/toolbar/controller.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from '@jest/globals'; -import { signal } from '@preact/signals-core'; +import { signal } from '@ts/core/state_manager/index'; import { getContext } from '../di.test_utils'; import type { Options } from '../options'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/toolbar/controller.ts b/packages/devextreme/js/__internal/grids/new/grid_core/toolbar/controller.ts index 8ba099e5538d..9fc76f4c88ed 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/toolbar/controller.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/toolbar/controller.ts @@ -1,5 +1,5 @@ -import type { ReadonlySignal } from '@preact/signals-core'; -import { computed, effect, signal } from '@preact/signals-core'; +import type { ReadonlySignal } from '@ts/core/state_manager/index'; +import { computed, effect, signal } from '@ts/core/state_manager/index'; import { OptionsController } from '../options_controller/options_controller'; import { DEFAULT_TOOLBAR_ITEMS } from './const'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/toolbar/view.tsx b/packages/devextreme/js/__internal/grids/new/grid_core/toolbar/view.tsx index da9cfade7ae6..17b4939fab83 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/toolbar/view.tsx +++ b/packages/devextreme/js/__internal/grids/new/grid_core/toolbar/view.tsx @@ -1,5 +1,5 @@ -import type { ReadonlySignal } from '@preact/signals-core'; -import { computed } from '@preact/signals-core'; +import type { ReadonlySignal } from '@ts/core/state_manager/index'; +import { computed } from '@ts/core/state_manager/index'; import { BaseContextMenuController } from '../context_menu/controller'; import { View } from '../core/view'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/widget.ts b/packages/devextreme/js/__internal/grids/new/grid_core/widget.ts index 5ad82b3bc8b2..76725b7d6086 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/widget.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/widget.ts @@ -4,10 +4,10 @@ // eslint-disable-next-line max-classes-per-file import { extend } from '@js/core/utils/extend'; import Widget from '@js/ui/widget/ui.widget'; -import type { Signal } from '@preact/signals-core'; -import { signal } from '@preact/signals-core'; import { DIContext } from '@ts/core/di/index'; import { infernoRenderer } from '@ts/core/m_inferno_renderer'; +import type { Signal } from '@ts/core/state_manager/index'; +import { signal } from '@ts/core/state_manager/index'; import { SearchView } from '@ts/grids/new/grid_core/search/view'; import { rerender } from 'inferno'; diff --git a/packages/devextreme/js/__internal/tsconfig.json b/packages/devextreme/js/__internal/tsconfig.json index 9d7a7da7d45c..ef7b75886f34 100644 --- a/packages/devextreme/js/__internal/tsconfig.json +++ b/packages/devextreme/js/__internal/tsconfig.json @@ -39,6 +39,12 @@ "./*" ], }, + "lib": [ + "es2020", + "es2021.weakref", + "dom", + "dom.iterable" + ], "types": [] }, "tsc-alias": { diff --git a/packages/devextreme/package.json b/packages/devextreme/package.json index 8cc398c84614..5d8d10c2d3c5 100644 --- a/packages/devextreme/package.json +++ b/packages/devextreme/package.json @@ -246,8 +246,10 @@ "validate-ts": "gulp validate-ts", "validate-declarations": "dx-tools validate-declarations --sources ./js --exclude \"js/(renovation|__internal|.eslintrc.js)\" --compiler-options \"{ \\\"typeRoots\\\": [] }\"", "testcafe-in-docker": "docker build -f ./testing/testcafe/docker/Dockerfile -t testcafe-testing . && docker run -it testcafe-testing", - "test-jest": "jest --no-coverage --runInBand", + "test-jest": "cross-env NODE_OPTIONS='--expose-gc' jest --no-coverage --runInBand --selectProjects jsdom-tests", "test-jest:watch": "jest --watch", + "test-jest:node": "jest --no-coverage --runInBand --selectProjects node-tests", + "test-jest:all": "pnpm test-jest && pnpm test-jest:node", "qunit-in-docker": "gulp qunit-in-docker --constel", "tcd-update": "tcd-update" }, diff --git a/packages/devextreme/project.json b/packages/devextreme/project.json index ba19c7f587a6..af01278ebc6c 100644 --- a/packages/devextreme/project.json +++ b/packages/devextreme/project.json @@ -152,10 +152,11 @@ "test-jest": { "executor": "nx:run-script", "options": { - "script": "test-jest" + "script": "test-jest:all" }, "inputs": [ "{projectRoot}/js/**/*", + "{projectRoot}/build/**/*", "{projectRoot}/jest.*" ], "cache": true diff --git a/packages/devextreme/testing/runner/Views/Main/RunSuite.cshtml b/packages/devextreme/testing/runner/Views/Main/RunSuite.cshtml index c8947f1dc607..16433e6c4677 100644 --- a/packages/devextreme/testing/runner/Views/Main/RunSuite.cshtml +++ b/packages/devextreme/testing/runner/Views/Main/RunSuite.cshtml @@ -169,6 +169,10 @@ '; + +test('Script inside cell text should not be executed after opening header filter', async (t) => { + const cardView = new CardView('#container'); + + await t.click( + cardView.getHeaderPanel().getHeaderItem().getFilterIcon(), + ); + + await t.expect( + cardView.getHeaderFilterList().getItem(0).text, + ).eql(UNSAFE_TEXT); +}).before(async () => createWidget('dxCardView', { + columns: ['caption'], + headerFilter: { + visible: true, + }, + dataSource: [ + { id: 1, caption: UNSAFE_TEXT }, + ], +})); From 549551a46d8335474c9a472c43bae5b4a2e42f30 Mon Sep 17 00:00:00 2001 From: Arman Boyakhchyan Date: Fri, 22 Aug 2025 11:27:07 +0400 Subject: [PATCH 042/101] Chart: Update demo desc. following feedback (#30849) --- apps/demos/Demos/Charts/Crosshair/description.md | 10 +++++----- apps/demos/Demos/Charts/FunnelChart/description.md | 14 +++++++------- apps/demos/Demos/Charts/HoverMode/description.md | 8 ++++---- .../Demos/Charts/MultiplePanes/description.md | 4 ++-- apps/demos/Demos/Charts/ParetoChart/description.md | 8 ++++---- .../Charts/PieResolveLabelOverlap/description.md | 2 +- apps/demos/Demos/Charts/PointImage/description.md | 4 ++-- .../demos/Demos/Charts/PyramidChart/description.md | 4 ++-- .../Demos/Charts/SmallValueGroups/description.md | 4 ++-- apps/demos/Demos/Charts/StepLine/description.md | 2 +- apps/demos/Demos/Charts/TooltipAPI/description.md | 2 +- 11 files changed, 31 insertions(+), 31 deletions(-) diff --git a/apps/demos/Demos/Charts/Crosshair/description.md b/apps/demos/Demos/Charts/Crosshair/description.md index 13a2b24e1e7c..17b5160fb352 100644 --- a/apps/demos/Demos/Charts/Crosshair/description.md +++ b/apps/demos/Demos/Charts/Crosshair/description.md @@ -1,15 +1,15 @@ -The DevExtreme Chart component supports crosshairs (vertical and horizontal lines centered on a data point). When enabled, the crosshair follows the cursor and snaps to the nearest series point. To configure crosshair settings, specify the [crosshair](/Documentation/ApiReference/UI_Components/dxChart/Configuration/crosshair/) object. +The DevExtreme Chart component ships with integrated crosshair support (vertical and horizontal lines centered on a data point). When enabled, the crosshair follows the cursor and snaps to the nearest series point. To configure crosshair settings, specify the [crosshair](/Documentation/ApiReference/UI_Components/dxChart/Configuration/crosshair/) object. This demo configures the following **crosshair** properties: - [color](/Documentation/ApiReference/UI_Components/dxChart/Configuration/crosshair/#color) -Specifies the line color. +Specifies line color. - [width](/Documentation/ApiReference/UI_Components/dxChart/Configuration/crosshair/#width) -Configures the line width. +Configures line width. - [dashStyle](/Documentation/ApiReference/UI_Components/dxChart/Configuration/crosshair/#dashStyle) -Specifies the line style. +Specifies line style. - [label](/Documentation/ApiReference/UI_Components/dxChart/Configuration/crosshair/label/) Configures labels (text and appearance). -You can configure **crosshair**.[horizontalLine](/Documentation/ApiReference/UI_Components/dxChart/Configuration/crosshair/horizontalLine/) and **crosshair**.[verticalLine](/Documentation/ApiReference/UI_Components/dxChart/Configuration/crosshair/verticalLine/) objects to override settings for each line individually. \ No newline at end of file +To override settings for each line individually, configure **crosshair**.[horizontalLine](/Documentation/ApiReference/UI_Components/dxChart/Configuration/crosshair/horizontalLine/) and **crosshair**.[verticalLine](/Documentation/ApiReference/UI_Components/dxChart/Configuration/crosshair/verticalLine/) objects. \ No newline at end of file diff --git a/apps/demos/Demos/Charts/FunnelChart/description.md b/apps/demos/Demos/Charts/FunnelChart/description.md index 77371670dc54..8a68ce494cae 100644 --- a/apps/demos/Demos/Charts/FunnelChart/description.md +++ b/apps/demos/Demos/Charts/FunnelChart/description.md @@ -1,13 +1,13 @@ -DevExtreme Funnel displays the flow of data over different stages. This demo displays conversion rates from website visits to product renewals. +DevExtreme Funnel displays data/information flow across different stages/periods. This demo displays conversion rates from website visits to product renewals. This demo configures the following objects: - [title](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/title/) -Specifies the component title. +Specifies component title. - [export](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/export/) -Configures export settings. Funnel supports the following export [formats](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/export/#formats): PNG, PDF, JPEG, SVG, and GIF. +Configures export settings. Our Funnel Chart supports the following export [formats](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/export/#formats): PNG, PDF, JPEG, SVG, and GIF. - [tooltip](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/tooltip/) Specifies item tooltips. - [label](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/label/) @@ -17,13 +17,13 @@ Customizes item appearance. [note] -Use our DevExpress BI Dashboard to embed interactive business intelligence into your next web app. +Use the DevExpress BI Dashboard to embed interactive business intelligence into your next web app. -The Web Dashboard is a data analysis UI component that you can embed into your ASP.NET Core or Angular, React, and Vue applications with .NET backend. Dashboards allow you to display multiple inter-connected data analysis elements such as grids, charts, maps, gauges, and others: all within an automatically-arranged layout. +Our Web Dashboard is a data analysis UI component you can embed into your ASP.NET Core or Angular, React, and Vue applications with a .NET backend. DevExpress Dashboards allow you to display multiple inter-connected data analysis elements such as grids, charts, maps, gauges, and others: all within an auto-arranged layout. -The set of components allows you to deploy an all-in-one solution and switch between Viewer and Designer modes directly on the web client (includes adaptive layouts for tablet & mobile). +DevExpress Dashboard allows you to deploy an all-in-one solution and switch between Viewer and Designer modes directly within the web client (includes built-in adaptive layouts for tablet & mobile devices). -The Web Dashboard is available as a part of a Universal subscription. +DevExpress is available as part of a Universal subscription. [Get Started with DevExpress BI Dashboard](https://docs.devexpress.com/Dashboard/115955/web-dashboard) | [Explore Demos](https://demos.devexpress.com/Dashboard/) diff --git a/apps/demos/Demos/Charts/HoverMode/description.md b/apps/demos/Demos/Charts/HoverMode/description.md index 577bfff6e9b9..9b5abd8c5001 100644 --- a/apps/demos/Demos/Charts/HoverMode/description.md +++ b/apps/demos/Demos/Charts/HoverMode/description.md @@ -1,4 +1,4 @@ -DevExtreme Chart supports configurable hover modes for series and points. This demo specifies properties that set common **hoverMode** for all series/points and a custom mode for the component legend. +DevExtreme Chart supports configurable hover modes for both series and points. This demo applies a common **hoverMode** for all series/points and a custom mode for the component legend. You can specify **hoverMode** for the following Chart elements: @@ -8,7 +8,7 @@ A specific series. - [commonSeriesSettings](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/#hoverMode) All series. - **commonSeriesSettings**.[spline](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/#spline) (or other [Series Type](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/) objects) -All series of a specific type. +All series (specific type). - [legend](/Documentation/ApiReference/UI_Components/dxChart/Configuration/legend/#hoverMode) Series hovered in the Chart legend. - **series**.[point](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/point/#hoverMode) @@ -16,8 +16,8 @@ Points in a specific series. - **commonSeriesSettings**.[point](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/point/#hoverMode) (or other Series Type objects) All points. - **commonSeriesSettings**.**spline**.**point** -All points in series of a specific type. +All points in series (specific type). - [argumentAxis](/Documentation/ApiReference/UI_Components/dxChart/Configuration/argumentAxis/#hoverMode) All points at common argument values. -To further customize Chart behavior, define the [stickyHovering](/Documentation/ApiReference/UI_Components/dxChart/Configuration/#stickyHovering) property. When enabled (default), points remain in the hover state until users hover the mouse pointer over other points or move it outside the component. \ No newline at end of file +To further customize Chart behavior, define the [stickyHovering](/Documentation/ApiReference/UI_Components/dxChart/Configuration/#stickyHovering) property. When enabled (default), points remain in a hovered state until users hover the mouse pointer over other points or move it outside the bounds of the component. \ No newline at end of file diff --git a/apps/demos/Demos/Charts/MultiplePanes/description.md b/apps/demos/Demos/Charts/MultiplePanes/description.md index 5926ca1920b5..668dea8edf30 100644 --- a/apps/demos/Demos/Charts/MultiplePanes/description.md +++ b/apps/demos/Demos/Charts/MultiplePanes/description.md @@ -1,7 +1,7 @@ -The DevExtreme Chart component allows you to display data in multiple panes. The component stacks panes vertically (or horizontally when Chart axes are [rotated](/Documentation/ApiReference/UI_Components/dxChart/Configuration/#rotated)). To create a multi-pane chart, add items to the [panes[]](/Documentation/ApiReference/UI_Components/dxChart/Configuration/panes/) array. +The DevExtreme Chart component allows you to display data across multiple panes. DevExtreme Chart stacks panes vertically (or horizontally when Chart axes are [rotated](/Documentation/ApiReference/UI_Components/dxChart/Configuration/#rotated)). To create a multi-pane chart, add items to the [panes[]](/Documentation/ApiReference/UI_Components/dxChart/Configuration/panes/) array. The Chart renders multiple [value axes](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/) and a shared [argument axis](/Documentation/ApiReference/UI_Components/dxChart/Configuration/argumentAxis/). To create multiple value axes, add a **valueAxis[]** object for each value axis. To assign a value axis to a pane, pass the pane [name](/Documentation/ApiReference/UI_Components/dxChart/Configuration/panes/#name) to the **valueAxis**.[pane](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/#pane) property. -DevExtreme Chart can display multiple [series](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/) in a single pane. Specify the **series**.[pane](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#pane) property to display a series in a specific pane. \ No newline at end of file +DevExtreme Chart can display multiple [series](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/) within a single pane. Specify the **series**.[pane](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#pane) property to display a series in a specific pane. \ No newline at end of file diff --git a/apps/demos/Demos/Charts/ParetoChart/description.md b/apps/demos/Demos/Charts/ParetoChart/description.md index 6b4922311a3e..2e61c125c536 100644 --- a/apps/demos/Demos/Charts/ParetoChart/description.md +++ b/apps/demos/Demos/Charts/ParetoChart/description.md @@ -1,9 +1,9 @@ -You can use the DevExtreme Chart component to visualize data as a [Pareto chart](https://en.wikipedia.org/wiki/Pareto_chart). Such charts display individual values along with their cumulative totals. In this demo, individual values are numbers of complaints and cumulative totals are given in percentages. +You can use DevExtreme Chart to visualize data as a [Pareto chart](https://en.wikipedia.org/wiki/Pareto_chart) and display individual values along with their cumulative totals. In this demo, individual values are numbers of complaints and cumulative totals are given in percentages. -Follow the steps below to create a Pareto chart: +To create a Pareto chart you must: 1. Configure a [Bar](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/BarSeries/) series and assign your primary data to this series (specify **series**.[valueField](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#valueField) property). -2. Add a [Line](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/LineSeries/) or [Spline](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/SplineSeries/) series and assign your cumulative total values to this series. -3. Specify **valueAxis**.[constantLines](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/constantLines/) to illustrate [Pareto principle](https://en.wikipedia.org/wiki/Pareto_principle) correlation (80/20). +2. Add a [Line](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/LineSeries/) or [Spline](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/SplineSeries/) series and assign cumulative total values to this series. +3. Specify **valueAxis**.[constantLines](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/constantLines/) to illustrate [Pareto principle](https://en.wikipedia.org/wiki/Pareto_principle) correlations (80/20). diff --git a/apps/demos/Demos/Charts/PieResolveLabelOverlap/description.md b/apps/demos/Demos/Charts/PieResolveLabelOverlap/description.md index 16249085cec4..f190bf5a20c3 100644 --- a/apps/demos/Demos/Charts/PieResolveLabelOverlap/description.md +++ b/apps/demos/Demos/Charts/PieResolveLabelOverlap/description.md @@ -1,2 +1,2 @@ -When a DevExtreme Pie Chart contains a lot of data points or they are crowded, point labels may overlap. Use the [resolveLabelOverlapping](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/#resolveLabelOverlapping) property to resolve overlapping labels. In this demo, you can hide or shift overlapping labels. +When a DevExtreme PieChart contains a large number of data points or if data points are compressed visually, point labels may overlap. Use the [resolveLabelOverlapping](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/#resolveLabelOverlapping) property to minimize the impact of overlapping labels. In this demo, you can hide or shift overlapping labels. diff --git a/apps/demos/Demos/Charts/PointImage/description.md b/apps/demos/Demos/Charts/PointImage/description.md index fef150832cf8..43771c2a38b7 100644 --- a/apps/demos/Demos/Charts/PointImage/description.md +++ b/apps/demos/Demos/Charts/PointImage/description.md @@ -1,4 +1,4 @@ -DevExtreme Chart can display custom images for series points. Specify the **point**.**image** object in [common series](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/point/image/) or [series](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/point/image/) settings to display these images. +DevExtreme Chart can display custom images for series points. Specify the **point**.**image** object within [common series](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/point/image/) or [series](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/point/image/) settings to display these images. -This demo [hides](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/point/#visible) default point [symbols](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/point/#symbol) and calls the [customizePoint](/Documentation/ApiReference/UI_Components/dxChart/Configuration/#customizePoint) function to display images based on point values. +This demo [hides](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/point/#visible) default point [symbols](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/point/#symbol) and calls the [customizePoint](/Documentation/ApiReference/UI_Components/dxChart/Configuration/#customizePoint) function to display images (based on point values). diff --git a/apps/demos/Demos/Charts/PyramidChart/description.md b/apps/demos/Demos/Charts/PyramidChart/description.md index b269071893f6..aadb8998fd89 100644 --- a/apps/demos/Demos/Charts/PyramidChart/description.md +++ b/apps/demos/Demos/Charts/PyramidChart/description.md @@ -1,10 +1,10 @@ -DevExtreme Funnel can display data as a pyramid chart. To create such visualization, set the [algorithm](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/#algorithm) property to *"dynamicHeight"* and [invert the Funnel](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/#inverted). +DevExtreme Funnel can display data/information as a pyramid chart. To generate pyramid visualizations, set the [algorithm](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/#algorithm) property to *"dynamicHeight"* and [invert the Funnel](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/#inverted). This demo configures the following objects: - [title](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/title/) -Specifies the component title. +Specifies component title. - [tooltip](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/tooltip/) Specifies item tooltips. - [item](/Documentation/ApiReference/UI_Components/dxFunnel/Configuration/item/) diff --git a/apps/demos/Demos/Charts/SmallValueGroups/description.md b/apps/demos/Demos/Charts/SmallValueGroups/description.md index 7c010c99baac..4e59e75d8c94 100644 --- a/apps/demos/Demos/Charts/SmallValueGroups/description.md +++ b/apps/demos/Demos/Charts/SmallValueGroups/description.md @@ -1,4 +1,4 @@ -DevExtreme PieChart supports small value grouping. To enable this functionality, configure the [smallValuesGrouping](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/series/smallValuesGrouping/) object in [series](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/series/) or [commonSeriesSettings](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/commonSeriesSettings/). This demo sets **smallValuesGrouping**.[mode](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/series/smallValuesGrouping/) to *"smallValueThreshold"* and specifies the [threshold](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/series/smallValuesGrouping/#threshold) property. +DevExtreme PieChart supports small value grouping operations. To enable this functionality, configure the [smallValuesGrouping](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/series/smallValuesGrouping/) object within [series](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/series/) or [commonSeriesSettings](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/commonSeriesSettings/). This demo sets **smallValuesGrouping**.[mode](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/series/smallValuesGrouping/) to *"smallValueThreshold"* and specifies the [threshold](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/series/smallValuesGrouping/#threshold) property. -You can also set **smallValuesGrouping**.**mode** to *"topN"*. In this mode, PieChart displays a predefined number of the largest data points (specified with [topCount](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/series/smallValuesGrouping/#topCount)) and groups the rest. \ No newline at end of file +You can also set **smallValuesGrouping**.**mode** to *"topN"*. In this mode, our PieChart displays a predefined number of large data points (specified with [topCount](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/series/smallValuesGrouping/#topCount)) and groups the rest. \ No newline at end of file diff --git a/apps/demos/Demos/Charts/StepLine/description.md b/apps/demos/Demos/Charts/StepLine/description.md index 16d39a87e1e8..2c4fac39e53c 100644 --- a/apps/demos/Demos/Charts/StepLine/description.md +++ b/apps/demos/Demos/Charts/StepLine/description.md @@ -1,2 +1,2 @@ -Step line charts display data as points joined by horizontal and vertical line segments that form a step-like pattern. To create a step line chart, set the **series**.[type](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#type) property to *"stepline"*. +Step line charts display data as points joined by horizontal and vertical line segments (forming a step-like pattern). To create a step line chart, set the **series**.[type](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#type) property to *"stepline"*. \ No newline at end of file diff --git a/apps/demos/Demos/Charts/TooltipAPI/description.md b/apps/demos/Demos/Charts/TooltipAPI/description.md index b3d853e9cae8..65cdd7531983 100644 --- a/apps/demos/Demos/Charts/TooltipAPI/description.md +++ b/apps/demos/Demos/Charts/TooltipAPI/description.md @@ -1,2 +1,2 @@ -You can use tooltip API members to manage its visibility in code. This demo creates a [DevExtreme PieChart](/Documentation/Guide/UI_Components/PieChart/Getting_Started_with_PieChart/) and disables its default tooltip. When you click a pie segment or select an item in the "Choose Region" box, a [showTooltip()](/Documentation/ApiReference/UI_Components/dxChart/Chart_Elements/Point/Methods/#showTooltip) method call displays the corresponding tooltip. +You can use tooltip API members to manage tooltip visibility in code. This demo creates a [DevExtreme PieChart](/Documentation/Guide/UI_Components/PieChart/Getting_Started_with_PieChart/) and disables its default tooltip. When you click a pie segment or select an item in the "Choose Region" box, a [showTooltip()](/Documentation/ApiReference/UI_Components/dxChart/Chart_Elements/Point/Methods/#showTooltip) method call displays the corresponding tooltip. \ No newline at end of file From 65b80bf41d63a66d246f8a20ed1db7ca17899191 Mon Sep 17 00:00:00 2001 From: Aleksei Semikozov Date: Fri, 22 Aug 2025 11:35:58 +0400 Subject: [PATCH 043/101] Scheduler: fix all-day appointment rendered in the next resource (#30771) Co-authored-by: Aleksei Semikozov --- .../__tests__/__mock__/m_mock_scheduler.ts | 35 ++++++++++++------- .../__tests__/santiago_timezone.test.ts | 4 +-- .../scheduler/__tests__/views.test.ts | 32 +++++++++++++++++ .../m_strategy_vertical.ts | 2 +- 4 files changed, 58 insertions(+), 15 deletions(-) diff --git a/packages/devextreme/js/__internal/scheduler/__tests__/__mock__/m_mock_scheduler.ts b/packages/devextreme/js/__internal/scheduler/__tests__/__mock__/m_mock_scheduler.ts index 08645037a394..5dd7dd23dd76 100644 --- a/packages/devextreme/js/__internal/scheduler/__tests__/__mock__/m_mock_scheduler.ts +++ b/packages/devextreme/js/__internal/scheduler/__tests__/__mock__/m_mock_scheduler.ts @@ -3,25 +3,36 @@ import DOMComponent from '@ts/core/widget/dom_component'; import SchedulerWorkSpace from '../../workspaces/m_work_space'; -export const setupSchedulerTestEnvironment = ( - isTimelineView = false, -): void => { - const cellWidth = 250; - const cellHeight = isTimelineView ? 450 : 80; +interface SetupSchedulerTestEnvironmentOptions { + width?: number; + height?: number; +} - (DOMComponent.prototype as any)._isVisible = jest.fn().mockReturnValue(true); - SchedulerWorkSpace.prototype._createCrossScrollingConfig = () => ({ +export const DEFAULT_CELL_WIDTH = 250; +export const DEFAULT_CELL_HEIGHT = 80; +export const DEFAULT_TIMELINE_CELL_HEIGHT = 450; + +export const setupSchedulerTestEnvironment = ({ + width = DEFAULT_CELL_WIDTH, + height = DEFAULT_CELL_HEIGHT, +}: SetupSchedulerTestEnvironmentOptions = {}): void => { + DOMComponent.prototype._isVisible = jest.fn((): boolean => true); + SchedulerWorkSpace.prototype._createCrossScrollingConfig = (): { + direction: string; + onScroll: jest.Mock; + onEnd: jest.Mock; + } => ({ direction: 'both', onScroll: jest.fn(), onEnd: jest.fn(), }); - Element.prototype.getBoundingClientRect = jest.fn(() => ({ - width: cellWidth, - height: cellHeight, + Element.prototype.getBoundingClientRect = jest.fn((): DOMRect => ({ + width, + height, top: 0, left: 0, - bottom: cellHeight, - right: cellWidth, + bottom: height, + right: width, x: 0, y: 0, toJSON: (): void => {}, diff --git a/packages/devextreme/js/__internal/scheduler/__tests__/santiago_timezone.test.ts b/packages/devextreme/js/__internal/scheduler/__tests__/santiago_timezone.test.ts index f31c46e78e62..99218d32e983 100644 --- a/packages/devextreme/js/__internal/scheduler/__tests__/santiago_timezone.test.ts +++ b/packages/devextreme/js/__internal/scheduler/__tests__/santiago_timezone.test.ts @@ -7,7 +7,7 @@ import { } from '@jest/globals'; import { createScheduler } from './__mock__/create_scheduler'; -import { setupSchedulerTestEnvironment } from './__mock__/m_mock_scheduler'; +import { DEFAULT_TIMELINE_CELL_HEIGHT, setupSchedulerTestEnvironment } from './__mock__/m_mock_scheduler'; const dataSource = [ { @@ -98,7 +98,7 @@ const views = [ describe('scheduler', () => { it.each(views)('should render correct workspace in Santiago DST for view: $view.name', async ({ view, result }) => { - setupSchedulerTestEnvironment(true); + setupSchedulerTestEnvironment({ height: DEFAULT_TIMELINE_CELL_HEIGHT }); const { POM } = await createScheduler({ views: [view], diff --git a/packages/devextreme/js/__internal/scheduler/__tests__/views.test.ts b/packages/devextreme/js/__internal/scheduler/__tests__/views.test.ts index 52796ec0604b..3bab0df57ff4 100644 --- a/packages/devextreme/js/__internal/scheduler/__tests__/views.test.ts +++ b/packages/devextreme/js/__internal/scheduler/__tests__/views.test.ts @@ -37,4 +37,36 @@ describe('views', () => { const appointment = POM.getAppointment(); expect(appointment !== null).toBe(true); }); + + it('should render all-day appointment correctly with fractional cell values', async () => { + const FRACTIONAL_CELL_WIDTH = 250.4; + setupSchedulerTestEnvironment({ width: FRACTIONAL_CELL_WIDTH }); + const { container } = await createScheduler({ + dataSource: [{ + text: 'Appointment 2', + startDate: new Date('2021-02-02T15:15:00.000Z'), + endDate: new Date('2021-02-02T17:45:00.000Z'), + allDay: true, + resourceId: 1, + }], + currentDate: new Date(2021, 1, 2), + startDayHour: 8, + endDayHour: 20, + allDayPanelMode: 'hidden', + groups: ['resourceId'], + resources: [{ + label: 'User', + dataSource: [ + { title: 'Mark', id: 1 }, + { title: 'Luke', id: 2 }, + ], + displayExpr: 'title', + fieldExpr: 'resourceId', + valueExpr: 'id', + }], + }); + + const appointments = container.querySelectorAll('.dx-item.dx-scheduler-appointment'); + expect(appointments.length).toBe(1); + }); }); diff --git a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/rendering_strategies/m_strategy_vertical.ts b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/rendering_strategies/m_strategy_vertical.ts index daca674c6173..243ba675cfb8 100644 --- a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/rendering_strategies/m_strategy_vertical.ts +++ b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/rendering_strategies/m_strategy_vertical.ts @@ -216,7 +216,7 @@ class VerticalRenderingStrategy extends BaseAppointmentsStrategy { let tailHeight = this._getTailHeight(appointmentGeometry, appointmentSettings); let { columnIndex } = appointmentSettings; - while (tailHeight > 0 && left < hMax) { + while (tailHeight > 0 && left < Math.round(hMax)) { tailHeight = Math.max(minHeight, tailHeight); columnIndex += cellsDiff; const height = Math.min(tailHeight, maxHeight); From 264d448212fe51bcd55653337b2de04c626ae8e4 Mon Sep 17 00:00:00 2001 From: Sergio Bur Date: Fri, 22 Aug 2025 10:21:36 +0200 Subject: [PATCH 044/101] Scheduler: get rid of the old adapters (#30828) --- .../m_compact_appointments_helper.ts | 11 +++- .../__internal/scheduler/m_data_structures.ts | 10 ---- .../js/__internal/scheduler/m_date_adapter.ts | 60 ------------------- .../js/__internal/scheduler/m_scheduler.ts | 9 ++- .../__internal/scheduler/m_utils_time_zone.ts | 20 +++---- .../js/__internal/scheduler/types.ts | 8 +++ 6 files changed, 33 insertions(+), 85 deletions(-) delete mode 100644 packages/devextreme/js/__internal/scheduler/m_data_structures.ts delete mode 100644 packages/devextreme/js/__internal/scheduler/m_date_adapter.ts diff --git a/packages/devextreme/js/__internal/scheduler/m_compact_appointments_helper.ts b/packages/devextreme/js/__internal/scheduler/m_compact_appointments_helper.ts index 6c3a6592160d..4f7e2cfbcc05 100644 --- a/packages/devextreme/js/__internal/scheduler/m_compact_appointments_helper.ts +++ b/packages/devextreme/js/__internal/scheduler/m_compact_appointments_helper.ts @@ -6,7 +6,7 @@ import { FunctionTemplate } from '@js/core/templates/function_template'; import Button from '@js/ui/button'; import { APPOINTMENT_SETTINGS_KEY, LIST_ITEM_CLASS, LIST_ITEM_DATA_KEY } from './constants'; -import { AppointmentTooltipInfo } from './m_data_structures'; +import type { AppointmentTooltipItem } from './types'; const APPOINTMENT_COLLECTOR_CLASS = 'dx-scheduler-appointment-collector'; const COMPACT_APPOINTMENT_COLLECTOR_CLASS = `${APPOINTMENT_COLLECTOR_CLASS}-compact`; @@ -52,7 +52,14 @@ export class CompactAppointmentsHelper { this.instance._dataAccessors.set('endDate', targeted, info.sourceAppointment.endDate); } - return new AppointmentTooltipInfo(appointment, targeted, items.colors[index], items.settings[index]); + const tooltipInfo: AppointmentTooltipItem = { + appointment, + targetedAppointment: targeted, + color: items.colors?.[index] ?? [], + settings: items.settings?.[index] ?? [], + }; + + return tooltipInfo; }); } diff --git a/packages/devextreme/js/__internal/scheduler/m_data_structures.ts b/packages/devextreme/js/__internal/scheduler/m_data_structures.ts deleted file mode 100644 index 4b62d3d1e767..000000000000 --- a/packages/devextreme/js/__internal/scheduler/m_data_structures.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* eslint-disable @typescript-eslint/no-extraneous-class */ -export class AppointmentTooltipInfo { - constructor( - public appointment: any, - public targetedAppointment: any = undefined, - public color: any[] = [], - public settings: any[] = [], - ) { // TODO - } -} diff --git a/packages/devextreme/js/__internal/scheduler/m_date_adapter.ts b/packages/devextreme/js/__internal/scheduler/m_date_adapter.ts deleted file mode 100644 index a1da2e6928ea..000000000000 --- a/packages/devextreme/js/__internal/scheduler/m_date_adapter.ts +++ /dev/null @@ -1,60 +0,0 @@ -import dateUtils from '@js/core/utils/date'; - -const toMs = dateUtils.dateToMilliseconds; - -class DateAdapterCore { - _source: Date; - - constructor(source) { - this._source = new Date(source.getTime ? source.getTime() : source); - } - - get source() { // TODO - return this._source; - } - - result() { - return this._source; - } - - getTimezoneOffset(format: any = undefined) { - const value = this._source.getTimezoneOffset(); - if (format === 'minute') { - return value * toMs('minute'); - } - return value; - } - - getTime() { - return this._source.getTime(); - } - - setTime(value) { - this._source.setTime(value); - return this; - } - - addTime(value) { - this._source.setTime(this._source.getTime() + value); - return this; - } - - setMinutes(value) { - this._source.setMinutes(value); - return this; - } - - addMinutes(value) { - this._source.setMinutes(this._source.getMinutes() + value); - return this; - } - - subtractMinutes(value) { - this._source.setMinutes(this._source.getMinutes() - value); - return this; - } -} - -const DateAdapter = (date) => new DateAdapterCore(date); - -export default DateAdapter; diff --git a/packages/devextreme/js/__internal/scheduler/m_scheduler.ts b/packages/devextreme/js/__internal/scheduler/m_scheduler.ts index d5ce49a1201a..9f50190c9831 100644 --- a/packages/devextreme/js/__internal/scheduler/m_scheduler.ts +++ b/packages/devextreme/js/__internal/scheduler/m_scheduler.ts @@ -41,7 +41,6 @@ import NotifyScheduler from './base/m_widget_notify_scheduler'; import { SchedulerHeader } from './header/m_header'; import type { HeaderOptions } from './header/types'; import { CompactAppointmentsHelper } from './m_compact_appointments_helper'; -import { AppointmentTooltipInfo } from './m_data_structures'; import { hide as hideLoading, show as showLoading } from './m_loading'; import { getRecurrenceProcessor } from './m_recurrence'; import type { SubscribeKey, SubscribeMethods } from './m_subscribes'; @@ -60,6 +59,7 @@ import { import { SchedulerOptionsBaseWidget } from './scheduler_options_base_widget'; import { DesktopTooltipStrategy } from './tooltip_strategies/m_desktop_tooltip_strategy'; import { MobileTooltipStrategy } from './tooltip_strategies/m_mobile_tooltip_strategy'; +import type { AppointmentTooltipItem } from './types'; import { AppointmentAdapter } from './utils/appointment_adapter/appointment_adapter'; import { AppointmentDataAccessor } from './utils/data_accessor/appointment_data_accessor'; import type { IFieldExpr } from './utils/index'; @@ -1984,7 +1984,12 @@ class Scheduler extends SchedulerOptionsBaseWidget { const getAppointmentColor = this.createGetAppointmentColor(); const deferredColor = getAppointmentColor(appointmentConfig) as any; - const info = new AppointmentTooltipInfo(appointment, targetedAppointment, deferredColor); + const info: AppointmentTooltipItem = { + appointment, + targetedAppointment, + color: deferredColor, + settings: [], + }; this.showAppointmentTooltipCore(element, [info]); } } diff --git a/packages/devextreme/js/__internal/scheduler/m_utils_time_zone.ts b/packages/devextreme/js/__internal/scheduler/m_utils_time_zone.ts index 8dfa9ee9ed11..4b5afd730576 100644 --- a/packages/devextreme/js/__internal/scheduler/m_utils_time_zone.ts +++ b/packages/devextreme/js/__internal/scheduler/m_utils_time_zone.ts @@ -5,7 +5,6 @@ import { macroTaskArray } from '@ts/scheduler/utils/index'; import dateUtils from '../../core/utils/date'; import { globalCache } from './global_cache'; -import DateAdapter from './m_date_adapter'; import timeZoneDataUtils from './timezones/m_utils_timezones_data'; import timeZoneList from './timezones/timezone_list'; @@ -43,17 +42,16 @@ const createUTCDateWithLocalOffset = (date) => { )); }; -const createDateFromUTCWithLocalOffset = (date) => { - const result = DateAdapter(date); - - const timezoneOffsetBeforeInMin = result.getTimezoneOffset(); - result.addTime(result.getTimezoneOffset('minute')); - result.subtractMinutes(timezoneOffsetBeforeInMin - result.getTimezoneOffset()); - - return result.source; -}; +const createDateFromUTCWithLocalOffset = (date: Date): Date => new Date( + date.getUTCFullYear(), + date.getUTCMonth(), + date.getUTCDate(), + date.getUTCHours(), + date.getUTCMinutes(), + date.getUTCSeconds(), +); -const createUTCDate = (date) => new Date(Date.UTC( +const createUTCDate = (date: Date): Date => new Date(Date.UTC( date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), diff --git a/packages/devextreme/js/__internal/scheduler/types.ts b/packages/devextreme/js/__internal/scheduler/types.ts index f51a22e174aa..9d968d41fbfa 100644 --- a/packages/devextreme/js/__internal/scheduler/types.ts +++ b/packages/devextreme/js/__internal/scheduler/types.ts @@ -1,6 +1,7 @@ import type { Appointment } from '@js/ui/scheduler'; import type { ResourceLoader } from './utils/loader/resource_loader'; +import type { AppointmentItemViewModel } from './view_model/generate_view_model/types'; export type Direction = 'vertical' | 'horizontal'; export type GroupOrientation = 'vertical' | 'horizontal'; @@ -242,3 +243,10 @@ export interface ViewDataProviderType { getCellsBetween: (first: ViewCellData, last: ViewCellData) => ViewCellData[]; viewType: ViewType; } + +export interface AppointmentTooltipItem { + appointment: Appointment; + targetedAppointment?: Appointment; + color?: string; + settings: AppointmentItemViewModel[]; +} From facc0ba5b0ded1c4093605bb3781aa97eda93e15 Mon Sep 17 00:00:00 2001 From: Anna Shakhova <68295572+anna-shakhova@users.noreply.github.com> Date: Fri, 22 Aug 2025 11:52:43 +0200 Subject: [PATCH 045/101] Chart: fix visibility algorithm for candlestick points (T1304112) (#30810) --- .../js/viz/series/points/candlestick_point.js | 28 +++++---- .../financialPoint.tests.js | 60 ++++++++++++------- 2 files changed, 53 insertions(+), 35 deletions(-) diff --git a/packages/devextreme/js/viz/series/points/candlestick_point.js b/packages/devextreme/js/viz/series/points/candlestick_point.js index 9d09c6cf8337..ff7cc7341ec9 100644 --- a/packages/devextreme/js/viz/series/points/candlestick_point.js +++ b/packages/devextreme/js/viz/series/points/candlestick_point.js @@ -11,8 +11,6 @@ const _round = _math.round; const DEFAULT_FINANCIAL_TRACKER_MARGIN = 2; export default _extend({}, barPoint, { - _calculateVisibility: symbolPoint._calculateVisibility, - _getContinuousPoints: function(openCoord, closeCoord) { const that = this; const x = that.x; @@ -265,19 +263,23 @@ export default _extend({}, barPoint, { }, _translate: function() { - const that = this; - const rotated = that._options.rotated; - const valTranslator = that._getValTranslator(); - const x = that._getArgTranslator().translate(that.argument); + const valTranslator = this._getValTranslator(); + const x = this._getArgTranslator().translate(this.argument); - that.vx = that.vy = that.x = x === null ? x : x + (that.xCorrection || 0); - that.openY = that.openValue !== null ? valTranslator.translate(that.openValue) : null; - that.highY = valTranslator.translate(that.highValue); - that.lowY = valTranslator.translate(that.lowValue); - that.closeY = that.closeValue !== null ? valTranslator.translate(that.closeValue) : null; + this.vx = this.vy = this.x = x === null ? x : x + (this.xCorrection || 0); + this.openY = this.openValue !== null ? valTranslator.translate(this.openValue) : null; + this.highY = valTranslator.translate(this.highValue); + this.lowY = valTranslator.translate(this.lowValue); + this.closeY = this.closeValue !== null ? valTranslator.translate(this.closeValue) : null; - const centerValue = _min(that.lowY, that.highY) + _abs(that.lowY - that.highY) / 2; - that._calculateVisibility(!rotated ? that.x : centerValue, !rotated ? centerValue : that.x); + const minValue = Math.min(this.lowY, this.highY); + const height = Math.abs(this.lowY - this.highY); + + if(this._options.rotated) { + this._calculateVisibility(minValue, this.x, height, 0); + } else { + this._calculateVisibility(this.x, minValue, 0, height); + } }, getCrosshairData: function(x, y) { diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core.series/financialPoint.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core.series/financialPoint.tests.js index 3f1d72eb7746..83ca7c71a3b7 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core.series/financialPoint.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core.series/financialPoint.tests.js @@ -462,13 +462,13 @@ QUnit.test('Negative. LowValue', function(assert) { assert.strictEqual(result, false); }); -QUnit.module('Check point in visible area', { +QUnit.module('Check point in visible area (T1304112)', { beforeEach: function() { const that = this; const visibleArea = [0, 100, 1000, 1100]; const translateXData = { 1: -10, 2: visibleArea[0], 3: 50, 4: visibleArea[1], 5: 110 }; - const translateYData = { 1: 990, 2: visibleArea[2], 3: 1010, 4: 1040, 5: 1050, 6: 1090, 7: visibleArea[3], 8: 1110 }; + const translateYData = { 0: 980, 1: 990, 2: visibleArea[2], 3: 1010, 4: 1040, 5: 1050, 6: 1090, 7: visibleArea[3], 8: 1110, 9: 1120 }; this.options = { widgetType: 'chart', @@ -535,38 +535,46 @@ QUnit.test('Point is visible on the right border', function(assert) { }); QUnit.test('Point is invisible on the top', function(assert) { - this.point = createPoint(this.series, { argument: 3, openValue: 7, closeValue: 8, highValue: 8, lowValue: 7 }, this.options); + this.point = createPoint(this.series, { argument: 3, openValue: 8, closeValue: 9, highValue: 9, lowValue: 8 }, this.options); this.point.translate(); - assert.ok(!this.point.isInVisibleArea()); + assert.strictEqual(this.point.isInVisibleArea(), false); }); QUnit.test('Point is visible on the top border', function(assert) { - this.point = createPoint(this.series, { argument: 3, openValue: 6, closeValue: 8, highValue: 8, lowValue: 6 }, this.options); - this.point.translate(); + const point = createPoint(this.series, { argument: 3, openValue: 6, closeValue: 8, highValue: 8, lowValue: 6 }, this.options); + const point2 = createPoint(this.series, { argument: 3, openValue: 7, closeValue: 8, highValue: 8, lowValue: 7 }, this.options); - assert.ok(this.point.isInVisibleArea()); + point.translate(); + point2.translate(); + + assert.strictEqual(point.isInVisibleArea(), true, 'Point is visible if center of point is inside visible area'); + assert.strictEqual(point2.isInVisibleArea(), true, 'Point is visible if lowValue is inside visible area'); }); QUnit.test('Point is invisible on the bottom', function(assert) { - this.point = createPoint(this.series, { argument: 3, openValue: 1, closeValue: 2, highValue: 2, lowValue: 1 }, this.options); + this.point = createPoint(this.series, { argument: 3, openValue: 0, closeValue: 1, highValue: 1, lowValue: 0 }, this.options); this.point.translate(); assert.ok(!this.point.isInVisibleArea()); }); QUnit.test('Point is visible on the bottom border', function(assert) { - this.point = createPoint(this.series, { argument: 3, openValue: 1, closeValue: 3, highValue: 3, lowValue: 1 }, this.options); - this.point.translate(); + const point = createPoint(this.series, { argument: 3, openValue: 1, closeValue: 3, highValue: 3, lowValue: 1 }, this.options); + const point2 = createPoint(this.series, { argument: 3, openValue: 1, closeValue: 2, highValue: 2, lowValue: 1 }, this.options); - assert.ok(this.point.isInVisibleArea()); + point.translate(); + point2.translate(); + + assert.strictEqual(point.isInVisibleArea(), true, 'Point is visible if center of point is inside visible area'); + assert.strictEqual(point2.isInVisibleArea(), true, 'Point is visible if highValue is inside visible area'); }); -QUnit.module('Check point in visible area. Rotated.', { +QUnit.module('Check point in visible area (T1304112). Rotated.', { beforeEach: function() { const that = this; const visibleArea = [0, 100, 0, 100]; - const translateXData = { 1: -10, 2: visibleArea[0], 3: 10, 4: 40, 5: 50, 6: 90, 7: visibleArea[1], 8: 110 }; + const translateXData = { 0: -20, 1: -10, 2: visibleArea[0], 3: 10, 4: 40, 5: 50, 6: 90, 7: visibleArea[1], 8: 110, 9: 120 }; const translateYData = { 1: -10, 2: visibleArea[2], 3: 50, 4: visibleArea[3], 5: 110 }; this.options = { @@ -635,31 +643,39 @@ QUnit.test('Point is visible on the right border', function(assert) { }); QUnit.test('Point is invisible on the top', function(assert) { - this.point = createPoint(this.series, { argument: 3, openValue: 7, closeValue: 8, highValue: 8, lowValue: 7 }, this.options); + this.point = createPoint(this.series, { argument: 3, openValue: 8, closeValue: 9, highValue: 9, lowValue: 8 }, this.options); this.point.translate(); - assert.ok(!this.point.isInVisibleArea()); + assert.strictEqual(this.point.isInVisibleArea(), false); }); QUnit.test('Point is visible on the top border', function(assert) { - this.point = createPoint(this.series, { argument: 3, openValue: 6, closeValue: 8, highValue: 8, lowValue: 6 }, this.options); - this.point.translate(); + const point = createPoint(this.series, { argument: 3, openValue: 6, closeValue: 8, highValue: 8, lowValue: 6 }, this.options); + const point2 = createPoint(this.series, { argument: 3, openValue: 7, closeValue: 8, highValue: 8, lowValue: 7 }, this.options); - assert.ok(this.point.isInVisibleArea()); + point.translate(); + point2.translate(); + + assert.strictEqual(point.isInVisibleArea(), true, 'Point is visible if center of point is inside visible area'); + assert.strictEqual(point2.isInVisibleArea(), true, 'Point is visible if lowValue is inside visible area'); }); QUnit.test('Point is invisible on the bottom', function(assert) { - this.point = createPoint(this.series, { argument: 3, openValue: 1, closeValue: 2, highValue: 2, lowValue: 1 }, this.options); + this.point = createPoint(this.series, { argument: 3, openValue: 0, closeValue: 1, highValue: 1, lowValue: 0 }, this.options); this.point.translate(); assert.ok(!this.point.isInVisibleArea()); }); QUnit.test('Point is visible on the bottom border', function(assert) { - this.point = createPoint(this.series, { argument: 3, openValue: 1, closeValue: 3, highValue: 3, lowValue: 1 }, this.options); - this.point.translate(); + const point = createPoint(this.series, { argument: 3, openValue: 1, closeValue: 3, highValue: 3, lowValue: 1 }, this.options); + const point2 = createPoint(this.series, { argument: 3, openValue: 1, closeValue: 2, highValue: 2, lowValue: 1 }, this.options); - assert.ok(this.point.isInVisibleArea()); + point.translate(); + point2.translate(); + + assert.strictEqual(point.isInVisibleArea(), true, 'Point is visible if center of point is inside visible area'); + assert.strictEqual(point2.isInVisibleArea(), true, 'Point is visible if highValue is inside visible area'); }); QUnit.module('Draw point. Candlestick', { From c1bcb39b0ece50b39b5ae26bb65d07b9e9026d75 Mon Sep 17 00:00:00 2001 From: Ilya Vinogradov Date: Fri, 22 Aug 2025 17:57:58 +0400 Subject: [PATCH 046/101] DataGrid(T1267471): ColumnChooser doesn't immediately reflect the changes made to column options (#30851) --- .../tests/dataGrid/common/columnChooser.ts | 45 ++++++++++++++++++ .../column_chooser/m_column_chooser.ts | 46 +++++++++++++------ .../testcafe-models/dataGrid/columnChooser.ts | 5 ++ 3 files changed, 83 insertions(+), 13 deletions(-) diff --git a/e2e/testcafe-devextreme/tests/dataGrid/common/columnChooser.ts b/e2e/testcafe-devextreme/tests/dataGrid/common/columnChooser.ts index dcb1fd92be04..93b1f8429ed6 100644 --- a/e2e/testcafe-devextreme/tests/dataGrid/common/columnChooser.ts +++ b/e2e/testcafe-devextreme/tests/dataGrid/common/columnChooser.ts @@ -192,3 +192,48 @@ test('Check the behavior of pressing the Esc button when dragging a column from mode: 'dragAndDrop', }, })); + +test( + 'Should take into account column options change during general option change (T1267471)', + async (t) => { + const dataGrid = new DataGrid('#container'); + const columnChooserBtn = dataGrid.getColumnChooserButton(); + + await t.click(columnChooserBtn); + + const columnChooser = dataGrid.getColumnChooser(); + const lastItemCheckbox = columnChooser.getCheckbox(1); + + await t.expect(columnChooser.isCheckboxDisabled(0)).notOk(); + await t.expect(columnChooser.isCheckboxDisabled(1)).notOk(); + + await t.click(lastItemCheckbox); + + await t.expect(columnChooser.isCheckboxDisabled(0)).ok(); + await t.expect(columnChooser.isCheckboxDisabled(1)).notOk(); + }, +).before(async () => createWidget('dxDataGrid', { + dataSource: [ + { id: 0, A: 'A', B: 'B' }, + ], + keyExpr: 'id', + columns: ['A', 'B'], + columnChooser: { + enabled: true, + mode: 'select', + }, + onOptionChanged: ({ component, fullName }) => { + if (!/columns\[\d+\]\.visible/.test(fullName)) { + return; + } + + const visibleColumns = component.getVisibleColumns(); + const [{ dataField: lastColumnDataField }] = visibleColumns; + + if (!lastColumnDataField) { + return; + } + + component.columnOption(lastColumnDataField, 'allowHiding', false); + }, +})); diff --git a/packages/devextreme/js/__internal/grids/grid_core/column_chooser/m_column_chooser.ts b/packages/devextreme/js/__internal/grids/grid_core/column_chooser/m_column_chooser.ts index b912953a5bce..96bfc370b10a 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/column_chooser/m_column_chooser.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/column_chooser/m_column_chooser.ts @@ -376,25 +376,45 @@ export class ColumnChooserView extends ColumnsView { this._columnChooserList.endUpdate(); } - protected _columnOptionChanged(e) { - super._columnOptionChanged(e); + protected _columnOptionChanged(changes): void { + super._columnOptionChanged(changes); + const { optionNames } = changes; const isSelectMode = this.isSelectMode(); + const onlyVisibleChanged = this.isColumnVisibilityOnlyUpdated(optionNames); + const isOnlyColumnVisibilityUpdated = this._isUpdatingColumnVisibility + && onlyVisibleChanged; - if (isSelectMode && this._columnChooserList && !this._isUpdatingColumnVisibility) { - const { optionNames } = e; - const onlyVisibleChanged = optionNames.visible && optionNames.length === 1; - const columnIndices = isDefined(e.columnIndex) ? [e.columnIndex] : e.columnIndices; - const needUpdate = COLUMN_OPTIONS_USED_IN_ITEMS.some((optionName) => optionNames[optionName]) || (e.changeTypes.columns && optionNames.all); + if (!isSelectMode || !this._columnChooserList || isOnlyColumnVisibilityUpdated) { + return; + } - if (needUpdate) { - this._updateItemsSelection(columnIndices); + const columnIndices = isDefined(changes.columnIndex) + ? [changes.columnIndex] + : changes.columnIndices; + const hasItemsOptionNames = COLUMN_OPTIONS_USED_IN_ITEMS + .some((optionName) => optionNames[optionName]); + const needUpdate: boolean = hasItemsOptionNames + || (changes.changeTypes.columns && optionNames.all); - if (!onlyVisibleChanged) { - this._updateItems(); - } - } + if (!needUpdate) { + return; } + + this._updateItemsSelection(columnIndices); + if (!onlyVisibleChanged) { + this._updateItems(); + } + } + + private isColumnVisibilityOnlyUpdated( + optionNames: { length: number } & Record, + ): boolean { + const optionKeys = Object + .keys(optionNames ?? {}) + .filter((key) => key !== 'length'); + + return optionKeys.length === 1 && optionKeys[0] === 'visible'; } public getColumnElements() { diff --git a/packages/testcafe-models/dataGrid/columnChooser.ts b/packages/testcafe-models/dataGrid/columnChooser.ts index d42fbc18def2..722ed153361c 100644 --- a/packages/testcafe-models/dataGrid/columnChooser.ts +++ b/packages/testcafe-models/dataGrid/columnChooser.ts @@ -7,6 +7,7 @@ const CLASS = { overlayWrapper: 'dx-overlay-wrapper', columnChooser: 'dx-datagrid-column-chooser', checkboxChecked: 'dx-checkbox-checked', + checkboxDisabled: 'dx-state-disabled', checkbox: 'dx-checkbox', treeViewItem: 'dx-treeview-item', treeView: 'dx-treeview', @@ -49,6 +50,10 @@ export default class ColumnChooser extends FocusableElement { return this.getCheckbox(nth).hasClass(CLASS.checkboxChecked); } + isCheckboxDisabled(nth = 0): Promise { + return this.getCheckbox(nth).hasClass(CLASS.checkboxDisabled); + } + getColumnsCount(): Promise { return this.content.find(`.${CLASS.treeViewItem}`).count; } From b73e7cb41ef823838adfa41e1857fe7545a58cb3 Mon Sep 17 00:00:00 2001 From: Dmitry Lavrinovich <52966626+dmlvr@users.noreply.github.com> Date: Mon, 25 Aug 2025 10:05:36 +0300 Subject: [PATCH 047/101] DataGrid - Add warning when trying to set fixed state for child columns (#30800) --- .../tests/dataGrid/common/fixedColumns.ts | 209 ++++++++++++++++++ .../grid_core/columns_controller/const.ts | 7 + .../m_columns_controller.ts | 2 + .../m_columns_controller_utils.ts | 31 ++- packages/devextreme/js/ui/widget/ui.errors.js | 4 + packages/testcafe-models/dataGrid/index.ts | 23 +- 6 files changed, 267 insertions(+), 9 deletions(-) diff --git a/e2e/testcafe-devextreme/tests/dataGrid/common/fixedColumns.ts b/e2e/testcafe-devextreme/tests/dataGrid/common/fixedColumns.ts index c3010ebe2965..0dfe69302d29 100644 --- a/e2e/testcafe-devextreme/tests/dataGrid/common/fixedColumns.ts +++ b/e2e/testcafe-devextreme/tests/dataGrid/common/fixedColumns.ts @@ -436,3 +436,212 @@ test('DataGrid - Group summary is not updated when a column is fixed on the righ }, ], })); + +const mockCountries = [ + { + ID: 1, + Country: 'Brazil', + Area: 8515767, + Population_Urban: 0.85, + Population_Rural: 0.15, + Population_Total: 205809000, + GDP_Agriculture: 0.054, + GDP_Industry: 0.274, + GDP_Services: 0.672, + GDP_Total: 2353025, + }, + { + ID: 2, + Country: 'China', + Area: 9388211, + Population_Urban: 0.54, + Population_Rural: 0.46, + Population_Total: 1375530000, + GDP_Agriculture: 0.091, + GDP_Industry: 0.426, + GDP_Services: 0.483, + GDP_Total: 10380380, + }, + { + ID: 3, + Country: 'France', + Area: 675417, + Population_Urban: 0.79, + Population_Rural: 0.21, + Population_Total: 64529000, + GDP_Agriculture: 0.019, + GDP_Industry: 0.183, + GDP_Services: 0.798, + GDP_Total: 2846889, + }, +]; + +test('Warning should be shown when trying to set fixed state for child columns', async (t) => { + const consoleMessages = await t.getBrowserConsoleMessages(); + const warnings = consoleMessages?.warn.filter((message) => message.startsWith('W1028')) || []; + await t.expect(warnings.length).eql(1, 'There is warning W1028'); +}).before(async () => { + await createWidget( + 'dxDataGrid', + { + dataSource: mockCountries, + keyExpr: 'ID', + columnAutoWidth: true, + allowColumnReordering: true, + width: 600, + showBorders: true, + columnChooser: { enabled: true }, + columns: [ + { + dataField: 'Country', + fixed: true, + fixedPosition: 'left', + }, + { + dataField: 'Area', + fixed: true, + fixedPosition: 'left', + }, + { + caption: 'Population', + columns: [ + { + caption: 'Total', + dataField: 'Population_Total', + format: 'fixedPoint', + fixed: true, + fixedPosition: 'left', + }, + { + caption: 'Urban', + dataField: 'Population_Urban', + format: 'percent', + fixed: true, + fixedPosition: 'left', + }, + ], + }, + ], + }, + '#container', + ); +}); + +test('Warning should work when columns changed in real time', async (t) => { + const grid = new DataGrid('#container'); + + let consoleMessages = await t.getBrowserConsoleMessages(); + let warnings = consoleMessages?.warn.filter((message) => message.startsWith('W1028')) || []; + + await t.expect(warnings.length).eql(0, 'There is not any warning W1028'); + + await grid.option('columns', [ + { + dataField: 'test3', + caption: 'test3', + }, + { + caption: 'test3 group', + columns: [ + { + dataField: 'test4', + caption: 'test4', + fixed: true, + }, + { + dataField: 'test5', + caption: 'test5', + fixed: true, + }, + ], + }, + ]); + consoleMessages = await t.getBrowserConsoleMessages(); + warnings = consoleMessages?.warn.filter((message) => message.startsWith('W1028')) || []; + await t.expect(warnings.length).eql(1, 'There is warning W1028'); +}).before(async () => { + await createWidget( + 'dxDataGrid', + { + dataSource: [], + }, + '#container', + ); +}); + +test('Warning should be shown one time for every dataGrid instance', async (t) => { + const otherGrid = new DataGrid('#otherContainer'); + + await otherGrid.apiAddColumn({ + dataField: 'test', + caption: 'test', + columns: [ + { + dataField: 'test1', + caption: 'test1', + fixed: true, + }, + { + dataField: 'test2', + caption: 'test2', + fixed: true, + }, + ], + }); + const consoleMessages = await t.getBrowserConsoleMessages(); + const warnings = consoleMessages?.warn.filter((message) => message.startsWith('W1028')) || []; + await t.expect(warnings.length).eql(2, 'There are two warnings W1028'); +}).before(async () => { + await createWidget( + 'dxDataGrid', + { + dataSource: mockCountries, + keyExpr: 'ID', + columnAutoWidth: true, + allowColumnReordering: true, + width: 600, + showBorders: true, + columnChooser: { enabled: true }, + columns: [ + { + dataField: 'Country', + fixed: true, + fixedPosition: 'left', + }, + { + dataField: 'Area', + fixed: true, + fixedPosition: 'left', + }, + { + caption: 'Population', + columns: [ + { + caption: 'Total', + dataField: 'Population_Total', + format: 'fixedPoint', + fixed: true, + fixedPosition: 'left', + }, + { + caption: 'Urban', + dataField: 'Population_Urban', + format: 'percent', + fixed: true, + fixedPosition: 'left', + }, + ], + }, + ], + }, + '#container', + ); + + await createWidget( + 'dxDataGrid', + { + dataSource: [], + }, + '#otherContainer', + ); +}); diff --git a/packages/devextreme/js/__internal/grids/grid_core/columns_controller/const.ts b/packages/devextreme/js/__internal/grids/grid_core/columns_controller/const.ts index b558b7550e5b..a34db827b193 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/columns_controller/const.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/columns_controller/const.ts @@ -27,3 +27,10 @@ export const COLUMN_INDEX_OPTIONS = { }; export const GROUP_LOCATION = 'group'; export const COLUMN_CHOOSER_LOCATION = 'columnChooser'; + +export const UNSUPPORTED_PROPERTIES_FOR_CHILD_COLUMNS = [ + 'fixed', + 'fixedPosition', + 'type', + 'buttons', +]; diff --git a/packages/devextreme/js/__internal/grids/grid_core/columns_controller/m_columns_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/columns_controller/m_columns_controller.ts index 7d144de1e3af..8ef794c110bd 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/columns_controller/m_columns_controller.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/columns_controller/m_columns_controller.ts @@ -136,6 +136,8 @@ export class ColumnsController extends modules.Controller { protected _stateStoringController!: StateStoringController; + public _isWarnedAboutUnsupportedProperties?: boolean; + public init(isApplyingUserState?): void { this._dataController = this.getController('data'); this._focusController = this.getController('focus'); diff --git a/packages/devextreme/js/__internal/grids/grid_core/columns_controller/m_columns_controller_utils.ts b/packages/devextreme/js/__internal/grids/grid_core/columns_controller/m_columns_controller_utils.ts index c477899f9e21..5f1c25683847 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/columns_controller/m_columns_controller_utils.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/columns_controller/m_columns_controller_utils.ts @@ -12,6 +12,7 @@ import { isDefined, isFunction, isNumeric, isObject, isString, type, } from '@js/core/utils/type'; import variableWrapper from '@js/core/utils/variable_wrapper'; +import errors from '@js/ui/widget/ui.errors'; import { HIDDEN_COLUMNS_WIDTH } from '../adaptivity/const'; import gridCoreUtils from '../m_utils'; @@ -24,11 +25,36 @@ import { GROUP_COMMAND_COLUMN_NAME, GROUP_LOCATION, IGNORE_COLUMN_OPTION_NAMES, + UNSUPPORTED_PROPERTIES_FOR_CHILD_COLUMNS, USER_STATE_FIELD_NAMES, USER_STATE_FIELD_NAMES_15_1, } from './const'; import type { ColumnsController } from './m_columns_controller'; +const warnFixedInChildColumnsOnce = (controller: ColumnsController, childColumns: any[]): void => { + if (controller?._isWarnedAboutUnsupportedProperties) return; + if (!childColumns || !Array.isArray(childColumns) || childColumns?.length === 0) return; + + let unsupportedProperty: string | null = null; + + for (const column of childColumns) { + if (unsupportedProperty) break; + if (!column || typeof column !== 'object' || column === null) continue; + + for (const property of UNSUPPORTED_PROPERTIES_FOR_CHILD_COLUMNS) { + if (property in column) { + unsupportedProperty = property; + break; + } + } + } + + if (unsupportedProperty) { + controller && (controller._isWarnedAboutUnsupportedProperties = true); + errors.log('W1028', unsupportedProperty); + } +}; + export const setFilterOperationsAsDefaultValues = function (column) { column.filterOperations = column.defaultFilterOperations; }; @@ -47,7 +73,7 @@ export const createColumn = function (that: ColumnsController, columnOptions, us that.setName(columnOptions); - let result = { }; + let result = {}; if (columnOptions.command) { result = deepExtendArraySafe(commonColumnOptions, columnOptions); } else { @@ -90,6 +116,7 @@ export const createColumnsFromOptions = function (that: ColumnsController, colum result.push(column); if (column.columns) { + warnFixedInChildColumnsOnce(that, column.columns); result = result.concat(createColumnsFromOptions(that, column.columns, column, result.length)); delete column.columns; column.hasColumns = true; @@ -945,7 +972,7 @@ const isFirstOrLastBandColumn = function ( fixedPosition?: StickyPosition, ): boolean { return bandColumns.every((column, index) => onlyWithinBandColumn && index === 0 - || isFirstOrLastColumnCore(that, column, index, onlyWithinBandColumn, isLast, fixedPosition)); + || isFirstOrLastColumnCore(that, column, index, onlyWithinBandColumn, isLast, fixedPosition)); }; const isFirstOrLastColumnCore = function ( diff --git a/packages/devextreme/js/ui/widget/ui.errors.js b/packages/devextreme/js/ui/widget/ui.errors.js index 0c2be83fe87a..46271166f549 100644 --- a/packages/devextreme/js/ui/widget/ui.errors.js +++ b/packages/devextreme/js/ui/widget/ui.errors.js @@ -368,4 +368,8 @@ export default errorUtils(errors.ERROR_MESSAGES, { * @name ErrorsUIWidgets.W1027 */ W1027: 'A prompt should be specified for a custom command.', + /** + * @name ErrorsUIWidgets.W1028 + */ + W1028: 'Nested/banded columns do not support the following properties: {0}.', }); diff --git a/packages/testcafe-models/dataGrid/index.ts b/packages/testcafe-models/dataGrid/index.ts index fbedfc0262f1..92cf36110549 100644 --- a/packages/testcafe-models/dataGrid/index.ts +++ b/packages/testcafe-models/dataGrid/index.ts @@ -218,7 +218,7 @@ export default class DataGrid extends GridCore { getFilterEditor( columnIndex: number, - EditorType: new(mainElement: Selector) => T, + EditorType: new (mainElement: Selector) => T, ): T { return new EditorType(this.getHeaders().getFilterRow().getFilterCell(columnIndex).getEditor()); } @@ -592,7 +592,7 @@ export default class DataGrid extends GridCore { const { getInstance } = this; return ClientFunction( () => { - (getInstance() as DataGridInstance).refresh().catch(() => {}); + (getInstance() as DataGridInstance).refresh().catch(() => { }); }, { dependencies: { getInstance } }, )(); @@ -651,6 +651,15 @@ export default class DataGrid extends GridCore { )(); } + apiAddColumn(config: any): Promise { + const { getInstance } = this; + + return ClientFunction( + () => (getInstance() as DataGridInstance).addColumn(config), + { dependencies: { getInstance, config } }, + )(); + } + moveRow(rowIndex: number, x: number, y: number, isStart = false): Promise { const { getInstance } = this; @@ -672,7 +681,7 @@ export default class DataGrid extends GridCore { )(); } - resizeHeader(columnIndex: number, offset: number, needToTriggerPointerUp = true): Promise { + resizeHeader(columnIndex: number, offset: number, needToTriggerPointerUp = true): Promise { const { getInstance } = this; return ClientFunction( @@ -852,10 +861,10 @@ export default class DataGrid extends GridCore { ): Promise { const { getInstance } = this; return ClientFunction( - () => { - (getInstance() as DataGridInstance).option('selection.sensitivity', sensitivity); - }, - { dependencies: { getInstance, sensitivity } }, + () => { + (getInstance() as DataGridInstance).option('selection.sensitivity', sensitivity); + }, + { dependencies: { getInstance, sensitivity } }, )(); } } From 18f72ac86bbe1ea581984feddbc9a868a997a8ab Mon Sep 17 00:00:00 2001 From: Mikhail Preyskurantov <5574159+mpreyskurantov@users.noreply.github.com> Date: Mon, 25 Aug 2025 12:48:44 +0300 Subject: [PATCH 048/101] Pin jquery and @types/jquery via pnpm catalogs (#30777) --- apps/demos/package.json | 2 +- e2e/bundlers/package.json | 2 +- e2e/compilation-cases/package.json | 4 ++-- e2e/testcafe-devextreme/package.json | 2 +- packages/devextreme/package.json | 4 ++-- pnpm-lock.yaml | 35 +++++++++++++++------------- pnpm-workspace.yaml | 2 ++ 7 files changed, 28 insertions(+), 23 deletions(-) diff --git a/apps/demos/package.json b/apps/demos/package.json index 7b8f1f867c30..6b65dab27b4f 100644 --- a/apps/demos/package.json +++ b/apps/demos/package.json @@ -53,7 +53,7 @@ "html-react-parser": "1.4.14", "inferno": "catalog:", "inferno-create-element": "catalog:", - "jquery": "3.6.3", + "jquery": "catalog:", "jspdf": "3.0.1", "jspdf-autotable": "5.0.2", "jszip": "^3.10.1", diff --git a/e2e/bundlers/package.json b/e2e/bundlers/package.json index a99337008ef9..68fd6a5b558a 100644 --- a/e2e/bundlers/package.json +++ b/e2e/bundlers/package.json @@ -10,7 +10,7 @@ "devextreme-cldr-data": "1.0.3", "globalize": "1.7.0", "cldrjs": "0.5.5", - "jquery": "3.7.1", + "jquery": "catalog:", "minimist": "1.2.8", "parcel": "2.12.0", "rimraf": "3.0.2", diff --git a/e2e/compilation-cases/package.json b/e2e/compilation-cases/package.json index c2a4a8ffa52f..4700ebcfdc8f 100644 --- a/e2e/compilation-cases/package.json +++ b/e2e/compilation-cases/package.json @@ -8,9 +8,9 @@ }, "devDependencies": { "@angular/common": "11.2.14", - "@types/jquery": "3.5.29", + "@types/jquery": "catalog:", "devextreme": "workspace:*", - "jquery": "3.7.1", + "jquery": "catalog:", "typescript": "4.9.5" } } diff --git a/e2e/testcafe-devextreme/package.json b/e2e/testcafe-devextreme/package.json index 0ba4e70839a1..1207d4bce753 100644 --- a/e2e/testcafe-devextreme/package.json +++ b/e2e/testcafe-devextreme/package.json @@ -10,7 +10,7 @@ "@babel/eslint-parser": "catalog:eslint8", "@babel/plugin-transform-runtime": "7.19.6", "@testcafe-community/axe": "3.5.0", - "@types/jquery": "3.5.29", + "@types/jquery": "catalog:", "@typescript-eslint/eslint-plugin": "catalog:eslint8", "@typescript-eslint/parser": "catalog:eslint8", "axe-core": "4.10.3", diff --git a/packages/devextreme/package.json b/packages/devextreme/package.json index 5d8d10c2d3c5..7d70e0fad87c 100644 --- a/packages/devextreme/package.json +++ b/packages/devextreme/package.json @@ -85,7 +85,7 @@ "@stylistic/eslint-plugin": "catalog:", "@testcafe-community/axe": "3.5.0", "@types/enzyme": "3.10.18", - "@types/jquery": "3.5.29", + "@types/jquery": "catalog:", "@types/react": "16.14.34", "@typescript-eslint/eslint-plugin": "catalog:", "@typescript-eslint/experimental-utils": "5.62.0", @@ -167,7 +167,7 @@ "jest-each": "29.7.0", "jest-environment-jsdom": "29.7.0", "jest-environment-node": "29.7.0", - "jquery": "3.7.1", + "jquery": "catalog:", "jquery.tmpl": "0.0.2", "jspdf": "3.0.1", "jspdf-autotable": "3.8.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ed446c1c0fd5..8281b402271c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,6 +18,9 @@ catalogs: '@stylistic/eslint-plugin': specifier: 2.13.0 version: 2.13.0 + '@types/jquery': + specifier: 3.5.29 + version: 3.5.29 '@typescript-eslint/eslint-plugin': specifier: 8.23.0 version: 8.23.0 @@ -69,6 +72,9 @@ catalogs: inferno-server: specifier: ^8.2.3 version: 8.2.3 + jquery: + specifier: 3.7.1 + version: 3.7.1 eslint8: '@babel/eslint-parser': specifier: 7.23.10 @@ -414,8 +420,8 @@ importers: specifier: 'catalog:' version: 8.2.3 jquery: - specifier: 3.6.3 - version: 3.6.3 + specifier: 'catalog:' + version: 3.7.1 jspdf: specifier: 3.0.1 version: 3.0.1 @@ -880,7 +886,7 @@ importers: specifier: 1.7.0 version: 1.7.0 jquery: - specifier: 3.7.1 + specifier: 'catalog:' version: 3.7.1 minimist: specifier: 1.2.8 @@ -910,13 +916,13 @@ importers: specifier: 11.2.14 version: 11.2.14(@angular/core@19.2.8(rxjs@7.8.1)(zone.js@0.15.0))(rxjs@7.8.1) '@types/jquery': - specifier: 3.5.29 + specifier: 'catalog:' version: 3.5.29 devextreme: specifier: workspace:* version: link:../../packages/devextreme/artifacts/npm/devextreme jquery: - specifier: 3.7.1 + specifier: 'catalog:' version: 3.7.1 typescript: specifier: 4.9.5 @@ -934,7 +940,7 @@ importers: specifier: 3.5.0 version: 3.5.0(axe-core@4.10.3)(testcafe@2.5.0(encoding@0.1.13)) '@types/jquery': - specifier: 3.5.29 + specifier: 'catalog:' version: 3.5.29 '@typescript-eslint/eslint-plugin': specifier: catalog:eslint8 @@ -1248,7 +1254,7 @@ importers: specifier: 3.10.18 version: 3.10.18 '@types/jquery': - specifier: 3.5.29 + specifier: 'catalog:' version: 3.5.29 '@types/react': specifier: 16.14.34 @@ -1494,7 +1500,7 @@ importers: specifier: 29.7.0 version: 29.7.0 jquery: - specifier: 3.7.1 + specifier: 'catalog:' version: 3.7.1 jquery.tmpl: specifier: 0.0.2 @@ -13306,9 +13312,6 @@ packages: jquery.tmpl@0.0.2: resolution: {integrity: sha512-ONpdW9JcxJxi5Eu9s640SdN0y/nSjnXAP24s3X/LeWlG4xA+hyuIcxEdTWZPy9scWC7owkEeSU6ReQvpbWhs7A==} - jquery@3.6.3: - resolution: {integrity: sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==} - jquery@3.7.1: resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==} @@ -24376,13 +24379,15 @@ snapshots: transitivePeerDependencies: - '@parcel/core' - '@parcel/cache@2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))': + '@parcel/cache@2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)': dependencies: '@parcel/core': 2.12.0(@swc/helpers@0.5.15) '@parcel/fs': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) '@parcel/logger': 2.12.0 '@parcel/utils': 2.12.0 lmdb: 2.8.5 + transitivePeerDependencies: + - '@swc/helpers' '@parcel/codeframe@2.12.0': dependencies: @@ -24442,7 +24447,7 @@ snapshots: '@parcel/core@2.12.0(@swc/helpers@0.5.15)': dependencies: '@mischnic/json-sourcemap': 0.1.1 - '@parcel/cache': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15)) + '@parcel/cache': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) '@parcel/diagnostic': 2.12.0 '@parcel/events': 2.12.0 '@parcel/fs': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) @@ -24857,7 +24862,7 @@ snapshots: '@parcel/types@2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)': dependencies: - '@parcel/cache': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15)) + '@parcel/cache': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) '@parcel/diagnostic': 2.12.0 '@parcel/fs': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) '@parcel/package-manager': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) @@ -35968,8 +35973,6 @@ snapshots: dependencies: jqueryify: 0.0.3 - jquery@3.6.3: {} - jquery@3.7.1: {} jqueryify@0.0.3: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 90307a24bfb2..0749b3c05db9 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -20,10 +20,12 @@ catalog: eslint-plugin-qunit: 8.1.2 globals: 15.14.0 gulp-eslint-new: 2.4.0 + jquery: 3.7.1 "@babel/eslint-parser": 7.26.5 "@eslint-stylistic/metadata": ^2.13.0 "@eslint/eslintrc": 3.2.0 "@stylistic/eslint-plugin": 2.13.0 + "@types/jquery": "3.5.29" "@typescript-eslint/eslint-plugin": 8.23.0 "@typescript-eslint/parser": 8.23.0 From 71115019e39b66a5a1e5d31a567d92249a74f451 Mon Sep 17 00:00:00 2001 From: Julia Volkova Date: Mon, 25 Aug 2025 12:50:42 +0300 Subject: [PATCH 049/101] Selection: improve TS typing (#30768) --- .../grids/grid_core/selection/m_selection.ts | 1 + .../new/grid_core/selection/controller.ts | 4 +- .../grids/tree_list/selection/m_selection.ts | 2 + .../ui/collection/collection_widget.edit.ts | 17 +- .../m_selection.strategy.deferred.ts | 238 ++++++++----- .../m_selection.strategy.standard.ts | 326 ++++++++++++------ .../ui/selection/m_selection.strategy.ts | 164 ++++++--- .../js/__internal/ui/selection/m_selection.ts | 250 +++++++++----- .../js/__internal/ui/selection/types.ts | 153 ++++++++ 9 files changed, 795 insertions(+), 360 deletions(-) create mode 100644 packages/devextreme/js/__internal/ui/selection/types.ts diff --git a/packages/devextreme/js/__internal/grids/grid_core/selection/m_selection.ts b/packages/devextreme/js/__internal/grids/grid_core/selection/m_selection.ts index 08839e1948d8..4ba18c6921a5 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/selection/m_selection.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/selection/m_selection.ts @@ -299,6 +299,7 @@ export class SelectionController extends modules.Controller { private _createSelection() { const options = this._getSelectionConfig(); + // @ts-expect-error TKey return new Selection(options); } diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/selection/controller.ts b/packages/devextreme/js/__internal/grids/new/grid_core/selection/controller.ts index 74071d3d17a8..4f68cdf4e686 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/selection/controller.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/selection/controller.ts @@ -45,7 +45,8 @@ export class SelectionController { private readonly selectionOption: ReadonlySignal = this.options.oneWay('selection'); - private readonly selectionHelper: ReadonlySignal; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private readonly selectionHelper: ReadonlySignal | undefined>; private readonly _isCheckBoxesRendered = signal(false); @@ -365,6 +366,7 @@ export class SelectionController { } public getSelectedCardsData(): DataObject[] { + // @ts-expect-error undefined is not assignable to DataObject[] return this.selectionHelper?.peek()?.getSelectedItems(); } diff --git a/packages/devextreme/js/__internal/grids/tree_list/selection/m_selection.ts b/packages/devextreme/js/__internal/grids/tree_list/selection/m_selection.ts index 313a50fb737f..9ff5bb8f1797 100644 --- a/packages/devextreme/js/__internal/grids/tree_list/selection/m_selection.ts +++ b/packages/devextreme/js/__internal/grids/tree_list/selection/m_selection.ts @@ -543,6 +543,8 @@ const selection = (Base: ModuleType) => class SelectionCont const selectedKeys = this.getSelectedRowKeys(mode) || []; const selectedRowsData: any[] = []; + // @ts-expect-error selection may be deferred only in DataGrid, + // we need to improve GridCore types to take it into account selectedKeys.forEach((key) => { // @ts-expect-error const node = dataController.getNodeByKey(key); diff --git a/packages/devextreme/js/__internal/ui/collection/collection_widget.edit.ts b/packages/devextreme/js/__internal/ui/collection/collection_widget.edit.ts index bde69d1b62c9..f93f5a41f603 100644 --- a/packages/devextreme/js/__internal/ui/collection/collection_widget.edit.ts +++ b/packages/devextreme/js/__internal/ui/collection/collection_widget.edit.ts @@ -14,7 +14,7 @@ import { when, } from '@js/core/utils/deferred'; import { each } from '@js/core/utils/iterator'; -import { isDefined } from '@js/core/utils/type'; +import { isDefined, isObject } from '@js/core/utils/type'; import type { DxEvent } from '@js/events'; import type { ItemLike, SelectionChangeInfo } from '@js/ui/collection/ui.collection_widget.base'; import errors from '@js/ui/widget/ui.errors'; @@ -76,7 +76,8 @@ class CollectionWidget< > extends BaseCollectionWidget { static _userOptions = {}; - _selection!: Selection; + // @ts-expect-error TItem + _selection!: Selection; _editStrategy!: PlainEditStrategy; @@ -169,7 +170,7 @@ class CollectionWidget< return this._editStrategy.getItemsByKeys(selectedItemKeys, selectedItems); } - _getKeyByIndex(index: CollectionItemIndex): unknown { + _getKeyByIndex(index: CollectionItemIndex): TKey { return this._editStrategy.getKeyByIndex(index); } @@ -224,7 +225,8 @@ class CollectionWidget< const { itemsGetter } = this._editStrategy; const { selectionMode, maxFilterLengthInRequest } = this.option(); - this._selection = new Selection({ + // @ts-expect-error TItem + this._selection = new Selection({ allowNullValue: this._nullValueSelectionSupported(), mode: selectionMode, maxFilterLengthInRequest, @@ -259,7 +261,7 @@ class CollectionWidget< }, key: this.key.bind(this), keyOf: this.keyOf.bind(this), - load(options): DeferredObj { + load(options): DeferredObj { const dataController = that._dataController; options.customQueryParams = dataController.loadOptions()?.customQueryParams; options.userData = dataController.userData(); @@ -276,7 +278,7 @@ class CollectionWidget< dataController.applyMapFunction(items); }); } - return Deferred().resolve(this.plainItems()); + return Deferred().resolve(this.plainItems()); }, // eslint-disable-next-line @stylistic/max-len // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/explicit-function-return-type @@ -479,7 +481,8 @@ class CollectionWidget< const { grouped } = this.option(); - if (grouped && normalizedSelection?.items) { + const hasSubItems = (item: TItem): item is TItem & { items: TItem[] } => isObject(item) && 'items' in item && Array.isArray(item.items); + if (grouped && hasSubItems(normalizedSelection)) { normalizedSelection.items = [normalizedSelection.items[0]]; } diff --git a/packages/devextreme/js/__internal/ui/selection/m_selection.strategy.deferred.ts b/packages/devextreme/js/__internal/ui/selection/m_selection.strategy.deferred.ts index 046985478215..a58a555134ff 100644 --- a/packages/devextreme/js/__internal/ui/selection/m_selection.strategy.deferred.ts +++ b/packages/devextreme/js/__internal/ui/selection/m_selection.strategy.deferred.ts @@ -3,35 +3,47 @@ import type { DeferredObj } from '@js/core/utils/deferred'; import { Deferred } from '@js/core/utils/deferred'; import { isString } from '@js/core/utils/type'; import errors from '@js/ui/widget/ui.errors'; - -import SelectionStrategy from './m_selection.strategy'; - -export default class DeferredStrategy extends SelectionStrategy { - getSelectedItems() { +import SelectionStrategy from '@ts/ui/selection/m_selection.strategy'; +import type { KeyExpr, SelectionFilter, SelectionItem } from '@ts/ui/selection/types'; + +export default class DeferredStrategy< + // eslint-disable-next-line @typescript-eslint/no-explicit-any + TItem extends SelectionItem = any, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + TKey = any, +> extends SelectionStrategy { + getSelectedItems(): DeferredObj { return this._loadFilteredData(this.options.selectionFilter); } - getSelectedItemKeys() { - const d = Deferred(); - const that = this; + getSelectedItemKeys(): Promise { + const d = Deferred(); const key = this.options.key(); const select = isString(key) ? [key] : key; + const getKey = (item: TItem): TKey => this.options.keyOf(item); this._loadFilteredData(this.options.selectionFilter, null, select).done((items) => { - // @ts-expect-error - const keys = items.map((item) => that.options.keyOf(item)); + const keys = (Array.isArray(items) ? items : []).map(getKey); d.resolve(keys); - // eslint-disable-next-line @typescript-eslint/no-misused-promises - }).fail(d.reject); + }).fail((error) => { + // @ts-expect-error error + d.reject(error); + }); return d.promise(); } - selectedItemKeys(keys, preserve, isDeselect, isSelectAll) { + selectedItemKeys( + keys: TKey[], + preserve?: boolean, + isDeselect?: boolean, + isSelectAll?: boolean, + ): DeferredObj { if (isSelectAll) { const filter = this.options.filter(); - const needResetSelectionFilter = !filter || JSON.stringify(filter) === JSON.stringify(this.options.selectionFilter) && isDeselect; + const needResetSelectionFilter = !filter + || (JSON.stringify(filter) === JSON.stringify(this.options.selectionFilter) && isDeselect); if (needResetSelectionFilter) { this._setOption('selectionFilter', isDeselect ? [] : null); @@ -43,32 +55,32 @@ export default class DeferredStrategy extends SelectionStrategy { this._setOption('selectionFilter', []); } - for (let i = 0; i < keys.length; i++) { + keys.forEach((key) => { if (isDeselect) { - this.removeSelectedItem(keys[i]); + this.removeSelectedItem(key); } else { - this.addSelectedItem(keys[i], isSelectAll, !preserve); + this.addSelectedItem(key, isSelectAll, !preserve); } - } + }); } this.onSelectionChanged(); - return Deferred().resolve(); + return Deferred().resolve(); } - setSelectedItems(keys) { + setSelectedItems(keys: TKey[]): void { this._setOption('selectionFilter', null); - for (let i = 0; i < keys.length; i++) { - this.addSelectedItem(keys[i]); - } + keys.forEach((key) => { + this.addSelectedItem(key); + }); } - isItemDataSelected(itemData) { + isItemDataSelected(itemData: TItem | TKey): boolean { return this.isItemKeySelected(itemData); } - isItemKeySelected(itemData) { + isItemKeySelected(itemData: TItem | TKey): boolean { const { selectionFilter } = this.options; if (!selectionFilter) { @@ -77,11 +89,11 @@ export default class DeferredStrategy extends SelectionStrategy { const queryParams = this._getQueryParams(); - // @ts-expect-error + // @ts-expect-error dataQuery return !!dataQuery([itemData], queryParams).filter(selectionFilter).toArray().length; } - _getKeyExpr() { + _getKeyExpr(): KeyExpr | Function | undefined { const keyField = this.options.key(); if (Array.isArray(keyField) && keyField.length === 1) { return keyField[0]; @@ -89,21 +101,22 @@ export default class DeferredStrategy extends SelectionStrategy { return keyField; } - _normalizeKey(key) { + _normalizeKey(key: TKey): TKey { const keyExpr = this.options.key(); if (Array.isArray(keyExpr) && keyExpr.length === 1) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return return key[keyExpr[0]]; } return key; } - _getFilterByKey(key) { + _getFilterByKey(key: TKey): SelectionFilter { const keyField = this._getKeyExpr(); - let filter = [keyField, '=', this._normalizeKey(key)]; + let filter: SelectionFilter = [keyField, '=', this._normalizeKey(key)]; if (Array.isArray(keyField)) { filter = []; - for (let i = 0; i < keyField.length; i++) { + for (let i = 0; i < keyField.length; i += 1) { filter.push([keyField[i], '=', key[keyField[i]]]); if (i !== keyField.length - 1) { filter.push('and'); @@ -114,19 +127,19 @@ export default class DeferredStrategy extends SelectionStrategy { return filter; } - addSelectedItem(key, isSelectAll?: boolean, skipFilter?: boolean) { + addSelectedItem(key: TKey, isSelectAll?: boolean, skipFilter?: boolean): void { const filter = this._getFilterByKey(key); this._addSelectionFilter(false, filter, isSelectAll, skipFilter); } - removeSelectedItem(key) { + removeSelectedItem(key: TKey): void { const filter = this._getFilterByKey(key); this._addSelectionFilter(true, filter); } - validate() { + validate(): void { const { key } = this.options; if (key && key() === undefined) { @@ -134,11 +147,15 @@ export default class DeferredStrategy extends SelectionStrategy { } } - _findSubFilter(selectionFilter, filter) { + // eslint-disable-next-line class-methods-use-this + _findSubFilter( + selectionFilter: SelectionFilter | undefined, + filter: SelectionFilter | undefined, + ): number { if (!selectionFilter) return -1; const filterString = JSON.stringify(filter); - for (let index = 0; index < selectionFilter.length; index++) { + for (let index = 0; index < selectionFilter.length; index += 1) { const subFilter = selectionFilter[index]; if (subFilter && JSON.stringify(subFilter) === filterString) { return index; @@ -148,31 +165,46 @@ export default class DeferredStrategy extends SelectionStrategy { return -1; } - _isLastSubFilter(selectionFilter, filter) { + _isLastSubFilter( + selectionFilter: SelectionFilter | undefined, + filter: SelectionFilter | undefined, + ): boolean { if (selectionFilter && filter) { - return this._findSubFilter(selectionFilter, filter) === selectionFilter.length - 1 || this._findSubFilter([selectionFilter], filter) === 0; + return this._findSubFilter(selectionFilter, filter) === selectionFilter.length - 1 + || this._findSubFilter([selectionFilter], filter) === 0; } return false; } - _addFilterOperator(selectionFilter, filterOperator) { - if (selectionFilter.length > 1 && isString(selectionFilter[1]) && selectionFilter[1] !== filterOperator) { - selectionFilter = [selectionFilter]; + // eslint-disable-next-line class-methods-use-this + _addFilterOperator(selectionFilter: SelectionFilter, filterOperator: 'and' | 'or'): SelectionFilter { + let filter = selectionFilter; + if ( + filter.length > 1 + && isString(filter[1]) + && filter[1] !== filterOperator + ) { + filter = [filter]; } - if (selectionFilter.length) { - selectionFilter.push(filterOperator); + if (Array.isArray(filter) && filter.length) { + filter.push(filterOperator); } - return selectionFilter; + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return filter; } - _denormalizeFilter(filter) { - if (filter && isString(filter[0])) { - filter = [filter]; + // eslint-disable-next-line class-methods-use-this + _denormalizeFilter(filter: SelectionFilter): SelectionFilter { + let resultFilter = filter; + if (resultFilter && isString(resultFilter[0])) { + resultFilter = [resultFilter]; } - return filter; + return resultFilter; } - _isOnlyNegativeFiltersLeft(filters) { + // eslint-disable-next-line class-methods-use-this + _isOnlyNegativeFiltersLeft(filters: SelectionFilter): boolean { return filters.every((filterItem, i) => { if (i % 2 === 0) { return Array.isArray(filterItem) && filterItem[0] === '!'; @@ -182,21 +214,19 @@ export default class DeferredStrategy extends SelectionStrategy { } _addSelectionFilter( - isDeselect, - filter, + isDeselect: boolean | undefined, + filter: SelectionFilter | undefined, isSelectAll?: boolean, skipFilter?: boolean, - ) { - const that = this; - const currentFilter = isDeselect ? ['!', filter] : filter; + ): void { const currentOperation = isDeselect ? 'and' : 'or'; let needAddFilter = true; - let selectionFilter = that.options.selectionFilter || []; + let selectionFilter: SelectionFilter = this.options.selectionFilter || []; - selectionFilter = that._denormalizeFilter(selectionFilter); + selectionFilter = this._denormalizeFilter(selectionFilter); if (selectionFilter?.length && !skipFilter) { - const removedIndex = that._removeSameFilter(selectionFilter, filter, isDeselect, isSelectAll); - const filterIndex = that._removeSameFilter(selectionFilter, filter, !isDeselect); + const removedIndex = this._removeSameFilter(selectionFilter, filter, isDeselect, isSelectAll); + const filterIndex = this._removeSameFilter(selectionFilter, filter, !isDeselect); const shouldCleanFilter = isDeselect && (removedIndex !== -1 || filterIndex !== -1) @@ -206,30 +236,36 @@ export default class DeferredStrategy extends SelectionStrategy { selectionFilter = []; } - const isKeyOperatorsAfterRemoved = this._isKeyFilter(filter) && this._hasKeyFiltersOnlyStartingFromIndex(selectionFilter, filterIndex); + const isKeyOperatorsAfterRemoved = this._isKeyFilter(filter) + && this._hasKeyFiltersOnlyStartingFromIndex(selectionFilter, filterIndex); - needAddFilter = filter.length && !isKeyOperatorsAfterRemoved; + needAddFilter = !!filter?.length && !isKeyOperatorsAfterRemoved; } if (needAddFilter) { - selectionFilter = that._addFilterOperator(selectionFilter, currentOperation); - selectionFilter.push(currentFilter); + selectionFilter = this._addFilterOperator(selectionFilter, currentOperation); + if (Array.isArray(selectionFilter) && filter) { + const currentFilter = isDeselect ? ['!', filter] : filter; + selectionFilter.push(currentFilter); + } } - selectionFilter = that._normalizeFilter(selectionFilter); + selectionFilter = this._normalizeFilter(selectionFilter); - that._setOption('selectionFilter', !isDeselect && !selectionFilter.length ? null : selectionFilter); + this._setOption('selectionFilter', !isDeselect && !selectionFilter.length ? null : selectionFilter); } - _normalizeFilter(filter) { - if (filter && filter.length === 1) { - // eslint-disable-next-line prefer-destructuring - filter = filter[0]; + // eslint-disable-next-line class-methods-use-this + _normalizeFilter(filter: SelectionFilter): SelectionFilter { + let resultFilter = filter; + if (resultFilter && resultFilter.length === 1) { + [resultFilter] = resultFilter; } - return filter; + return resultFilter; } - _removeFilterByIndex(filter, filterIndex, isSelectAll) { + // eslint-disable-next-line class-methods-use-this + _removeFilterByIndex(filter: SelectionFilter, filterIndex: number, isSelectAll?: boolean): void { const operation = filter[1]; if (filterIndex > 0) { @@ -243,25 +279,29 @@ export default class DeferredStrategy extends SelectionStrategy { } } - _isSimpleKeyFilter(filter, key) { - return filter.length === 3 && filter[0] === key && filter[1] === '='; + // eslint-disable-next-line class-methods-use-this + _isSimpleKeyFilter( + filter: SelectionFilter | undefined, + key: string | Function | undefined, + ): boolean { + return filter?.length === 3 && filter[0] === key && filter[1] === '='; } - _isKeyFilter(filter) { - if (filter.length === 2 && filter[0] === '!') { + _isKeyFilter(filter: SelectionFilter | undefined): boolean { + if (filter?.length === 2 && filter?.[0] === '!') { return this._isKeyFilter(filter[1]); } const keyField = this._getKeyExpr(); if (Array.isArray(keyField)) { - if (filter.length !== keyField.length * 2 - 1) { + if (filter?.length !== keyField.length * 2 - 1) { return false; } - for (let i = 0; i < keyField.length; i++) { - if (i > 0 && filter[i * 2 - 1] !== 'and') { + for (let i = 0; i < keyField.length; i += 1) { + if (i > 0 && filter?.[i * 2 - 1] !== 'and') { return false; } - if (!this._isSimpleKeyFilter(filter[i * 2], keyField[i])) { + if (!this._isSimpleKeyFilter(filter?.[i * 2], keyField[i])) { return false; } } @@ -271,9 +311,12 @@ export default class DeferredStrategy extends SelectionStrategy { return this._isSimpleKeyFilter(filter, keyField); } - _hasKeyFiltersOnlyStartingFromIndex(selectionFilter, filterIndex) { + _hasKeyFiltersOnlyStartingFromIndex( + selectionFilter: SelectionFilter, + filterIndex: number, + ): boolean { if (filterIndex >= 0) { - for (let i = filterIndex; i < selectionFilter.length; i++) { + for (let i = filterIndex; i < selectionFilter.length; i += 1) { if (typeof selectionFilter[i] !== 'string' && !this._isKeyFilter(selectionFilter[i])) { return false; } @@ -285,38 +328,49 @@ export default class DeferredStrategy extends SelectionStrategy { return false; } - _removeSameFilter(selectionFilter, filter, inverted, isSelectAll?: boolean) { - filter = inverted ? ['!', filter] : filter; + _removeSameFilter( + selectionFilter: SelectionFilter, + filter: SelectionFilter | undefined, + inverted?: boolean, + isSelectAll?: boolean, + ): number { + const sameFilter = inverted ? ['!', filter] : filter; - if (JSON.stringify(filter) === JSON.stringify(selectionFilter)) { + if (JSON.stringify(sameFilter) === JSON.stringify(selectionFilter)) { selectionFilter.splice(0, selectionFilter.length); return 0; } - const filterIndex = this._findSubFilter(selectionFilter, filter); + const filterIndex = this._findSubFilter(selectionFilter, sameFilter); if (filterIndex >= 0) { this._removeFilterByIndex(selectionFilter, filterIndex, isSelectAll); return filterIndex; } - for (let i = 0; i < selectionFilter.length; i++) { + + for (let i = 0; i < selectionFilter.length; i += 1) { if (Array.isArray(selectionFilter[i]) && selectionFilter[i].length > 2) { - const filterIndex = this._removeSameFilter(selectionFilter[i], filter, false, isSelectAll); - if (filterIndex >= 0) { + const innerFilterIndex = this._removeSameFilter( + selectionFilter[i], + sameFilter, + false, + isSelectAll, + ); + if (innerFilterIndex >= 0) { if (!selectionFilter[i].length) { this._removeFilterByIndex(selectionFilter, i, isSelectAll); } else if (selectionFilter[i].length === 1) { - // eslint-disable-next-line prefer-destructuring - selectionFilter[i] = selectionFilter[i][0]; + const [firstFilter] = selectionFilter[i]; + selectionFilter[i] = firstFilter; } - return filterIndex; + return innerFilterIndex; } } } return -1; } - getSelectAllState() { + getSelectAllState(): boolean | undefined { const filter = this.options.filter(); let { selectionFilter } = this.options; @@ -337,7 +391,7 @@ export default class DeferredStrategy extends SelectionStrategy { return undefined; } - loadSelectedItemsWithFilter() { + loadSelectedItemsWithFilter(): DeferredObj { const componentFilter = this.options.filter(); const { selectionFilter } = this.options; diff --git a/packages/devextreme/js/__internal/ui/selection/m_selection.strategy.standard.ts b/packages/devextreme/js/__internal/ui/selection/m_selection.strategy.standard.ts index 7f8ea7c23963..9cb7e30aaa59 100644 --- a/packages/devextreme/js/__internal/ui/selection/m_selection.strategy.standard.ts +++ b/packages/devextreme/js/__internal/ui/selection/m_selection.strategy.standard.ts @@ -5,50 +5,64 @@ import { getKeyHash } from '@js/core/utils/common'; import type { DeferredObj } from '@js/core/utils/deferred'; import { Deferred, when } from '@js/core/utils/deferred'; import { SelectionFilterCreator } from '@js/core/utils/selection_filter'; -import { isDefined, isObject } from '@js/core/utils/type'; +import { isDefined, isNumeric, isObject } from '@js/core/utils/type'; import errors from '@js/ui/widget/ui.errors'; +import SelectionStrategy from '@ts/ui/selection/m_selection.strategy'; +import type { + PendingOptions, + RequestData, + RequestItems, + SelectionFilter, + SelectionItem, + SelectionOptions, +} from '@ts/ui/selection/types'; + +interface KeyIndicesToRemoveMap { + [index: number]: boolean; +} -import SelectionStrategy from './m_selection.strategy'; - -export default class StandardStrategy extends SelectionStrategy { +export default class StandardStrategy< + // eslint-disable-next-line @typescript-eslint/no-explicit-any + TItem extends SelectionItem = any, + TKey extends string | number = string | number, +> extends SelectionStrategy { _shouldMergeWithLastRequest?: boolean; - _lastLoadDeferred?: any; + _lastLoadDeferred?: DeferredObj; - _lastRequestData?: any; + _lastRequestData?: RequestData; _isCancelingInProgress?: boolean; _lastSelectAllPageDeferred = Deferred().reject(); _storedSelectionState?: { - selectedItems: any; - selectedItemKeys: any; - keyHashIndices: any; + selectedItems: TItem[]; + selectedItemKeys: TKey[]; + keyHashIndices: string; }; - constructor(options) { + constructor(options: SelectionOptions) { super(options); this._initSelectedItemKeyHash(); } - _initSelectedItemKeyHash() { + _initSelectedItemKeyHash(): void { this._setOption('keyHashIndices', this.options.equalByReference ? null : {}); } - getSelectedItemKeys() { + getSelectedItemKeys(): TKey[] { return this.options.selectedItemKeys.slice(0); } - getSelectedItems() { + getSelectedItems(): TItem[] { return this.options.selectedItems.slice(0); } - _preserveSelectionUpdate(items, isDeselect) { + _preserveSelectionUpdate(items: TItem[], isDeselect?: boolean): void { const { keyOf } = this.options; - let keyIndicesToRemoveMap; - let keyIndex; - let i; + // eslint-disable-next-line @typescript-eslint/init-declarations + let keyIndicesToRemoveMap: KeyIndicesToRemoveMap | undefined; if (!keyOf) return; @@ -58,32 +72,36 @@ export default class StandardStrategy extends SelectionStrategy { keyIndicesToRemoveMap = {}; } - for (i = 0; i < items.length; i++) { - const item = items[i]; + items.forEach((item) => { const key = keyOf(item); if (isDeselect) { - keyIndex = this.removeSelectedItem(key, keyIndicesToRemoveMap, item?.disabled); - if (keyIndicesToRemoveMap && keyIndex >= 0) { + const keyIndex = this.removeSelectedItem( + key, + keyIndicesToRemoveMap, + item && typeof item === 'object' && 'disabled' in item ? !!item.disabled : false, + ); + if (keyIndicesToRemoveMap && isNumeric(keyIndex) && keyIndex >= 0) { keyIndicesToRemoveMap[keyIndex] = true; } } else { this.addSelectedItem(key, item); } - } + }); if (isBatchDeselect) { - this._batchRemoveSelectedItems(keyIndicesToRemoveMap); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + this._batchRemoveSelectedItems(keyIndicesToRemoveMap!); } } - _batchRemoveSelectedItems(keyIndicesToRemoveMap) { + _batchRemoveSelectedItems(keyIndicesToRemoveMap: KeyIndicesToRemoveMap): void { const selectedItemKeys = this.options.selectedItemKeys.slice(0); const selectedItems = this.options.selectedItems.slice(0); this.options.selectedItemKeys.length = 0; this.options.selectedItems.length = 0; - for (let i = 0; i < selectedItemKeys.length; i++) { + for (let i = 0; i < selectedItemKeys.length; i += 1) { if (!keyIndicesToRemoveMap[i]) { this.options.selectedItemKeys.push(selectedItemKeys[i]); this.options.selectedItems.push(selectedItems[i]); @@ -94,8 +112,14 @@ export default class StandardStrategy extends SelectionStrategy { this.updateSelectedItemKeyHash(this.options.selectedItemKeys); } - _loadSelectedItemsCore(keys, isDeselect, isSelectAll, filter, forceCombinedFilter = false) { - let deferred = Deferred(); + _loadSelectedItemsCore( + keys: TKey[], + isDeselect?: boolean, + isSelectAll?: boolean, + filter?: SelectionFilter, + forceCombinedFilter = false, + ): DeferredObj { + let deferred = Deferred(); const key = this.options.key(); if (!keys.length && !isSelectAll) { @@ -109,20 +133,33 @@ export default class StandardStrategy extends SelectionStrategy { } const selectionFilterCreator = new SelectionFilterCreator(keys, isSelectAll); - const combinedFilter = selectionFilterCreator.getCombinedFilter(key, filter, forceCombinedFilter); + const combinedFilter = selectionFilterCreator.getCombinedFilter( + key, + filter, + forceCombinedFilter, + ); let deselectedItems = []; if (isDeselect) { const { selectedItems } = this.options; deselectedItems = combinedFilter && keys.length !== selectedItems.length - // @ts-expect-error + // @ts-expect-error dataQuery ? dataQuery(selectedItems).filter(combinedFilter).toArray() : selectedItems.slice(0); } - let filteredItems = deselectedItems.length ? deselectedItems : this.options.plainItems(true).filter(this.options.isSelectableItem).map(this.options.getItemData); + let filteredItems = deselectedItems.length + ? deselectedItems + : this.options.plainItems(true) + .filter(this.options.isSelectableItem) + .map(this.options.getItemData); - const localFilter = selectionFilterCreator.getLocalFilter(this.options.keyOf, this.equalKeys.bind(this), this.options.equalByReference, key); + const localFilter = selectionFilterCreator.getLocalFilter( + this.options.keyOf, + this.equalKeys.bind(this), + this.options.equalByReference, + key, + ); filteredItems = filteredItems.filter(localFilter); @@ -135,50 +172,48 @@ export default class StandardStrategy extends SelectionStrategy { return deferred; } - _replaceSelectionUpdate(items) { - const internalKeys = []; + _replaceSelectionUpdate(items: TItem[]): void { const { keyOf } = this.options; if (!keyOf) return; - for (let i = 0; i < items.length; i++) { - const item = items[i]; - const key = keyOf(item); - // @ts-expect-error - internalKeys.push(key); - } + const internalKeys: TKey[] = items.map((item) => keyOf(item)); this.setSelectedItems(internalKeys, items); } - _warnOnIncorrectKeys(keys) { + _warnOnIncorrectKeys(keys: TKey[]): void { const { allowNullValue } = this.options; - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - + keys.forEach((key) => { if ((!allowNullValue || key !== null) && !this.isItemKeySelected(key)) { errors.log('W1002', key); } - } + }); } - _isMultiSelectEnabled() { + _isMultiSelectEnabled(): boolean { const { mode } = this.options; return mode === 'all' || mode === 'multiple'; } - _requestInProgress() { + _requestInProgress(): boolean { return this._lastLoadDeferred?.state() === 'pending'; } - _concatRequestsItems(keys, isDeselect, oldRequestItems, updatedKeys) { - let selectedItems; + _concatRequestsItems( + keys: TKey[], + oldRequestItems: RequestItems, + isDeselect?: boolean, + updatedKeys?: TKey[], + ): RequestData { + let selectedItems: TKey[] = []; const deselectedItems = isDeselect ? keys : []; if (updatedKeys) { selectedItems = updatedKeys; } else { + // @ts-expect-error removeDuplicates selectedItems = removeDuplicates(keys, this.options.selectedItemKeys); } @@ -189,75 +224,125 @@ export default class StandardStrategy extends SelectionStrategy { }; } - _collectLastRequestData(keys, isDeselect, isSelectAll, updatedKeys) { + _collectLastRequestData( + keys: TKey[], + isDeselect?: boolean, + isSelectAll?: boolean, + updatedKeys?: TKey[], + ): RequestData { const isDeselectAll = isDeselect && isSelectAll; - const oldRequestItems = { + const oldRequestItems: RequestItems = { added: [], removed: [], }; const multiSelectEnabled = this._isMultiSelectEnabled(); - let lastRequestData = multiSelectEnabled ? this._lastRequestData : {}; + const emptyData: RequestData = { + addedItems: [], + removedItems: [], + keys: [], + }; + let lastRequestData: RequestData = multiSelectEnabled + ? this._lastRequestData ?? emptyData + : emptyData; if (multiSelectEnabled) { if (this._shouldMergeWithLastRequest) { if (isDeselectAll) { - this._lastLoadDeferred.reject(); - lastRequestData = {}; + this._lastLoadDeferred?.reject(); + lastRequestData = {} as RequestData; } else if (!isKeysEqual(keys, this.options.selectedItemKeys)) { - oldRequestItems.added = lastRequestData.addedItems; - oldRequestItems.removed = lastRequestData.removedItems; + oldRequestItems.added = lastRequestData?.addedItems; + oldRequestItems.removed = lastRequestData?.removedItems; if (!isDeselect) { - this._lastLoadDeferred.reject(); + this._lastLoadDeferred?.reject(); } } } - lastRequestData = this._concatRequestsItems(keys, isDeselect, oldRequestItems, this._shouldMergeWithLastRequest ? undefined : updatedKeys); + lastRequestData = this._concatRequestsItems( + keys, + oldRequestItems, + isDeselect, + this._shouldMergeWithLastRequest ? undefined : updatedKeys, + ); } return lastRequestData; } - _updateKeysByLastRequestData(keys, isDeselect, isSelectAll) { + _updateKeysByLastRequestData(keys: TKey[], isDeselect?: boolean, isSelectAll?: boolean): TKey[] { let currentKeys = keys; - if (this._isMultiSelectEnabled() && this._shouldMergeWithLastRequest && !isDeselect && !isSelectAll) { - currentKeys = removeDuplicates(keys.concat(this._lastRequestData?.addedItems), this._lastRequestData?.removedItems); + if ( + this._isMultiSelectEnabled() + && this._shouldMergeWithLastRequest + && this._lastRequestData + && !isDeselect + && !isSelectAll + ) { + currentKeys = removeDuplicates( + // @ts-expect-error removeDuplicates + [ + ...keys, + ...this._lastRequestData.addedItems, + ], + this._lastRequestData?.removedItems, + ); + // @ts-expect-error getUniqueValues currentKeys = getUniqueValues(currentKeys); } return currentKeys; } - _loadSelectedItems(keys, isDeselect, isSelectAll, updatedKeys, forceCombinedFilter = false) { - const that = this; - const deferred = Deferred(); - const filter = that.options.filter(); + _loadSelectedItems( + keys: TKey[], + isDeselect?: boolean, + isSelectAll?: boolean, + updatedKeys?: TKey[], + forceCombinedFilter = false, + ): DeferredObj { + const deferred = Deferred(); + const filter = this.options.filter(); this._shouldMergeWithLastRequest = this._requestInProgress(); - this._lastRequestData = this._collectLastRequestData(keys, isDeselect, isSelectAll, updatedKeys); + this._lastRequestData = this._collectLastRequestData( + keys, + isDeselect, + isSelectAll, + updatedKeys, + ); - when(that._lastLoadDeferred).always(() => { - const currentKeys = that._updateKeysByLastRequestData(keys, isDeselect, isSelectAll); + when(this._lastLoadDeferred).always(() => { + const currentKeys = this._updateKeysByLastRequestData(keys, isDeselect, isSelectAll); - that._shouldMergeWithLastRequest = false; + this._shouldMergeWithLastRequest = false; - that._loadSelectedItemsCore(currentKeys, isDeselect, isSelectAll, filter, forceCombinedFilter) - // eslint-disable-next-line @typescript-eslint/no-misused-promises - .done(deferred.resolve) - // eslint-disable-next-line @typescript-eslint/no-misused-promises - .fail(deferred.reject); + this._loadSelectedItemsCore(currentKeys, isDeselect, isSelectAll, filter, forceCombinedFilter) + .done((result) => { + deferred.resolve(result); + }) + .fail((error) => { + deferred.reject(error); + }); }); - that._lastLoadDeferred = deferred; + this._lastLoadDeferred = deferred; return deferred; } - selectedItemKeys(keys, preserve, isDeselect, isSelectAll, updatedKeys, forceCombinedFilter = false) { + selectedItemKeys( + keys: TKey[], + preserve?: boolean, + isDeselect?: boolean, + isSelectAll?: boolean, + updatedKeys?: TKey[], + forceCombinedFilter?: boolean, + ): DeferredObj { if (this._isCancelingInProgress) { - return Deferred().reject(); + return Deferred().reject(); } const loadingDeferred = this._loadSelectedItems( @@ -268,7 +353,7 @@ export default class StandardStrategy extends SelectionStrategy { forceCombinedFilter, ); - const selectionDeferred = Deferred(); + const selectionDeferred = Deferred(); loadingDeferred.done((items) => { this._storeSelectionState(); @@ -299,9 +384,13 @@ export default class StandardStrategy extends SelectionStrategy { return selectionDeferred; } - addSelectedItem(key, itemData) { - if (isDefined(itemData) && !this.options.ignoreDisabledItems && itemData.disabled) { - if (this.options.disabledItemKeys.indexOf(key) === -1) { + addSelectedItem(key: TKey, item: TItem): void { + if ( + isDefined(item) + && !this.options.ignoreDisabledItems + && item.disabled + ) { + if (!this.options.disabledItemKeys.includes(key)) { this.options.disabledItemKeys.push(key); } return; @@ -316,23 +405,22 @@ export default class StandardStrategy extends SelectionStrategy { this.options.selectedItemKeys.push(key); this.options.addedItemKeys.push(key); - this.options.addedItems.push(itemData); - this.options.selectedItems.push(itemData); + this.options.addedItems.push(item); + this.options.selectedItems.push(item); } } - _getSelectedIndexByKey(key, ignoreIndicesMap) { + _getSelectedIndexByKey(key: TKey, ignoreIndicesMap?: KeyIndicesToRemoveMap): number { const { selectedItemKeys } = this.options; - for (let index = 0; index < selectedItemKeys.length; index++) { - if ((!ignoreIndicesMap || !ignoreIndicesMap[index]) && this.equalKeys(selectedItemKeys[index], key)) { - return index; - } - } - return -1; + return selectedItemKeys + .findIndex( + (_, index) => (!ignoreIndicesMap || !ignoreIndicesMap[index]) + && this.equalKeys(selectedItemKeys[index], key), + ); } - _getSelectedIndexByHash(key, ignoreIndicesMap) { + _getSelectedIndexByHash(key: TKey, ignoreIndicesMap?: KeyIndicesToRemoveMap): number { let indices = this.options.keyHashIndices[key]; if (indices && indices.length > 1 && ignoreIndicesMap) { @@ -342,8 +430,8 @@ export default class StandardStrategy extends SelectionStrategy { return indices && indices[0] >= 0 ? indices[0] : -1; } - _indexOfSelectedItemKey(key, ignoreIndicesMap?: any[]) { - let selectedIndex; + _indexOfSelectedItemKey(key: TKey, ignoreIndicesMap?: KeyIndicesToRemoveMap): number { + let selectedIndex = -1; if (this.options.equalByReference) { selectedIndex = this.options.selectedItemKeys.indexOf(key); @@ -356,29 +444,34 @@ export default class StandardStrategy extends SelectionStrategy { return selectedIndex; } - _shiftSelectedKeyIndices(keyIndex) { - for (let currentKeyIndex = keyIndex; currentKeyIndex < this.options.selectedItemKeys.length; currentKeyIndex++) { + _shiftSelectedKeyIndices(keyIndex: number): void { + for ( + let currentKeyIndex = keyIndex; + currentKeyIndex < this.options.selectedItemKeys.length; + currentKeyIndex += 1 + ) { const currentKey = this.options.selectedItemKeys[currentKeyIndex]; const currentKeyHash = getKeyHash(currentKey); const currentKeyIndices = this.options.keyHashIndices[currentKeyHash]; + // eslint-disable-next-line no-continue if (!currentKeyIndices) continue; - for (let i = 0; i < currentKeyIndices.length; i++) { + for (let i = 0; i < currentKeyIndices.length; i += 1) { if (currentKeyIndices[i] > keyIndex) { - currentKeyIndices[i]--; + currentKeyIndices[i] -= 1; } } } } removeSelectedItem( - key, - keyIndicesToRemoveMap?: any[], + key: TKey, + keyIndicesToRemoveMap?: KeyIndicesToRemoveMap, isDisabled?: boolean, - ) { + ): number | undefined { if (!this.options.ignoreDisabledItems && isDisabled) { - return; + return undefined; } const keyHash = this._getKeyHash(key); @@ -421,8 +514,8 @@ export default class StandardStrategy extends SelectionStrategy { return keyIndex; } - _updateAddedItemKeys(keys, items) { - for (let i = 0; i < keys.length; i++) { + _updateAddedItemKeys(keys: TKey[], items: TItem[]): void { + for (let i = 0; i < keys.length; i += 1) { if (!this.isItemKeySelected(keys[i])) { this.options.addedItemKeys.push(keys[i]); this.options.addedItems.push(items[i]); @@ -430,8 +523,8 @@ export default class StandardStrategy extends SelectionStrategy { } } - _updateRemovedItemKeys(keys, oldSelectedKeys, oldSelectedItems) { - for (let i = 0; i < oldSelectedKeys.length; i++) { + _updateRemovedItemKeys(_: TKey[], oldSelectedKeys: TKey[], oldSelectedItems: TItem[]): void { + for (let i = 0; i < oldSelectedKeys.length; i += 1) { if (!this.isItemKeySelected(oldSelectedKeys[i])) { this.options.removedItemKeys.push(oldSelectedKeys[i]); this.options.removedItems.push(oldSelectedItems[i]); @@ -439,20 +532,21 @@ export default class StandardStrategy extends SelectionStrategy { } } - _isItemSelectionInProgress(key, checkPending) { + _isItemSelectionInProgress(key: TKey, checkPending?: boolean): boolean { const shouldCheckPending = checkPending && this._lastRequestData && this._requestInProgress(); if (shouldCheckPending) { - const addedItems = this._lastRequestData.addedItems ?? []; + const addedItems = this._lastRequestData?.addedItems ?? []; return addedItems.includes(key); } return false; } - _getKeyHash(key) { + _getKeyHash(key: TKey): TKey { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return return this.options.equalByReference ? key : getKeyHash(key); } - setSelectedItems(keys, items) { + setSelectedItems(keys: TKey[], items: TItem[]): void { this._updateAddedItemKeys(keys, items); const oldSelectedKeys = this.options.selectedItemKeys; @@ -469,12 +563,12 @@ export default class StandardStrategy extends SelectionStrategy { this._updateRemovedItemKeys(keys, oldSelectedKeys, oldSelectedItems); } - isItemDataSelected(itemData, options = {}) { + isItemDataSelected(itemData: TItem, options: PendingOptions = {}): boolean { const key = this.options.keyOf(itemData); return this.isItemKeySelected(key, options); } - isItemKeySelected(key, options: { checkPending?: boolean } = {}) { + isItemKeySelected(key: TKey, options: PendingOptions = {}): boolean { let result = this._isItemSelectionInProgress(key, options.checkPending); if (!result) { @@ -486,20 +580,20 @@ export default class StandardStrategy extends SelectionStrategy { return result; } - getSelectAllState(visibleOnly) { + getSelectAllState(visibleOnly: boolean): boolean | undefined { if (visibleOnly) { return this._getVisibleSelectAllState(); } return this._getFullSelectAllState(); } - loadSelectedItemsWithFilter() { + loadSelectedItemsWithFilter(): DeferredObj { const keyExpr = this.options.key(); const keys = this.getSelectedItemKeys(); const filter = this.options.filter(); if (!keys.length) { - return Deferred().resolve([]); + return Deferred().resolve([]); } const selectionFilterCreator = new SelectionFilterCreator(keys); @@ -521,7 +615,11 @@ export default class StandardStrategy extends SelectionStrategy { _restoreSelectionState(): void { this._clearItemKeys(); - const { selectedItemKeys, selectedItems, keyHashIndices } = this._storedSelectionState!; + if (!this._storedSelectionState) { + return; + } + + const { selectedItemKeys, selectedItems, keyHashIndices } = this._storedSelectionState; this._setOption('selectedItemKeys', selectedItemKeys); this._setOption('selectedItems', selectedItems); this._setOption('keyHashIndices', JSON.parse(keyHashIndices)); diff --git a/packages/devextreme/js/__internal/ui/selection/m_selection.strategy.ts b/packages/devextreme/js/__internal/ui/selection/m_selection.strategy.ts index 78ef807767b3..b99c0cff800d 100644 --- a/packages/devextreme/js/__internal/ui/selection/m_selection.strategy.ts +++ b/packages/devextreme/js/__internal/ui/selection/m_selection.strategy.ts @@ -1,36 +1,50 @@ +import type { LoadOptions, SelectDescriptor } from '@js/common/data.types'; import dataQuery from '@js/common/data/query'; import { equalByValue, getKeyHash, noop, } from '@js/core/utils/common'; -import { Deferred } from '@js/core/utils/deferred'; +import { Deferred, type DeferredObj } from '@js/core/utils/deferred'; import { isObject, isPlainObject, isPromise } from '@js/core/utils/type'; - -export default class SelectionStrategy { - options: any; +import type { + QueryParams, + RemoteFilter, + SelectionFilter, + SelectionItem, + SelectionOptions, +} from '@ts/ui/selection/types'; + +export default class SelectionStrategy< + // eslint-disable-next-line @typescript-eslint/no-explicit-any + TItem extends SelectionItem = any, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + TKey = any, +> { + options: SelectionOptions; _lastSelectAllPageDeferred = Deferred().reject(); - constructor(options) { + constructor(options: SelectionOptions) { + // eslint-disable-next-line no-console + console.log('i tried so hard and got'); this.options = options; this._setOption('disabledItemKeys', []); this._clearItemKeys(); } - _clearItemKeys() { + _clearItemKeys(): void { this._setOption('addedItemKeys', []); this._setOption('removedItemKeys', []); this._setOption('removedItems', []); this._setOption('addedItems', []); } - validate() { - - } + // eslint-disable-next-line class-methods-use-this + validate(): void {} - _setOption(name, value) { + _setOption(name: string, value: unknown): void { this.options[name] = value; } @@ -81,7 +95,7 @@ export default class SelectionStrategy { } } - onSelectionChanged() { + onSelectionChanged(): void { const { selectedItems, selectedItemKeys, @@ -103,7 +117,7 @@ export default class SelectionStrategy { }); } - equalKeys(key1, key2) { + equalKeys(key1: TKey, key2: TKey): boolean { if (this.options.equalByReference) { if (isObject(key1) && isObject(key2)) { return key1 === key2; @@ -113,19 +127,24 @@ export default class SelectionStrategy { return equalByValue(key1, key2); } - getSelectableItems(items) { + // eslint-disable-next-line class-methods-use-this + getSelectableItems(items: TItem[]): TItem[] { return items.filter((item) => !item?.disabled); } - _clearSelection(keys, preserve, isDeselect, isSelectAll) { - keys = keys || []; - keys = Array.isArray(keys) ? keys : [keys]; + _clearSelection( + keys: TKey[] | TKey, + preserve?: boolean, + isDeselect?: boolean, + isSelectAll?: boolean, + ): DeferredObj { + let normalizedKeys = keys || []; + normalizedKeys = Array.isArray(normalizedKeys) ? normalizedKeys : [normalizedKeys]; this.validate(); - // @ts-expect-error - return this.selectedItemKeys(keys, preserve, isDeselect, isSelectAll); + return this.selectedItemKeys(normalizedKeys, preserve, isDeselect, isSelectAll); } - _removeTemplateProperty(remoteFilter: { template: any }) { + _removeTemplateProperty(remoteFilter: RemoteFilter): RemoteFilter { if (Array.isArray(remoteFilter)) { return remoteFilter.map((f) => this._removeTemplateProperty(f)); } @@ -137,11 +156,11 @@ export default class SelectionStrategy { return remoteFilter; } - _getQueryParams() { + _getQueryParams(): QueryParams | undefined { const { sensitivity } = this.options; if (!sensitivity) { - return; + return undefined; } return { @@ -153,42 +172,54 @@ export default class SelectionStrategy { }; } - _loadFilteredData(remoteFilter, localFilter?: any, select?: any, isSelectAll?: boolean) { - const filterLength = encodeURI(JSON.stringify(this._removeTemplateProperty(remoteFilter))).length; - const needLoadAllData = this.options.maxFilterLengthInRequest && (filterLength > this.options.maxFilterLengthInRequest); - const deferred = Deferred(); + _loadFilteredData( + remoteFilter: SelectionFilter, + localFilter?: Function | null, + select?: SelectDescriptor | null, + isSelectAll?: boolean, + ): DeferredObj { + const filterLength = encodeURI( + JSON.stringify(this._removeTemplateProperty(remoteFilter)), + ).length; + const needLoadAllData = this.options.maxFilterLengthInRequest + && (filterLength > this.options.maxFilterLengthInRequest); + const deferred = Deferred(); const queryParams = this._getQueryParams(); - const loadOptions = { + const loadOptions: LoadOptions = { filter: needLoadAllData ? undefined : remoteFilter, + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing select: needLoadAllData ? this.options.dataFields() : select || this.options.dataFields(), ...queryParams, }; - if (remoteFilter && remoteFilter.length === 0) { + if (remoteFilter && Array.isArray(remoteFilter) && remoteFilter.length === 0) { deferred.resolve([]); } else { this.options.load(loadOptions) .done((items) => { - let filteredItems = isPlainObject(items) ? items.data : items; + let filteredItems = !Array.isArray(items) && isPlainObject(items) ? items.data : items; if (localFilter && !isSelectAll) { filteredItems = filteredItems.filter(localFilter); } else if (needLoadAllData) { - // @ts-expect-error + // @ts-expect-error dataQuary filteredItems = dataQuery(filteredItems).filter(remoteFilter).toArray(); } deferred.resolve(filteredItems); }) - .fail(deferred.reject.bind(deferred)); + .fail((error) => { + // @ts-expect-error error + deferred.reject(error); + }); } return deferred; } - updateSelectedItemKeyHash(keys) { - for (let i = 0; i < keys.length; i++) { + updateSelectedItemKeyHash(keys: TKey[]): void { + for (let i = 0; i < keys.length; i += 1) { const keyHash = getKeyHash(keys[i]); if (!isObject(keyHash)) { @@ -200,23 +231,24 @@ export default class SelectionStrategy { } } - _isAnyItemSelected(items) { - for (let i = 0; i < items.length; i++) { - if (this.options.isItemSelected(items[i])) { - return undefined; - } + _isAnyItemSelected(items: TItem[]): boolean | undefined { + if (items.find((item) => this.options.isItemSelected(item))) { + return undefined; } return false; } - _getFullSelectAllState() { + _getFullSelectAllState(): boolean | undefined { const items = this.options.plainItems(); - const dataFilter = this.options.filter(); - let selectedItems = this.options.ignoreDisabledItems ? this.options.selectedItems : this.options.selectedItems.filter((item) => !item?.disabled); + const { filter } = this.options; + const dataFilter = filter(); + let selectedItems = this.options.ignoreDisabledItems + ? this.options.selectedItems + : this.options.selectedItems.filter((item) => !item?.disabled); if (dataFilter) { - // @ts-expect-error + // @ts-expect-error dataQuery selectedItems = dataQuery(selectedItems).filter(dataFilter).toArray(); } @@ -233,13 +265,12 @@ export default class SelectionStrategy { return undefined; } - _getVisibleSelectAllState() { + _getVisibleSelectAllState(): boolean | undefined { const items = this.getSelectableItems(this.options.plainItems()); let hasSelectedItems = false; let hasUnselectedItems = false; - for (let i = 0; i < items.length; i++) { - const item = items[i]; + items.forEach((item) => { const itemData = this.options.getItemData(item); const key = this.options.keyOf(itemData); @@ -250,7 +281,7 @@ export default class SelectionStrategy { hasUnselectedItems = true; } } - } + }); if (hasSelectedItems) { return !hasUnselectedItems ? true : undefined; @@ -258,26 +289,49 @@ export default class SelectionStrategy { return false; } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - isItemKeySelected(itemKey): boolean { + // eslint-disable-next-line class-methods-use-this + selectedItemKeys( + // eslint-disable-next-line @typescript-eslint/no-unused-vars + keys: TKey[], + // eslint-disable-next-line @typescript-eslint/no-unused-vars + preserve?: boolean, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + isDeselect?: boolean, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + isSelectAll?: boolean, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + updatedKeys?: TKey[], + // eslint-disable-next-line @typescript-eslint/no-unused-vars + forceCombinedFilter?: boolean, + ): DeferredObj { + throw new Error('selectedItemKeys method should be overriden'); + } + + isItemKeySelected(itemKey: TKey | TItem): boolean; + // eslint-disable-next-line @typescript-eslint/no-unused-vars, class-methods-use-this + isItemKeySelected(itemKey: TKey | TItem, options: { checkPending?: boolean } = {}): boolean { + throw new Error('isItemKeySelected method should be overriden'); + } + + isItemDataSelected(itemKey: TKey | TItem): boolean; + // eslint-disable-next-line @typescript-eslint/no-unused-vars, class-methods-use-this + isItemDataSelected(itemKey: TKey | TItem, options: { checkPending?: boolean } = {}): boolean { throw new Error('isItemKeySelected method should be overriden'); } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - addSelectedItem(itemKey, itemData): void { + // eslint-disable-next-line @typescript-eslint/no-unused-vars, class-methods-use-this + addSelectedItem(itemKey: TKey, dataOrIsSelectAll?: TItem | boolean, skipFilter?: boolean): void { throw new Error('addSelectedItem method should be overriden'); } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - removeSelectedItem(itemKey): void { + // eslint-disable-next-line @typescript-eslint/no-unused-vars, class-methods-use-this + removeSelectedItem(itemKey: TKey): void { throw new Error('removeSelectedItem method should be overriden'); } _selectAllPlainItems(isDeselect: boolean): void { const items = this.getSelectableItems(this.options.plainItems()); - for (let i = 0; i < items.length; i++) { - const item = items[i]; - + items.forEach((item) => { if (this.options.isSelectableItem(item)) { const itemData = this.options.getItemData(item); const itemKey = this.options.keyOf(itemData); @@ -291,6 +345,6 @@ export default class SelectionStrategy { this.removeSelectedItem(itemKey); } } - } + }); } } diff --git a/packages/devextreme/js/__internal/ui/selection/m_selection.ts b/packages/devextreme/js/__internal/ui/selection/m_selection.ts index a5f7e7fd32ea..2d2d6dd57096 100644 --- a/packages/devextreme/js/__internal/ui/selection/m_selection.ts +++ b/packages/devextreme/js/__internal/ui/selection/m_selection.ts @@ -1,30 +1,42 @@ import { noop } from '@js/core/utils/common'; -import { Deferred, when } from '@js/core/utils/deferred'; +import { Deferred, type DeferredObj, when } from '@js/core/utils/deferred'; import { extend } from '@js/core/utils/extend'; -import { isDefined } from '@js/core/utils/type'; - -import deferredStrategy from './m_selection.strategy.deferred'; -import standardStrategy from './m_selection.strategy.standard'; - -export default class Selection { - options: any; - - _selectionStrategy: deferredStrategy | standardStrategy; +import { isDefined, isPlainObject } from '@js/core/utils/type'; +import DeferredStrategy from '@ts/ui/selection/m_selection.strategy.deferred'; +import StandardStrategy from '@ts/ui/selection/m_selection.strategy.standard'; +import type { + DefaultOptions, + PendingOptions, + SelectionFilter, + SelectionItem, + SelectionOptions, + SelectionStrategy, +} from '@ts/ui/selection/types'; + +export default class Selection< + // eslint-disable-next-line @typescript-eslint/no-explicit-any + TItem extends SelectionItem = any, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + TKey extends string | number = any, + TDeferred extends boolean = boolean, +> { + options: SelectionOptions; + + _selectionStrategy: SelectionStrategy; _focusedItemIndex: number; - _shiftFocusedItemIndex!: number; + _shiftFocusedItemIndex?: number; - constructor(options) { + constructor(options: Partial>) { this.options = extend(this._getDefaultOptions(), options, { - selectedItemKeys: options.selectedKeys || [], + selectedItemKeys: options.selectedKeys ?? [], }); - this._selectionStrategy = this.options.deferred - // eslint-disable-next-line new-cap - ? new deferredStrategy(this.options) - // eslint-disable-next-line new-cap - : new standardStrategy(this.options); + this._selectionStrategy = (this.options.deferred + ? new DeferredStrategy(this.options) + : new StandardStrategy(this.options) + ) as SelectionStrategy; this._focusedItemIndex = -1; @@ -33,8 +45,9 @@ export default class Selection { } } - _getDefaultOptions() { - return { + // eslint-disable-next-line class-methods-use-this + _getDefaultOptions(): DefaultOptions { + const defaultOptions: DefaultOptions = { allowNullValue: false, deferred: false, equalByReference: false, @@ -43,109 +56,140 @@ export default class Selection { selectionFilter: [], maxFilterLengthInRequest: 0, onSelectionChanged: noop, - key: noop, - keyOf(item) { return item; }, - load() { return Deferred().resolve([]); }, + key() { return undefined; }, + keyOf(item) { return item as unknown as TKey; }, + load() { return Deferred().resolve([]); }, totalCount() { return -1; }, isSelectableItem() { return true; }, isItemSelected() { return false; }, getItemData(item) { return item; }, - dataFields: noop, - filter: noop, + dataFields() { return undefined; }, + filter() { return undefined; }, }; + return defaultOptions; } - validate() { + validate(): void { this._selectionStrategy.validate(); } - getSelectedItemKeys() { - return this._selectionStrategy.getSelectedItemKeys(); + getSelectedItemKeys(): TDeferred extends true ? Promise : TKey[] { + return this._selectionStrategy.getSelectedItemKeys() as TDeferred extends true + ? Promise + : TKey[]; + } + + _isStandardStrategy( + strategy: StandardStrategy | DeferredStrategy, + ): strategy is StandardStrategy { + return this.options.deferred; } - getSelectedItems() { - return this._selectionStrategy.getSelectedItems(); + getSelectedItems(): TDeferred extends true ? Promise : TItem[] { + return this._selectionStrategy.getSelectedItems() as TDeferred extends true + ? Promise + : TItem[]; } - selectionFilter(value?: any) { + selectionFilter(value?: SelectionFilter): SelectionFilter | undefined { if (value === undefined) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return return this.options.selectionFilter; } - const filterIsChanged = this.options.selectionFilter !== value && JSON.stringify(this.options.selectionFilter) !== JSON.stringify(value); + const filterIsChanged = this.options.selectionFilter !== value + && JSON.stringify(this.options.selectionFilter) !== JSON.stringify(value); this.options.selectionFilter = value; - filterIsChanged && this.onSelectionChanged(); + if (filterIsChanged) { + this.onSelectionChanged(); + } + + return undefined; } - setSelection(keys, updatedKeys?) { + setSelection(keys: TKey[], updatedKeys?: TKey[]): DeferredObj { return this.selectedItemKeys(keys, false, false, false, updatedKeys); } - select(keys) { + select(keys: TKey[]): DeferredObj { return this.selectedItemKeys(keys, true); } - deselect(keys) { + deselect(keys: TKey[]): DeferredObj { return this.selectedItemKeys(keys, true, true); } selectedItemKeys( - keys, + keys: TKey[], preserve?: boolean, isDeselect?: boolean, isSelectAll?: boolean, - updatedKeys?: any[], - ) { - const that = this; - - keys = keys ?? []; - keys = Array.isArray(keys) ? keys : [keys]; - that.validate(); - - return this._selectionStrategy.selectedItemKeys(keys, preserve, isDeselect, isSelectAll, updatedKeys); + updatedKeys?: TKey[], + ): DeferredObj { + let normalizedKeys = keys ?? []; + normalizedKeys = Array.isArray(normalizedKeys) ? normalizedKeys : [normalizedKeys]; + + this.validate(); + + return this._selectionStrategy.selectedItemKeys( + normalizedKeys, + preserve, + isDeselect, + isSelectAll, + updatedKeys, + ); } - clearSelection() { + clearSelection(): DeferredObj { return this.selectedItemKeys([]); } - _addSelectedItem(itemData, key) { + _addSelectedItem(itemData: TItem, key: TKey): void { + // @ts-expect-error addSelectedItem this._selectionStrategy.addSelectedItem(key, itemData); } - _removeSelectedItem(key) { + _removeSelectedItem(key: TKey): void { this._selectionStrategy.removeSelectedItem(key); } - _setSelectedItems(keys, items) { + _setSelectedItems(keys: TKey[], items: TItem[]): void { this._selectionStrategy.setSelectedItems(keys, items); } - onSelectionChanged() { + onSelectionChanged(): void { this._selectionStrategy.onSelectionChanged(); } - // @ts-expect-error - changeItemSelection(itemIndex, keys, setFocusOnly) { - let isSelectedItemsChanged; + changeItemSelection( + itemIndex: number, + keys: { control?: boolean; shift?: boolean } = {}, + setFocusOnly?: boolean, + ): boolean | undefined { + let isSelectedItemsChanged = false; const items = this.options.plainItems(); const item = items[itemIndex]; - let deferred; + let focusedItemIndex = itemIndex; + // eslint-disable-next-line @typescript-eslint/init-declarations + let deferred: Promise | undefined; const { isVirtualPaging } = this.options; const allowLoadByRange = this.options.allowLoadByRange?.(); const { alwaysSelectByShift } = this.options; - let indexOffset; + // eslint-disable-next-line @typescript-eslint/init-declarations + let indexOffset: number | undefined; let focusedItemNotInLoadedRange = false; let shiftFocusedItemNotInLoadedRange = false; - const itemIsNotInLoadedRange = (index) => index >= 0 && !items.filter((it) => it.loadIndex === index).length; + const itemIsNotInLoadedRange = (index: number): boolean => index >= 0 && !items.filter( + (it) => it.loadIndex === index, + ).length; if (isVirtualPaging && isDefined(item)) { if (allowLoadByRange) { - indexOffset = item.loadIndex - itemIndex; - itemIndex = item.loadIndex; + indexOffset = item.loadIndex - focusedItemIndex; + focusedItemIndex = item.loadIndex; } focusedItemNotInLoadedRange = itemIsNotInLoadedRange(this._focusedItemIndex); if (isDefined(this._shiftFocusedItemIndex)) { @@ -160,22 +204,27 @@ export default class Selection { const itemData = this.options.getItemData(item); const itemKey = this.options.keyOf(itemData); - keys = keys || {}; let allowSelectByShift = keys.shift; if (alwaysSelectByShift === false && allowSelectByShift) { - allowSelectByShift = allowLoadByRange !== false || (!focusedItemNotInLoadedRange && !shiftFocusedItemNotInLoadedRange); + allowSelectByShift = allowLoadByRange !== false + || (!focusedItemNotInLoadedRange && !shiftFocusedItemNotInLoadedRange); } if (allowSelectByShift && this.options.mode === 'multiple' && this._focusedItemIndex >= 0) { if (allowLoadByRange && (focusedItemNotInLoadedRange || shiftFocusedItemNotInLoadedRange)) { - isSelectedItemsChanged = itemIndex !== this._shiftFocusedItemIndex || this._focusedItemIndex !== this._shiftFocusedItemIndex; + isSelectedItemsChanged = focusedItemIndex !== this._shiftFocusedItemIndex + || this._focusedItemIndex !== this._shiftFocusedItemIndex; if (isSelectedItemsChanged) { - deferred = this.changeItemSelectionWhenShiftKeyInVirtualPaging(itemIndex); + deferred = this.changeItemSelectionWhenShiftKeyInVirtualPaging(focusedItemIndex); } } else { - isSelectedItemsChanged = this.changeItemSelectionWhenShiftKeyPressed(itemIndex, items, indexOffset); + isSelectedItemsChanged = this.changeItemSelectionWhenShiftKeyPressed( + focusedItemIndex, + items, + indexOffset, + ); } } else if (keys.control) { this._resetItemSelectionWhenShiftKeyPressed(); @@ -193,7 +242,10 @@ export default class Selection { isSelectedItemsChanged = true; } else { this._resetItemSelectionWhenShiftKeyPressed(); - const isKeysEqual = this._selectionStrategy.equalKeys(this.options.selectedItemKeys[0], itemKey); + const isKeysEqual = this._selectionStrategy.equalKeys( + this.options.selectedItemKeys[0], + itemKey, + ); if (this.options.selectedItemKeys.length !== 1 || !isKeysEqual) { this._setSelectedItems([itemKey], [itemData]); isSelectedItemsChanged = true; @@ -202,45 +254,53 @@ export default class Selection { if (isSelectedItemsChanged) { when(deferred).done(() => { - this._focusedItemIndex = itemIndex; - !setFocusOnly && this.onSelectionChanged(); + this._focusedItemIndex = focusedItemIndex; + if (!setFocusOnly) { + this.onSelectionChanged(); + } }); return true; } + + return undefined; } - isDataItem(item) { + isDataItem(item: TItem): boolean { return this.options.isSelectableItem(item); } - isSelectable() { + isSelectable(): boolean { return this.options.mode === 'single' || this.options.mode === 'multiple'; } - isItemDataSelected(data) { + isItemDataSelected(data: TItem): boolean { return this._selectionStrategy.isItemDataSelected(data, { checkPending: true }); } - isItemSelected(arg, options?: any): boolean { + isItemSelected(arg: TKey, options: PendingOptions = {}): boolean { return this._selectionStrategy.isItemKeySelected(arg, options); } - _resetItemSelectionWhenShiftKeyPressed() { - // @ts-expect-error + _resetItemSelectionWhenShiftKeyPressed(): void { delete this._shiftFocusedItemIndex; } - _resetFocusedItemIndex() { + _resetFocusedItemIndex(): void { this._focusedItemIndex = -1; } - changeItemSelectionWhenShiftKeyInVirtualPaging(loadIndex) { - const loadOptions = this.options.getLoadOptions(loadIndex, this._focusedItemIndex, this._shiftFocusedItemIndex); + changeItemSelectionWhenShiftKeyInVirtualPaging(loadIndex: number): Promise { + const loadOptions = this.options.getLoadOptions?.( + loadIndex, + this._focusedItemIndex, + this._shiftFocusedItemIndex, + ) ?? {}; const deferred = Deferred(); const indexOffset = loadOptions.skip; this.options.load(loadOptions).done((items) => { - this.changeItemSelectionWhenShiftKeyPressed(loadIndex, items, indexOffset); + const filteredItems = !Array.isArray(items) && isPlainObject(items) ? items.data : items; + this.changeItemSelectionWhenShiftKeyPressed(loadIndex, filteredItems, indexOffset); deferred.resolve(); }); @@ -248,9 +308,12 @@ export default class Selection { return deferred.promise(); } - changeItemSelectionWhenShiftKeyPressed(itemIndex, items, indexOffset) { + changeItemSelectionWhenShiftKeyPressed( + itemIndex: number, + items: TItem[], + indexOffset?: number, + ): boolean { let isSelectedItemsChanged = false; - let itemIndexStep; const indexOffsetDefined = isDefined(indexOffset); let index = indexOffsetDefined ? this._focusedItemIndex - indexOffset : this._focusedItemIndex; const { keyOf } = this.options; @@ -263,15 +326,20 @@ export default class Selection { this._shiftFocusedItemIndex = this._focusedItemIndex; } - let data; - let itemKey; - let startIndex; - let endIndex; + let itemIndexStep = 0; + // eslint-disable-next-line @typescript-eslint/init-declarations + let itemKey: TKey; + let startIndex = 0; + let endIndex = 0; if (this._shiftFocusedItemIndex !== this._focusedItemIndex) { itemIndexStep = this._focusedItemIndex < this._shiftFocusedItemIndex ? 1 : -1; - startIndex = indexOffsetDefined ? this._focusedItemIndex - indexOffset : this._focusedItemIndex; - endIndex = indexOffsetDefined ? this._shiftFocusedItemIndex - indexOffset : this._shiftFocusedItemIndex; + startIndex = indexOffsetDefined + ? this._focusedItemIndex - indexOffset + : this._focusedItemIndex; + endIndex = indexOffsetDefined + ? this._shiftFocusedItemIndex - indexOffset + : this._shiftFocusedItemIndex; for (index = startIndex; index !== endIndex; index += itemIndexStep) { if (indexOffsetDefined || this.isDataItem(items[index])) { itemKey = keyOf(this.options.getItemData(items[index])); @@ -289,7 +357,7 @@ export default class Selection { : this._shiftFocusedItemIndex; for (index = startIndex; index !== endIndex; index += itemIndexStep) { if (indexOffsetDefined || this.isDataItem(items[index])) { - data = this.options.getItemData(items[index]); + const data = this.options.getItemData(items[index]); itemKey = keyOf(data); this._addSelectedItem(data, itemKey); @@ -306,11 +374,11 @@ export default class Selection { return isSelectedItemsChanged; } - clearSelectedItems() { + clearSelectedItems(): void { this._setSelectedItems([], []); } - selectAll(isOnePage) { + selectAll(isOnePage: boolean): DeferredObj { this._resetFocusedItemIndex(); if (isOnePage) { @@ -319,7 +387,7 @@ export default class Selection { return this.selectedItemKeys([], true, false, true); } - deselectAll(isOnePage) { + deselectAll(isOnePage: boolean): DeferredObj { this._resetFocusedItemIndex(); if (isOnePage) { @@ -328,11 +396,11 @@ export default class Selection { return this.selectedItemKeys([], true, true, true); } - getSelectAllState(visibleOnly) { + getSelectAllState(visibleOnly: boolean): boolean | undefined { return this._selectionStrategy.getSelectAllState(visibleOnly); } - loadSelectedItemsWithFilter() { + loadSelectedItemsWithFilter(): DeferredObj { return this._selectionStrategy.loadSelectedItemsWithFilter(); } } diff --git a/packages/devextreme/js/__internal/ui/selection/types.ts b/packages/devextreme/js/__internal/ui/selection/types.ts new file mode 100644 index 000000000000..b597238a19b5 --- /dev/null +++ b/packages/devextreme/js/__internal/ui/selection/types.ts @@ -0,0 +1,153 @@ +import type { LoadResult } from '@js/common/data'; +import type { FilterDescriptor, LoadOptions, SelectDescriptor } from '@js/common/data.types'; +import type { DeferredObj } from '@js/core/utils/deferred'; +import type { Cancelable } from '@js/events'; +import type DeferredStrategy from '@ts/ui/selection/m_selection.strategy.deferred'; +import type StandardStrategy from '@ts/ui/selection/m_selection.strategy.standard'; + +export type SelectionFilter = FilterDescriptor[]; + +type Filter = () => SelectionFilter | undefined; +export interface SelectionItem { + disabled?: boolean; + loadIndex: number; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type Sensitivity = 'case' | 'base' | 'variant' | any; + +export type KeyExpr = string | string[]; +export type KeyHash = string | number | symbol; + +interface SelectionChangeEvent { + selectedItems: TItem[]; + selectedItemKeys: TKey[]; + addedItemKeys: TKey[]; + removedItemKeys: TKey[]; + addedItems: TItem[]; + removedItems: TItem[]; +} + +export interface PendingOptions { checkPending?: boolean } + +export interface DefaultOptions< + // eslint-disable-next-line @typescript-eslint/no-explicit-any + TItem extends SelectionItem = any, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + TKey = any, + TDeferred extends boolean = boolean, +> { + onSelectionChanged: (event: SelectionChangeEvent) => void; + key: () => KeyExpr | ((source: TItem) => TKey) | undefined; + keyOf: (item: TItem) => TKey; + load: (loadOptions: LoadOptions) => DeferredObj>; + totalCount: () => number; + isSelectableItem: (item: TItem) => boolean; + isItemSelected: (arg: TItem | TKey, options?: PendingOptions) => boolean; + getItemData: (item: TItem) => TItem; + dataFields: () => SelectDescriptor | undefined; + filter: Filter; + allowNullValue: boolean; + deferred: TDeferred; + equalByReference: boolean; + mode: string; + selectedItems: TItem[]; + selectionFilter: SelectionFilter; + maxFilterLengthInRequest: number; +} + +export type SelectionOptions< + // eslint-disable-next-line @typescript-eslint/no-explicit-any + TItem extends SelectionItem = any, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + TKey = any, + TDeferred extends boolean = boolean, +> = DefaultOptions & { + selectedKeys: TKey[]; + selectedItemKeys: TKey[]; + plainItems: (cached?: boolean) => TItem[]; + isVirtualPaging?: boolean; + sensitivity?: Sensitivity; + allowLoadByRange?: () => boolean | undefined; + alwaysSelectByShift?: boolean; + getLoadOptions?: ( + loadItemIndex: number, + focusedItemIndex: number, + shiftItemIndex?: number + ) => LoadOptions; + addedItemKeys: TKey[]; + removedItemKeys: TKey[]; + addedItems: TItem[]; + removedItems: TItem[]; + onSelectionChanging: (event: SelectionChangeEvent & Cancelable) => void; + keyHashIndices: { + [keyHash: KeyHash]: number[]; + }; + ignoreDisabledItems?: boolean; + disabledItemKeys: TKey[]; +}; + +interface SelectionStrategyOptions< + // eslint-disable-next-line @typescript-eslint/no-explicit-any + TItem extends SelectionItem = any, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + TKey = any, +> { + disabledItemKeys: TKey[]; + addedItemKeys: TKey[]; + removedItemKeys: TKey[]; + addedItems: TItem[]; + removedItems: TItem[]; + onSelectionChanging?: (event: SelectionChangeEvent & Cancelable) => void; + keyHashIndices: { + [keyHash: KeyHash]: number[]; + } | null; +} + +export type StrategyOptions< + // eslint-disable-next-line @typescript-eslint/no-explicit-any + TItem extends SelectionItem = any, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + TKey = any, + TDeferred extends boolean = boolean, +> = SelectionStrategyOptions & SelectionOptions; + +export type SelectionStrategy< + // eslint-disable-next-line @typescript-eslint/no-explicit-any + TItem extends SelectionItem = any, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + TKey extends string | number = any, + TDeferred extends boolean = boolean, +> = TDeferred extends true + ? DeferredStrategy + : StandardStrategy; + +export type ClearedFilterItem = object; + +export type RemoteFilterItem = { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + template: any; +} & ClearedFilterItem; + +export type RemoteFilter = SelectionFilter | RemoteFilterItem | RemoteFilterItem[]; + +export interface QueryParams { + langParams: { + collatorOptions: { + sensitivity: Sensitivity; + }; + }; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export interface RequestItems { + added: (TItem | TKey)[]; + removed: (TItem | TKey)[]; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export interface RequestData { + addedItems: (TItem | TKey)[]; + removedItems: (TItem | TKey)[]; + keys: TKey[]; +} From 3905f31bc1e7ee7f96d27a8c1bb0b267e2a66588 Mon Sep 17 00:00:00 2001 From: EugeniyKiyashko Date: Mon, 25 Aug 2025 16:31:52 +0400 Subject: [PATCH 050/101] Datasource cannot be obtained via destructuring due to the KO integrration (#30872) --- .../js/__internal/ui/drop_down_editor/m_drop_down_list.ts | 3 ++- packages/devextreme/js/__internal/ui/list/list.base.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/devextreme/js/__internal/ui/drop_down_editor/m_drop_down_list.ts b/packages/devextreme/js/__internal/ui/drop_down_editor/m_drop_down_list.ts index 10fff4a9a5ee..29986d3fdb47 100644 --- a/packages/devextreme/js/__internal/ui/drop_down_editor/m_drop_down_list.ts +++ b/packages/devextreme/js/__internal/ui/drop_down_editor/m_drop_down_list.ts @@ -658,7 +658,8 @@ class DropDownList< | DataSourceOptions> | null | undefined { - const { dataSource, grouped } = this.option(); + const { grouped } = this.option(); + const dataSource = this.option('dataSource'); if (dataSource && grouped) { return getDataSourceOptions(dataSource); diff --git a/packages/devextreme/js/__internal/ui/list/list.base.ts b/packages/devextreme/js/__internal/ui/list/list.base.ts index c3a1ca7f6b45..52db7d481e58 100644 --- a/packages/devextreme/js/__internal/ui/list/list.base.ts +++ b/packages/devextreme/js/__internal/ui/list/list.base.ts @@ -550,7 +550,8 @@ export class ListBase extends CollectionWidget { | DataSourceOptions> | null | undefined { - const { dataSource, grouped } = this.option(); + const { grouped } = this.option(); + const dataSource = this.option('dataSource'); if (dataSource && grouped) { return getDataSourceOptions(dataSource); From a458c2508f9508fd55fe2d87b2b9a60cc53f04c1 Mon Sep 17 00:00:00 2001 From: Andrei Kharitonov Date: Mon, 25 Aug 2025 16:04:02 +0200 Subject: [PATCH 051/101] AIIntegration: add SmartPaste command (#30811) --- .../core/ai_integration/commands/index.ts | 2 + .../commands/smartPaste.test.ts | 144 ++++++++++++++++++ .../ai_integration/commands/smartPaste.ts | 50 ++++++ .../ai_integration/core/ai_integration.ts | 22 ++- .../ai_integration/core/prompt_manager.ts | 3 +- .../core/ai_integration/templates/index.ts | 4 + .../devextreme/js/common/ai-integration.d.ts | 29 ++++ packages/devextreme/ts/dx.all.d.ts | 26 ++++ 8 files changed, 277 insertions(+), 3 deletions(-) create mode 100644 packages/devextreme/js/__internal/core/ai_integration/commands/smartPaste.test.ts create mode 100644 packages/devextreme/js/__internal/core/ai_integration/commands/smartPaste.ts diff --git a/packages/devextreme/js/__internal/core/ai_integration/commands/index.ts b/packages/devextreme/js/__internal/core/ai_integration/commands/index.ts index fa3957884050..804f7ce5311f 100644 --- a/packages/devextreme/js/__internal/core/ai_integration/commands/index.ts +++ b/packages/devextreme/js/__internal/core/ai_integration/commands/index.ts @@ -5,6 +5,7 @@ import { ExecuteCommand } from '@ts/core/ai_integration/commands/execute'; import { ExpandCommand } from '@ts/core/ai_integration/commands/expand'; import { ProofreadCommand } from '@ts/core/ai_integration/commands/proofread'; import { ShortenCommand } from '@ts/core/ai_integration/commands/shorten'; +import { SmartPasteCommand } from '@ts/core/ai_integration/commands/smartPaste'; import { SummarizeCommand } from '@ts/core/ai_integration/commands/summarize'; import { TranslateCommand } from '@ts/core/ai_integration/commands/translate'; @@ -16,6 +17,7 @@ export { ExpandCommand, ProofreadCommand, ShortenCommand, + SmartPasteCommand, SummarizeCommand, TranslateCommand, }; diff --git a/packages/devextreme/js/__internal/core/ai_integration/commands/smartPaste.test.ts b/packages/devextreme/js/__internal/core/ai_integration/commands/smartPaste.test.ts new file mode 100644 index 000000000000..53ba730dfee2 --- /dev/null +++ b/packages/devextreme/js/__internal/core/ai_integration/commands/smartPaste.test.ts @@ -0,0 +1,144 @@ +import { + beforeEach, + describe, + expect, + it, + jest, +} from '@jest/globals'; +import type { + AIProvider, + RequestCallbacks, + SmartPasteCommandParams, + SmartPasteCommandResult, +} from '@js/common/ai-integration'; +import { SmartPasteCommand } from '@ts/core/ai_integration/commands/smartPaste'; +import type { PromptData } from '@ts/core/ai_integration/core/prompt_manager'; +import { PromptManager } from '@ts/core/ai_integration/core/prompt_manager'; +import { RequestManager } from '@ts/core/ai_integration/core/request_manager'; +import { templates } from '@ts/core/ai_integration/templates'; +import { Provider } from '@ts/core/ai_integration/test_utils/provider_mock'; + +const COMMAND_NAME = 'smartPaste'; +const USER_TEXT = 'text to paste'; +const USER_FIELDS = [{ name: 'description', format: 'text' }]; +const USER_FIELDS_WITH_INSTRUCTION = [{ name: 'description', format: 'text', instruction: 'instruction' }]; +const PROCESSED_USER_FIELDS = 'fieldName: description, format: text'; +const PROCESSED_USER_FIELDS_WITH_INSTRUCTION = 'fieldName: description, format: text, instruction: instruction'; + +describe('SmartPasteCommand', () => { + const params: SmartPasteCommandParams = { text: USER_TEXT, fields: USER_FIELDS }; + const paramsWithInstruction: SmartPasteCommandParams = { + text: USER_TEXT, + fields: USER_FIELDS_WITH_INSTRUCTION, + }; + let promptManager = null as unknown as PromptManager; + let requestManager = null as unknown as RequestManager; + let command = null as unknown as SmartPasteCommand; + + beforeEach(() => { + const provider: AIProvider = new Provider(); + + requestManager = new RequestManager(provider); + promptManager = new PromptManager(); + + command = new SmartPasteCommand(promptManager, requestManager); + }); + + describe('getTemplateName', () => { + it('should return the name of the corresponding template', () => { + // @ts-expect-error Access to protected property for a test + const templateName = command.getTemplateName(); + + expect(templateName).toStrictEqual(COMMAND_NAME); + }); + }); + + describe('buildPromptData', () => { + it('should form PromptData with text and fields info', () => { + // @ts-expect-error Access to protected property for a test + const promptData: PromptData = command.buildPromptData(params); + + expect(promptData).toStrictEqual({ + user: { text: USER_TEXT, fields: PROCESSED_USER_FIELDS }, + }); + }); + + it('should form PromptData with text and fields info including instruction', () => { + // @ts-expect-error Access to protected property for a test + const promptData: PromptData = command.buildPromptData(paramsWithInstruction); + + expect(promptData).toStrictEqual({ + user: { text: USER_TEXT, fields: PROCESSED_USER_FIELDS_WITH_INSTRUCTION }, + }); + }); + }); + + describe('parseResult', () => { + it('should return the parsed result', () => { + const response = 'Field1:::value1;;;Field2:::value2'; + // @ts-expect-error Access to protected property for a test + const result = command.parseResult(response); + + const expectedResult = [{ + name: 'Field1', + value: 'value1', + }, { + name: 'Field2', + value: 'value2', + }]; + + expect(result).toStrictEqual(expectedResult); + }); + + it('should not include an empty fields into parsed result', () => { + const response = 'Field1:::value1;;;Field2:::'; + // @ts-expect-error Access to protected property for a test + const result = command.parseResult(response); + + const expectedResult = [{ + name: 'Field1', + value: 'value1', + }]; + + expect(result).toStrictEqual(expectedResult); + }); + }); + + describe('execute', () => { + const callbacks: RequestCallbacks = { onComplete: () => {} }; + + it('promptManager.buildPrompt should be called with parameters containing the passed values', () => { + const buildPromptSpy = jest.spyOn(promptManager, 'buildPrompt'); + + command.execute(params, callbacks); + + expect(buildPromptSpy).toHaveBeenCalledTimes(1); + expect(promptManager.buildPrompt).toHaveBeenCalledWith(COMMAND_NAME, { + user: { text: USER_TEXT, fields: PROCESSED_USER_FIELDS }, + }); + }); + + it('promptManager.buildPrompt should should return prompt with passed values', () => { + jest.spyOn(promptManager, 'buildPrompt'); + + command.execute(params, callbacks); + + const expectedUserPrompt = templates.smartPaste.user?.replace('{{text}}', USER_TEXT) + .replace('{{fields}}', PROCESSED_USER_FIELDS); + + expect(promptManager.buildPrompt).toHaveReturnedWith({ + system: templates.smartPaste.system, + user: expectedUserPrompt, + }); + }); + + it('should call provider.sendRequest once and return the abort function', () => { + const sendRequestSpy = jest.spyOn(requestManager, 'sendRequest'); + + const abort = command.execute(params, callbacks); + + expect(typeof abort).toBe('function'); + expect(sendRequestSpy).toHaveBeenCalledTimes(1); + }); + }); +}); diff --git a/packages/devextreme/js/__internal/core/ai_integration/commands/smartPaste.ts b/packages/devextreme/js/__internal/core/ai_integration/commands/smartPaste.ts new file mode 100644 index 000000000000..ab2e909681d5 --- /dev/null +++ b/packages/devextreme/js/__internal/core/ai_integration/commands/smartPaste.ts @@ -0,0 +1,50 @@ +import type { FieldInfo, SmartPasteCommandParams, SmartPasteCommandResult } from '@js/common/ai-integration'; +import { BaseCommand } from '@ts/core/ai_integration/commands/base'; +import type { PromptData, PromptTemplateName } from '@ts/core/ai_integration/core/prompt_manager'; + +export class SmartPasteCommand extends BaseCommand< + SmartPasteCommandParams, + SmartPasteCommandResult +> { + protected getTemplateName(): PromptTemplateName { + return 'smartPaste'; + } + + protected buildPromptData(params: SmartPasteCommandParams): PromptData { + const fieldsInstructions = this.generateFieldsInstructions(params.fields); + return { + user: { + text: params.text, + fields: fieldsInstructions, + }, + }; + } + + protected parseResult(response: string): SmartPasteCommandResult { + const result: SmartPasteCommandResult = []; + + response.split(';;;').forEach((data: string) => { + const [name, ...values] = data.split(':::'); + const value = values.length === 1 ? values[0] : values; + + if (value) { + result.push({ + name, + value, + }); + } + }); + + return result; + } + + private generateFieldsInstructions(fields: FieldInfo[]): string { + const fieldData = fields.map((field) => { + const instruction = field.instruction ?? ''; + + return `fieldName: ${field.name}, format: ${field.format}${instruction ? `, instruction: ${instruction}` : ''}`; + }); + + return fieldData.join(';;;'); + } +} diff --git a/packages/devextreme/js/__internal/core/ai_integration/core/ai_integration.ts b/packages/devextreme/js/__internal/core/ai_integration/core/ai_integration.ts index ae7f078565fd..b273064f211b 100644 --- a/packages/devextreme/js/__internal/core/ai_integration/core/ai_integration.ts +++ b/packages/devextreme/js/__internal/core/ai_integration/core/ai_integration.ts @@ -14,6 +14,8 @@ import type { RequestCallbacks, ShortenCommandParams, ShortenCommandResult, + SmartPasteCommandParams, + SmartPasteCommandResult, SummarizeCommandParams, SummarizeCommandResult, TranslateCommandParams, @@ -27,6 +29,7 @@ import { ExpandCommand, ProofreadCommand, ShortenCommand, + SmartPasteCommand, SummarizeCommand, TranslateCommand, } from '@ts/core/ai_integration/commands/index'; @@ -42,6 +45,7 @@ export const enum CommandNames { Shorten = 'shorten', Summarize = 'summarize', Translate = 'translate', + SmartPaste = 'smartPaste', } export const COMMANDS = { @@ -53,6 +57,7 @@ export const COMMANDS = { [CommandNames.Shorten]: ShortenCommand, [CommandNames.Summarize]: SummarizeCommand, [CommandNames.Translate]: TranslateCommand, + [CommandNames.SmartPaste]: SmartPasteCommand, } as const; export interface CommandDefinition { @@ -70,6 +75,7 @@ export interface Commands { [CommandNames.Shorten]: CommandDefinition; [CommandNames.Summarize]: CommandDefinition; [CommandNames.Translate]: CommandDefinition; + [CommandNames.SmartPaste]: CommandDefinition; } export class AIIntegration implements IAIIntegration { @@ -91,8 +97,9 @@ export class AIIntegration implements IAIIntegration { callbacks: RequestCallbacks, ): () => void { type Command = BaseCommand; + type CommandInstance = Commands[K]['command']; - let command = this.commands.get(commandName) as Command | undefined; + let command = this.commands.get(commandName) as CommandInstance | undefined; if (!command) { const Command = COMMANDS[commandName]; @@ -102,7 +109,7 @@ export class AIIntegration implements IAIIntegration { this.commands.set(commandName, command); } - return command.execute(params, callbacks); + return (command as Command).execute(params, callbacks); } public changeStyle( @@ -192,4 +199,15 @@ export class AIIntegration implements IAIIntegration { callbacks, ); } + + public smartPaste( + params: SmartPasteCommandParams, + callbacks: RequestCallbacks, + ): () => void { + return this.executeCommand( + CommandNames.SmartPaste, + params, + callbacks, + ); + } } diff --git a/packages/devextreme/js/__internal/core/ai_integration/core/prompt_manager.ts b/packages/devextreme/js/__internal/core/ai_integration/core/prompt_manager.ts index 6f72a3100095..c4d05f2a3021 100644 --- a/packages/devextreme/js/__internal/core/ai_integration/core/prompt_manager.ts +++ b/packages/devextreme/js/__internal/core/ai_integration/core/prompt_manager.ts @@ -19,7 +19,8 @@ export type PromptTemplateName = | 'proofread' | 'shorten' | 'summarize' - | 'translate'; + | 'translate' + | 'smartPaste'; export type PromptTemplates = Map; diff --git a/packages/devextreme/js/__internal/core/ai_integration/templates/index.ts b/packages/devextreme/js/__internal/core/ai_integration/templates/index.ts index 1c1fa83e6ee6..3f4bedcb5858 100644 --- a/packages/devextreme/js/__internal/core/ai_integration/templates/index.ts +++ b/packages/devextreme/js/__internal/core/ai_integration/templates/index.ts @@ -27,4 +27,8 @@ export const templates: PromptTemplates = { translate: { system: 'Translate the text provided into {{lang}}. Ensure the translation retains the original meaning and tone. Provide only the translated text in your response, without any additional formatting or commentary.', }, + smartPaste: { + system: 'You are a helpful assistant that helps to fill fields based on the text provided. You will get a text and a list of fields that should be filled using info from the text. It can include the name of field, suitable format, optionally some additional instruction about what it should include. You need to return data for all the fields in the following format: {fieldName}:::{fieldValue};;;{fieldName}:::{fieldValue} and so on, where {fieldName} - is a variable for a field name and {fieldValue} - is a variable for a string to fill. If there is no info to fill, field value should be empty (like Name:::;;;).', + user: 'Text: {{text}}. Fields: {{fields}}.', + }, }; diff --git a/packages/devextreme/js/common/ai-integration.d.ts b/packages/devextreme/js/common/ai-integration.d.ts index 879307f32314..0de13e4cf21e 100644 --- a/packages/devextreme/js/common/ai-integration.d.ts +++ b/packages/devextreme/js/common/ai-integration.d.ts @@ -106,6 +106,23 @@ export type TranslateCommandParams = { lang: string; }; +/** + * @namespace DevExpress.aiIntegration + */ +export type FieldInfo = { + name: string; + format: string; + instruction?: string; +}; + +/** + * @namespace DevExpress.aiIntegration + */ +export type SmartPasteCommandParams = { + text: string; + fields: FieldInfo[]; +}; + /** * @namespace DevExpress.aiIntegration */ @@ -146,6 +163,14 @@ export type SummarizeCommandResult = string; */ export type TranslateCommandResult = string; +/** + * @namespace DevExpress.aiIntegration + */ +export type SmartPasteCommandResult = Array<{ + name: string; + value: string | string[]; +}>; + /** * @namespace DevExpress.aiIntegration */ @@ -211,4 +236,8 @@ export class AIIntegration { * @publicName translate(params, callbacks) */ translate(params: TranslateCommandParams, callbacks: RequestCallbacks): () => void; + /** + * @publicName smartPaste(params, callbacks) + */ + smartPaste(params: SmartPasteCommandParams, callbacks: RequestCallbacks): () => void; } diff --git a/packages/devextreme/ts/dx.all.d.ts b/packages/devextreme/ts/dx.all.d.ts index fce8aec7deed..1e33b9e33a83 100644 --- a/packages/devextreme/ts/dx.all.d.ts +++ b/packages/devextreme/ts/dx.all.d.ts @@ -908,6 +908,10 @@ declare module DevExpress.aiIntegration { params: TranslateCommandParams, callbacks: RequestCallbacks ): () => void; + smartPaste( + params: SmartPasteCommandParams, + callbacks: RequestCallbacks + ): () => void; } /** * [descr:AIProvider] @@ -960,6 +964,14 @@ declare module DevExpress.aiIntegration { * @deprecated Attention! This type is for internal purposes only. If you used it previously, please submit a ticket to our {@link https://supportcenter.devexpress.com/ticket/create Support Center}. We will check if there is an alternative solution. */ export type ExpandCommandResult = string; + /** + * @deprecated Attention! This type is for internal purposes only. If you used it previously, please submit a ticket to our {@link https://supportcenter.devexpress.com/ticket/create Support Center}. We will check if there is an alternative solution. + */ + export type FieldInfo = { + name: string; + format: string; + instruction?: string; + }; /** * [descr:Prompt] */ @@ -1023,6 +1035,20 @@ declare module DevExpress.aiIntegration { * @deprecated Attention! This type is for internal purposes only. If you used it previously, please submit a ticket to our {@link https://supportcenter.devexpress.com/ticket/create Support Center}. We will check if there is an alternative solution. */ export type ShortenCommandResult = string; + /** + * @deprecated Attention! This type is for internal purposes only. If you used it previously, please submit a ticket to our {@link https://supportcenter.devexpress.com/ticket/create Support Center}. We will check if there is an alternative solution. + */ + export type SmartPasteCommandParams = { + text: string; + fields: FieldInfo[]; + }; + /** + * @deprecated Attention! This type is for internal purposes only. If you used it previously, please submit a ticket to our {@link https://supportcenter.devexpress.com/ticket/create Support Center}. We will check if there is an alternative solution. + */ + export type SmartPasteCommandResult = Array<{ + name: string; + value: string | string[]; + }>; /** * @deprecated Attention! This type is for internal purposes only. If you used it previously, please submit a ticket to our {@link https://supportcenter.devexpress.com/ticket/create Support Center}. We will check if there is an alternative solution. */ From 7688142002e9c54c964c3234e5ed8856663f906b Mon Sep 17 00:00:00 2001 From: Mikhail Preyskurantov <5574159+mpreyskurantov@users.noreply.github.com> Date: Mon, 25 Aug 2025 17:26:24 +0300 Subject: [PATCH 052/101] Bump devextreme-internal-tools to 18.0.0 (#30871) Co-authored-by: ilyakhd <14272298+IlyaKhD@users.noreply.github.com> --- packages/devextreme-metadata/common/index.ts | 11 +- .../make-aspnet-metadata.ts | 6 +- packages/devextreme/ts/dx.all.d.ts | 8 +- pnpm-lock.yaml | 686 ++++++++++-------- pnpm-workspace.yaml | 2 +- 5 files changed, 379 insertions(+), 334 deletions(-) diff --git a/packages/devextreme-metadata/common/index.ts b/packages/devextreme-metadata/common/index.ts index 5f9530df137f..e41c76260a75 100644 --- a/packages/devextreme-metadata/common/index.ts +++ b/packages/devextreme-metadata/common/index.ts @@ -1,8 +1,7 @@ import { AddMutation, - ArrayDataType, DataType, - MemberRefDataType, + DataTypes, Mutation, RemoveMutation, } from 'devextreme-internal-tools/metadata'; @@ -37,13 +36,13 @@ export function replaceTypes({ uid, types }: { uid: string; types: DataType[] }) } export const types = { - array(...itemTypes: ArrayDataType['itemTypes']): ArrayDataType { + array(...itemTypes: DataTypes.Array['itemTypes']): DataTypes.Array { return { kind: 'array', itemTypes }; }, - memberRef(uid: string): MemberRefDataType { - return { kind: 'memberRef', uid }; + uidRef(uid: string): DataTypes.UidRef { + return { kind: 'uidRef', uid }; }, - object: { kind: 'object' } as any, + object: { kind: 'object' } as DataTypes.Object, }; diff --git a/packages/devextreme-metadata/make-aspnet-metadata.ts b/packages/devextreme-metadata/make-aspnet-metadata.ts index f6383d75b095..0c7c9ed00436 100644 --- a/packages/devextreme-metadata/make-aspnet-metadata.ts +++ b/packages/devextreme-metadata/make-aspnet-metadata.ts @@ -1,7 +1,7 @@ import { AspNet, Mutation } from 'devextreme-internal-tools/metadata'; import { addMember, cleanArtifacts, removeMembers, types } from './common'; import { commonSmdCollectionItems } from './common/smd'; -import { enums, enumAliases, enumItemRenamings } from './aspnet/enums' +import { enums, enumAliases, enumItemRenamings } from './aspnet/enums'; import { PATHS } from './common/paths'; cleanArtifacts('StrongMetaData.json', 'StrongMetaDataGenerator.cfg.json'); @@ -43,7 +43,7 @@ AspNet.makeMetadata({ }), addMember({ uid: 'ui/popover:dxPopoverOptions.toolbarItems', - types: [types.array(types.memberRef('ui/popover:ToolbarItem'))], + types: [types.array(types.uidRef('ui/popover:ToolbarItem'))], }), removeMembers(/ui\/scheduler:ToolbarItem\.options/), ], @@ -61,7 +61,7 @@ AspNet.makeMetadata({ collectionItems: [...commonSmdCollectionItems], enums, enumAliases, - enumItemRenamings + enumItemRenamings, }, }); diff --git a/packages/devextreme/ts/dx.all.d.ts b/packages/devextreme/ts/dx.all.d.ts index 1e33b9e33a83..fd636fb4b6e0 100644 --- a/packages/devextreme/ts/dx.all.d.ts +++ b/packages/devextreme/ts/dx.all.d.ts @@ -7362,11 +7362,9 @@ declare module DevExpress.data { /** * [descr:PivotGridDataSource.on(events)] */ - on( - events: { - [key in DevExpress.data.PivotGridDataSource.EventName]?: Function; - } - ): this; + on(events: { + [key in DevExpress.data.PivotGridDataSource.EventName]?: Function; + }): this; /** * [descr:PivotGridDataSource.reload()] */ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8281b402271c..feb09945db19 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -108,8 +108,8 @@ catalogs: specifier: 20.12.8 version: 20.12.8 devextreme-internal-tools: - specifier: 18.0.0-beta.15 - version: 18.0.0-beta.15 + specifier: 18.0.0 + version: 18.0.0 prettier: specifier: 3.5.3 version: 3.5.3 @@ -129,10 +129,10 @@ importers: version: 18.3.4(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15))) '@nx/jest': specifier: 19.4.2 - version: 19.4.2(@babel/traverse@7.27.1)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(node-notifier@9.0.1)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3))(typescript@5.8.3) + version: 19.4.2(@babel/traverse@7.27.1)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(node-notifier@9.0.1)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2))(typescript@5.9.2) '@nx/js': specifier: 19.4.2 - version: 19.4.2(@babel/traverse@7.27.1)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(typescript@5.8.3) + version: 19.4.2(@babel/traverse@7.27.1)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(typescript@5.9.2) '@types/jest': specifier: 29.5.12 version: 29.5.12 @@ -159,10 +159,10 @@ importers: version: 1.0.0-rc.10 codelyzer: specifier: 6.0.2 - version: 6.0.2(@angular/compiler@19.2.8)(@angular/core@19.2.8(rxjs@7.8.1)(zone.js@0.15.0))(tslint@6.1.3(typescript@5.8.3)) + version: 6.0.2(@angular/compiler@19.2.8)(@angular/core@19.2.8(rxjs@7.8.1)(zone.js@0.15.0))(tslint@6.1.3(typescript@5.9.2)) devextreme-internal-tools: specifier: catalog:tools - version: 18.0.0-beta.15 + version: 18.0.0 devextreme-metadata: specifier: workspace:* version: link:packages/devextreme-metadata @@ -174,7 +174,7 @@ importers: version: 8.0.3 jest: specifier: 29.7.0 - version: 29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + version: 29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) jspdf-autotable: specifier: 3.8.3 version: 3.8.3(jspdf@3.0.1) @@ -204,10 +204,10 @@ importers: version: 3.0.9 ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3) + version: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2) vue: specifier: 3.4.27 - version: 3.4.27(typescript@5.8.3) + version: 3.4.27(typescript@5.9.2) yargs: specifier: 17.7.2 version: 17.7.2 @@ -262,7 +262,7 @@ importers: devDependencies: '@angular-devkit/build-angular': specifier: 17.3.11 - version: 17.3.11(emisctridrw7uljolci7fxwmai) + version: 17.3.11(qwvpz4std2ihowmewzmfizrlqa) '@angular/cli': specifier: 17.3.11 version: 17.3.11(chokidar@3.6.0) @@ -292,7 +292,7 @@ importers: dependencies: '@angular-devkit/build-angular': specifier: 17.3.11 - version: 17.3.11(yhrafk4ev6k2dly5pdp4p2egia) + version: 17.3.11(zv4xp4uudkxcirbl56nxvgru2i) '@angular/cli': specifier: 17.3.11 version: 17.3.11(chokidar@3.6.0) @@ -397,7 +397,7 @@ importers: version: 0.25.0 esbuild-plugin-vue3: specifier: 0.3.2 - version: 0.3.2(cheerio@1.0.0-rc.10)(sass@1.71.1) + version: 0.3.2(cheerio@1.0.0-rc.10)(sass@1.85.0) eslint-plugin-react-hooks: specifier: 4.6.0 version: 4.6.0(eslint@8.56.0) @@ -720,7 +720,7 @@ importers: version: 3.3.4(webpack@5.94.0) ts-loader: specifier: 9.5.1 - version: 9.5.1(typescript@5.8.3)(webpack@5.94.0) + version: 9.5.1(typescript@5.9.2)(webpack@5.94.0) tsconfig-paths-webpack-plugin: specifier: 4.1.0 version: 4.1.0 @@ -893,7 +893,7 @@ importers: version: 1.2.8 parcel: specifier: 2.12.0 - version: 2.12.0(@swc/helpers@0.5.15)(postcss@8.5.3)(relateurl@0.2.7)(terser@5.39.0)(typescript@5.8.3) + version: 2.12.0(@swc/helpers@0.5.15)(postcss@8.5.3)(relateurl@0.2.7)(terser@5.39.0)(typescript@5.9.2) rimraf: specifier: 3.0.2 version: 3.0.2 @@ -944,10 +944,10 @@ importers: version: 3.5.29 '@typescript-eslint/eslint-plugin': specifier: catalog:eslint8 - version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.8.3))(eslint@8.56.0)(typescript@5.8.3) + version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.2))(eslint@8.56.0)(typescript@5.9.2) '@typescript-eslint/parser': specifier: catalog:eslint8 - version: 5.62.0(eslint@8.56.0)(typescript@5.8.3) + version: 5.62.0(eslint@8.56.0)(typescript@5.9.2) axe-core: specifier: 4.10.3 version: 4.10.3 @@ -965,13 +965,13 @@ importers: version: 8.56.0 eslint-config-airbnb-typescript: specifier: catalog:eslint8 - version: 17.1.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.8.3))(eslint@8.56.0)(typescript@5.8.3))(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.8.3))(eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.8.3))(eslint@8.56.0))(eslint@8.56.0) + version: 17.1.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.2))(eslint@8.56.0)(typescript@5.9.2))(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.2))(eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.2))(eslint@8.56.0))(eslint@8.56.0) eslint-plugin-i18n: specifier: catalog:eslint8 version: 2.3.0 eslint-plugin-import: specifier: catalog:eslint8 - version: 2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.8.3))(eslint@8.56.0) + version: 2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.2))(eslint@8.56.0) eslint-plugin-no-only-tests: specifier: catalog:eslint8 version: 3.1.0 @@ -1095,10 +1095,10 @@ importers: devDependencies: '@analogjs/vite-plugin-angular': specifier: ^1.0.0 - version: 1.15.1(6lhihnzj2uw5mdwxits5aqgh3q) + version: 1.15.1(dvldxnmbhrokhmzfh5rgseo6am) '@angular-devkit/build-angular': specifier: ^19.2.5 - version: 19.2.10(@angular/compiler-cli@19.2.8(@angular/compiler@19.2.8)(typescript@5.8.3))(@angular/compiler@19.2.8)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.14.5)(chokidar@4.0.1)(html-webpack-plugin@5.6.3(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)))(jest-environment-jsdom@29.7.0)(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)))(jiti@1.21.6)(karma@6.4.4)(lightningcss@1.28.1)(sass-embedded@1.66.0)(typescript@5.8.3)(vite@6.2.7(@types/node@20.14.5)(jiti@1.21.6)(less@4.2.2)(lightningcss@1.28.1)(sass-embedded@1.66.0)(sass@1.85.0)(terser@5.39.0)(yaml@2.5.0))(yaml@2.5.0) + version: 19.2.10(@angular/compiler-cli@19.2.8(@angular/compiler@19.2.8)(typescript@5.8.3))(@angular/compiler@19.2.8)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.14.5)(chokidar@4.0.1)(html-webpack-plugin@5.6.3(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)))(jest-environment-jsdom@29.7.0)(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)))(jiti@1.21.6)(karma@6.4.4)(lightningcss@1.28.1)(sass-embedded@1.66.0)(typescript@5.8.3)(vite@6.2.7(@types/node@20.14.5)(jiti@1.21.6)(less@4.2.2)(lightningcss@1.28.1)(sass-embedded@1.66.0)(sass@1.85.0)(terser@5.39.0)(yaml@2.5.0))(yaml@2.5.0) '@angular/cli': specifier: ^19.2.5 version: 19.2.10(@types/node@20.14.5)(chokidar@4.0.1) @@ -1216,25 +1216,25 @@ importers: version: 7.23.9(@babel/core@7.23.9) '@devextreme-generator/angular': specifier: 3.0.12 - version: 3.0.12(kox42n4zvdid3e4x43xjkrb4vy) + version: 3.0.12(sbvjcxcrzqsdonswljyeavqa6m) '@devextreme-generator/build-helpers': specifier: 3.0.12 - version: 3.0.12(c7ctgeksnptl47v5itaxccw5we) + version: 3.0.12(itypu2gnv2krpykf453cw274qa) '@devextreme-generator/core': specifier: 3.0.12 - version: 3.0.12(kox42n4zvdid3e4x43xjkrb4vy) + version: 3.0.12(sbvjcxcrzqsdonswljyeavqa6m) '@devextreme-generator/declarations': specifier: 3.0.12 version: 3.0.12 '@devextreme-generator/inferno': specifier: 3.0.12 - version: 3.0.12(kox42n4zvdid3e4x43xjkrb4vy) + version: 3.0.12(sbvjcxcrzqsdonswljyeavqa6m) '@devextreme-generator/react': specifier: 3.0.12 - version: 3.0.12(kox42n4zvdid3e4x43xjkrb4vy) + version: 3.0.12(sbvjcxcrzqsdonswljyeavqa6m) '@devextreme-generator/vue': specifier: 3.0.12 - version: 3.0.12(kox42n4zvdid3e4x43xjkrb4vy) + version: 3.0.12(sbvjcxcrzqsdonswljyeavqa6m) '@eslint-stylistic/metadata': specifier: 'catalog:' version: 2.13.0 @@ -1336,7 +1336,7 @@ importers: version: 18.0.0(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6)))(eslint@9.18.0(jiti@1.21.6)) eslint-config-devextreme: specifier: 1.1.6 - version: 1.1.6(nv2mhzsrxyb3dcipnjpfuzg7za) + version: 1.1.6(yz4zcc7jpzkzj5rteb655x27wq) eslint-migration-utils: specifier: workspace:* version: link:../eslint-migration-utils @@ -1348,7 +1348,7 @@ importers: version: 2.31.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6)) eslint-plugin-jest: specifier: 27.6.0 - version: 27.6.0(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)))(typescript@4.9.5) + version: 27.6.0(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)))(typescript@4.9.5) eslint-plugin-jest-formatting: specifier: 3.1.0 version: 3.1.0(eslint@9.18.0(jiti@1.21.6)) @@ -1603,7 +1603,7 @@ importers: version: 2.0.5 ts-jest: specifier: 29.1.2 - version: 29.1.2(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)))(typescript@4.9.5) + version: 29.1.2(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)))(typescript@4.9.5) tsc-alias: specifier: 1.8.10 version: 1.8.10 @@ -1624,7 +1624,7 @@ importers: version: 1.1.0 webpack: specifier: 5.94.0 - version: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15)) + version: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) webpack-stream: specifier: 7.0.0 version: 7.0.0(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))) @@ -1734,7 +1734,7 @@ importers: version: 9.18.0(jiti@1.21.6) eslint-config-devextreme: specifier: 1.1.5 - version: 1.1.5(h2f6q6xa6rnurktsilsho4w2o4) + version: 1.1.5(m3ttf5qxvnatsf5pms6fqnrrf4) eslint-migration-utils: specifier: workspace:* version: link:../eslint-migration-utils @@ -1816,13 +1816,13 @@ importers: version: 20.12.8 devextreme-internal-tools: specifier: catalog:tools - version: 18.0.0-beta.15 + version: 18.0.0 prettier: specifier: catalog:tools version: 3.5.3 ts-node: specifier: catalog:tools - version: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3) + version: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2) packages/devextreme-monorepo-tools: devDependencies: @@ -1831,7 +1831,7 @@ importers: version: 29.5.12 ts-jest: specifier: 29.1.3 - version: 29.1.3(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)))(typescript@5.8.3) + version: 29.1.3(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)))(typescript@5.9.2) packages/devextreme-react: dependencies: @@ -1877,7 +1877,7 @@ importers: version: 17.1.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0))(eslint@8.56.0) eslint-config-devextreme: specifier: 1.1.5 - version: 1.1.5(adygfvrqgt2t7njaoc6ox5gji4) + version: 1.1.5(op6ipryumin6rjt7egduthxs4y) eslint-plugin-import: specifier: catalog:eslint8 version: 2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0) @@ -1904,7 +1904,7 @@ importers: version: 18.0.0(react@18.0.0) ts-jest: specifier: 29.1.3 - version: 29.1.3(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)))(typescript@4.9.5) + version: 29.1.3(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)))(typescript@4.9.5) typescript: specifier: 4.9.5 version: 4.9.5 @@ -1947,19 +1947,19 @@ importers: version: 1.59.2 stylelint: specifier: 15.11.0 - version: 15.11.0(typescript@5.8.3) + version: 15.11.0(typescript@5.9.2) stylelint-config-standard-scss: specifier: 9.0.0 - version: 9.0.0(postcss@8.5.3)(stylelint@15.11.0(typescript@5.8.3)) + version: 9.0.0(postcss@8.5.3)(stylelint@15.11.0(typescript@5.9.2)) stylelint-scss: specifier: 6.10.0 - version: 6.10.0(stylelint@15.11.0(typescript@5.8.3)) + version: 6.10.0(stylelint@15.11.0(typescript@5.9.2)) through2: specifier: 2.0.5 version: 2.0.5 ts-jest: specifier: 29.1.2 - version: 29.1.2(@babel/core@7.26.10)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)))(typescript@5.8.3) + version: 29.1.2(@babel/core@7.26.10)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)))(typescript@5.9.2) packages/devextreme-themebuilder: dependencies: @@ -2087,7 +2087,7 @@ importers: version: 18.0.0(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6)))(eslint@9.18.0(jiti@1.21.6)) eslint-config-devextreme: specifier: 1.1.5 - version: 1.1.5(azjhkqpaqmci65fuuw2cvgshzq) + version: 1.1.5(fqot4qpv3xuslv5gen77xjlqlu) eslint-plugin-i18n: specifier: 'catalog:' version: 2.4.0 @@ -2117,7 +2117,7 @@ importers: version: 29.7.0 ts-jest: specifier: 29.1.3 - version: 29.1.3(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)))(typescript@4.9.5) + version: 29.1.3(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)))(typescript@4.9.5) typescript: specifier: 4.9.5 version: 4.9.5 @@ -5826,6 +5826,11 @@ packages: '@preact/signals-core@1.8.0': resolution: {integrity: sha512-OBvUsRZqNmjzCZXWLxkZfhcgT+Fk8DDcT/8vD6a1xhDemodyy87UJRJfASMuSD8FaAIeGgGm85ydXhm7lr4fyA==} + '@prettier/sync@0.6.1': + resolution: {integrity: sha512-yF9G8vK/LYUTF3Cijd7VC9La3b20F20/J/fgoR4H0B8JGOWnZVZX6+I6+vODPosjmMcpdlUV+gUqJQZp3kLOcw==} + peerDependencies: + prettier: '*' + '@puppeteer/browsers@2.4.0': resolution: {integrity: sha512-x8J1csfIygOwf6D6qUAZ0ASk3z63zPb7wkNeHRerCMh82qWKUrOgkuP005AJC8lDL6/evtXETGEJVcwykKT4/g==} engines: {node: '>=18'} @@ -10074,9 +10079,9 @@ packages: resolution: {integrity: sha512-+HFrt1BAGomEEkKE0sQNH5OW8NaBt3iiSKYOFZ2Yi1+G0wJZzcvdMNxPMd3yI4c1M8X5WT+LUxjYCChv4FNlyA==} engines: {node: '>=8.3.0'} - devextreme-internal-tools@18.0.0-beta.15: - resolution: {integrity: sha512-k1g3YEFg1iUlpF0QqjBlE5xbqIBFvOdlG7BgHmGHOXc5bLwTYOvXufRH5LzEAfi5wOJ8jgD+DnjYLGMuT9eXDA==} - engines: {node: '>=12.0.0'} + devextreme-internal-tools@18.0.0: + resolution: {integrity: sha512-/cVyKitHDXfSbecWd1vxoWv8I+qs4//L++fYGnzZFgQXfsFk6PhRZ2f9ZbML6wTngTG4ukbDzPyzORq0vesdTw==} + engines: {node: '>=20.0.0'} hasBin: true devextreme-quill@1.7.4: @@ -14049,6 +14054,9 @@ packages: resolution: {integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==} engines: {node: '>=0.10.0'} + make-synchronized@0.8.0: + resolution: {integrity: sha512-DZu4lwc0ffoFz581BSQa/BJl+1ZqIkoRQ+VejMlH0VrP4E86StAODnZujZ4sepumQj8rcP7wUnUBGM8Gu+zKUA==} + makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} @@ -15647,11 +15655,6 @@ packages: resolution: {integrity: sha512-P5K31qWgUOQCtJL/3tpvEe28KfP49qbr6MTVEXC7I2k7ci55bP3YDr+glhyCdhIzxGCVp2f8eobfQ5so52RIIA==} engines: {node: '>=10.0.0'} - prettier@2.3.2: - resolution: {integrity: sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==} - engines: {node: '>=10.13.0'} - hasBin: true - prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} @@ -15662,6 +15665,11 @@ packages: engines: {node: '>=14'} hasBin: true + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + pretty-error@4.0.0: resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} @@ -16868,6 +16876,10 @@ packages: shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + shelljs@0.10.0: + resolution: {integrity: sha512-Jex+xw5Mg2qMZL3qnzXIfaxEtBaC4n7xifqaqtrZDdlheR70OGkydrPJWT0V1cA1k3nanC86x9FwAmQl6w3Klw==} + engines: {node: '>=18'} + shelljs@0.8.5: resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} engines: {node: '>=4'} @@ -18182,11 +18194,6 @@ packages: engines: {node: '>=4.2.0'} hasBin: true - typescript@5.1.6: - resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} - engines: {node: '>=14.17'} - hasBin: true - typescript@5.4.5: resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} engines: {node: '>=14.17'} @@ -18197,6 +18204,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + engines: {node: '>=14.17'} + hasBin: true + ua-parser-js@0.7.39: resolution: {integrity: sha512-IZ6acm6RhQHNibSt7+c09hhvsKy9WUr4DVbeq9U8o71qxyYtJpQeDxQnMrVqnIFMLcQjHO0I9wgfO2vIahht4w==} hasBin: true @@ -19059,8 +19071,8 @@ packages: resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} engines: {node: '>= 12.0.0'} - winston@3.10.0: - resolution: {integrity: sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==} + winston@3.17.0: + resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} engines: {node: '>= 12.0.0'} word-wrap@1.2.5: @@ -19281,12 +19293,12 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@analogjs/vite-plugin-angular@1.15.1(6lhihnzj2uw5mdwxits5aqgh3q)': + '@analogjs/vite-plugin-angular@1.15.1(dvldxnmbhrokhmzfh5rgseo6am)': dependencies: ts-morph: 21.0.1 vfile: 6.0.3 optionalDependencies: - '@angular-devkit/build-angular': 19.2.10(@angular/compiler-cli@19.2.8(@angular/compiler@19.2.8)(typescript@5.8.3))(@angular/compiler@19.2.8)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.14.5)(chokidar@4.0.1)(html-webpack-plugin@5.6.3(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)))(jest-environment-jsdom@29.7.0)(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)))(jiti@1.21.6)(karma@6.4.4)(lightningcss@1.28.1)(sass-embedded@1.66.0)(typescript@5.8.3)(vite@6.2.7(@types/node@20.14.5)(jiti@1.21.6)(less@4.2.2)(lightningcss@1.28.1)(sass-embedded@1.66.0)(sass@1.85.0)(terser@5.39.0)(yaml@2.5.0))(yaml@2.5.0) + '@angular-devkit/build-angular': 19.2.10(@angular/compiler-cli@19.2.8(@angular/compiler@19.2.8)(typescript@5.8.3))(@angular/compiler@19.2.8)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.14.5)(chokidar@4.0.1)(html-webpack-plugin@5.6.3(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)))(jest-environment-jsdom@29.7.0)(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)))(jiti@1.21.6)(karma@6.4.4)(lightningcss@1.28.1)(sass-embedded@1.66.0)(typescript@5.8.3)(vite@6.2.7(@types/node@20.14.5)(jiti@1.21.6)(less@4.2.2)(lightningcss@1.28.1)(sass-embedded@1.66.0)(sass@1.85.0)(terser@5.39.0)(yaml@2.5.0))(yaml@2.5.0) '@angular/build': 19.2.10(@angular/compiler-cli@19.2.8(@angular/compiler@19.2.8)(typescript@5.8.3))(@angular/compiler@19.2.8)(@types/node@20.14.5)(chokidar@4.0.1)(jiti@1.21.6)(karma@6.4.4)(less@4.2.2)(lightningcss@1.28.1)(postcss@8.5.2)(sass-embedded@1.66.0)(terser@5.39.0)(typescript@5.8.3)(yaml@2.5.0) '@angular-devkit/architect@0.1703.11(chokidar@3.6.0)': @@ -19310,7 +19322,7 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/build-angular@17.3.11(emisctridrw7uljolci7fxwmai)': + '@angular-devkit/build-angular@17.3.11(qwvpz4std2ihowmewzmfizrlqa)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.1703.11(chokidar@3.6.0) @@ -19372,11 +19384,11 @@ snapshots: undici: 6.11.1 vite: 5.1.8(@types/node@20.11.17)(less@4.2.0)(lightningcss@1.28.1)(sass@1.71.1)(terser@5.29.1) watchpack: 2.4.0 - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) webpack-dev-middleware: 6.1.2(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) webpack-dev-server: 4.15.1(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) webpack-merge: 5.10.0 - webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.3(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))))(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) + webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.3(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)))(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) optionalDependencies: '@angular/platform-server': 17.3.12(@angular/animations@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/animations@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10))) esbuild: 0.20.1 @@ -19403,7 +19415,7 @@ snapshots: - utf-8-validate - webpack-cli - '@angular-devkit/build-angular@17.3.11(yhrafk4ev6k2dly5pdp4p2egia)': + '@angular-devkit/build-angular@17.3.11(zv4xp4uudkxcirbl56nxvgru2i)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.1703.11(chokidar@3.6.0) @@ -19465,11 +19477,11 @@ snapshots: undici: 6.11.1 vite: 5.1.8(@types/node@20.12.8)(less@4.2.0)(lightningcss@1.28.1)(sass@1.71.1)(terser@5.29.1) watchpack: 2.4.0 - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) webpack-dev-middleware: 6.1.2(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) webpack-dev-server: 4.15.1(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) webpack-merge: 5.10.0 - webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.3(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)))(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) + webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.3(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0)))(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) optionalDependencies: '@angular/platform-server': 17.3.12(@angular/animations@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/animations@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10))) esbuild: 0.20.1 @@ -19496,7 +19508,7 @@ snapshots: - utf-8-validate - webpack-cli - '@angular-devkit/build-angular@19.2.10(@angular/compiler-cli@19.2.8(@angular/compiler@19.2.8)(typescript@5.8.3))(@angular/compiler@19.2.8)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.14.5)(chokidar@4.0.1)(html-webpack-plugin@5.6.3(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)))(jest-environment-jsdom@29.7.0)(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)))(jiti@1.21.6)(karma@6.4.4)(lightningcss@1.28.1)(sass-embedded@1.66.0)(typescript@5.8.3)(vite@6.2.7(@types/node@20.14.5)(jiti@1.21.6)(less@4.2.2)(lightningcss@1.28.1)(sass-embedded@1.66.0)(sass@1.85.0)(terser@5.39.0)(yaml@2.5.0))(yaml@2.5.0)': + '@angular-devkit/build-angular@19.2.10(@angular/compiler-cli@19.2.8(@angular/compiler@19.2.8)(typescript@5.8.3))(@angular/compiler@19.2.8)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.14.5)(chokidar@4.0.1)(html-webpack-plugin@5.6.3(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)))(jest-environment-jsdom@29.7.0)(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)))(jiti@1.21.6)(karma@6.4.4)(lightningcss@1.28.1)(sass-embedded@1.66.0)(typescript@5.8.3)(vite@6.2.7(@types/node@20.14.5)(jiti@1.21.6)(less@4.2.2)(lightningcss@1.28.1)(sass-embedded@1.66.0)(sass@1.85.0)(terser@5.39.0)(yaml@2.5.0))(yaml@2.5.0)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.1902.10(chokidar@4.0.1) @@ -19557,7 +19569,7 @@ snapshots: webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.3(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)))(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)) optionalDependencies: esbuild: 0.25.1 - jest: 29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + jest: 29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) jest-environment-jsdom: 29.7.0 karma: 6.4.4 transitivePeerDependencies: @@ -19587,7 +19599,7 @@ snapshots: dependencies: '@angular-devkit/architect': 0.1703.11(chokidar@3.6.0) rxjs: 7.8.1 - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) webpack-dev-server: 4.15.1(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) transitivePeerDependencies: - chokidar @@ -22480,9 +22492,9 @@ snapshots: dependencies: tslib: 2.3.1 - '@devextreme-generator/angular@3.0.12(kox42n4zvdid3e4x43xjkrb4vy)': + '@devextreme-generator/angular@3.0.12(sbvjcxcrzqsdonswljyeavqa6m)': dependencies: - '@devextreme-generator/core': 3.0.12(kox42n4zvdid3e4x43xjkrb4vy) + '@devextreme-generator/core': 3.0.12(sbvjcxcrzqsdonswljyeavqa6m) transitivePeerDependencies: - '@typescript-eslint/eslint-plugin' - eslint @@ -22497,13 +22509,13 @@ snapshots: - eslint-plugin-spellcheck - supports-color - '@devextreme-generator/build-helpers@3.0.12(c7ctgeksnptl47v5itaxccw5we)': + '@devextreme-generator/build-helpers@3.0.12(itypu2gnv2krpykf453cw274qa)': dependencies: - '@devextreme-generator/angular': 3.0.12(kox42n4zvdid3e4x43xjkrb4vy) - '@devextreme-generator/core': 3.0.12(kox42n4zvdid3e4x43xjkrb4vy) - '@devextreme-generator/inferno': 3.0.12(kox42n4zvdid3e4x43xjkrb4vy) - '@devextreme-generator/preact': 3.0.12(kox42n4zvdid3e4x43xjkrb4vy) - '@devextreme-generator/react': 3.0.12(kox42n4zvdid3e4x43xjkrb4vy) + '@devextreme-generator/angular': 3.0.12(sbvjcxcrzqsdonswljyeavqa6m) + '@devextreme-generator/core': 3.0.12(sbvjcxcrzqsdonswljyeavqa6m) + '@devextreme-generator/inferno': 3.0.12(sbvjcxcrzqsdonswljyeavqa6m) + '@devextreme-generator/preact': 3.0.12(sbvjcxcrzqsdonswljyeavqa6m) + '@devextreme-generator/react': 3.0.12(sbvjcxcrzqsdonswljyeavqa6m) loader-utils: 2.0.4 typescript: 4.3.5 vinyl: 2.2.1 @@ -22526,10 +22538,10 @@ snapshots: - uglify-js - webpack-cli - '@devextreme-generator/core@3.0.12(kox42n4zvdid3e4x43xjkrb4vy)': + '@devextreme-generator/core@3.0.12(sbvjcxcrzqsdonswljyeavqa6m)': dependencies: code-block-writer: 10.1.1 - eslint-config-devextreme: 0.2.0(kox42n4zvdid3e4x43xjkrb4vy) + eslint-config-devextreme: 0.2.0(sbvjcxcrzqsdonswljyeavqa6m) prettier: 2.8.8 prettier-eslint: 13.0.0 typescript: 4.3.5 @@ -22552,11 +22564,11 @@ snapshots: react: 17.0.2 react-dom: 17.0.2(react@17.0.2) - '@devextreme-generator/inferno@3.0.12(kox42n4zvdid3e4x43xjkrb4vy)': + '@devextreme-generator/inferno@3.0.12(sbvjcxcrzqsdonswljyeavqa6m)': dependencies: - '@devextreme-generator/core': 3.0.12(kox42n4zvdid3e4x43xjkrb4vy) - '@devextreme-generator/preact': 3.0.12(kox42n4zvdid3e4x43xjkrb4vy) - '@devextreme-generator/react': 3.0.12(kox42n4zvdid3e4x43xjkrb4vy) + '@devextreme-generator/core': 3.0.12(sbvjcxcrzqsdonswljyeavqa6m) + '@devextreme-generator/preact': 3.0.12(sbvjcxcrzqsdonswljyeavqa6m) + '@devextreme-generator/react': 3.0.12(sbvjcxcrzqsdonswljyeavqa6m) transitivePeerDependencies: - '@typescript-eslint/eslint-plugin' - eslint @@ -22571,10 +22583,10 @@ snapshots: - eslint-plugin-spellcheck - supports-color - '@devextreme-generator/preact@3.0.12(kox42n4zvdid3e4x43xjkrb4vy)': + '@devextreme-generator/preact@3.0.12(sbvjcxcrzqsdonswljyeavqa6m)': dependencies: - '@devextreme-generator/core': 3.0.12(kox42n4zvdid3e4x43xjkrb4vy) - '@devextreme-generator/react': 3.0.12(kox42n4zvdid3e4x43xjkrb4vy) + '@devextreme-generator/core': 3.0.12(sbvjcxcrzqsdonswljyeavqa6m) + '@devextreme-generator/react': 3.0.12(sbvjcxcrzqsdonswljyeavqa6m) transitivePeerDependencies: - '@typescript-eslint/eslint-plugin' - eslint @@ -22589,9 +22601,9 @@ snapshots: - eslint-plugin-spellcheck - supports-color - '@devextreme-generator/react@3.0.12(kox42n4zvdid3e4x43xjkrb4vy)': + '@devextreme-generator/react@3.0.12(sbvjcxcrzqsdonswljyeavqa6m)': dependencies: - '@devextreme-generator/core': 3.0.12(kox42n4zvdid3e4x43xjkrb4vy) + '@devextreme-generator/core': 3.0.12(sbvjcxcrzqsdonswljyeavqa6m) transitivePeerDependencies: - '@typescript-eslint/eslint-plugin' - eslint @@ -22606,10 +22618,10 @@ snapshots: - eslint-plugin-spellcheck - supports-color - '@devextreme-generator/vue@3.0.12(kox42n4zvdid3e4x43xjkrb4vy)': + '@devextreme-generator/vue@3.0.12(sbvjcxcrzqsdonswljyeavqa6m)': dependencies: - '@devextreme-generator/angular': 3.0.12(kox42n4zvdid3e4x43xjkrb4vy) - '@devextreme-generator/core': 3.0.12(kox42n4zvdid3e4x43xjkrb4vy) + '@devextreme-generator/angular': 3.0.12(sbvjcxcrzqsdonswljyeavqa6m) + '@devextreme-generator/core': 3.0.12(sbvjcxcrzqsdonswljyeavqa6m) prettier: 2.8.8 transitivePeerDependencies: - '@typescript-eslint/eslint-plugin' @@ -23620,7 +23632,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3))': + '@jest/core@29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0(node-notifier@9.0.1) @@ -23634,7 +23646,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -24008,7 +24020,7 @@ snapshots: dependencies: '@angular/compiler-cli': 17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.5) typescript: 5.4.5 - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) '@ngtools/webpack@19.2.10(@angular/compiler-cli@19.2.8(@angular/compiler@19.2.8)(typescript@5.8.3))(typescript@5.8.3)(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1))': dependencies: @@ -24167,9 +24179,9 @@ snapshots: transitivePeerDependencies: - nx - '@nrwl/jest@19.4.2(@babel/traverse@7.27.1)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(node-notifier@9.0.1)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3))(typescript@5.8.3)': + '@nrwl/jest@19.4.2(@babel/traverse@7.27.1)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(node-notifier@9.0.1)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2))(typescript@5.9.2)': dependencies: - '@nx/jest': 19.4.2(@babel/traverse@7.27.1)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(node-notifier@9.0.1)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3))(typescript@5.8.3) + '@nx/jest': 19.4.2(@babel/traverse@7.27.1)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(node-notifier@9.0.1)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2))(typescript@5.9.2) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -24185,9 +24197,9 @@ snapshots: - typescript - verdaccio - '@nrwl/js@19.4.2(@babel/traverse@7.27.1)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(typescript@5.8.3)': + '@nrwl/js@19.4.2(@babel/traverse@7.27.1)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(typescript@5.9.2)': dependencies: - '@nx/js': 19.4.2(@babel/traverse@7.27.1)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(typescript@5.8.3) + '@nx/js': 19.4.2(@babel/traverse@7.27.1)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(typescript@5.9.2) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -24248,17 +24260,17 @@ snapshots: tslib: 2.6.3 yargs-parser: 21.1.1 - '@nx/jest@19.4.2(@babel/traverse@7.27.1)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(node-notifier@9.0.1)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3))(typescript@5.8.3)': + '@nx/jest@19.4.2(@babel/traverse@7.27.1)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(node-notifier@9.0.1)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2))(typescript@5.9.2)': dependencies: '@jest/reporters': 29.7.0(node-notifier@9.0.1) '@jest/test-result': 29.7.0 - '@nrwl/jest': 19.4.2(@babel/traverse@7.27.1)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(node-notifier@9.0.1)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3))(typescript@5.8.3) + '@nrwl/jest': 19.4.2(@babel/traverse@7.27.1)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(node-notifier@9.0.1)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2))(typescript@5.9.2) '@nx/devkit': 19.4.2(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15))) - '@nx/js': 19.4.2(@babel/traverse@7.27.1)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(typescript@5.8.3) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.8.3) + '@nx/js': 19.4.2(@babel/traverse@7.27.1)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(typescript@5.9.2) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.9.2) chalk: 4.1.2 identity-obj-proxy: 3.0.0 - jest-config: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) jest-resolve: 29.7.0 jest-util: 29.7.0 minimatch: 9.0.3 @@ -24280,7 +24292,7 @@ snapshots: - typescript - verdaccio - '@nx/js@19.4.2(@babel/traverse@7.27.1)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(typescript@5.8.3)': + '@nx/js@19.4.2(@babel/traverse@7.27.1)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(typescript@5.9.2)': dependencies: '@babel/core': 7.23.9 '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.23.9) @@ -24289,7 +24301,7 @@ snapshots: '@babel/preset-env': 7.23.9(@babel/core@7.23.9) '@babel/preset-typescript': 7.26.0(@babel/core@7.23.9) '@babel/runtime': 7.26.10 - '@nrwl/js': 19.4.2(@babel/traverse@7.27.1)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(typescript@5.8.3) + '@nrwl/js': 19.4.2(@babel/traverse@7.27.1)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(typescript@5.9.2) '@nx/devkit': 19.4.2(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15))) '@nx/workspace': 19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)) babel-plugin-const-enum: 1.2.0(@babel/core@7.23.9) @@ -24308,7 +24320,7 @@ snapshots: ora: 5.3.0 semver: 7.6.3 source-map-support: 0.5.19 - ts-node: 10.9.1(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3) + ts-node: 10.9.1(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2) tsconfig-paths: 4.2.0 tslib: 2.6.3 transitivePeerDependencies: @@ -24399,14 +24411,14 @@ snapshots: transitivePeerDependencies: - '@parcel/core' - '@parcel/config-default@2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)(postcss@8.5.3)(relateurl@0.2.7)(terser@5.39.0)(typescript@5.8.3)': + '@parcel/config-default@2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)(postcss@8.5.3)(relateurl@0.2.7)(terser@5.39.0)(typescript@5.9.2)': dependencies: '@parcel/bundler-default': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15)) '@parcel/compressor-raw': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15)) '@parcel/core': 2.12.0(@swc/helpers@0.5.15) '@parcel/namer-default': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15)) '@parcel/optimizer-css': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15)) - '@parcel/optimizer-htmlnano': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(postcss@8.5.3)(relateurl@0.2.7)(terser@5.39.0)(typescript@5.8.3) + '@parcel/optimizer-htmlnano': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(postcss@8.5.3)(relateurl@0.2.7)(terser@5.39.0)(typescript@5.9.2) '@parcel/optimizer-image': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15)) '@parcel/optimizer-svgo': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15)) '@parcel/optimizer-swc': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) @@ -24537,10 +24549,10 @@ snapshots: transitivePeerDependencies: - '@parcel/core' - '@parcel/optimizer-htmlnano@2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(postcss@8.5.3)(relateurl@0.2.7)(terser@5.39.0)(typescript@5.8.3)': + '@parcel/optimizer-htmlnano@2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(postcss@8.5.3)(relateurl@0.2.7)(terser@5.39.0)(typescript@5.9.2)': dependencies: '@parcel/plugin': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15)) - htmlnano: 2.1.1(postcss@8.5.3)(relateurl@0.2.7)(svgo@2.8.0)(terser@5.39.0)(typescript@5.8.3) + htmlnano: 2.1.1(postcss@8.5.3)(relateurl@0.2.7)(svgo@2.8.0)(terser@5.39.0)(typescript@5.9.2) nullthrows: 1.1.1 posthtml: 0.16.6 svgo: 2.8.0 @@ -24954,10 +24966,10 @@ snapshots: '@parcel/utils': 2.12.0 nullthrows: 1.1.1 - '@phenomnomnominal/tsquery@5.0.1(typescript@5.8.3)': + '@phenomnomnominal/tsquery@5.0.1(typescript@5.9.2)': dependencies: esquery: 1.6.0 - typescript: 5.8.3 + typescript: 5.9.2 '@pkgjs/parseargs@0.11.0': optional: true @@ -24982,6 +24994,11 @@ snapshots: '@preact/signals-core@1.8.0': {} + '@prettier/sync@0.6.1(prettier@3.6.2)': + dependencies: + make-synchronized: 0.8.0 + prettier: 3.6.2 + '@puppeteer/browsers@2.4.0': dependencies: debug: 4.4.0 @@ -26984,22 +27001,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.8.3))(eslint@8.56.0)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.2))(eslint@8.56.0)(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 5.62.0(eslint@8.56.0)(typescript@5.8.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.56.0)(typescript@5.9.2) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.56.0)(typescript@5.8.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.8.3) + '@typescript-eslint/type-utils': 5.62.0(eslint@8.56.0)(typescript@5.9.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.9.2) debug: 4.4.0 eslint: 8.56.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare-lite: 1.4.0 semver: 7.7.1 - tsutils: 3.21.0(typescript@5.8.3) + tsutils: 3.21.0(typescript@5.9.2) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -27114,15 +27131,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.8.3)': + '@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.2)': dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.2) debug: 4.4.0 eslint: 8.56.0 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -27207,15 +27224,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@5.62.0(eslint@8.56.0)(typescript@5.8.3)': + '@typescript-eslint/type-utils@5.62.0(eslint@8.56.0)(typescript@5.9.2)': dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.9.2) debug: 4.4.0 eslint: 8.56.0 - tsutils: 3.21.0(typescript@5.8.3) + tsutils: 3.21.0(typescript@5.9.2) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -27306,7 +27323,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.9.2)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 @@ -27314,9 +27331,9 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 semver: 7.7.1 - tsutils: 3.21.0(typescript@5.8.3) + tsutils: 3.21.0(typescript@5.9.2) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -27421,14 +27438,14 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@5.62.0(eslint@8.56.0)(typescript@5.8.3)': + '@typescript-eslint/utils@5.62.0(eslint@8.56.0)(typescript@5.9.2)': dependencies: '@eslint-community/eslint-utils': 4.5.0(eslint@8.56.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.2) eslint: 8.56.0 eslint-scope: 5.1.1 semver: 7.7.1 @@ -27832,11 +27849,11 @@ snapshots: '@vue/shared': 3.4.27 vue: 3.4.27(typescript@5.4.5) - '@vue/server-renderer@3.4.27(vue@3.4.27(typescript@5.8.3))': + '@vue/server-renderer@3.4.27(vue@3.4.27(typescript@5.9.2))': dependencies: '@vue/compiler-ssr': 3.4.27 '@vue/shared': 3.4.27 - vue: 3.4.27(typescript@5.8.3) + vue: 3.4.27(typescript@5.9.2) '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.8.3))': dependencies: @@ -28675,7 +28692,7 @@ snapshots: '@babel/core': 7.24.0 find-cache-dir: 4.0.0 schema-utils: 4.3.2 - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) babel-loader@9.2.1(@babel/core@7.23.9)(webpack@5.96.1(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.18.20)): dependencies: @@ -29819,7 +29836,7 @@ snapshots: tslint: 6.1.3(typescript@5.4.5) zone.js: 0.10.3 - codelyzer@6.0.2(@angular/compiler@19.2.8)(@angular/core@19.2.8(rxjs@7.8.1)(zone.js@0.15.0))(tslint@6.1.3(typescript@5.8.3)): + codelyzer@6.0.2(@angular/compiler@19.2.8)(@angular/core@19.2.8(rxjs@7.8.1)(zone.js@0.15.0))(tslint@6.1.3(typescript@5.9.2)): dependencies: '@angular/compiler': 19.2.8 '@angular/core': 19.2.8(rxjs@7.8.1)(zone.js@0.15.0) @@ -29834,7 +29851,7 @@ snapshots: source-map: 0.5.7 sprintf-js: 1.1.3 tslib: 1.14.1 - tslint: 6.1.3(typescript@5.8.3) + tslint: 6.1.3(typescript@5.9.2) zone.js: 0.10.3 coffeescript@2.7.0: {} @@ -30056,7 +30073,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.3.2 serialize-javascript: 6.0.2 - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) copy-webpack-plugin@12.0.2(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)): dependencies: @@ -30118,14 +30135,14 @@ snapshots: optionalDependencies: typescript: 4.9.5 - cosmiconfig@8.3.6(typescript@5.8.3): + cosmiconfig@8.3.6(typescript@5.9.2): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 cosmiconfig@9.0.0(typescript@4.9.5): dependencies: @@ -30154,6 +30171,15 @@ snapshots: optionalDependencies: typescript: 5.8.3 + cosmiconfig@9.0.0(typescript@5.9.2): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.9.2 + crc-32@1.2.2: {} crc32-stream@6.0.0: @@ -30214,13 +30240,13 @@ snapshots: - ts-node optional: true - create-jest@29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)): + create-jest@29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -30245,13 +30271,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)): + create-jest@29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -30260,13 +30286,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@20.14.5)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)): + create-jest@29.7.0(@types/node@20.14.5)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.14.5)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@20.14.5)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -30342,7 +30368,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) css-loader@6.10.0(webpack@5.94.0): dependencies: @@ -30857,16 +30883,17 @@ snapshots: unzipper: 0.12.3 uuid: 8.3.2 - devextreme-internal-tools@18.0.0-beta.15: + devextreme-internal-tools@18.0.0: dependencies: + '@prettier/sync': 0.6.1(prettier@3.6.2) dasherize: 2.0.0 dot: 1.1.3 inflector-js: 1.0.1 mkdirp: 3.0.1 - prettier: 2.3.2 - shelljs: 0.8.5 - typescript: 5.1.6 - winston: 3.10.0 + prettier: 3.6.2 + shelljs: 0.10.0 + typescript: 5.9.2 + winston: 3.17.0 yargs: 17.7.2 devextreme-quill@1.7.4: @@ -31468,7 +31495,7 @@ snapshots: esbuild-plugin-alias@0.2.1: {} - esbuild-plugin-vue3@0.3.2(cheerio@1.0.0-rc.10)(sass@1.71.1): + esbuild-plugin-vue3@0.3.2(cheerio@1.0.0-rc.10)(sass@1.85.0): dependencies: '@vue/compiler-core': 3.5.13 '@vue/compiler-sfc': 3.4.27 @@ -31476,7 +31503,7 @@ snapshots: typescript: 4.9.5 optionalDependencies: cheerio: 1.0.0-rc.10 - sass: 1.71.1 + sass: 1.85.0 esbuild-register@3.6.0(esbuild@0.18.20): dependencies: @@ -31749,11 +31776,11 @@ snapshots: object.entries: 1.1.8 semver: 6.3.1 - eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.8.3))(eslint@8.56.0))(eslint@8.56.0): + eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.2))(eslint@8.56.0))(eslint@8.56.0): dependencies: confusing-browser-globals: 1.0.11 eslint: 8.56.0 - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.8.3))(eslint@8.56.0) + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.2))(eslint@8.56.0) object.assign: 4.1.5 object.entries: 1.1.8 semver: 6.3.1 @@ -31792,13 +31819,13 @@ snapshots: eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0))(eslint@8.56.0) eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0) - eslint-config-airbnb-typescript@17.1.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.8.3))(eslint@8.56.0)(typescript@5.8.3))(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.8.3))(eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.8.3))(eslint@8.56.0))(eslint@8.56.0): + eslint-config-airbnb-typescript@17.1.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.2))(eslint@8.56.0)(typescript@5.9.2))(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.2))(eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.2))(eslint@8.56.0))(eslint@8.56.0): dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.8.3))(eslint@8.56.0)(typescript@5.8.3) - '@typescript-eslint/parser': 5.62.0(eslint@8.56.0)(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.2))(eslint@8.56.0)(typescript@5.9.2) + '@typescript-eslint/parser': 5.62.0(eslint@8.56.0)(typescript@5.9.2) eslint: 8.56.0 - eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.8.3))(eslint@8.56.0))(eslint@8.56.0) - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.8.3))(eslint@8.56.0) + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.2))(eslint@8.56.0))(eslint@8.56.0) + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.2))(eslint@8.56.0) eslint-config-airbnb-typescript@18.0.0(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6)))(eslint@9.18.0(jiti@1.21.6)): dependencies: @@ -31818,44 +31845,28 @@ snapshots: transitivePeerDependencies: - eslint-plugin-import - eslint-config-devextreme@0.2.0(kox42n4zvdid3e4x43xjkrb4vy): + eslint-config-devextreme@0.2.0(sbvjcxcrzqsdonswljyeavqa6m): dependencies: '@typescript-eslint/eslint-plugin': 8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5) eslint: 9.18.0(jiti@1.21.6) eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6)))(eslint@9.18.0(jiti@1.21.6)) eslint-config-airbnb-typescript: 18.0.0(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6)))(eslint@9.18.0(jiti@1.21.6)) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6)) - eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)))(typescript@4.9.5) + eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)))(typescript@4.9.5) eslint-plugin-jest-formatting: 3.1.0(eslint@9.18.0(jiti@1.21.6)) eslint-plugin-jsx-a11y: 6.8.0(eslint@9.18.0(jiti@1.21.6)) eslint-plugin-qunit: 8.1.2(eslint@9.18.0(jiti@1.21.6)) eslint-plugin-rulesdir: 0.2.2 eslint-plugin-spellcheck: 0.0.20(eslint@9.18.0(jiti@1.21.6)) - eslint-config-devextreme@1.1.5(adygfvrqgt2t7njaoc6ox5gji4): - dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5) - eslint: 8.56.0 - eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0))(eslint@8.56.0) - eslint-config-airbnb-typescript: 17.1.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0))(eslint@8.56.0) - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0) - eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)))(typescript@4.9.5) - eslint-plugin-jest-formatting: 3.1.0(eslint@8.56.0) - eslint-plugin-jsx-a11y: 6.8.0(eslint@8.56.0) - eslint-plugin-qunit: 8.1.2(eslint@8.56.0) - eslint-plugin-rulesdir: 0.2.2 - eslint-plugin-spellcheck: 0.0.20(eslint@8.56.0) - stylelint: 16.5.0(typescript@4.9.5) - stylelint-config-standard: 35.0.0(stylelint@16.5.0(typescript@4.9.5)) - - eslint-config-devextreme@1.1.5(azjhkqpaqmci65fuuw2cvgshzq): + eslint-config-devextreme@1.1.5(fqot4qpv3xuslv5gen77xjlqlu): dependencies: '@typescript-eslint/eslint-plugin': 8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5) eslint: 9.18.0(jiti@1.21.6) eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6)))(eslint@9.18.0(jiti@1.21.6)) eslint-config-airbnb-typescript: 18.0.0(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6)))(eslint@9.18.0(jiti@1.21.6)) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6)) - eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)))(typescript@4.9.5) + eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)))(typescript@4.9.5) eslint-plugin-jest-formatting: 3.1.0(eslint@9.18.0(jiti@1.21.6)) eslint-plugin-jsx-a11y: 6.8.0(eslint@9.18.0(jiti@1.21.6)) eslint-plugin-qunit: 8.1.2(eslint@9.18.0(jiti@1.21.6)) @@ -31864,14 +31875,14 @@ snapshots: stylelint: 16.5.0(typescript@4.9.5) stylelint-config-standard: 35.0.0(stylelint@16.5.0(typescript@4.9.5)) - eslint-config-devextreme@1.1.5(h2f6q6xa6rnurktsilsho4w2o4): + eslint-config-devextreme@1.1.5(m3ttf5qxvnatsf5pms6fqnrrf4): dependencies: '@typescript-eslint/eslint-plugin': 8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.4.5))(eslint@9.18.0(jiti@1.21.6))(typescript@5.4.5) eslint: 9.18.0(jiti@1.21.6) eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.4.5))(eslint@9.18.0(jiti@1.21.6)))(eslint@9.18.0(jiti@1.21.6)) eslint-config-airbnb-typescript: 18.0.0(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.4.5))(eslint@9.18.0(jiti@1.21.6))(typescript@5.4.5))(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.4.5))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.4.5))(eslint@9.18.0(jiti@1.21.6)))(eslint@9.18.0(jiti@1.21.6)) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.4.5))(eslint@9.18.0(jiti@1.21.6)) - eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.4.5))(eslint@9.18.0(jiti@1.21.6))(typescript@5.4.5))(eslint@9.18.0(jiti@1.21.6))(jest@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)))(typescript@5.4.5) + eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.4.5))(eslint@9.18.0(jiti@1.21.6))(typescript@5.4.5))(eslint@9.18.0(jiti@1.21.6))(jest@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)))(typescript@5.4.5) eslint-plugin-jest-formatting: 3.1.0(eslint@9.18.0(jiti@1.21.6)) eslint-plugin-jsx-a11y: 6.8.0(eslint@9.18.0(jiti@1.21.6)) eslint-plugin-qunit: 8.1.2(eslint@9.18.0(jiti@1.21.6)) @@ -31880,6 +31891,22 @@ snapshots: stylelint: 16.5.0(typescript@5.4.5) stylelint-config-standard: 35.0.0(stylelint@16.5.0(typescript@5.4.5)) + eslint-config-devextreme@1.1.5(op6ipryumin6rjt7egduthxs4y): + dependencies: + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5) + eslint: 8.56.0 + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0))(eslint@8.56.0) + eslint-config-airbnb-typescript: 17.1.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0))(eslint@8.56.0) + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0) + eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)))(typescript@4.9.5) + eslint-plugin-jest-formatting: 3.1.0(eslint@8.56.0) + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.56.0) + eslint-plugin-qunit: 8.1.2(eslint@8.56.0) + eslint-plugin-rulesdir: 0.2.2 + eslint-plugin-spellcheck: 0.0.20(eslint@8.56.0) + stylelint: 16.5.0(typescript@4.9.5) + stylelint-config-standard: 35.0.0(stylelint@16.5.0(typescript@4.9.5)) + eslint-config-devextreme@1.1.5(zuhb6j5bszthiwwa7gh3t5co7a): dependencies: '@typescript-eslint/eslint-plugin': 8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5) @@ -31896,14 +31923,14 @@ snapshots: stylelint: 16.5.0(typescript@4.9.5) stylelint-config-standard: 35.0.0(stylelint@16.5.0(typescript@4.9.5)) - eslint-config-devextreme@1.1.6(nv2mhzsrxyb3dcipnjpfuzg7za): + eslint-config-devextreme@1.1.6(yz4zcc7jpzkzj5rteb655x27wq): dependencies: '@typescript-eslint/eslint-plugin': 8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5) eslint: 9.18.0(jiti@1.21.6) eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6)))(eslint@9.18.0(jiti@1.21.6)) eslint-config-airbnb-typescript: 18.0.0(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6)))(eslint@9.18.0(jiti@1.21.6)) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6)) - eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)))(typescript@4.9.5) + eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)))(typescript@4.9.5) eslint-plugin-jest-formatting: 3.1.0(eslint@9.18.0(jiti@1.21.6)) eslint-plugin-jsx-a11y: 6.8.0(eslint@9.18.0(jiti@1.21.6)) eslint-plugin-qunit: 8.1.2(eslint@9.18.0(jiti@1.21.6)) @@ -31940,11 +31967,11 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@8.56.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@8.56.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.56.0)(typescript@5.8.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.56.0)(typescript@5.9.2) eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: @@ -32044,7 +32071,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.8.3))(eslint@8.56.0): + eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.2))(eslint@8.56.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -32054,7 +32081,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@8.56.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@8.56.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -32065,7 +32092,7 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.56.0)(typescript@5.8.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.56.0)(typescript@5.9.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -32137,13 +32164,13 @@ snapshots: dependencies: eslint: 9.18.0(jiti@1.21.6) - eslint-plugin-jest@27.6.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)))(typescript@4.9.5): + eslint-plugin-jest@27.6.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)))(typescript@4.9.5): dependencies: '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@4.9.5) eslint: 8.56.0 optionalDependencies: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5) - jest: 29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + jest: 29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) transitivePeerDependencies: - supports-color - typescript @@ -32159,24 +32186,24 @@ snapshots: - supports-color - typescript - eslint-plugin-jest@27.6.0(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)))(typescript@4.9.5): + eslint-plugin-jest@27.6.0(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)))(typescript@4.9.5): dependencies: '@typescript-eslint/utils': 5.62.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5) eslint: 9.18.0(jiti@1.21.6) optionalDependencies: '@typescript-eslint/eslint-plugin': 8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.18.0(jiti@1.21.6))(typescript@4.9.5) - jest: 29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + jest: 29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jest@27.6.0(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.4.5))(eslint@9.18.0(jiti@1.21.6))(typescript@5.4.5))(eslint@9.18.0(jiti@1.21.6))(jest@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)))(typescript@5.4.5): + eslint-plugin-jest@27.6.0(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.4.5))(eslint@9.18.0(jiti@1.21.6))(typescript@5.4.5))(eslint@9.18.0(jiti@1.21.6))(jest@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)))(typescript@5.4.5): dependencies: '@typescript-eslint/utils': 5.62.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.4.5) eslint: 9.18.0(jiti@1.21.6) optionalDependencies: '@typescript-eslint/eslint-plugin': 8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.4.5))(eslint@9.18.0(jiti@1.21.6))(typescript@5.4.5) - jest: 29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + jest: 29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) transitivePeerDependencies: - supports-color - typescript @@ -34375,7 +34402,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) optional: true html-webpack-plugin@5.6.3(webpack@5.96.1(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.18.20)): @@ -34388,6 +34415,17 @@ snapshots: optionalDependencies: webpack: 5.96.1(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.18.20) + html-webpack-plugin@5.6.3(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0)): + dependencies: + '@types/html-minifier-terser': 6.1.0 + html-minifier-terser: 6.1.0 + lodash: 4.17.21 + pretty-error: 4.0.0 + tapable: 2.2.1 + optionalDependencies: + webpack: 5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0) + optional: true + html-webpack-plugin@5.6.3(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)): dependencies: '@types/html-minifier-terser': 6.1.0 @@ -34407,9 +34445,9 @@ snapshots: htmlescape@1.1.1: {} - htmlnano@2.1.1(postcss@8.5.3)(relateurl@0.2.7)(svgo@2.8.0)(terser@5.39.0)(typescript@5.8.3): + htmlnano@2.1.1(postcss@8.5.3)(relateurl@0.2.7)(svgo@2.8.0)(terser@5.39.0)(typescript@5.9.2): dependencies: - cosmiconfig: 9.0.0(typescript@5.8.3) + cosmiconfig: 9.0.0(typescript@5.9.2) posthtml: 0.16.6 timsort: 0.3.0 optionalDependencies: @@ -35304,16 +35342,16 @@ snapshots: - ts-node optional: true - jest-cli@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)): + jest-cli@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)): dependencies: - '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + create-jest: 29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -35347,16 +35385,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)): + jest-cli@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)): dependencies: - '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + create-jest: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -35368,16 +35406,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)): + jest-cli@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)): dependencies: - '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.14.5)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + create-jest: 29.7.0(@types/node@20.14.5)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.14.5)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@20.14.5)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -35452,7 +35490,7 @@ snapshots: - supports-color optional: true - jest-config@29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)): + jest-config@29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)): dependencies: '@babel/core': 7.23.9 '@jest/test-sequencer': 29.7.0 @@ -35478,7 +35516,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.11.17 - ts-node: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -35578,7 +35616,7 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)): + jest-config@29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)): dependencies: '@babel/core': 7.23.9 '@jest/test-sequencer': 29.7.0 @@ -35604,12 +35642,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.12.8 - ts-node: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.14.5)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)): + jest-config@29.7.0(@types/node@20.14.5)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)): dependencies: '@babel/core': 7.23.9 '@jest/test-sequencer': 29.7.0 @@ -35635,7 +35673,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.14.5 - ts-node: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -35910,12 +35948,12 @@ snapshots: - ts-node optional: true - jest@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)): + jest@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)): dependencies: - '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + jest-cli: 29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) optionalDependencies: node-notifier: 9.0.1 transitivePeerDependencies: @@ -35939,12 +35977,12 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)): + jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)): dependencies: - '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + jest-cli: 29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) optionalDependencies: node-notifier: 9.0.1 transitivePeerDependencies: @@ -35953,12 +35991,12 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)): + jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)): dependencies: - '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + jest-cli: 29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) optionalDependencies: node-notifier: 9.0.1 transitivePeerDependencies: @@ -36349,7 +36387,7 @@ snapshots: dependencies: klona: 2.0.6 less: 4.2.0 - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) less-loader@12.2.0(less@4.2.2)(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)): dependencies: @@ -36396,7 +36434,7 @@ snapshots: dependencies: webpack-sources: 3.2.3 optionalDependencies: - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) license-webpack-plugin@4.0.2(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)): dependencies: @@ -36838,6 +36876,8 @@ snapshots: dependencies: kind-of: 6.0.3 + make-synchronized@0.8.0: {} + makeerror@1.0.12: dependencies: tmpl: 1.0.5 @@ -37239,7 +37279,7 @@ snapshots: dependencies: schema-utils: 4.3.2 tapable: 2.2.1 - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) mini-css-extract-plugin@2.9.2(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)): dependencies: @@ -38314,9 +38354,9 @@ snapshots: dot-case: 3.0.4 tslib: 2.8.1 - parcel@2.12.0(@swc/helpers@0.5.15)(postcss@8.5.3)(relateurl@0.2.7)(terser@5.39.0)(typescript@5.8.3): + parcel@2.12.0(@swc/helpers@0.5.15)(postcss@8.5.3)(relateurl@0.2.7)(terser@5.39.0)(typescript@5.9.2): dependencies: - '@parcel/config-default': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)(postcss@8.5.3)(relateurl@0.2.7)(terser@5.39.0)(typescript@5.8.3) + '@parcel/config-default': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)(postcss@8.5.3)(relateurl@0.2.7)(terser@5.39.0)(typescript@5.9.2) '@parcel/core': 2.12.0(@swc/helpers@0.5.15) '@parcel/diagnostic': 2.12.0 '@parcel/events': 2.12.0 @@ -38648,7 +38688,7 @@ snapshots: postcss: 8.4.35 semver: 7.7.1 optionalDependencies: - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) transitivePeerDependencies: - typescript @@ -38800,12 +38840,12 @@ snapshots: transitivePeerDependencies: - supports-color - prettier@2.3.2: {} - prettier@2.8.8: {} prettier@3.5.3: {} + prettier@3.6.2: {} + pretty-error@4.0.0: dependencies: lodash: 4.17.21 @@ -39938,7 +39978,7 @@ snapshots: optionalDependencies: sass: 1.71.1 sass-embedded: 1.66.0 - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) sass-loader@16.0.5(sass-embedded@1.66.0)(sass@1.85.0)(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)): dependencies: @@ -40194,6 +40234,11 @@ snapshots: shell-quote@1.8.1: {} + shelljs@0.10.0: + dependencies: + execa: 5.1.1 + fast-glob: 3.3.3 + shelljs@0.8.5: dependencies: glob: 7.2.3 @@ -40406,7 +40451,7 @@ snapshots: dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) source-map-loader@5.0.0(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)): dependencies: @@ -40651,7 +40696,7 @@ snapshots: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15)) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) string-width@1.0.2: dependencies: @@ -40827,12 +40872,12 @@ snapshots: postcss-html: 1.7.0 stylelint: 16.5.0(typescript@5.4.5) - stylelint-config-recommended-scss@11.0.0(postcss@8.5.3)(stylelint@15.11.0(typescript@5.8.3)): + stylelint-config-recommended-scss@11.0.0(postcss@8.5.3)(stylelint@15.11.0(typescript@5.9.2)): dependencies: postcss-scss: 4.0.9(postcss@8.5.3) - stylelint: 15.11.0(typescript@5.8.3) - stylelint-config-recommended: 12.0.0(stylelint@15.11.0(typescript@5.8.3)) - stylelint-scss: 4.7.0(stylelint@15.11.0(typescript@5.8.3)) + stylelint: 15.11.0(typescript@5.9.2) + stylelint-config-recommended: 12.0.0(stylelint@15.11.0(typescript@5.9.2)) + stylelint-scss: 4.7.0(stylelint@15.11.0(typescript@5.9.2)) optionalDependencies: postcss: 8.5.3 @@ -40844,9 +40889,9 @@ snapshots: stylelint-config-html: 1.1.0(postcss-html@1.7.0)(stylelint@16.5.0(typescript@5.4.5)) stylelint-config-recommended: 14.0.1(stylelint@16.5.0(typescript@5.4.5)) - stylelint-config-recommended@12.0.0(stylelint@15.11.0(typescript@5.8.3)): + stylelint-config-recommended@12.0.0(stylelint@15.11.0(typescript@5.9.2)): dependencies: - stylelint: 15.11.0(typescript@5.8.3) + stylelint: 15.11.0(typescript@5.9.2) stylelint-config-recommended@14.0.1(stylelint@15.11.0(typescript@4.9.5)): dependencies: @@ -40860,18 +40905,18 @@ snapshots: dependencies: stylelint: 16.5.0(typescript@5.4.5) - stylelint-config-standard-scss@9.0.0(postcss@8.5.3)(stylelint@15.11.0(typescript@5.8.3)): + stylelint-config-standard-scss@9.0.0(postcss@8.5.3)(stylelint@15.11.0(typescript@5.9.2)): dependencies: - stylelint: 15.11.0(typescript@5.8.3) - stylelint-config-recommended-scss: 11.0.0(postcss@8.5.3)(stylelint@15.11.0(typescript@5.8.3)) - stylelint-config-standard: 33.0.0(stylelint@15.11.0(typescript@5.8.3)) + stylelint: 15.11.0(typescript@5.9.2) + stylelint-config-recommended-scss: 11.0.0(postcss@8.5.3)(stylelint@15.11.0(typescript@5.9.2)) + stylelint-config-standard: 33.0.0(stylelint@15.11.0(typescript@5.9.2)) optionalDependencies: postcss: 8.5.3 - stylelint-config-standard@33.0.0(stylelint@15.11.0(typescript@5.8.3)): + stylelint-config-standard@33.0.0(stylelint@15.11.0(typescript@5.9.2)): dependencies: - stylelint: 15.11.0(typescript@5.8.3) - stylelint-config-recommended: 12.0.0(stylelint@15.11.0(typescript@5.8.3)) + stylelint: 15.11.0(typescript@5.9.2) + stylelint-config-recommended: 12.0.0(stylelint@15.11.0(typescript@5.9.2)) stylelint-config-standard@35.0.0(stylelint@15.11.0(typescript@4.9.5)): dependencies: @@ -40890,15 +40935,15 @@ snapshots: stylelint-devextreme@0.0.6: {} - stylelint-scss@4.7.0(stylelint@15.11.0(typescript@5.8.3)): + stylelint-scss@4.7.0(stylelint@15.11.0(typescript@5.9.2)): dependencies: postcss-media-query-parser: 0.2.3 postcss-resolve-nested-selector: 0.1.6 postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 - stylelint: 15.11.0(typescript@5.8.3) + stylelint: 15.11.0(typescript@5.9.2) - stylelint-scss@6.10.0(stylelint@15.11.0(typescript@5.8.3)): + stylelint-scss@6.10.0(stylelint@15.11.0(typescript@5.9.2)): dependencies: css-tree: 3.1.0 is-plain-object: 5.0.0 @@ -40908,7 +40953,7 @@ snapshots: postcss-resolve-nested-selector: 0.1.6 postcss-selector-parser: 7.0.0 postcss-value-parser: 4.2.0 - stylelint: 15.11.0(typescript@5.8.3) + stylelint: 15.11.0(typescript@5.9.2) stylelint@15.11.0(typescript@4.9.5): dependencies: @@ -40956,7 +41001,7 @@ snapshots: - supports-color - typescript - stylelint@15.11.0(typescript@5.8.3): + stylelint@15.11.0(typescript@5.9.2): dependencies: '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 @@ -40964,7 +41009,7 @@ snapshots: '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.2) balanced-match: 2.0.0 colord: 2.9.3 - cosmiconfig: 8.3.6(typescript@5.8.3) + cosmiconfig: 8.3.6(typescript@5.9.2) css-functions-list: 3.2.3 css-tree: 2.3.1 debug: 4.3.7 @@ -41296,40 +41341,42 @@ snapshots: '@swc/core': 1.9.2(@swc/helpers@0.5.15) esbuild: 0.18.20 - terser-webpack-plugin@5.3.14(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0)(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)): + terser-webpack-plugin@5.3.14(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 terser: 5.39.0 - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) optionalDependencies: '@swc/core': 1.9.2(@swc/helpers@0.5.15) - esbuild: 0.25.0 + esbuild: 0.20.1 - terser-webpack-plugin@5.3.14(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)): + terser-webpack-plugin@5.3.14(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0)(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 terser: 5.39.0 - webpack: 5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1) + webpack: 5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0) optionalDependencies: '@swc/core': 1.9.2(@swc/helpers@0.5.15) - esbuild: 0.25.1 + esbuild: 0.25.0 + optional: true - terser-webpack-plugin@5.3.14(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))): + terser-webpack-plugin@5.3.14(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 terser: 5.39.0 - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15)) + webpack: 5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1) optionalDependencies: '@swc/core': 1.9.2(@swc/helpers@0.5.15) + esbuild: 0.25.1 terser-webpack-plugin@5.3.14(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack@5.94.0): dependencies: @@ -41372,7 +41419,7 @@ snapshots: schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.36.0 - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15)) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) optionalDependencies: '@swc/core': 1.9.2(@swc/helpers@0.5.15) @@ -42168,11 +42215,11 @@ snapshots: ts-dedent@2.2.0: {} - ts-jest@29.1.2(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)))(typescript@4.9.5): + ts-jest@29.1.2(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)))(typescript@4.9.5): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + jest: 29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -42202,28 +42249,28 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.26.10) - ts-jest@29.1.2(@babel/core@7.26.10)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)))(typescript@5.8.3): + ts-jest@29.1.2(@babel/core@7.26.10)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)))(typescript@5.9.2): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + jest: 29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.7.1 - typescript: 5.8.3 + typescript: 5.9.2 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.26.10 '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.26.10) - ts-jest@29.1.3(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)))(typescript@4.9.5): + ts-jest@29.1.3(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)))(typescript@4.9.5): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + jest: 29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -42237,17 +42284,17 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.26.10) - ts-jest@29.1.3(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)))(typescript@5.8.3): + ts-jest@29.1.3(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)))(typescript@5.9.2): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3)) + jest: 29.7.0(@types/node@20.14.5)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.7.1 - typescript: 5.8.3 + typescript: 5.9.2 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.26.10 @@ -42265,14 +42312,14 @@ snapshots: typescript: 4.9.5 webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4) - ts-loader@9.5.1(typescript@5.8.3)(webpack@5.94.0): + ts-loader@9.5.1(typescript@5.9.2)(webpack@5.94.0): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 micromatch: 4.0.8 semver: 7.6.3 source-map: 0.7.4 - typescript: 5.8.3 + typescript: 5.9.2 webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4) ts-morph@21.0.1: @@ -42280,7 +42327,7 @@ snapshots: '@ts-morph/common': 0.22.0 code-block-writer: 12.0.0 - ts-node@10.9.1(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3): + ts-node@10.9.1(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -42294,7 +42341,7 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.8.3 + typescript: 5.9.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: @@ -42360,7 +42407,7 @@ snapshots: optionalDependencies: '@swc/core': 1.9.2(@swc/helpers@0.5.15) - ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.9.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -42374,7 +42421,7 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.8.3 + typescript: 5.9.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: @@ -42435,7 +42482,7 @@ snapshots: tsutils: 2.29.0(typescript@5.4.5) typescript: 5.4.5 - tslint@6.1.3(typescript@5.8.3): + tslint@6.1.3(typescript@5.9.2): dependencies: '@babel/code-frame': 7.27.1 builtin-modules: 1.1.1 @@ -42449,18 +42496,18 @@ snapshots: resolve: 1.22.10 semver: 5.7.2 tslib: 1.14.1 - tsutils: 2.29.0(typescript@5.8.3) - typescript: 5.8.3 + tsutils: 2.29.0(typescript@5.9.2) + typescript: 5.9.2 tsutils@2.29.0(typescript@5.4.5): dependencies: tslib: 1.14.1 typescript: 5.4.5 - tsutils@2.29.0(typescript@5.8.3): + tsutils@2.29.0(typescript@5.9.2): dependencies: tslib: 1.14.1 - typescript: 5.8.3 + typescript: 5.9.2 tsutils@3.21.0(typescript@3.9.10): dependencies: @@ -42477,10 +42524,10 @@ snapshots: tslib: 1.14.1 typescript: 5.4.5 - tsutils@3.21.0(typescript@5.8.3): + tsutils@3.21.0(typescript@5.9.2): dependencies: tslib: 1.14.1 - typescript: 5.8.3 + typescript: 5.9.2 tty-browserify@0.0.1: {} @@ -42587,12 +42634,12 @@ snapshots: typescript@4.9.5: {} - typescript@5.1.6: {} - typescript@5.4.5: {} typescript@5.8.3: {} + typescript@5.9.2: {} + ua-parser-js@0.7.39: {} ufo@1.5.4: {} @@ -43193,15 +43240,15 @@ snapshots: optionalDependencies: typescript: 5.4.5 - vue@3.4.27(typescript@5.8.3): + vue@3.4.27(typescript@5.9.2): dependencies: '@vue/compiler-dom': 3.4.27 '@vue/compiler-sfc': 3.4.27 '@vue/runtime-dom': 3.4.27 - '@vue/server-renderer': 3.4.27(vue@3.4.27(typescript@5.8.3)) + '@vue/server-renderer': 3.4.27(vue@3.4.27(typescript@5.9.2)) '@vue/shared': 3.4.27 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 vue@3.5.13(typescript@5.8.3): dependencies: @@ -43295,7 +43342,7 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.3.2 - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) webpack-dev-middleware@6.1.2(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)): dependencies: @@ -43305,7 +43352,7 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.2 optionalDependencies: - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) webpack-dev-middleware@6.1.3(webpack@5.96.1(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.18.20)): dependencies: @@ -43384,7 +43431,7 @@ snapshots: webpack-dev-middleware: 5.3.4(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) ws: 8.18.0 optionalDependencies: - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) transitivePeerDependencies: - bufferutil - debug @@ -43540,26 +43587,26 @@ snapshots: supports-color: 8.1.1 through: 2.3.8 vinyl: 2.2.1 - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15)) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.6.3(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)))(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)): dependencies: typed-assert: 1.0.9 - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) optionalDependencies: html-webpack-plugin: 5.6.3(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) - webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.6.3(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)))(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)): + webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.6.3(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0)))(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)): dependencies: typed-assert: 1.0.9 - webpack: 5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) optionalDependencies: - html-webpack-plugin: 5.6.3(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)) + html-webpack-plugin: 5.6.3(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0)) - webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.6.3(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))))(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)): + webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.6.3(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)))(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)): dependencies: typed-assert: 1.0.9 - webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0) + webpack: 5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1) optionalDependencies: html-webpack-plugin: 5.6.3(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1)) @@ -43567,7 +43614,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15)): + webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.14.1 @@ -43589,7 +43636,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))) + terser-webpack-plugin: 5.3.14(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -43597,7 +43644,7 @@ snapshots: - esbuild - uglify-js - webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0): + webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@4.10.0): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.14.1 @@ -43619,15 +43666,17 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0)(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) + terser-webpack-plugin: 5.3.14(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack@5.94.0) watchpack: 2.4.2 webpack-sources: 3.2.3 + optionalDependencies: + webpack-cli: 4.10.0(webpack@5.94.0) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@4.10.0): + webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.14.1 @@ -43653,20 +43702,20 @@ snapshots: watchpack: 2.4.2 webpack-sources: 3.2.3 optionalDependencies: - webpack-cli: 4.10.0(webpack@5.94.0) + webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.94.0) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4): + webpack@5.96.1(@swc/core@1.9.2(@swc/helpers@0.5.15)): dependencies: + '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.14.0 - acorn-import-attributes: 1.9.5(acorn@8.14.0) browserslist: 4.24.4 chrome-trace-event: 1.0.4 enhanced-resolve: 5.17.1 @@ -43681,17 +43730,15 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack@5.94.0) + terser-webpack-plugin: 5.3.14(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack@5.96.1(@swc/core@1.9.2(@swc/helpers@0.5.15))) watchpack: 2.4.2 webpack-sources: 3.2.3 - optionalDependencies: - webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.94.0) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.96.1(@swc/core@1.9.2(@swc/helpers@0.5.15)): + webpack@5.96.1(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.18.20): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.6 @@ -43713,7 +43760,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack@5.96.1(@swc/core@1.9.2(@swc/helpers@0.5.15))) + terser-webpack-plugin: 5.3.14(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.18.20)(webpack@5.96.1(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.18.20)) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -43721,7 +43768,7 @@ snapshots: - esbuild - uglify-js - webpack@5.96.1(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.18.20): + webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.6 @@ -43741,15 +43788,16 @@ snapshots: loader-runner: 4.3.0 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 3.3.0 + schema-utils: 4.3.2 tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.18.20)(webpack@5.96.1(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.18.20)) + terser-webpack-plugin: 5.3.14(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0)(webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.0)) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js + optional: true webpack@5.98.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.25.1): dependencies: @@ -43885,9 +43933,9 @@ snapshots: readable-stream: 3.6.2 triple-beam: 1.4.1 - winston@3.10.0: + winston@3.17.0: dependencies: - '@colors/colors': 1.5.0 + '@colors/colors': 1.6.0 '@dabh/diagnostics': 2.0.3 async: 3.2.6 is-stream: 2.0.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 0749b3c05db9..2d29198ed935 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -42,7 +42,7 @@ catalogs: "@typescript-eslint/eslint-plugin": 5.62.0 "@typescript-eslint/parser": 5.62.0 tools: - "devextreme-internal-tools": 18.0.0-beta.15 + "devextreme-internal-tools": 18.0.0 "prettier": 3.5.3 "ts-node": 10.9.2 "@types/node": 20.12.8 From cfbf57f280ebfcd81dd7676b8df4ed91dfd635a9 Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Mon, 25 Aug 2025 20:36:07 +0300 Subject: [PATCH 053/101] fix(demos): add `process.env.NODE_ENV` polyfill for framework demos (#30868) --- apps/demos/configs/Angular/config.js | 6 ++++++ apps/demos/configs/React/config.js | 6 ++++++ apps/demos/configs/ReactJs/config.js | 6 ++++++ apps/demos/configs/Vue/config.js | 6 ++++++ apps/demos/utils/shared/process.js | 5 +++++ 5 files changed, 29 insertions(+) create mode 100644 apps/demos/utils/shared/process.js diff --git a/apps/demos/configs/Angular/config.js b/apps/demos/configs/Angular/config.js index d3b5f3017121..0cf54a1cdc14 100644 --- a/apps/demos/configs/Angular/config.js +++ b/apps/demos/configs/Angular/config.js @@ -98,6 +98,11 @@ window.config = { experimentalDecorators: true, }, meta: { + '*': { + 'globals': { + 'process': 'process', + }, + }, 'typescript': { 'exports': 'ts', }, @@ -156,6 +161,7 @@ window.config = { 'externals:': '../../../../bundles/externals/', }, map: { + 'process': '../../../../utils/shared/process.js', 'ts': 'npm:plugin-typescript/lib/plugin.js', 'typescript': 'npm:typescript/lib/typescript.js', 'jszip': 'npm:jszip/dist/jszip.min.js', diff --git a/apps/demos/configs/React/config.js b/apps/demos/configs/React/config.js index 65a0d32b39da..27a5e2a13f39 100644 --- a/apps/demos/configs/React/config.js +++ b/apps/demos/configs/React/config.js @@ -8,6 +8,11 @@ window.config = { jsx: 'react', }, meta: { + '*': { + 'globals': { + 'process': 'process', + }, + }, 'react': { 'esModule': true, }, @@ -49,6 +54,7 @@ window.config = { }, defaultExtension: 'js', map: { + 'process': '../../../../utils/shared/process.js', 'ts': 'npm:plugin-typescript/lib/plugin.js', 'typescript': 'npm:typescript/lib/typescript.js', 'jszip': 'npm:jszip/dist/jszip.min.js', diff --git a/apps/demos/configs/ReactJs/config.js b/apps/demos/configs/ReactJs/config.js index 65a0d32b39da..79a591539de5 100644 --- a/apps/demos/configs/ReactJs/config.js +++ b/apps/demos/configs/ReactJs/config.js @@ -8,6 +8,11 @@ window.config = { jsx: 'react', }, meta: { + '*': { + globals: { + process: 'process', + }, + }, 'react': { 'esModule': true, }, @@ -49,6 +54,7 @@ window.config = { }, defaultExtension: 'js', map: { + 'process': '../../../../utils/shared/process.js', 'ts': 'npm:plugin-typescript/lib/plugin.js', 'typescript': 'npm:typescript/lib/typescript.js', 'jszip': 'npm:jszip/dist/jszip.min.js', diff --git a/apps/demos/configs/Vue/config.js b/apps/demos/configs/Vue/config.js index 80649173d748..d4ced720ed13 100644 --- a/apps/demos/configs/Vue/config.js +++ b/apps/demos/configs/Vue/config.js @@ -2,6 +2,11 @@ window.exports = window.exports || {}; window.config = { transpiler: 'plugin-babel', meta: { + '*': { + 'globals': { + 'process': 'process', + }, + }, '*.vue': { loader: 'vue-loader', }, @@ -46,6 +51,7 @@ window.config = { 'externals:': '../../../../bundles/externals/', }, map: { + 'process': '../../../../utils/shared/process.js', 'vue': 'npm:vue/dist/vue.esm-browser.js', '@vue/shared': 'npm:@vue/shared/dist/shared.cjs.prod.js', 'vue-loader': 'npm:dx-systemjs-vue-browser/index.js', diff --git a/apps/demos/utils/shared/process.js b/apps/demos/utils/shared/process.js new file mode 100644 index 000000000000..8cb8cc6bca12 --- /dev/null +++ b/apps/demos/utils/shared/process.js @@ -0,0 +1,5 @@ +module.exports = { + env: { + NODE_ENV: "production", + }, +}; From b5b754a7f533aba5ea9819135b9ead74a96b451f Mon Sep 17 00:00:00 2001 From: Julia Volkova Date: Tue, 26 Aug 2025 09:15:55 +0300 Subject: [PATCH 054/101] Selection: remove m_ prefix from file names (#30869) Co-authored-by: Julia Volkova --- .../grids/grid_core/selection/m_selection.ts | 2 +- .../new/grid_core/selection/controller.ts | 2 +- .../ui/collection/collection_widget.edit.ts | 2 +- ...rred.ts => selection.strategy.deferred.ts} | 12 ++--- ...dard.ts => selection.strategy.standard.ts} | 48 +++++++++---------- ...tion.strategy.ts => selection.strategy.ts} | 13 ++--- .../{m_selection.ts => selection.ts} | 5 +- .../js/__internal/ui/selection/types.ts | 4 +- ..._manager.items_list.thumbnails.list_box.js | 2 +- .../DevExpress.ui.widgets/selection.test.js | 2 +- 10 files changed, 40 insertions(+), 52 deletions(-) rename packages/devextreme/js/__internal/ui/selection/{m_selection.strategy.deferred.ts => selection.strategy.deferred.ts} (95%) rename packages/devextreme/js/__internal/ui/selection/{m_selection.strategy.standard.ts => selection.strategy.standard.ts} (94%) rename packages/devextreme/js/__internal/ui/selection/{m_selection.strategy.ts => selection.strategy.ts} (96%) rename packages/devextreme/js/__internal/ui/selection/{m_selection.ts => selection.ts} (98%) diff --git a/packages/devextreme/js/__internal/grids/grid_core/selection/m_selection.ts b/packages/devextreme/js/__internal/grids/grid_core/selection/m_selection.ts index 4ba18c6921a5..c058a835c882 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/selection/m_selection.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/selection/m_selection.ts @@ -21,7 +21,7 @@ import type { ContextMenuController } from '@ts/grids/grid_core/context_menu/m_c import type { ModuleType } from '@ts/grids/grid_core/m_types'; import type { StateStoringController } from '@ts/grids/grid_core/state_storing/m_state_storing_core'; import type { RowsView } from '@ts/grids/grid_core/views/m_rows_view'; -import Selection from '@ts/ui/selection/m_selection'; +import Selection from '@ts/ui/selection/selection'; import type { DataController } from '../data_controller/m_data_controller'; import modules from '../m_modules'; diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/selection/controller.ts b/packages/devextreme/js/__internal/grids/new/grid_core/selection/controller.ts index 4f68cdf4e686..262bb9e907c5 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/selection/controller.ts +++ b/packages/devextreme/js/__internal/grids/new/grid_core/selection/controller.ts @@ -8,7 +8,7 @@ import { computed, effect, signal } from '@ts/core/state_manager/index'; import { DataController } from '@ts/grids/new/grid_core/data_controller/index'; import { OptionsValidationController } from '@ts/grids/new/grid_core/options_validation/index'; import { ShowCheckBoxesMode } from '@ts/grids/new/grid_core/selection/const'; -import Selection from '@ts/ui/selection/m_selection'; +import Selection from '@ts/ui/selection/selection'; import type { CardInfo } from '../columns_controller/types'; import type { DataObject, Key } from '../data_controller/types'; diff --git a/packages/devextreme/js/__internal/ui/collection/collection_widget.edit.ts b/packages/devextreme/js/__internal/ui/collection/collection_widget.edit.ts index f93f5a41f603..5c7ef9261393 100644 --- a/packages/devextreme/js/__internal/ui/collection/collection_widget.edit.ts +++ b/packages/devextreme/js/__internal/ui/collection/collection_widget.edit.ts @@ -29,7 +29,7 @@ import type { import BaseCollectionWidget from '@ts/ui/collection/collection_widget.base'; import PlainEditStrategy from '@ts/ui/collection/collection_widget.edit.strategy.plain'; import type DataController from '@ts/ui/collection/m_data_controller'; -import Selection from '@ts/ui/selection/m_selection'; +import Selection from '@ts/ui/selection/selection'; import type { CollectionItemIndex } from './collection_widget.edit.strategy'; diff --git a/packages/devextreme/js/__internal/ui/selection/m_selection.strategy.deferred.ts b/packages/devextreme/js/__internal/ui/selection/selection.strategy.deferred.ts similarity index 95% rename from packages/devextreme/js/__internal/ui/selection/m_selection.strategy.deferred.ts rename to packages/devextreme/js/__internal/ui/selection/selection.strategy.deferred.ts index a58a555134ff..d6e370a5d233 100644 --- a/packages/devextreme/js/__internal/ui/selection/m_selection.strategy.deferred.ts +++ b/packages/devextreme/js/__internal/ui/selection/selection.strategy.deferred.ts @@ -3,7 +3,7 @@ import type { DeferredObj } from '@js/core/utils/deferred'; import { Deferred } from '@js/core/utils/deferred'; import { isString } from '@js/core/utils/type'; import errors from '@js/ui/widget/ui.errors'; -import SelectionStrategy from '@ts/ui/selection/m_selection.strategy'; +import SelectionStrategy from '@ts/ui/selection/selection.strategy'; import type { KeyExpr, SelectionFilter, SelectionItem } from '@ts/ui/selection/types'; export default class DeferredStrategy< @@ -147,7 +147,6 @@ export default class DeferredStrategy< } } - // eslint-disable-next-line class-methods-use-this _findSubFilter( selectionFilter: SelectionFilter | undefined, filter: SelectionFilter | undefined, @@ -176,7 +175,6 @@ export default class DeferredStrategy< return false; } - // eslint-disable-next-line class-methods-use-this _addFilterOperator(selectionFilter: SelectionFilter, filterOperator: 'and' | 'or'): SelectionFilter { let filter = selectionFilter; if ( @@ -194,7 +192,6 @@ export default class DeferredStrategy< return filter; } - // eslint-disable-next-line class-methods-use-this _denormalizeFilter(filter: SelectionFilter): SelectionFilter { let resultFilter = filter; if (resultFilter && isString(resultFilter[0])) { @@ -203,7 +200,6 @@ export default class DeferredStrategy< return resultFilter; } - // eslint-disable-next-line class-methods-use-this _isOnlyNegativeFiltersLeft(filters: SelectionFilter): boolean { return filters.every((filterItem, i) => { if (i % 2 === 0) { @@ -255,7 +251,6 @@ export default class DeferredStrategy< this._setOption('selectionFilter', !isDeselect && !selectionFilter.length ? null : selectionFilter); } - // eslint-disable-next-line class-methods-use-this _normalizeFilter(filter: SelectionFilter): SelectionFilter { let resultFilter = filter; if (resultFilter && resultFilter.length === 1) { @@ -264,7 +259,6 @@ export default class DeferredStrategy< return resultFilter; } - // eslint-disable-next-line class-methods-use-this _removeFilterByIndex(filter: SelectionFilter, filterIndex: number, isSelectAll?: boolean): void { const operation = filter[1]; @@ -279,7 +273,6 @@ export default class DeferredStrategy< } } - // eslint-disable-next-line class-methods-use-this _isSimpleKeyFilter( filter: SelectionFilter | undefined, key: string | Function | undefined, @@ -357,6 +350,7 @@ export default class DeferredStrategy< isSelectAll, ); if (innerFilterIndex >= 0) { + // eslint-disable-next-line max-depth if (!selectionFilter[i].length) { this._removeFilterByIndex(selectionFilter, i, isSelectAll); } else if (selectionFilter[i].length === 1) { @@ -376,7 +370,7 @@ export default class DeferredStrategy< if (!selectionFilter) return true; if (!selectionFilter.length) return false; - if (!filter || !filter.length) return undefined; + if (!filter?.length) return undefined; selectionFilter = this._denormalizeFilter(selectionFilter); diff --git a/packages/devextreme/js/__internal/ui/selection/m_selection.strategy.standard.ts b/packages/devextreme/js/__internal/ui/selection/selection.strategy.standard.ts similarity index 94% rename from packages/devextreme/js/__internal/ui/selection/m_selection.strategy.standard.ts rename to packages/devextreme/js/__internal/ui/selection/selection.strategy.standard.ts index 9cb7e30aaa59..4e1ae4bd8b5d 100644 --- a/packages/devextreme/js/__internal/ui/selection/m_selection.strategy.standard.ts +++ b/packages/devextreme/js/__internal/ui/selection/selection.strategy.standard.ts @@ -7,7 +7,7 @@ import { Deferred, when } from '@js/core/utils/deferred'; import { SelectionFilterCreator } from '@js/core/utils/selection_filter'; import { isDefined, isNumeric, isObject } from '@js/core/utils/type'; import errors from '@js/ui/widget/ui.errors'; -import SelectionStrategy from '@ts/ui/selection/m_selection.strategy'; +import SelectionStrategy from '@ts/ui/selection/selection.strategy'; import type { PendingOptions, RequestData, @@ -241,33 +241,34 @@ export default class StandardStrategy< removedItems: [], keys: [], }; - let lastRequestData: RequestData = multiSelectEnabled - ? this._lastRequestData ?? emptyData - : emptyData; - if (multiSelectEnabled) { - if (this._shouldMergeWithLastRequest) { - if (isDeselectAll) { + if (!multiSelectEnabled) { + return emptyData; + } + + let lastRequestData: RequestData = this._lastRequestData ?? emptyData; + + if (this._shouldMergeWithLastRequest) { + if (isDeselectAll) { + this._lastLoadDeferred?.reject(); + lastRequestData = {} as RequestData; + } else if (!isKeysEqual(keys, this.options.selectedItemKeys)) { + oldRequestItems.added = lastRequestData?.addedItems; + oldRequestItems.removed = lastRequestData?.removedItems; + + if (!isDeselect) { this._lastLoadDeferred?.reject(); - lastRequestData = {} as RequestData; - } else if (!isKeysEqual(keys, this.options.selectedItemKeys)) { - oldRequestItems.added = lastRequestData?.addedItems; - oldRequestItems.removed = lastRequestData?.removedItems; - - if (!isDeselect) { - this._lastLoadDeferred?.reject(); - } } } - - lastRequestData = this._concatRequestsItems( - keys, - oldRequestItems, - isDeselect, - this._shouldMergeWithLastRequest ? undefined : updatedKeys, - ); } + lastRequestData = this._concatRequestsItems( + keys, + oldRequestItems, + isDeselect, + this._shouldMergeWithLastRequest ? undefined : updatedKeys, + ); + return lastRequestData; } @@ -415,8 +416,7 @@ export default class StandardStrategy< return selectedItemKeys .findIndex( - (_, index) => (!ignoreIndicesMap || !ignoreIndicesMap[index]) - && this.equalKeys(selectedItemKeys[index], key), + (_, index) => !ignoreIndicesMap?.[index] && this.equalKeys(selectedItemKeys[index], key), ); } diff --git a/packages/devextreme/js/__internal/ui/selection/m_selection.strategy.ts b/packages/devextreme/js/__internal/ui/selection/selection.strategy.ts similarity index 96% rename from packages/devextreme/js/__internal/ui/selection/m_selection.strategy.ts rename to packages/devextreme/js/__internal/ui/selection/selection.strategy.ts index b99c0cff800d..932eb2111af9 100644 --- a/packages/devextreme/js/__internal/ui/selection/m_selection.strategy.ts +++ b/packages/devextreme/js/__internal/ui/selection/selection.strategy.ts @@ -26,8 +26,6 @@ export default class SelectionStrategy< _lastSelectAllPageDeferred = Deferred().reject(); constructor(options: SelectionOptions) { - // eslint-disable-next-line no-console - console.log('i tried so hard and got'); this.options = options; this._setOption('disabledItemKeys', []); @@ -41,7 +39,6 @@ export default class SelectionStrategy< this._setOption('addedItems', []); } - // eslint-disable-next-line class-methods-use-this validate(): void {} _setOption(name: string, value: unknown): void { @@ -127,7 +124,6 @@ export default class SelectionStrategy< return equalByValue(key1, key2); } - // eslint-disable-next-line class-methods-use-this getSelectableItems(items: TItem[]): TItem[] { return items.filter((item) => !item?.disabled); } @@ -289,7 +285,6 @@ export default class SelectionStrategy< return false; } - // eslint-disable-next-line class-methods-use-this selectedItemKeys( // eslint-disable-next-line @typescript-eslint/no-unused-vars keys: TKey[], @@ -308,23 +303,23 @@ export default class SelectionStrategy< } isItemKeySelected(itemKey: TKey | TItem): boolean; - // eslint-disable-next-line @typescript-eslint/no-unused-vars, class-methods-use-this + // eslint-disable-next-line @typescript-eslint/no-unused-vars isItemKeySelected(itemKey: TKey | TItem, options: { checkPending?: boolean } = {}): boolean { throw new Error('isItemKeySelected method should be overriden'); } isItemDataSelected(itemKey: TKey | TItem): boolean; - // eslint-disable-next-line @typescript-eslint/no-unused-vars, class-methods-use-this + // eslint-disable-next-line @typescript-eslint/no-unused-vars isItemDataSelected(itemKey: TKey | TItem, options: { checkPending?: boolean } = {}): boolean { throw new Error('isItemKeySelected method should be overriden'); } - // eslint-disable-next-line @typescript-eslint/no-unused-vars, class-methods-use-this + // eslint-disable-next-line @typescript-eslint/no-unused-vars addSelectedItem(itemKey: TKey, dataOrIsSelectAll?: TItem | boolean, skipFilter?: boolean): void { throw new Error('addSelectedItem method should be overriden'); } - // eslint-disable-next-line @typescript-eslint/no-unused-vars, class-methods-use-this + // eslint-disable-next-line @typescript-eslint/no-unused-vars removeSelectedItem(itemKey: TKey): void { throw new Error('removeSelectedItem method should be overriden'); } diff --git a/packages/devextreme/js/__internal/ui/selection/m_selection.ts b/packages/devextreme/js/__internal/ui/selection/selection.ts similarity index 98% rename from packages/devextreme/js/__internal/ui/selection/m_selection.ts rename to packages/devextreme/js/__internal/ui/selection/selection.ts index 2d2d6dd57096..cf5ba98cbb3f 100644 --- a/packages/devextreme/js/__internal/ui/selection/m_selection.ts +++ b/packages/devextreme/js/__internal/ui/selection/selection.ts @@ -2,8 +2,8 @@ import { noop } from '@js/core/utils/common'; import { Deferred, type DeferredObj, when } from '@js/core/utils/deferred'; import { extend } from '@js/core/utils/extend'; import { isDefined, isPlainObject } from '@js/core/utils/type'; -import DeferredStrategy from '@ts/ui/selection/m_selection.strategy.deferred'; -import StandardStrategy from '@ts/ui/selection/m_selection.strategy.standard'; +import DeferredStrategy from '@ts/ui/selection/selection.strategy.deferred'; +import StandardStrategy from '@ts/ui/selection/selection.strategy.standard'; import type { DefaultOptions, PendingOptions, @@ -45,7 +45,6 @@ export default class Selection< } } - // eslint-disable-next-line class-methods-use-this _getDefaultOptions(): DefaultOptions { const defaultOptions: DefaultOptions = { allowNullValue: false, diff --git a/packages/devextreme/js/__internal/ui/selection/types.ts b/packages/devextreme/js/__internal/ui/selection/types.ts index b597238a19b5..7056d5aced2a 100644 --- a/packages/devextreme/js/__internal/ui/selection/types.ts +++ b/packages/devextreme/js/__internal/ui/selection/types.ts @@ -2,8 +2,8 @@ import type { LoadResult } from '@js/common/data'; import type { FilterDescriptor, LoadOptions, SelectDescriptor } from '@js/common/data.types'; import type { DeferredObj } from '@js/core/utils/deferred'; import type { Cancelable } from '@js/events'; -import type DeferredStrategy from '@ts/ui/selection/m_selection.strategy.deferred'; -import type StandardStrategy from '@ts/ui/selection/m_selection.strategy.standard'; +import type DeferredStrategy from '@ts/ui/selection/selection.strategy.deferred'; +import type StandardStrategy from '@ts/ui/selection/selection.strategy.standard'; export type SelectionFilter = FilterDescriptor[]; diff --git a/packages/devextreme/js/ui/file_manager/ui.file_manager.items_list.thumbnails.list_box.js b/packages/devextreme/js/ui/file_manager/ui.file_manager.items_list.thumbnails.list_box.js index fc1d3ed5c127..de85c6958d30 100644 --- a/packages/devextreme/js/ui/file_manager/ui.file_manager.items_list.thumbnails.list_box.js +++ b/packages/devextreme/js/ui/file_manager/ui.file_manager.items_list.thumbnails.list_box.js @@ -12,7 +12,7 @@ import { BindableTemplate } from '../../core/templates/bindable_template'; import ScrollView from '../scroll_view'; import CollectionWidget from '../collection/ui.collection_widget.edit'; -import Selection from '../../__internal/ui/selection/m_selection'; +import Selection from '../../__internal/ui/selection/selection'; const FILE_MANAGER_THUMBNAILS_VIEW_PORT_CLASS = 'dx-filemanager-thumbnails-view-port'; const FILE_MANAGER_THUMBNAILS_ITEM_LIST_CONTAINER_CLASS = 'dx-filemanager-thumbnails-container'; diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/selection.test.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/selection.test.js index 0c447c1acc6a..f5b880beeb58 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/selection.test.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/selection.test.js @@ -1,6 +1,6 @@ import $ from 'jquery'; import errors from 'ui/widget/ui.errors'; -import Selection from '__internal/ui/selection/m_selection'; +import Selection from '__internal/ui/selection/selection'; import Guid from 'core/guid'; import { DataSource } from 'common/data/data_source/data_source'; import { CustomStore } from 'common/data/custom_store'; From 6ad39ee0c1df4a03f089c7bbf943ca590086829e Mon Sep 17 00:00:00 2001 From: Mikhail Preyskurantov <5574159+mpreyskurantov@users.noreply.github.com> Date: Tue, 26 Aug 2025 12:22:43 +0300 Subject: [PATCH 055/101] DropDownEditor / fieldAddons .d.ts - Tune up generated code (#30857) --- .../src/ui/color-box/index.ts | 3 - .../src/ui/drop-down-box/index.ts | 3 - .../src/ui/nested/base/field-addons.ts | 26 ------- .../src/ui/nested/base/index.ts | 1 - .../src/ui/nested/field-addons.ts | 71 ------------------- .../devextreme-angular/src/ui/nested/index.ts | 1 - .../src/ui/select-box/index.ts | 3 - .../src/ui/tag-box/index.ts | 3 - .../make-angular-metadata.ts | 1 + .../drop_down_editor/ui.drop_down_editor.d.ts | 2 - 10 files changed, 1 insertion(+), 113 deletions(-) delete mode 100644 packages/devextreme-angular/src/ui/nested/base/field-addons.ts delete mode 100644 packages/devextreme-angular/src/ui/nested/field-addons.ts diff --git a/packages/devextreme-angular/src/ui/color-box/index.ts b/packages/devextreme-angular/src/ui/color-box/index.ts index cbe35f18c4f3..a62eaf27d5bd 100644 --- a/packages/devextreme-angular/src/ui/color-box/index.ts +++ b/packages/devextreme-angular/src/ui/color-box/index.ts @@ -60,7 +60,6 @@ import { DxoMyModule } from 'devextreme-angular/ui/nested'; import { DxoOffsetModule } from 'devextreme-angular/ui/nested'; import { DxoToModule } from 'devextreme-angular/ui/nested'; import { DxoShowModule } from 'devextreme-angular/ui/nested'; -import { DxoFieldAddonsModule } from 'devextreme-angular/ui/nested'; import { DxoColorBoxAnimationModule } from 'devextreme-angular/ui/color-box/nested'; import { DxoColorBoxAtModule } from 'devextreme-angular/ui/color-box/nested'; @@ -1307,7 +1306,6 @@ export class DxColorBoxComponent extends DxComponent implements OnDestroy, Contr DxoOffsetModule, DxoToModule, DxoShowModule, - DxoFieldAddonsModule, DxoColorBoxAnimationModule, DxoColorBoxAtModule, DxoColorBoxBoundaryOffsetModule, @@ -1343,7 +1341,6 @@ export class DxColorBoxComponent extends DxComponent implements OnDestroy, Contr DxoOffsetModule, DxoToModule, DxoShowModule, - DxoFieldAddonsModule, DxoColorBoxAnimationModule, DxoColorBoxAtModule, DxoColorBoxBoundaryOffsetModule, diff --git a/packages/devextreme-angular/src/ui/drop-down-box/index.ts b/packages/devextreme-angular/src/ui/drop-down-box/index.ts index 19b6116e8652..c5631b26bffa 100644 --- a/packages/devextreme-angular/src/ui/drop-down-box/index.ts +++ b/packages/devextreme-angular/src/ui/drop-down-box/index.ts @@ -63,7 +63,6 @@ import { DxoMyModule } from 'devextreme-angular/ui/nested'; import { DxoOffsetModule } from 'devextreme-angular/ui/nested'; import { DxoToModule } from 'devextreme-angular/ui/nested'; import { DxoShowModule } from 'devextreme-angular/ui/nested'; -import { DxoFieldAddonsModule } from 'devextreme-angular/ui/nested'; import { DxiItemModule } from 'devextreme-angular/ui/nested'; import { DxoDropDownBoxAnimationModule } from 'devextreme-angular/ui/drop-down-box/nested'; @@ -1387,7 +1386,6 @@ export class DxDropDownBoxComponent extends DxComponent implements OnDestroy, Co DxoOffsetModule, DxoToModule, DxoShowModule, - DxoFieldAddonsModule, DxiItemModule, DxoDropDownBoxAnimationModule, DxoDropDownBoxAtModule, @@ -1424,7 +1422,6 @@ export class DxDropDownBoxComponent extends DxComponent implements OnDestroy, Co DxoOffsetModule, DxoToModule, DxoShowModule, - DxoFieldAddonsModule, DxiItemModule, DxoDropDownBoxAnimationModule, DxoDropDownBoxAtModule, diff --git a/packages/devextreme-angular/src/ui/nested/base/field-addons.ts b/packages/devextreme-angular/src/ui/nested/base/field-addons.ts deleted file mode 100644 index f3560350c254..000000000000 --- a/packages/devextreme-angular/src/ui/nested/base/field-addons.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* tslint:disable:max-line-length */ - -import { NestedOption } from 'devextreme-angular/core'; -import { - Component, -} from '@angular/core'; - - -@Component({ - template: '' -}) -export abstract class DxoFieldAddons extends NestedOption { - get afterTemplate(): any { - return this._getOption('afterTemplate'); - } - set afterTemplate(value: any) { - this._setOption('afterTemplate', value); - } - - get beforeTemplate(): any { - return this._getOption('beforeTemplate'); - } - set beforeTemplate(value: any) { - this._setOption('beforeTemplate', value); - } -} diff --git a/packages/devextreme-angular/src/ui/nested/base/index.ts b/packages/devextreme-angular/src/ui/nested/base/index.ts index 628dcbf286ed..de74c6df0cfc 100644 --- a/packages/devextreme-angular/src/ui/nested/base/index.ts +++ b/packages/devextreme-angular/src/ui/nested/base/index.ts @@ -19,7 +19,6 @@ export * from './data-change-dxi'; export * from './data-grid-column-dxi'; export * from './data-grid-toolbar'; export * from './diagram-custom-command-dxi'; -export * from './field-addons'; export * from './file-manager-context-menu'; export * from './file-manager-toolbar-item-dxi'; export * from './file-uploader-options'; diff --git a/packages/devextreme-angular/src/ui/nested/field-addons.ts b/packages/devextreme-angular/src/ui/nested/field-addons.ts deleted file mode 100644 index bea687b90fee..000000000000 --- a/packages/devextreme-angular/src/ui/nested/field-addons.ts +++ /dev/null @@ -1,71 +0,0 @@ -/* tslint:disable:max-line-length */ - -/* tslint:disable:use-input-property-decorator */ - -import { - Component, - OnInit, - OnDestroy, - NgModule, - Host, - SkipSelf -} from '@angular/core'; - - - - - -import { - DxIntegrationModule, - NestedOptionHost, -} from 'devextreme-angular/core'; -import { DxoFieldAddons } from './base/field-addons'; - - -@Component({ - selector: 'dxo-field-addons', - standalone: true, - template: '', - styles: [''], - imports: [ DxIntegrationModule ], - providers: [NestedOptionHost], - inputs: [ - 'afterTemplate', - 'beforeTemplate' - ] -}) -export class DxoFieldAddonsComponent extends DxoFieldAddons implements OnDestroy, OnInit { - - protected get _optionPath() { - return 'fieldAddons'; - } - - - constructor(@SkipSelf() @Host() parentOptionHost: NestedOptionHost, - @Host() optionHost: NestedOptionHost) { - super(); - parentOptionHost.setNestedOption(this); - optionHost.setHost(this, this._fullOptionPath.bind(this)); - } - - - ngOnInit() { - this._addRecreatedComponent(); - } - - ngOnDestroy() { - this._addRemovedOption(this._getOptionPath()); - } - - -} - -@NgModule({ - imports: [ - DxoFieldAddonsComponent - ], - exports: [ - DxoFieldAddonsComponent - ], -}) -export class DxoFieldAddonsModule { } diff --git a/packages/devextreme-angular/src/ui/nested/index.ts b/packages/devextreme-angular/src/ui/nested/index.ts index d664eefc2787..7c291f7dc04e 100644 --- a/packages/devextreme-angular/src/ui/nested/index.ts +++ b/packages/devextreme-angular/src/ui/nested/index.ts @@ -67,7 +67,6 @@ export * from './drop-down-options'; export * from './edges'; export * from './editing'; export * from './export'; -export * from './field-addons'; export * from './field-chooser'; export * from './field-dxi'; export * from './field-panel'; diff --git a/packages/devextreme-angular/src/ui/select-box/index.ts b/packages/devextreme-angular/src/ui/select-box/index.ts index 290a31047bdd..e32f1f3e82a0 100644 --- a/packages/devextreme-angular/src/ui/select-box/index.ts +++ b/packages/devextreme-angular/src/ui/select-box/index.ts @@ -64,7 +64,6 @@ import { DxoMyModule } from 'devextreme-angular/ui/nested'; import { DxoOffsetModule } from 'devextreme-angular/ui/nested'; import { DxoToModule } from 'devextreme-angular/ui/nested'; import { DxoShowModule } from 'devextreme-angular/ui/nested'; -import { DxoFieldAddonsModule } from 'devextreme-angular/ui/nested'; import { DxiItemModule } from 'devextreme-angular/ui/nested'; import { DxoSelectBoxAnimationModule } from 'devextreme-angular/ui/select-box/nested'; @@ -1751,7 +1750,6 @@ export class DxSelectBoxComponent extends DxComponent implements OnDestroy, Cont DxoOffsetModule, DxoToModule, DxoShowModule, - DxoFieldAddonsModule, DxiItemModule, DxoSelectBoxAnimationModule, DxoSelectBoxAtModule, @@ -1789,7 +1787,6 @@ export class DxSelectBoxComponent extends DxComponent implements OnDestroy, Cont DxoOffsetModule, DxoToModule, DxoShowModule, - DxoFieldAddonsModule, DxiItemModule, DxoSelectBoxAnimationModule, DxoSelectBoxAtModule, diff --git a/packages/devextreme-angular/src/ui/tag-box/index.ts b/packages/devextreme-angular/src/ui/tag-box/index.ts index eecd70d2c548..f69548ce6348 100644 --- a/packages/devextreme-angular/src/ui/tag-box/index.ts +++ b/packages/devextreme-angular/src/ui/tag-box/index.ts @@ -64,7 +64,6 @@ import { DxoMyModule } from 'devextreme-angular/ui/nested'; import { DxoOffsetModule } from 'devextreme-angular/ui/nested'; import { DxoToModule } from 'devextreme-angular/ui/nested'; import { DxoShowModule } from 'devextreme-angular/ui/nested'; -import { DxoFieldAddonsModule } from 'devextreme-angular/ui/nested'; import { DxiItemModule } from 'devextreme-angular/ui/nested'; import { DxoTagBoxAnimationModule } from 'devextreme-angular/ui/tag-box/nested'; @@ -1893,7 +1892,6 @@ export class DxTagBoxComponent extends DxComponent implements OnDestroy, Control DxoOffsetModule, DxoToModule, DxoShowModule, - DxoFieldAddonsModule, DxiItemModule, DxoTagBoxAnimationModule, DxoTagBoxAtModule, @@ -1931,7 +1929,6 @@ export class DxTagBoxComponent extends DxComponent implements OnDestroy, Control DxoOffsetModule, DxoToModule, DxoShowModule, - DxoFieldAddonsModule, DxiItemModule, DxoTagBoxAnimationModule, DxoTagBoxAtModule, diff --git a/packages/devextreme-metadata/make-angular-metadata.ts b/packages/devextreme-metadata/make-angular-metadata.ts index 623b02401227..fedf64f99a2b 100644 --- a/packages/devextreme-metadata/make-angular-metadata.ts +++ b/packages/devextreme-metadata/make-angular-metadata.ts @@ -12,6 +12,7 @@ Ng.makeMetadata({ mutations: [ removeMembers(/\/calendar:dxCalendarOptions.todayButtonText/), removeMembers(/\/card_view:/), + removeMembers(/\/drop_down_editor\/ui.drop_down_editor:FieldAddons/), removeMembers(/\/scheduler:Toolbar/), removeMembers(/\/stepper:/), ], diff --git a/packages/devextreme/js/ui/drop_down_editor/ui.drop_down_editor.d.ts b/packages/devextreme/js/ui/drop_down_editor/ui.drop_down_editor.d.ts index 6705c8c8058d..b642b05b9f86 100644 --- a/packages/devextreme/js/ui/drop_down_editor/ui.drop_down_editor.d.ts +++ b/packages/devextreme/js/ui/drop_down_editor/ui.drop_down_editor.d.ts @@ -41,14 +41,12 @@ export interface DropDownButtonTemplateDataModel { */ export type FieldAddons = { /** - * @namespace DevExpress.ui * @docid * @type_function_param1 data:object * @type_function_return string|Element|jQuery */ beforeTemplate?: template | ((data: any, element: DxElement) => string | UserDefinedElement); /** - * @namespace DevExpress.ui * @docid * @type_function_param1 data:object * @type_function_return string|Element|jQuery From 2c9388fac5cd45f48b648b00864b1fe3fa407975 Mon Sep 17 00:00:00 2001 From: EugeniyKiyashko Date: Tue, 26 Aug 2025 13:43:15 +0400 Subject: [PATCH 056/101] Chart: scrollbar should be limited by a minimum width at high zoom levels (T1303348) (#30877) --- .../js/viz/chart_components/scroll_bar.js | 46 +- .../DevExpress.viz.charts/scrollBar.tests.js | 475 +++++++++++++++++- 2 files changed, 510 insertions(+), 11 deletions(-) diff --git a/packages/devextreme/js/viz/chart_components/scroll_bar.js b/packages/devextreme/js/viz/chart_components/scroll_bar.js index cb0a054dfe4b..9f0599541501 100644 --- a/packages/devextreme/js/viz/chart_components/scroll_bar.js +++ b/packages/devextreme/js/viz/chart_components/scroll_bar.js @@ -8,7 +8,7 @@ import { start as dragEventStart, move as dragEventMove, end as dragEventEnd } f const _min = Math.min; const _max = Math.max; -const MIN_SCROLL_BAR_SIZE = 2; +const MIN_SCROLL_BAR_SIZE = 10; export const ScrollBar = function(renderer, group) { this._translator = new Translator2D({}, {}, {}); @@ -221,16 +221,48 @@ ScrollBar.prototype = { const that = this; const visibleArea = that._translator.getCanvasVisibleArea(); - x1 = _max(x1, visibleArea.min); - x1 = _min(x1, visibleArea.max); + const min = visibleArea.min; + const max = visibleArea.max; - x2 = _min(x2, visibleArea.max); - x2 = _max(x2, visibleArea.min); + if(max <= min) { + return; + } + + if(x1 > x2) { + [x1, x2] = [x2, x1]; + } + + x1 = Math.max(x1, min); + x2 = Math.min(x2, max); + + if(x2 - x1 < MIN_SCROLL_BAR_SIZE) { + if(max - min < MIN_SCROLL_BAR_SIZE) { + x1 = min; + x2 = max; + } else { + const center = (x1 + x2) / 2; + + x1 = center - MIN_SCROLL_BAR_SIZE / 2; + x2 = center + MIN_SCROLL_BAR_SIZE / 2; + + if(x1 < min) { + x1 = min; + x2 = min + MIN_SCROLL_BAR_SIZE; + } else if(x2 > max) { + x2 = max; + x1 = max - MIN_SCROLL_BAR_SIZE; + } + } + } + + x1 = Math.max(x1, min); + x2 = Math.min(x2, max); + + const height = Math.max(x2 - x1, 0); - const height = Math.abs(x2 - x1); that._scroll.attr({ y: x1, - height: height < MIN_SCROLL_BAR_SIZE ? MIN_SCROLL_BAR_SIZE : height + height, }); } }; diff --git a/packages/devextreme/testing/tests/DevExpress.viz.charts/scrollBar.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.charts/scrollBar.tests.js index bfbb7dbfbffc..343b0665aea1 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.charts/scrollBar.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.charts/scrollBar.tests.js @@ -56,6 +56,473 @@ const environment = { }; +QUnit.module('_applyPosition method tests', { + beforeEach: function() { + environment.beforeEach.call(this); + this.group = new vizMocks.Element(); + this.scrollBar = new ScrollBar(this.renderer, this.group); + this.scrollTranslator = translator2DModule.Translator2D.lastCall.returnValue; + }, + afterEach: function() { + environment.afterEach.call(this); + } +}, () => { + QUnit.test('No visible area available (max <= min)', function(assert) { + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: 50, + max: 50 + }); + + this.scrollBar._applyPosition(10, 90); + + assert.ok(!this.group.children[0].attr.called, 'no attributes set when no visible area'); + }); + + QUnit.test('x1 > x2, should swap coordinates', function(assert) { + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: 10, + max: 100 + }); + + this.scrollBar._applyPosition(90, 30); + + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 30, + height: 60 + }, 'coordinates swapped correctly'); + }); + + QUnit.test('Extremely small scroll bar (x2 - x1 < MIN_SCROLL_BAR_SIZE) with center positioning', function(assert) { + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: 10, + max: 100 + }); + + this.scrollBar._applyPosition(45, 47); + + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 41, + height: 10 + }, 'min size applied and centered correctly'); + }); + + QUnit.test('Minimum size with center near boundaries', function(assert) { + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: 10, + max: 100 + }); + + this.scrollBar._applyPosition(12, 13); + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 10, + height: 10 + }, 'min size applied and adjusted to min edge'); + + this.scrollBar._applyPosition(97, 98); + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 90, + height: 10 + }, 'min size applied and adjusted to max edge'); + + this.scrollBar._applyPosition(10, 15); + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 10, + height: 10 + }, 'correctly handles minimum size at exact boundary'); + }); + + QUnit.test('Small visible area (less than MIN_SCROLL_BAR_SIZE)', function(assert) { + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: 10, + max: 15 + }); + + this.scrollBar._applyPosition(11, 13); + + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 10, + height: 5 + }, 'scrollbar takes entire available area'); + }); + + QUnit.test('Position outside visible area (x1 < min, x2 > max)', function(assert) { + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: 10, + max: 100 + }); + + this.scrollBar._applyPosition(5, 120); + + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 10, + height: 90 + }, 'scrollbar limited to visible area'); + }); + + QUnit.test('Position partially outside visible area (x1 < min)', function(assert) { + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: 10, + max: 100 + }); + + this.scrollBar._applyPosition(5, 50); + + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 10, + height: 40 + }, 'scrollbar x1 adjusted to min'); + }); + + QUnit.test('Position partially outside visible area (x2 > max)', function(assert) { + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: 10, + max: 100 + }); + + this.scrollBar._applyPosition(50, 120); + + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 50, + height: 50 + }, 'scrollbar x2 adjusted to max'); + }); + + QUnit.test('High zoom levels with small visible area', function(assert) { + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: 10, + max: 20 + }); + + this.scrollBar._applyPosition(14, 15); + + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 10, + height: 10 + }, 'min size applied and adjusted within small visible area'); + }); + + QUnit.test('Extreme case - zero height after calculations', function(assert) { + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: 10, + max: 100 + }); + this.group.children[0].attr = sinon.spy(function(settings) { + this._stored_settings = settings; + return this; + }); + + this.scrollBar._applyPosition(50, 50); + + assert.deepEqual(this.group.children[0]._stored_settings, { + y: 45, + height: 10 + }, 'height is set to MIN_SCROLL_BAR_SIZE and centered when positions are identical'); + }); + + QUnit.test('Handle x2 < x1 after boundary adjustments', function(assert) { + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: 50, + max: 60 + }); + + this.scrollBar._applyPosition(100, 20); + + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 50, + height: 10 + }, 'scrollbar corrected after boundary adjustments'); + }); + + QUnit.test('Negative coordinates', function(assert) { + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: -50, + max: 50 + }); + + this.scrollBar._applyPosition(-30, -10); + + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: -30, + height: 20 + }, 'correctly handles negative coordinates within bounds'); + }); + + QUnit.test('Negative and positive coordinates', function(assert) { + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: -50, + max: 50 + }); + + this.scrollBar._applyPosition(-30, 20); + + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: -30, + height: 50 + }, 'correctly handles mix of negative and positive coordinates'); + }); + + QUnit.test('Extremely large coordinates outside boundaries', function(assert) { + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: 0, + max: 100 + }); + + this.scrollBar._applyPosition(-10000, 10000); + + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 0, + height: 100 + }, 'limits extremely large coordinates to visible area'); + }); + + QUnit.test('Transition from no visible area to visible area', function(assert) { + const scrollBar = this.scrollBar; + this.scrollTranslator.getCanvasVisibleArea = sinon.stub(); + + // First, no visible area + this.scrollTranslator.getCanvasVisibleArea.returns({ + min: 50, + max: 50 + }); + + scrollBar._applyPosition(10, 90); + assert.ok(!this.group.children[0].attr.called, 'no attributes set when no visible area'); + + // Then visible area appears + this.scrollTranslator.getCanvasVisibleArea.returns({ + min: 10, + max: 100 + }); + + scrollBar._applyPosition(40, 60); + + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 40, + height: 20 + }, 'correctly transitions from no visible area to visible area'); + }); + + QUnit.test('ScrollBar natural size enforcement scenarios', function(assert) { + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: 10, + max: 100 + }); + + this.scrollBar._applyPosition(45, 48); + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 41.5, + height: 10 + }, '3 pixel natural size limited to minimum'); + + this.scrollTranslator.getCanvasVisibleArea.returns({ + min: 0, + max: 200 + }); + + this.scrollBar._applyPosition(100, 101); + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 95.5, + height: 10 + }, '1 pixel natural size enforced to minimum'); + + this.scrollTranslator.getCanvasVisibleArea.returns({ + min: 10, + max: 100 + }); + + this.scrollBar._applyPosition(50, 50); + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 45, + height: 10 + }, 'zero natural size enforced to minimum'); + + this.scrollTranslator.getCanvasVisibleArea.returns({ + min: 0, + max: 1000 + }); + + this.scrollBar._applyPosition(500, 500.5); + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 495.25, + height: 10 + }, 'fractional natural size enforced to minimum'); + + this.scrollTranslator.getCanvasVisibleArea.returns({ + min: 0, + max: 100 + }); + + this.scrollBar._applyPosition(40, 50); + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 40, + height: 10 + }, 'natural size exactly equal to minimum works correctly'); + }); + + QUnit.test('Minimum size scrollbar at boundary edge cases', function(assert) { + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: 0, + max: 20 + }); + + this.scrollBar._applyPosition(2, 3); + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 0, + height: 10 + }, 'minimum size scrollbar properly adjusted when too close to min edge'); + + this.scrollBar._applyPosition(17, 18); + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 10, + height: 10 + }, 'minimum size scrollbar properly adjusted when too close to max edge'); + }); + + QUnit.test('Invalid coordinates with NaN should be handled gracefully', function(assert) { + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: 10, + max: 100 + }); + + this.scrollBar._applyPosition(NaN, 50); + + assert.ok(this.group.children[0].attr.called, 'method executes without crashing when NaN coordinates provided'); + }); + + QUnit.test('Coordinates with Infinity should be handled gracefully', function(assert) { + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: 10, + max: 100 + }); + + this.scrollBar._applyPosition(Infinity, 50); + + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 50, + height: 50 + }, 'Infinity coordinates handled by existing Math operations'); + }); + + QUnit.test('High zoom level creates tiny natural size but enforces minimum', function(assert) { + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: 0, + max: 500 + }); + + this.scrollBar._applyPosition(249, 251); + + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 245, + height: 10 + }, 'high zoom level tiny size enforced to minimum'); + }); + + QUnit.test('Very large minimum size enforcement in tiny visible area', function(assert) { + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: 5, + max: 8 + }); + + this.scrollBar._applyPosition(6, 7); + + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 5, + height: 3 + }, 'when visible area smaller than min size, uses full available space'); + }); + + QUnit.test('Edge case: visible area exactly equals MIN_SCROLL_BAR_SIZE', function(assert) { + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: 0, + max: 10 + }); + + this.scrollBar._applyPosition(4, 5); + + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 0, + height: 10 + }, 'when visible area equals min size, scrollbar fills entire area'); + }); + + QUnit.test('Sequential calls with different sizes maintain minimum constraint', function(assert) { + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: 0, + max: 200 + }); + + this.scrollBar._applyPosition(50, 52); + const firstCall = this.group.children[0].attr.lastCall.args[0]; + + this.scrollBar._applyPosition(100, 100.5); + const secondCall = this.group.children[0].attr.lastCall.args[0]; + + assert.ok(firstCall.height >= 10, 'first call maintains minimum height: ' + firstCall.height); + assert.ok(secondCall.height >= 10, 'second call maintains minimum height: ' + secondCall.height); + assert.deepEqual(secondCall, { + y: 95.25, + height: 10 + }, 'sequential calls both enforce minimum size correctly'); + }); +}); + +QUnit.module('ScrollBar integration tests', { + beforeEach: function() { + environment.beforeEach.call(this); + this.group = new vizMocks.Element(); + this.scrollBar = new ScrollBar(this.renderer, this.group); + this.scrollTranslator = translator2DModule.Translator2D.lastCall.returnValue; + }, + afterEach: function() { + environment.afterEach.call(this); + } +}, () => { +}, () => { + QUnit.test('High zoom level integration with setPosition', function(assert) { + this.scrollBar.update(this.options); + + this.scrollTranslator.translate = sinon.stub(); + this.scrollTranslator.translate.withArgs('99.9').returns(50); + this.scrollTranslator.translate.withArgs('100').returns(50.1); + this.scrollTranslator.getScale = sinon.stub().returns(100); + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: 0, + max: 100 + }); + + this.scrollBar.setPosition('99.9', '100'); + + assert.deepEqual(this.group.children[0].attr.lastCall.args[0], { + y: 45.05, + height: 10 + }, 'applies minimum size at high zoom levels'); + }); + + QUnit.test('Integration with drag events at high zoom levels', function(assert) { + this.scrollBar.update(this.options); + + this.scrollTranslator.translate = sinon.stub(); + this.scrollTranslator.translate.withArgs('99.9').returns(45); + this.scrollTranslator.translate.withArgs('100').returns(45.1); + this.scrollTranslator.getScale = sinon.stub().returns(100); + this.scrollTranslator.getCanvasVisibleArea = sinon.stub().returns({ + min: 0, + max: 100 + }); + this.scrollTranslator.canvasLength = 100; + + this.scrollBar.setPosition('99.9', '100'); + + this.scrollBar._offset = 45; + + this.scrollBar._applyPosition(40, 40.1); + + assert.ok(this.group.children[0].attr.called, 'scrollbar updated during drag'); + const lastCallArgs = this.group.children[0].attr.lastCall.args[0]; + assert.ok(lastCallArgs.height >= 10, 'minimum size maintained during drag: ' + lastCallArgs.height); + }); +}); + QUnit.module('dxChart scrollBar', environment); QUnit.test('create scrollBar', function(assert) { @@ -412,8 +879,8 @@ QUnit.test('setPosition by arguments. min = max', function(assert) { scrollBar.setPosition('40', '40'); // Assert assert.deepEqual(group.children[0]._stored_settings, { - y: 45, - height: 2 + y: 40, + height: 10 }); }); @@ -433,8 +900,8 @@ QUnit.test('setPosition by arguments. minSize', function(assert) { scrollBar.setPosition('40', '41'); // Assert assert.deepEqual(group.children[0]._stored_settings, { - y: 45, - height: 2 + y: 40.95, + height: 10 }); }); From c4266301e4719b6577a08d29092a1c2fac8501e1 Mon Sep 17 00:00:00 2001 From: Anna Shakhova <68295572+anna-shakhova@users.noreply.github.com> Date: Tue, 26 Aug 2025 12:23:55 +0200 Subject: [PATCH 057/101] Charts: fix Point type in events (#30757) Co-authored-by: Mikhail Preyskurantov <5574159+mpreyskurantov@users.noreply.github.com> --- .../Angular/app/app.component.html | 2 +- .../Angular/app/app.component.ts | 13 ++-- .../Charts/PointSelectionAPI/React/App.tsx | 13 ++-- .../Charts/PointSelectionAPI/ReactJs/App.js | 12 ++-- .../Charts/PointSelectionAPI/Vue/App.vue | 12 ++-- .../Charts/PointSelectionAPI/jQuery/index.js | 6 +- packages/devextreme/js/viz/chart.d.ts | 12 ++-- .../js/viz/chart_components/base_chart.d.ts | 38 +++++++---- packages/devextreme/js/viz/pie_chart.d.ts | 12 ++-- packages/devextreme/js/viz/polar_chart.d.ts | 12 ++-- packages/devextreme/ts/dx.all.d.ts | 67 +++++++++++-------- 11 files changed, 115 insertions(+), 84 deletions(-) diff --git a/apps/demos/Demos/Charts/PointSelectionAPI/Angular/app/app.component.html b/apps/demos/Demos/Charts/PointSelectionAPI/Angular/app/app.component.html index 4f102b792eed..f70d7fb27c4c 100644 --- a/apps/demos/Demos/Charts/PointSelectionAPI/Angular/app/app.component.html +++ b/apps/demos/Demos/Charts/PointSelectionAPI/Angular/app/app.component.html @@ -3,8 +3,8 @@ [dataSource]="catBreedsData" [rotated]="true" title="Most Popular US Cat Breeds" - (onPointClick)="pointClick($event)" (onDone)="done($event)" + (onPointClick)="pointClick($event)" > diff --git a/apps/demos/Demos/Charts/PointSelectionAPI/Angular/app/app.component.ts b/apps/demos/Demos/Charts/PointSelectionAPI/Angular/app/app.component.ts index 193ccc9b3bd4..4eb7574d6dd6 100644 --- a/apps/demos/Demos/Charts/PointSelectionAPI/Angular/app/app.component.ts +++ b/apps/demos/Demos/Charts/PointSelectionAPI/Angular/app/app.component.ts @@ -1,7 +1,7 @@ import { NgModule, Component, enableProdMode } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; -import { DxChartModule, DxChartTypes } from 'devextreme-angular/ui/chart'; +import { DxChartModule, type DxChartTypes } from 'devextreme-angular/ui/chart'; import { Service, CatBreed } from './app.service'; if (!/localhost/.test(document.location.host)) { @@ -27,17 +27,18 @@ export class AppComponent { this.catBreedsData = service.getCatBreedsData(); } - pointClick({ target: point }: DxChartTypes.PointClickEvent) { + done(e: DxChartTypes.DoneEvent) { + e.component.getSeriesByPos(0).getPointsByArg('Siamese')[0].select(); + } + + pointClick(e: DxChartTypes.PointClickEvent) { + const point = e.target; if (point.isSelected()) { point.clearSelection(); } else { point.select(); } } - - done(e: DxChartTypes.DoneEvent) { - e.component.getSeriesByPos(0).getPointsByArg('Siamese')[0].select(); - } } @NgModule({ diff --git a/apps/demos/Demos/Charts/PointSelectionAPI/React/App.tsx b/apps/demos/Demos/Charts/PointSelectionAPI/React/App.tsx index 1008e4ce8db8..0fd82feab5a7 100644 --- a/apps/demos/Demos/Charts/PointSelectionAPI/React/App.tsx +++ b/apps/demos/Demos/Charts/PointSelectionAPI/React/App.tsx @@ -1,19 +1,22 @@ import React from 'react'; -import Chart, { +import { + Chart, CommonSeriesSettings, Series, SelectionStyle, Hatching, Legend, Export, + type ChartTypes, } from 'devextreme-react/chart'; import { catBreedsData } from './data.ts'; -function onDone({ component }) { - component.getSeriesByPos(0).getPointsByArg('Siamese')[0].select(); +function onDone(e: ChartTypes.DoneEvent) { + e.component.getSeriesByPos(0).getPointsByArg('Siamese')[0].select(); } -function onPointClick({ target: point }) { +function onPointClick(e: ChartTypes.PointClickEvent) { + const point = e.target; if (point.isSelected()) { point.clearSelection(); } else { @@ -27,9 +30,9 @@ function App() { id="chart" dataSource={catBreedsData} rotated={true} + title="Most Popular US Cat Breeds" onDone={onDone} onPointClick={onPointClick} - title="Most Popular US Cat Breeds" > diff --git a/apps/demos/Demos/Menu/Scrolling/Vue/data.ts b/apps/demos/Demos/Menu/Scrolling/Vue/data.ts index fe6d5bf69e31..def802c158c8 100644 --- a/apps/demos/Demos/Menu/Scrolling/Vue/data.ts +++ b/apps/demos/Demos/Menu/Scrolling/Vue/data.ts @@ -1,4 +1,6 @@ -const products = [ +import type { ProductType } from './types'; + +const products: ProductType[] = [ { text: 'Electronics', items: [ diff --git a/apps/demos/Demos/Menu/Scrolling/Vue/types.ts b/apps/demos/Demos/Menu/Scrolling/Vue/types.ts new file mode 100644 index 000000000000..e55751ab4ee6 --- /dev/null +++ b/apps/demos/Demos/Menu/Scrolling/Vue/types.ts @@ -0,0 +1,8 @@ +interface ProductItemType { + text: string; +} + +export interface ProductType { + text: string; + items: (ProductType | ProductItemType)[]; +} diff --git a/apps/demos/Demos/Scheduler/ContextMenu/Angular/app/app.component.ts b/apps/demos/Demos/Scheduler/ContextMenu/Angular/app/app.component.ts index d57a9464911c..34b5d5acb7a4 100644 --- a/apps/demos/Demos/Scheduler/ContextMenu/Angular/app/app.component.ts +++ b/apps/demos/Demos/Scheduler/ContextMenu/Angular/app/app.component.ts @@ -3,9 +3,15 @@ import { } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; -import { DxSchedulerModule, DxSchedulerComponent, DxSchedulerTypes } from 'devextreme-angular/ui/scheduler'; -import { DxContextMenuModule, DxContextMenuTypes } from 'devextreme-angular/ui/context-menu'; -import { Appointment, Resource, Service } from './app.service'; + +import { + DxSchedulerModule, + DxSchedulerComponent, + type DxSchedulerTypes +} from 'devextreme-angular/ui/scheduler'; +import { DxContextMenuModule, type DxContextMenuTypes } from 'devextreme-angular/ui/context-menu'; + +import { Service, type Appointment, type Resource, type ContextMenuItem } from './app.service'; if (!/localhost/.test(document.location.host)) { enableProdMode(); @@ -56,7 +62,7 @@ export class AppComponent { const resourceItems = this.resourcesData .map((item) => ({ ...item, - onItemClick: ({ itemData }) => scheduler.updateAppointment(appointmentData, { + onItemClick: ({ itemData }: DxContextMenuTypes.ItemClickEvent) => scheduler.updateAppointment(appointmentData, { ...appointmentData, ...{ roomId: [itemData.id] }, }), @@ -129,8 +135,8 @@ export class AppComponent { ]; } - onContextMenuItemClick(e: DxContextMenuTypes.ItemClickEvent) { - (e.itemData as unknown & { onItemClick: Function }).onItemClick(e); + onContextMenuItemClick(e: DxContextMenuTypes.ItemClickEvent) { + e.itemData.onItemClick(e); } } diff --git a/apps/demos/Demos/Scheduler/ContextMenu/Angular/app/app.service.ts b/apps/demos/Demos/Scheduler/ContextMenu/Angular/app/app.service.ts index 353f0a2cb3c9..a9161e169628 100644 --- a/apps/demos/Demos/Scheduler/ContextMenu/Angular/app/app.service.ts +++ b/apps/demos/Demos/Scheduler/ContextMenu/Angular/app/app.service.ts @@ -1,4 +1,5 @@ import { Injectable } from '@angular/core'; +import { type DxContextMenuTypes } from 'devextreme-angular/ui/context-menu'; export interface Appointment { text: string; @@ -15,6 +16,10 @@ export interface Resource { color: string; } +export type ContextMenuItem = DxContextMenuTypes.Item & Resource & { + onItemClick?: (e: DxContextMenuTypes.ItemClickEvent) => void +} + const appointments: Appointment[] = [ { text: 'Watercolor Landscape', diff --git a/apps/demos/Demos/Scheduler/ContextMenu/React/App.tsx b/apps/demos/Demos/Scheduler/ContextMenu/React/App.tsx index e626c8a8bc8d..6ad7ebb127f3 100644 --- a/apps/demos/Demos/Scheduler/ContextMenu/React/App.tsx +++ b/apps/demos/Demos/Scheduler/ContextMenu/React/App.tsx @@ -1,19 +1,19 @@ import React, { useCallback, useRef, useState } from 'react'; -import Scheduler, { Resource, type SchedulerTypes, SchedulerRef } from 'devextreme-react/scheduler'; -import ContextMenu, { type ContextMenuTypes } from 'devextreme-react/context-menu'; -import { data, resourcesData, Resource as ResourceItem } from './data.ts'; -import AppointmentMenuTemplate from './AppointmentTemplate.tsx'; -// eslint-disable-next-line no-unused-vars -type ContextMenuItem = ContextMenuTypes.Item & ResourceItem & { onItemClick?: (e: ContextMenuTypes.ItemClickEvent) => void }; +import { Scheduler, Resource, type SchedulerTypes, SchedulerRef } from 'devextreme-react/scheduler'; +import { ContextMenu, type ContextMenuTypes } from 'devextreme-react/context-menu'; + +import AppointmentMenuTemplate from './AppointmentTemplate.tsx'; +import { data, resourcesData } from './data.ts'; +import type { ContextMenuItem } from './types'; const views: SchedulerTypes.ViewType[] = ['day', 'month']; const appointmentClassName = '.dx-scheduler-appointment'; const cellClassName = '.dx-scheduler-date-table-cell'; -const onContextMenuItemClick = (e: ContextMenuTypes.ItemClickEvent) => { - (e.itemData as ContextMenuItem).onItemClick?.(e); +const onContextMenuItemClick = (e: ContextMenuTypes.ItemClickEvent) => { + e.itemData.onItemClick?.(e); }; const App = () => { @@ -31,9 +31,9 @@ const App = () => { const resourceItems: ContextMenuItem[] = resourcesData.map((item) => ({ ...item, - onItemClick: (e) => scheduler?.updateAppointment(appointmentData, { + onItemClick: (e: ContextMenuTypes.ItemClickEvent) => scheduler?.updateAppointment(appointmentData, { ...appointmentData, - ...{ roomId: [(e.itemData as ContextMenuItem).id] }, + ...{ roomId: [e.itemData.id] }, }), })); diff --git a/apps/demos/Demos/Scheduler/ContextMenu/React/data.ts b/apps/demos/Demos/Scheduler/ContextMenu/React/data.ts index 56ba44a33ad5..4f5e4c3d0cb4 100644 --- a/apps/demos/Demos/Scheduler/ContextMenu/React/data.ts +++ b/apps/demos/Demos/Scheduler/ContextMenu/React/data.ts @@ -1,12 +1,4 @@ -import { SchedulerTypes } from 'devextreme-react/scheduler'; - -type Appointment = SchedulerTypes.Appointment & { roomId: number[] }; - -export type Resource = { - id?: number; - text: string; - color?: string; -}; +import type { Appointment, Resource } from './types'; export const data: Appointment[] = [ { diff --git a/apps/demos/Demos/Scheduler/ContextMenu/React/types.ts b/apps/demos/Demos/Scheduler/ContextMenu/React/types.ts new file mode 100644 index 000000000000..f771684e69dc --- /dev/null +++ b/apps/demos/Demos/Scheduler/ContextMenu/React/types.ts @@ -0,0 +1,12 @@ +import { SchedulerTypes } from 'devextreme-react/scheduler'; +import { type ContextMenuTypes } from 'devextreme-react/context-menu'; + +export type Appointment = SchedulerTypes.Appointment & { roomId: number[] }; + +export type Resource = { + id?: number; + text: string; + color?: string; +}; + +export type ContextMenuItem = ContextMenuTypes.Item & Resource & { onItemClick?: (e: ContextMenuTypes.ItemClickEvent) => void }; diff --git a/apps/demos/Demos/Scheduler/ContextMenu/ReactJs/App.js b/apps/demos/Demos/Scheduler/ContextMenu/ReactJs/App.js index d15df29d3233..6a7283466ce7 100644 --- a/apps/demos/Demos/Scheduler/ContextMenu/ReactJs/App.js +++ b/apps/demos/Demos/Scheduler/ContextMenu/ReactJs/App.js @@ -1,8 +1,8 @@ import React, { useCallback, useRef, useState } from 'react'; -import Scheduler, { Resource } from 'devextreme-react/scheduler'; -import ContextMenu from 'devextreme-react/context-menu'; -import { data, resourcesData } from './data.js'; +import { Scheduler, Resource } from 'devextreme-react/scheduler'; +import { ContextMenu } from 'devextreme-react/context-menu'; import AppointmentMenuTemplate from './AppointmentTemplate.js'; +import { data, resourcesData } from './data.js'; const views = ['day', 'month']; const appointmentClassName = '.dx-scheduler-appointment'; diff --git a/apps/demos/Demos/Scheduler/ContextMenu/Vue/App.vue b/apps/demos/Demos/Scheduler/ContextMenu/Vue/App.vue index 5d7c50310a2f..682c0b9ddd6f 100644 --- a/apps/demos/Demos/Scheduler/ContextMenu/Vue/App.vue +++ b/apps/demos/Demos/Scheduler/ContextMenu/Vue/App.vue @@ -38,10 +38,11 @@ diff --git a/apps/demos/Demos/Scheduler/ContextMenu/Vue/types.ts b/apps/demos/Demos/Scheduler/ContextMenu/Vue/types.ts new file mode 100644 index 000000000000..fa6270ed6e35 --- /dev/null +++ b/apps/demos/Demos/Scheduler/ContextMenu/Vue/types.ts @@ -0,0 +1,11 @@ +import type { DxContextMenuTypes } from 'devextreme-vue/context-menu'; + +interface ResourceItem { + text: string; + id: number; + color: string; +} + +export type ContextMenuItem = DxContextMenuTypes.Item & Partial & { + onItemClick?: (e: DxContextMenuTypes.ItemClickEvent) => void +}; diff --git a/apps/demos/Demos/TreeView/ContextMenuIntegration/Angular/app/app.component.ts b/apps/demos/Demos/TreeView/ContextMenuIntegration/Angular/app/app.component.ts index 1365d2d672be..4214c308b4bb 100644 --- a/apps/demos/Demos/TreeView/ContextMenuIntegration/Angular/app/app.component.ts +++ b/apps/demos/Demos/TreeView/ContextMenuIntegration/Angular/app/app.component.ts @@ -3,10 +3,12 @@ import { } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + import { DxListModule } from 'devextreme-angular'; -import { DxTreeViewComponent, DxTreeViewModule, DxTreeViewTypes } from 'devextreme-angular/ui/tree-view'; -import { DxContextMenuModule, DxContextMenuComponent, DxContextMenuTypes } from 'devextreme-angular/ui/context-menu'; -import { Product, Service, MenuItem } from './app.service'; +import { DxTreeViewComponent, DxTreeViewModule, type DxTreeViewTypes } from 'devextreme-angular/ui/tree-view'; +import { DxContextMenuModule, DxContextMenuComponent, type DxContextMenuTypes } from 'devextreme-angular/ui/context-menu'; + +import { Service, type Product, type MenuItem } from './app.service'; if (!/localhost/.test(document.location.host)) { enableProdMode(); @@ -25,9 +27,9 @@ if (window && window.config?.packageConfigPaths) { providers: [Service], }) export class AppComponent { - @ViewChild(DxTreeViewComponent, { static: false }) treeView: DxTreeViewComponent; + @ViewChild(DxTreeViewComponent, { static: false }) treeView: DxTreeViewComponent; - @ViewChild(DxContextMenuComponent, { static: false }) contextMenu: DxContextMenuComponent; + @ViewChild(DxContextMenuComponent, { static: false }) contextMenu: DxContextMenuComponent; products: Product[]; @@ -45,21 +47,21 @@ export class AppComponent { treeViewItemContextMenu(e: DxTreeViewTypes.ItemContextMenuEvent) { this.selectedTreeItem = e.itemData; - const isProduct = e.itemData.price !== undefined; + const isProductItem = !e.itemData.items; const contextMenu = this.contextMenu.instance; - contextMenu.option('items[0].visible', !isProduct); - contextMenu.option('items[1].visible', !isProduct); - contextMenu.option('items[2].visible', isProduct); - contextMenu.option('items[3].visible', isProduct); + contextMenu.option('items[0].visible', !isProductItem); + contextMenu.option('items[1].visible', !isProductItem); + contextMenu.option('items[2].visible', isProductItem); + contextMenu.option('items[3].visible', isProductItem); contextMenu.option('items[0].disabled', e.node.expanded); contextMenu.option('items[1].disabled', !e.node.expanded); } - contextMenuItemClick(e: DxContextMenuTypes.ItemClickEvent) { + contextMenuItemClick(e: DxContextMenuTypes.ItemClickEvent) { let logEntry = ''; const treeView = this.treeView.instance; - switch ((e.itemData as Product).id) { + switch (e.itemData.id) { case 'expand': { logEntry = `The '${this.selectedTreeItem.text}' group was expanded`; treeView.expandItem(this.selectedTreeItem.id); diff --git a/apps/demos/Demos/TreeView/ContextMenuIntegration/Angular/app/app.service.ts b/apps/demos/Demos/TreeView/ContextMenuIntegration/Angular/app/app.service.ts index d80a6742c85d..7b5dc1fe655f 100644 --- a/apps/demos/Demos/TreeView/ContextMenuIntegration/Angular/app/app.service.ts +++ b/apps/demos/Demos/TreeView/ContextMenuIntegration/Angular/app/app.service.ts @@ -1,17 +1,23 @@ import { Injectable } from '@angular/core'; -export class Product { +export class ProductItem { id: string; text: string; - expanded?: boolean; + price: number; - items?: Product[]; + image: string; +} - price?: number; +export class Product { + id: string; + + text: string; + + expanded?: boolean; - image?: string; + items: (Product | ProductItem)[]; } export class MenuItem { diff --git a/apps/demos/Demos/TreeView/ContextMenuIntegration/React/App.tsx b/apps/demos/Demos/TreeView/ContextMenuIntegration/React/App.tsx index 00b22bc4ecf2..0f8833f53bdd 100644 --- a/apps/demos/Demos/TreeView/ContextMenuIntegration/React/App.tsx +++ b/apps/demos/Demos/TreeView/ContextMenuIntegration/React/App.tsx @@ -1,6 +1,7 @@ import React, { useCallback, useRef, useState } from 'react'; -import TreeView, { type TreeViewTypes } from 'devextreme-react/tree-view'; -import ContextMenu, { type ContextMenuTypes } from 'devextreme-react/context-menu'; + +import { TreeView, type TreeViewTypes } from 'devextreme-react/tree-view'; +import { ContextMenu, type ContextMenuTypes } from 'devextreme-react/context-menu'; import List from 'devextreme-react/list'; import service from './data.ts'; @@ -13,25 +14,25 @@ const App = () => { const contextMenuRef = useRef(null); const treeViewRef = useRef(null); const [logItems, setLogItems] = useState([]); - const [selectedTreeItem, setSelectedTreeItem] = useState(undefined); + const [selectedTreeItem, setSelectedTreeItem] = useState(undefined); const treeViewItemContextMenu = useCallback(( e: TreeViewTypes.ItemContextMenuEvent, ) => { setSelectedTreeItem(e.itemData); - const isProduct = e.itemData.price !== undefined; - contextMenuRef.current.instance().option('items[0].visible', !isProduct); - contextMenuRef.current.instance().option('items[1].visible', !isProduct); - contextMenuRef.current.instance().option('items[2].visible', isProduct); - contextMenuRef.current.instance().option('items[3].visible', isProduct); + const isProductItem = !e.itemData.items; + contextMenuRef.current.instance().option('items[0].visible', !isProductItem); + contextMenuRef.current.instance().option('items[1].visible', !isProductItem); + contextMenuRef.current.instance().option('items[2].visible', isProductItem); + contextMenuRef.current.instance().option('items[3].visible', isProductItem); contextMenuRef.current.instance().option('items[0].disabled', e.node.expanded); contextMenuRef.current.instance().option('items[1].disabled', !e.node.expanded); }, []); const contextMenuItemClick = useCallback(( - e: ContextMenuTypes.ItemClickEvent & { itemData: { id?: any; }; }, + e: ContextMenuTypes.ItemClickEvent, ) => { let logEntry = ''; switch (e.itemData.id) { @@ -58,7 +59,7 @@ const App = () => { } const updatedLogItems = [...logItems, logEntry]; setLogItems(updatedLogItems); - }, [logItems, selectedTreeItem, setLogItems]); + }, [logItems, selectedTreeItem]); return (
diff --git a/apps/demos/Demos/TreeView/ContextMenuIntegration/React/types.ts b/apps/demos/Demos/TreeView/ContextMenuIntegration/React/types.ts index 8a09bd046bc7..836121d6d8cd 100644 --- a/apps/demos/Demos/TreeView/ContextMenuIntegration/React/types.ts +++ b/apps/demos/Demos/TreeView/ContextMenuIntegration/React/types.ts @@ -1,8 +1,13 @@ +interface ProductItem { + id: string; + text: string; + price: number; + image: string; +} + export interface Product { id: string; text: string; expanded?: boolean; - items?: Product[]; - price?: number; - image?: string; + items: (Product | ProductItem)[]; } diff --git a/apps/demos/Demos/TreeView/ContextMenuIntegration/ReactJs/App.js b/apps/demos/Demos/TreeView/ContextMenuIntegration/ReactJs/App.js index 0bf3ed9f07da..0a32a6ada678 100644 --- a/apps/demos/Demos/TreeView/ContextMenuIntegration/ReactJs/App.js +++ b/apps/demos/Demos/TreeView/ContextMenuIntegration/ReactJs/App.js @@ -1,6 +1,6 @@ import React, { useCallback, useRef, useState } from 'react'; -import TreeView from 'devextreme-react/tree-view'; -import ContextMenu from 'devextreme-react/context-menu'; +import { TreeView } from 'devextreme-react/tree-view'; +import { ContextMenu } from 'devextreme-react/context-menu'; import List from 'devextreme-react/list'; import service from './data.js'; @@ -13,11 +13,11 @@ const App = () => { const [selectedTreeItem, setSelectedTreeItem] = useState(undefined); const treeViewItemContextMenu = useCallback((e) => { setSelectedTreeItem(e.itemData); - const isProduct = e.itemData.price !== undefined; - contextMenuRef.current.instance().option('items[0].visible', !isProduct); - contextMenuRef.current.instance().option('items[1].visible', !isProduct); - contextMenuRef.current.instance().option('items[2].visible', isProduct); - contextMenuRef.current.instance().option('items[3].visible', isProduct); + const isProductItem = !e.itemData.items; + contextMenuRef.current.instance().option('items[0].visible', !isProductItem); + contextMenuRef.current.instance().option('items[1].visible', !isProductItem); + contextMenuRef.current.instance().option('items[2].visible', isProductItem); + contextMenuRef.current.instance().option('items[3].visible', isProductItem); contextMenuRef.current.instance().option('items[0].disabled', e.node.expanded); contextMenuRef.current.instance().option('items[1].disabled', !e.node.expanded); }, []); @@ -49,7 +49,7 @@ const App = () => { const updatedLogItems = [...logItems, logEntry]; setLogItems(updatedLogItems); }, - [logItems, selectedTreeItem, setLogItems], + [logItems, selectedTreeItem], ); return (
diff --git a/apps/demos/Demos/TreeView/ContextMenuIntegration/Vue/App.vue b/apps/demos/Demos/TreeView/ContextMenuIntegration/Vue/App.vue index f019048f8520..6fff20cf0638 100644 --- a/apps/demos/Demos/TreeView/ContextMenuIntegration/Vue/App.vue +++ b/apps/demos/Demos/TreeView/ContextMenuIntegration/Vue/App.vue @@ -31,33 +31,33 @@

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 VAHx-g9pXFZ%$Pepck28N{{@KP-%J1i diff --git a/e2e/testcafe-devextreme/tests/common/etalons/SVG icon set (fluent-blue-light).png b/e2e/testcafe-devextreme/tests/common/etalons/SVG icon set (fluent-blue-light).png index 4a6e3ba2d40205efd23dd02ce21334c77e87c274..fbfa0bafda83ee4c64e8bad44c068dda525cfd3e 100644 GIT binary patch delta 41725 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 px+hX3{Hc1=rcDu17g>{- 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 z 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 diff --git a/e2e/testcafe-devextreme/tests/common/etalons/SVG icon set (generic-light).png b/e2e/testcafe-devextreme/tests/common/etalons/SVG icon set (generic-light).png index 13743a93f38c23c083228d5b6980cecab732ae64..3aa7873f18b7aa755e1f87fabb396608bedaaa20 100644 GIT binary patch delta 41628 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 Pet_SYVJSm?zv%w}ZvUJ9 delta 36073 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 z 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 b>gW^faaYLlh=apKZa?~P;6r<+J+tON{wM~g diff --git a/e2e/testcafe-devextreme/tests/common/etalons/SVG icon set (material-blue-light).png b/e2e/testcafe-devextreme/tests/common/etalons/SVG icon set (material-blue-light).png index ba903c16c681255a8b45aca97f8231e701272ac6..146163257b797a548a3abe4c02ce49e12c082967 100644 GIT binary patch delta 44250 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 U{wx2B+PzOd;qDSQe%2fR1VMOPjQ{`u delta 38912 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 UP46f--fi*(&zBCo@cLW-13w*6CIA2c diff --git a/e2e/testcafe-devextreme/tests/common/icons.ts b/e2e/testcafe-devextreme/tests/common/icons.ts index 7d08c8f92d83..2de6c34afa6c 100644 --- a/e2e/testcafe-devextreme/tests/common/icons.ts +++ b/e2e/testcafe-devextreme/tests/common/icons.ts @@ -276,6 +276,8 @@ const iconSet = { fixcolumnleft: '\f17b', stickcolumn: '\f17c', fixcolumnright: '\f17d', + ratingoutline: '\f17f', + ratingfilled: '\f180', csv: '\f181', packagebox: '\f182', checkmarkcircle: '\f183', @@ -295,6 +297,8 @@ const iconSet = { groupbycolumn: '\f197', ungroupcolumn: '\f198', ungroupallcolumns: '\f199', + chatadd: '\f200', + colordismiss: '\f201', }; fixture.disablePageReloads`Icons` diff --git a/packages/devextreme-scss/icons/dxicons.ttf b/packages/devextreme-scss/icons/dxicons.ttf index 53f7b3672a18a1723fd77d989fba6eee261d813f..cbdc52a0f4a61a8425b3893a56854b9066a9bab4 100644 GIT binary patch delta 1403 zcmZ`%e@q*76#u@vw%6K~QcCY|9Iz{;r2|)`t1M7p8=K=tGGeBQ zmcJI~2tkg7Z3;m$O~e>ux-5$^3!4~>iNyGaF{pDf{H2Kzl1&q4=ezP_e|h=-c%Sz^ z@AKZ>z4ayP=VdBEfDmFNV}vHpA8+%NnX}Ap^n8K4r*AMmvLe1K69PQq8)xDdM)1x= zyo9&@%=y<&uMQ7?h4^biW~K*D#rsR&zx*X3*Sat+4xocs*8G5Y8nI(waP(p`8i;Qb zqKTd#?yHQuY)_U6nL|-jD z!WY3OO6UuK9|~||kE(eXXuHmq&3enka-WlmSoTvHOoomz>H5rqA);qY9RL(`m>2{? zW?YA{48}z5w=5#nq)$_OGX;Ibkfwr4O{BTKIuo%j^qPF!HAca#n2n4ZV;Y7!XW=-@IqE6ZEc_3ZK5OApAE)K91b!Ei{CjN3n4k!G zvZNvO3Na8Xx*5q8z*lEDC^CWx=prpmk-Of-2hr$*MK1(WlarIFN#NR`8mikNe{^li zy1HteT7yptpf&Yr!A9!(ojY(^od}%cJ#B(Q&p}#}B5Gz%TFI(Psr-$-Y?AC7Kc>^U z$Z1XI<(H|FL@wVhNixI8lGMiY`yd1M@qD`|1sNtNO6}XOPJNcO!r>^@YD*oC z3aga?1L&<;6^^13t+u4dQITcUgW(T(F99{$c4WmJjcr+3e_!QWvycy{s?;gwr&`Gc za3|_#@dv-S6HwqAH9*AV7#_MTVZ)&xwqU)@h6&_M(u)N zA8l$r;fWS+oiD3OgJ``!(3Oi%SHNH2;P;Uo)ZCbgB?Y5{F(3qDX!H2-}>PwWzCK1X=Gz7tSG zs;MTmg2uT$1?nVh6<_+b+g$yS7&Yo_koBd78@snMKO+H~{Bb6%nYx;pJn-JPaQ158 z`x>!kUe1?G delta 963 zcmY*YU1$?o6uxI>a_`t?l9)-S#huoo$s{&qXX&OhEgM^BlBQ`uji%HZ3u(-DTWF(& z`cPf5^+nK%>~{R2BB98#_?{v@_)vF+-3J#I7ZyUDteiZbG~oB zIX^J>@m=ouDmO=f5K>R(2~WP-o6|eIe$O3LZX-rZ<>K^j-(NjU2&l+^8ZXXFWAq_k z#VC$X9sh19HX|bcosdf_6Jy11qYHAGkSizgy)l6TyDQvBzJfeBQ9d@?g9-8ngb3-W zqowZR;;)lW3Axrv2&a{cv(wN5ZwRTR(bamSSRUISUAcgK0-HRXK00#@2gS3T{P9+b zTVGm)L#|WnXV;gUQE28*um9l8!x#K1?`*XK<)+bd{3^lGK?`e?QKp5z1PrvX1sat` z!|Vam2=lvl=z2a9QPoH!uj@NsRd4H}25B@mr! zKmS$m#@~>7q4vv>=bhunKSXDK$pnA()>2xi`YM0GAT+dZ)zx2N&VfQ@4wuCJFTSK((&|> l^x8mt;LN~-OfWN>d59fx7VyI>yr#9oIo5T#T3UVw{{u3$%qjo? diff --git a/packages/devextreme-scss/icons/dxicons.woff b/packages/devextreme-scss/icons/dxicons.woff index cbfc54ac0624ffe47e128f14139f3d2f40287c09..fd1dc2049166b6df4e84234cc3c669aea939b692 100644 GIT binary patch delta 1479 zcmZuxZ%h+s7=NF;wr^`GrL?^xa=@;XmI|}ZmODh&axIjqfH0`m4#TQA(SVppHs^=c zeK9%-LC(ZKo5ne}80Ml&jZ5~ysMDA%8(H>YA6&ATg-_dJhKptiuI{T!frDsbOYx^xn{}>>wd$E+a?MQ2)`fuZJ**v4`k;HPE|; zABRT94ia+KK!_o&p$ikkqdT)CO3wGA=xPmq_w&0W*@L+7g>lTkqyaqeWM6h<7sjsO zCLd^ct?v57{?P+tc%Y*vo^>&gLG6IojmPHBpmhZ**vZF4{T9mUA-jvP`cZ}a3Z}E{ zjdAuC5l}*sBfxV!M~i`)sL#I|{61NdB@FQl5o!aOU@*|@=8k7FvYg2r=iI%4U@#M? z6__u4g5b2-R&5;^xY5(SZe4fJje&u!bwxIpAk^f)T$$cgbpu!FCwQN*maBqF;BlgM z6>ugyy6U#W;RX};Dv4RcQ8Y9b)+o9=)>GZ?t5JU@;laqx>;CrDN zn){$~?7@_CX2v=706wpRp2F3txx(3-HvwA_#r~sBQ0QgQB^jbsmg!1PO-kd>EmxEL z)$tA!>nEGl!qh4-s-XIFaHObQ=#yoIQbm?~1)&Ivp-2$=BsoTDOp^N+LR-zH&PK1d z-e|1%dK;Zi3KlRsOB=m4bw*=djkmGXX$H&h%5ni}^e)Ouiy8~Eiuq@a?<_?=lds~)5ZZ&Ik=fZkx z(~!H`UENUK5NZf9!nUr?F^?#E#yY#U1=F?j!)u##C!L5y`^$0kM$NMyTaZ;wQT zbLUbx*;GZvU~9aiGu}E_QQ;`bTz@6k-l01wj_(YIo7RWJojj-8>zi~t_gJeuM~HEG z^LA_ko|KbH{qt};T&8N#<7;q)rI1s!fZqZRoZttMohTEBkj)+rk1YmfXgU~hgxtXhze*;^McExpx0 zPRYRKy{D4~wdHh4e)z-hAa^?YLyOdML8(;gl_n*rY*7Z4yUJ{gi)CW_V$-pi*q`xL z@sshtThp!Mt#?|Vwsp6?+jh3?QKC6nc(;GVtjna_^XCnvhASRj1vqCX;B20ZC^nX00W8) zuAx0R(5cfOJGj{k_8QpaIyid_y{k~mADKO6Ps2iX&^t`{xlz@!n_FA6U)8mD0&Qjd~OecpOT% z7<<_e3^n;>5#|At@&90h%Y~F7%M2+|_BVxs4FW0uG5UmG?A(7ukDIEw)NC@-W|z6u{M&qP1*{%x(7Iwx zTQkW>@=Wr5sylT&HJN(b($Vr)%j#+dEX^b`J2NwFiMFF{kJ^Ln Z!|iy9oxOk`-h6(Kgu~Y;m#2S_dE-E{7H4*i^V}0L1s(o<22- zVB;W&fc>qbs3KKl|9?D?1CH9bR^Z=*g~N?W4ef&4x+-<0?#1lp7Akc|H_`^-(RZay z1u`n7gmjiM;}Q}lZh#bU!4iV9+yTE3goH>7$=o0o zq=*em?nMPl-2%8jqqwEArRUC;>bCl3`0wkshHlBsmeP!Gt$o$jymT7UF!Zq}3kOUJ z(Vp|{6d7^O($DKvlPeeH5v&$namsI#Rs$;ouJF+D@Rt8Ur=k+fD$i3D<|=vF*rwg~ zK!XG69!Z$bczAhue8$@Too{C`)A2(+@jAZMt>P78JXz9(DoL4rF40teDFA#$3Xr7$ zpf7-9fvhV4+CLU}tL3c|u}zvYZ!dbtZHGh><^JAOt=$h0GDu$l9jT7KNa>P8(a0fI z7gAOJ|8_sP|1XxnE7AaqU=5`$|A{yJ@$n`4$;yd6?`4C`NnIFiZMSIY&{hN_0U`-uWJ2P&U*k?d%Kx|*Dj=>ArvU7U zuL-|H3JrLDW3*ycH}EUvv;X(NEfu7%0KZd}pgRnVx0PVCf~{r*tm?6_fQY{S50svId2x$Ry4xa;`86-rY!@}Imsp7-U=d2JreLq!vQWjtuL zNc<)S1jV$Vygis4OUz0KFVvr!%r`*%P6K!wt38(DB$c&l&lD2KYJ4)3s`M}#rP35f zs*!jq^B@`nR8rY6VoV+tgy2DLzj**!jR$+yY3( zQ)@;OMu4!Xmf3d2X`Rcwn|1&H!m?W}e%-2mfDGBF0u|HdO1`PSLSWFPi>OJK`hBq$ zo14)wpFHy0AmFo1%Ak>n5eWEU#83}rRig0=9&-?oHi}I2OvkY*yI>AG^}1kfaOvn$ zF&)B*X{Cq0%O2i*bvwBhQlb`Fz0>jGJS?zoG^`gKTPf9gW^+@n(nqR9v&@ka#-3j> zw&}wYPgGKl9AOA%$5F{*#acz!n~uEVXU=N#>u7~B(j8vzOtxSMF48K_v5byQ9x&{u~hY$=5bjW>3GA;5!F{0v(c0v4>agH+Wo!1CK9eh|(7~0lkS@A4-9zXe`hXK1*yppq;_7?wH!y)q$Cr zixr2|5DCtUD0{!a6C={y4UG=|o-bQYCtBrmc z0G=iWOv$IAa9_%EqJUME<&=|U)6)L^wV->Get4uQK~dkqd^|xT&eq%~&_) z3DYd8`o^1=n0~#urgTLFAFV0$cNre;3vhMtWn~t+u{ri(oUo{aRP!#2xOYdLHnFiZ~!q3dj!@VCGuI zGn}{DaG95Fznhu}+HN&zLyC^W z^qrP>Yj1T#AzAIrmxdb_=bQCnQt+`3OHu5U@r6>cPKzYaNfLy)pR7pCT`jk8&@Nf3 z?(q^$K6W5vkmjNED?ESy?mm!!MN*4>RhCIGCcwd_GExurMC^0z68#;JEWTupSWu90 zfi^fK?Gw})d|O*Y?xeVX&)qkzzOK&0w>J8BZlLv=?pb6o+7r8C=#pWVM0qE!B`PNf z9WM(>M0aSJSy+!0u<%x2fiz;fE52>${wf*HRJVXL>*E2i5aA;lvLMI_m{tednKunx zvASkcw-!G7BJqIH=i(r#Gtf!VQL%4T=iWXU?y>JvcW<%%x)o=w-5ET4+Y4Mtar=5d z`#xJwUw8eNHu^U%c2Y0NpLs%QWua7?DMxG+WVEP_qYkvW?au4d?yuTtWb5>?E$KD- zR$MX4ajvrVEx4gsijXTrYeMdiiZ#HTE}?|F`;>{Yx=yetCgPqE0)?EP+9Ks_W``ab zv|UWqAs<@h2R?Yg6blWmoPcq|W}uL0V)O~FGI;^-#i;dVIF9jsJP>v|JjK~rS{tH7 z+Axe_f|R7N>>#Fsfz4U`qQ77Pc?HaX%t10*GI1_C5MDzR3uliW$TZdAxD`sd2;MwU z^oSDed?%7SZSVR9(NFO`6 zSXtTJ)NFWqQ2KA$PoiW-?0Q2yv__~Iqj<{izg-bgaqFW6l42#*JltS-7ffVW&I;Aq zQ?o_Fw6pl`>{=vNbn1)G5@{EXRy=ARWRfiQz2q(^d!g*%hmV+kz3P{4UZQF9cllhV zLnyfqQuf+UkEuRTA|E|b=It7nZ(Wgj3#Hg{K$ra)G)`@@BgSsB-P7J{xb!-t$0!F&8As_Uerw@q<_YyCrEq z(Fn29wL1|t>6xZF5ryumvK$VV(3FVCUm)lY83>us9w)bj<8?A{?dkoiGKU$G3SzK3 z*^Q^QwPH^w1BC2bEI5cF9dR=bKjG&C$=N~fi2-ke{-IaGlI z$nhMIqd)$|WPO%zdJ`xfbeL|9gc2ELE%wR)Zs9WsMOZ6`c`B8*gLXG zdxHbLlN?VyweCM$buoS}pmsv>f`KAvf`AS_P`8XD4()*m2^Us+mQ}j)CypzcF%DY& zg_#Pw*A!~W4?2dQ=jI?6*+0_I=tC`w;GR2~2baBzF;X40fx@-#Ia0e}*3-*t$mXS2 zB)OPx2&@j`g*}&6IqyZ*y<91A$-%_~y03%h2w^(RS@h*|DiWq$ZPOS#iKHrG8H6VX zCrjLO_L8n3zh030OrPPGHzdQtUdI`->%$p%kS+I%78BZ#{B=bjSe}a8kJUyY(j37x(5i?;sQGEA=ww(JIg%EHDO2 zmY$nlvzCZH09oc7L5c(f36dcik?(w445q5ZL^1g2^)=JlbwkCB`nOmh2?sjy3AS!^>xy&ah0BlNRR3>(Q@tY;95nxSYt@zy-bE)t5QS8;Z zjmATTF*8s*4ickYQSTGfFgwm_ml-uoAcoZdPg;VaWm&URC~uXVZ>ILlmUC&-ZJn`O z2ArK&k=joKdJ8bOfwnyrMrg~(u#E&{oUodK(GOsR70N!#O*kG6IuZCI4N9O>pd!Nf z9A-2Mc2p@Ldpapy7c=B+CHrTRO*8*p!gfpjS3Pc7Z zZbp=}W?kL>qsA6tg0WE8U2NHTlX-~*k}eL63h#J*I95;vSyZ4x392al6`z;NP(fB2 zDJKVQh%`1P);yHxXcZ+K9^vK>YD9>}ui;?A-uO6>YAYeSg z9HYw);7dsihc(CDQxlh`6L&gpRfyAj*1}M?D}5NMXnCYWZs{Y8{{x#02ivm~V-DEM z%R&+vj9`nG$ZeAq>({4%P@;m9psZSJ6eiJnjs3X?^#Ajz^efbtBWy~JTsCI^CC&#v z0@R?R=%&Wc0SW_ECJrP_5`3lBK72+C=R&(%Chd_yCDV5dk*4m#k$M^K`{7VS4E(Hw znlv4?nWVFqCb$~urrkI@f{&*q2}2k!BUi$WfsT8%Huw&1*4un&$GEPXAxCm(QBWS- z(W^e*@2vC55UJG%j0PmyIkQ7$(y}$E2Ux@kFEc=frAP{iu!E!&`IGz2$a=~;9k|u1 zqOC~j8mz5NLdKO`LE;vd&~?gMkbI*W$&l6=sSz z#9@&#p0S7;{=FXAt}38R8v)jX?+~$>b!4mWDV@LXMK26Piof)%0WsW1EdjF zwO4GcZA^3OdN3nf998?($w)vNb#?Z5Cz(Lds(GihUN%}fx8}n!(&ijb2?|l5YsH@- zE#fjp9QK7d9*-_KqRP=_O2kJ<@kzEo_Capr$~rUE^pGntGTpr=l;H_NDj5bwB&5P) zFre-%%8VO}OHhZavL0qe*-g*fIZ_5aLQ1$?3@w6D&aSjSZlCdMDyvWO7-cs%S=_@m zP9lT-=m@tW9ZexYm2e8bS-nFS*eS!E{QfmZ?nvthPSZ5Dp;zMy-|IN@jcxFUu^A`_Y-(_sgIGJII{~zGsfUX z^@Pr@Fo}uk5>gHsB~6;P517*p3Vz(}E``&CW|~d^P|03Q)OsV<>5B4R*_r!E$bbqQ zD8WTPCxM~*S@^qKNh8v#0%qTLW@Q5$$nHlNMHzH&h_hpzsN6@-+7Ffen z&|xHpK~EJJ79HVi89+F<+@fT>+HVU>LZ_vylkdK7NkLPhJJxxYMtoB|Z;8=+fOp5W z;dDCUpr-rirnuARwz7NEMR64kA@c2xT5|sVc`hB*BbybuMmpEUevr(Tz6heg@=NGO z(~B!|-BLu$F=y$6MX_jUt6_J43`!?@FYrL~42_ow2~zQVoN3v|LBsdK$3@QPFR;zV zl9i#2rodd&^OJ(nlz9gS?FuJb6r^qHu(8AmTiRhA>ly**K7(4P9F#6yZw>|I84|Z5 zTv5QnP#1gdI?TtX`ImKE+oCr1i#yA+>cP}7O%r^9Dx?-mgAW-IU7+G)0-`e_Qm=2oFo`68me0Ggp@nE;*l)+k6!|=vrcgx$a{F9M1j8y7sZ}qd) zFA4qw{|5fmFBt!e|Jy)ighYZ_VPSiwcv^uqq&y0B86^Fe05!>p+}XUz_cjNH1%#+T zeXY>rb(A_djko=CiYlR^A$c57ftA&hr?=9mz~)*&AhBDE=}uKqka~F>)t-Q$;$YMi zw?`m)`C_#vI9)=qT#)m?u8>(hrme;hb^=xvw4*|Vnr(26QHm!z1qKde1qf6?r;vm~ z^1vZSjBx{4aKI>Q3C5@m+O_;4jxUm+(Pu-Dgi*2Ly{R3zZmF%*a+eyyK@uS(=M2g< z`tll2No{*EYJ=t&SGIxbp>r{?O!KbDfv8M9e{w%~Es@`od6NvU8E-{LP*EJ#?x;V>?_XLDlPC!>Rwl*N<3(H0*cwcgZYMUCU9E8A`0&*V z;?r0`UIub9agTxB)uY`4N9(nMzBiBHm>EmKz z!cD1=5!Mt)h&mbM)DekcQbDP+H3H!oPYC0dc1C+VGqDLH0Ol$1NTcJDR>)6kOL7k5 zn!BLc1zIP(LG{Vhm5>(wm5@I5c?lHe&;!qZKqwYaM2H39Qv$B2_j-HwFpiR?nXpui zApx1-546fL%t!O^$SyCPBh6-}=4o-m9DY~S;CuaeWRgu1;@#cMZ(Z$W-tys3UUqyJ zw#M~0`uFwuD`as_Z0y7yE_L|&?3uTu<~9on)`1FqV#u=pC2F97&{TBU4qX4BKYRqH zG$D2NkUMMX!8@lYaaZ{LE#H?<6Ny4_>p0&_&j-zEZ43LLum>6Z*rnt7luD1~(*k5@ z;j*uxEN&Q$l0H3nLHn{L$n9(r#?r`B&1S9I3QKWHv-PbM6AJoL6_v@O%Cw+K>S>Q&5Hl?WSu6m^x=og;h;r2bFM! zyN$bBblloo&T1Bn;Bpo_*GfHTB)Q5gD5Ea-{GJAdCywoinM%se9^TqU-E)CbO{?4S zIaV4bm1Ms<*k&7U>bkfb5Fkrw6^SnuW{O-$0vcqXOU$)KAxD0uP%2)qoTn&A!v5Ir zhlw$3al4pSJQ?mx4M!_s2%dGLa^=iAWV#y<9VDk*1>r7Mt;z6pVL00uL-3}iHD?kC zUoUcyl9i{Er$+yen!k4MDLC78axPX9C48RzX8FO}*W7*8T2(BN8MwNqAHRJb7C+^1 zCk2<0>a5pKR$hQ1WuoWiE1wTOO%{c(d-t!ux%sNq$4mLoyEiXBp!U+4T{3T4zDc{h zbF9B-=Iv{Caij9WZs!`B#~^guD&r2vij(=}7NQG8&&_}q9UfJ)Cpmie>Wdn$XhJNj z>Cwpzt?b3SMiv-JIB{Co3K=+%WLg6sl57lM5Fm-IM-)l9t|pXwIF@Q$uRfv7Xd?rY zIje-#86!cLoz%4x0H>{M8i$D=Y><2eBzlyF@PlaeaB!CN4#x< z)vxW2Z!f_JX zRocVLPhT0l!9Qg8_JYB?%L6KW(Rqsv+4s*sKR3hO za9>KmMa|mbi@!QxJ0~0Hpx#@=uPwWe$<-C(EG^qoKnBYfAwVb3d9$!Z?j1N~66V*C z?mv?{ z`}VUomqdxweGn$(S_S96M%K8~4%M77+GNdYx!x$Jjp|a`$U|EQ&V#_m!iLrmT{05} z`l;%Hv2I3d**{WhaAG_MnmuIdCUrquKjbo6NWozya;Iq4dYp4nsu>iy8&c}dE$YR2 z;}}U!W{|c^3r=1e2GNy^pgVV-HGUbVyBl) z)xT)dJ7YP2NS0Kj3yZ=rV|cCp|0lhlPcI*6 ziEH1oQiy<0E-(FDz#_ahvU#6mM5(xlvn+<48<3QAeO%WY@SnTI$KR4xwT51qWJhs( z>PtFG@{LOqUParIx@Ox;zlFX=(s zD7&WGTb`DdjgH&ulV8N_x1#I$PHfTS;?~yUNS-_wd7H>hzH{NCKYrEN$ExR}7*c=L zD%~%>cqhB_f(JI&+P5)-m7M9FgRXp>bB6AtAsV`FC`ODEOqhl=2KlMGJ3`KoWA9$a zTkGhUnnQc{$W8-m3^6GJA=}$y6v;T;((=@kPd*h4ddwJv#s_Y$gFzx+kty)O#@ zI<2Na(9QxYbOJ!u*lwuK=L@E%SNZ_TANnyEEGlN~2~8^cJ}BS>5W<$dfMZOikd4Y* z{2U3WA2G@lW*NT}1Lx1PtAj7U+{#)F9-zU!ARNB1mRkb#`(xOjGN2i$d!SRQ0iXb< zcF?FT`MGff*eKugO2&NRCQl4^naOAl~<;L=-efwC~-1hYW9 zY7O5)iTKOL@mMi)vX}?*Q)`d>nO^q9t9IenLAdgT$6rk^)5U=5qT5?j0=UF$ZkYXE z!8=bJV+{-3&aBKN&k-ORX>=*$@Wkk4&=)xH~rV$3$ z+T4p?R$E&W#(B9$I5$7!_Oym>zP+^-eQ?|DBe&kZd#{#yQs`{_oi3_|XhN)s!?@x#Y5CaH0G^ttn{&Cdu+4Tmq$%m3;k8 zs!1UL>4-wo#zZEzL<1y9CQEl)w}AstKrEW=lE(>@a* zND?YReP=YHc+%)<*r1ZC;_E-xt@2uGw07cDA zM&VU8XuUd>F5bj9`^GlU{3Bxml} z9$m3v!-qJHCsjm0`sfUy5Kc@?NV!N+Tx0hU*G8YoVPZ-8O8C8B9x+Ybt5Okp+H1l0 z@n7n4kAGOGg#_R_tf2@M?a*^1Q?NF8U#PAPr7d^)r}lh;mt=hY|Hkj)60GjXvTKAh z&Cb=mt3g=8rt{+`(rkr3oUz)oD5t2UwFvto>JlL&Kj|ZXq9S}(F6RA1@8T-4oC`X9 zK!5_~wxt+!nMnemF<}55>rD{Ae4&Wo5(}pzR49T{kzuw(M3#pLNdRyhydMuf@fZ4^ z&R~MmNJ)$?@-Bi?g0EF$ip+^YxU8r#@VrDg+W4F<5s#}3zw3WT7pNtPC%TUuS`d#B zAp^%4Vw!@FtF59`C?*QSN}<2N1Q77OH87=&Lh^w}_g>aM{hMz_LXnvrvpSAG+8%6g z*|`)){rfKb2wuDXU|@->?;mh{_szR+40HHMnRuLn|Z}m7AjU+CCzmk(RP!806-Y`wBg8!v%Gl4jaEao zKSB6c8{mz+nW>qnw{SMUclc8XwnNaoaS&UIeIN)Sg)yxk^VS#vrHEloD-S>MD}TT8 zOY5I`4oX=3u_YO}X$ga#ZDbVe2BB_ar8r@b(Of=Hlbc&Z)tgm9>Rlp;LvhEicqvtUHU zg#9Faw~u1^s1F5zOrNn4jBfX(b#M~F>mD7mD3^ZA$`Ou$RqcsoE-%6ZV&F)H`~?E& z6uw{=QV3Rc z3L%iic15I}KR0L2tXXO4goAPRd|K=~Yo#MC6wZx=%P+{Q*1UF8>$6OU1PB>t!=i=J z)eD$2%T3J%B3G>OPT-KGA`Wdt*QX0x|b?06n|T^@bfi zPwJT+J?2R2*?sfYYdkrxewqRR*&WmBuzPoH?ZCjCy}8w8dBOR?%NB-DGZyploB5%w zhnoC9Z1vCqEf|^xW2`hM<;L~gRbEg-#>xieM5K8|zTzDoskFkhjVA_go(5>QoWc{Y z*&zUs_E(>TlerH2j3;pFH9wL&o}$-I;>id*NR$;Wi9f=py`@Uwi#m|_3;_LGg(&pu zxr3(nMlCPt$iXM-J_V`U2QL5`b>;l6j1Oc`R7z9fIHL<=@Y}F`qY7=n!Mtw!Wc5aT z{S<+=IJKdnuwH`_WJk|gm&pVIAe8k^eNSUnCr28dH{bdDM)o}Iouj3)l zMvS=1Vy^okQH<^K1p$ryi*e25Okv3!BMg}Md1?Hs$^}#39!&<$FrQe|044ne9eXBj z2(Z@C{J_u; zLiM?9_if4bzx7Z!(EIv+%^L#1TvIfr>k5wRq9SKx+_H)^#v%l$swXsEhgb}g-H~dR zc30{lX0X22yR#~@+ zKH5<~_l|-)`X)A|UO7DxSmTEsJW;TG7dnZtH%9r^s+7xN>RamX(MjcU?WTVEE_zpB znBAlbD!Pe6@xw&db)3-GhM*gS^tA>?3A%u1#ynw5(JB2A5q;9a^_74zcmkN77f@SM z0^6P!4L0l?(JP0oKY~L=*cGop5ejb zNyC#TQ*~205`5vhG9Lf{qdb1-SKGN^Lprr*^bd@T4EQtdNAjae6!n;lq+^1#D7Gth z?2B)N{-gfzI|nR)l9=j}p1?GQB+1s3v2%xXOj~oSyWJa)T)7gGPz3IW7uP@ly*)MT zI>Yg>8m~7kJzMk+#fyCTm!T1I+KO*aQ2GBA%xcPC2)+Mka=;}<9H~eQgJ;H~jI~0M z_IN*;{ost+&=e{R_$dGc_I59&P^3^KJa_*5$4^L2N}Xi3P^Hua8s7aG(-I3aT{8-% zy&pS%c>FaFB%Mhoke+It>Ay4M%=>Pq5JX1l;xg9Ft4q0PH*5=_AoD9*=Bj30{^Eu_ z0))f!2M-_n)`sL%Z$^4%*;D|2LGKdZUp_H@%AIvFG@K+rBs3y0JCsy;S?GB4?30mP z9G{~)JQ7=$H*){P^^>!AURcWN$By-c{69I0=U7|3MIVg+rnew8^ehRV|4+*z@Cg#4K*g3&fklfTAn+6bl{vh zsXae+mi;VMw;k+d_Jbi|5#eAN-$-L@)Ew;6tKS!`4UmJfli&l0OHxUjonkTqbHyH$ zWUujH2Y>xci>Pt$>5skKf57Zr^mG`0 zC$T%R5N^&xL) zrgK4F*c;ZrQv4}N{j%xk9(Tg2m*LT~Q7~x13Mr&WjIRpC-1?X_#o(r_l&SU3dQP4+ zcLqsNa%!ySYy6ow#JQeX;+<+vjcLj7TvPDArEst_&m@S>I?GF@YHCZ>Bxq`iCQ}xY z%`nz$7gH2LMX#i+v28Y4iy9Z2Br(fYGi;gw9AktLh3PE8DWOE!bW@$GszN&+H}vpT z=02M~PHO#-G z3VF}z2q0#%LZL{hNP;lMW-@ENhl`$HhT(goqldPQe6g6fWnRv6FJSz9kt1KPe&E2& z{QR=#o=)B_tna+c&RwTJT(NcadV5It=UA}rhv357)%82er@X%MD#9&#KaO8HG!bwa zi}Q^jVQi^Goz4gXB+Z^dEa*2=5H2CoPP0Z)Bq z7x<+yb{QYqbB3iASH-usgkUxgs;#T-3F}!uR3yLtm_0unB+|k?;U%7pKYoNoyCN=J zP4VoPL4qPPv$86SWSxeG2SjtXtvWY~@PFJ!-MWs?{<%c%m`O3-d~MRlWn*^8a{*}` z1Gjk2tV`l-()lhB#!$RX6r1g%^@1a;ztkrQa7>bBexi zYrFdKJd+gMa_Oo3=J^Zqn@%k{)odS(Ci|&2?UX&8&)#&}^v=7rcZcEJ@oCNHF83li znqwVJF8aR6YAyaA+S;ypJU2xM3=N$=2!#*$bm`G>%7*?V(YS{6a);})H>XEb?ZwmO zvC~zfnFzhxm`;-ybQ4Sqp%M%TW8&N(q_Aynbt9xIBH4A#K& z(x8|MGMN63o&Z3EKK3U5mBYdj{^D5h)~ittoc9zg!itV*?8 zf!nN=uFLozu4k?)GDk==#ofeP)XdbwNM`A94{fz>rDy8Nm1%uij;=5C3 z5+UCDh#L#TZ)}*gGH|3Vw>SKj!pK_|N3M;!+?Lc_G^=CHnE7FS=UUSI_u%DM^01*N zo=$Z?{Z$jBWY>42qr>NNtd^W}@M3v?j4-?;5Adq zXHpZ+^2+2QVRHCv6CRIe@BiMJrc+!UF(1jpcmF$mcJ5Sa$Mg{}Q8l|fFUamh2TyiS zp&w}W*Ga{dkSCd1I9gq-R&w;|VqIK(O3>Q5)4s^ck&d8Opwm?Wm~d|H5-Vk>4#I63 zQaH=pStp$-XP%^M;y|aiI2PddAZ7$zAi5F0#aXkatv@bf!!#H_aSs#|(yqNVDu7<6hFY?8M=O<{EgHfz=D_XxOLs{tuvLGxaWo))xVeUY6c=E

OZ1*7;NU9eHPRhHEL7= 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 &6V6$!#{)u+l7 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�>h}j}w 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

tg$Ia*1b3LdVLupe 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≪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